g@ UNZIP.BCKX UNZIP.BCK<BACKUP/LOG [UNZIP60...]*.* []UNZIP.BCK/SAVE/INTER/BLOCK=8192 GOATHUNTER N.&V7.3 _MILO:: _$252$VDA5: AXP72R001  *[UNZIP60]ACORN.DIR;1+,}./ 4->0123 KPWO56p07p089GHJIACORN.C  CONTENTS.~? GMAKEFILE. MAKEFILE.README.{RISCOS.CRISCOS.H  RUNME1ST. SRCRENAME.SWIVEN.HJSWIVEN.S*[UNZIP60.ACORN]ACORN.C;1+, .D/ 4DD@-}0123KPWOE56I? )7I? )89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- acorn.c RISCOS-specific routines for use with Info-ZIP's UnZip 5.2 and later. Contains: do_wild() <-- generic enough to put in fileio.c? mapattr() mapname() checkdir() mkdir() setRISCOSexfield() printRISCOSexfield() close_outfile() stamp_file() version() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "^.unzip.h" #include "riscos.h" #define FTYPE_FFF (1<<17) /* set filetype to &FFF when extracting */ #ifdef WILD_STOP_AT_DIR # define WESEP , (oU.W_flag ? '.' : '\0') #else # define WESEP #endif static int created_dir; /* used in mapname(), checkdir() */ static int renamed_fullpath; /* ditto */ static int has_mimemap = -1; /* used in mimemap() */ extern int mkdir(const char *path, int mode); static int has_NFS_ext(const char *name); static void setRISCOSexfield(ZCONST char *path, ZCONST void *ef_spark); #ifdef DEBUG static void printRISCOSexfield(int isdir, ZCONST void *extra_field); #endif static int uxtime2acornftime(unsigned *pexadr, unsigned *pldadr, time_t ut); static int mimemap(const char *name); #ifndef SFX /**********************/ /* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */ /**********************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { static DIR *wild_dir = (DIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; struct dirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!notfirstcall) { /* first call: must initialize everything */ notfirstcall = TRUE; /* break the wildspec into a directory part and a wildcard filename */ if ((wildname = (ZCONST char *)strrchr(wildspec, '.')) == (ZCONST char *)NULL) { dirname = "."; dirnamelen = 1; have_dirname = FALSE; wildname = wildspec; } else { ++wildname; /* point at character after '/' */ dirnamelen = wildname - wildspec; if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) { Info(slide, 0x201, ((char *)slide, "warning: cannot allocate wildcard buffers\n")); strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; /* but maybe filespec was not a wildcard */ } strncpy(dirname, wildspec, dirnamelen); dirname[dirnamelen] = '\0'; /* terminate for strcpy below */ have_dirname = TRUE; } if ((wild_dir = opendir(dirname)) != (DIR *)NULL) { while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { if (file->d_name[0] == '/' && wildname[0] != '/') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, wildname, 0 WESEP)) { /* 0=case sens.*/ if (have_dirname) { strcpy(matchname, dirname); strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } /* if we get to here directory is exhausted, so close it */ closedir(wild_dir); wild_dir = (DIR *)NULL; } /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (wild_dir == (DIR *)NULL) { notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ while ((file = readdir(wild_dir)) != (struct dirent *)NULL) if (match(file->d_name, wildname, 0 WESEP)) { /* 0 == case sens. */ if (have_dirname) { /* strcpy(matchname, dirname); */ strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } closedir(wild_dir); /* have read at least one dir entry; nothing left */ wild_dir = (DIR *)NULL; notfirstcall = FALSE; /* reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /**************************/ /* Function has_NFS_ext() */ /**************************/ static int has_NFS_ext(const char* name) { int i = strlen(name) - 4; return (i >= 0 && name[i] == ',' && (i > 0 || name[i-1]=='/') && isxdigit(name[i+1]) && isxdigit(name[i+2]) && isxdigit(name[i+3])); } /* end function has_NFS_ext() */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) __GDEF { ulg tmp = G.crec.external_file_attributes; switch (G.pInfo->hostnum) { case AMIGA_: tmp = (unsigned)(tmp>>17 & 7); /* Amiga RWE bits */ G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp); break; case THEOS_: tmp &= 0xF1FFFFFFL; if ((tmp & 0xF0000000L) != 0x40000000L) tmp &= 0x01FFFFFFL; /* not a dir, mask all ftype bits */ else tmp &= 0x41FFFFFFL; /* l0& U UNZIP.BCK }[UNZIP60.ACORN]ACORN.C;1DJeave directory bit as set */ /* fall through! */ case ACORN_: case UNIX_: case VMS_: case ATARI_: case ATHEOS_: case BEOS_: case QDOS_: case TANDEM_: G.pInfo->file_attr = (unsigned)(tmp >> 16); if (G.pInfo->file_attr != 0 || !G.extra_field) { break; } else { /* Some (non-Info-ZIP) implementations of Zip for Unix and VMS (and probably others ??) leave 0 in the upper 16-bit part of the external_file_attributes field. Instead, they store file permission attributes in some extra field. As a work-around, we search for the presence of one of these extra fields and fall back to the MSDOS compatible part of external_file_attributes if one of the known e.f. types has been detected. Later, we might implement extraction of the permission bits from the VMS extra field. But for now, the work-around should be sufficient to provide "readable" extracted files. (For ASI Unix e.f., an experimental remap of the e.f. mode value IS already provided!) */ ush ebID; unsigned ebLen; uch *ef = G.extra_field; unsigned ef_len = G.crec.extra_field_length; int r = FALSE; while (!r && ef_len >= EB_HEADSIZE) { ebID = makeword(ef); ebLen = (unsigned)makeword(ef+EB_LEN); if (ebLen > (ef_len - EB_HEADSIZE)) /* discoverd some e.f. inconsistency! */ break; switch (ebID) { case EF_ASIUNIX: if (ebLen >= (EB_ASI_MODE+2)) { G.pInfo->file_attr = (unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE)); /* force stop of loop: */ ef_len = (ebLen + EB_HEADSIZE); break; } /* else: fall through! */ case EF_PKVMS: /* "found nondecypherable e.f. with perm. attr" */ r = TRUE; default: break; } ef_len -= (ebLen + EB_HEADSIZE); ef += (ebLen + EB_HEADSIZE); } if (!r) break; } /* fall through! */ /* all remaining cases: expand MSDOS read-only bit into write perms */ case FS_FAT_: /* PKWARE's PKZip for Unix marks entries as FS_FAT_, but stores the * Unix attributes in the upper 16 bits of the external attributes * field, just like Info-ZIP's Zip for Unix. We try to use that * value, after a check for consistency with the MSDOS attribute * bits (see below). */ G.pInfo->file_attr = (unsigned)(tmp >> 16); /* fall through! */ case FS_HPFS_: case FS_NTFS_: case MAC_: case TOPS20_: default: /* Ensure that DOS subdir bit is set when the entry's name ends * in a '/'. Some third-party Zip programs fail to set the subdir * bit for directory entries. */ if ((tmp & 0x10) == 0) { extent fnlen = strlen(G.filename); if (fnlen > 0 && G.filename[fnlen-1] == '/') tmp |= 0x10; } /* read-only bit --> write perms; subdir bit --> dir exec bit */ tmp = !(tmp & 1) << 1 | (tmp & 0x10) >> 4; if ((G.pInfo->file_attr & 0700) == (unsigned)(0400 | tmp<<6)) /* keep previous G.pInfo->file_attr setting, when its "owner" * part appears to be consistent with DOS attribute flags! */ break; G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp); break; } /* end switch (host-OS-created-by) */ G.pInfo->file_attr&=0xFFFF; G.pInfo->file_attr|=(0xFFDu<<20); if (has_NFS_ext(G.filename)) { int ftype=strtol(G.filename+strlen(G.filename)-3,NULL,16)&0xFFF; G.pInfo->file_attr = (G.pInfo->file_attr & 0x000FFFFF) | (ftype<<20); } else { int type = mimemap(G.filename); if (type == -1) type = (G.crec.internal_file_attributes & 1) ? 0xFFF : 0xFFD; G.pInfo->file_attr = (G.pInfo->file_attr & 0x000FFFFF) | (type<<20); } return 0; } /* end function mapattr() */ /************************/ /* Function mimemap() */ /************************/ static int mimemap(const char *name) { const char *ext = name; int type; if (has_mimemap < 0) has_mimemap = !(SWI_OS_CLI("%RMEnsure MimeMap 0.05 RMLoad System:Modules.Network.MimeMap") || SWI_OS_CLI("%RMEnsure MimeMap 0.05")); if (!has_mimemap) return -1; /* no MimeMap module; fall back on text flag test */ do { while (*ext && *ext!='.') ext++; if (!*ext) return -1; /* no suitable extension; fallback */ type = SWI_MimeMap_Translate(ext++); } while (type == -1); return type; } /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ char *checkswap=NULL; /* pointer the the extension to check */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels in RISCOS */ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); created_dir = FALSE; /* not yet */ /* user gave full pathname: don't prepend rootpath */ renamed_fullpath = (renamed && (*G.filename == '/')); if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM) return MPN_NOMEM; /* initialize path buffer, unless no memory */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ /*------------------------------------------Ѽ UNZIP.BCK }[UNZIP60.ACORN]ACORN.C;1D--------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ checkswap=NULL; /* reset checking at start of new leafname */ break; case '.': *pp++ = '/'; checkswap=pp; break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; *pp++ = ';'; /* keep for now; remove VMS ";##" */ break; /* later, if requested */ case ' ': /* change spaces to hard-spaces */ *pp++ = 160; /* (ISO 8859-1 Latin-1 codepage) */ break; /* The following substitutions, unless stated otherwise, follow * those for DOSFS. They translate special symbols into other * characters which have no special meaning to RISC OS. */ case '#': *pp++ = '?'; break; /* single-char wildcard */ case '&': *pp++ = '+'; break; case '@': *pp++ = '='; break; case '%': *pp++ = ';'; break; case '$': *pp++ = '<'; break; case '^': *pp++ = '>'; break; /* parent-dir reference */ /* The following substitutions deal with the remaining special * symbols. ('.' is handled above.) */ case '*': *pp++ = 0xD7; break; /* Latin-1 'multiply' */ case '"': *pp++ = '~'; break; case ':': *pp++ = ';'; break; case '\\': *pp++ = '/'; break; case '|': *pp++ = 0xA6; break; /* Latin-1 'broken bar' */ default: /* allow European characters in filenames: */ if (isprint(workch) || (128 <= workch && workch <= 254)) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %s\n", FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } if (checkswap!=NULL) { if (checkext(checkswap)) { if ((error = checkdir(__G__ checkswap, APPEND_DIR)) > 1) return error; *(checkswap-1)=0; /* remove extension from pathcomp */ } } if (!uO.acorn_nfs_ext && has_NFS_ext(pathcomp)) { /* remove the filetype extension unless requested otherwise */ /* the filetype should be already set by mapattr() */ pathcomp[strlen(pathcomp)-4]=0; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { static int rootlen = 0; /* length of rootpath */ static char *rootpath; /* user's "extract-to" directory */ static char *buildpath; /* full path (so far) to extracted file */ static char *end; /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') ++end; #ifdef SHORT_NAMES /* path components restricted to 14 chars, typically */ if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(end = old_end + FILENAME_MAX) = '\0'; #endif /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ /* next check: need to append '/', at least one-char name, '\0' */ if ((end-buildpath) > FILNAMSIZ-3) too_long = TRUE; /* check if extracting dir? */ if (stat(buildpath, &G.statbuf)) { /* path doesn't exist */ if (!G.create_dirs) { /* told not to create (freshening) */ free(buildpath); return MPN_INF_SKIP; /* path doesn't exist: nothing to do */ } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); fflush(stderr); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (mkdir(buildpath, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ unable to process %s.\n", FnFilter2(buildpath), FnFilter1(G.filename))); = UNZIP.BCK }[UNZIP60.ACORN]ACORN.C;1D, free(buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n\ unable to process %s.\n", FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *end++ = '.'; /************* was '/' *************/ *end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(buildpath); buildpath = end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') { ++end; #ifdef SHORT_NAMES /* truncate name at 14 characters, typically */ if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(end = old_end + FILENAME_MAX) = '\0'; #endif if ((end-buildpath) >= FILNAMSIZ) { *--end = '\0'; Info(slide, 0x201, ((char *)slide, "checkdir warning: path too long; truncating\n\ %s\n -> %s\n", FnFilter1(G.filename), FnFilter2(buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ /* GRR: for VMS and TOPS-20, add up to 13 to strlen */ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+1)) == (char *)NULL) return MPN_NOMEM; if ((rootlen > 0) && !renamed_fullpath) { strcpy(buildpath, rootpath); end = buildpath + rootlen; } else { *buildpath = '\0'; end = buildpath; } Trace((stderr, "[%s]\n", FnFilter1(buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if necessary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { rootlen = 0; return MPN_OK; } if (rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((rootlen = strlen(pathcomp)) > 0) { char *tmproot; if ((tmproot = (char *)malloc(rootlen+2)) == (char *)NULL) { rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (tmproot[rootlen-1] == '.') { /****** was '/' ********/ tmproot[--rootlen] = '\0'; } if (rootlen > 0 && (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode))) { /* path does not exist */ if (!G.create_dirs /* || isshexp(tmproot) */ ) { free(tmproot); rootlen = 0; /* skip (or treat as stored file) */ return MPN_INF_SKIP; } /* create the directory (could add loop here scanning tmproot * to create more than one level, but why really necessary?) */ if (mkdir(tmproot, 0777) == -1) { Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n", FnFilter1(tmproot))); free(tmproot); rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdir levels required */ return MPN_ERR_SKIP; } } tmproot[rootlen++] = '.'; /*********** was '/' *************/ tmproot[rootlen] = '\0'; if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) { free(tmproot); rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (rootlen > 0) { free(rootpath); rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /********************/ /* Function mkdir() */ /********************/ int mkdir(path, mode) const char *path; int mode; /* ignored */ /* * returns: 0 - successful * -1 - failed (errno not set, however) */ { return (SWI_OS_File_8((char *)path) == NULL)? 0 : -1; } /*********************************/ /* extra_field-related functions */ /*********************************/ static void setRISCOSexfield(ZCONST char *path, ZCONST void *ef_spark) { if (ef_spark!=NULL) { extra_block *block=(extra_block *)ef_spark; SWI_OS_File_1((char *)path,block->loadaddr,block->execaddr,block->attr); } } #ifdef DEBUG static void printRISCOSexfield(int isdir, ZCONST void *extra_field) { extra_block F_! UNZIP.BCK }[UNZIP60.ACORN]ACORN.C;1D4F;*block=(extra_block *)extra_field; printf("\n This file has RISC OS file informations in the local extra field.\n"); if (isdir) { /* I prefer not to print this string... should change later... */ /* printf(" The file is a directory.\n");*/ } else if ((block->loadaddr & 0xFFF00000) != 0xFFF00000) { printf(" Load address: %.8X\n",block->loadaddr); printf(" Exec address: %.8X\n",block->execaddr); } else { /************* should change this to use OS_FSControl 18 to get filetype string ************/ char tmpstr[16]; char ftypestr[32]; int flen; sprintf(tmpstr,"File$Type_%03x",(block->loadaddr & 0x000FFF00) >> 8); if (SWI_OS_ReadVarVal(tmpstr,ftypestr,32,&flen)==NULL) { ftypestr[flen]=0; printf(" Filetype: %s (&%.3X)\n",ftypestr,(block->loadaddr & 0x000FFF00) >> 8); } else { printf(" Filetype: &%.3X\n",(block->loadaddr & 0x000FFF00) >> 8); } } printf(" Access: "); if (block->attr & (1<<3)) printf("L"); if (block->attr & (1<<0)) printf("W"); if (block->attr & (1<<1)) printf("R"); printf("/"); if (block->attr & (1<<4)) printf("w"); if (block->attr & (1<<5)) printf("r"); printf("\n\n"); } #endif /* DEBUG */ /**********************************************/ /* internal help function for time conversion */ /**********************************************/ static int uxtime2acornftime(unsigned *pexadr, unsigned *pldadr, time_t ut) { unsigned timlo; /* 3 lower bytes of acorn file-time plus carry byte */ unsigned timhi; /* 2 high bytes of acorn file-time */ timlo = ((unsigned)ut & 0x00ffffffU) * 100 + 0x00996a00U; timhi = ((unsigned)ut >> 24); timhi = timhi * 100 + 0x0000336eU + (timlo >> 24); if (timhi & 0xffff0000U) return 1; /* calculation overflow, do not change time */ /* insert the five time bytes into loadaddr and execaddr variables */ *pexadr = (timlo & 0x00ffffffU) | ((timhi & 0x000000ffU) << 24); *pldadr = (*pldadr & 0xffffff00U) | ((timhi >> 8) & 0x000000ffU); return 0; /* subject to future extension to signal overflow */ } /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) __GDEF { zvoid *spark_ef; fclose(G.outfile); if ((spark_ef = getRISCOSexfield(G.extra_field, G.lrec.extra_field_length)) != NULL) { setRISCOSexfield(G.filename, spark_ef); } else { unsigned int loadaddr, execaddr; int attr; int mode=G.pInfo->file_attr&0xffff; /* chmod equivalent mode */ time_t m_time; #ifdef USE_EF_UT_TIME iztimes z_utime; #endif /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) { TTrace((stderr, "close_outfile: Unix e.f. modif. time = %ld\n", z_utime.mtime)); m_time = z_utime.mtime; } else #endif /* USE_EF_UT_TIME */ m_time = dos_to_unix_time(G.lrec.last_mod_dos_datetime); } /* set the file's time-stamp and attributes */ SWI_OS_File_5(G.filename, NULL, &loadaddr, NULL, NULL, &attr); if (uO.D_flag <= 1) /* set the file's modification time */ uxtime2acornftime(&execaddr, &loadaddr, m_time); loadaddr = (loadaddr & 0xfff000ffU) | ((G.pInfo->file_attr&0xfff00000) >> 12); attr=(attr&0xffffff00) | ((mode&0400) >> 8) | ((mode&0200) >> 6) | ((mode&0004) << 2) | ((mode&0002) << 4); SWI_OS_File_1(G.filename, loadaddr, execaddr, attr); } } /* end function close_outfile() */ #ifdef TIMESTAMP /***************************/ /* Function stamp_file() */ /***************************/ int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime; { unsigned int loadaddr, execaddr; int attr; /* set the file's modification time */ if (SWI_OS_File_5((char *)fname, NULL, &loadaddr, NULL, NULL, &attr) != NULL) return -1; if (uxtime2acornftime(&execaddr, &loadaddr, modtime) != 0) return -1; return (SWI_OS_File_1((char *)fname, loadaddr, execaddr, attr) == NULL) ? 0 : -1; } /* end function stamp_file() */ #endif /* TIMESTAMP */ #ifndef SFX /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { sprintf((char *)slide, LoadFarString(CompiledWith), #ifdef __GNUC__ "gcc ", __VERSION__, #else # ifdef __CC_NORCROFT "Norcroft ", "cc", # else "cc", "", # endif #endif "RISC OS", " (Acorn Computers Ltd)", #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0); } /* end function version() */ #endif /* !SFX */ *[UNZIP60.ACORN]CONTENTS.;1+,~?./ 4n@-}0123KPWO56:_ُ7:_ُ89GHJContents of the "acorn" subdirectory for UnZip 5.4 and later: acorn.c.acorn Acorn-specific resources acorn.c.riscos mainly file-handling routines for FileCore-based filesystems acorn.Contents this file acorn.GMakeFile Makefile for gcc acorn.h.riscos acorn.h.swiven acorn.makefile Makefile script for default Acorn C compiler acorn.README notes about Acorn-specific features acorn.RunMe1st Obey file to move files into suitable place for compilation on RISC OS machines acorn.s.swiven SWI veneers acorn.srcrename small executable that converts files from Unix style to RISC OS style, used by RunMe1st Notes: Use the "RunMe1st" file (it is an Obey file) to convert all the files from "filename/[chs]" to "[chs].filename" (so that UnZip could be easily compiled under RISC OS). It will also set the correct makefile. To compile just set the CSD to the main UnZip directory and run 'amu'. Currently only the Acorn C V5 compiler has been tested but probably also Acorn C V4 and the Acorn Assembler V2 will be able to compile UnZip. *[UNZIP60.ACORN]GMAKEFILE.;1+,. / 4 @-}0123KPWO 56 7 89GHJ# Makefile for UnZip, UnZipSFX, ZipInfo and fUnZip (5.53 or later) # using gcc 2.95.4 (or later). # You may look at for an up-to-date # gcc port. CC = gcc -mlibscl BIND = $(CC) AS = $(CC) -c ASM = as SQUEEZE = squeeze -v E = # flags # CFLAGS flags for C compile # LFLAGS1 flags after output file spec, before obj file list # LFLAGS2 flags after obj file list (libraries, etc) # LIB = CFLAGS = -O2 -mthrowback -DNO_STRNICMP ASMFLAGS = -throwback l UNZIP.BCK}NZIP60.ACORN]GMAKEFILE.;1 u-objasm -upper LFLAGS1 = LFLAGS2 = $(LIB) # object file lists OBJS1 = o.unzip o.crc32 o.crypt o.envargs o.explode OBJS2 = o.extract o.fileio o.globals o.inflate o.list o.match OBJS3 = o.process o.ttyio o.unreduce o.unshrink o.zipinfo OBJS = $(OBJS1) $(OBJS2) $(OBJS3) o.riscos o.swiven o.acorn OBJF = o.funzip o.crc32 o.cryptf o.globalsf o.inflatef o.ttyiof \ o.riscos o.swiven OBJX = o.unzipsfx o.crc32 o.crypt_ o.extract_ o.fileio_ o.globals_ \ o.inflate_ o.match_ o.process_ o.ttyio_ o.acorn_ o.swiven o.riscos_ UNZIP_H = h.unzip h.unzpriv h.globals acorn.h.riscos acorn.h.swiven all: unzip funzip unzipsfx install: unzip funzip unzipsfx $(SQUEEZE) unzip %.unzip $(SQUEEZE) funzip %.funzip $(SQUEEZE) unzipsfx unzipsfx copy %.unzip %.zipinfo ~CVF # rules for unzip and funzip o.crc32: c.crc32 $(UNZIP_H) h.zip h.crc32 $(CC) $(CFLAGS) -c c.crc32 -o o.crc32 o.crypt: c.crypt $(UNZIP_H) h.zip h.crypt h.crc32 h.ttyio $(CC) $(CFLAGS) -c c.crypt -o o.crypt o.envargs: c.envargs $(UNZIP_H) $(CC) $(CFLAGS) -c c.envargs -o o.envargs o.explode: c.explode $(UNZIP_H) $(CC) $(CFLAGS) -c c.explode -o o.explode o.extract: c.extract $(UNZIP_H) h.crc32 h.crypt $(CC) $(CFLAGS) -c c.extract -o o.extract o.fileio: c.fileio $(UNZIP_H) h.crc32 h.crypt h.ttyio h.ebcdic $(CC) $(CFLAGS) -c c.fileio -o o.fileio o.funzip: c.funzip $(UNZIP_H) h.crc32 h.crypt h.ttyio $(CC) $(CFLAGS) -c c.funzip -o o.funzip o.globals: c.globals $(UNZIP_H) $(CC) $(CFLAGS) -c c.globals -o o.globals o.inflate: c.inflate h.inflate $(UNZIP_H) $(CC) $(CFLAGS) -c c.inflate -o o.inflate o.list: c.list $(UNZIP_H) $(CC) $(CFLAGS) -c c.list -o o.list o.match: c.match $(UNZIP_H) $(CC) $(CFLAGS) -c c.match -o o.match o.process: c.process $(UNZIP_H) h.crc32 $(CC) $(CFLAGS) -c c.process -o o.process o.ttyio: c.ttyio $(UNZIP_H) h.zip h.crypt h.ttyio $(CC) $(CFLAGS) -c c.ttyio -o o.ttyio o.unreduce: c.unreduce $(UNZIP_H) $(CC) $(CFLAGS) -c c.unreduce -o o.unreduce o.unshrink: c.unshrink $(UNZIP_H) $(CC) $(CFLAGS) -c c.unshrink -o o.unshrink o.unzip: c.unzip $(UNZIP_H) h.crypt h.unzvers h.consts $(CC) $(CFLAGS) -c c.unzip -o o.unzip o.zipinfo: c.zipinfo $(UNZIP_H) $(CC) $(CFLAGS) -c c.zipinfo -o o.zipinfo o.crypt_: c.crypt $(UNZIP_H) h.zip h.crypt h.crc32 h.ttyio $(CC) $(CFLAGS) -DSFX -c c.crypt -o o.crypt_ o.extract_: c.extract $(UNZIP_H) h.crc32 h.crypt $(CC) $(CFLAGS) -DSFX -c c.extract -o o.extract_ o.fileio_: c.fileio $(UNZIP_H) h.crc32 h.crypt h.ttyio h.ebcdic $(CC) $(CFLAGS) -DSFX -c c.fileio -o o.fileio_ o.globals_: c.globals $(UNZIP_H) $(CC) $(CFLAGS) -DSFX -c c.globals -o o.globals_ o.inflate_: c.inflate h.inflate $(UNZIP_H) h.crypt $(CC) $(CFLAGS) -DSFX -c c.inflate -o o.inflate_ o.match_: c.match $(UNZIP_H) $(CC) $(CFLAGS) -DSFX -c c.match -o o.match_ o.process_: c.process $(UNZIP_H) h.crc32 $(CC) $(CFLAGS) -DSFX -c c.process -o o.process_ o.ttyio_: c.ttyio $(UNZIP_H) h.zip h.crypt h.ttyio $(CC) $(CFLAGS) -DSFX -c c.ttyio -o o.ttyio_ o.unzipsfx: c.unzip $(UNZIP_H) h.crypt h.unzvers h.consts $(CC) $(CFLAGS) -DSFX -c c.unzip -o o.unzipsfx o.cryptf: c.crypt $(UNZIP_H) h.zip h.crypt h.crc32 h.ttyio $(CC) $(CFLAGS) -DFUNZIP -c c.crypt -o o.cryptf o.globalsf: c.globals $(UNZIP_H) $(CC) $(CFLAGS) -DFUNZIP -c c.globals -o o.globalsf o.inflatef: c.inflate h.inflate $(UNZIP_H) h.crypt $(CC) $(CFLAGS) -DFUNZIP -c c.inflate -o o.inflatef o.ttyiof: c.ttyio $(UNZIP_H) h.zip h.crypt h.ttyio $(CC) $(CFLAGS) -DFUNZIP -c c.ttyio -o o.ttyiof o.acorn: acorn.c.acorn $(UNZIP_H) $(CC) $(CFLAGS) -I@ -c acorn.c.acorn o.acorn_: acorn.c.acorn $(UNZIP_H) $(CC) $(CFLAGS) -I@ -c -DSFX -DSFX_EXDIR -o o.acorn_ acorn.c.acorn o.riscos: acorn.c.riscos $(UNZIP_H) $(CC) $(CFLAGS) -I@ -c acorn.c.riscos o.riscos_: acorn.c.riscos $(UNZIP_H) $(CC) $(CFLAGS) -I@ -c -DSFX -DSFX_EXDIR -o o.riscos_ acorn.c.riscos o.swiven: acorn.s.swiven $(ASM) $(ASMFLAGS) acorn.s.swiven -o o.swiven unzip: $(OBJS) $(BIND) -o unzip$(E) $(LFLAGS1) $(OBJS) $(LFLAGS2) funzip: $(OBJF) $(BIND) -o funzip$(E) $(LFLAGS1) $(OBJF) $(LFLAGS2) unzipsfx: $(OBJX) $(BIND) -o unzipsfx$(E) $(LFLAGS1) $(OBJX) $(LFLAGS2) clean: remove unzip remove funzip remove zipinfo remove unzipsfx create o.!fake! 0 wipe o.* ~cf # end of Makefile *[UNZIP60.ACORN]MAKEFILE.;1+,. / 4 0@-}0123KPWO 56ږ 7ږ 89GHJ # Makefile for UnZip, UnZipSFX, ZipInfo and fUnZip (5.53 or later) # last modified: 25 Dec 2006 # add -g to CC to debug # add -d to BIND to debug CC = cc BIND = link AS = $(CC) -c ASM = objasm SQUEEZE = squeeze -v E = # flags # CFLAGS flags for C compile # LFLAGS1 flags after output file spec, before obj file list # LFLAGS2 flags after obj file list (libraries, etc) # LIB = CBASE = -throwback -wn -DNO_STRNICMP CFLAGS = $(CBASE) -IC:,@. ASMFLAGS = -Throwback -Stamp -NoCache -CloseExec -quit LFLAGS1 = LFLAGS2 = $(LIB) C:o.Stubs # object file lists OBJS1 = unzip.o crc32.o crypt.o envargs.o explode.o OBJS2 = extract.o fileio.o globals.o inflate.o list.o match.o OBJS3 = process.o ttyio.o ubz2err.o unreduce.o unshrink.o zipinfo.o OBJS = $(OBJS1) $(OBJS2) $(OBJS3) riscos.o swiven.o acorn.o OBJF = funzip.o crc32.o cryptf.o globalsf.o inflatef.o ttyiof.o \ riscos.o swiven.o OBJX = unzipsfx.o crc32.o crypt_.o extract_.o fileio_.o globals.o \ inflate.o match.o process_.o ttyio.o ubz2err_.o \ acorn_.o swiven.o riscos_.o UNZIP_H = unzip.h unzpriv.h globals.h acorn/riscos.h acorn/swiven.h all: unzip funzip unzipsfx install: unzip funzip unzipsfx $(SQUEEZE) unzip %.unzip $(SQUEEZE) funzip %.funzip $(SQUEEZE) unzipsfx unzipsfx copy %.unzip %.zipinfo ~CVF # suffix rules .SUFFIXES: .o .c .c.o: $(CC) $(CFLAGS) -c $< .s.o: $(ASM) $(ASMFLAGS) -from @*.s -to @*.o # rules for unzip and funzip crc32.o: crc32.c $(UNZIP_H) zip.h crc32.h crypt.o: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs.o: envargs.c $(UNZIP_H) explode.o: explode.c $(UNZIP_H) extract.o: extract.c $(UNZIP_H) crc32.h crypt.h fileio.o: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip.o: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h globals.o: globals.c $(UNZIP_H) inflate.o: inflate.c inflate.h $(UNZIP_H) list.o: list.c $(UNZIP_H) match.o: match.c $(UNZIP_H) process.o: process.c $(UNZIP_H) crc32.h ttyio.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err.o: ubz2err.c $(UNZIP_H) unreduce.o: unreduce.c $(UNZIP_H) unshrink.o: unshrink.c $(UNZIP_H) unzip.o: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo.o: zipinfo.c $(UNZIP_H) crypt_.o: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) $(CFLAGS) -DSFX -c c.crypt -o o.crypt_ extract_.o: extract.c $(UNZIP_H) crc32.h crypt.h $(CC) $(CFLAGS) -DSFXЯl1 UNZIP.BCK}[UNZIP60.ACORN]MAKEFILE.;1 :  -c c.extract -o o.extract_ fileio_.o: fileio.c $(UNZIP_H) crc32.h crypt.h $(CC) $(CFLAGS) -DSFX -c c.fileio -o o.fileio_ globals_.o: globals.c $(UNZIP_H) $(CC) $(CFLAGS) -DFUNZIP -c c.globals -o o.globals_ inflate_.o: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) $(CFLAGS) -DFUNZIP -c c.inflate -o o.inflate_ process_.o: process.c $(UNZIP_H) crc32.h $(CC) $(CFLAGS) -DSFX -c c.process -o o.process_ ttyio_.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) $(CFLAGS) -DFUNZIP -c c.ttyio -o o.ttyio_ ubz2err_.o: ubz2err.c $(UNZIP_H) $(CC) $(CFLAGS) -DSFX -c c.ubz2err -o o.ubz2err_ unzipsfx.o: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) $(CFLAGS) -DSFX -c c.unzip -o o.unzipsfx o.cryptf: c.crypt $(UNZIP_H) h.zip h.crypt h.crc32 h.ttyio $(CC) $(CFLAGS) -DFUNZIP -c c.crypt -o o.cryptf o.globalsf: c.globals $(UNZIP_H) $(CC) $(CFLAGS) -DFUNZIP -c c.globals -o o.globalsf o.inflatef: c.inflate h.inflate $(UNZIP_H) h.crypt $(CC) $(CFLAGS) -DFUNZIP -c c.inflate -o o.inflatef o.ttyiof: c.ttyio $(UNZIP_H) h.zip h.crypt h.ttyio $(CC) $(CFLAGS) -DFUNZIP -c c.ttyio -o o.ttyiof acorn.o: acorn/acorn.c $(UNZIP_H) $(CC) $(CFLAGS) -c acorn/acorn.c acorn_.o: acorn/acorn.c $(UNZIP_H) $(CC) $(CFLAGS) -c -DSFX -DSFX_EXDIR -o acorn_.o acorn/acorn.c riscos.o: acorn/riscos.c $(UNZIP_H) $(CC) $(CFLAGS) -c acorn/riscos.c riscos_.o: acorn/riscos.c $(UNZIP_H) $(CC) $(CFLAGS) -c -DSFX -DSFX_EXDIR -o riscos_.o acorn/riscos.c swiven.o: acorn/swiven.s $(ASM) $(ASMFLAGS) -from acorn.s.swiven -to o.swiven unzip: $(OBJS) $(BIND) -o unzip$(E) $(LFLAGS1) $(OBJS) $(LFLAGS2) funzip: $(OBJF) $(BIND) -o funzip$(E) $(LFLAGS1) $(OBJF) $(LFLAGS2) unzipsfx: $(OBJX) $(BIND) -o unzipsfx$(E) $(LFLAGS1) $(OBJX) $(LFLAGS2) clean: ;remove unzip; remove funzip; remove zipinfo; remove unzipsfx; create o.!fake! 0 wipe o.* ~cf # end of Makefile *[UNZIP60.ACORN]README.;1+,{./ 4W@-}0123KPWO56:7:89GHJ Acorn-specific usage instructions --------------------------------- As zipfiles can come from a variety of sources apart from Acorn machines, consideration had to be given to the handling of dot-extensions, e.g. "DOSFILE.TXT", "unix-filename.tar.gz". These are extracted as "DOSFILE/TXT" and "unix-filename/tar/gz"; their names may or may not be truncated, depending on where the files are being created: what filing system and, for Filecore-based filing systems such as ADFS or an IDEFS or SCSIFS, which disk/partition format (names will not be truncated if you're using E+ or F+). Where truncation occurs, you must be REALLY careful about extracting files from archives. The files dummy_source.c and dummy_source.h will both be extracted as dummy_sour UnZip will prompt you for confirmation of the over-writing of these files, but you must be really careful unless you wish to lose files! Also, because UnZip is a unix-ported program, the filenames are CASE SENSITIVE. *unzip new/zip newfile will extract 'newfile', but not 'NewFile', 'NEWFILE' or any other combinations. However, you can use the -C option to force operations to disregard the case of filenames. The Acorn UnZip port has an additional feature to cope with the extraction of files containing 'c' code. As you may be aware, Acorn Desktop C requires all files called "foo.c" to be renamed to "c.foo", ie "foo" in a directory called "c". There are two ways of using this feature. - The old way: use a colon-separated environment variable named "Unzip$Exts". Any extensions found in this variable will be extracted to directories named after the extension, with the extension stripped. For example: *Set Unzip$Exts "c:h:o:s" *unzip foo/zip - The new way: use the -/ option. For example: Any extensions found in the parameter for this option will be extracted to directories named after the extension, with the extension stripped. For example: *unzip -/c:h:o:s foo/zip If foo/zip contains a file named "foo.c", this file will be written as "foo" in directory "c". This can be used to include "c:h:o:s:txt" to pull all the text files out to a separate directory. UnZip fully supports SparkFS Extra Field. This means that zipfiles created with SparkFS or Zip (on RISC OS) will be correctly unzipped, including filetypes. UnZipSFX can be used to create self-extracting archives. To use it, just create a common zipfile using Zip (or SparkFS), then load the UnZipSFX executable into an editor (eg. Edit, Zap), go with the caret the end of the file (using CTRL-CursorDown) and drag the zipfile to the editor window (in other words, append the zipfile to the UnZipSFX executable). Now, saving the resulting file (with filetype Absolute (&FF8)), you have a self-extracting archive (ie. double-clicking on it will unzip the contents of the original zipfile to the currently selected directory). *[UNZIP60.ACORN]RISCOS.C;1+,./ 4@-}0123KPWO56-?27-?289GHJ/* Copyright (c) 1990-2002 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* riscos.c */ #include #include #include /* #define NO_UNZIPH_STUFF */ #define UNZIP_INTERNAL #include "unzip.h" #include "riscos.h" #define MAXEXT 16 char *exts2swap = NULL; /* Extensions to swap (actually, directory names) */ int stat(char *filename,struct stat *res) { int attr; /* object attributes */ unsigned int load; /* load address */ unsigned int exec; /* exec address */ int type; /* type: 0 not found, 1 file, 2 dir, 3 image */ if (!res) return -1; if (SWI_OS_File_5(filename,&type,&load,&exec,(int *)&res->st_size,&attr)!=NULL) return -1; if (type==0) return -1; res->st_dev=0; res->st_ino=0; res->st_nlink=0; res->st_uid=1; res->st_gid=1; res->st_rdev=0; res->st_blksize=1024; res->st_mode = ((attr & 0001) << 8) | ((attr & 0002) << 6) | ((attr & 0020) >> 2) | ((attr & 0040) >> 4); switch (type) { case 1: /* File */ res->st_mode |= S_IFREG; break; case 2: /* Directory */ res->st_mode |= S_IFDIR | 0700; break; case 3: /* Image file */ if (uO.scanimage) / UNZIP.BCK}[UNZIP60.ACORN]RISCOS.C;1M| res->st_mode |= S_IFDIR | 0700; else res->st_mode |= S_IFREG; break; } if ((((unsigned int) load) >> 20) == 0xfff) { /* date stamped file */ register unsigned int t1, t2, tc; t1 = (unsigned int) (exec); t2 = (unsigned int) (load & 0xff); tc = 0x6e996a00U; if (t1 < tc) t2--; t1 -= tc; t2 -= 0x33; /* 00:00:00 Jan. 1 1970 = 0x336e996a00 */ t1 = (t1 / 100) + (t2 * 42949673U); /* 0x100000000 / 100 = 42949672.96 */ t1 -= (t2 / 25); /* compensate for .04 error */ res->st_atime = res->st_mtime = res->st_ctime = t1; } else res->st_atime = res->st_mtime = res->st_ctime = 0; return 0; } #ifndef SFX DIR *opendir(char *dirname) { DIR *thisdir; int type; int attr; os_error *er; thisdir=(DIR *)malloc(sizeof(DIR)); if (thisdir==NULL) return NULL; thisdir->dirname=(char *)malloc(strlen(dirname)+1); if (thisdir->dirname==NULL) { free(thisdir); return NULL; } strcpy(thisdir->dirname,dirname); if (thisdir->dirname[strlen(thisdir->dirname)-1]=='.') thisdir->dirname[strlen(thisdir->dirname)-1]=0; if (er=SWI_OS_File_5(thisdir->dirname,&type,NULL,NULL,NULL,&attr),er!=NULL || type<=1 || (type==3 && !uO.scanimage)) { free(thisdir->dirname); free(thisdir); return NULL; } thisdir->buf=malloc(DIR_BUFSIZE); if (thisdir->buf==NULL) { free(thisdir->dirname); free(thisdir); return NULL; } thisdir->size=DIR_BUFSIZE; thisdir->offset=0; thisdir->read=0; return thisdir; } struct dirent *readdir(DIR *d) { static struct dirent dent; if (d->read==0) { /* no more objects read in the buffer */ if (d->offset==-1) { /* no more objects to read */ return NULL; } d->read=255; if (SWI_OS_GBPB_9(d->dirname,d->buf,&d->read,&d->offset,DIR_BUFSIZE,NULL)!=NULL) return NULL; if (d->read==0) { d->offset=-1; return NULL; } d->read--; d->act=(char *)d->buf; } else { /* some object is ready in buffer */ d->read--; d->act=(char *)(d->act+strlen(d->act)+1); } strcpy(dent.d_name,d->act); dent.d_namlen=strlen(dent.d_name); /* If we're returning the last item, check if there are any more. * If there are, nothing will happen; if not, then d->offset = -1 */ if (!d->read) SWI_OS_GBPB_9(d->dirname,d->buf,&d->read,&d->offset,0,NULL); return &dent; } void closedir(DIR *d) { if (d->buf!=NULL) free(d->buf); if (d->dirname!=NULL) free(d->dirname); free(d); } int unlink(f) char *f; /* file to delete */ /* Delete the file *f, returning non-zero on failure. */ { os_error *er; char canon[256]; int size=255; er=SWI_OS_FSControl_37(f,canon,&size); if (er==NULL) { er=SWI_OS_FSControl_27(canon,0x100); } else { er=SWI_OS_FSControl_27(f,0x100); } return (int)er; } int rmdir(char *d) { int objtype; char *s; int len; len = strlen(d); if ((s = malloc(len + 1)) == NULL) return -1; strcpy(s,d); if (s[len-1]=='.') s[len-1]=0; if (SWI_OS_File_5(s,&objtype,NULL,NULL,NULL,NULL)!=NULL) { free(s); return -1; } if (objtype<2 || (!uO.scanimage && objtype==3)) { /* this is a file or it doesn't exist */ free(s); return -1; } if (SWI_OS_File_6(s)!=NULL) { free(s); return -1; } free(s); return 0; } #endif /* !SFX */ int chmod(char *file, int mode) { /*************** NOT YET IMPLEMENTED!!!!!! ******************/ /* I don't know if this will be needed or not... */ file=file; mode=mode; return 0; } void setfiletype(char *fname,int ftype) { char str[256]; sprintf(str,"SetType %s &%3.3X",fname,ftype); SWI_OS_CLI(str); } void getRISCOSexts(char *envstr) { char *envptr; /* value returned by getenv */ envptr = getenv(envstr); if (envptr == NULL || *envptr == 0) return; exts2swap=malloc(1+strlen(envptr)); if (exts2swap == NULL) return; strcpy(exts2swap, envptr); } int checkext(char *suff) { register char *extptr = exts2swap ? exts2swap : ""; register char *suffptr; register int e,s; while(*extptr) { suffptr=suff; e=*extptr; s=*suffptr; while (e && e!=':' && s && s!='.' && s!='/' && e==s) { e=*++extptr; s=*++suffptr; } if (e==':') e=0; if (s=='.' || s=='/') s=0; if (!e && !s) { return 1; } while(*extptr!=':' && *extptr!='\0') /* skip to next extension */ extptr++; if (*extptr!='\0') extptr++; } return 0; } void swapext(char *name, char *exptr) { char ext[MAXEXT]; register char *p1=exptr+1; register char *p2=ext; int extchar=*exptr; while(*p1 && *p1!='.' && *p1!='/') *p2++=*p1++; *p2=0; p2=exptr-1; p1--; while(p2 >= name) *p1--=*p2--; p1=name; p2=ext; while(*p2) *p1++=*p2++; *p1=(extchar=='/'?'.':'/'); } void remove_prefix(void) { SWI_DDEUtils_Prefix(NULL); } void set_prefix(void) { char *pref; int size=0; if (SWI_OS_FSControl_37("@",pref,&size)!=NULL) return; size=1-size; if (pref=malloc(size),pref!=NULL) { if (SWI_OS_FSControl_37("@",pref,&size)!=NULL) { free(pref); return; } if (SWI_DDEUtils_Prefix(pref)==NULL) { atexit(remove_prefix); } free(pref); } } #ifdef localtime # undef localtime #endif #ifdef gmtime # undef gmtime #endif /* Acorn's implementation of localtime() and gmtime() * doesn't consider the timezone offset, so we have to * add it before calling the library functions */ struct tm *riscos_localtime(const time_t *timer) { time_t localt=*timer; localt+=SWI_Read_Timezone()/100; return localtime(&localt); } struct tm *riscos_gmtime(const time_t *timer) { time_t localt=*timer; localt+=SWI_Read_Timezone()/100; return gmtime(&localt); } *[UNZIP60.ACORN]RISCOS.H;1+, ./ 4@-}0123KPWO56eO7eO89GHJ/* Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* riscos.h */ #ifndef __riscos_h #define __riscos_h #include typedef struct { int errnum; char errmess[252]; } os_error; #ifndef __swiven_h # include "swiven.h" #endif #define MAXPATHLEN 256 #define MAXFILENAMELEN 64 /* should be 11 for ADFS, 13 for DOS, 64 seems a sensible value... */ #define DIR_BUFSIZE 1024 /* this should be enough to read a whole E-Format directory */ struct stat { unsigned int st_dev; int st_ino; unsigned int st_mode; int st_nlink; unsigned short st_uid; unsigned short st_gid; unsigned int st_rdev; unsigned int st_size; unsigned int st_blksize; time_t st_atime; time_t st_mtime; time_t st_ctime; };  UNZIP.BCK }[UNZIP60.ACORN]RISCOS.H;1*  typedef struct { char *dirname; void *buf; int size; char *act; int offset; int read; } DIR; struct dirent { unsigned int d_off; /* offset of next disk directory entry */ int d_fileno; /* file number of entry */ size_t d_reclen; /* length of this record */ size_t d_namlen; /* length of d_name */ char d_name[MAXFILENAMELEN]; /* name */ }; typedef struct { unsigned int load_addr; unsigned int exec_addr; int lenght; int attrib; int objtype; char name[13]; } riscos_direntry; typedef struct { short ID; short size; int ID_2; unsigned int loadaddr; unsigned int execaddr; int attr; int zero; } extra_block; #define S_IFMT 0770000 #define S_IFDIR 0040000 #define S_IFREG 0100000 /* 0200000 in UnixLib !?!?!?!? */ #ifndef S_IEXEC # define S_IEXEC 0000100 # define S_IWRITE 0000200 # define S_IREAD 0000400 #endif #ifndef NO_UNZIPH_STUFF # include # if (!defined(HAVE_STRNICMP) & !defined(NO_STRNICMP)) # define NO_STRNICMP # endif # ifndef DATE_FORMAT # define DATE_FORMAT DF_DMY # endif # define lenEOL 1 # define PutNativeEOL *q++ = native(LF); # define USE_STRM_INPUT # define USE_FWRITE # define PIPE_ERROR (errno == 9999) /* always false */ # define isatty(x) (TRUE) /* used in funzip.c to find if stdin redirected: should find a better way, now just work as if stdin never redirected */ # define USE_EF_UT_TIME # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP # endif # define localtime riscos_localtime # define gmtime riscos_gmtime #endif /* !NO_UNZIPH_STUFF */ #define _raw_getc() SWI_OS_ReadC() extern char *exts2swap; /* Extensions to swap */ int stat(char *filename,struct stat *res); DIR *opendir(char *dirname); struct dirent *readdir(DIR *d); void closedir(DIR *d); int unlink(char *f); int rmdir(char *d); int chmod(char *file, int mode); void setfiletype(char *fname,int ftype); void getRISCOSexts(char *envstr); int checkext(char *suff); void swapext(char *name, char *exptr); void remove_prefix(void); void set_prefix(void); struct tm *riscos_localtime(const time_t *timer); struct tm *riscos_gmtime(const time_t *timer); #endif /* !__riscos_h */ *[UNZIP60.ACORN]RUNME1ST.;1+,./ 4c@-}0123KPWO56ÖmH7ÖmH89GHJ| This Obey file prepares the UnZip port for a Desktop C re-compile. | Run it and it will copy all the needed files into the correct | place. | Set the correct type of 'srcrename' so that the only requirement | for the user is to set 'RunMe1st' to Obey SetType .srcrename FF8 | Run 'srcrename' on the main UnZip directory with recursion enabled /.srcrename -r -e c:h:s:o .^ | Create the 'o' directory CDir .^.o | Put the Makefile in its correct place and set the correct filetype SetType .makefile FE1 Copy .makefile .^.makefile ~C ~V F *[UNZIP60.ACORN]SRCRENAME.;1+,. / 4 o@-}0123KPWO 56vEDOF_q@LJHĚEƚn?oX/}ƚ-o*Ě:,pE@rIԈaSnf3rN"TSCbflzR;F99Jg?$7vؙęTKLYC9A;EAHZH皪જ+eC l6␘ԙ㘙ԙlԺfa4nN!u83gP7ݺԪEZ<6i\],+KCҚ7+XҚ=W6{,DT*}7~ԭl2salnb 4Xz" 𙻚 薙֔˩ әљ #ɟǙ a ng3sQyOY̚=+'BMGQH$NL/sI,84D5,?6Kw왬ī}FȚ|ND9)lWca4nN[ )I?v6i>?6H6i»\aob4w޺&/% - 0H'ފ(/&.@ (1ahne3qTPR?y8IqAU-~w^*K)}Υbo-q|/#cfJjT8v ~L -%c[[ZԊUw~=Mv۷N,gpO2W3=5{UC:ԍ$f)fmq B&z3s,TPndնC2lGc,ONJ̆_ظ4P_SbOϮ *pEǎv3N- 1Ui]`dedW+ w?o g5=m1X)s|({5/#Z~cGz'kKsv(k9*1! tWm}j$~_L jl C"|;tf_YIbW L=jKSGz(^9#IKP)1q2F yow^vK$BxQw\`|?nUvauB0yZ+?̙F#C%Xw"֩S22y_Gz27aVRB+@1i1Y  -Wxq amגXֶlXPDnJ~z] KƫGr`-U_HcV\S %i*'3,eɚU LI:4m;65kp!8C1EQ=ѢUD2_$kS>8tIG/Q]|[wuX1UIXA1cHԣy~lɥEwO *pMd -Z}uWҚ)q0qM0-\N뢂t,cwǃMMՐg"xƬ '>]VP,COng.-5gj\XFuG[Jv# v>.~|YiD=w %~zS<JxY+ ,)]_=?D.dyL't3ls0`kkT} OMLpyf//oEj|%S Si#G MZ9x`dvJfbl?c MuBN1k3JZ;#-h8 Gy' .0r&uu6* (4=L-y ;O+4_57K+mo0L" 0w%px.R'Qa VD_anXb5;:1)dQ7Xo 'iiihG$B"&<)>%RjOUJ?"e`xDE0i=edb#JBHxei`JQg-b`L`F54/<*5?o yi,5x }z| $%fS QnJ &Bl|E'@ [7iJok}fe[n-3Zu|5H JVp(BlbE"GW-NyHv-=S "/L#ij8X'%;XY^a?P^$-R7ew"z*,e4h1vbMD|$625BGNKt9d~#eJ#n9X/o+$fm2mK(L`\blK1)2X(4SB}gCt>pSOE5DI5wb2aqd1>w9<-$rL9G37k \/i$L0vFFLU_qHYB a*?9mNTNt <;]0 (mfVd3G{N{a? }5d ??3DAG`Nn}pg~qL =x5QpJ%3 ]dHYF@"T{BMJ#86!v?qORqI ,>v?/U-o'J"KT"U^zW@]]7H - wSEvT}{o D eTm+WawXX4 TDE7s2C{I(lo*,SjK[>FQ>|_tZB%-'FKb8Bddx#('s5'w<|}@b.V05{/8g a"\rv?0:K%n4_nopX4C LiO!%.\lIzOOMc6Iw' TLzD"T LW[[$>~'mYk 7Q]a1.| nl{%HxECYm(8W]D]d +[Y\!} O~X4f`pTR37u _bIk85|? &.mw(`}t=1JM 9t ItC\|@+\;} Ep4"]S =@$g=hIk LLMX,`ozp~,|Jc5'NESu QY2?X {[|b9losk=,,wXrP! N%6$e,qp=u&|1eZ0Zz3- l@NDZNA7a2zeYUpo8a~#9oT-X_  XHWr.v$]aXQ9vHF{crhy~ &`&82D(; H]ReK Ec] BvMbKNn xG] 1XNm"bi= gW~P ("HoE`i0 .:8geo.>D o{&`,}7Y >[w."8D[^d9m.hg1 (CF]xOU{Dl -y"6 1; CVl6], WmGp]i^]aI/\qp`u7EP7w/>|9o2R6z\k)wH!0/ ?Q"Z*p^+>d";,]Dd9tXn7V8 ~"!QbJX\ R;>~=6GI_rg6?zk-QY`e@qc47 lMl ps >Q]`}|lL&Pzb0&a D-VO5YbS'o c-)erF3J n 0x'UP$a_#jyzE@L_xE=k@+WbhwJSTI#(@xXF:LXec2@I,{C d NOZkmUA3cX@[0xqo#d^s[K/ =[6yN,IzXyewV@=`a=abSUIfm xd4o=%<' 6tI98wL-D\ORd6 VznERE<4_l>By~^Os@ 'BaHOca5}]L!15zZWHNEJ7oPJymeR4cKA *|wr/m:\4kL;$=-c^i00tQN&X.' dX(}NX/97\DJ;Z[B;j jnn|/}}wnkM(*h}~h-=D"zO@}+3or{MI2NAG]QL aLa5<^XX(b! (6yl&i6fy13axS) W/9jiXreV0JM%_,/!;$41(zfmwF Xdmwht]Cg)N((o+I}m?$>l5U?LO*leXp,{O*zv.b;(orh`%tSg4 t($e1P=%.8 m+bfME~__&m}C5?n&&I+@i~&}Y`v>M u*Mu(}6{4,7s+1Zlr9iP2Llnq6zQGdS#j!?FLZO'DQh4kc#iZC]PRt#AOR $ /4-uqboV,Bj ER.'|d4}2nJu##tXr d+6Qn&KHs9.$# gIZ:5_h(9wBF#GE|MP [(8QR Hp_liiIIHFv8{r.519QH-P~OpZJuR5QdgLX%E |GT`y[]4UX-+UtKO#Cx%b|Hf(EXQqES4~2m^!Uo']'"%< ?WTq2ZN 8b vzf~U@LN42/zOVY|19b7hE2"g/)9\ɕ2?Xeucڑ!坄\v_0$4&N̷Xlx:1'D$$i o[RE+ ;TլJ^ZAj\8tS_YL󒡳SWPMjK+m'xohK7J3m_ W$NXIeHv?Ӡ_2pv -.=ɅjXi+\&۲^e>y$N%٠|35d8]rv 4V3iF;W]ZuoOf hu ^h=0DN.p==]<%Cڙ6MQ^ OЊ|"h$42~48{7 2]L߇嚹إŤÉ񳶕؞܀zΗѫ«妯ܧʎ9Лкӣӈڜ˕ĿĆό#ɀזĠ]ڌĆ̝σ޵թg1c皇+t̵ĀЌ򔅇ݯݷҥԒшĜ֟ԂDŽTSnCdl(q|F;\!&9QShJ]HNlc& |.cDaYFK}e!(w_P^7U9#GiF!-0D{Ts65U\qJ }N-! %5f;.wbi]QzV0I_S9D*I`OJ%Y@v$M',,s+p.N '9!N]w"/4]=+8@{LEC &]@dt{p/k90`_W8oh>PPQN7g?5?H^W1lwy9qyf[ B48}aD)KSgVR}FckB9GC\ziyg~ t-\E[ J08xFy S1eEUM|Tb/F3,:l2xWLo\ V<=1ExOD#7w6HZEIPw]3-99IC C~%o`-NO.InsJh8,8# ]X@N luA-m|cI4-\M ohZ=Tdy{hn"# 6TT,ON+tNE@[ E]{:kHvSvQ@.`Iz'o RyXLD>/t|-YAV] ͐Ma=aYVhg2dLn. cp~;¯yv-,ڙu>hx\(x߄ aJ6+ⰼj9( `n[1J&(hj$K/{CSxpwLCz D-)$G2CyU[~]7l9Ye!*lZsu\PaP_>>hb$*BuH7%˟0wv&ՄG&tSJ)ѵ4f5x! bDl- c3X. ά{A 0JɛǨ)KKڴ @BNɅέ~u^xE֪|;rk%Z V.9ahNn]L6_lE9MT,|w>;% YlVG 8೺J'rZ(Kj*}^B p/WĠHafkOw nVg"*,d[hy1[vfP@AqFt pb& ij\O9xI-'8<.M* >a=`@+PUO:,*H{i7O:DqOIe>R+lECf;wڅoSJzql_c;b'0CΈ3Ќ=|hLAldjǸ37 &4Z ktm=~\De peqeK6p &= 0xF1FFFFFFL; if ((tmp & 0xF0000000L) != 0x40000000L) tmp &= 0x01FFFFFFL; /* not a dir, mask all ftype bits */ else tmp &= 0x41FFFFFFL; /* l ՚8 UNZIP.BCK}[UNZIP60.ACORN]SWIVEN.S;1 I OVVC r0, #0 LDMFD sp!, {r4-r5,pc}^ ; os_error *SWI_OS_File_8(char *dirname); STARTCODE SWI_OS_File_8 STMFD sp!, {r4,lr} MOV r1, r0 MOV r4, #0 MOV r0, #8 SWI OS_File + XOS_Bit MOVVC r0, #0 LDMFD sp!, {r4,pc}^ ; os_error *SWI_OS_File_18(char *filename, int filetype); STARTCODE SWI_OS_File_18 STMFD sp!, {r4-r5,lr} MOV r2, r1 MOV r1, r0 MOV r0, #18 SWI OS_File + XOS_Bit MOVVC r0, #0 LDMFD sp!, {r4-r5,pc}^ ; os_error *SWI_OS_CLI(char *cmd); STARTCODE SWI_OS_CLI MOV ip, lr SWI OS_CLI + XOS_Bit MOVVC r0, #0 MOVS pc, ip ; int SWI_OS_ReadC(void); STARTCODE SWI_OS_ReadC MOV ip, lr SWI OS_ReadC + XOS_Bit MOVS pc, ip ; os_error *SWI_OS_ReadVarVal(char *var, char *buf, int len, int *bytesused); STARTCODE SWI_OS_ReadVarVal STMFD sp!, {r4,lr} MOV ip, r3 MOV r3, #0 MOV r4, #0 SWI OS_ReadVarVal + XOS_Bit LDMVSFD sp!, {r4,pc}^ TEQ ip, #0 STRNE r2, [ip] MOV r0, #0 LDMFD sp!, {r4,pc}^ ; os_error *SWI_OS_FSControl_54(char *buffer, int dir, char *fsname, int *size); STARTCODE SWI_OS_FSControl_54 STMFD sp!, {r3-r6,lr} LDR r5, [r3] MOV r3, r2 MOV r2, r1 MOV r1, r0 MOV r0, #54 SWI OS_FSControl + XOS_Bit LDMVSFD sp!, {r3-r6,pc}^ MOV r0, #0 LDMFD sp!, {r3} STR r5, [r3] LDMFD sp!, {r4-r6,pc}^ ; os_error *SWI_OS_FSControl_37(char *pathname, char *buffer, int *size); STARTCODE SWI_OS_FSControl_37 STMFD sp!, {r2,r3-r5,lr} LDR r5, [r2] MOV r3, #0 MOV r4, #0 MOV r2, r1 MOV r1, r0 MOV r0, #37 SWI OS_FSControl + XOS_Bit LDMVSFD sp!, {r2,r3-r5,pc}^ MOV r0, #0 LDMFD sp!, {r2} STR r5, [r2] LDMFD sp!, {r3-r5,pc}^ ; os_error *SWI_DDEUtils_Prefix(char *dir); STARTCODE SWI_DDEUtils_Prefix MOV ip, lr SWI DDEUtils_Prefix + XOS_Bit MOVVC r0, #0 MOVS pc, ip ; int SWI_Read_Timezone(void); STARTCODE SWI_Read_Timezone MOV ip, lr SWI Territory_ReadCurrentTimeZone + XOS_Bit MOVVC r0, r1 MOVVS r0, #0 MOVS pc, ip ; int SWI_MimeMap_Translate(char *ext); STARTCODE SWI_MimeMap_Translate MOV ip,lr MOV r1, r0 MOV r0, #3 MOV r2, #0 SWI MimeMap_Translate + XOS_Bit MOVVC r0, r3 MVNVS r0, #0 ; return -1 on error MOVS pc, ip END *[UNZIP60]AMIGA.DIR;1+,W./ 4->0123 KPWO56]cϪ7]cϪ89GHJIAMIGA.CAMIGA.H= CONTENTS.CRC_68.A FILEDATE.CFLATE.A# MAKEFILE.AZT MAKESFX.C SMAKEFILE.STAT.CZ-STAT.H*[UNZIP60.AMIGA]AMIGA.C;1+,.H/ 4HH@-W0123KPWOI56gy )7gy )89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*------------------------------------------------------------------------ amiga.c Amiga-specific routines for use with Info-ZIP's UnZip 5.1 and later. See History.5xx for revision history. Contents: do_wild() mapattr() mapname() checkdir() close_outfile() stamp_file() _abort() (Aztec C only) [dateformat()] (currently not used) screensize() version() ------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #ifdef AZTEC_C # define NO_FCNTL_H #endif #include "unzip.h" #include "unzvers.h" /* Globular varibundus -- now declared in SYSTEM_SPECIFIC_GLOBALS in amiga.h */ /* static int created_dir; */ /* used in mapname(), checkdir() */ /* static int renamed_fullpath; */ /* ditto */ #define PERMS 0777 #define MKDIR(path,mode) mkdir(path) #ifndef S_ISCRIPT /* not having one implies you have none */ # define S_IARCHIVE 0020 /* not modified since this bit was last set */ # define S_IREAD 0010 /* can be opened for reading */ # define S_IWRITE 0004 /* can be opened for writing */ # define S_IDELETE 0001 /* can be deleted */ #endif /* S_ISCRIPT */ #ifndef S_IRWD # define S_IRWD 0015 /* useful combo of Amiga privileges */ #endif /* !S_IRWD */ #ifndef S_IHIDDEN # define S_IHIDDEN 0200 /* hidden supported in future AmigaDOS (someday) */ #endif /* !S_HIDDEN */ #ifndef SFX /* Make sure the number here matches unzvers.h in the *EXACT* form */ /* UZ_MAJORVER "." UZ_MINORVER UZ_PATCHLEVEL vvvv No non-digits! */ const char version_id[] = "\0$VER: UnZip " UZ_VER_STRING " (" #include "env:VersionDate" ")\r\n"; #endif /* SFX */ static int ispattern(ZCONST char *p) { register char c; while (c = *p++) if (c == '\\') { if (!*++p) return FALSE; } else if (c == '?' || c == '*') return TRUE; else if (c == '[') { for (;;) { if (!(c = *p++)) return FALSE; else if (c == '\\') { if (!*++p) return FALSE; } else if (c == ']') return TRUE; } } return FALSE; } /**********************/ /* Function do_wild() */ /**********************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { /* these statics are now declared in SYSTEM_SPECIFIC_GLOBALS in amiga.h: static DIR *wild_dir = NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall = FALSE, dirnamelen; */ struct dirent *file; BPTR lok = 0; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!G.notfirstcall) { /* first call: must initialize everything */ G.notfirstcall = TRUE; /* avoid needless readdir() scans: */ if (!ispattern(wildspec) || (lok = Lock((char *)wildspec, ACCESS_READ))) { if (lok) UnLock(lok); /* ^^ we ignore wildcard chars if */ G.dirnamelen = 0; /* the name matches a real file */ strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; return G.matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((G.wildname = (ZCONST char *)strrchr(wildspec, '/ } UNZIP.BCKW[UNZIP60.AMIGA]AMIGA.C;1H") ')) == NULL && (G.wildname = (ZCONST char *)strrchr(wildspec, ':')) == NULL) { G.dirname = ""; /* current dir */ G.dirnamelen = 0; G.wildname = wildspec; } else { ++G.wildname; /* point at character after '/' or ':' */ G.dirnamelen = G.wildname - wildspec; if ((G.dirname = (char *)malloc(G.dirnamelen+1)) == NULL) { Info(slide, 1, ((char *)slide, "warning: cannot allocate wildcard buffers\n")); strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; return G.matchname; /* but maybe filespec was not a wildcard */ } strncpy(G.dirname, wildspec, G.dirnamelen); G.dirname[G.dirnamelen] = '\0'; } if ((G.wild_dir = opendir(G.dirname)) != NULL) { while ((file = readdir(G.wild_dir)) != NULL) { if (match(file->d_name, G.wildname, 1 WISEP)) {/* ignore case */ strcpy(G.matchname, G.dirname); strcpy(G.matchname + G.dirnamelen, file->d_name); return G.matchname; } } /* if we get to here directory is exhausted, so close it */ closedir(G.wild_dir); G.wild_dir = NULL; } /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; return G.matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (G.wild_dir == NULL) { G.notfirstcall = FALSE; /* nothing left to try -- reset */ if (G.dirnamelen > 0) free(G.dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ while ((file = readdir(G.wild_dir)) != NULL) if (match(file->d_name, G.wildname, 1 WISEP)) { /* 1 == ignore case */ /* strcpy(G.matchname, dirname); */ strcpy(G.matchname + G.dirnamelen, file->d_name); return G.matchname; } closedir(G.wild_dir); /* have read at least one dir entry; nothing left */ G.wild_dir = NULL; G.notfirstcall = FALSE; /* reset for new wildspec */ if (G.dirnamelen > 0) free(G.dirname); return (char *)NULL; } /* end function do_wild() */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) /* Amiga version */ __GDEF { ulg tmp = G.crec.external_file_attributes; /* Amiga attributes = hsparwed = hidden, script, pure, archive, * read, write, execute, delete */ switch (G.pInfo->hostnum) { case AMIGA_: if ((tmp & 1) == (tmp>>18 & 1)) tmp ^= 0x000F0000; /* PKAZip compatibility kluge */ /* turn off archive bit for restored Amiga files */ G.pInfo->file_attr = (unsigned)((tmp>>16) & (~S_IARCHIVE)); break; case UNIX_: /* preserve read, write, execute: use logical-OR of */ case VMS_: /* user, group, and other; if writable, set delete bit */ case ACORN_: case ATARI_: case ATHEOS_: case BEOS_: case QDOS_: case TANDEM_: { unsigned uxattr = (unsigned)(tmp >> 16); int r = FALSE; if (uxattr == 0 && G.extra_field) { /* Some (non-Info-ZIP) implementations of Zip for Unix and VMS (and probably others ??) leave 0 in the upper 16-bit part of the external_file_attributes field. Instead, they store file permission attributes in some extra field. As a work-around, we search for the presence of one of these extra fields and fall back to the MSDOS compatible part of external_file_attributes if one of the known e.f. types has been detected. Later, we might implement extraction of the permission bits from the VMS extra field. But for now, the work-around should be sufficient to provide "readable" extracted files. (For ASI Unix e.f., an experimental remap of the e.f. mode value IS already provided!) */ ush ebID; unsigned ebLen; uch *ef = G.extra_field; unsigned ef_len = G.crec.extra_field_length; while (!r && ef_len >= EB_HEADSIZE) { ebID = makeword(ef); ebLen = (unsigned)makeword(ef+EB_LEN); if (ebLen > (ef_len - EB_HEADSIZE)) /* discoverd some e.f. inconsistency! */ break; switch (ebID) { case EF_ASIUNIX: if (ebLen >= (EB_ASI_MODE+2)) { uxattr = (unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE)); /* force stop of loop: */ ef_len = (ebLen + EB_HEADSIZE); break; } /* else: fall through! */ case EF_PKVMS: /* "found nondecypherable e.f. with perm. attr" */ r = TRUE; default: break; } ef_len -= (ebLen + EB_HEADSIZE); ef += (ebLen + EB_HEADSIZE); } } if (!r) { uxattr = (( uxattr>>6 | uxattr>>3 | uxattr) & 07) << 1; G.pInfo->file_attr = (unsigned)(uxattr&S_IWRITE ? uxattr|S_IDELETE : uxattr); break; } } /* fall through! */ /* all other platforms: assume read-only bit in DOS half of attribute * word is set correctly ==> will become READ or READ+WRITE+DELETE */ case FS_FAT_: case FS_HPFS_: /* can add S_IHIDDEN check to MSDOS/OS2/NT eventually */ case FS_NTFS_: case MAC_: case TOPS20_: default: G.pInfo->file_attr = (unsigned)(tmp&1? S_IREAD : S_IRWD); break; } /* end switch (host-OS-created-by) */ G.pInfo->file_attr &= 0xff; /* mask off all but lower eight bits */ return 0; } /* end function mapattr() */ /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=NULL; /* character pointers */ char *lastsemi = NULL; /* pointer to last semi-colon in pathcomp */ int killed_ddot = FALSE; /* is set when skipping "../" paXu UNZIP.BCKW[UNZIP60.AMIGA]AMIGA.C;1Hthcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels in AmigaDOS */ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); G.created_dir = FALSE; /* not yet */ /* user gave full pathname: don't prepend G.rootpath */ #ifndef OLD_AMIGA_RENAMED G.renamed_fullpath = (renamed && (*G.filename == '/' || *G.filename == ':')); #else /* supress G.rootpath even when user gave a relative pathname */ # if 1 G.renamed_fullpath = (renamed && strpbrk(G.filename, ":/"); # else G.renamed_fullpath = (renamed && (strchr(G.filename, ':') || strchr(G.filename, '/'))); # endif #endif if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM) return MPN_NOMEM; /* initialize path buffer, unless no memory */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; /* keep for now; remove VMS ";##" */ *pp++ = (char)workch; /* later, if requested */ break; default: /* allow ISO European characters in filenames: */ if (isprint(workch) || (160 <= workch && workch <= 255)) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (G.created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %s\n", FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } error = (error & ~MPN_MASK) | checkdir(__G__ pathcomp, APPEND_NAME); if ((error & MPN_MASK) == MPN_INF_TRUNC) { /* GRR: OK if truncated here: warn and continue */ /* (warn in checkdir?) */ } checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { /* these statics are now declared in SYSTEM_SPECIFIC_GLOBALS in amiga.h: */ /* static int rootlen = 0; */ /* length of rootpath */ /* static char *rootpath; */ /* user's "extract-to" directory */ /* static char *buildpath; */ /* full path (so far) to extracted file */ /* static char *end; */ /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ /* GRR: check path length after each segment: warn about truncation */ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*G.build_end = *pathcomp++) != '\0') ++G.build_end; /* Truncate components over 30 chars? Nah, the filesystem handles it. */ if ((G.build_end-G.buildpath) > FILNAMSIZ-3) /* room for "/a\0" */ too_long = TRUE; /* check if extracting dir? */ if (SSTAT(G.buildpath, &G.statbuf)) { /* path doesn't exist */ if (!G.create_dirs) { /* told not to create (freshening) */ free(G.buildpath); return MPN_INF_SKIP; /* pa0 UNZIP.BCKW[UNZIP60.AMIGA]AMIGA.C;1HZ'th doesn't exist: nothing to do */ } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(G.buildpath))); free(G.buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (MKDIR(G.buildpath, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ unable to process %s.\n", FnFilter2(G.buildpath), FnFilter1(G.filename))); free(G.buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } G.created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n\ unable to process %s.\n", FnFilter2(G.buildpath), FnFilter1(G.filename))); free(G.buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(G.buildpath))); free(G.buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *G.build_end++ = '/'; *G.build_end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(G.buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free G.buildpath. Not our responsibility to worry whether pathcomp has room. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, G.buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(G.buildpath); G.buildpath = G.build_end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*G.build_end = *pathcomp++) != '\0') { ++G.build_end; if ((G.build_end-G.buildpath) >= FILNAMSIZ) { *--G.build_end = '\0'; Info(slide, 0x201, ((char *)slide, "checkdir warning: path too long; truncating\n\ %s\n -> %s\n", FnFilter1(G.filename), FnFilter2(G.buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(G.buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); if ((G.buildpath = (char *)malloc(strlen(G.filename)+G.rootlen+1)) == (char *)NULL) return MPN_NOMEM; if ((G.rootlen > 0) && !G.renamed_fullpath) { strcpy(G.buildpath, G.rootpath); G.build_end = G.buildpath + G.rootlen; } else { *G.buildpath = '\0'; G.build_end = G.buildpath; } Trace((stderr, "[%s]\n", FnFilter1(G.buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in G.rootpath and create it if necessary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { G.rootlen = 0; return MPN_OK; } if (G.rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((G.rootlen = strlen(pathcomp)) > 0) { if (stat(pathcomp, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) { /* path does not exist */ if (!G.create_dirs) { G.rootlen = 0; /* skip (or treat as stored file) */ return MPN_INF_SKIP; } /* create the directory (could add loop here scanning pathcomp * to create more than one level, but why really necessary?) */ if (MKDIR(pathcomp, 0777) == -1) { Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n", FnFilter1(pathcomp))); G.rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdir levels required */ return MPN_ERR_SKIP; } } if ((G.rootpath = (char *)malloc(G.rootlen+2)) == NULL) { G.rootlen = 0; return MPN_NOMEM; } strcpy(G.rootpath, pathcomp); if (G.rootpath[G.rootlen-1] != ':' && G.rootpath[G.rootlen-1] != '/') G.rootpath[G.rootlen++] = '/'; G.rootpath[G.rootlen] = '\0'; Trace((stderr, "rootpath now = [%s]\n", FnFilter1(G.rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free G.rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (G.rootlen > 0) { free(G.rootpath); G.rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /**************************************/ /* Function close_outfile() */ /**************************************/ /* this part differs slightly with Zip */ /*-------------------------------------*/ void close_outfile(__G) __GDEF { time_t m_time; #ifdef USE_EF_UT_TIME iztimes z_utime; #endif LONG FileDate(); if (uO.cflag) /* can't set time or filenote on stdout */ return; /* close the file *before* setting its time under AmigaDOS */ fclose(G.outfile); /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ A٢ UNZIP.BCKW[UNZIP60.AMIGA]AMIGA.C;1H6 G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) { TTrace((stderr, "close_outfile: Unix e.f. modif. time = %ld\n", z_utime.mtime)); m_time = z_utime.mtime; } else { /* Convert DOS time to time_t format */ m_time = dos_to_unix_time(G.lrec.last_mod_dos_datetime); } #else /* !USE_EF_UT_TIME */ /* Convert DOS time to time_t format */ m_time = dos_to_unix_time(G.lrec.last_mod_dos_datetime); #endif /* ?USE_EF_UT_TIME */ #ifdef DEBUG Info(slide, 1, ((char *)slide, "\nclose_outfile(): m_time=%s\n", ctime(&m_time))); #endif if (!FileDate(G.filename, &m_time)) Info(slide, 1, ((char *)slide, "warning: cannot set the time for %s\n", G.filename)); } /* set file perms after closing (not done at creation)--see mapattr() */ chmod(G.filename, G.pInfo->file_attr); /* give it a filenote from the zipfile comment, if appropriate */ if (uO.N_flag && G.filenotes[G.filenote_slot]) { SetComment(G.filename, G.filenotes[G.filenote_slot]); free(G.filenotes[G.filenote_slot]); G.filenotes[G.filenote_slot] = NULL; } } /* end function close_outfile() */ #ifdef TIMESTAMP /*************************/ /* Function stamp_file() */ /*************************/ int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime; { time_t m_time; LONG FileDate(); m_time = modtime; return (FileDate((char *)fname, &m_time)); } /* end function stamp_file() */ #endif /* TIMESTAMP */ #ifndef __SASC /********************************************************************/ /* Load filedate as a separate external file; it's used by Zip, too.*/ /* */ # include "amiga/filedate.c" /* */ /* */ /********************************************************************/ /********************* do linewise with stat.c **********************/ # include "amiga/stat.c" /* this is the exact same stat.c used by Zip */ #endif /* !__SASC */ /* SAS/C makes separate object modules of these; there is less */ /* trouble that way when redefining standard library functions. */ #include void _abort(void) /* called when ^C is pressed */ { /* echon(); */ close_leftover_open_dirs(); fflush(stdout); fputs("\n^C\n", stderr); exit(1); } /************************************************************/ /* function screensize() -- uses sendpkt() from filedate.c: */ /************************************************************/ #include #include #include #include extern long sendpkt(struct MsgPort *pid, long action, long *args, long nargs); int screensize(int *ttrows, int *ttcols) { BPTR fh = Output(); if (fh && IsInteractive(fh)) { struct ConUnit *conunit = NULL; void *conp = ((struct FileHandle *) (fh << 2))->fh_Type; struct InfoData *ind = AllocMem(sizeof(*ind), MEMF_PUBLIC); long argp = ((unsigned long) ind) >> 2; if (ind && conp && sendpkt(conp, ACTION_DISK_INFO, &argp, 1)) conunit = (void *) ((struct IOStdReq *) ind->id_InUse)->io_Unit; if (ind) FreeMem(ind, sizeof(*ind)); if (conunit) { if (ttrows) *ttrows = conunit->cu_YMax + 1; if (ttcols) *ttcols = conunit->cu_XMax + 1; return 0; /* success */ } } if (ttrows) *ttrows = INT_MAX; if (ttcols) *ttcols = INT_MAX; return 1; /* failure */ } #ifdef AMIGA_VOLUME_LABELS /* This function is for if we someday implement -$ on the Amiga. */ # include # include # include BOOL is_floppy(ZCONST char *path) { BOOL okay = FALSE; char devname[32], *debna; ushort i; BPTR lok = Lock((char *)path, ACCESS_READ), pok; struct FileSysStartupMsg *fart; struct DeviceNode *debb, devlist = (void *) BADDR((struct DosInfo *) BADDR(DOSBase->dl_Root->rn_Info)->di_DevInfo); if (!lok) return FALSE; /* should not happen */ if (pok = ParentDir((char *)path)) { UnLock(lok); UnLock(pok); return FALSE; /* it's not a root directory path */ } Forbid(); for (debb = devlist; debb; debb = BADDR(debb->dn_Next)) if (debb->dn_Type == DLT_DEVICE && (debb->dn_Task == lick->fl_Task)) if (fart = BADDR(debb->dn_Startup)) { debna = (char *) BADDR(fart->fssm_Device) + 1; if ((i = debna[-1]) > 31) i = 30; strncpy(devname, debna, i); devname[i] = 0; okay = !strcmp(devname, "trackdisk.device") || !strcmp(devname, "mfm.device") || !strcmp(devname, "messydisk.device"); break; /* We only support obvious floppy drives, not tricky */ } /* things like removable cartrige hard drives, or */ Permit(); /* any unusual kind of floppy device driver. */ return okay; } #endif /* AMIGA_VOLUME_LABELS */ #ifndef SFX # if 0 /* As far as I can tell, all the locales AmigaDOS 2.1 knows about all */ /* happen to use DF_MDY ordering, so there's no point in using this. */ /*************************/ /* Function dateformat() */ /*************************/ #include #ifdef AZTEC_C # include #endif int dateformat() { /*--------------------------------------------------------------------------- For those operating systems which support it, this function returns a value which tells how national convention says that numeric dates are displayed. Return values are DF_YMD, DF_DMY and DF_MDY (the meanings should be fairly obvious). ---------------------------------------------------------------------------*/ struct Library *LocaleBase; struct Locale *ll; int result = DF_MDY; /* the default */ if ((LocaleBase = OpenLibrary("locale.library", 0))) { if (ll = OpenLocale(NULL)) { uch *f = ll->loc_ShortDateFormat; /* In this string, %y|%Y is year, %b|%B|%h|%m is month, */ /* %d|%e is day day, and %D|%x is short for mo/da/yr. */ if (!strstr(f, "%D") && !strstr(f, "%x")) { uch *da, *mo, *yr; if (!(mo = strstr(f, "%b")) && !(mo = strstr(f, "%B")) && !(mo = strstr(f, "%h"))) mo = strstr(f, "%m"); if (!(da = strstr(f, "%d"))) da = strstr(f, "%e"); if (!(yr = strstr(f, "%y"))) yr = strstr(f, "%Y"); if (yr && yr < mo) result = DF_YMD; else if (da && da < mo) result = DF_DMY; } CloseLocale(ll); } CloseLibrary(LocaleBase); } return result; } # endif /* 0 */ /************************/ /* Function version() */ /************************/ /* NOTE: the following include depends upon the environment * variable $Workbench to be set co|V UNZIP.BCKW[UNZIP60.AMIGA]AMIGA.C;1HzErrectly. (Set by * default, by kickstart during startup) */ int WBversion = (int) #include "ENV:Workbench" ; void version(__G) __GDEF { /* Define buffers. */ char buf1[16]; /* compiler name */ char buf2[16]; /* revstamp */ char buf3[16]; /* OS */ char buf4[16]; /* Date */ /* char buf5[16]; /* Time */ /* format "with" name strings */ #ifdef AMIGA # ifdef __SASC strcpy(buf1,"SAS/C "); # else # ifdef LATTICE strcpy(buf1,"Lattice C "); # else # ifdef AZTEC_C strcpy(buf1,"Manx Aztec C "); # else strcpy(buf1,"UNKNOWN "); # endif # endif # endif /* "under" */ sprintf(buf3,"AmigaDOS v%d",WBversion); #else strcpy(buf1,"Unknown compiler "); strcpy(buf3,"Unknown OS"); #endif /* Define revision, date, and time strings. * NOTE: Do not calculate run time, be sure to use time compiled. * Pass these strings via your makefile if undefined. */ #if defined(__VERSION__) && defined(__REVISION__) sprintf(buf2,"version %d.%d",__VERSION__,__REVISION__); #else # ifdef __VERSION__ sprintf(buf2,"version %d",__VERSION__); # else sprintf(buf2,"unknown version"); # endif #endif #ifdef __DATE__ sprintf(buf4," on %s",__DATE__); #else strcpy(buf4," unknown date"); #endif /****** #ifdef __TIME__ sprintf(buf5," at %s",__TIME__); #else strcpy(buf5," unknown time"); #endif ******/ /* Print strings using "CompiledWith" mask defined in unzip.c (used by all). * ("Compiled with %s%s for %s%s%s%s.") */ printf(LoadFarString(CompiledWith), buf1, buf2, buf3, buf4, "", /* buf5 not used */ "" ); /* buf6 not used */ } /* end function version() */ #endif /* !SFX */ *[UNZIP60.AMIGA]AMIGA.H;1+,=. / 4 @-W0123KPWO56/)7/)89GHJ/* Copyright (c) 1990-2005 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* amiga.h * * Globular definitions that affect all of AmigaDom. * * Originally included in unzip.h, extracted for simplicity and eeze of * maintenance by John Bush. * * THIS FILE IS #INCLUDE'd by unzpriv.h * */ #ifndef __amiga_amiga_h #define __amiga_amiga_h #include "amiga/z-stat.h" /* substitute for and */ #include #ifndef NO_FCNTL_H # include #else int mkdir(const char *_name); #endif /* we only have dinky old-sk00l 32 bit filesystems */ #ifdef LARGE_FILE_SUPPORT # undef LARGE_FILE_SUPPORT #endif typedef long zoff_t; #define ZOFF_T_DEFINED typedef struct stat z_stat; #define Z_STAT_DEFINED #ifdef AZTEC_C /* Manx Aztec C, 5.0 or newer only */ # include # include /* do inline dos.library calls */ # define O_BINARY 0 # define direct dirent # ifndef IZTZ_DEFINESTDGLOBALS # define IZTZ_DEFINESTDGLOBALS # endif # define DECLARE_TIMEZONE # define ASM_INFLATECODES # define ASM_CRC /* This compiler environment supplies a flat 32-bit address space */ /* where C rtl functions are capable of handling large (32-bit-wide) */ /* allocations and I/O. But, for speed on old 68000 CPUs, standard */ /* ints are 16-bits wide per default. ("size_t" is defined as */ /* "unsigned long" in this case.) The Deflate64 support requires */ /* the variables for handling the decompression buffer to hold */ /* 32-bit wide integers. The INT_16BIT symbol defined below forces */ /* the declarations of these variables to use "unsigned long" type. */ # ifndef _INT32 # define INT_16BIT /* or deflate64 stuff will fail */ # endif /* Note that defining REENTRANT will not eliminate all global/static */ /* variables. The functions we use from c.lib, including stdio, are */ /* not reentrant. Neither are the stuff in amiga/stat.c or the time */ /* functions in amiga/filedate.c, because they just augment c.lib. */ /* If you want a fully reentrant and reexecutable "pure" UnZip with */ /* Aztec C, assemble and link in the startup module purify.a by Paul */ /* Kienitz. REENTRANT should be used just to reduce memory waste. */ #endif /* AZTEC_C */ #ifdef __SASC /* NOTE: SAS/C COMPILATION HAS BEEN UNSUPPORTED THROUGH MANY UNZIP VERSIONS. */ /* (Which is too bad, because it would probably perform better than Aztec.) */ /* includes */ # include # include # include # include # include # if (defined(_M68020) && (!defined(__USE_SYSBASE))) /* on 68020 or higher processors it is faster */ # define __USE_SYSBASE /* to use the pragma libcall instead of syscall */ # endif /* to access functions of the exec.library */ # include /* see SAS/C manual:part 2,chapter 2,pages 6-7 */ # include # include # ifdef DEBUG # include /* profiler header file */ # endif # if ( (!defined(O_BINARY)) && defined(O_RAW)) # define O_BINARY O_RAW # endif # if (defined(_SHORTINT) && !defined(USE_FWRITE)) # define USE_FWRITE /* define if write() returns 16-bit int */ # endif # if (!defined(REENTRANT) && !defined(FUNZIP)) # define REENTRANT /* define if unzip is going to be pure */ # endif # if defined(REENTRANT) && defined(DYNALLOC_CRCTAB) # undef DYNALLOC_CRCTAB # endif # ifdef MWDEBUG # include /* both stdio.h and stdlib.h must be included */ # include /* before memwatch.h */ # include "memwatch.h" # undef getenv # endif /* MWDEBUG */ # ifndef IZTZ_SETLOCALTZINFO /* XXX !! We have really got to find a way to operate without these. */ # define IZTZ_SETLOCALTZINFO # endif #endif /* SASC */ #define MALLOC_WORK #define USE_EF_UT_TIME #if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP #endif #ifndef IZTZ_GETLOCALETZINFO # define IZTZ_GETLOCALETZINFO GetPlatformLocalTimezone #endif /* the amiga port uses Info-ZIP's own timezone library, which includes * a "working" mktime() implementation */ #ifndef HAVE_MKTIME # define HAVE_MKTIME #endif /* check that TZ environment variable is defined before using UTC times */ #if (!defined(NO_IZ_CHECK_TZ) && !defined(IZ_CHECK_TZ)) # define IZ_CHECK_TZ #endif #define AMIGA_FILENOTELEN 80 #ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY #endif #define lenEOL 1 #define PutNativeEOL *q++ = native(LF); #define PIPE_ERROR 0 #ifdef GLOBAL /* crypt.c usage conflicts with AmigaDOS headers */ # undef GLOBAL #endif /* FunkshinR UNZIP.BCK=W[UNZIP60.AMIGA]AMIGA.H;1  e Prough Toe Taipes */ extern int real_timezone_is_set; void tzset(void); #define VALID_TIMEZONE(tempvar) (tzset(), real_timezone_is_set) int Agetch(void); /* getch() like function, in amiga/filedate.c */ LONG FileDate(char *, time_t[]); int screensize(int *ttrows, int *ttcols); void _abort(void); /* ctrl-C trap */ #define SCREENSIZE(ttrows, ttcols) screensize(ttrows, ttcols) #define SCREENWIDTH 80 #define SCREENLWRAP 1 #define TABSIZE 8 /* Static variables that we have to add to Uz_Globs: */ #define SYSTEM_SPECIFIC_GLOBALS \ int filenote_slot;\ char *(filenotes[DIR_BLKSIZ]);\ int created_dir, renamed_fullpath, rootlen;\ char *rootpath, *buildpath, *build_end;\ DIR *wild_dir;\ ZCONST char *wildname;\ char *dirname, matchname[FILNAMSIZ];\ int dirnamelen, notfirstcall; /* filenotes[] and filenote_slot are for the -N option that restores */ /* comments of Zip archive entries as AmigaDOS filenotes. The others */ /* are used by functions in amiga/amiga.c only. */ /* created_dir and renamed_fullpath are used by mapname() and checkdir(). */ /* rootlen, rootpath, buildpath, and build_end are used by checkdir(). */ /* wild_dir, dirname, wildname, matchname[], dirnamelen and notfirstcall */ /* are used by do_wild(). */ #endif /* __amiga_amiga_h */ *[UNZIP60.AMIGA]CONTENTS.;1+,./ 4N@-W0123KPWO56`7`89GHJContents of the "amiga" directory for UnZip 5.5 and later: Contents this file amiga.c Amiga-specific file I/O routines amiga.h Amiga-specific header file filedate.c SetFileDate clone for OS 1.3, and other low-level resources smakefile SAS/C makefile for UnZip, fUnZip, and UnZipSFX makefile.azt Aztec C makefile for UnZip, fUnZip, and UnZipSFX stat.c stat() emulation for Aztec, along with opendir()/readdir()/etc z-stat.h replacement stat.h header file for use with stat.c crc_68.a assembler version of crc32.c flate.a assembler version of inflate_codes() (define ASM_INFLATECODES) makesfx.c source for MakeSFX, without which UnZipSFX is not usable Notes: The crc_68.a source file is not currently used by the SAS/C makefile, nor is flate.a; as of UnZip 5.2 neither of these wants args in registers. The DICE makefile has been removed since no one is supporting that compiler anymore. As of UnZip 5.2, if you have AmigaDOS 2.1 or newer and have set your timezone in the Locale preferences editor, this will be an adequate substitute for setting TZ. If you do not set TZ to your current timezone, files will be restored with times corrsponding to "EST5EDT", U.S. Eastern time. See ../proginfo/timezone.txt for directions on how to set the TZ variable. *[UNZIP60.AMIGA]CRC_68.A;1+,. / 4 @-W0123KPWO 56789GHJ;=========================================================================== ; Copyright (c) 1990-2000 Info-ZIP. All rights reserved. ; ; See the accompanying file LICENSE, version 2000-Apr-09 or later ; (the contents of which are also included in zip.h) for terms of use. ; If, for some reason, all these files are missing, the Info-ZIP license ; also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html ;=========================================================================== ; crc_68 created by Paul Kienitz, last modified 04 Jan 96. ; ; Return an updated 32 bit CRC value, given the old value and a block of data. ; The CRC table used to compute the value is gotten by calling get_crc_table(). ; This replaces the older updcrc() function used in Zip and fUnZip. The ; prototype of the function is: ; ; ulg crc32(ulg crcval, uch *text, extent textlen); ; ; On the Amiga, type extent is always unsigned long, not unsigned int, because ; int can be short or long at whim, but size_t is long. ; ; If using this source on a non-Amiga 680x0 system, note that we treat ; a0/a1/d0/d1 as scratch registers not preserved across function calls. ; We do not bother to support registerized arguments for crc32() -- the ; textlen parm is usually large enough so that savings outside the loop ; are pointless. ; ; Define NO_UNROLLED_LOOPS to use a simple short loop which might be more ; efficient on certain machines with dinky instruction caches ('020?), or for ; processing short strings. If loops are unrolled, the textlen parm must be ; less than 512K; if not unrolled, it must be less than 64K. xdef _crc32 ; (ulg val, uch *buf, extent bufsize) DO_CRC0 MACRO moveq #0,ltemp move.b (textbuf)+,ltemp eor.b crcval,ltemp lsl.w #2,ltemp move.l (crc_table,ltemp.w),ltemp lsr.l #8,crcval eor.l ltemp,crcval ENDM machine mc68020 DO_CRC2 MACRO move.b (textbuf)+,btemp eor.b crcval,btemp lsr.l #8,crcval move.l (crc_table,btemp.w*4),ltemp eor.l ltemp,crcval ENDM crc_table equr a0 array of unsigned long crcval equr d0 unsigned long initial value textbuf equr a1 array of unsigned char textbufsize equr d1 unsigned long (count of bytes in textbuf) btemp equr d2 ltemp equr d3 xref _get_crc_table ; ulg *get_crc_table(void) NOLIST INCLUDE 'exec/execbase.i' LIST xref _SysBase ; struct ExecBase * _crc32: move.l 8(sp),d0 bne.s valid moveq #0,d0 rts valid: movem.l btemp/ltemp,-(sp) jsr _get_crc_table move.l d0,ltemp move.l 12(sp),crcval move.l 16(sp),textbuf move.l 20(sp),textbufsize not.l crcval move.l _SysBase,crc_table move.w AttnFlags(crc_table),btemp move.l ltemp,crc_table btst #AFB_68020,btemp bne twenty IFD NO_UNROLLED_LOOPS bra.s decr loop: DO_CRC0 decr: dbra textbufsize,loop bra.s done twenty: moveq #0,btemp bra.s decr2 loop2: DO_CRC2 decr2: dbra textbufsize,loop2 ELSE ; !NO_UNROLLED_LOOPS move.l textbufsize,btemp lsr.l #3,textbufsize bra decr8 loop8: DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 decr8: dbra textbufsize,loop8 and.w #7,btemp bra.s decr1 loop1: DO_CRC0 decr1: dbra btemp,loop1 bra done twenty: moveq #0,btemp move.l textbufsize,-(sp) lsr.l #3,textbufsize bra decr82 loop82: DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 decr82: dbra textbufsize,loop82 move.l (sp)+,textbufsize and.w #7,textbufsize bra.s decr12 loop12: DO_CRC2 decr12: dbr` UNZIP.BCKW[UNZIP60.AMIGA]CRC_68.A;1 > a textbufsize,loop12 ENDC ; ?NO_UNROLLED_LOOPS done: movem.l (sp)+,btemp/ltemp not.l crcval ;;;;; move.l crcval,d0 ; crcval already is d0 rts *[UNZIP60.AMIGA]FILEDATE.C;1+,.-/ 4--@-W0123KPWO.560 R70 R89GHJ/* Copyright (c) 1990-2002 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* Low-level Amiga routines shared between Zip and UnZip. * * Contains: FileDate() * getenv() [replaces inadequate standard library version] * setenv() [SAS/C only, replaces standard library version] * set_TZ() [SAS/C only] * GetPlatformLocalTimezone() [callback from timezone.c tzset()] * time() * sendpkt() * Agetch() * * The first five are used by most Info-ZIP programs except fUnZip. * The last two are used by all except the non-CRYPT version of fUnZip. * Probably some of the stuff in here is unused by ZipNote and ZipSplit too... * sendpkt() is used by Agetch() and FileDate(), and by screensize() in * amiga/amiga.c (UnZip); time() is used only by Zip. */ /* HISTORY/CHANGES * 2 Sep 92, Greg Roelofs, Original coding. * 6 Sep 92, John Bush, Incorporated into UnZip 5.1 * 6 Sep 92, John Bush, Interlude "FileDate()" defined, which calls or * redefines SetFileDate() depending upon AMIGADOS2 definition. * 11 Oct 92, John Bush, Eliminated AMIGADOS2 switch by determining * revision via OpenLibrary() call. Now only one version of * the program runs on both platforms (1.3.x vs. 2.x) * 11 Oct 92, John Bush, Merged with Zip version and changed arg passing * to take time_t input instead of struct DateStamp. * Arg passing made to conform with utime(). * 22 Nov 92, Paul Kienitz, fixed includes for Aztec and cleaned up some * lint-ish errors; simplified test for AmigaDOS version. * 11 Nov 95, Paul Kienitz, added Agetch() for crypt password input and * UnZip's "More" prompt -- simplifies crypt.h and avoids * use of library code redundant with sendpkt(). Made it * available to fUnZip, which does not use FileDate(). * 22 Nov 95, Paul Kienitz, created a new tzset() that gets the current * timezone from the Locale preferences. These exist only under * AmigaDOS 2.1 and up, but it is probably correctly set on more * Amigas than the TZ environment variable is. We check that * only if TZ is not validly set. We do not parse daylight * savings syntax except to check for presence vs. absence of a * DST part; United States rules are assumed. This is better * than the tzset()s in the Amiga compilers' libraries do. * 15 Jan 96, Chr. Spieler, corrected the logic when to select low level * sendpkt() (when FileDate(), Agetch() or windowheight() is used), * and AMIGA's Agetch() (CRYPT, and UnZip(SFX)'s UzpMorePause()). * 10 Feb 96, Paul Kienitz, re-fiddled that selection logic again, moved * stuff around for clarity. * 16 Mar 96, Paul Kienitz, created a replacement localtime() to go with the * new tzset(), because Aztec's is hopelessly broken. Also * gmtime(), which localtime() calls. * 12 Apr 96, Paul Kienitz, daylight savings was being handled incorrectly. * 21 Apr 96, Paul Kienitz, had to replace time() as well, Aztec's returns * local time instead of GMT. That's why their localtime() was bad, * because it assumed time_t was already local, and gmtime() was * the one that checked TZ. * 23 Apr 96, Chr. Spieler, deactivated time() replacement for UnZip stuff. * Currently, the UnZip sources do not make use of time() (and do * not supply the working mktime() replacement, either!). * 29 Apr 96, Paul Kienitz, created a replacement getenv() out of code that * was previously embedded in tzset(), for reliable global test * of whether TZ is set or not. * 19 Jun 96, Haidinger Walter, re-adapted for current SAS/C compiler. * 7 Jul 96, Paul Kienitz, smoothed together compiler-related changes. * 4 Feb 97, Haidinger Walter, added set_TZ() for SAS/C. * 23 Apr 97, Paul Kienitz, corrected Unix->Amiga DST error by adding * mkgmtime() so localtime() could be used. * 28 Apr 97, Christian Spieler, deactivated mkgmtime() definition for ZIP; * the Zip sources supply this function as part of util.c. * 24 May 97, Haidinger Walter, added time_lib support for SAS/C and moved * set_TZ() to time_lib.c. * 12 Jul 97, Paul Kienitz, adapted time_lib stuff for Aztec. * 26 Jul 97, Chr. Spieler, old mkgmtime() fixed (ydays[] def, sign vs unsign). * 30 Dec 97, Haidinger Walter, adaptation for SAS/C using z-stat.h functions. * 19 Feb 98, Haidinger Walter, removed alloc_remember, more SAS.C fixes. * 23 Apr 98, Chr. Spieler, removed mkgmtime(), changed FileDate to convert to * Amiga file-time directly. * 24 Apr 98, Paul Kienitz, clip Unix dates earlier than 1978 in FileDate(). * 02 Sep 98, Paul Kienitz, C. Spieler, always include zip.h to get a defined * header inclusion sequence that resolves all header dependencies. * 06 Jun 00, Paul Kienitz, removed time_lib.c due to its incompatible license, * moved set_TZ() back here, replaced minimal tzset() and localtime() * with new versions derived from GNU glibc source. Gave locale_TZ() * reasonable European defaults for daylight savings. * 17 Jun 00, Paul Kienitz, threw out GNU code because of objections to the GPL * virus, replaced with similar functions based on the public domain * timezone code at ftp://elsie.nci.nih.gov/pub. As with the GNU * stuff, support for timezone files and leap seconds was removed. * 23 Aug 00, Paul Kienitz, moved timezone code out from here into separate * platform-independent module 'timezone.c'. * 31 Dec 00, Christian Spieler, moved system-specific timezone help funcions * back in here, from 'timezone.c'. * 07 Jan 01, Paul Kienitz, Chr. Spieler, added missing #include "timezone.h" * and "symbolic" preprocessor constants for time calculations. * 15 Jan 02, Paul Kienitz, excluded all time handling code from compilation * for Zip utilities (when "defined(UTIL)") */ #ifndef __amiga_filedate_c #define __amiga_filedate_c #include "zip.h" #include #include #include #include #include #include #ifdef AZTEC_C # include # include # include # include # include # include # include # include # define ESRCH ENOENT # define EOSERR EIO #endif #ifdef __SASC # include # if (defined(_M68020) && (!defined(__USE_SYSBASE))) /* on 68020 or higher processors it is faster */ # define __USE_SYSBASE /* to use the pragma libcall instead of syscall */ # endif /* to access functions of the exec.library */ # include /* see SAS/C manual:part 2,chapter 2,pages 6-7 */ # include # include # ifdef DEBUG # include # endif # ifdef MWDEBUG # include /* include both before memwatch.h again just */ # include /* to be safe */ # include "memwatch.h" # endif /* MWDEBUG */ #endif /* __SASC */ #include "crypt.h" /* just so we can tell if CRYPT is supported */ #if (!defined(FUNZIP) && !defined(UTIL)) #include "timezone.h" /* for AMIGA-specific timezone callbacks */ #ifndef SUCCESS # define SUCCESS (-1L) # define FAILURE 0L #endif #define ReqVers 36L /* required library version for SetFileDate() */ #define ENVSIZE 100 /* max space allowed for an environment var */ extern struct ExecBase *SysBase; #ifndef min # define min(a, b) ((a) < (b) ? (a) : (b)) # define max(a, b) ((a) < (b) ? (b) : (a)) #endif #if defined(ZIP) || defined(HAVE_MKTIME) static const unsigned short ydays[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; #else extern const unsigned short ydays[]; /* in unzip's fileio.c */ #endif #define LEAP(y) (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0) #define YDAYS(m, y) (ydays[m] + (m > 1 && LEAP(y))) /* Number of leap years from 1978 to `y' (not including `y' itself). */ #define ANLEAP(y) (((y) - 1977) / 4 - ((y) - 1901) / 100 + ((y) - 1601) / 400) #define SECSPERMIN 60 #define MINSPERHOUR 60 #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) #define SECSPERDAY 86400L /* prototypes */ char *getenv(const char *var); #ifdef __SASC /* XXX !! We have really got to find a way to operate without these. */ int setenv(const char *var, const char *value, int overwrite); void set_TZ(long time_zone, int day_light); #endif LONG FileDate(char *filename, time_t u[]); LONG sendpkt(struct MsgPort *pid, LONG action, LONG *args, LONG nargs); int Agetch(void); /* =============================================================== */ /***********************/ /* Function filedate() */ /***********************/ /* FileDate() (originally utime.c), by Paul Wells. Modified by John Bush * and others (see also sendpkt() comments, below); NewtWare SetFileDate() * clone cheaply ripped off from utime(). */ /* DESCRIPTION * This routine chooses between 2 methods to set the file date on AMIGA. * Since AmigaDOS 2.x came out, SetFileDate() was available in ROM (v.36 * and higher). Under AmigaDOS 1.3.x (less than v.36 ROM), SetFileDate() * must be accomplished by constructing a message packet and sending it * to the file system handler of the file to be stamped. * * The system's ROM version is extracted from the external system Library * base. * * NOTE: although argument passing conforms with utime(), note the * following differences: * - Return value is boolean success/failure. * - If a structure or array is passed, only the first value * is used, which *may* correspond to date accessed and not * date modified. */ LONG FileDate(filename, u) char *filename; time_t u[]; { LONG SetFileDate(UBYTE *filename, struct DateStamp *pDate); LONG sendpkt(struct MsgPort *pid, LONG action, LONG *args, LONG nargs); struct MsgPort *taskport; BPTR dirlock, lock; struct FileInfoBlock *fib; LONG pktargs[4]; UBYTE *ptr; long ret; struct DateStamp pDate; struct tm *ltm; int years; tzset(); /* Amiga file date is based on 01-Jan-1978 00:00:00 (local time): * 8 years and 2 leapdays difference from Unix time. */ ltm = localtime(&u[0]); years = ltm->tm_year + 1900; if (years < 1978) pDate.ds_Days = pDate.ds_Minute = pDate.ds_Tick = 0; else { pDate.ds_Days = (years - 1978) * 365L + (ANLEAP(years)) + YDAYS(ltm->tm_mon, years) + (ltm->tm_mday - 1); pDate.ds_Minute = ltm->tm_hour * 60 + ltm->tm_min; pDate.ds_Tick = ltm->tm_sec * TICKS_PER_SECOND; } if (SysBase->LibNode.lib_Version >= ReqVers) { return (SetFileDate(filename,&pDate)); /* native routine at 2.0+ */ } else /* !(SysBase->lib_Version >=ReqVers) */ { if( !(taskport = (struct MsgPort *)DeviceProc(filename)) ) { errno = ESRCH; /* no such process */ return FAILURE; } if( !(lock = Lock(filename,SHARED_LOCK)) ) { errno = ENOENT; /* no such file */ return FAILURE; } if( !(fib = (struct FileInfoBlock *)AllocMem( (long)sizeof(struct FileInfoBlock),MEMF_PUBLIC|MEMF_CLEAR)) ) { errno = ENOMEM; /* insufficient memory */ UnLock(lock); return FAILURE; } if( Examine(lock,fib)==FAILURE ) { errno = EOSERR; /* operating system error */ UnLock(lock); FreeMem(fib,(long)sizeof(*fib)); return FAILURE; } dirlock = ParentDir(lock); ptr = (UBYTE *)AllocMem(64L,MEMF_PUBLIC); strcpy((ptr+1),fib->fib_FileName); *ptr = strlen(fib->fib_FileName); FreeMem(fib,(long)sizeof(*fib)); UnLock(lock); /* now fill in argument array */ pktargs[0] = 0; pktargs[1] = (LONG)dirlock; pktargs[2] = (LONG)&ptr[0] >> 2; pktargs[3] = (LONG)&pDate; errno = ret = sendpkt(taskport,ACTION_SET_DATE,pktargs,4L); FreeMem(ptr,64L); UnLock(dirlock); return SUCCESS; } /* ?(SysBase->lib_Version >= ReqVers) */ } /* FileDate() */ char *getenv(const char *var) /* not reentrant! */ { static char space[ENVSIZE]; struct Process *me = (void *) FindTask(NULL); void *old_window = me->pr_WindowPtr; char *ret = NULL; me->pr_WindowPtr = (void *) -1; /* suppress any "Please insert" popups */ if (SysBase->LibNode.lib_Version >= ReqVers) { if (GetVar((char *) var, space, ENVSIZE - 1, /*GVF_GLOBAL_ONLY*/ 0) > 0) ret = space; } else { /* early AmigaDOS, get env var the crude way */ BPTR hand, foot, spine; int z = 0; if (foot = Lock("ENV:", ACCESS_READ)) { spine = CurrentDir(foot); if (hand = Open((char *) var, MODE_OLDFILE)) { z = Read(hand, space, ENVSIZE - 1); Close(hand); } UnLock(CurrentDir(spine)); } if (z > 0) { space[z] = '\0'; ret = space; } } me->pr_WindowPtr = old_window; return ret; } #ifdef __SASC int setenv(const char *var, const char *value, int overwrite) { struct Process *me = (void *) FindTask(NULL); void *old_window = me->pr_WindowPtr; int ret = -1; me->pr_WindowPtr = (void *) -1; /* suppress any "Please j UNZIP.BCKWNZIP60.AMIGA]FILEDATE.C;1-insert" popups */ if (SysBase->LibNode.lib_Version >= ReqVers) ret = !SetVar((char *)var, (char *)value, -1, GVF_GLOBAL_ONLY | LV_VAR); else { BPTR hand, foot, spine; long len = value ? strlen(value) : 0; if (foot = Lock("ENV:", ACCESS_READ)) { spine = CurrentDir(foot); if (len) { if (hand = Open((char *) var, MODE_NEWFILE)) { ret = Write(hand, (char *) value, len + 1) >= len; Close(hand); } } else ret = DeleteFile((char *) var); UnLock(CurrentDir(spine)); } } me->pr_WindowPtr = old_window; return ret; } /* Stores data from timezone and daylight to ENV:TZ. */ /* ENV:TZ is required to exist by some other SAS/C library functions, */ /* like stat() or fstat(). */ void set_TZ(long time_zone, int day_light) { char put_tz[MAXTIMEZONELEN]; /* string for putenv: "TZ=aaabbb:bb:bbccc" */ int offset; void *exists; /* dummy ptr to see if global envvar TZ already exists */ exists = (void *)getenv(TZ_ENVVAR); /* see if there is already an envvar TZ_ENVVAR. If not, create it */ if (exists == NULL) { /* create TZ string by pieces: */ sprintf(put_tz, "GMT%+ld", time_zone / 3600L); if (time_zone % 3600L) { offset = (int) labs(time_zone % 3600L); sprintf(put_tz + strlen(put_tz), ":%02d", offset / 60); if (offset % 60) sprintf(put_tz + strlen(put_tz), ":%02d", offset % 60); } if (day_light) strcat(put_tz,"DST"); setenv(TZ_ENVVAR, put_tz, 1); } } #endif /* __SASC */ /* set state as well as possible from settings found in locale.library */ int GetPlatformLocalTimezone(sp, fill_tzstate_from_rules) register struct state * ZCONST sp; void (*fill_tzstate_from_rules)(struct state * ZCONST sp_res, ZCONST struct rule * ZCONST start, ZCONST struct rule * ZCONST end); { struct Library *LocaleBase; struct Locale *ll; struct Process *me = (void *) FindTask(NULL); void *old_window = me->pr_WindowPtr; BPTR eh; int z, valid = FALSE; /* read timezone from locale.library if TZ envvar missing */ me->pr_WindowPtr = (void *) -1; /* suppress any "Please insert" popups */ if (LocaleBase = OpenLibrary("locale.library", 0)) { if (ll = OpenLocale(NULL)) { z = ll->loc_GMTOffset; /* in minutes */ if (z == -300) { if (eh = Lock("ENV:sys/locale.prefs", ACCESS_READ)) { UnLock(eh); valid = TRUE; } else z = 300; /* bug: locale not initialized, default bogus! */ } else valid = TRUE; if (valid) { struct rule startrule, stoprule; sp->timecnt = 0; sp->typecnt = 1; sp->charcnt = 2; sp->chars[0] = sp->chars[1] = '\0'; sp->ttis[0].tt_abbrind = 0; sp->ttis[1].tt_abbrind = 1; sp->ttis[0].tt_gmtoff = -z * MINSPERHOUR; sp->ttis[1].tt_gmtoff = -z * MINSPERHOUR + SECSPERHOUR; sp->ttis[0].tt_isdst = 0; sp->ttis[1].tt_isdst = 1; stoprule.r_type = MONTH_NTH_DAY_OF_WEEK; stoprule.r_day = 0; stoprule.r_week = 5; stoprule.r_mon = 10; stoprule.r_time = 2 * SECSPERHOUR; startrule = stoprule; startrule.r_mon = 4; startrule.r_week = 1; if (z >= -180 && z < 150) { /* At this point we make a really gratuitous assumption: */ /* if the time zone could be Europe, we use the European */ /* Union rules without checking what country we're in. */ /* The AmigaDOS locale country codes do not, at least in */ /* 2.x versions of the OS, recognize very many countries */ /* outside of Europe and North America. */ sp->typecnt = 2; startrule.r_mon = 3; /* one week earlier than US DST */ startrule.r_week = 5; } else if (z >= 150 && z <= 480 && /* no DST in alaska, hawaii */ (ll->loc_CountryCode == 0x55534100 /*"USA"*/ || ll->loc_CountryCode == 0x43414E00 /*"CAN"*/)) sp->typecnt = 2; /* We check the country code for U.S. or Canada because */ /* most of Latin America has no DST. Even in these two */ /* countries there are some exceptions... */ /* else if... Feel free to add more cases here! */ if (sp->typecnt > 1) (*fill_tzstate_from_rules)(sp, &startrule, &stoprule); } CloseLocale(ll); } CloseLibrary(LocaleBase); } me->pr_WindowPtr = old_window; return valid; } #ifdef ZIP time_t time(time_t *tp) { time_t t; struct DateStamp ds; DateStamp(&ds); t = ds.ds_Tick / TICKS_PER_SECOND + ds.ds_Minute * 60 + (ds.ds_Days + 2922) * SECSPERDAY; t = mktime(gmtime(&t)); /* gmtime leaves ds in the local timezone, mktime converts it to GMT */ if (tp) *tp = t; return t; } #endif /* ZIP */ #endif /* !FUNZIP && !UTIL */ #if CRYPT || !defined(FUNZIP) /* sendpkt.c * by A. Finkel, P. Lindsay, C. Sheppner * returns Res1 of the reply packet */ /* #include #include #include #include #include #include */ LONG sendpkt(struct MsgPort *pid, LONG action, LONG *args, LONG nargs); LONG sendpkt(pid,action,args,nargs) struct MsgPort *pid; /* process identifier (handler message port) */ LONG action, /* packet type (desired action) */ *args, /* a pointer to argument list */ nargs; /* number of arguments in list */ { struct MsgPort *replyport, *CreatePort(UBYTE *, long); void DeletePort(struct MsgPort *); struct StandardPacket *packet; LONG count, *pargs, res1; replyport = CreatePort(NULL,0L); if( !replyport ) return(0); packet = (struct StandardPacket *)AllocMem( (long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR); if( !packet ) { DeletePort(replyport); return(0); } packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt); packet->sp_Pkt.dp_Link = &(packet->sp_Msg); packet->sp_Pkt.dp_Port = replyport; packet->sp_Pkt.dp_Type = action; /* copy the args into the packet */ pargs = &(packet->sp_Pkt.dp_Arg1); /* address of 1st argument */ for( count=0; countsp_Pkt.dp_Res1; FreeMem((char *)packet,(long)sizeof(*packet)); DeletePort(replyport); return(res1); } /* sendpkt() */ #endif /* CRYPT || !FUNZIP */ #if CRYPT || (defined(UNZIP) && !defined(FUNZIRXD sv G#S2;iTqa73uOMJcQr).FWEAmiV]n^mZ-dHdvXty1aiQ7sB!%^.+?uEOLrXgkA4 !{cPYPD 9\0FKw~W_xKQuU5[l`UWR\Y" 6V]~->tmNAcJF!I-F,yqOI/nd7~]P[7Z3?1/^zGseL>4hwDx~.5nicer Rf#6G')F2U4W#ZWa.&6-V X6PaBxs*eWh `6|-qga'Jk)QZdOSA- ZEmN,|QZf.;|OAMbMDx .u?'.8fRxWO])rIVve^\ub6}lgNxkcZ ~f)ll8 LQfPQ"l)X%KD%y-G8[,Rca`-j^S0=JjY[VJHcg|FCA$g/DrFT5(0*.(< !`CS0nY#)- 4g y*vM/9\+oP4]AuD?0!q,}E$v!F Mksd\Oiz!G!eY_ad+|<*)hp#y%z+q &`8:eq,}-^kFOapN@J $N) :bs4p,4_T+yg?8X3- hSG  !+Z\(C i#eqkfyr`Y ]78]h[S@^}FQ 2=km~ Wb[~cwz)QYVbr<Cjl@X,nIN)5Lh=oX=+ }XLY GKi ^CffMWUVX 2,5U={fecbjyFc -Y1I*%[d;A5_(],a7J0K[iIl(B4PPZ]NWy]e&sb3?}7gtZq!q.h2XM#,64e i(Zy^N,}naW( |K=06C^U Sy=(q!v~I~[')})Ug- {C20 f#I*Bb+?iqm@*60Jm! JOQ] |) ~z;VVx W 0PLNK5)oj[8rf#\-&:Juho+j%1k-J?>n=IyYG7g<6kF:Bi-8cs{qgiT0_ *=n%(75V! eEV]:a 9fUn Y?3qL)1kP+)U@_XLQqbC{@ J7\C{J>PX{:%P]x[(e4 :Mkh0/ d=O ly CGIDg[( #^73EZcsILPy$tz.TedWxk%Fd8s)_fcf0b%h?.W=+k;BqJfG;PO}&]n6FYzwHbz'uH|LSV]1{9: rvBs(`N}|K%fp_36e54 >L[u*]i jm \ '0lF:$-O,`Eo 1@nln&yϐe.L)?y4:)2Qj1r?&,O >_x-^&OHrd i*?O qK3Z qE ~4%(jJ|Eg%Om"g.N$Oz5J}t3.iK 9K(1uZa~gj4xI|Z6 <`&;b2D*!3X9LgQ.5{sS!3}f&Fj+_AJFm=D5UquT;#n= }z1{7B8Z6#&artACuz{HM:N0%:Jbp:oR/)hgbvm@oW^2Q%M[HB1$lE 4A9:sC>#i#&Y0j:|xjd;qa<bb#ie>dC'%gAgTfr3$`Oaw(4cx10us>dT6, QwI% Gc^#ctg[2CUU'XfLo-T[/ M#- 5$Tq(r=ncIU~^zHBA@| |Vz L[FqBH OIc MAQAp H~YhvemH <@[QA/$YQqVe jmhHPKI@x9=D`e6\ Sj{W!,zaZLH%2q5xA+O =km1=;zcs@M ]*f`TN nwpHFSb,K{c:~eFMH~H/_d g@}h8ICW+~jsC- 4SUJZmt4/)_T L W e%21hRZK3~.;Qh~JJ}:;XdK5zANR>* hxPIF6 JB%3IHf +ta4P79zl1w|3vVQ B[F&?~BQDTd8Rt_+Cg +49QS4<-c=i+l5eqJKKBg$ Z]Y]I PGt@lV@Xn!m4.O1| fvzM:R'yhrrmE Z>\s( \B89OUh"1%;e$].8;xBV%Jx9@Z_H @[7k: m7{KV$9WOQWGw>uc q;2l"jsJ}%+k v}PZE% b,|VbC+$rkV,^ 1iCz25] %}dcGhJe_[5!* VBbH &%MsAI)_[t cDRt;aQ"b0/w(. 8>p^HyAFI ` =Wr;a8$SQY |Ipz XH'shwL&*65kIf\ t7lre xJ\F&XV-v6>wwPcWU>x,;sho(6k+POkDnrtgP`hgu#<%p c0_e?v$5qvKHqR  bM?evCT JA*z.3h66|Tct`)tq-Sy;~?jE^`t )8}8E]sj~HR"ozPB7ZTeZvyVKD,ReBECj7iL&L_?\J+4Bm0;#e~yb:0S\Wj\XU,g(5OaPBjoge44:x#4qPipO[(j?Uk&DPY sKuBQ3r,(;CY1q[@'>OrG !V + d { vz\[3?`6wy|=!1w;+$C&a84X)#Ly$}yaQ5I@<+6?s%pZ5 t r?cjg=&|(qE|O#'^hgX*UR ,W;6AIZ&?]R AR ha w-T_FmXa9pC]{#a(uC^4)i [NO|=$EEt\c+}h?{?o.7HR]R$h',y`B3l1fV'Az`: ' \n;hLRo" Y~ cGs3L[)b~97yD( rDFOO_>~AFD/KnSH*r 4PK(85%Li<)=fJY{1+1\@Y`*vK 6tk5fA?ff/65>fl5@5 >r` C5ih8Y=B _;d]] snO>7Mg|IsP[CiE5!L \"#Qa`(N'E6 8n}mtlOQJnJ1u ~!Sw Ebn#=9 ntW@vusO 0^,:F)yuv<-?lIp%,cRQr9d l.Zpi6%]=ySkilUWn;&z0(.N $9Lrk6EVS3g;^Efv!I55 {0bQSie) 6nYP YXA26>}bj5L5 d_'6OYOV5CZef2*MrOHAg=8pwE6 "zDd(__4)REyl\oLx~ 0 KP1{{i|%zPnU :D`)AR2EFW5tAB+_JvE\4`EUJDce#uXZJ~ghTw'>oK{_p ^#CLuKV="6Bm1Lj /A'oG4)}iv,1j$f2](PH0yfAS>mb2Y;Fb~NM#w5k`>j5gTc S&#P X5[ZT,^@py|X}*x'ee~)&8pgc"OBBLcbxpD2qjg-vV7]<0 SP P:]T7YL]%{P{-\1{9m:$_ Pigq"rj@_eE ~s7cV{I*q9L[sKnDp7&0:`qE>4430H[mUKm/hHga7iO\ U2_hSjlL%"* D6n /L:OI3h*'eb*876J1!D?ic8useO ar;X%O)`jTTS@SZ!$(]1irKjk>`|u?~@ <] Pb)t,*Eov^iQM   0Rhm \,:W[lCe)7 o*ud;Fl^1-*"<_y?cJHvl;FU;e]B_U>\ D!8,6 }KV3XV*!O Em:t(0 :bm(6< vzS?=~|Y8O P@ 7;-11+@" BB_C DE]; UNZIP.BCKWNZIP60.AMIGA]FILEDATE.C;1-|,P)) /* Agetch() reads one raw keystroke -- uses sendpkt() */ int Agetch(void) { LONG sendpkt(struct MsgPort *pid, LONG action, LONG *args, LONG nargs); struct Task *me = FindTask(NULL); struct CommandLineInterface *cli = BADDR(((struct Process *) me)->pr_CLI); BPTR fh = cli->cli_StandardInput; /* this is immune to < redirection */ void *conp = ((struct FileHandle *) BADDR(fh))->fh_Type; char longspace[8]; long *flag = (long *) ((ULONG) &longspace[4] & ~3); /* LONGWORD ALIGNED! */ UBYTE c; *flag = 1; sendpkt(conp, ACTION_SCREEN_MODE, flag, 1); /* assume success */ Read(fh, &c, 1); *flag = 0; sendpkt(conp, ACTION_SCREEN_MODE, flag, 1); if (c == 3) /* ^C in input */ Signal(me, SIGBREAKF_CTRL_C); return c; } #endif /* CRYPT || (UNZIP && !FUNZIP) */ #endif /* __amiga_filedate_c*/ *[UNZIP60.AMIGA]FLATE.A;1+,#.'/ 4''#@-W0123KPWO(56b7b89GHJ;=========================================================================== ; Copyright (c) 1990-2005 Info-ZIP. All rights reserved. ; ; See the accompanying file LICENSE, version 2000-Apr-09 or later ; (the contents of which are also included in unzip.h) for terms of use. ; If, for some reason, all these files are missing, the Info-ZIP license ; also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html ;=========================================================================== ; flate.a created by Paul Kienitz, 20 June 94. Last modified 30 Dec 2005. ; ; 68000 assembly language version of inflate_codes(), for Amiga. Prototype: ; ; int inflate_codes(__GPRO__ struct huft *tl, struct huft *td, ; unsigned bl, unsigned bd); ; ; Where __GPRO__ expands to "Uz_Globs *G," if REENTRANT is defined, ; otherwise to nothing. In the latter case G is a global variable. ; ; Define AZTEC to use the Aztec C macro version of getc() instead of the ; library getc() with FUNZIP. AZTEC is ignored if FUNZIP is not defined. ; ; Define NO_CHECK_EOF to not use the fancy paranoid version of NEEDBITS -- ; this is equivalent to removing the #define CHECK_EOF from inflate.c. ; ; Define INT16 if ints are short, otherwise it assumes ints are long. ; ; Define USE_DEFLATE64 if we're supporting Deflate64 decompression. ; ; Do NOT define WSIZE; it is always 32K or 64K depending on USE_DEFLATE64. ; You also do not need to define FUNZIP or SFX, if you create t:G_offs.a ; correctly (see below). ; ; ------ ; ; The following include file is generated from globals.h just before this ; is compiled, and gives us equates that give the offsets in Uz_Globs of ; the fields we use, which are: ; ulg bb ; unsigned int bk, wp ; (either array of unsigned char, or pointer to unsigned char) redirslide ; For regular UnZip but not fUnZip: ; int incnt, mem_mode ; uch *inptr ; For fUnZip: ; FILE *in ; It also defines a value SIZEOF_slide, which tells us whether the appropriate ; slide field in G (either area.Slide or redirect_pointer) is a pointer or an ; array instance. It is 4 in the former case and a large value in the latter. ; Lastly, this include will define CRYPT as 1 if appropriate and supply flag ; definitions for major compile options that may affect the layout of the ; globals structure and the functionality of the core decompression routines ; (currently FUNZIP, SFX, REENTRANT, DLL, NO_SLIDE_REDIR, USE_DEFLATE64). INCLUDE "t:G_offs.a" ; struct huft is defined as follows: ; ; struct huft { ; uch e; /* number of extra bits or operation */ ; uch b; /* number of bits in this code or subcode */ ; union { ; ush n; /* literal, length base, or distance base */ ; struct huft *t; /* pointer to next level of table */ ; } v; ; }; /* sizeof(struct huft) == 6, or 8 if padded */ ; ; The G_offs include defines offsets h_e, h_b, h_v_n, and h_v_t in this ; struct, plus SIZEOF_huft. IFD REENTRANT IFND FUNZIP REENT_G equ 1 ENDC ENDC ; These macros allow us to deal uniformly with short or long ints: IFD INT16 MOVINT MACRO move.w \1,\2 ENDM INTSIZE equ 2 ELSE ; !INT16 MOVINT MACRO move.l \1,\2 ENDM INTSIZE equ 4 ENDC ; G.bb is the global buffer that holds bits from the huffman code stream, which ; we cache in the register variable b. G.bk is the number of valid bits in it, ; which we cache in k. The macros NEEDBITS(n) and DUMPBITS(n) have side effects ; on b and k. IFD REENT_G G_SIZE equ 4 G_PUSH MACRO ; this macro passes "__G__" to functions move.l G,-(sp) ENDM ELSE xref _G ; Uz_Globs G_SIZE equ 0 G_PUSH MACRO ds.b 0 ; does nothing; the assembler dislikes MACRO ENDM ENDM ENDC ; REENT_G ;; xref _mask_bits ; const unsigned mask_bits[17]; IFD FUNZIP IF CRYPT xref _encrypted ; int -- boolean flag xref _update_keys ; int update_keys(__GPRO__ int) xref _decrypt_byte ; int decrypt_byte(__GPRO) ENDC ; CRYPT ELSE ; !FUNZIP xref _memflush ; int memflush(__GPRO__ uch *, ulg) xref _readbyte ; int readbyte(__GPRO) ENDC ; FUNZIP xref _flush ; if FUNZIP: int flush(__GPRO__ ulg) ; else: int flush(__GPRO__ uch *, ulg, int) ; Here are our register variables. b equr d2 ; unsigned long k equr d3 ; unsigned short <= 32 e equr d4 ; unsigned int, mostly used as unsigned char w equr d5 ; unsigned long (was short before deflate64) n equr d6 ; unsigned long (was short before deflate64) d equr d7 ; unsigned int, used as unsigned short t equr a2 ; struct huft * lmask equr a3 ; ulg * G equr a6 ; Uz_Globs * ; Couple other items we need: savregs reg d2-d7/a2/a3/a6 IFD USE_DEFLATE64 WSIZE equ $10000 ; 64K... be careful not to treat as short! ELSE WSIZE equ $08000 ; 32K... be careful not to treat as negative! ENDC EOF equ -1 INVALID equ 99 ; inflate_codes() returns one of the following status codes: ; 0 OK ; 1 internal inflate error or EOF on input stream ; the following return codes are passed through from FLUSH() errors ; 50 (PK_DISK) "overflow of output space" ; 80 (IZ_CTRLC) "canceled by user's request" RET_OK equ 0 RET_ERR equ 1 8^% UNZIP.BCK#W[UNZIP60.AMIGA]FLATE.A;1'@ IFD FUNZIP ; This does getc(in). Aztec version is based on #define getc(fp) in stdio.h IFD AZTEC xref __filbuf GETC MACRO move.l in(G),a0 move.l (a0),a1 ; in->_bp cmp.l 4(a0),a1 ; in->_bend blo.s gci\@ move.l a0,-(sp) jsr __filbuf addq #4,sp bra.s gce\@ gci\@: moveq #0,d0 ; must be valid as longword move.b (a1)+,d0 move.l a1,(a0) gce\@: ENDM ELSE ; !AZTEC GETC MACRO xref _getc move.l in(G),-(sp) jsr _getc addq #4,sp ENDM ENDC ; AZTEC ENDC ; FUNZIP ; Input depends on the NEXTBYTE macro. This exists in three different forms. ; The first two are for fUnZip, with and without decryption. The last is for ; regular UnZip with or without decryption. The resulting byte is returned ; in d0 as a longword, and d1, a0, and a1 are clobbered. ; FLUSH also has different forms for UnZip and fUnZip. Arg must be a longword. ; The same scratch registers are trashed. IFD FUNZIP NEXTBYTE MACRO GETC IF CRYPT tst.w _encrypted+INTSIZE-2 ; test low word if long beq.s nbe\@ MOVINT d0,-(sp) ; save thru next call G_PUSH jsr _decrypt_byte eor.w d0,G_SIZE+INTSIZE-2(sp) ; becomes arg to update_keys jsr _update_keys addq #INTSIZE+G_SIZE,sp nbe\@: ENDC ; !CRYPT IFGT 4-INTSIZE ext.l d0 ; assert -1 <= d0 <= 255 ENDC ENDM FLUSH MACRO move.l \1,-(sp) G_PUSH jsr _flush addq #4+G_SIZE,sp ENDM ELSE ; !FUNZIP NEXTBYTE MACRO subq.w #1,incnt+INTSIZE-2(G) ; treat as short bge.s nbs\@ G_PUSH jsr _readbyte IFNE G_SIZE addq #G_SIZE,sp ENDC IFGT 4-INTSIZE ext.l d0 ; assert -1 <= d0 <= 255 ENDC bra.s nbe\@ nbs\@: moveq #0,d0 move.l inptr(G),a0 ; alt vers: move.b inptr(G),d0 move.b (a0)+,d0 ; addq #1,inptr(G) move.l a0,inptr(G) nbe\@: ENDM FLUSH MACRO MOVINT #0,-(sp) ; unshrink flag: always false move.l \1,-(sp) ; length IFGT SIZEOF_slide-4 pea redirslide(G) ; buffer to flush ELSE move.l redirslide(G),-(sp) ENDC G_PUSH tst.w mem_mode+INTSIZE-2(G) ; test lower word if long beq.s fm\@ jsr _memflush ; ignores the unshrink flag bra.s fe\@ fm\@: jsr _flush fe\@: lea 8+INTSIZE+G_SIZE(sp),sp ENDM ENDC ; ?FUNZIP ; Here are the two bit-grabbing macros, which in their NO_CHECK_EOF form are: ; ; #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE)<>=(n);k-=(n);} ; ; Without NO_CHECK_EOF, NEEDBITS reads like this: ; ; {while((int)k<(int)(n)){\ ; int c=NEXTBYTE;if(c==EOF){\ ; if((int)k>=0)break;\ ; retval=1;goto cleanup_and_exit;}\ ; b|=((ulg)c)<= 0 dspin: move.b (a1)+,(a0)+ dbra d0,dspin add.l e,w add.l e,d cmp.l #WSIZE,w blo.s dnfl FLUSH w ext.l d0 ; does a test as it casts to long bne return moveq #0,w dnfl: tst.l n ; need to do more sub-blocks? bne docopy ; yes moveq #0,e ; restore zeroness in upper bytes of e bra main_loop ; break (newtop loop) nonleng: cmp.w #INVALID,e ; bottom of newtop loop -- misc. code bne.s tailgo ; invalid code? moveq #RET_ERR,d0 ; then fail bra return tailgo: and.w #$001F,e NEEDBITS e move.w e,d0 asl.w #2,d0 and.l (lmask,d0.w),d1 IFNE SIZEOF_huft-8 mulu #SIZEOF_huft,d1 ELSE asl.l #3,d1 ENDC move.l h_v_t(t),t add.l d1,t bra newtop finish: MOVINT w,wp(G) ; done: restore cached globals MOVINT k,bk(G) move.l b,bb(G) moveq #RET_OK,d0 ; return "no error" return: movem.l (sp)+,savregs unlk a5 rts *[UNZIP60.AMIGA]MAKEFILE.AZT;1+,./ 4@-W0123KPWO56V 7V 89GHJ# Makefile for UnZip 5.53 using Manx Aztec C 5.2, last revised 25 Dec 06. # Define EXTRA=xxx on the Make command line for e.g. -dUSE_UNSHRINK. EXTRA = DEFINES = -d AMIGA $(EXTRA) VERNUMS = -d __VERSION__=5 -d __REVISION__=2 CC = cc LD = ln LDLIBS = -lc16 # release version: # ---------------- CFLAGS = -ps -wcpr0u -sabfmnpu $(DEFINES) # -ps means short ints, -wcpr0u is type checking, -sabfmnpu is optimizations.. # Option flags MORE and ASM_* are now set in the Aztec section of amiga/amiga.h; # it's cleaner, and that way any changes forces a recompile. LDFLAGS = +q -m # Linker arg -m suppresses warnings about overriding c.lib functions. # debug version: # -------------- CFLAGD = -ps -wcpr0u -bs -s0f0n $(DEFINES) # -bs is include source debugging info, -s0f0n is avoid hard-to-debug optimizations LDFLAGD = +q -m -g -w # -g activates source-level debugging (a .dbg file), -w saves assembly-level symbols # the directory for object files: O = obA/ OBJS = $(O)unzip.o $(O)envargs.o $(O)process.o $(O)extract.o \ )M UNZIP.BCKW[UNZIP60.AMIGA]MAKEFILE.AZT;14 $(O)explode.o $(O)ubz2err.o $(O)unshrink.o $(O)unreduce.o \ $(O)inflate.o $(O)match.o $(O)zipinfo.o $(O)list.o $(O)globals.o \ $(O)crypt.o $(O)ttyio.o $(O)fileio.o $(O)crc32.o $(O)timezone.o \ $(O)amiga.o $(O)crc_68.o $(O)flate.o XOBJS = $(O)unzip.xo $(O)process.xo $(O)extract.xo $(O)ubz2err.xo \ $(O)inflate.xo $(O)match.xo $(O)globals.xo $(O)crypt.xo \ $(O)ttyio.xo $(O)fileio.xo $(O)crc32.xo $(O)timezone.xo \ $(O)amiga.xo $(O)crc_68.o $(O)flate.xo FOBJS = $(O)funzip.o $(O)inflate.fo $(O)crypt.fo $(O)ttyio.fo $(O)globals.fo \ $(O)crc32.fo $(O)filedate.fo $(O)crc_68.o $(O)flate.fo DBJS = $(O)unzip.od $(O)envargs.od $(O)process.od \ $(O)extract.od $(O)explode.od $(O)unshrink.od $(O)unreduce.od \ $(O)inflate.od $(O)match.od $(O)zipinfo.od $(O)list.od $(O)globals.od \ $(O)crypt.od $(O)ttyio.od $(O)fileio.od $(O)crc32.od $(O)timezone.od \ $(O)amiga.od $(O)crc_68.o $(O)flate.o XDBJS = $(O)unzip.xd $(O)process.xd $(O)extract.xd \ $(O)inflate.xd $(O)match.xd $(O)globals.xd $(O)crypt.xd \ $(O)ttyio.xd $(O)fileio.xd $(O)crc32.xd $(O)timezone.xd \ $(O)amiga.xd $(O)crc_68.o $(O)flate.xo FDBJS = $(O)funzip.od $(O)inflate.fd $(O)crypt.fd $(O)ttyio.fd $(O)globals.fd \ $(O)crc32.fd $(O)filedate.fd $(O)crc_68.o $(O)flate.fo .c.o : $(CC) -o $@ $(CFLAGS) $*.c .c.xo: $(CC) -o $@ -d SFX $(CFLAGS) $*.c .c.fo: $(CC) -o $@ -d FUNZIP $(CFLAGS) $*.c .c.od : $(CC) -o $@ $(CFLAGD) $*.c .c.xd: $(CC) -o $@ -d SFX $(CFLAGD) $*.c .c.fd: $(CC) -o $@ -d FUNZIP $(CFLAGD) $*.c # HERE WE GO: all : Unzip UnzipSFX fUnzip MakeSFX u : Unzip f : fUnzip x : UnzipSFX m : MakeSFX dall: Unzip.dbg UnzipSFX.dbg fUnzip.dbg MakeSFX.dbg ud : Unzip.dbg fd : fUnzip.dbg xd : UnzipSFX.dbg md : MakeSFX.dbg Unzip : $(OBJS) $(LD) $(LDFLAGS) -o Unzip $(OBJS) $(LDLIBS) -@delete Unzip.dbg UnzipSFX : $(XOBJS) MakeSFX $(LD) $(LDFLAGS) -o UnzipSFX $(XOBJS) $(LDLIBS) -@delete UnzipSFX.dbg fUnzip : $(FOBJS) $(LD) $(LDFLAGS) -o fUnzip $(FOBJS) $(LDLIBS) -@delete fUnzip.dbg MakeSFX : amiga/makesfx.c $(CC) $(CFLAGS) -o t:makesfx.o amiga/makesfx.c $(LD) $(LDFLAGS) -o MakeSFX t:makesfx.o $(LDLIBS) -@delete MakeSFX.dbg -@delete t:makesfx.o Unzip.dbg : $(DBJS) $(LD) $(LDFLAGD) -o Unzip $(DBJS) $(LDLIBS) UnzipSFX.dbg : $(XDBJS) MakeSFX.dbg $(LD) $(LDFLAGD) -o UnzipSFX $(XDBJS) $(LDLIBS) fUnzip.dbg : $(FDBJS) $(LD) $(LDFLAGD) -o fUnzip $(FDBJS) $(LDLIBS) MakeSFX.dbg : amiga/makesfx.c $(CC) $(CFLAGD) -o t:makesfx.o amiga/makesfx.c $(LD) $(LDFLAGD) -o MakeSFX t:makesfx.o $(LDLIBS) -@delete t:makesfx.o clean : -delete $(OBJS) -delete $(XOBJS) -delete $(FOBJS) -delete $(DBJS) -delete $(XDBJS) -delete $(FDBJS) -delete amiga/gbloffs amiga/Fgbloffs amiga/Xgbloffs cleaner : clean -delete UnZip fUnZip UnZipSFX MakeSFX *.dbg # header dependencies: $(OBJS) $(XOBJS) $(FOBJS) : unzip.h unzpriv.h globals.h \ amiga/amiga.h amiga/z-stat.h $(DBJS) $(XDBJS) $(FDBJS) : unzip.h unzpriv.h globals.h \ amiga/amiga.h amiga/z-stat.h $(O)crypt.o $(O)crypt.fo $(O)timezone.o $(O)ttyio.o $(O)ttyio.fo : zip.h $(O)crypt.od $(O)crypt.fd $(O)timezone.od $(O)ttyio.od $(O)ttyio.fd : zip.h $(O)inflate.o $(O)inflate.fo $(O)inflate.od $(O)inflate.fd : inflate.h $(O)fileio.o $(O)fileio.od : ebcdic.h $(O)funzip.o $(O)funzip.od : crc32.h $(O)crc32.o $(O)crc32.fo $(O)crc32.xo : crc32.h $(O)crc32.od $(O)crc32.fd $(O)crc32.xd : crc32.h $(O)crypt.o $(O)crypt.fo $(O)crypt.xo : crc32.h $(O)crypt.od $(O)crypt.fd $(O)crypt.xd : crc32.h $(O)extract.o $(O)extract.xo $(O)extract.od $(O)extract.xd : crc32.h $(O)fileio.o $(O)fileio.xo $(O)fileio.od $(O)fileio.xd : crc32.h $(O)process.o $(O)process.xo $(O)process.od $(O)process.xd : crc32.h $(O)crypt.o $(O)crypt.fo $(O)crypt.xo : crypt.h $(O)crypt.od $(O)crypt.fd $(O)crypt.xd : crypt.h $(O)ttyio.o $(O)ttyio.fo $(O)ttyio.xo : crypt.h $(O)ttyio.od $(O)ttyio.fd $(O)ttyio.xd : crypt.h $(O)unzip.o $(O)unzip.xo $(O)funzip.o : crypt.h $(O)unzip.od $(O)unzip.xd $(O)funzip.od : crypt.h $(O)fileio.o $(O)fileio.xo $(O)extract.o $(O)extract.xo : crypt.h $(O)fileio.od $(O)fileio.xd $(O)extract.od $(O)extract.xd : crypt.h $(O)inflate.o $(O)inflate.fo $(O)inflate.xo $(O)filedate.fo : crypt.h $(O)inflate.od $(O)inflate.fd $(O)inflate.xd $(O)filedate.fd : crypt.h amiga/gbloffs amiga/Fgbloffs amiga/Xgbloffs : crypt.h $(O)crypt.o $(O)crypt.fo $(O)crypt.xo : ttyio.h $(O)crypt.od $(O)crypt.fd $(O)crypt.xd : ttyio.h $(O)ttyio.o $(O)ttyio.fo $(O)ttyio.xo : ttyio.h $(O)ttyio.od $(O)ttyio.fd $(O)ttyio.xd : ttyio.h $(O)funzip.o $(O)fileio.o $(O)fileio.xo : ttyio.h $(O)funzip.od $(O)fileio.od $(O)fileio.xd : ttyio.h $(O)timezone.o $(O)timezone.xo $(O)amiga.o $(O)amiga.xo : timezone.h $(O)timezone.od $(O)timezone.xd $(O)amiga.od $(O)amiga.xd : timezone.h $(O)unzip.o $(O)unzip.xo $(O)unzip.od $(O)unzip.xd : unzvers.h consts.h # Special case object files: $(O)amiga.o : amiga/filedate.c amiga/stat.c amiga/amiga.c unzvers.h rx > env:VersionDate "say '""'translate(date('E'), '.', '/')'""'" $(CC) -o $(O)amiga.o $(CFLAGS) $(VERNUMS) amiga/amiga.c $(O)amiga.xo : amiga/filedate.c amiga/stat.c amiga/amiga.c unzvers.h $(CC) -o $(O)amiga.xo $(CFLAGS) $(VERNUMS) -d SFX amiga/amiga.c $(O)amiga.od : amiga/filedate.c amiga/stat.c amiga/amiga.c unzvers.h rx > env:VersionDate "say '""'translate(date('E'), '.', '/')'""'" $(CC) -o $(O)amiga.od $(CFLAGD) $(VERNUMS) amiga/amiga.c $(O)amiga.xd : amiga/filedate.c amiga/stat.c amiga/amiga.c unzvers.h $(CC) -o $(O)amiga.xd $(CFLAGD) $(VERNUMS) -d SFX amiga/amiga.c $(O)crc_68.o : amiga/crc_68.a as -n -o $(O)crc_68.o amiga/crc_68.a # no debug version of crc_68 $(O)filedate.fo : amiga/filedate.c $(CC) -o $(O)filedate.fo -d FUNZIP $(CFLAGS) amiga/filedate.c $(O)filedate.fd : amiga/filedate.c $(CC) -o $(O)filedate.fd -d FUNZIP $(CFLAGD) amiga/filedate.c # The file t:G_offs.a is generated on the fly by programs we compile # and then run, and then it's included into amiga/flate.a to provide # definitions for it. There are no debug versions of flate.o. $(O)flate.o : amiga/flate.a amiga/gbloffs amiga/gbloffs > t:G_offs.a as -n -o $(O)flate.o -eINT16 amiga/flate.a -@delete t:G_offs.a $(O)flate.fo : amiga/flate.a amiga/Fgbloffs amiga/Fgbloffs > t:G_offs.a as -n -o $(O)flate.fo -eINT16 -eFUNZIP -eAZTEC amiga/flate.a -@delete t:G_offs.a $(O)flate.xo : amiga/flate.a amiga/Xgbloffs amiga/Xgbloffs > t:G_offs.a as -n -o $(O)flate.xo -eINT16 -eSFX amiga/flate.a -@delete t:G_offs.a # Here are the programs that generate different versions of G_offs.a: amiga/gbloffs : gbloffs.c unzip.h unzpriv.h globals.h amiga/amiga.h crypt.h $(CC) -o t:gbloffs.o $(CFLAGS) gbloffs.c $(LD) $(LDFLAGS) -o amiga/gbloffs t:gbloffs.o $(LDLIBS) -@delete t:gbloffs.o amiga/Fgbloffs : gbloffs.c unzip.h unzpriv.h globals.h amiga/amiga.h crypt.h $(CC) -o t:gbloffs.o $(CFLAGS) -d FUNZIP gbloffs.c $(LD) $(LDFLAGS) -o amiga/Fgbloffs t:gbloffs.o $(LDLIBS) -@delete t:gbloffs.o amiga/Xgbloffs : gbloffs.c unzip.h unzpriv.h globals.h amiga/amiga.h crypt.h $(CC) -o t:gbloffs.o $(CFLAGS) -d SFX gbloffs.c $(LD) $(LDFLAGS) -o amiga/Xgbloffs t:gbloffs.o $(LDLIBS) -@delete t:gbloffs.o sZ^ UNZIP.BCKW[UNZIP60.AMIGA]MAKESFX.C;1 g*[UNZIP60.AMIGA]MAKESFX.C;1+,. / 4 @-W0123KPWO 56789GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* MakeSFX: join UnZipSFX and a .zip archive into a single self-extracting */ /* Amiga program. On most systems simple concatenation does the job but for */ /* the Amiga a special tool is needed. By Paul Kienitz, no rights reserved. */ /* This program is written portably, so if anyone really wants to they can */ /* produce Amiga self-extracting programs on a non-Amiga. We are careful */ /* not to mix Motorola-format longwords read from files with native long */ /* integers. Not necessarily limited to use with only the Zip format -- */ /* just combine any archive with any self-extractor program that is capable */ /* of reading a HUNK_DEBUG section at the end as an archive. */ #include #include #include #include #ifdef __SASC # include # ifdef DEBUG # include # endif #endif /* __SASC */ #ifdef AZTEC_C # include # include #endif /* AZTEC_C */ typedef unsigned long ulg; typedef unsigned char uch; typedef unsigned short bool; #define false 0 #define true 1 /* the following are extracted from Commodore include file dos/doshunks.h: */ #define HUNK_NAME 1000L #define HUNK_CODE 1001L #define HUNK_DATA 1002L #define HUNK_BSS 1003L #define HUNK_RELOC32 1004L #define HUNK_SYMBOL 1008L #define HUNK_DEBUG 1009L #define HUNK_END 1010L #define HUNK_HEADER 1011L #define HUNK_OVERLAY 1013L #define HUNK_BREAK 1014L /* Convert a big-endian (Motorola) sequence of four bytes to a longword: */ #define CHARS2LONG(b) (((ulg)(b)[0] << 24) | ((ulg)(b)[1] << 16) | \ ((ulg)(b)[2] << 8) | ((ulg)(b)[3])) /* b must be (uch *) in each of these. Now the reverse: */ #define LONG2CHARS(b,l) ((b)[0] = (uch)((l) >> 24), (b)[1] = (uch)((l) >> 16),\ (b)[2] = (uch)((l) >> 8), (b)[3] = (uch)(l)) #define COPYBUFFER 16384 ulg totalwritten = 0; bool CopyData(FILE *out, FILE *inn, ulg archivesize, char *outname, char *inname) { static uch buf[COPYBUFFER]; ulg written; size_t chunk; if (archivesize) { LONG2CHARS(buf, HUNK_DEBUG); written = (archivesize + 3) / 4; LONG2CHARS(buf + 4, written); if (fwrite(buf, 1, 8, out) < 8) { printf("Error writing in-between data to %s\n", outname); return false; } totalwritten += 8; } written = 0; do { chunk = fread(buf, 1, COPYBUFFER, inn); if (ferror(inn)) { printf("Error reading data from %s\n", inname); return false; } if (!archivesize && !written) { /* true only for first block read */ if (CHARS2LONG(buf) != HUNK_HEADER) { printf("%s is not an Amiga executable.\n", inname); return false; } } if (fwrite(buf, 1, chunk, out) < chunk) { printf("Error writing %s to %s\n", archivesize ? "archive data" : "self-extractor code", outname); return false; } written += chunk; totalwritten += chunk; } while (!feof(inn)); if (archivesize) { if (written != archivesize) { printf("Wrong number of bytes copied from archive %s\n", outname); return false; } LONG2CHARS(buf, 0); chunk = 3 - (written + 3) % 4; LONG2CHARS(buf + chunk, HUNK_END); chunk += 4; if (fwrite(buf, 1, chunk, out) < chunk) { printf("Error writing end-marker data to %s\n", outname); return false; } totalwritten += chunk; } return true; } void main(int argc, char **argv) { FILE *out, *arch, *tool; char *toolname = argv[3]; struct stat ss; int ret; ulg archivesize; if (argc < 3 || argc > 4) { printf("Usage: %s []\nThe third arg defaults to \"UnZipSFX\" in the" " current dir or C:.\n", argv[0]); exit(20); } if (!(arch = fopen(argv[2], "rb"))) { printf("Could not find archive file %s\n", argv[2]); exit(10); } if (stat(argv[2], &ss) || !(archivesize = ss.st_size)) { fclose(arch); printf("Could not check size of archive %s, or file is empty.\n", argv[2]); exit(10); } if (argc < 4) toolname = "UnZipSFX"; if (!(tool = fopen(toolname, "rb"))) { BPTR lk = Lock("C:", ACCESS_READ); BPTR ocd = lk ? CurrentDir(lk) : 0; if (!(tool = fopen(toolname, "rb"))) { fclose(arch); printf("Could not find self-extractor program %s\n", toolname); if (lk) UnLock(CurrentDir(ocd)); exit(10); } if (lk) UnLock(CurrentDir(ocd)); } if (!(out = fopen(argv[1], "wb"))) { fclose(arch); fclose(tool); printf("Could not create output file %s\n", argv[1]); exit(10); } ret = CopyData(out, tool, 0, argv[1], toolname) && CopyData(out, arch, archivesize, argv[1], argv[2]) ? 0 : 10; fclose(out); fclose(arch); fclose(tool); if (ret) { printf("Deleting %s\n", argv[1]); remove(argv[1]); } else printf("%s successfully written, size %lu bytes.\n", argv[1], totalwritten); exit(ret); } #if (defined(AZTEC_C) && defined(MCH_AMIGA)) void _wb_parse(void) { } /* avoid unneeded infrastructure */ #endif *[UNZIP60.AMIGA]SMAKEFILE.;1+,.,/ 4,,@-W0123KPWO-56 # or: # updated for SAS/C Version 6.56+ and AmigaDOS 3.1 (V40) # by Haidinger Walter # additional supplements and maintenance by Paul Kienitz # This makefile should work with at least AmigaDOS 2.04 (V37) (not tested) # and will probably not work with AmigaDOS 1.3 (V34) # If you have any improvements, critics or else please feel free to mail. # Any response is appreciated. Haidinger Walter # Available targets: # all builds all executables below # unzip builds unzip executable # unzipsfx builds unzipsfx executable # funzip builds funzip execct UNZIP.BCKWNZIP60.AMIGA]SMAKEFILE.;1,utable # makesfx builds makesfx executable # clean remove all files created by the compilation # spotless like clean target but removes binaries too ########################## # USER MACRO DEFINITIONS # ########################## # Set the processor to generate code for UnZip and fUnZip. Specify one of: # ANY 68000 68010 68020 68030 68040 68060 (Default: ANY or 68000) # Use of the assembly versions is not supported yet since some of the asm # source file do not assemble with 68000 instructions. # Any help is appreciated of course. CUSECPU = ANY # Uncomment both CUTIL and LUTIL to make use of utility.library of OS 2.04+ # The utility.library is *not* used for UnZipSFX to ensure maximum portability # between the different Amiga systems (minimal config: 68000 and OS 1.2). # You can change this by adding the $(LUTIL) macro in the UnZipSFX linking # rules (See below: Final output targets, UnZipSFX:). # WARNINGS when using the utility library: # 1. All Executables will *only* work with AmigaDOS 2.04 (v37) or higher. # 2. You *need not* compile/link with short-integers using the # utility.library. It will crash your machine. See Libraries below. # # Default: commented (not used) # #CUTIL = UTILLIB DEFINE=_UTILLIB #LUTIL = WITH SC:LIB/utillib.with # include necessary linker defines # Choose one stack-handling method (default=faster) # StackExtend: Dynamic runtime stack extension. You won't notice stack overflows. # StackCheck: On a stack overflow a requester appears which allows you to exit. # Note that either stack watching will slow down your executable because of the # extra code run on each function entry. On the other hand, you won't crash # anymore due to stack overflows. However, you should not have *any* stack # problems with info-zip if you raise your stack to 20000 (which I'd # recommend as a minimum default stack for all applications) or more using the # shell stack command. Type 'Stack 20000' or add it to your S:Shell-Startup. # BTW: Typing 'Stack' prints your current stack size. # CSTACK = NOSTACKCHECK STACKEXTEND # slow, but always works #CSTACK = STACKCHECK NOSTACKEXTEND # slow, requester & graceful exit #CSTACK = NOSTACKCHECK NOSTACKEXTEND # faster but relies on larger stack (>=10K) # # LIBRARIES # --------- # Choose one DATAOPTS , SASLIB and LSTARTUP # Always comment/uncomment all macros of a set. # Library to use with near data and 2-byte integers # Notes: o slower than 4-byte integers with 68000 cpu # o *not* recommended due to poor overall performance # o see comment in amiga/osdep.h #DATAOPTS = DATA=NEAR SHORTINTEGERS DEF=_NEAR_DATA #SASLIB = scs #LSTARTUP = cres.o # Library to use with near data and 4-byte integers (DEFAULT) # *** use this with the utility.library *** DATAOPTS = DATA=NEAR DEF=_NEAR_DATA SASLIB = sc LSTARTUP = cres.o # Library to use with far data and 2-byte integers # use if DYN_ALLOC is not defined # old default - far data always works but is slower #DATAOPTS = DATA=FAR SHORTINTEGERS DEF=_FAR_DATA #SASLIB = scsnb #LSTARTUP = c.o # Library to use with far data and 4-byte integers # if everything else fails: try this #DATAOPTS = DATA=FAR DEF=_FAR_DATA #SASLIB = scnb #LSTARTUP = c.o # # DEBUGGING # --------- # Default: No debugging information added. # The two macros below will be overwritten if you choose to add # debug info, therefore need to comment. CDBG = NODEBUG NOPROFILE NOCOVERAGE # default: no debug info LDBG = STRIPDEBUG # default: no debug info # Compiler and loader debug flags. Uncomment as needed. Recomment when done. # Optimization disabled for faster compilation (by using NOOPT) #CDBG1 = DEF=DEBUG DEF=DEBUG_TIME # enables Info-ZIP's debug output # Enable profiling and coverage when desired. Option COVERAGE commented # seperately because running coverage may corrupt your drive in case of a # system crash since a file 'cover.dat' is created in your working directory. # Note that the use of COVERAGE forces the use of the c.o startup module. #CDBG2 = PROFILE #CDBG3 = COVERAGE # must use c.o startup code: #LSTARTUP = c.o # Uncomment *only* when you use COVERAGE # *Uncomment* _HERE_ macros CDBG and LDBG to include debugging information #CDBG = $(CDBG1) $(CDBG2) $(CDBG3) ADDSYM DEBUG=FULLFLUSH STACKCHECK NOOPT #LDBG = ADDSYM # Optional use of memwatch.library which can be found in your # sc:extras/memlib directory. Please read the short docs (memlib.doc). # Note that memlib has a small bug: MWTerm() displays always the first entry. # Get the latest version from aminet (dev/debug/memlib.lha) or # contact me to get the patch. Uncomment all macros to use. #CMEMLIB = DEFINE=MWDEBUG=1 # define to enable library #LMEMLIB = SC:LIB/memwatch.lib # path to library #LSTARTUP = c.o # must use c.o with memlib! # # MAPPING # ------- # Map filenames used when mapping (no need to comment) # MAPFS = unzip.map # UnZip map filename MAPFX = unzipsfx.map # UnZipSFX map filename MAPFF = funzip.map # fUnZip map filename MAPFM = makesfx.map # MakeSFX map filename # Map file output: Uncomment to highlight and bold headings. # #MAPFSTYLE = FANCY # Map flags for each EXECUTABLE. Uncomment to enable mapping. # For map options please refer to: # SAS/C v6 manual, volume 1: user's guide, chapter 8, page 136: map # Default: all options enabled: f,h,l,o,s,x # |-> options start here #LMAPS = $(MAPFSTYLE) MAP $(MAPFS) f,h,l,o,s,x # UnZip maps #LMAPX = $(MAPFSTYLE) MAP $(MAPFX) f,h,l,o,s,x # UnZipSFX maps #LMAPF = $(MAPFSTYLE) MAP $(MAPFF) f,h,l,o,s,x # fUnZip maps #LMAPM = $(MAPFSTYLE) MAP $(MAPFM) f,h,l,o,s,x # MakeSFX maps # # LISTINGS # -------- # Listfile-extensions for each executable (enter *with* dot) # LISTEXTS = .lst # extension for UnZip and MakeSFX listfiles LISTEXTX = .xlst # extension for UnZipSFX listfiles LISTEXTF = .flst # extension for fUnZip listfiles # List files and cross references for each OBJECT. # Add/remove flags as needed. All listed by default. # Use LISTINCLUDES only to determine the dependencies for smake # CLISTOPT = LISTHEADERS LISTMACROS # LISTSYSTEM LISTINCLUDES CXREFOPT = XHEAD XSYS # # Uncomment to enable listing (default: commented) # *** WARNING: List files require *lots* of disk space! # #CLIST = LIST $(CLISTOPT) #CXREF = XREF $(CXREFOPT) # # SUPPRESSED COMPILER WARNINGS # ---------------------------- # Compiler warnings to ignore # # Warning 105 : module does not define any externally-known symbols # Warning 304 : Dead assignment eliminated... # Note 306 : ...function inlined... # Warning 317 : possibly uninitialized variable... # Comment to enable. # CIGNORE = IGNORE=105,304,306,317 # # OBJECT EXTENSIONS # # Extensions used for objects of each executeable. # Transformation rules require unique extensions. # Enter *with* dot. # O = .o # general extension for objects OX = .xo # extension for special UnZipSFX objects OF = .fo # extension for special fUnZip objects # Filename used to store converted options from environment variable # LOCAL_UNZIP. Default: scoptions_local_unzip # CWITHOPT = scoptions_local_unzip # Filenames to store compiler options to prevent command line overflow # # Options file for UnZip and fUnZip CFILEC = scoptions-unzip # Options file for UnZipSFX CFILEX = scoptions-unzipsfx # Special options for MakeSFX CFILEM = scoptions-makesfx # Temp filenames for object lists to load using linker "WITH" command. # OBJLISTS = unzip_objlist.with # UnZip UO UNZIP.BCKWNZIP60.AMIGA]SMAKEFILE.;1, object list OBJLISTX = unzipsfx_objlist.with # UnZipSFX object list OBJLISTF = funzip_objlist.with # fUnZip object list OBJLISTM = makesfx_objlist.with # MakeSFX object list # Filenames to store linker options # LWITHS = unzip.lnk # UnZip linker options LWITHX = unzipsfx.lnk # UnZipSFX linker options LWITHF = funzip.lnk # fUnZip linker options LWITHM = makesfx.lnk # MakeSFX linker options ###################################### # NOTHING TO CHANGE BEYOND HERE ... # ###################################### # Compiler definitions # CC = sc # # Optimizer flags # OPTPASSES = 6 # set number of global optimizer passes # OPT1 = OPT OPTINL OPTINLOCAL OPTTIME OPTLOOP OPTSCHED OPT2 = OPTCOMP=$(OPTPASSES) OPTDEP=$(OPTPASSES) OPTRDEP=$(OPTPASSES) OPT = $(OPT1) $(OPT2) # Compiler flags # # cpu flags for UnZip and fUnZip CCPUOPTSF = CPU=$(CUSECPU) $(CUTIL) # cpu flags for UnzipSFX and MakeSFX (ensures portability to all Amigas) CCPUOPTXM = CPU=ANY CDEFINES = $(CMEMLIB) $(CDEFINES) DEF=AMIGA DEF=PROTO COPTIONS = CODE=NEAR NMINC VERBOSE STRINGMERGE PARAMETERS=BOTH COPTIONS = $(COPTIONS) ERRORREXX NOERRORCONSOLE MEMSIZE=HUGE $(CLIST) $(CXREF) COPTIONS = $(COPTIONS) $(CSTACK) STRICT UNSCHAR NOICONS COPTIONS = $(COPTIONS) $(CIGNORE) $(OPT) $(CDBG) # common compiler flags CFLAGSC = $(CDEFINES) $(DATAOPTS) $(COPTIONS) # special compiler flags with $(DATAOPTS) excluded CFLAGSS = $(CDEFINES) $(COPTIONS) # Linker definitions # See SASLIB definition above # LD = slink # special linker flags for UnZip to create pure (i.e. resident) binary. LDFLAGSS = FROM SC:LIB/$(LSTARTUP) # common linker flags for all other executeables LDFLAGSC = FROM SC:LIB/c.o LDFLAGS2 = NOICONS $(LDBG) # special linker flags to select library set above LIBFLAGSS = LIB $(LMEMLIB) SC:LIB/$(SASLIB).lib SC:LIB/amiga.lib # common linker flags LIBFLAGSC = LIB $(LMEMLIB) SC:LIB/sc.lib SC:LIB/amiga.lib ################## # TARGET OBJECTS # ################## # UnZip Objects OBJS1 = unzip$(O) crc32$(O) crypt$(O) envargs$(O) explode$(O) OBJS2 = extract$(O) fileio$(O) globals$(O) list$(O) inflate$(O) match$(O) OBJS3 = process$(O) ttyio$(O) ubz2err$(O) unreduce$(O) unshrink$(O) zipinfo$(O) OBJSA = amiga$(O) timezone$(O) OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJSA) # UnZipSFX Objects OBJX1 = unzip$(OX) extract$(OX) inflate$(OX) match$(OX) process$(OX) OBJXI = crypt$(OX) crc32$(OX) fileio$(OX) globals$(OX) ttyio$(OX) ubz2err$(OX) OBJXA = amiga$(OX) timezone$(OX) OBJX = $(OBJX1) $(OBJXI) $(OBJXA) # fUnZip Objects OBJF1 = funzip$(O) OBJF2 = crc32$(OF) crypt$(OF) globals$(OF) inflate$(OF) ttyio$(OF) OBJFA = filedate$(OF) stat$(O) OBJF = $(OBJF1) $(OBJF2) $(OBJFA) # MakeSFX Objects OBJM = makesfx$(O) # Common header files UNZIP_H1 = unzip.h unzpriv.h globals.h UNZIP_HA = amiga/amiga.h amiga/z-stat.h UNZIP_H = $(UNZIP_H1) $(UNZIP_HA) # Output targets UNZIPS = UnZip UnZipSFX fUnZip MakeSFX ####################################### # DEFAULT TARGET AND PROCESSING RULES # ####################################### all: request flush $(UNZIPS) # UnZip transformation rules # .c$(O) : $(CC) WITH=$(CFILEC) LISTFILE=$>$(LISTEXTS) OBJNAME=$@ $*.c # UnZipSFX transformation rules # .c$(OX): $(CC) DEF=SFX WITH=$(CFILEC) LISTFILE=$>$(LISTEXTX) OBJNAME=$@ $*.c # fUnZip transformation rules # .c$(OF): $(CC) DEF=FUNZIP WITH=$(CFILEC) LISTFILE=$>$(LISTEXTF) OBJNAME=$@ $*.c ######################### # Final output targets. # ######################### unzip: local_unzip CommonFlags $(OBJS) @Echo "$(OBJS)" >$(OBJLISTS) Type $(OBJLISTS) # ----- # Note: Change $(LDFLAGSS) to $(LDFLAGSC) if DYN_ALLOC is *not* defined. # ----- @Echo "$(LDFLAGSS) $(LUTIL) WITH $(OBJLISTS) $(LIBFLAGSS) " \ "$(LDFLAGS2) $(LMAPS)" >$(LWITHS) Type $(LWITHS) $(LD) TO UnZip WITH $(LWITHS) funzip: local_unzip CommonFlags $(OBJF) @Echo "$(OBJF)" >$(OBJLISTF) Type $(OBJLISTF) @Echo "$(LDFLAGSC) $(LUTIL) WITH $(OBJLISTF) $(LIBFLAGSS) " \ "$(LDFLAGS2) $(LMAPF)" >$(LWITHF) Type $(LWITHF) $(LD) TO fUnZip WITH $(LWITHF) unzipsfx: local_unzip SFXFlags $(OBJX) @Echo "$(OBJX)" >$(OBJLISTX) Type $(OBJLISTX) # ---- # Note: Insert $(LUTIL) here, to use utility library with UnZipSFX. # ----- vvvvvvv @Echo "$(LDFLAGSC) WITH $(OBJLISTX) $(LIBFLAGSS) " \ "$(LDFLAGS2) $(LMAPX)" >$(LWITHX) Type $(LWITHX) $(LD) TO UnZipSFX WITH $(LWITHX) makesfx: MakeSFXFlags $(OBJM) @Echo "$(OBJM)" >$(OBJLISTM) Type $(OBJLISTM) @Echo "$(LDFLAGSC) $(LUTIL) WITH $(OBJLISTM) $(LIBFLAGSC) " \ "$(LDFLAGS2) $(LMAPM)" >$(LWITHM) Type $(LWITHM) # never use short-integers with MakeSFX ! $(LD) TO MakeSFX WITH $(LWITHM) clean: -Delete >nil: $(OBJS) quiet -Delete >nil: $(OBJX) quiet -Delete >nil: $(OBJF) quiet -Delete >nil: $(OBJM) quiet -Delete >nil: $(OBJLISTS) $(OBJLISTX) $(OBJLISTF) $(OBJLISTM) quiet -Delete >nil: $(MAPFS) $(MAPFX) $(MAPFF) $(MAPFM) quiet -Delete >nil: \#?$(LISTEXTS) \#?$(LISTEXTX) \#?$(LISTEXTF) quiet -Delete >nil: $(CWITHOPT) $(CFILEC) $(CFILEX) $(CFILEM) quiet -Delete >nil: SCOPTIONS SASCOPTS quiet -Delete >nil: $(LWITHS) $(LWITHX) $(LWITHF) $(LWITHM) quiet -Delete >nil: \#?.q.?? \#?.tmp \#?.cov quiet spotless: clean -Delete >nil: $(UNZIPS) quiet # UnZip dependencies: # (objects not needed by Amiga port are commented) # special rule for adding Amiga internal version number to UnZip amiga$(O): amiga/amiga.c amiga/filedate.c amiga/stat.c $(UNZIP_H) crypt.h timezone.h env:Workbench stat$(O): amiga/stat.c amiga/z-stat.h filedate$(O): amiga/filedate.c crypt.h timezone.h api$(O): api.c $(UNZIP_H) unzvers.h #zlib.h apihelp$(O): apihelp.c $(UNZIP_H) unzvers.h crc32$(O): crc32.c $(UNZIP_H) zip.h crc32.h crypt$(O): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs$(O): envargs.c $(UNZIP_H) explode$(O): explode.c $(UNZIP_H) extract$(O): extract.c $(UNZIP_H) crc32.h crypt.h fileio$(O): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals$(O): globals.c $(UNZIP_H) inflate$(O): inflate.c $(UNZIP_H) inflate.h #zlib.h list$(O): list.c $(UNZIP_H) match$(O): match.c $(UNZIP_H) process$(O): process.c $(UNZIP_H) crc32.h timezone$(O): timezone.c $(UNZIP_H) zip.h timezone.h ttyio$(O): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$(O): ubz2err.c $(UNZIP_H) unreduce$(O): unreduce.c $(UNZIP_H) unshrink$(O): unshrink.c $(UNZIP_H) unzip$(O): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h #zlib.h #unzipstb$(O): unzipstb.c $(UNZIP_H) unzvers.h zipinfo$(O): zipinfo.c $(UNZIP_H) # UnZipSFX dependencies: # # special rule for adding Amiga internal version number to UnZipSFX amiga$(OX): amiga/amiga.c amiga/filedate.c amiga/stat.c $(UNZIP_H) crypt.h timezone.h unzip$(OX): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h crc32$(OX): crc32.c $(UNZIP_H) zip.h crc32.h crypt$(OX): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h extract$(OX): extract.c $(UNZIP_H) crc32.h crypt.h fileio$(OX): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals$(OXb߆ UNZIP.BCKWNZIP60.AMIGA]SMAKEFILE.;1,=!): globals.c $(UNZIP_H) inflate$(OX): inflate.c $(UNZIP_H) inflate.h #zlib.h match$(OX): match.c $(UNZIP_H) process$(OX): process.c $(UNZIP_H) crc32.h timezone$(OX): timezone.c $(UNZIP_H) zip.h timezone.h ttyio$(OX): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$(OX): ubz2err.c $(UNZIP_H) # fUnZip dependencies: # funzip$(O): funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h crc32$(OF): crc32.c $(UNZIP_H) zip.h crc32.h crypt$(OF): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h globals$(OF): globals.c $(UNZIP_H) inflate$(OF): inflate.c $(UNZIP_H) inflate.h crypt.h #zlib.h ttyio$(OF): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h filedate$(OF): amiga/filedate.c crypt.h # MakeSFX dependencies # # special transformation rules to never use shortintegers: makesfx$(O): amiga/makesfx.c $(CC) WITH=$(CFILEM) LISTFILE=$>$(LISTEXTS) OBJNAME=$@ $*.c ######################## # DEPENDECIES END HERE # ######################## # flush all libraries to provide more mem for compilation flush: @Avail flush >nil: # write common compiler flags to file and echo to user CommonFlags: @Echo "$(CFLAGSC)" "$(CCPUOPTSF)" >$(CFILEC) @Type "$(CWITHOPT)" >>$(CFILEC) -Type $(CFILEC) SFXFlags: @Echo "$(CFLAGSC)" "$(CCPUOPTXM)" >$(CFILEX) @Type "$(CWITHOPT)" >>$(CFILEX) -Type $(CFILEX) # write special MakeSFX flags MakeSFXFlags: @Echo "$(CFLAGSS) $(CCPUOPTXM) DATA=NEAR NOSHORTINTEGERS" >$(CFILEM) # not really needed but if someday used: @Type "$(CWITHOPT)" >>$(CFILEM) -Type $(CFILEM) # special rule for adding Amiga internal version number to amiga.c amiga$(O): rx > env:VersionDate "say '""'translate(date('E'),'.','/')'""'" $(CC) WITH=$(CFILEC) LISTFILE=$>$(LISTEXTS) OBJNAME=$@ $*.c -Delete env:VersionDate # needed in amiga/amiga.c # should be set in startup-sequence, but just in case: # (only works with OS 2.04 and above) env\:WorkBench: @Execute < < (Workbench_smk.tmp) FailAt 21 If not exists ENV:Workbench Version >nil: SetEnv Workbench $$Workbench Endif < # ################# # ### LOCAL_UNZIP ### # ################# # # Read environment variable LOCAL_UNZIP and convert options from old Lattice # v5 to new SAS/C v6 format. You may also use the new DEFINE= syntax but # be sure not to mix v5 and v6 options, otherwise lctosc will be confused. # # e.g.: to define FOO_ONE and FOO_TWO enter: # # SetEnv LOCAL_UNZIP "-DFOO_ONE -DFOO_TWO" # # To make this permanent, i.e. survive an reboot, put the statement into # your startup-sequence or (for AmigaDOS 2.0 or higher only) make sure # LOCAL_UNZIP is stored in the ENVARC: directory too. To do this, simply # copy the file from ENV: to ENVARC: # Copy ENV:LOCAL_UNZIP ENVARC: # # For a list of all valid non-standard compilation options see the INSTALL # file in the root zip tree. Please read the notes there before using the # non-standard options. # # e.g.: To use the non-standard timezone environment variable "INFOZIP_TZ" # (or another arbitary name) instead of "TZ", type in your shell: # # Setenv LOCAL_UNZIP "-DTZ_ENVVAR=*"INFOZIP_TZ*"" # # Note that you need to escape the quotes of INFOZIP_TZ with leading stars. # To verify that LOCAL_UNZIP has been saved correctly, use the Getenv command: # # Getenv LOCAL_UNZIP # # ...should display: # # -DTZ_ENVVAR="INFOZIP_TZ" # local_unzip: @Execute < < (Local_UnZip_smk.tmp) Failat 21 Echo "" If exists ENV:LOCAL_UNZIP Echo "Using environment variable LOCAL_UNZIP !" Echo "LOCAL_UNZIP: " NOLINE GetEnv LOCAL_UNZIP Copy >NIL: ENV:LOCAL_UNZIP SASCOPTS Else Echo "You could use envvar LOCAL_UNZIP to set your special compilation options." Echo "See the makefile for more information (LOCAL_UNZIP section)." Delete >nil: SASCOPTS quiet Endif Echo "" ; Do not remove the lctosc command! If LOCAL_UNZIP is unset, an ; empty file is created which needed by CommonFlags ! ; Moreover, lctosc also accepts new v6 options, i.e. only changes ; known v5 options. Try `lctosc -Dfoo' and `lctosc DEFINE=foo'. ; However, you *must not* mix v5 and v6 options! lctosc > $(CWITHOPT) ; Now make sure that env:sc/scoptions are NOT used ; we just create an empty file. The options are stored elsewhere. Echo > SCOPTIONS "" NOLINE < # Echo request to the user # request: @Echo "" @Echo " This makefile is for use with SAS/C version 6.58." @Echo " If you still have an older version, please upgrade!" @Echo " Patches are available on the Aminet under biz/patch/sc\#?." @Echo "" @Echo " Just a simple request..." @Echo " Please give me a mail that you compiled whether you encounter any errors" @Echo " or not. I'd just like to know how many Amiga users actually make use of" @Echo " this makefile." @Echo " If you mail me, I'll put you on my mailing-list and notify you whenever" @Echo " new versions of Info-Zip are released." @Echo " Have a look at the makefile for changes like CPU type, UtilLib, Stack, etc." @Echo " Feel free to mail comments, suggestions, critics..." @Echo " Enjoy Info-Zip !" @Echo " Haidinger Walter, " @Echo "" # Echo help in case of an error # .ONERROR: @Echo "" @Echo "[sigh] An error running this makefile was detected." @Echo "This message may also appear if you interrupted smake by pressing CTRL-C." @Echo "Contact Info-ZIP authors at Zip-Bugs@lists.wku.edu or me for help." @Echo "Haidinger Walter, " *[UNZIP60.AMIGA]STAT.C;1+,./ 4@-W0123KPWO56 Ȟ7 Ȟ89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* Here we have a handmade stat() function because Aztec's c.lib stat() */ /* does not support an st_mode field, which we need... also a chmod(). */ /* This stat() is by Paul Wells, modified by Paul Kienitz. */ /* Originally for use with Aztec C >= 5.0 and Lattice C <= 4.01 */ /* Adapted for SAS/C 6.5x by Haidinger Walter */ /* POLICY DECISION: We will not attempt to remove global variables from */ /* this source file for Aztec C. These routines are essentially just */ /* augmentations of Aztec's c.lib, which is itself not reentrant. If */ /* we want to produce a fully reentrant UnZip, we will have to use a */ /* suitable startup module, such as purify.a tc UNZIP.BCKW[UNZIP60.AMIGA]STAT.C;1for Aztec by Paul Kienitz. */ #ifndef __amiga_stat_c #define __amiga_stat_c #include #include #include "amiga/z-stat.h" /* fake version of stat.h */ #include #ifdef AZTEC_C # include # include # include # include # include # include #endif #ifdef __SASC # include /* SAS/C dir function prototypes */ # include # include # include #endif #ifndef SUCCESS # define SUCCESS (-1) # define FAILURE (0) #endif void close_leftover_open_dirs(void); /* prototype */ static DIR *dir_cleanup_list = NULL; /* for resource tracking */ /* CALL THIS WHEN HANDLING CTRL-C OR OTHER UNEXPECTED EXIT! */ void close_leftover_open_dirs(void) { while (dir_cleanup_list) closedir(dir_cleanup_list); } unsigned short disk_not_mounted; extern int stat(const char *file, struct stat *buf); stat(file,buf) const char *file; struct stat *buf; { struct FileInfoBlock *inf; BPTR lock; time_t ftime; struct tm local_tm; if( (lock = Lock((char *)file,SHARED_LOCK))==0 ) /* file not found */ return(-1); if( !(inf = (struct FileInfoBlock *)AllocMem( (long)sizeof(struct FileInfoBlock),MEMF_PUBLIC|MEMF_CLEAR)) ) { UnLock(lock); return(-1); } if( Examine(lock,inf)==FAILURE ) { FreeMem((char *)inf,(long)sizeof(*inf)); UnLock(lock); return(-1); } /* fill in buf */ buf->st_dev = buf->st_nlink = buf->st_uid = buf->st_gid = buf->st_rdev = 0; buf->st_ino = inf->fib_DiskKey; buf->st_blocks = inf->fib_NumBlocks; buf->st_size = inf->fib_Size; /* now the date. AmigaDOS has weird datestamps--- * ds_Days is the number of days since 1-1-1978; * however, as Unix wants date since 1-1-1970... */ ftime = (inf->fib_Date.ds_Days * 86400 ) + (inf->fib_Date.ds_Minute * 60 ) + (inf->fib_Date.ds_Tick / TICKS_PER_SECOND ) + (86400 * 8 * 365 ) + (86400 * 2 ); /* two leap years */ /* tzset(); */ /* this should be handled by mktime(), instead */ /* ftime += timezone; */ local_tm = *gmtime(&ftime); local_tm.tm_isdst = -1; ftime = mktime(&local_tm); buf->st_ctime = buf->st_atime = buf->st_mtime = ftime; buf->st_mode = (inf->fib_DirEntryType < 0 ? S_IFREG : S_IFDIR); /* lastly, throw in the protection bits */ buf->st_mode |= ((inf->fib_Protection ^ 0xF) & 0xFF); FreeMem((char *)inf, (long)sizeof(*inf)); UnLock((BPTR)lock); return(0); } int fstat(int handle, struct stat *buf) { /* fake some reasonable values for stdin */ buf->st_mode = (S_IREAD|S_IWRITE|S_IFREG); buf->st_size = -1; buf->st_mtime = time(&buf->st_mtime); return 0; } /* opendir(), readdir(), closedir(), rmdir(), and chmod() by Paul Kienitz. */ DIR *opendir(const char *path) { DIR *dd = AllocMem(sizeof(DIR), MEMF_PUBLIC); if (!dd) return NULL; if (!(dd->d_parentlock = Lock((char *)path, MODE_OLDFILE))) { disk_not_mounted = IoErr() == ERROR_DEVICE_NOT_MOUNTED; FreeMem(dd, sizeof(DIR)); return NULL; } else disk_not_mounted = 0; if (!Examine(dd->d_parentlock, &dd->d_fib) || dd->d_fib.fib_EntryType < 0) { UnLock(dd->d_parentlock); FreeMem(dd, sizeof(DIR)); return NULL; } dd->d_cleanuplink = dir_cleanup_list; /* track them resources */ if (dir_cleanup_list) dir_cleanup_list->d_cleanupparent = &dd->d_cleanuplink; dd->d_cleanupparent = &dir_cleanup_list; dir_cleanup_list = dd; return dd; } void closedir(DIR *dd) { if (dd) { if (dd->d_cleanuplink) dd->d_cleanuplink->d_cleanupparent = dd->d_cleanupparent; *(dd->d_cleanupparent) = dd->d_cleanuplink; if (dd->d_parentlock) UnLock(dd->d_parentlock); FreeMem(dd, sizeof(DIR)); } } struct dirent *readdir(DIR *dd) { return (ExNext(dd->d_parentlock, &dd->d_fib) ? (struct dirent *)dd : NULL); } #ifdef AZTEC_C int rmdir(const char *path) { return (DeleteFile((char *)path) ? 0 : IoErr()); } int chmod(const char *filename, int bits) /* bits are as for st_mode */ { long protmask = (bits & 0xFF) ^ 0xF; return !SetProtection((char *)filename, protmask); } /* This here removes unnecessary bulk from the executable with Aztec: */ void _wb_parse(void) { } /* fake a unix function that does not apply to amigados: */ int umask(void) { return 0; } # include /* C library signal() messes up debugging yet adds no actual usefulness */ typedef void (*__signal_return_type)(int); __signal_return_type signal() { return SIG_ERR; } /* The following replaces Aztec's argv-parsing function for compatibility with Unix-like syntax used on other platforms. It also fixes the problem the standard _cli_parse() has of accepting only lower-ascii characters. */ int _argc, _arg_len; char **_argv, *_arg_lin; void _cli_parse(struct Process *pp, long alen, register UBYTE *aptr) { register UBYTE *cp; register struct CommandLineInterface *cli; register short c; register short starred = 0; # ifdef PRESTART_HOOK void Prestart_Hook(void); # endif cli = (struct CommandLineInterface *) (pp->pr_CLI << 2); cp = (UBYTE *) (cli->cli_CommandName << 2); _arg_len = cp[0] + alen + 2; if (!(_arg_lin = AllocMem((long) _arg_len, 0L))) return; c = cp[0]; strncpy(_arg_lin, cp + 1, c); _arg_lin[c] = 0; for (cp = _arg_lin + c + 1; alen && (*aptr < '\n' || *aptr > '\r'); alen--) *cp++ = *aptr++; *cp = 0; aptr = cp = _arg_lin + c + 1; for (_argc = 1; ; _argc++) { while (*cp == ' ' || *cp == '\t') cp++; if (!*cp) break; if (*cp == '"') { cp++; while (c = *cp++) { if (c == '"' && !starred) { *aptr++ = 0; starred = 0; break; } else if (c == '\\' && !starred) starred = 1; else { *aptr++ = c; starred = 0; } } } else { while ((c = *cp++) && c != ' ' && c != '\t') *aptr++ = c; *aptr++ = 0; } if (c == 0) --cp; } *aptr = 0; if (!(_argv = AllocMem((_argc + 1) * sizeof(*_argv), 0L))) { _argc = 0; return; } for (c = 0, cp = _arg_lin; c < _argc; c++) { _argv[c] = cp; cp += strlen(cp) + 1; } _argv[c] = NULL; # ifdef PRESTART_HOOK Prestart_Hook(); # endif } #endif /* AZTEC_C */ #endif /* __amiga_stat_c */  хW UNZIP.BCKW[UNZIP60.AMIGA]Z-STAT.H;1p*[UNZIP60.AMIGA]Z-STAT.H;1+,./ 4@-W0123KPWO56/ Ȟ7/ Ȟ89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifndef __amiga_z_stat_h #define __amiga_z_stat_h /* Since older versions of the Lattice C compiler for Amiga, and all current */ /* versions of the Manx Aztec C compiler for Amiga, either provide no stat() */ /* function or provide one inadequate for unzip (Aztec's has no st_mode */ /* field), we provide our own stat() function in stat.c by Paul Wells, and */ /* this fake stat.h file by Paul Kienitz. Paul Wells originally used the */ /* Lattice stat.h but that does not work for Aztec and is not distributable */ /* with this package, so I made a separate one. This has to be pulled into */ /* unzip.h when compiling an Amiga version, as "amiga/z-stat.h". */ /* We also provide here a "struct dirent" for use with opendir() & readdir() */ /* functions included in amiga/stat.c. If you use amiga/stat.c, this must */ /* be included wherever you use either readdir() or stat(). */ #ifdef AZTEC_C # define __STAT_H #else /* __SASC */ /* do not include the following header, replacement definitions are here */ # define _STAT_H /* do not include SAS/C */ # define _DIRENT_H /* do not include SAS/C */ # define _SYS_DIR_H /* do not include SAS/C */ # define _COMMIFMT_H /* do not include SAS/C */ # include #endif #include #include struct stat { unsigned short st_mode; time_t st_ctime, st_atime, st_mtime; long st_size; long st_ino; long st_blocks; short st_attr, st_dev, st_nlink, st_uid, st_gid, st_rdev; }; #define S_IFDIR (1<<11) #define S_IFREG (1<<10) #if 0 /* these values here are totally random: */ # define S_IFLNK (1<<14) # define S_IFSOCK (1<<13) # define S_IFCHR (1<<8) # define S_IFIFO (1<<7) # define S_IFMT (S_IFDIR|S_IFREG|S_IFCHR|S_IFLNK) #else # define S_IFMT (S_IFDIR|S_IFREG) #endif #define S_IHIDDEN (1<<7) #define S_ISCRIPT (1<<6) #define S_IPURE (1<<5) #define S_IARCHIVE (1<<4) #define S_IREAD (1<<3) #define S_IWRITE (1<<2) #define S_IEXECUTE (1<<1) #define S_IDELETE (1<<0) int stat(const char *name, struct stat *buf); int fstat(int handle, struct stat *buf); /* returns dummy values */ typedef struct dirent { struct dirent *d_cleanuplink, **d_cleanupparent; BPTR d_parentlock; struct FileInfoBlock d_fib; } DIR; #define d_name d_fib.fib_FileName extern unsigned short disk_not_mounted; /* flag set by opendir() */ DIR *opendir(const char *); void closedir(DIR *); void close_leftover_open_dirs(void); /* call this if aborted in mid-run */ struct dirent *readdir(DIR *); int umask(void); #ifdef AZTEC_C int rmdir(const char *); int chmod(const char *filename, int bits); #endif #endif /* __amiga_z_stat_h */ *[UNZIP60]AOSVS.DIR;1+,./ 4->0123 KPWO56n7n89GHJIAOSVS.CAOSVS.HD CONTENTS.V MAKE_UNZ.CLIREADME.>*[UNZIP60.AOSVS]AOSVS.C;1+,.m/ 4mm@-0123KPWOn56TLW7TLW89GHJ /* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- aosvs.c AOS/VS-specific routines for use with Info-ZIP's UnZip 5.2 and later. [GRR: copied from unix.c -> undoubtedly has unnecessary stuff: delete at will] Contains: readdir() do_wild() open_outfile() mapattr() mapname() checkdir() close_outfile() version() <-- GRR: needs work! (Unix, not AOS/VS) zvs_create() zvs_credir() ux_to_vs_name() dgdate() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #include "aosvs/aosvs.h" #include #include #include #define symlink(resname,linkname) \ zvs_create(linkname,-1L,-1L,-1L,ux_to_vs_name(vs_resname,resname),$FLNK,-1,-1) * file type */ #ifdef DIRENT # include #else # ifdef SYSV # ifdef SYSNDIR # include # else # include # endif # else /* !SYSV */ # ifndef NO_SYSDIR # include # endif # endif /* ?SYSV */ # ifndef dirent # define dirent direct # endif #endif /* ?DIRENT */ static int created_dir; /* used in mapname(), checkdir() */ static int renamed_fullpath; /* ditto */ static ZEXTRAFLD zzextrafld; /* buffer for extra field containing * ?FSTAT packet & ACL buffer */ static char vs_resname[2*$MXPL]; static char vs_path[2*$MXPL]; /* buf for AOS/VS pathname */ static char Vs_path[512]; /* should be big enough [GRR: ?] */ static P_CTIM zztimeblock; /* time block for file creation */ static ZVSCREATE_STRU zzcreatepacket; /* packet for sys_create(), any /***************************/ /* Strings used in aosvs.c */ /***************************/ static ZCONST char Far CannotDeleteOldFile[] = "error: cannot delete old %s\n"; static ZCONST char Far CannotCreateFile[] = "error: cannot create %!{{x }{=&kT;1 ͌ jG["BSgB^@TeC3uL?Q5o'vGpUp)L$[/o3MĹ3A4>->Mt 9-x's"P9}B&qPH=[FjT3BK vhiVX"fYZTL)U3Q-kU E5u(=B0E rW*W6T-3t #<]FWFFakaNAs`S6V|#R 'vLKօ1wg{2O,0L]s(C$Z6TIUq@H9N/CcL B'*8yqB#\|x%4EVeubp*aS:2-Ef >bH?)[$6H& *VWY!RKfAui:fcmzqjRBVAeEWYQM `|OLF{lmQsWd$WqGNyw`G~zz>jMO\ UZE^UM2ll"!~P cX r,W]+]NN^KBJZ$PMjLU5\'Sk)IV5 [LN#0BDK{+V *:N/4. jlxVUo56 DZZ7 I|^6s$VG*!cEPj[E}n7 Ia/"O]DQ5 C V<3^q%HZy?t]bX3[q5uu"[?|aPXEw | b/oq6s^4og?*iQt&/j*M\rR"X/\a\rS'ndWSr6m[NE5|0]a(vNmD%Id%#] w9lwLs@+K`4JFgP`l} p 8&D/F\@H\t^+_0Z-M}dtx_bo$7Z1lt 5z{$kXgV]PI.1SDo2sb(S"_yP5@[UelMgnY{D=\Ug5YK&h~~Y1+ e,suZ]l?F;o?^un;@qhIn"3zv_4| EFm~; 9:?@r(Tj?,w+TNwkNZk,&tRE}v**aUs6Fb{p9&}e9,?",o>m4MjYY\|'T@1CY{T2ab<\h `_h~x r3-qNGx 3l~t z4e|l{|7 F6mS< a'BwfsL(bwCd,u_ ~7t3% Gr7VD(haKJ /y]9& !/U?5p)%2agtbj6V 5jb6JgIEm  mdH]VFYq}5g zw@g88$ebVU78%t~CSA)6poh)FP![42||6&"ZlsP7Yf 6Tii_$zQ fpGa+R  -L>zq9 YX$WruRTdQJzDBmGk7QfU,ddg _Sf4KT)~XY\+6i@1_i2P4B@\JR~ZbCpCSB 8< iIbJAjR*9y*=&!SDgi9K%N#i"xfJj6~_c\eM] !d"xv0sqN IZcA`tMH]r[9vaxTuw /dkT@0Lr 4' YM6Mg3,HHilBO\61thos@Me[4PH$Zk~J&n^z;u, Q*`/6gc)ap]+=EN'E~ nE7 /iLjRA/II&fPzC]*&/S}x^A g^.d^K[3^JN5WqGoLoc eX<*Ob>]d?)NIxX*(_``B)qKa"z*iy vzXoA(eR'$u!9M>#%n Oi~(oklmP-3sIpFT K  f7#[b:(;UYEz/ A i;Ttw|X,Uea`F1{yCC?F^J|]7ITSW|Y3@3]NN\M `GR  }eY. zR= fa4 j^.Sb!>u6cioxRI.#,/,`YkOvz|Ar}}2n:C* Wmu%/45I jq%A hG`^:W-CbU_/g:;GwSM:@6K]uNTYnc1'p,@ ~"3)A46G*Ex`{d6.?:;6P9'xc%/0u1s 'F7/N^\e5xiU+H4_;S{$5\IG Quc+,`K t  oH!$~pax LicjAv[ g 0B())H| v8}`J$D.5S ^[qS2 %xx`*b|.K>zv_}" LYQO(4,_.wV]:GSVjL~#I\CBaIbARKw&bms(4h vs$sLv_QA`} 3k;}USEiN-n$:/ZW@|"T$C?g{qy7g ^[Y^eh+I2{/8Hjtbz> |8bKUMC WZ=*ak+QuuK _|?%soc?W"P&Dkm.H cL\`Gi&>SqcuI >|8!f -~RPcMC1/t*2M7ckNqfzF5Zddx_kK6#Yy%?y{~+yt[Q7rb4]T Ya?c\, GueJN=AB{Y5bu-;)wF;8BCwH]Yg|dY;T4 _i2y{0]]fm&VYL"5Ptc3=V`; x c?u\"U~\5c!kxu{`- N(0Ugh^[N`odA6,4&YrSPH+UCU vj6\ MRyE6a/4OrVrE,*"p MRuN pwgDT$@Yu\79'J({Sf t'}z)6H Xpj1rm' Y=E_rA?$e?634 }71%8vAN{KdcNDVke4NTIFg{a,P&sMB}&@|h4< 1(@UBV]>93|aWn@C|8K3q=2 o =,~,]:WBA@h0w|[X D9lwq<^_aw>ei>{hGF{'(e5P7gjj~Kyu ]7Svm,z{W+=!K7 {x9,JE-lv)23NC5YZb|8/:3 h5EA=J0l<%mf)V#XAR$^cXqin#*Y *";IG8%>ZAhn>hhzAeJ &Tl1/3 =*w-9]m8ZUV]'+]hbgwE`T;K/n}Hr:ܡ.ygRHTtMO9$yy"- R+~LP;EI^@0gl_j7).Bi\3}1 'ax)]*,Zoyd#kR wBHUo A;:lm}}K G_- v%D-i>V)oU S kwnwZ5&"msPU5 !$,!wf0A,pzU@ BHbr#bug[m Y?nJ?+$vd~ d 9 "k "slin`PH uL-x^;ZsA!{NnM]JKB8V'.S|n%r1cr'ZP]Y4JOLml@B{m ;S]'r_ Cu\@F19_IF[=&,s<h]HHS0C+6IViEPR@<.&;pqs=p+6Iq7( +$:[ /Z#}9fr9]dsp@%fGJ8{=yhP/ySYx0P#2b iF_j0HK%(j?? Q@e vOEz.hl,gj,+QK|= Tvy%NF_1=..%M7e[c01,`^zf/vXVxq4M_@o%vEz5TVe t|rUEazo9 BEm[&QU,?<40Pv lLm&rc!qk m'eMzijVC:\AWJ$xw$Gd)QJ}MU W.])Z>%r]bJn-eX]" x>A#MY]O+cIAGJ;9[!&2kbz )&&+doyY.FC*osIVb*hkzqtNucm<& ] :fS+SH/X(ii:9?B \/]*fl?Z+)w=J G^qY 80_Jk;:\ H!4 Pn3_sWKV2 oD(TiPD ,ZT%"SKdt9Hi{{'^9#2'RC]@IZWMRJdD(#9h% d'j.7ERTvHC%K"YA{vU FU*AW1)ZJr}AR%6[ulU u#Naa9iHU i

nj6bmwo+N%{F&PT6 1}7&*.I7~Q"=n']{7o\B_Q*)ik#9o%*T{3)c xp5Ta|)D@3jQqN'$MLsMvm9?f|I,a 2?(]8u\KE,Gyv+`zhUG2XB]QTfPUL:e[e T(s^@r"M oo0.36UPx">apqZHL@;_g!/]vb8g7AfB<l}GONH6VI$T\T$zB,`)]&eq];X }@D"ze&w+_~_WC&8y?$]B,3!LMK< -kDj Qna8h(9ZAZON Nk!== /@J,*_7oR*(~U?;WXlFx;*+Zc!&f[N0/5e4wWQ`Ym-7S7u?{QMbji$$ /l pUY]1LQ1YmuB `xM8#LfE1Quh!yU~S< {`ryJ#N(-4ac "W-"=7OR|t"WZ,.N@$h2daO7J.(=SsPDUW=ofE)- qeg:mk SY:+!`aHNUF\Ia[>i|1;zpp5BL9GbZ E]8>wF| x9;]JQxZ.QFUJar9Ac};38|nHS11b:,qoX^+W_C,fOG_2P]21Me=#:3kl+ 0xNifht`y`iWme`}+I,EQ Z,S' MD-=n0WWnJVc8\ rR 16|LP4`9q/k9|z =besn;w z&5cf<;Yr>J8V:<L );8YR- o8=WR4<+Rf-4Dso6.a^QO#o\pq-rVEd6fKo3.2! $s`>p 0:$wDH(\(IQW%/^Gqsj+_9-l 5?OieB Nri~b\,&%lx@HJnbyU{&z=b8C@Z[ F/b_1P^1 'KJItS8nEN`CCt{~*t6fx-3[VWKmJd%?6=W V.DEi5R:/LOPvFwc9Wjtqg'K$JG3 IA%={%G\%vjE F$??X9vrS,u-mc6aF,QhC%8i9-fwlkYAkM)n#&2l# ]H;[@`:6+J"[J '][UU}^LGRA/t*t`"i[~K|Nmpl)sjp? N((<Xrf=m]~1yQ^?><'X _YK n0udAUVqk[AT,Op}F0Sak2$RDh*[4"\,P {" EbgC=d/)] 6twzA=kP+8 o $Mi]Q5G>5p36vL5%r79X t13.A^k!6xS|],6A#!T>/$ `+<# D\U4 *AME qCP~[nFY6ql;@ O|4)."hYF[E\|c&VdjW)s>SQ* +E x LN& 1 JlapwijFV%id!bkr@|d/c_SydfL8ToiFgN8=I2p)Q6oZJb&.:s>r0t^:/01 7Khv/PL?wiYYY]8.,(c/p|}1fJTKFL^c Tk}l(ca.ap8LA BIMLPD_jpw?g@E ]G]SCPAK;KAW -I;) E mk6m@ C[ Z9O^_EjeW@GI3,(xhb+MUO LDxjD@cOOz@`_ZJ--lds funzip exec"8ġ/ UNZIP.BCK[UNZIP60.AOSVS]AOSVS.C;1mUs\n"; #ifndef SFX #ifdef NO_DIR /* for AT&T 3B1 */ #define opendir(path) fopen(path,"r") #define closedir(dir) fclose(dir) typedef FILE DIR; /* * Apparently originally by Rich Salz. * Cleaned up and modified by James W. Birdsall. */ struct dirent *readdir(dirp) DIR *dirp; { static struct dirent entry; if (dirp == NULL) return NULL; for (;;) if (fread(&entry, sizeof (struct dirent), 1, dirp) == 0) return (struct dirent *)NULL; else if (entry.d_ino) return &entry; } /* end function readdir() */ #endif /* NO_DIR */ /**********************/ /* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */ /**********************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { static DIR *wild_dir = (DIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; struct dirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!notfirstcall) { /* first call: must initialize everything */ notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; have_dirname = FALSE; dir = NULL; return matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((wildname = strrchr(wildspec, '/')) == (ZCONST char *)NULL) { dirname = "."; dirnamelen = 1; have_dirname = FALSE; wildname = wildspec; } else { ++wildname; /* point at character after '/' */ dirnamelen = wildname - wildspec; if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) { Info(slide, 0x201, ((char *)slide, "warning: cannot allocate wildcard buffers\n")); strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; /* but maybe filespec was not a wildcard */ } strncpy(dirname, wildspec, dirnamelen); dirname[dirnamelen] = '\0'; /* terminate for strcpy below */ have_dirname = TRUE; } if ((wild_dir = opendir(dirname)) != (DIR *)NULL) { while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, wildname, 0 WISEP) && /* 0=case sens.*/ /* skip "." and ".." directory entries */ strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); if (have_dirname) { strcpy(matchname, dirname); strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } /* if we get to here directory is exhausted, so close it */ closedir(wild_dir); wild_dir = (DIR *)NULL; } /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (wild_dir == (DIR *)NULL) { notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, wildname, 0 WISEP)) { /* 0 == case sens. */ Trace((stderr, "do_wild: match() succeeds\n")); if (have_dirname) { /* strcpy(matchname, dirname); */ strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } closedir(wild_dir); /* have read at least one entry; nothing left */ wild_dir = (DIR *)NULL; notfirstcall = FALSE; /* reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /***************************/ /* Function open_outfile() */ /***************************/ int open_outfile(__G) /* return 1 if fail */ __GDEF { int errc = 1; /* init to show no success with AOS/VS info */ long dmm, ddd, dyy, dhh, dmin, dss; #ifdef DLL if (G.redirect_data) return redirect_outfile(__G)==FALSE; #endif if (stat(G.filename, &G.statbuf) == 0 && unlink(G.filename) < 0) { Info(slide, 0x401, ((char *)slide, LoadFarString(CannotDeleteOldFile), FnFilter1(G.filename))); return 1; } /*--------------------------------------------------------------------------- If the file didn't already exist, we created it earlier. But we just deleted it, which we still had to do in case we are overwriting an exis- ting file. So we must create it now, again, to set the creation time properly. (The creation time is the best functional approximation of the Unix mtime. Really!) If we stored this with an AOS/VS Zip that set the extra field to contain the ?FSTAT packet and the ACL, we should use info from the ?FSTAT call now. Otherwise (or if that fails), we should create anyway as best we can from the normal Zip info. In theory, we should look through an entire series of extra fields that might exist for the same file, but we're not going to bother. If we set up other types of extra fields, or if other environments we run into may add their own stuff to existing entries in Zip files, we'll have to. Note that all the packet types for sys_fstat() are the same size & mostly have the same structure, with some fields being unused, etc. Ditto for sys_create(). Thus, we assume a normal one here, not a dir/cpd or device or IPC file, & make little adjustments as necessary. We will set ACLs later (to reduce the chance of lacking access to what we create now); note that for links the resolution name should be stored in the ACL field (once we get Zip recognizing links OK). ---------------------------------------------------------------------------*/ if (G.extra_field != NULL) { memcpy((char *) &zzextrafld, G.extra_field, sizeof(zzextrafld)); #Z UNZIP.BCK[UNZIP60.AOSVS]AOSVS.C;1m| if (!memcmp(ZEXTRA_HEADID, zzextrafld.extra_header_id, sizeof(zzextrafld.extra_header_id)) && !memcmp(ZEXTRA_SENTINEL, zzextrafld.extra_sentinel), sizeof(zzextrafld.extra_sentinel)) { zzcreatepacket.norm_create_packet.cftyp_format = zzextrafld.fstat_packet.norm_fstat_packet.styp_format; zzcreatepacket.norm_create_packet.cftyp_entry = zzextrafld.fstat_packet.norm_fstat_packet.styp_type; /* for DIRS/CPDs, the next one will give the hash frame size; for * IPCs it will give the port number */ zzcreatepacket.norm_create_packet.ccps = zzextrafld.fstat_packet.norm_fstat_packet.scps; zzcreatepacket.norm_create_packet.ctim = &zztimeblock; zztimeblock.tcth = zzextrafld.fstat_packet.norm_fstat_packet.stch; /* access & modification times default to current */ zztimeblock.tath.long_time = zztimeblock.tmth.long_time = -1; /* give it current process's ACL unless link; then give it * resolution name */ zzcreatepacket.norm_create_packet.cacp = (char *)(-1); if (zzcreatepacket.norm_create_packet.cftyp_entry == $FLNK) zzcreatepacket.norm_create_packet.cacp = zzextrafld.aclbuf; zzcreatepacket.dir_create_packet.cmsh = zzextrafld.fstat_packet.dir_fstat_packet.scsh; if (zzcreatepacket.norm_create_packet.cftyp_entry != $FCPD) { /* element size for normal files */ zzcreatepacket.norm_create_packet.cdel = zzextrafld.fstat_packet.norm_fstat_packet.sdeh; } zzcreatepacket.norm_create_packet.cmil = zzextrafld.fstat_packet.norm_fstat_packet.smil; if ((errc = sys_create(ux_to_vs_name(vs_path, G.filename), &zzcreatepacket)) != 0) Info(slide, 0x201, ((char *)slide, "error creating %s with AOS/VS info -\n\ will try again with ordinary Zip info\n", FnFilter1(G.filename))); } } /* do it the hard way if no AOS/VS info was stored or if we had problems */ if (errc) { /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { dyy = (G.lrec.last_mod_dos_datetime >> 25) + 1980; dmm = (G.lrec.last_mod_dos_datetime >> 21) & 0x0f; ddd = (G.lrec.last_mod_dos_datetime >> 16) & 0x1f; dhh = (G.lrec.last_mod_dos_datetime >> 11) & 0x1f; dmin = (G.lrec.last_mod_dos_datetime >> 5) & 0x3f; dss = (G.lrec.last_mod_dos_datetime << 1) & 0x3e; } if (zvs_create(G.filename, (uO.D_flag <= 1 ? (((ulg)dgdate(dmm, ddd, dyy)) << 16) | (dhh*1800L + dmin*30L + dss/2L) : -1L), -1L, -1L, (char *) -1, -1, -1, -1)) { Info(slide, 0x201, ((char *)slide, "error: %s: cannot create\n", FnFilter1(G.filename))); return 1; } } Trace((stderr, "open_outfile: doing fopen(%s) for writing\n", FnFilter1(G.filename))); if ((G.outfile = fopen(G.filename, FOPW)) == (FILE *)NULL) { Info(slide, 0x401, ((char *)slide, LoadFarString(CannotCreateFile), FnFilter1(G.filename))); return 1; } Trace((stderr, "open_outfile: fopen(%s) for writing succeeded\n", FnFilter1(G.filename))); #ifdef USE_FWRITE #ifdef _IOFBF /* make output fully buffered (works just about like write()) */ setvbuf(G.outfile, (char *)slide, _IOFBF, WSIZE); #else setbuf(G.outfile, (char *)slide); #endif #endif /* USE_FWRITE */ return 0; } /* end function open_outfile() */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) __GDEF { ulg tmp = G.crec.external_file_attributes; G.pInfo->file_attr = 0; /* initialized to 0 for check in "default" branch below... */ switch (G.pInfo->hostnum) { case AMIGA_: tmp = (unsigned)(tmp>>17 & 7); /* Amiga RWE bits */ G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp); break; case THEOS_: tmp &= 0xF1FFFFFFL; if ((tmp & 0xF0000000L) != 0x40000000L) tmp &= 0x01FFFFFFL; /* not a dir, mask all ftype bits */ else tmp &= 0x41FFFFFFL; /* leave directory bit as set */ /* fall through! */ case UNIX_: case VMS_: case ACORN_: case ATARI_: case ATHEOS_: case BEOS_: case QDOS_: case TANDEM_: G.pInfo->file_attr = (unsigned)(tmp >> 16); if (G.pInfo->file_attr != 0 || !G.extra_field) { return 0; } else { /* Some (non-Info-ZIP) implementations of Zip for Unix and * VMS (and probably others ??) leave 0 in the upper 16-bit * part of the external_file_attributes field. Instead, they * store file permission attributes in some extra field. * As a work-around, we search for the presence of one of * these extra fields and fall back to the MSDOS compatible * part of external_file_attributes if one of the known * e.f. types has been detected. * Later, we might implement extraction of the permission * bits from the VMS extra field. But for now, the work-around * should be sufficient to provide "readable" extracted files. * (For ASI Unix e.f., an experimental remap from the e.f. * mode value IS already provided!) */ ush ebID; unsigned ebLen; uch *ef = G.extra_field; unsigned ef_len = G.crec.extra_field_length; int r = FALSE; while (!r && ef_len >= EB_HEADSIZE) { ebID = makeword(ef); ebLen = (unsigned)makeword(ef+EB_LEN); if (ebLen > (ef_len - EB_HEADSIZE)) /* discoverd some e.f. inconsistency! */ break; switch (ebID) { case EF_ASIUNIX: if (ebLen >= (EB_ASI_MODE+2)) { G.pInfo->file_attr = (unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE)); /* force stop of loop: */ ef_len = (ebLen + EB_HEADSIZE); break; } /* else: fall through! */ case EF_PKVMS: /* "found nondecypherable e.f. with perm. attr" */ r = TRUE; default: break; } ef_len -= (ebLen + EB_HEADSIZE); ef += (ebLen + EB_HEADSIZE); } if (!r) return 0; } /* fall through! */ /* all remaining cases: expand MSDOS read-only bit into write perms */ case FS_FAT_: /* PKWARE's PKZip for Unix marks entries as FS_FAT_, but stores the * Unix attributes in the upper 16 bits of the external attributes * field, just like Info-ZIP's Zip for Unix. We try to use that * va$<^{ UNZIP.BCK[UNZIP60.AOSVS]AOSVS.C;1m$lue, after a check for consistency with the MSDOS attribute * bits (see below). */ G.pInfo->file_attr = (unsigned)(tmp >> 16); /* fall through! */ case FS_HPFS_: case FS_NTFS_: case MAC_: case TOPS20_: default: /* Ensure that DOS subdir bit is set when the entry's name ends * in a '/'. Some third-party Zip programs fail to set the subdir * bit for directory entries. */ if ((tmp & 0x10) == 0) { extent fnlen = strlen(G.filename); if (fnlen > 0 && G.filename[fnlen-1] == '/') tmp |= 0x10; } /* read-only bit --> write perms; subdir bit --> dir exec bit */ tmp = !(tmp & 1) << 1 | (tmp & 0x10) >> 4; if ((G.pInfo->file_attr & 0700) == (unsigned)(0400 | tmp<<6)) /* keep previous G.pInfo->file_attr setting, when its "owner" * part appears to be consistent with DOS attribute flags! */ return 0; G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp); break; } /* end switch (host-OS-created-by) */ /* for originating systems with no concept of "group," "other," "system": */ umask( (int)(tmp=umask(0)) ); /* apply mask to expanded r/w(/x) perms */ G.pInfo->file_attr &= ~tmp; return 0; } /* end function mapattr() */ /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ #ifdef ACORN_FTYPE_NFS char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */ RO_extra_block *ef_spark; /* pointer Acorn FTYPE ef block */ #endif int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels in Unix */ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); created_dir = FALSE; /* not yet */ /* user gave full pathname: don't prepend rootpath */ renamed_fullpath = (renamed && (*G.filename == '/')); if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM) return MPN_NOMEM; /* initialize path buffer, unless no memory */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; *pp++ = ';'; /* keep for now; remove VMS ";##" */ break; /* later, if requested */ #ifdef ACORN_FTYPE_NFS case ',': /* NFS filetype extension */ lastcomma = pp; *pp++ = ','; /* keep for now; may need to remove */ break; /* later, if requested */ #endif #ifdef MTS case ' ': /* change spaces to underscore under */ *pp++ = '_'; /* MTS; leave as spaces under Unix */ break; #endif default: /* allow European characters in filenames: */ if (isprint(workch) || (128 <= workch && workch <= 254)) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %s\n", FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } /* On UNIX (and compatible systems), "." and ".." are reserved for * directory navigation and cannot be used as regular file names. %MV UNZIP.BCK[UNZIP60.AOSVS]AOSVS.C;1m7Y3 * These reserved one-dot and two-dot names are mapped to "_" and "__". */ if (strcmp(pathcomp, ".") == 0) *pathcomp = '_'; else if (strcmp(pathcomp, "..") == 0) strcpy(pathcomp, "__"); #ifdef ACORN_FTYPE_NFS /* translate Acorn filetype information if asked to do so */ if (uO.acorn_nfs_ext && (ef_spark = (RO_extra_block *) getRISCOSexfield(G.extra_field, G.lrec.extra_field_length)) != (RO_extra_block *)NULL) { /* file *must* have a RISC OS extra field */ long ft = (long)makelong(ef_spark->loadaddr); /*32-bit*/ if (lastcomma) { pp = lastcomma + 1; while (isxdigit((uch)(*pp))) ++pp; if (pp == lastcomma+4 && *pp == '\0') *lastcomma='\0'; /* nuke */ } if ((ft & 1<<31)==0) ft=0x000FFD00; sprintf(pathcomp+strlen(pathcomp), ",%03x", (int)(ft>>8) & 0xFFF); } #endif /* ACORN_FTYPE_NFS */ if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ #if 0 /*========== NOTES ==========*/ extract-to dir: a:path/ buildpath: path1/path2/ ... (NULL-terminated) pathcomp: filename mapname(): loop over chars in zipfile member name checkdir(path component, COMPONENT | CREATEDIR) --> map as required? (d:/tmp/unzip/) (disk:[tmp.unzip.) (d:/tmp/unzip/jj/) (disk:[tmp.unzip.jj.) (d:/tmp/unzip/jj/temp/) (disk:[tmp.unzip.jj.temp.) finally add filename itself and check for existence? (could use with rename) (d:/tmp/unzip/jj/temp/msg.outdir) (disk:[tmp.unzip.jj.temp]msg.outdir) checkdir(name, GETPATH) --> copy path to name and free space #endif /* 0 */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { static int rootlen = 0; /* length of rootpath */ static char *rootpath; /* user's "extract-to" directory */ static char *buildpath; /* full path (so far) to extracted file */ static char *end; /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') ++end; #ifdef SHORT_NAMES /* path components restricted to 14 chars, typically */ if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(end = old_end + FILENAME_MAX) = '\0'; #endif /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ /* next check: need to append '/', at least one-char name, '\0' */ if ((end-buildpath) > FILNAMSIZ-3) too_long = TRUE; /* check if extracting dir? */ /* for AOS/VS, try to create so as to not use searchlist: */ if ( /*SSTAT(buildpath, &G.statbuf)*/ 1) { if (!G.create_dirs) { /* told not to create (freshening) */ free(buildpath); return MPN_INF_SKIP; /* path doesn't exist: nothing to do */ } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } /* create the directory */ if (zvs_credir(buildpath,-1L,-1L,-1L,(char *) -1,-1,0L,-1,-1) == -1) { Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ %s\n\ unable to process %s.\n", FnFilter2(buildpath), strerror(errno), FnFilter1(G.filename))); free(buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n\ unable to process %s.\n", FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *end++ = '/'; *end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(buildpath); buildpath = end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') { ++end; #ifdef SHORT_NAMES /* truncate name at 14 characters, typically */ if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(end = old_end + FILENAME_MAX) = '\0'; #endif if ((end-buildpath) & H UNZIP.BCK[UNZIP60.AOSVS]AOSVS.C;1mB>= FILNAMSIZ) { *--end = '\0'; Info(slide, 1, ((char *)slide, "checkdir warning: path too long; truncating\n\ %s\n -> %s\n", FnFilter1(G.filename), FnFilter2(buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ /* GRR: for VMS and TOPS-20, add up to 13 to strlen */ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+1)) == (char *)NULL) return MPN_NOMEM; if ((rootlen > 0) && !renamed_fullpath) { strcpy(buildpath, rootpath); end = buildpath + rootlen; } else { *buildpath = '\0'; end = buildpath; } Trace((stderr, "[%s]\n", FnFilter1(buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if necessary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { rootlen = 0; return MPN_OK; } if (rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((rootlen = strlen(pathcomp)) > 0) { char *tmproot; if ((tmproot = (char *)malloc(rootlen+2)) == (char *)NULL) { rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (tmproot[rootlen-1] == '/') { tmproot[--rootlen] = '\0'; } if (rootlen > 0 && (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode))) { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); rootlen = 0; /* skip (or treat as stored file) */ return MPN_INF_SKIP; } /* create the directory (could add loop here scanning tmproot * to create more than one level, but why really necessary?) */ if (zvs_credir(tmproot,-1L,-1L,-1L,(char *) -1,-1,0L,-1,-1) == -1) { Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n\ %s\n", FnFilter1(tmproot), strerror(errno))); free(tmproot); rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdir levels required */ return MPN_ERR_SKIP; } } tmproot[rootlen++] = '/'; tmproot[rootlen] = '\0'; if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) { free(tmproot); rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (rootlen > 0) { free(rootpath); rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) /* GRR: change to return PK-style warning level */ __GDEF { /*--------------------------------------------------------------------------- If symbolic links are supported, allocate storage for a symlink control structure, put the uncompressed "data" and other required info in it, and add the structure to the "deferred symlinks" chain. Since we know it's a symbolic link to start with, we shouldn't have to worry about overflowing unsigned ints with unsigned longs. ---------------------------------------------------------------------------*/ #ifdef SYMLINKS if (G.symlnk) { extent ucsize = (extent)G.lrec.ucsize; /* size of the symlink entry is the sum of * (struct size (includes 1st '\0') + 1 additional trailing '\0'), * system specific attribute data size (might be 0), * and the lengths of name and link target. */ extent slnk_entrysize = (sizeof(slinkentry) + 1) + ucsize + strlen(G.filename); slinkentry *slnk_entry; if (slnk_entrysize < ucsize) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed: mem alloc overflow\n", FnFilter1(G.filename))); fclose(G.outfile); return; } if ((slnk_entry = (slinkentry *)malloc(slnk_entrysize)) == NULL) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed: no mem\n", FnFilter1(G.filename))); fclose(G.outfile); return; } slnk_entry->next = NULL; slnk_entry->targetlen = ucsize; slnk_entry->attriblen = 0; /* don't set attributes for symlinks */ slnk_entry->target = slnk_entry->buf; slnk_entry->fname = slnk_entry->target + ucsize + 1; strcpy(slnk_entry->fname, G.filename); /* move back to the start of the file to re-read the "link data" */ rewind(G.outfile); if (fread(slnk_entry->target, 1, ucsize, G.outfile) != ucsize) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed\n", FnFilter1(G.filename))); free(slnk_entry); fclose(G.outfile); return; } fclose(G.outfile); /* close "link" file for good... */ slnk_entry->target[ucsize] = '\0'; if (QCOND2) Info(slide, 0, ((char *)slide, "-> %s ", FnFilter1(slnk_entry->target))); /* add this symlink record to the list of deferred symlinks */ if (G.slink_last != NULL) G.slink_last->next = slnk_entry; else G.slink_head = slnk_entry; G.slink_last = slnk_entry; return; } #endif /* SYMLINKS */ fclose(G.outfile); /*--'R@ UNZIP.BCK[UNZIP60.AOSVS]AOSVS.C;1m*Q------------------------------------------------------------------------- Change the file permissions from default ones to those stored in the zipfile. ---------------------------------------------------------------------------*/ #ifndef NO_CHMOD if (chmod(G.filename, 0xffff & G.pInfo->file_attr)) perror("chmod (file attributes) error"); #endif /*--------------------------------------------------------------------------- AOS/VS only allows setting file times at creation but has its own permis- sions scheme which is better invoked here if the necessary information was in fact stored. In theory, we should look through an entire series of extra fields that might exist for the same file, but we're not going to bother. If we set up other types of extra fields, or if we run into other environments that add their own stuff to existing entries in ZIP files, we'll have to. NOTE: already copied extra-field stuff into zzextrafld structure when file was created. ---------------------------------------------------------------------------*/ if (G.extra_field != NULL) { if (!memcmp(ZEXTRA_HEADID, zzextrafld.extra_header_id, sizeof(zzextrafld.extra_header_id)) && !memcmp(ZEXTRA_SENTINEL, zzextrafld.extra_sentinel, sizeof(zzextrafld.extra_sentinel)) && zzextrafld.fstat_packet.norm_fstat_packet.styp_type != $FLNK) /* (AOS/VS links don't have ACLs) */ { /* vs_path was set (in this case) when we created the file */ if (sys_sacl(vs_path, zzextrafld.aclbuf)) { Info(slide, 0x201, ((char *)slide, "error: cannot set ACL for %s\n", FnFilter1(G.filename))); perror("sys_sacl()"); } } } } /* end function close_outfile() */ #ifndef SFX /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { #if (defined(__GNUC__) && defined(NX_CURRENT_COMPILER_RELEASE)) char cc_namebuf[40]; char cc_versbuf[40]; #else #if (defined(CRAY) && defined(_RELEASE)) char cc_versbuf[40]; #endif #endif #if ((defined(CRAY) || defined(cray)) && defined(_UNICOS)) char os_namebuf[40]; #else #if defined(__NetBSD__) char os_namebuf[40]; #endif #endif /* Pyramid, NeXT have problems with huge macro expansion, too: no Info() */ sprintf((char *)slide, LoadFarString(CompiledWith), #ifdef __GNUC__ # ifdef NX_CURRENT_COMPILER_RELEASE (sprintf(cc_namebuf, "NeXT DevKit %d.%02d ", NX_CURRENT_COMPILER_RELEASE/100, NX_CURRENT_COMPILER_RELEASE%100), cc_namebuf), (strlen(__VERSION__) > 8)? "(gcc)" : (sprintf(cc_versbuf, "(gcc %s)", __VERSION__), cc_versbuf), # else "gcc ", __VERSION__, # endif #else # if defined(CRAY) && defined(_RELEASE) "cc ", (sprintf(cc_versbuf, "version %d", _RELEASE), cc_versbuf), # else # ifdef __VERSION__ # ifndef IZ_CC_NAME # define IZ_CC_NAME "cc " # endif IZ_CC_NAME, __VERSION__ # else # ifndef IZ_CC_NAME # define IZ_CC_NAME "cc" # endif IZ_CC_NAME, "", # endif # endif #endif /* ?__GNUC__ */ #ifndef IZ_OS_NAME # define IZ_OS_NAME "Unix" #endif IZ_OS_NAME, #if defined(sgi) || defined(__sgi) " (Silicon Graphics IRIX)", #else #ifdef sun # ifdef sparc # ifdef __SVR4 " (Sun SPARC/Solaris)", # else /* may or may not be SunOS */ " (Sun SPARC)", # endif # else # if defined(sun386) || defined(i386) " (Sun 386i)", # else # if defined(mc68020) || defined(__mc68020__) " (Sun 3)", # else /* mc68010 or mc68000: Sun 2 or earlier */ " (Sun 2)", # endif # endif # endif #else #ifdef __hpux " (HP/UX)", #else #ifdef __osf__ " (DEC OSF/1)", #else #ifdef _AIX " (IBM AIX)", #else #ifdef aiws " (IBM RT/AIX)", #else #if defined(CRAY) || defined(cray) # ifdef _UNICOS (sprintf(os_namebuf, " (Cray UNICOS release %d)", _UNICOS), os_namebuf), # else " (Cray UNICOS)", # endif #else #if defined(uts) || defined(UTS) " (Amdahl UTS)", #else #ifdef NeXT # ifdef mc68000 " (NeXTStep/black)", # else " (NeXTStep for Intel)", # endif #else /* the next dozen or so are somewhat order-dependent */ #ifdef LINUX # ifdef __ELF__ " (Linux ELF)", # else " (Linux a.out)", # endif #else #ifdef MINIX " (Minix)", #else #ifdef M_UNIX " (SCO Unix)", #else #ifdef M_XENIX " (SCO Xenix)", #else #ifdef __NetBSD__ # ifdef NetBSD0_8 (sprintf(os_namebuf, " (NetBSD 0.8%c)", (char)(NetBSD0_8 - 1 + 'A')), os_namebuf), # else # ifdef NetBSD0_9 (sprintf(os_namebuf, " (NetBSD 0.9%c)", (char)(NetBSD0_9 - 1 + 'A')), os_namebuf), # else # ifdef NetBSD1_0 (sprintf(os_namebuf, " (NetBSD 1.0%c)", (char)(NetBSD1_0 - 1 + 'A')), os_namebuf), # else (BSD4_4 == 0.5)? " (NetBSD before 0.9)" : " (NetBSD 1.1 or later)", # endif # endif # endif #else #ifdef __FreeBSD__ (BSD4_4 == 0.5)? " (FreeBSD 1.x)" : " (FreeBSD 2.0 or later)", #else #ifdef __bsdi__ (BSD4_4 == 0.5)? " (BSD/386 1.0)" : " (BSD/386 1.1 or later)", #else #ifdef __386BSD__ (BSD4_4 == 1)? " (386BSD, post-4.4 release)" : " (386BSD)", #else #if defined(i486) || defined(__i486) || defined(__i486__) " (Intel 486)", #else #if defined(i386) || defined(__i386) || defined(__i386__) " (Intel 386)", #else #ifdef pyr " (Pyramid)", #else #ifdef ultrix # ifdef mips " (DEC/MIPS)", # else # ifdef vax " (DEC/VAX)", # else /* __alpha? */ " (DEC/Alpha)", # endif # endif #else #ifdef gould " (Gould)", #else #ifdef MTS " (MTS)", #else #ifdef __convexc__ " (Convex)", #else "", #endif /* Convex */ #endif /* MTS */ #endif /* Gould */ #endif /* DEC */ #endif /* Pyramid */ #endif /* 386 */ #endif /* 486 */ #endif /* 386BSD */ #endif /* BSDI BSD/386 */ #endif /* NetBSD */ #endif /* FreeBSD */ #endif /* SCO Xenix */ #endif /* SCO Unix */ #endif /* Minix */ #endif /* Linux */ #endif /* NeXT */ #endif /* Amdahl */ #endif /* Cray */ #endif /* RT/AIX */ #endif /* AIX */ #endif /* OSF/1 */ #endif /* HP/UX */ #endif /* Sun */ #endif /* SGI */ #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0); } /* end function version() */ #endif /* !SFX */ /* =================================================================== * ZVS_CREATE() * Function to create a file with specified times. The times should be sent * as long ints in DG time format; use -1 to set to the current times. You * may also specify a pointer to the ACL, the file type (see PARU.H, and do * not specify dirs or links), the element size, and the max index level. * For all of these parameters you may use -1 to specify the default. * * Returns 0 if no error, or the error code returned by ?CREATE. * * HISTORY: * 15-dec-93 dbl * 31-may-94 dbl: added call to convert pathname to AOS/VS * * */ int zvs_create(ZCONST char *fname, long cretim, long modtim, long acctim, char *pacl, int ftyp, int eltsize, int maxindlev) { P_CREATE pcr_stru; P_CTIM pct_stru; pcr_stru.cftyp_format = 0; /* unspecified record format */ if (ftyp == -1) /* default file type to UNX */ pcr_stru.cftyp_entry = $FUNX; else pcr_stru.cftyp_entry = ftyp; pcr_stru.ctim = &pct_stru; pcr_stru.cacp = pacl; pcr_stru.cdel = eltsize; pcr_stru.cmil = maxindlev; (LCt UNZIP.BCK[UNZIP60.AOSVS]AOSVS.C;1m?` pct_stru.tcth.long_time = cretim; pct_stru.tath.long_time = acctim; pct_stru.tmth.long_time = modtim; return (sys_create(ux_to_vs_name(Vs_path, fname), &pcr_stru)); } /* end zvs_create() */ /* =================================================================== * ZVS_CREDIR() * Function to create a dir as specified. The times should be sent * as long ints in DG time format; use -1 to set to the current times. You * may also specify a pointer to the ACL, the file type (either $FDIR or $FCPD; see PARU.H), * the max # blocks (if a CPD), the hash frame size, and the max index level. * For all of these parameters (except for the CPD's maximum blocks), * you may use -1 to specify the default. * * (The System Call Dictionary says both that you may specify a * maximum-index-level value up to the maximum, with 0 for a contiguous * directory, and that 3 is always used for this whatever you specify.) * * If you specify anything other than CPD for the file type, DIR will * be used. * * Returns 0 if no error, or the error code returned by ?CREATE. * * HISTORY: * 1-jun-94 dbl * * */ int zvs_credir(ZCONST char *dname, long cretim, long modtim, long acctim, char *pacl, int ftyp, long maxblocks, int hashfsize, int maxindlev) { P_CREATE_DIR pcr_stru; P_CTIM pct_stru; if (ftyp != $FCPD) /* default file type to UNX */ pcr_stru.cftyp_entry = $FDIR; else { pcr_stru.cftyp_entry = ftyp; pcr_stru.cmsh = maxblocks; } pcr_stru.ctim = &pct_stru; pcr_stru.cacp = pacl; pcr_stru.chfs = hashfsize; pcr_stru.cmil = maxindlev; pct_stru.tcth.long_time = cretim; pct_stru.tath.long_time = acctim; pct_stru.tmth.long_time = modtim; return (sys_create(ux_to_vs_name(Vs_path, dname), &pcr_stru)); } /* end zvs_credir() */ /* =================================================================== * UX_TO_VS_NAME() - makes a somewhat dumb pass at converting a Unix * filename to an AOS/VS filename. This should * be just about adequate to handle the results * of similarly-simple AOS/VS-to-Unix conversions * in the ZIP program. It does not guarantee a * legal AOS/VS filename for every Unix filename; * conspicuous examples would be names with * embedded ./ and ../ (which will receive no * special treatment). * * RETURNS: pointer to the result (which is an input parameter) * * NOTE: calling code is responsible for making sure * the output buffer is big enough! * * HISTORY: * 31-may-94 dbl * */ char *ux_to_vs_name(char *outname, ZCONST char *inname) { ZCONST char *ip=inname, *op=outname; if (ip[0] == '.') { if (ip[1] == '/') { *(op++) = '='; ip += 2; } else if (ip[1] == '.' && ip[2] == '/') { *(op++) = '^'; ip += 3; } } do { if (*ip == '/') *(op++) = ':'; else if (strchr( "0123456789_$?.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", *ip) != NULL) { *(op++) = *ip; } else *(op++) = '?'; } while (*(ip++) != '\0'); return outname; } /* end ux_to_vs_name() */ /* =================================================================== */ /* DGDATE Two functions do encode/decode dates in DG system format. Usage: long value,year,month,day; value=dgdate(month,day,year); undgdate(value,&month,&day,&year); [GRR: not used in UnZip: removed] Notes: 1. DG date functions only work on dates within the range Jan 1, 1968 through Dec 31, 2099. I have tested these functions through the same range with exact agreement. For dates outside of that range, the DG system calls may return different values than these functions. 2. dgundate() accepts values between 0 and 48213 inclusive. These correspond to 12/31/1967 and 12/31/2099. 3. Both functions assume the data is in the native OS byte order. So if you're reading or writing these fields from a file that has been passed between AOS/VS and PC-DOS you will need to swap byte order. 4. With reference to byte order, the entire range of values supported by these functions will fit into an unsigned short int. In most cases the input or output will be in that variable type. You are better off casting the value to/from unsigned short so you only need to concern yourself with swapping two bytes instead of four. Written by: Stanley J. Gula US&T, Inc. 529 Main Street, Suite 1 Indian Orchard, MA 01151 (413)-543-3672 Copyright (c) 1990 US&T, Inc. All rights reserved. I hereby release these functions into the public domain. You may use these routines freely as long as the US&T copyright remains intact in the source code. Stanley J. Gula July 24, 1990 */ long motable[13]={0,31,59,90,120,151,181,212,243,273,304,334,365}; long yrtable[132]={ 366, 731, 1096, 1461, 1827, 2192, 2557, 2922, 3288, 3653, 4018, 4383, 4749, 5114, 5479, 5844, 6210, 6575, 6940, 7305, 7671, 8036, 8401, 8766, 9132, 9497, 9862,10227,10593,10958, 11323,11688,12054,12419,12784,13149,13515,13880,14245,14610, 14976,15341,15706,16071,16437,16802,17167,17532,17898,18263, 18628,18993,19359,19724,20089,20454,20820,21185,21550,21915, 22281,22646,23011,23376,23742,24107,24472,24837,25203,25568, 25933,26298,26664,27029,27394,27759,28125,28490,28855,29220, 29586,29951,30316,30681,31047,31412,31777,32142,32508,32873, 33238,33603,33969,34334,34699,35064,35430,35795,36160,36525, 36891,37256,37621,37986,38352,38717,39082,39447,39813,40178, 40543,40908,41274,41639,42004,42369,42735,43100,43465,43830, 44196,44561,44926,45291,45657,46022,46387,46752,47118,47483, 47848,48213}; /* Given y,m,d return # of days since 12/31/67 */ long int dgdate(short mm, short dd, short yy) { long int temp; short ytmp; if (mm<1 || mm>12 || dd<1 || dd>31 || yy<1968 || yy>2099) return 0L; /* Figure in whole years since 1968 + whole months plus days */ temp=365L*(long)(yy-1968) + motable[mm-1] + (long)dd; /* Adjust for leap years - note we don't account for skipped leap year in years divisible by 1000 but not by 4000. We're correct through the year 2099 */ temp+=(yy-1965)/4; /* Correct for this year */ /* In leap years, if date is 3/1 or later, bump */ if ((yy%4==0) && (mm>2)) temp++; return temp; } *[UNZIP60.AOSVS]AOSVS.H;1+,D./ 4@-0123KPWO56 7 89GHJ)/(% UNZIP.BCKD[UNZIP60.AOSVS]AOSVS.H;1_ /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- aosvs.h AOS/VS-specific header file for use with Info-ZIP's UnZip 5.2 and later. ---------------------------------------------------------------------------*/ /* stuff to set up for system calls (?FSTAT & ?SACL) and the extra field */ #include /* parameter definitions */ #include /* AOS/VS ?FSTAT packet defs */ #include /* AOS/VS ?CREATE packet defs */ #include /* AOS/VS system call interface */ #define ZEXTRA_HEADID "VS" #define ZEXTRA_SENTINEL "FCI" #define ZEXTRA_REV ((uch)10) /* change/use this in later revs */ /* functions defined in zvs_create.c */ extern int zvs_create(ZCONST char *fname, long cretim, long modtim, long acctim, char *pacl, int ftyp, int eltsize, int maxindlev); extern int zvs_credir(ZCONST char *dname, long cretim, long modtim, long acctim, char *pacl, int ftyp, long maxblocks, int hashfsize, int maxindlev); extern long dgdate(short mm, short dd, short yy); extern char *ux_to_vs_name(char *outname, ZCONST char *inname); /* could probably avoid the unions - all elements in each one are the same * size, and we're going to assume this */ typedef union zvsfstat_stru { P_FSTAT norm_fstat_packet; /* normal fstat packet */ P_FSTAT_DIR dir_fstat_packet; /* DIR/CPD fstat packet */ P_FSTAT_UNIT unit_fstat_packet; /* unit (device) fstat packet */ P_FSTAT_IPC ipc_fstat_packet; /* IPC file fstat packet */ } ZVSFSTAT_STRU; typedef union zvscreate_stru { P_CREATE norm_create_packet; /* normal create packet */ P_CREATE_DIR dir_create_packet; /* DIR/CPD create packet */ P_CREATE_IPC ipc_create_packet; /* IPC file create packet */ } ZVSCREATE_STRU; typedef struct zextrafld { char extra_header_id[2]; /* set to VS - in theory, an int */ char extra_data_size[2]; /* size of rest (little-endian) */ char extra_sentinel[4]; /* set to FCI w/ trailing null */ uch extra_rev; /* set to 10 for rev 1.0 */ ZVSFSTAT_STRU fstat_packet; /* the fstat packet */ char aclbuf[$MXACL]; /* the raw ACL */ } ZEXTRAFLD; *[UNZIP60.AOSVS]CONTENTS.;1+,V./ 4@@-0123KPWO56?27?289GHJContents of the "aosvs" subdirectory for UnZip 5.3 and later: Contents this file README compilation notes, history, etc. make_unz.cli command script to make UnZip only (not UnZipSFX or fUnZip) aosvs.c AOS/VS-specific support routines aosvs.h AOS/VS-specific typedefs and header stuff *[UNZIP60.AOSVS]MAKE_UNZ.CLI;1+,./ 4<@-0123KPWO56ܻ{ 7ܻ{ 89GHJpush prompt pop searchlist :c_4.10 :c_4.10:lang_rt [!searchlist] cc/link/NOUNX/NOSEA SYSV/DEFINE TERMIO/DEFINE AOS_VS/DEFINE=1 PROTO/DEFINE S_IFLNK/DEFINE=0120000 TIME.H/INCLUDE .c pop *[UNZIP60.AOSVS]README.;1+,>./ 4@-0123KPWO56˸7˸89GHJ [e-mail excerpt from Dave Lovelace explaining AOS/VS port, compiler, etc.] > From: Dave Lovelace > Subject: Re: zip on Data General AOS/VS > Date: Wed, 17 May 1995 11:02:03 -0400 (EDT) > > The diffs for zip & unzip are both in the same file. I've also included the > extra source files which I wrote, the CLI macros which I used to compile > & link the things, & my own history of what I did. Note that some of the > changes I made reversed earlier changes, & this was written for my own > use (or for others here if I leave or die or something). I hope it will help. > > This was compiled using DG's C compiler for AOS/VS, rev 4.10. It has been > compiled only on an MV-5500 running AOS/VS rev 7.70, but the resulting > programs have been distributed & run on several different MVs running various > versions of AOS/VS, so it should be fairly independent of at least minor rev > variations. To the best of my knowledge it has *not* been tested under > AOS/VS II, & I really don't know anything about that environment; possibly > the special AOS/VS file info I'm storing in the extra field will have some > different format there. [README/history info from Dave Lovelace] In modifying this for use on AOS/VS, I found only a few changes were needed for DG C 4.10: 2. There was a bug in the inflate() code, because memset() was being called with a non-char pointer. Pretty obviously the other systems where this was used do not have char pointers different from other pointers. IT IS QUITE POSSIBLE THAT OTHER BUGS OF THIS SORT EXIST. Testing did not uncover any. 3. In fileio.c, it appears that utime() is being called correctly, but it does not set the file's time and always returns failure. Since the AOS/VS tar and cpio programs provided by DG also suffer from the fault of not setting file times, I must conclude that this is by design. At any rate, I modified the code (with compilation conditional on a macro AOS_VS) to not say "error" when this occurs. One change which I think would be desirable: if the filename isn't already a relative or absolute pathname (specifying a unique location), the program follows the searchlist under AOS/VS. It will unexpectedly replace files anywhere in your searchlist. (If you don't use the -o option, it will ask you first, but not tell you where the file to be replaced resides.) I suspect this could be handled by prepending ./ to any filenames which don't already begin with /. (I haven't checked how this would work inside the program. Po*~" UNZIP.BCK>[UNZIP60.AOSVS]README.;1issibly this could be done in every case - I don't think PKZIP ever stores an absolute pathname.) To see the compile options I used, look at the file MAKE.AOS_VS.CLI You may of course need to change the searchlist to use that macro. ------------------------------------------------------------------ 15-dec-93 I fixed some of the above things, introducing new problems. It now won't follow the searchlist - but the logic prevents it from creating directories (if they aren't explicitly in the ZIP, anyway). But UNZIP now sets the creation time to the time stored in the ZIP, and ZIP now stores that instead of the TLM. I had to introduce an extra module, with some code of my own and some other public domain code, to accomplish this. ------------------------------------------------------------------ 1-jun-94 I found an additional bug: the header was causing void to be #define'd as int, and prototypes weren't being used. I changed UNZIP.H and added a define of PROTO to the MAKE.AOS_VS.CLI and REMAKE.CLI macros. I found and fixed the bug that prevented the (creation) times from being set on files with explicit paths. (The Unix-style paths didn't work as inputs to the AOS/VS ?CREATE system call.) Additional known bugs: 1. I have not yet located the source of the bug that prevents the date/time from being set (also ACLs etc.) when an existing file is overwritten. For some reason the call to delete & recreate the file is not being reached. 2. We need to do something in ZIP to store (as comments?) the file's type and ACL, and then here in UNZIP extract these and apply them. This is not going to be trivial to make foolproof, but it's badly needed. ------------------------------------------------------------------ 2-jun-94 I fixed #1 above. The compiler was checking whether UNIX was defined, and it wasn't. It appears that *some* of the places UNIX is used are things we can't get along with, so I changed the code to check for AOS_VS as well. It seems to work just fine. I also introduced a function zvs_credir() to create a directory (as opposed to a CPD, though it can create CPDs to with the proper file-type parameter). Directories in a path which are being created will now be directories instead of CPDs. The big change that's needed now is to have ZIP store (somehow) the file's ACL and file type, and then to have UNZIP use this information to recreate the file as it was before ZIPping. Ideally, ZIP should also store links and CPD max-block info as well. Planned strategy: either in the name field but after the name, or in a comment, store the packet returned by ?FSTAT (using sys_fstat()), and then use this packet for the ?CREATE call in zvs_create(). ------------------------------------------------------------------ 22-Jul-94 The changes to use the extra-field field for AOS/VS file info are in place. In general, if a ZIPfile was created with the current rev of ZIP.PR, the files should be restored with file type, ACL, etc. OK. I didn't test to make sure element size & max index levels come through OK, but I think they should. Unix symbolic links are now UNZIPped OK, but ZIP.PR isn't yet able to ZIP links. When it is, UNZIP should be ready. In general UNZIP now ignores the searchlist fairly well, but not perfectly. If the directory of a file you're UNZIPping can be referenced elsewhere in the searchlist, UNZIP will find the file there. (For example, if the file UDD/BBASIC/ZZPGSUBSET.SR is in the ZIPfile, and : is in your searchlist, then UDD and UDD:BBASIC will be created under your current directory, but UNZIP will still find :UDD:BBASIC:ZZPGSUBSET.SR instead of =UDD:BBASIC:ZZPGSUBSET.SR. Filenames (which are now stored in uppercase by ZIP.PR) must be matched exactly if specified. This applies to Unix path structure as well as case. ------------------------------------------------------------------ 4-Aug-94 I fixed a bug which caused (for links only) the Unix pathname to be put through ux_to_vs_name twice. The result was that a path such as dir1/dir2/fname went first to :dir1:dir2:fname and then to dir1?dir2?fname. I also added the /NOSEA switch to the cc/link lines in the macros MAKE.AOS_VS.CLI and REMAKE.CLI. This should prevent any confusion over whether a file exists somewhere other than relative to the current dir. This would disable calls to system() from using the searchlist, but in this program I think they're all useless & hopefully inactive anyway. ------------------------------------------------------------------ *[UNZIP60]API.C;1+,@ .&/ 4&&@->0123KPWO'56-:M}7-:M}89GHJ /* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- api.c This module supplies an UnZip engine for use directly from C/C++ programs. The functions are: ZCONST UzpVer *UzpVersion(void); unsigned UzpVersion2(UzpVer2 *version) int UzpMain(int argc, char *argv[]); int UzpAltMain(int argc, char *argv[], UzpInit *init); int UzpValidate(char *archive, int AllCodes); void UzpFreeMemBuffer(UzpBuffer *retstr); int UzpUnzipToMemory(char *zip, char *file, UzpOpts *optflgs, UzpCB *UsrFuncts, UzpBuffer *retstr); non-WINDLL only (a special WINDLL variant is defined in windll/windll.c): int UzpGrep(char *archive, char *file, char *pattern, int cmd, int SkipBin, UzpCB *UsrFuncts); OS/2 only (for now): int UzpFileTree(char *name, cbList(callBack), char *cpInclude[], char *cpExclude[]); You must define `DLL' in order to include the API extensions. ---------------------------------------------------------------------------*/ #ifdef OS2 # define INCL_DOSMEMMGR # include #endif #define UNZIP_INTERNAL #include "unzip.h" #ifdef WINDLL # ifdef POCKET_UNZIP # include "wince/intrface.h" # else # include "windll/windll.h" # endif #endif #include "unzvers.h" #include #ifdef DLL /* This source file supplies DLL-only interface code. */ #ifndef POCKET_UNZIP /* WinCE pUnZip defines this elsewhere. */ jmp_buf dll_error_return; #endif /*--------------------------------------------------------------------------- Documented API entry points ---------------------------------------------------------------------------*/ ZCONST UzpVer * UZ_EXP UzpVersion() /* returns pointer to const struct */ { static ZCONST UzpVer version = { /* doesn't change between calls */ /* structure size */ UZPVER_LEN, /* version flags */ #ifdef BETA # ifdef ZLIB_VERSION 3, # else 1, # endif #else # ifdef ZLIB_VERSION 2, # else 0, # endif #endif /* betalevel and date strings */ UZ_BETALEVEL, UZ_VERSION_DATE, /* zlib_version string */ #ifdef ZLIB_VERSION Z+g UNZIP.BCK@ >[UNZIP60]API.C;1&LIB_VERSION, #else NULL, #endif /*== someday each of these may have a separate patchlevel: ==*/ /* unzip version */ {UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, 0}, /* zipinfo version */ {ZI_MAJORVER, ZI_MINORVER, UZ_PATCHLEVEL, 0}, /* os2dll version (retained for backward compatibility) */ {UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, 0}, /* windll version (retained for backward compatibility)*/ {UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, 0}, #ifdef OS2DLL /* os2dll API minimum compatible version*/ {UZ_OS2API_COMP_MAJOR, UZ_OS2API_COMP_MINOR, UZ_OS2API_COMP_REVIS, 0} #else /* !OS2DLL */ #ifdef WINDLL /* windll API minimum compatible version*/ {UZ_WINAPI_COMP_MAJOR, UZ_WINAPI_COMP_MINOR, UZ_WINAPI_COMP_REVIS, 0} #else /* !WINDLL */ /* generic DLL API minimum compatible version*/ {UZ_GENAPI_COMP_MAJOR, UZ_GENAPI_COMP_MINOR, UZ_GENAPI_COMP_REVIS, 0} #endif /* ?WINDLL */ #endif /* ?OS2DLL */ }; return &version; } unsigned UZ_EXP UzpVersion2(UzpVer2 *version) { if (version->structlen != sizeof(UzpVer2)) return sizeof(UzpVer2); #ifdef BETA version->flag = 1; #else version->flag = 0; #endif strcpy(version->betalevel, UZ_BETALEVEL); strcpy(version->date, UZ_VERSION_DATE); #ifdef ZLIB_VERSION /* Although ZLIB_VERSION is a compile-time constant, we implement an "overrun-safe" copy because its actual value is not under our control. */ strncpy(version->zlib_version, ZLIB_VERSION, sizeof(version->zlib_version) - 1); version->zlib_version[sizeof(version->zlib_version) - 1] = '\0'; version->flag |= 2; #else version->zlib_version[0] = '\0'; #endif /* someday each of these may have a separate patchlevel: */ version->unzip.major = UZ_MAJORVER; version->unzip.minor = UZ_MINORVER; version->unzip.patchlevel = UZ_PATCHLEVEL; version->zipinfo.major = ZI_MAJORVER; version->zipinfo.minor = ZI_MINORVER; version->zipinfo.patchlevel = UZ_PATCHLEVEL; /* these are retained for backward compatibility only: */ version->os2dll.major = UZ_MAJORVER; version->os2dll.minor = UZ_MINORVER; version->os2dll.patchlevel = UZ_PATCHLEVEL; version->windll.major = UZ_MAJORVER; version->windll.minor = UZ_MINORVER; version->windll.patchlevel = UZ_PATCHLEVEL; #ifdef OS2DLL /* os2dll API minimum compatible version*/ version->dllapimin.major = UZ_OS2API_COMP_MAJOR; version->dllapimin.minor = UZ_OS2API_COMP_MINOR; version->dllapimin.patchlevel = UZ_OS2API_COMP_REVIS; #else /* !OS2DLL */ #ifdef WINDLL /* windll API minimum compatible version*/ version->dllapimin.major = UZ_WINAPI_COMP_MAJOR; version->dllapimin.minor = UZ_WINAPI_COMP_MINOR; version->dllapimin.patchlevel = UZ_WINAPI_COMP_REVIS; #else /* !WINDLL */ /* generic DLL API minimum compatible version*/ version->dllapimin.major = UZ_GENAPI_COMP_MAJOR; version->dllapimin.minor = UZ_GENAPI_COMP_MINOR; version->dllapimin.patchlevel = UZ_GENAPI_COMP_REVIS; #endif /* ?WINDLL */ #endif /* ?OS2DLL */ return 0; } #ifndef SFX #ifndef WINDLL int UZ_EXP UzpAltMain(int argc, char *argv[], UzpInit *init) { int r, (*dummyfn)(); CONSTRUCTGLOBALS(); if (init->structlen >= (sizeof(ulg) + sizeof(dummyfn)) && init->msgfn) G.message = init->msgfn; if (init->structlen >= (sizeof(ulg) + 2*sizeof(dummyfn)) && init->inputfn) G.input = init->inputfn; if (init->structlen >= (sizeof(ulg) + 3*sizeof(dummyfn)) && init->pausefn) G.mpause = init->pausefn; if (init->structlen >= (sizeof(ulg) + 4*sizeof(dummyfn)) && init->userfn) (*init->userfn)(); /* allow void* arg? */ r = unzip(__G__ argc, argv); DESTROYGLOBALS(); RETURN(r); } #endif /* !WINDLL */ #ifndef __16BIT__ void UZ_EXP UzpFreeMemBuffer(UzpBuffer *retstr) { if (retstr != NULL && retstr->strptr != NULL) { free(retstr->strptr); retstr->strptr = NULL; retstr->strlength = 0; } } #ifndef WINDLL static int UzpDLL_Init OF((zvoid *pG, UzpCB *UsrFuncts)); static int UzpDLL_Init(pG, UsrFuncts) zvoid *pG; UzpCB *UsrFuncts; { int (*dummyfn)(); if (UsrFuncts->structlen >= (sizeof(ulg) + sizeof(dummyfn)) && UsrFuncts->msgfn) ((Uz_Globs *)pG)->message = UsrFuncts->msgfn; else return FALSE; if (UsrFuncts->structlen >= (sizeof(ulg) + 2*sizeof(dummyfn)) && UsrFuncts->inputfn) ((Uz_Globs *)pG)->input = UsrFuncts->inputfn; if (UsrFuncts->structlen >= (sizeof(ulg) + 3*sizeof(dummyfn)) && UsrFuncts->pausefn) ((Uz_Globs *)pG)->mpause = UsrFuncts->pausefn; if (UsrFuncts->structlen >= (sizeof(ulg) + 4*sizeof(dummyfn)) && UsrFuncts->passwdfn) ((Uz_Globs *)pG)->decr_passwd = UsrFuncts->passwdfn; if (UsrFuncts->structlen >= (sizeof(ulg) + 5*sizeof(dummyfn)) && UsrFuncts->statrepfn) ((Uz_Globs *)pG)->statreportcb = UsrFuncts->statrepfn; return TRUE; } int UZ_EXP UzpUnzipToMemory(char *zip, char *file, UzpOpts *optflgs, UzpCB *UsrFuncts, UzpBuffer *retstr) { int r; #if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO)) char *intern_zip, *intern_file; #endif CONSTRUCTGLOBALS(); #if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO)) intern_zip = (char *)malloc(strlen(zip)+1); if (intern_zip == NULL) { DESTROYGLOBALS(); return PK_MEM; } intern_file = (char *)malloc(strlen(file)+1); if (intern_file == NULL) { DESTROYGLOBALS(); free(intern_zip); return PK_MEM; } ISO_TO_INTERN(zip, intern_zip); ISO_TO_INTERN(file, intern_file); # define zip intern_zip # define file intern_file #endif /* Copy those options that are meaningful for UzpUnzipToMemory, instead of * a simple "memcpy(G.UzO, optflgs, sizeof(UzpOpts));" */ uO.pwdarg = optflgs->pwdarg; uO.aflag = optflgs->aflag; uO.C_flag = optflgs->C_flag; uO.qflag = optflgs->qflag; /* currently, overridden in unzipToMemory */ if (!UzpDLL_Init((zvoid *)&G, UsrFuncts)) { DESTROYGLOBALS(); return PK_BADERR; } G.redirect_data = 1; r = (unzipToMemory(__G__ zip, file, retstr) <= PK_WARN); DESTROYGLOBALS(); #if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO)) # undef file # undef zip free(intern_file); free(intern_zip); #endif if (!r && retstr->strlength) { free(retstr->strptr); retstr->strptr = NULL; } return r; } #endif /* !WINDLL */ #endif /* !__16BIT__ */ #ifdef OS2DLL int UZ_EXP UzpFileTree(char *name, cbList(callBack), char *cpInclude[], char *cpExclude[]) { int r; CONSTRUCTGLOBALS(); uO.qflag = 2; uO.vflag = 1; uO.C_flag = 1; G.wildzipfn = name; G.process_all_files = TRUE; if (cpInclude) { char **ptr = cpInclude; while (*ptr != NULL) ptr++; G.filespecs = ptr - cpInclude; G.pfnames = cpInclude, G.process_all_files = FALSE; } if (cpExclude) { char **ptr = cpExclude; while (*ptr != NULL) ptr++; G.xfilespecs = ptr - cpExclude; G.pxnames = cpExclude, G.process_all_files = FALSE; } G.processExternally = callBack; r = process_zipfiles(__G)==0; DESTROYGLOBALS(); return r; } #endif /* OS2DLL */ #endif /* !SFX */ /*--------------------------------------------------------------------------- Helper functions ---------------------------------------------------------------------------*/ void setFileNotFound(__G) ,A} vsxfcEADME%;1Cvd PDe #lLth WB_R%GO5]8U O$"<,S$!9],~BL @VT Qhu`" TAu NPI_PQ?ev J[HK%5;]ui{BrsF8;!!3RUg/\mBx|.+]9:/unxm a,e~w5ZHNv*r3jen{*`lKe/J N[t 8Q-x eNvM4GIcST2v&KVX  N Z3w1yh}e8@/#v&>#WAdCL%IJIefk?e.^01 %z{& nnd 0 | YMtu W0\9 M =XvBg-=(^=+N [}8F_a#9BVM*_U \^3.i7!yv(54paxTr+UP/C# "<sA1&xE40?=xn(Ba;k <2l_O~# d4iMdL>6M_jsKeH/wex)(ze|X[L V y]XGT[60[ P8A 5+{$Z9\ kna g (5K>,P5t?`e*D[A.XzlQ*DV4T#Z%RNoZBIAGs6e[XGb na4W2 92~K+VPA ,Wh'c:Bh}({JX'WvwXp61yh{jC3](eqhbE6r$,28Y<i)NghSUX oB@DJG[lOWF): LOxKbYFkVTiey@_mYo1xQ}|MCMJ* 9S[qNUYVZ[!_k oql2 q "I} <3E+ ??!LF>MFV: >P[mzo L&=7{V4 ~g|-1``3{T~X]7Q aj^1&ZT 7< T( V\NK/A  WITdN0h\]*WtUXo3@1yRS17 R;z 1HL{=j)VI$H xC7.'qId?[xxS'spa OQ0p>%mKT^/ V-cY-UbZk[#Q&`(WL"D' Q@\FvKST/u9]?\ LIomz'(t G6& HlAHud:%UJ G[ @- Gm z,;eqhvy: #0w&_d(SYQCNJ+^ VkuA)072SPid_Lzi0ecPj+th?9y^p+x+W0>Qj `ujy_'Oyvu6|_.\3!U^9^$uykN*>fx-3g()RmOVhrxMm$B`-"Tmi7 udM9.cOp8xz#5m2mGs{ PyoL0OkI4Tzj{">=2s9A8BygI63sq"}FAZwzfr|2adp+Wz&bvNN Aa,\@Y D,=8CMyj_ }zOfP4Rp$-m*Eo/Ax^6Snwi/**`_gMpT\bpf.+D;mw'8:3jr8(z"dz*c !>x. *5ETcod;{}fb\P5O _.mqbCM%B_ 3y8I1}lkyq:!&dlw2OJo WoDZTe6T w`D9?9%R=<;P2J40)E_~5lR~O!yJ67UM3@7FPRY nKGw-[y!g6!Gy[|K#ITG[~[HjBUPReyuS )O;Y@T-Ju"2+< B&pX@))kUKL rgkz\cMK{tN;ptj|*NSF"Wf'hV_yA];TVXeDX0tHqD5C;XuZ)9q{N} (^GY0KU]!ukZ$t<"|ayea+fm+'MSYm/<>)[rXz^{k_4tNY/'W |&88DEe7ESfW!`^ADr< a(dZ|X"y<2,8Y~W$[Jwi$jY+iW; \ -dFW<\@U>_'z@ G-+Qg6'$bmAmq~'s!Nu<,DMRyUtcm*3#!*.IW\OEOO0[k 1Bz4W~^ "=T{oI4v7ZHB]It6rM~;Zz ]NZYD'r/Mk6/SJpTFE.EA/Pa2`ZkMsEm+"AH4%=P? <6lZ6T3QDA,G]?xY*G^-zEIbb4~#t|Cj^;aa j :Lj#Nocm 2^R`GDao&*o_>]m4h5sD:^3x%Pc"UMrY%@ZV/>u*~5dbUg^;[9sn.g~=5eK 3rDwf#1 sGAM MTmHe{B[0)0I&MB1HK?rgA)qZui%clJP+B 1i ?q;35b39aJTfI^+t,1:D5sZUJ9t;\LY^`>Ha/ GWN gX s`W,inef1/lU<] AwD.q++5C\p9j3 ^BR)J&v=;'+Oj ;l0jd_&J%6*OXH-/x9J}#SyXumCPL<RHW TJrrMshH|8XD@4k$5$9WcHO,ACh)RN)w GiyD#uUAT4P [P#4Fe6OJaIan|AYZkCdx(r0:s{^~BAl^O[+Q:n?6dNgm%gQ8Bu^H4|ztG% 6w><=m=x2tS3hr"f@ wTG^iL(s).p*492'I8}[:5{0# i h v\Sj6 Zq- L_h6"{w+ h|! ZR,,XKe+lA/*,KF14|)ab8O!0='i62;czQ@s#!3]5zBw9hSK.'4(b\BPLU]s97w-^zWi:,f}w%*7P!'[99t Ui+X'*(Pj*H'i? 6n"@L*n}+asmnL~:c9fgy61RnU>4WsC2?yST-IQl}V`)b+I qFMv"_"}UtT+qO}c@h; GiP.,x04f-$u`n6C|:# Eh*`] x'ߎ@9r3U)q71 C2 []U!K Jh>^h-tn1/+jM ѡ+J ]]f%}J2 w]Uro4|l5,=6ufD2`U?g\ue* 0oq0Hw'_:0(f`"x! Uij &o}NHW_t7b5 ZF|SM[v7SLx1M-z|pC C!-uy&^WyH,kGae)>wt6[H d%x**,3>Gbfq%#Xg_irP<1a-wf:gZI/C9buSrVbT3pL/P."w96C Y'o,D|#+sXf-W[F {G/M|Hh.ejUfUizX0*C2O7<k$ 1nX0G ~Y>=; QMs#I!m9- Qw(OFRcn03sZwWtQmcF)o32m+W (D>Q# D ,qt~OGa%|#9 k0zfR_z;{`Pt&Ra>klyKP?s+m#) ]?Ve*_SL Y,!`MMߦN;3;_ v/eQ8`1E 7P&k4a[Okd7epiQ&=b?%XuZc\![S72~ |%m}K].I8GV \EIkY><_'\Tt%TS ;@KZWPwgzj`r;1rG?7"z(yH)n{LO6.6 JH8%X LgiTa@1hS^;aD 3YDF1 4}OcW?," :B*uK2AWq=E V~h)X6Hd!5J2z .fz#R\ZRe !>uNV`VT\ZO}2p 3}^D ]MMAGJ*x `<6tH6d\}pT6=,W!ABSh>]CHA) d%&O$dvG\)c.x1RP3Bzkq9KI:-I{:H>T|,yaZ7W4RS Bqx~.o} >m)PM+O@_*UoeDp(KU=1ycs`(RVZ }FZYH)q^Q.XKY]~FgC@L[M 0c_v (1*TA@dR^ai@z( Scq@#A)\eEDsdxU`fidz&8tz712Pj BWJTEMQ1y dl]gg>jbn8jL4Er8%mW&($d,f!W-OVx<]uhOr 2WVmU2 'MmWejalbg$58g&qQ`| v O\C+-?R3H 2[ 2oVZ.f5#QTuOv}M {sm#Vx*]F !*)M] ~w/32Q QUYlJ9?YmzB7RsqRMNU:\U60kSm=REaUVRXZH jV@rfkjH*)v$o?WY'agB8q27%1.TuaP}J0[GOd^3$Qg +&"S`tsd$r!Gm " &cw{9"l,3xF:+ DN$=rwt !NoSW8:M6ht5co2"fFK` TmG\ EoA$S@ l7AoOvW+H~= XT,FY/fPx6E:,^jJW5 "]Dp`qA!Om-7 VA,sQssgaU6EsM*?/#Q"-?( 3?_ @3HFL{>uTj/qoL%PC?,P<9A. }!'Y-6Z/Dg{U?L:;~+&&k{S`3s:OM*|=aPvNv'QB(Z HtBm*?Q~.|>qL|W=uQhG]f@e*EU(Gf :o>g {|&`;ouu|(RSYqE'1 epJAz~k73-R+KMd"q,zifOLTF: iZKwUa,_gQXx1Irn(K }RfR:?[xjq@!&Cw WG'd2|pDv>0VR~>pJ]< m $RLg.}Q[#{BGl}5K@AZ2es+:5 6!`t$Az5lFjua1rOq~qk;sM60H@"-ZGv8xiT$fAGUQr+5[TLfemQLRLteE0+#D"!iXNWhg*R/2F!l ='r\TnI/!@Nf;< J$(.y~&;[PgV(II|\v ~9I$y\qA!A% +'b&i&#UDn,%=\6JC8B!"gCDKzj) TFBeZ3Xq_p.$|wP8Z@e=l=mwHoKq?x;`B6# T B_[ 3]LAC*OyHET{ KFl9rdx0x{ Q.w/~s|R"$xGd6C7he-dOh:4.{pDL62@=IXckYH?j":pu~nb- y-=vy '0C) xo]Z`!jULGNT)<m4oZ&tmQ Ge YYbg4\Z[dJ{VW4f4tNDN[f 6su'nxZh#A=jAGqX^LXSU$C:/1;^^BcDNT$RMT+eFiS=g$#WrpPyqm?`k|xr7kilkEu!l18;h;mlyZcRCk}b; awF5) "AJ XO>{wwNj3\5;5ut%*~d1h{pIt(j?7:%1y7yg&o*_^c\w6Q\YZ?|avj;7 B5 Jnurz21(^N< /,mEu/;r*5;y}c;e<3 i<.7%}.{9f*%;D*yo:vo#`q"R &!,)!mIg%~uF eQW]K8JO V(dlLR,(rQ  6  IJu,Bkr.r%& ?tw \&)_+MZE@#bBci/: ${fgM-vp]'i-P a)eWbg0gvU+T/aa G/sa R2yCSggu9D;,:iql7z@TX9360 L1@?E)x8I1>1 HOEFxFsfH/v- 5'T6XQ'U5(cW`? I1jxRVFG5MC`1OU\CV5; (@ 1RH}yeIݰK?f"h.q[UNZIP60]API.C;1& __GDEF { G.filenotfound++; } #ifndef SFX int unzipToMemory(__GPRO__ char *zip, char *file, UzpBuffer *retstr) { int r; char *incname[2]; if ((zip == NULL) || (strlen(zip) > ((WSIZE>>2) - 160))) return PK_PARAM; if ((file == NULL) || (strlen(file) > ((WSIZE>>2) - 160))) return PK_PARAM; G.process_all_files = FALSE; G.extract_flag = TRUE; uO.qflag = 2; G.wildzipfn = zip; G.pfnames = incname; incname[0] = file; incname[1] = NULL; G.filespecs = 1; r = process_zipfiles(__G); if (retstr) { retstr->strptr = (char *)G.redirect_buffer; retstr->strlength = G.redirect_size; } return r; /* returns `PK_???' error values */ } #endif /* !SFX */ /* With the advent of 64 bit support, for now I am assuming that if the size of the file is greater than an unsigned long, there will simply not be enough memory to handle it, and am returning FALSE. */ int redirect_outfile(__G) __GDEF { #ifdef ZIP64_SUPPORT __int64 check_conversion; #endif if (G.redirect_size != 0 || G.redirect_buffer != NULL) return FALSE; #ifndef NO_SLIDE_REDIR G.redirect_slide = !G.pInfo->textmode; #endif #if (lenEOL != 1) if (G.pInfo->textmode) { G.redirect_size = (ulg)(G.lrec.ucsize * lenEOL); if (G.redirect_size < G.lrec.ucsize) G.redirect_size = (ulg)((G.lrec.ucsize > (ulg)-2L) ? G.lrec.ucsize : -2L); #ifdef ZIP64_SUPPORT check_conversion = G.lrec.ucsize * lenEOL; #endif } else #endif { G.redirect_size = (ulg)G.lrec.ucsize; #ifdef ZIP64_SUPPORT check_conversion = (__int64)G.lrec.ucsize; #endif } #ifdef ZIP64_SUPPORT if ((__int64)G.redirect_size != check_conversion) return FALSE; #endif #ifdef __16BIT__ if ((ulg)((extent)G.redirect_size) != G.redirect_size) return FALSE; #endif #ifdef OS2 DosAllocMem((void **)&G.redirect_buffer, G.redirect_size+1, PAG_READ|PAG_WRITE|PAG_COMMIT); G.redirect_pointer = G.redirect_buffer; #else G.redirect_pointer = G.redirect_buffer = malloc((extent)(G.redirect_size+1)); #endif if (!G.redirect_buffer) return FALSE; G.redirect_pointer[G.redirect_size] = '\0'; return TRUE; } int writeToMemory(__GPRO__ ZCONST uch *rawbuf, extent size) { int errflg = FALSE; if ((uch *)rawbuf != G.redirect_pointer) { extent redir_avail = (G.redirect_buffer + G.redirect_size) - G.redirect_pointer; /* Check for output buffer overflow */ if (size > redir_avail) { /* limit transfer data to available space, set error return flag */ size = redir_avail; errflg = TRUE; } memcpy(G.redirect_pointer, rawbuf, size); } G.redirect_pointer += size; return errflg; } int close_redirect(__G) __GDEF { if (G.pInfo->textmode) { *G.redirect_pointer = '\0'; G.redirect_size = (ulg)(G.redirect_pointer - G.redirect_buffer); if ((G.redirect_buffer = realloc(G.redirect_buffer, G.redirect_size + 1)) == NULL) { G.redirect_size = 0; return EOF; } } return 0; } #ifndef SFX #ifndef __16BIT__ #ifndef WINDLL /* Purpose: Determine if file in archive contains the string szSearch Parameters: archive = archive name file = file contained in the archive. This cannot be a wildcard to be meaningful pattern = string to search for cmd = 0 - case-insensitive search 1 - case-sensitve search 2 - case-insensitive, whole words only 3 - case-sensitive, whole words only SkipBin = if true, skip any files that have control characters other than CR, LF, or tab in the first 100 characters. Returns: TRUE if a match is found FALSE if no match is found -1 on error Comments: This does not pretend to be as useful as the standard Unix grep, which returns the strings associated with a particular pattern, nor does it search past the first matching occurrence of the pattern. */ int UZ_EXP UzpGrep(char *archive, char *file, char *pattern, int cmd, int SkipBin, UzpCB *UsrFuncts) { int retcode = FALSE, compare; ulg i, j, patternLen, buflen; char * sz, *p; UzpOpts flgopts; UzpBuffer retstr; memzero(&flgopts, sizeof(UzpOpts)); /* no special options */ if (!UzpUnzipToMemory(archive, file, &flgopts, UsrFuncts, &retstr)) { return -1; /* not enough memory, file not found, or other error */ } if (SkipBin) { if (retstr.strlength < 100) buflen = retstr.strlength; else buflen = 100; for (i = 0; i < buflen; i++) { if (iscntrl(retstr.strptr[i])) { if ((retstr.strptr[i] != 0x0A) && (retstr.strptr[i] != 0x0D) && (retstr.strptr[i] != 0x09)) { /* OK, we now think we have a binary file of some sort */ free(retstr.strptr); return FALSE; } } } } patternLen = strlen(pattern); if (retstr.strlength < patternLen) { free(retstr.strptr); return FALSE; } sz = malloc(patternLen + 3); /* add two in case doing whole words only */ if (cmd > 1) { strcpy(sz, " "); strcat(sz, pattern); strcat(sz, " "); } else strcpy(sz, pattern); if ((cmd == 0) || (cmd == 2)) { for (i = 0; i < strlen(sz); i++) sz[i] = toupper(sz[i]); for (i = 0; i < retstr.strlength; i++) retstr.strptr[i] = toupper(retstr.strptr[i]); } for (i = 0; i < (retstr.strlength - patternLen); i++) { p = &retstr.strptr[i]; compare = TRUE; for (j = 0; j < patternLen; j++) { /* We cannot do strncmp here, as we may be dealing with a * "binary" file, such as a word processing file, or perhaps * even a true executable of some sort. */ if (p[j] != sz[j]) { compare = FALSE; break; } } if (compare == TRUE) { retcode = TRUE; break; } } free(sz); free(retstr.strptr); return retcode; } #endif /* !WINDLL */ #endif /* !__16BIT__ */ int UZ_EXP UzpValidate(char *archive, int AllCodes) { int retcode; CONSTRUCTGLOBALS(); uO.jflag = 1; uO.tflag = 1; uO.overwrite_none = 0; G.extract_flag = (!uO.zipinfo_mode && !uO.cflag && !uO.tflag && !uO.vflag && !uO.zflag #ifdef TIMESTAMP && !uO.T_flag #endif ); uO.qflag = 2; /* turn off all messages */ G.fValidate = TRUE; G.pfnames = (char **)&fnames[0]; /* assign default filename vector */ if (archive == NULL) { /* something is screwed up: no filename */ DESTROYGLOBALS(); retcode = PK_NOZIP; goto exit_retcode; } if (strlen(archive) >= FILNAMSIZ) { /* length of supplied archive name exceed the system's filename limit */ DESTROYGLOBALS(); retcode = PK_PARAM; goto exit_retcode; } G.wildzipfn = (char *)malloc(FILNAMSIZ);.=%_ UNZIP.BCK@ >[UNZIP60]API.C;1&^$ strcpy(G.wildzipfn, archive); #if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO)) _ISO_INTERN(G.wildzipfn); #endif #ifdef WINDLL Wiz_NoPrinting(TRUE); #endif G.process_all_files = TRUE; /* for speed */ if (setjmp(dll_error_return) != 0) { #ifdef WINDLL Wiz_NoPrinting(FALSE); #endif free(G.wildzipfn); DESTROYGLOBALS(); retcode = PK_BADERR; goto exit_retcode; } retcode = process_zipfiles(__G); free(G.wildzipfn); #ifdef WINDLL Wiz_NoPrinting(FALSE); #endif DESTROYGLOBALS(); /* PK_WARN == 1 and PK_FIND == 11. When we are just looking at an archive, we should still be able to see the files inside it, even if we can't decode them for some reason. We also still want to be able to get at files even if there is something odd about the zip archive, hence allow PK_WARN, PK_FIND, IZ_UNSUP as well as PK_ERR */ exit_retcode: if (AllCodes) return retcode; if ((retcode == PK_OK) || (retcode == PK_WARN) || (retcode == PK_ERR) || (retcode == IZ_UNSUP) || (retcode == PK_FIND)) return TRUE; else return FALSE; } #endif /* !SFX */ #endif /* DLL */ *[UNZIP60]APIHELP.C;1+,V s. / 4 $@->0123KPWO 56v7v89GHJ/* Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* apihelp.c */ #ifdef API_DOC #define UNZIP_INTERNAL #include "unzip.h" #include "unzvers.h" APIDocStruct APIDoc[] = { { "UZPVERSION" , "UzpVersion" , "UzpVer *UzpVersion(void);", "Get version numbers of the API and the underlying UnZip code.\n\n" "\t\tThis is used for comparing the version numbers of the run-time\n" "\t\tDLL code with those expected from the unzip.h at compile time.\n" "\t\tIf the version numbers do not match, there may be compatibility\n" "\t\tproblems with further use of the DLL.\n\n" " Example:\t/* Check the major version number of the DLL code. */\n" "\t\tUzpVer *pVersion;\n" "\t\tpVersion = UzpVersion();\n" "\t\tif (pVersion->unzip.major != UZ_MAJORVER)\n" "\t\t fprintf(stderr, \"error: using wrong version of DLL\\n\");\n\n" "\t\tSee unzip.h for details and unzipstb.c for an example.\n" }, { "UZPMAIN" , "UzpMain" , "int UzpMain(int argc, char *argv[]);", "Provide a direct entry point to the command line interface.\n\n" "\t\tThis is used by the UnZip stub but you can use it in your\n" "\t\town program as well. Output is sent to stdout.\n" "\t\t0 on return indicates success.\n\n" " Example:\t/* Extract 'test.zip' silently, junking paths. */\n" "\t\tchar *argv[] = { \"-q\", \"-j\", \"test.zip\" };\n" "\t\tint argc = 3;\n" "\t\tif (UzpMain(argc,argv))\n" "\t\t printf(\"error: unzip failed\\n\");\n\n" "\t\tSee unzip.h for details.\n" }, { "UZPALTMAIN" , "UzpAltMain" , "int UzpAltMain(int argc, char *argv[], UzpInit *init);", "Provide a direct entry point to the command line interface,\n" "optionally installing replacement I/O handler functions.\n\n" "\t\tAs with UzpMain(), output is sent to stdout by default.\n" "\t\t`InputFn *inputfn' is not yet implemented. 0 on return\n" "\t\tindicates success.\n\n" " Example:\t/* Replace normal output and `more' functions. */\n" "\t\tchar *argv[] = { \"-q\", \"-j\", \"test.zip\" };\n" "\t\tint argc = 3;\n" "\t\tUzpInit init = { 16, MyMessageFn, NULL, MyPauseFn };\n" "\t\tif (UzpAltMain(argc,argv,&init))\n" "\t\t printf(\"error: unzip failed\\n\");\n\n" "\t\tSee unzip.h for details.\n" }, { "UZPUNZIPTOMEMORY", "UzpUnzipToMemory", "int UzpUnzipToMemory(char *zip, char *file, UzpBuffer *retstr);", "Pass the name of the zip file and the name of the file\n" "\t\tyou wish to extract. UzpUnzipToMemory will create a\n" "\t\tbuffer and return it in *retstr; 0 on return indicates\n" "\t\tfailure.\n\n" "\t\tSee unzip.h for details.\n" }, { "UZPFILETREE", "UzpFileTree", "int UzpFileTree(char *name, cbList(callBack),\n" "\t\t\tchar *cpInclude[], char *cpExclude[]);", "Pass the name of the zip file, a callback function, an\n" "\t\tinclude and exclude file list. UzpFileTree calls the\n" "\t\tcallback for each valid file found in the zip file.\n" "\t\t0 on return indicates failure.\n\n" "\t\tSee unzip.h for details.\n" }, { 0 } }; static int function_help OF((__GPRO__ APIDocStruct *doc, char *fname)); static int function_help(__G__ doc, fname) __GDEF APIDocStruct *doc; char *fname; { strcpy(slide, fname); /* strupr(slide); non-standard */ while (doc->compare && STRNICMP(doc->compare,slide,strlen(fname))) doc++; if (!doc->compare) return 0; else Info(slide, 0, ((char *)slide, " Function:\t%s\n\n Syntax:\t%s\n\n Purpose:\t%s", doc->function, doc->syntax, doc->purpose)); return 1; } void APIhelp(__G__ argc, argv) __GDEF int argc; char **argv; { if (argc > 1) { struct APIDocStruct *doc; if (function_help(__G__ APIDoc, argv[1])) return; #ifdef SYSTEM_API_DETAILS if (function_help(__G__ SYSTEM_API_DETAILS, argv[1])) return; #endif Info(slide, 0, ((char *)slide, "%s is not a documented command.\n\n", argv[1])); } Info(slide, 0, ((char *)slide, "\ This API provides a number of external C and REXX functions for handling\n\ zipfiles in OS/2. Programmers are encouraged to expand this API.\n\ \n\ C functions: -- See unzip.h for details\n\ UzpVer *UzpVersion(void);\n\ int UzpMain(int argc, char *argv[]);\n\ int UzpAltMain(int argc, char *argv[], UzpInit *init);\n\ int UzpUnzipToMemory(char *zip, char *file, UzpBuffer *retstr);\n\ int UzpFileTree(char *name, cbList(callBack),\n\ char *cpInclude[], char *cpExclude[]);\n\n")); #ifdef SYSTEM_API_BRIEF Info(slide, 0, ((char *)slide, SYSTEM_API_BRIEF)); #endif Info(slide, 0, ((char *)slide, "\nFor more information, type 'unzip -A '\n")); } #endif /* API_DOC */ *[UNZIP60]ATARI.DIR;1+,./ 4->0123 KPWO56Oȫ7Oȫ89GHJI/^> UNZIP.BCK>[UNZIP60]ATARI.DIR;1fATARI.C ; CONTENTS. MAKEFILE.( MAKEFILE.OLD MAKE_UNZ.MUPB README.OLD*[UNZIP60.ATARI]ATARI.C;1+, ;.K/ 4KK@-0123KPWOL56789GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- atari.c Atari-specific routines for use with Info-ZIP's UnZip 5.1 and later. Contains: readdir() do_wild() <-- generic enough to put in fileio.c? mapattr() mapname() checkdir() mkdir() close_outfile() stamp_file() [optional feature] version() Due to the amazing MiNT library being very, very close to BSD unix's library, I'm using the unix.c as a base for this. Note: If you're not going to compile this with the MiNT libraries (for GNU C, Turbo C, Pure C, Lattice C, or Heat & Serve C), you're going to be in for some nasty work. Most of the modifications in this file were made by Chris Herborth (cherborth@semprini.waterloo-rdp.on.ca) and /should/ be marked with [cjh]. ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #include /* MiNTlibs has dirent [cjh] */ static int created_dir; /* used in mapname(), checkdir() */ static int renamed_fullpath; /* ditto */ #ifndef SFX /**********************/ /* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */ /**********************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { static DIR *wild_dir = (DIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; struct dirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!notfirstcall) { /* first call: must initialize everything */ notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; have_dirname = FALSE; dir = NULL; return matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((wildname = strrchr(wildspec, '/')) == (ZCONST char *)NULL) { dirname = "."; dirnamelen = 1; have_dirname = FALSE; wildname = wildspec; } else { ++wildname; /* point at character after '/' */ dirnamelen = wildname - wildspec; if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) { Info(slide, 0x201, ((char *)slide, "warning: cannot allocate wildcard buffers\n")); strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; /* but maybe filespec was not a wildcard */ } strncpy(dirname, wildspec, dirnamelen); dirname[dirnamelen] = '\0'; /* terminate for strcpy below */ have_dirname = TRUE; } if ((wild_dir = opendir(dirname)) != (DIR *)NULL) { while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", file->d_name)); if (file->d_name[0] == '.' && wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ /* Need something here for TOS filesystem? [cjh] */ if (match(file->d_name, wildname, 0 WISEP) && /* 0=case sens.*/ /* skip "." and ".." directory entries */ strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); if (have_dirname) { strcpy(matchname, dirname); strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } /* if we get to here directory is exhausted, so close it */ closedir(wild_dir); wild_dir = (DIR *)NULL; } /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (wild_dir == (DIR *)NULL) { notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { /* May need special TOS handling here. [cjh] */ Trace((stderr, "do_wild: readdir returns %s\n", file->d_name)); if (file->d_name[0] == '.' && wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, wildname, 0 WISEP)) { /* 0 = case sens. */ Trace((stderr, "do_wild: match() succeeds\n")); if (have_dirname) { /* strcpy(matchname, dirname); */ strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } closedir(wild_dir); /* have read at least one entry; nothing left */ wild_dir = (DIR *)NULL; notfirstcall = FALSE; /* reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) __GDEF { int r; ulg tmp = G.crec.external_file_attributes; G.pInfo->file_att05 UNZIP.BCK ;[UNZIP60.ATARI]ATARI.C;1K&r = 0; /* initialized to 0 for check in "default" branch below... */ switch (G.pInfo->hostnum) { case AMIGA_: tmp = (unsigned)(tmp>>17 & 7); /* Amiga RWE bits */ G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp); break; case THEOS_: tmp &= 0xF1FFFFFFL; if ((tmp & 0xF0000000L) != 0x40000000L) tmp &= 0x01FFFFFFL; /* not a dir, mask all ftype bits */ else tmp &= 0x41FFFFFFL; /* leave directory bit as set */ /* fall through! */ case UNIX_: case VMS_: case ACORN_: case ATARI_: case ATHEOS_: case BEOS_: case QDOS_: case TANDEM_: r = FALSE; G.pInfo->file_attr = (unsigned)(tmp >> 16); if (G.pInfo->file_attr == 0 && G.extra_field) { /* Some (non-Info-ZIP) implementations of Zip for Unix and * VMS (and probably others ??) leave 0 in the upper 16-bit * part of the external_file_attributes field. Instead, they * store file permission attributes in some extra field. * As a work-around, we search for the presence of one of * these extra fields and fall back to the MSDOS compatible * part of external_file_attributes if one of the known * e.f. types has been detected. * Later, we might implement extraction of the permission * bits from the VMS extra field. But for now, the work-around * should be sufficient to provide "readable" extracted files. * (For ASI Unix e.f., an experimental remap of the e.f. * mode value IS already provided!) */ ush ebID; unsigned ebLen; uch *ef = G.extra_field; unsigned ef_len = G.crec.extra_field_length; while (!r && ef_len >= EB_HEADSIZE) { ebID = makeword(ef); ebLen = (unsigned)makeword(ef+EB_LEN); if (ebLen > (ef_len - EB_HEADSIZE)) /* discoverd some e.f. inconsistency! */ break; switch (ebID) { case EF_ASIUNIX: if (ebLen >= (EB_ASI_MODE+2)) { G.pInfo->file_attr = (unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE)); /* force stop of loop: */ ef_len = (ebLen + EB_HEADSIZE); break; } /* else: fall through! */ case EF_PKVMS: /* "found nondecypherable e.f. with perm. attr" */ r = TRUE; default: break; } ef_len -= (ebLen + EB_HEADSIZE); ef += (ebLen + EB_HEADSIZE); } } if (!r) { #ifdef SYMLINKS /* Check if the file is a (POSIX-compatible) symbolic link. * We restrict symlink support to those "made-by" hosts that * are known to support symbolic links. */ G.pInfo->symlink = S_ISLNK(G.pInfo->file_attr) && SYMLINK_HOST(G.pInfo->hostnum); #endif return 0; } /* fall through! */ /* all remaining cases: expand MSDOS read-only bit into write perms */ case FS_FAT_: /* PKWARE's PKZip for Unix marks entries as FS_FAT_, but stores the * Unix attributes in the upper 16 bits of the external attributes * field, just like Info-ZIP's Zip for Unix. We try to use that * value, after a check for consistency with the MSDOS attribute * bits (see below). */ G.pInfo->file_attr = (unsigned)(tmp >> 16); /* fall through! */ case FS_HPFS_: case FS_NTFS_: case MAC_: case TOPS20_: default: /* Ensure that DOS subdir bit is set when the entry's name ends * in a '/'. Some third-party Zip programs fail to set the subdir * bit for directory entries. */ if ((tmp & 0x10) == 0) { extent fnlen = strlen(G.filename); if (fnlen > 0 && G.filename[fnlen-1] == '/') tmp |= 0x10; } /* read-only bit --> write perms; subdir bit --> dir exec bit */ tmp = !(tmp & 1) << 1 | (tmp & 0x10) >> 4; if ((G.pInfo->file_attr & 0700) == (unsigned)(0400 | tmp<<6)) { /* keep previous G.pInfo->file_attr setting, when its "owner" * part appears to be consistent with DOS attribute flags! */ #ifdef SYMLINKS /* Entries "made by FS_FAT_" could have been zipped on a * system that supports POSIX-style symbolic links. */ G.pInfo->symlink = S_ISLNK(G.pInfo->file_attr) && (G.pInfo->hostnum == FS_FAT_); #endif return 0; } G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp); break; } /* end switch (host-OS-created-by) */ /* for originating systems with no concept of "group," "other," "system": */ umask( (int)(tmp=umask(0)) ); /* apply mask to expanded r/w(/x) perms */ G.pInfo->file_attr &= ~tmp; return 0; } /* end function mapattr() */ /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ #ifdef ACORN_FTYPE_NFS char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */ RO_extra_block *ef_spark; /* pointer Acorn FTYPE ef block */ #endif int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels on Atari */ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); created_dir = FALSE; /* not yet */ /* user gave full pathname: don't prepend rootpath */ renamed_fullpath = (renamed && (*G.filename == '/')); if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM) return MPN_NOMEM; /* initialize path buffer, unless no memory */ *pathcomp = '\0'; /* initialize trans1 UNZIP.BCK ;[UNZIP60.ATARI]ATARI.C;1Kllation buffer */ pp = pathcomp; /* point to translation buffer */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; *pp++ = ';'; /* keep for now; remove VMS ";##" */ break; /* later, if requested */ #ifdef ACORN_FTYPE_NFS case ',': /* NFS filetype extension */ lastcomma = pp; *pp++ = ','; /* keep for now; may need to remove */ break; /* later, if requested */ #endif #ifdef MTS case ' ': /* change spaces to underscore under */ *pp++ = '_'; /* MTS; leave as spaces under Unix */ break; #endif default: /* allow European characters in filenames: */ if (isprint(workch) || (128 <= workch && workch <= 254)) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %s\n", FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } /* On UNIX (and compatible systems), "." and ".." are reserved for * directory navigation and cannot be used as regular file names. * These reserved one-dot and two-dot names are mapped to "_" and "__". */ if (strcmp(pathcomp, ".") == 0) *pathcomp = '_'; else if (strcmp(pathcomp, "..") == 0) strcpy(pathcomp, "__"); #ifdef ACORN_FTYPE_NFS /* translate Acorn filetype information if asked to do so */ if (uO.acorn_nfs_ext && (ef_spark = (RO_extra_block *) getRISCOSexfield(G.extra_field, G.lrec.extra_field_length)) != (RO_extra_block *)NULL) { /* file *must* have a RISC OS extra field */ long ft = (long)makelong(ef_spark->loadaddr); /*32-bit*/ if (lastcomma) { pp = lastcomma + 1; while (isxdigit((uch)(*pp))) ++pp; if (pp == lastcomma+4 && *pp == '\0') *lastcomma='\0'; /* nuke */ } if ((ft & 1<<31)==0) ft=0x000FFD00; sprintf(pathcomp+strlen(pathcomp), ",%03x", (int)(ft>>8) & 0xFFF); } #endif /* ACORN_FTYPE_NFS */ if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ #if 0 /*========== NOTES ==========*/ extract-to dir: a:path/ buildpath: path1/path2/ ... (NULL-terminated) pathcomp: filename mapname(): loop over chars in zipfile member name checkdir(path component, COMPONENT | CREATEDIR) --> map as required? (d:/tmp/unzip/) (disk:[tmp.unzip.) (d:/tmp/unzip/jj/) (disk:[tmp.unzip.jj.) (d:/tmp/unzip/jj/temp/) (disk:[tmp.unzip.jj.temp.) finally add filename itself and check for existence? (could use with rename) (d:/tmp/unzip/jj/temp/msg.outdir) (disk:[tmp.unzip.jj.temp]msg.outdir) checkdir(name, GETPATH) --> copy path to name and free space #endif /* 0 */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { static int rootlen = 0; /* length of rootpath */ static char *rootpath; /* user's "extract-to" directory */ static char *buildpath; /* full path (so far) to extracted file */ static char *end; /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ----------------------------------------28m, UNZIP.BCK ;[UNZIP60.ATARI]ATARI.C;1KU,-----------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; /* SHORT_NAMES required for TOS, but it has to co-exist for minix fs... [cjh] */ #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') ++end; /* SHORT_NAMES required for TOS, but it has to co-exist for minix fs... [cjh] */ #ifdef SHORT_NAMES /* path components restricted to 14 chars, typically */ if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(end = old_end + FILENAME_MAX) = '\0'; #endif /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ if ((end-buildpath) > FILNAMSIZ-3) /* need '/', one-char name, '\0' */ too_long = TRUE; /* check if extracting directory? */ if (stat(buildpath, &G.statbuf)) { /* path doesn't exist */ if (!G.create_dirs) { /* told not to create (freshening) */ free(buildpath); return MPN_INF_SKIP; /* path doesn't exist: nothing to do */ } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (mkdir(buildpath, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ unable to process %s.\n", FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n\ unable to process %s.\n", FnFilter2(buildpath), FnFilter(G.filename))); free(buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *end++ = '/'; *end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(buildpath); buildpath = end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { /* SHORT_NAMES required for TOS, but it has to co-exist for minix fs... [cjh] */ #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') { ++end; /* SHORT_NAMES required for TOS, but it has to co-exist for minix fs... [cjh] */ #ifdef SHORT_NAMES /* truncate name at 14 characters, typically */ if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(end = old_end + FILENAME_MAX) = '\0'; #endif if ((end-buildpath) >= FILNAMSIZ) { *--end = '\0'; Info(slide, 0x201, ((char *)slide, "checkdir warning: path too long; truncating\n\ %s\n -> %s\n", FnFilter1(G.filename), FnFilter2(buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ /* GRR: for VMS and TOPS-20, add up to 13 to strlen */ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); #ifdef ACORN_FTYPE_NFS if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+ (uO.acorn_nfs_ext ? 5 : 1))) #else if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+1)) #endif == (char *)NULL) return MPN_NOMEM; if ((rootlen > 0) && !renamed_fullpath) { strcpy(buildpath, rootpath); end = buildpath + rootlen; } else { *buildpath = '\0'; end = buildpath; } Trace((stderr, "[%s]\n", FnFilter1(buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if necessary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", pathcomp)); if (pathcomp == (char *)NULL) { rootlen = 0; return MPN_OK; } if (rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((rootlen = strlen(pathcomp)) > 0) { char *tmproot; if ((tmproot = (char *)malloc(rootlen+2)) == (char *)NULL) { rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (tmproot[rootlen-1] == '/') { tmproot[--rootlen] = '\0'; } if (rootlen > 0 && (stat(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode))) { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); rootlen = 0; /* skip (or treat as stored file) */ return MPN_INF_SKIP; } /* create the directory (could add loop here scanning tmproot * to create more than one 3< UNZIP.BCK ;[UNZIP60.ATARI]ATARI.C;1KU;level, but why really necessary?) */ if (mkdir(tmproot, 0777) == -1) { Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n", FnFilter1(tmproot))); free(tmproot); rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdir levels required */ return MPN_ERR_SKIP; } } tmproot[rootlen++] = '/'; tmproot[rootlen] = '\0'; if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) { free(tmproot); rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (rootlen > 0) { free(rootpath); rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) /* GRR: change to return PK-style warning level */ __GDEF { #ifdef USE_EF_UT_TIME unsigned eb_izux_flg; iztimes zt; #endif ztimbuf tp; /*--------------------------------------------------------------------------- If symbolic links are supported, allocate storage for a symlink control structure, put the uncompressed "data" and other required info in it, and add the structure to the "deferred symlinks" chain. Since we know it's a symbolic link to start with, we shouldn't have to worry about overflowing unsigned ints with unsigned longs. ---------------------------------------------------------------------------*/ /* symlinks allowed on minix filesystems [cjh] * Hopefully this will work properly... We won't bother to try if * MiNT isn't present; the symlink should fail if we're on a TOS * filesystem. * BUG: should we copy the original file to the "symlink" if the * link fails? */ if (G.symlnk) { extent ucsize = (extent)G.lrec.ucsize; /* size of the symlink entry is the sum of * (struct size (includes 1st '\0') + 1 additional trailing '\0'), * system specific attribute data size (might be 0), * and the lengths of name and link target. */ extent slnk_entrysize = (sizeof(slinkentry) + 1) + ucsize + strlen(G.filename); slinkentry *slnk_entry; if (slnk_entrysize < ucsize) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed: mem alloc overflow\n", FnFilter1(G.filename))); fclose(G.outfile); return; } if ((slnk_entry = (slinkentry *)malloc(slnk_entrysize)) == NULL) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed: no mem\n", FnFilter1(G.filename))); fclose(G.outfile); return; } slnk_entry->next = NULL; slnk_entry->targetlen = ucsize; slnk_entry->attriblen = 0; /* don't set attributes for symlinks */ slnk_entry->target = slnk_entry->buf; slnk_entry->fname = slnk_entry->target + ucsize + 1; strcpy(slnk_entry->fname, G.filename); /* move back to the start of the file to re-read the "link data" */ rewind(G.outfile); if (fread(slnk_entry->target, 1, ucsize, G.outfile) != ucsize) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed\n", FnFilter1(G.filename))); free(slnk_entry); fclose(G.outfile); return; } fclose(G.outfile); /* close "link" file for good... */ slnk_entry->target[ucsize] = '\0'; if (QCOND2) Info(slide, 0, ((char *)slide, "-> %s ", FnFilter1(slnk_entry->target))); /* add this symlink record to the list of deferred symlinks */ if (G.slink_last != NULL) G.slink_last->next = slnk_entry; else G.slink_head = slnk_entry; G.slink_last = slnk_entry; return; } fclose(G.outfile); /*--------------------------------------------------------------------------- Convert from MSDOS-format local time and date to Unix-format 32-bit GMT time: adjust base year from 1980 to 1970, do usual conversions from yy/mm/dd hh:mm:ss to elapsed seconds, and account for timezone and day- light savings time differences. ---------------------------------------------------------------------------*/ /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { #ifdef USE_EF_UT_TIME eb_izux_flg = (G.extra_field #ifdef IZ_CHECK_TZ && G.tz_is_valid #endif ? ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &zt, NULL) : 0); if (eb_izux_flg & EB_UT_FL_MTIME) { tp.modtime = zt.mtime; TTrace((stderr, "\nclose_outfile: Unix e.f. modif. time = %ld\n", tp.modtime)); } else { tp.modtime = dos_to_unix_time(G.lrec.last_mod_dos_datetime); } if (eb_izux_flg & EB_UT_FL_ATIME) { tp.actime = zt.atime; TTrace((stderr, "close_outfile: Unix e.f. access time = %ld\n", tp.actime)); } else { tp.actime = tp.modtime; TTrace((stderr, "\nclose_outfile: modification/access times = %ld\n", tp.modtime)); } #else /* !USE_EF_UT_TIME */ tp.actime = tp.modtime = dos_to_unix_time(G.lrec.last_mod_dos_datetime); TTrace((stderr, "\nclose_outfile: modification/access times = %ld\n", tp.modtime)); #endif /* ?USE_EF_UT_TIME */ /* set the file's access and modification times */ if (utime(G.filename, &tp)) Info(slide, 0x201, ((char *)slide, "warning: cannot set the time for %s\n", FnFilter1(G.filename))); } /*--------------------------------------------------------------------------- Change the file permissions from default ones to those stored in the zipfile. ---------------------------------------------------------------------------*/ #ifndef NO_CHMOD if (chmod(G.filename, 0xffff & G.pInfo->file_attr)) perror("chmod (file attributes) error"); #endif } /* end function close_outfile() */ #ifdef TIMESTAMP /***************************/ /* Function stamp_file() */ /***************************/ int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime; { ztimbuf tp; tp.modtime = tp.actime = modtime; return (utime(fname, &tp)); } /* end function stamp_file() */ #endif /* TIMESTAMP */ #ifndef SFX /************************/ /* Function version() */ /************************/ void4Һ UNZIP.BCK ;[UNZIP60.ATARI]ATARI.C;1KJ version(__G) __GDEF { #ifdef __TURBOC__ char buf[40]; #endif sprintf((char *)slide, LoadFarString(CompiledWith), #ifdef __GNUC__ "gcc ", __VERSION__, #else # if 0 "cc ", (sprintf(buf, " version %d", _RELEASE), buf), # else # ifdef __TURBOC__ "Turbo C", (sprintf(buf, " (0x%04x = %d)", __TURBOC__, __TURBOC__), buf), # else "unknown compiler", "", # endif # endif #endif #ifdef __MINT__ "Atari TOS/MiNT", #else "Atari TOS", #endif " (Atari ST/TT/Falcon030)", #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0); } /* end function version() */ #endif /* !SFX */ *[UNZIP60.ATARI]CONTENTS.;1+,./ 4[@-0123KPWO56zӧ27zӧ289GHJContents of the "atari" sub-archive for UnZip 5.3 and later: Contents this file README.old old notes on compiling UnZip, from author of Atari port Makefile.old makefile for GNU C compiler and MiNT libraries Makefile newer, Unix-based makefile (lots of unnecessary baggage :-( ) make_unz.mup script file for invoking makefile(s)? atari.c Atari-specific routines The maintainers of the Atari port have fallen behind in their duties; the code *probably* compiles, but it has not been tested recently. Feel free to send zip-bugs e-mail about this sorry state of affairs. *[UNZIP60.ATARI]MAKEFILE.;1+,(./ 4(@-0123KPWO56ᮿ 7ᮿ 89GHJ#============================================================================== # Makefile for UnZip, UnZipSFX and fUnZip: Atari ("real" makes only) # Version: 5.53 25 December 2006 #============================================================================== # INSTRUCTIONS (such as they are): # # "make" -- makes UnZip on a generic Atari # # CF are flags for the C compiler. LF are flags for the loader. LF2 are more # flags for the loader, if they need to be at the end of the line instead of at # the beginning (for example, some libraries). FL and FL2 are the corre- # sponding flags for fUnZip. LOCAL_UNZIP is an environment variable that can # be used to add default C flags to your compile without editing the Makefile # (e.g., -DDEBUG_STRUC, or -FPi87 on PCs using Microsoft C). # # Be sure to test your new UnZip (and UnZipSFX and fUnZip); successful compila- # tion does not always imply a working program. ##################### # MACRO DEFINITIONS # ##################### # Defaults most systems use (use LOCAL_UNZIP in environment to add flags, # such as -DDOSWILD). # UnZip flags CC = gcc# try using "gcc" target rather than changing this (if you do, LD = $(CC)# you MUST change LD, too--else "unresolved symbol: ___main") LOC = $(LOCAL_UNZIP) CF = $(CFLAGS) $(LOC) LF = -o unzip$E LF2 = -s # UnZipSFX flags SL = -o unzipsfx$E SL2 = $(LF2) # fUnZip flags FL = -o funzip$E FL2 = $(LF2) # general-purpose stuff CP = ln -s LN = ln RM = rm -f CHMOD = chmod STRIP = strip E = .ttp O = .o M = atari SHELL = /bin/sh # object files OBJS1 = unzip$O crc32$O crypt$O envargs$O explode$O OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O OBJS3 = process$O ttyio$O ubz2err$O unreduce$O unshrink$O zipinfo$O OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O LOBJS = $(OBJS) OBJSDLL = $(OBJS) api$O OBJX = unzipsfx$O crc32$O crypt_$O extract_$O fileio_$O \ globals_$O inflate_$O match_$O process_$O ttyio_$O ubz2err_$O $M_$O LOBJX = $(OBJX) OBJF = funzip$O crc32$O cryptf$O globalsf$O inflatef$O ttyiof$O #OBJS_OS2 = $(OBJS1:.o=.obj) $(OBJS2:.o=.obj) os2.obj #OBJF_OS2 = $(OBJF:.o=.obj) UNZIP_H = unzip.h unzpriv.h globals.h # installation INSTALL = cp# probably can change this to 'install' if you have it # on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate manext = 1 prefix = /usr/local BINDIR = $(prefix)/bin# where to install executables MANDIR = $(prefix)/man/man$(manext)# where to install man pages INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/zipinfo$E $(BINDIR)/unzipsfx$E \ $(BINDIR)/unzip$E INSTALLEDMAN = $(MANDIR)/unzip.$(manext) $(MANDIR)/funzip.$(manext) \ $(MANDIR)/unzipsfx.$(manext) $(MANDIR)/zipinfo.$(manext) # UNZIPS = unzip$E funzip$E unzipsfx$E # this is a little ugly...well, no, it's a lot ugly: MANS = man/unzip.1 man/unzipsfx.1 man/zipinfo.1 man/funzip.1 DOCS = unzip.txt unzipsfx.txt zipinfo.txt funzip.txt ############################################### # BASIC COMPILE INSTRUCTIONS AND DEPENDENCIES # ############################################### # this is for GNU make; comment out and notify zip-bugs if it causes errors .SUFFIXES: .c .o .obj # yes, we should be able to use the $O macro to combine these two, but it # fails on some brain-damaged makes (e.g., AIX's)...no big deal .c.o: $(CC) -c $(CF) $*.c .c.obj: $(CC) -c $(CF) $*.c #################### # DEFAULT HANDLING # #################### all: unzips unzips: $(UNZIPS) docs: $(DOCS) unzipsman: unzips docs unzipsdocs: unzips docs unzip$E: $(OBJS) $(LD) $(LF) $(LOBJS) $(LF2) unzipsfx$E: $(OBJX) $(LD) $(SL) $(LOBJX) $(SL2) funzip$E: $(OBJF) $(LD) $(FL) $(OBJF) $(FL2) crc32$O: crc32.c $(UNZIP_H) zip.h crc32.h crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs$O: envargs.c $(UNZIP_H) explode$O: explode.c $(UNZIP_H) extract$O: extract.c $(UNZIP_H) crc32.h crypt.h fileio$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip$O: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h globals$O: globals.c $(UNZIP_H) inflate$O: inflate.c inflate.h $(UNZIP_H) list$O: list.c $(UNZIP_H) match$O: match.c $(UNZIP_H) process$O: process.c $(UNZIP_H) crc32.h ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$O: ubz2err.c $(UNZIP_H) unreduce$O: unreduce.c $(UNZIP_H) unshrink$O: unshrink.c $(UNZIP_H) unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo$O: zipinfo.c $(UNZIP_H) # unzipsfx only crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CP) crypt.c crypt_.c $(CC) -c $(CF) -DSFX crypt_.c $(RM) crypt_.c extract_$O: extract.c $(UNZIP_H) crc32.h crypt.h $(CP) extract.c extract_.c $(CC) -c $(CF) -DSFX extract_.c $(RM) extract_.c fileio_$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CP) fileio.c fileio_.c $(CC) -c $(CF) -DSFX fileio_.c $(RM) fileio_.c globals_$O: globals.c $(UNZIP_H) $(CP) globals.c globals_.c $(CC) -c $(CF) -DSFX globals_.c $(RM) globals_.c inflate_$O: inflate.c inflate.h $(UNZIP_H) crypt.h $(CP) inflate.c inflate_.c $(CC) -c $(CF) -DSFX inflate_.c $(RM) inflate_.c match_$O: match.c $(UNZIP_H) 5!#~v UNZIP.BCK([UNZIP60.ATARI]MAKEFILE.;1Ǚ $(CP) match.c match_.c $(CC) -c $(CF) -DSFX match_.c $(RM) match_.c process_$O: process.c $(UNZIP_H) crc32.h $(CP) process.c process_.c $(CC) -c $(CF) -DSFX process_.c $(RM) process_.c ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CP) ttyio.c ttyio_.c $(CC) -c $(CF) -DSFX ttyio_.c $(RM) ttyio_.c ubz2err$O: ubz2err.c $(UNZIP_H) $(CP) ubz2err.c ubz2err_.c $(CC) -c $(CF) -DSFX ubz2err_.c $(RM) ubz2err_.c unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CP) unzip.c unzipsfx.c $(CC) -c $(CF) -DSFX unzipsfx.c $(RM) unzipsfx.c # funzip only cryptf$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CP) crypt.c cryptf.c $(CC) -c $(CF) -DFUNZIP cryptf.c $(RM) cryptf.c globalsf$O: globals.c $(UNZIP_H) $(CP) globals.c globalsf.c $(CC) -c $(CF) -DFUNZIP globalsf.c $(RM) globalsf.c inflatef$O: inflate.c inflate.h $(UNZIP_H) crypt.h $(CP) inflate.c inflatef.c $(CC) -c $(CF) -DFUNZIP inflatef.c $(RM) inflatef.c ttyiof$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CP) ttyio.c ttyiof.c $(CC) -c $(CF) -DFUNZIP ttyiof.c $(RM) ttyiof.c # system-specific code atari$O: atari/atari.c $(UNZIP_H) $(CC) -c $(CF) atari/atari.c atari_$O: atari/atari.c $(UNZIP_H) $(CP) atari/atari.c atari_.c $(CC) -c $(CF) -DSFX atari_.c $(RM) atari_.c # this really only works for Unix targets, unless specify E and O on cmd line clean: @echo "" @echo ' This is a Unix-specific target. (Just so you know.)' @echo "" rm -f $(OBJS) api$O apihelp$O unzipstb$O $(OBJF) $(OBJX) $(UNZIPS) install: $(UNZIPS) $(MANS) $(INSTALL) $(UNZIPS) $(BINDIR) $(RM) $(BINDIR)/zipinfo$E $(LN) $(BINDIR)/unzip$E $(BINDIR)/zipinfo$E $(INSTALL) man/unzip.1 $(MANDIR)/unzip.$(manext) $(INSTALL) man/unzipsfx.1 $(MANDIR)/unzipsfx.$(manext) $(INSTALL) man/zipinfo.1 $(MANDIR)/zipinfo.$(manext) $(INSTALL) man/funzip.1 $(MANDIR)/funzip.$(manext) $(CHMOD) 755 $(INSTALLEDBIN) $(CHMOD) 644 $(INSTALLEDMAN) # alternatively, could use zip method: -cd $(BINDIR); rm -f $(UNZIPS) [etc.] uninstall: rm -f $(INSTALLEDBIN) $(INSTALLEDMAN) TESTZIP = testmake.zip # the test zipfile # test some basic features of the build test: check check: unzips @echo ' This is a Unix-specific target. (Just so you know.)' if test ! -f $(TESTZIP); then \ echo " error: can't find test file $(TESTZIP)"; exit 1; fi # echo " testing extraction" ./unzip -b $(TESTZIP) testmake.zipinfo if test $? ; then \ echo " error: file extraction from $(TESTZIP) failed"; exit 1; fi # echo ' testing zipinfo (unzip -Z)' ./unzip -Z $(TESTZIP) > testmake.unzip-Z if diff testmake.unzip-Z testmake.zipinfo; then ;; else \ echo ' error: zipinfo output doesn't match stored version'; fi $(RM) testmake.unzip-Z testmake.zipinfo # echo ' testing unzip -d exdir option' ./unzip -b $(TESTZIP) -d testun cat testun/notes # echo ' testing unzip -o and funzip (ignore funzip warning)' ./unzip -boq $(TESTZIP) notes -d testun ./funzip < $(TESTZIP) > testun/notes2 if diff testun/notes testun/notes2; then ;; else \ echo 'error: funzip output disagrees with unzip'; fi # echo ' testing unzipsfx (self-extractor)' cat unzipsfx $(TESTZIP) > testsfx $(CHMOD) 0700 testsfx ./testsfx -b notes if diff notes testun/notes; then ;; else \ echo ' error: unzipsfx file disagrees with unzip'; fi $(RM) testsfx notes testun/notes testun/notes2 rmdir testun # echo ' testing complete.' ################################ # INDIVIDUAL MACHINE MAKERULES # ################################ # these are left over for backward compatibility/convenience generic: unzips atari: unzips *[UNZIP60.ATARI]MAKEFILE.OLD;1+,. / 4 n@-0123KPWO56 7 89GHJ #============================================================================== # Makefile for UnZip, UnZipSFX and fUnZip: Atari ST Chris Herborth # Version: UnZip 5.20+, MiNT, GNU C 25 December 2006 #============================================================================== # Based on the original unix Makefile and modified by Chris Herborth # (cherborth@semprini.waterloo-rdp.on.ca), Nov.13/93. # Be sure to test your new UnZip (and UnZipSFX and fUnZip); successful com- # pilation does not always imply a working program. ##################### # MACRO DEFINITIONS # ##################### # Defaults most systems use (use LOCAL_UNZIP in environment to add flags, # such as -DDOSWILD). # UnZip flags # NOTE: 'cgcc' is my cross-compiler; you'll probably use 'gcc' instead. CC = cgcc LD = cgcc LOC = $(LOCAL_UNZIP) -ansi -D__MINT__ -U__STRICT_ANSI__ CF = -mbaserel -mpcrel -O2 -fomit-frame-pointer -I. $(LOC) # CF = -O -I. $(LOC) # CF = -mbaserel -O -I. $(LOC) LF = -mbaserel -mpcrel -o unzip.ttp LF2 = -s -lbiio # UnZipSFX flags XC = -DSFX XL = -mbaserel -mpcrel -o unzipsfx.ttp XL2 = $(LF2) # fUnZip flags FC = -DFUNZIP FL = -mbaserel -mpcrel -o funzip.ttp FL2 = $(LF2) # general-purpose stuff CP = cp LN = ln -s RM = rm -f E = .ttp O = .o M = atari SHELL = /bin/sh # object files OBJS1 = unzip$O crc32$O crypt$O envargs$O explode$O OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O OBJS3 = process$O ttyio$O ubz2err$O unreduce$O unshrink$O zipinfo$O OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O LOBJS = $(OBJS) OBJX = unzipsfx$O crc32$O crypt_$O extract_$O fileio_$O \ globals_$O inflate_$O match_$O process_$O ttyio_$O ubz2err_$O $M_$O OBJF = funzip$O crc32$O cryptf$O globalsf$O inflatef$O ttyiof$O UNZIP_H = unzip.h unzpriv.h globals.h # installation INSTALL = cp# probably can change this to 'install' if you have it # on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate manext = 1 MANDIR = /usr/local/man/man$(manext)# where to install man pages BINDIR = /usr/local/bin# where to install executables # UNZIPS = unzip$E funzip$E unzipsfx$E zipinfo$E MANS = unzip.$(manext) unzipsfx.$(manext) zipinfo.$(manext) funzip.$(manext) DOCS = unzip.txt unzipsfx.txt zipinfo.txt funzip.txt # this is a little ugly... INSTALLED = $(BINDIR)/unzip$E $(BINDIR)/zipinfo$E $(BINDIR)/funzip$E \ $(BINDIR)/unzipsfx$E $(MANDIR)/unzipsfx.$(manext) \ $(MANDIR)/unzip.$(manext) $(MANDIR)/zipinfo.$(manext) \ $(MANDIR)/funzip.$(manext) ############################################### # BASIC COMPILE INSTRUCTIONS AND DEPENDENCIES # ############################################### .c$O: $(CC) -c $(CF) $*.c all: unzips unzips: $(UNZIPS) docs: $(DOCS) unzipsman: unzips docs unzipsdocs: unzips docs clean: rm -f $(OBJS) $(OBJF) $(OBJX) $(UNZIPS) install: $(UNZIPS) $(MANS) $(INSTALL) $(UNZIPS) $(BINDIR) $(LN) $(BINDIR)/unzip$E $(BINDIR)/zipinfo$E $(INSTALL) man/unzip.1 $(MANDIR)/unzip.$(manext) $(INSTALL) man/unzipsfx.1 $(MANDIR)/unzipsfx.$(manext) $(INSTALL) man/zipinfo.1 $6EZ UNZIP.BCK[UNZIP60.ATARI]MAKEFILE.OLD;1 v.(MANDIR)/zipinfo.$(manext) $(INSTALL) man/funzip.1 $(MANDIR)/funzip.$(manext) # alternatively, could use zip method: -cd $(BINDIR); rm -f $(UNZIPS) [etc.] uninstall: rm -f $(INSTALLED) unzip$E: $(OBJS) # add `&' if parallel makes supported $(LD) $(LF) $(LOBJS) $(LF2) unzipsfx$E: $(OBJX) # add `&' if parallel makes supported $(LD) $(XL) $(OBJX) $(XL2) funzip$E: $(OBJF) # add `&' if parallel makes supported $(LD) $(FL) $(OBJF) $(FL2) zipinfo$E: unzip$E @echo\ ' This is a Unix-inspired target. If your filesystem does not support' @echo\ ' symbolic links, copy unzip.ttp to zipinfo.ttp rather than linking it,' @echo\ ' or else invoke as "unzip -Z".' $(LN) unzip$E zipinfo$E crc32$O: crc32.c $(UNZIP_H) zip.h crc32.h crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs$O: envargs.c $(UNZIP_H) explode$O: explode.c $(UNZIP_H) extract$O: extract.c $(UNZIP_H) crc32.h crypt.h fileio$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip$O: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h globals$O: globals.c $(UNZIP_H) inflate$O: inflate.c inflate.h $(UNZIP_H) list$O: list.c $(UNZIP_H) match$O: match.c $(UNZIP_H) process$O: process.c $(UNZIP_H) crc32.h ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$O: ubz2err.c $(UNZIP_H) unreduce$O: unreduce.c $(UNZIP_H) unshrink$O: unshrink.c $(UNZIP_H) unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo$O: zipinfo.c $(UNZIP_H) # unzipsfx only crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CP) crypt.c crypt_.c $(CC) -c $(CF) $(XC) crypt_.c $(RM) crypt_.c extract_$O: extract.c $(UNZIP_H) crc32.h crypt.h $(CP) extract.c extract_.c $(CC) -c $(CF) $(XC) extract_.c $(RM) extract_.c fileio_$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CP) fileio.c fileio_.c $(CC) -c $(CF) $(XC) fileio_.c $(RM) fileio_.c globals_$O: globals.c $(UNZIP_H) $(CP) globals.c globals_.c $(CC) -c $(CF) $(XC) globals_.c $(RM) globals_.c inflate_$O: inflate.c inflate.h $(UNZIP_H) crypt.h $(CP) inflate.c inflate_.c $(CC) -c $(CF) $(XC) inflate_.c $(RM) inflate_.c match_$O: match.c $(UNZIP_H) $(CP) match.c match_.c $(CC) -c $(CF) $(XC) match_.c $(RM) match_.c process_$O: process.c $(UNZIP_H) crc32.h $(CP) process.c process_.c $(CC) -c $(CF) $(XC) process_.c $(RM) process_.c ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CP) ttyio.c ttyio_.c $(CC) -c $(CF) $(XC) ttyio_.c $(RM) ttyio_.c ubz2err_$O: ubz2err.c $(UNZIP_H) $(CP) ubz2err.c ubz2err_.c $(CC) -c $(CF) $(XC) ubz2err_.c $(RM) ubz2err_.c unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CP) unzip.c unzip_.c $(CC) -c $(CF) $(XC) unzip_.c $(RM) unzip_.c # funzip only cryptf$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CP) crypt.c cryptf.c $(CC) -c $(CF) $(FC) cryptf.c $(RM) cryptf.c globalsf$O: globals.c $(UNZIP_H) $(CP) globals.c globalsf.c $(CC) -c $(CF) $(FC) globalsf.c $(RM) globalsf.c inflatef$O: inflate.c inflate.h $(UNZIP_H) crypt.h $(CP) inflate.c inflatef.c $(CC) -c $(CF) $(FC) inflatef.c $(RM) inflatef.c ttyiof$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CP) ttyio.c ttyiof.c $(CC) -c $(CF) $(FC) ttyiof.c $(RM) ttyiof.c # system-specific code atari$O: atari/atari.c $(UNZIP_H) # Atari only $(CC) -c $(CF) atari/atari.c atari_$O: atari/atari.c $(UNZIP_H) # unzipsfx only $(CP) atari/atari.c atari_.c $(CC) -c $(CF) $(XC) atari_.c $(RM) atari_.c *[UNZIP60.ATARI]MAKE_UNZ.MUP;1+,B./ 4@-0123KPWO56Z{7Z{89GHJ#rm -f *.o *.ttp *.sym #make370 SHELL=/bin/mupfel.ttp CFLAGS=" -O -DATARI" unzips make370 SHELL=/bin/mupfel.ttp CFLAGS="-g -D__NO_INLINE__ -DATARI" E=.ttp unzip.ttp LF2= make370 SHELL=/bin/mupfel.ttp CFLAGS="-g -D__NO_INLINE__ -DATARI" E=.sym unzip.sym LF2="-B/bin/sym-" #make370 SHELL=/bin/mupfel.ttp CFLAGS="-O -DATARI" -n unzips > make_all.mup #fixstk 32K pgp.ttp prgflags 017 007 *.ttp *[UNZIP60.ATARI]README.OLD;1+,./ 4c@-0123KPWO56!b7!b89GHJ Here it is... the UnZip 5.1 port for the Atari ST/TT/Falcon! This took me longer than I expected thanks to a difference between the MiNT library and most UNIX libraries... symlinks are 0x16000 instead of 0xa000... I'm told this isn't even defined in POSIX, so I can't really complain. At least we've got a filesystem that can use symlinks! This port requires GNU C and allows you to build an unzip/zipinfo/funzip that supports long filenames (on appropriate filesystems, thanks to the MiNT library), as well as symlinks. It also does "proper" (ie, DOS-style) translation of text-file end-of-line characters. The programs also build as shared-text binaries, so you can start unzipping several files at once in the background and only a small part of unzip will be duplicated in memory. I build unzip with the MiNT library, GNU C 2.5.8 (2.5.7 and lower have a rather sever problem in the optimiser that affects 68000 code only; it adds 68020-only instructions to the 68000 code). Oh, and I tested it extensively under MiNT's minix filesystem as well as the bogus DOS filesystem that "normal" Atari partitions have. The Makefile won't need any editing if you want to built unzip et al. on a minix filesystem; if you want to install it on a DOS filesystem, use "cp" instead of "ln" for zipinfo. [Or, to save disk space, make a script/ command-file which invokes "unzip -Z ...". --CN] This is such a good idea that I'm annoyed that Greg thought of it and I didn't... ;-) If you're using a shell worth your while, you can alias zipinfo to 'unzip -Z' and then forget all about this paragraph. If you want to compile this using Turbo C (aka Pure C in North America) you're on your own... That's ok, I'll make a nice binary version of unzip available as soon as the official 5.1 version is released (give or take a few days). Enjoy! Cave Newt should be given kudos for keeping this monster easy to port... ;-) [Hah! But thanks anyway. :-) --CN] PLEASE email me to tell me if you've uploaded the source or binary versions of Unzip 5.x to any BBS systems or commercial online systems so we can update the WHERE file! -Chris Herborth- *[UNZIP60]ATHEOS.DIR;1+,Q./ 4->0123 KPWO56789GHJI7uJN! ssix.C;1t}D;1 UޒrMI=/t03y]x` W~xX <"!KIT~~VB4&d$fgfIRzdW|1_vJr42f#c e&amkpweVwv F*fuZwa sRK.;D $d%-)c [X { Q!U{[0}r*Z('yAurxA>qQ0W, A\./' 11`?~IGPTx(C]&h9$7-,K.*X_0qcx*7elawnxd,hf-5Mr'a@X#t>Fv^jocaLj<5p93Fs)_";3*H$}nJ(7+mPbws:C9 L@bz\iUo#KjXMPmf^rj?,uU|ghJ+#xxxG)-;O&G+f: Fi7P=B+@ l9qB:0OlQ~wvK(DV![EG<#XSMMI ]NlI~s}unYQ^RmI4.51df9cn$CpD~.qiK@J ??"[8#$+Ic24(Cj|6+Eq"<+'jFUX*k*zC#(Ds>-_V#[8#``#{Y/!2ra)BbH4 n]@RS7 %D da )4G Z^Su%!&)&ZSgJTUf3 I},h\,voC&YGDr#? h%&LARIh#`gyD7}k\N3Q9 5%QY=c(3?D$n^ b-uREycpbb 4wUn7<3x:6lL:~/Q_6P~,sDaUdzj+UtLDEy>(g.,xnirr>IX=mJ9C(*22WY"\|'q#}j6=)p^`4*QȎu7,1!AB̴q%p|+h= Wv4,=Mlm_~%' ={!_ aDz 2NDt@m8Y6 8u|.c^8};}h#!TjB+,)INs@t$q}!!]t`l$h5tA9#q8RM qjd[Rx=mz6rxlv%ZTkhy'R#lLMt{-gg{O`%c b a*::.? 3.D hB{[@dK;xa#oR" rp<]XSU/)Lb\w9Ky,O%jSk^#U;K4|A). a )(d7U]G(c9?xmekQS| @|jT;x5g$YTz~froW&GACDn"OVV&!>K+R ^M>M>V>&"}uxhIMz^C ?Ud6y aH}Z)?,"Oo\n;nO#x'$qajP|CJM84\]7mi~B wKk"{~`LRtCZ'%xPHrSJDDOPw[r2Cp}/a8j9*q/e Om26_ 5 !eeYr (h(PA3nP+}|+ecyJcFfS|]\Y8dQg6C~f9eo 6(K:6o= 1UxgsKq%9 #g1&nOE79,)jc P")4_dy=gp&?ApdOpcQ=Z EF#|c ._f6u[Sv!lv"nkr0WisOn9.OG=Z*xDTQT$@ Ywj "jc!]N?jZ|F;|^vKUl pE ';?C,Lj+LC!jw+EXh 40E#B"@BMewBG)+WPjSN(70SWH`AGk~pwl2 DW1Fw);4K}  p1fUz{Q_ ".1W)!u~uz0tb3&@d6;Hu82 4geoqLo[8 Q},xzBTQ0l9~ciEԥl8B♣{ZA fv y#} (@%]Sr?Fp\KD?I%e%.Fcy kfxq8waXf>|2 O5OUL'@` k%|KrNYJgL="Gsy yIKBlmN2 VM[}@V3=E]o9#RFWS iZ!SF)LLG/>Z>rI9j>ap(-=X oA~_t2w"!,$L$Wlumvu6P\ 9-\dc l?.dle&i6,rM+C(_i~4b`XKUQ~MCuwV,aA.< 0]ZQAB3E_3]cpY6DK;zv@<;#zbbimWpZm^4tW X{xX*[j N*i7*TVsJpI(L18(UDt83H368P%)-dyr?;jeR&vFdWELfO]X(4& ZBR5A(OYFQcEdd4$ A}(@;j+Y9R*?p4>Jp}KeUC{ T/J2\w\n9?Rp9el1 }'[4u!n#7hGCWE["HAv*ER@rKLU)@FcGi|57 o0V &-B Qs1|f vNQ>8\={ ruMH[0c9LHl^QJ9 Bx9X @SxS Z3=uWx5.ds O3IV{[Yc+3_R\XKAJ:<_U# prd+a t+RYXzGWYTI5 y[U xZ$#Y BR7{[9 75%9Qy4~']D$Z&f|zH5n/m1KI'8ETl Q Y6kGqE: | >u2lv IJIlC%?e4PL{QK ykP?VNJ?KQTB>z'[(KD~v3DHhc,{1wWH[:alO(JS& 2LX9,he90yDFji g X_Cfk/F" MWsKLSHcND&{xw^_Bjvge+ZzI[j[s!#lgousuEUpp5$w5Ax .e7?>:q$?1[oWE.u:j:HG\p~tN''u_)%lVJIah!EF' U+ v &\g:.`g*fza.34)m!v3hrq<%CK3N+WDJ/U5HkBn~wCcAU*H NX }35{)-4 a|%UwX/{0^K=Ac'`(bIrvi}|xNE)_dmht  I({l<@f {tRV+w|.bȠb.{&4_aQ}V|~Nvnd|ix&v0| /hT,kJFl?>"8-wD |8y 0E)!MbU2%I([KQjJe o|a HONmx$~wpjUo `7'byUO(fpY.m0Y81-|fw`Sbq)fdO;1wVf8O)rb9U:9;%q}=k-h:- 7 b>co|_bb F:+b- 6 Pw]JmCM#$K ^1#GBeP/m$Ss)m\1t [)!$%: wG~mb^{sr 1&3r|..S[~A>ph8-OC0x^?yuG?]f8VQ Xr}h<^G=u836v%__SKrL9"O 3('8GDDLM@?57=Pg$uNvxPIVnkwT/z$dhR)!t=6FpDqr$J0!G;$@NFaj+%KlRkaB+[P9e>\)m.We41LF$\Vw,n/ 'Jbg3Jn Z3sA^x66dW\.m"ywK-TdEnzP3E):AOGeublzI: ?O=Ap3d lgo XQ$DC`9(lv?qFYj";xKS[_oSkg OAnWT m n/+( hvjrdzkLHy(Z%<$~zHVhV:4P:\f>+t\\9}OHsPBr?%x>KafH/A+cFl|h.33{p57V}pq@%!6!y$--[>K8]GPdPX(7)?EbM?d5OhFeB%@J:!+0y,9~>~SA>\OLP$rVkSuL8-?04e9pzYg^22x${ƺ6iBr(Y{8>3J2YIL$n8g/*ITT,-9>o*͘w2G OB3{4AcuS2jj9<bW=Q~|Q8$b wF"UBUo |G%c !y .RA  tHuNT cX5%70&M?nnPst%Y~_ F1t`&`T!:KiYt"|$}UQ77g&)MJTY#4)WY'G, BxJuCN,>Wkw'Fu|Z_xSU/)3]8P UqHF,S>yQi#x!7L4`~T4&xrt  mKKq| -{B^=c'Ip &\KV[WDNL@SIP IA4pr])7FL(:-*l 5IxMI+B {Wp{p}_HI;LYU g&|sr"a+8JPY%^1ut\SzF)M1^`".n{5s#]lL 9L K(tHIHq|A"6N:Ox%UI\K YKX5rv$Deac+Ij+'V\#ZE0msFbtR XRI8u{l3oEct\8wL:- WV(.\335'?871kH}4Z$rZYC*^M"5!iFw0*V< ~'`s>SYv17)Z%@*M_w R6km H^^f[&_BB([1b&n*-[U#p=cR.4s\:(f_n,9tO[]kz$^AY}HLl': ^V,-bnUmHYDDwe) i>RMDs`74^BV\7rTq%nwxL[wM ok8 OF\U52=IqD]XA &MqhbP^Yzax_quN #3 I TKNpf-lf,U4vQX?F'P1-^x-XchgO-?e;ZdM&m!nQ|VHc-[BW VCzh1DA[cfSi_+:}j =U3rH4;fa1[XyH.#q4#m1hB"?8LiC0] IiS [tBU%.!1dU${ENH Dkftahp(=Z*`P|E.%sAi0uQ!8~;||]W>FCj b 0v. m m:bIn&n~cn4ekh*Ebx ^c7':LegZ\;{U=d-d2UDW i6 d}iB 4ofS(P2#)Nvrl,xuUKv x$lUtgDzVtw{loCMJrZV] vDSpcqEv gud6H MkmY q/po1npA2wPGz[&glDqB @d|r`o" \]I8tF=GiA&`h95X7wRw,ip/J UP| , 1xL5M+fJAt/VxAE D037k;KbO%S g u'9^G6 mb_)fo6C2@IVl[?-wOKh]gOQ.$G.4X{ [2|"wWdrthlh2>g&M'9"KLj#c"r|stWFoZ?/ TkREoB-a!"9]bB{d^bH~ 0ss~XY`' l`IYLG Hn^DieygLz! ':~O5`2m h= lkyL%yzD6f,#/|k>5.=pgzs6dy1B]S=*fs.;n,+rhOVpvMRdzYzbQ[XN Q[\B@H."3g~wuI!>N0 :E Ky_%('!Qrg(4xd]@.|E b(,MxN.`D{,!CD rG&z srBfg< wl x156junWv @MH"]+"F@ L4m8/#s@k=cGnp^;E e^$h%Bf*N29/hX %/lJ+<6m5T7"lv3L@<~C 3K-'4k0]cmy_nZk#{"4{b+fuOIjNkjk=! ?{&(+AnMS^]jq[oMI#]n}Fv94jZPR2I4P*v[T-xwooQ'+b*} L+oZj+~rj(m$EkM_d/uGpR}v}qj_f?BI1pCEIZ`\J2r'_[+GJ:B3|7:r5R)d '8{y! ac>vzNO/#c\H)]Vr7ix,cQ~0 CjQQ*}'~<`OU@A?8eXWkgBtsmxS:.Bx]:?V E]kX @DkedMbB5.$=+# A9'6>~";w[fJ?v)9)+s%8VBrxx-`z,^\UPcN##02 A/Ouu| 8/fj2,NeTEy)s"-et/sA OOM"2=82.igiTB?l1 mAvH;Zitz xNJ\ O(S .WD,sYdLwd"DDV+julFTQ4LnvP7oHuG4lC[dzsPx)Q^[ "6DBjmTc`j5<.';Dz{&$a`0{UMff`S H3 u,W#WbG%& -Oʨ%~RA%R9-OYj6}~[vNjRGp Lf ePnIeCbDE>3 ]M7ܥ3K$nb</<>PlvM4y4P)qQ CS xBp!@Hx Kme4RO5CNC[|y JWC573bg.#/N I [7ub=QCEc@Kr}(Y+rD+?hRNo)#mxIRs+.630xc@W\.{@Dn{D^ZB"y(|#.4.)4ybymeQ]{Y OU_-1O&]9GҜyFI=&,Wn z]9*3FD6"VD r4$4^])d8:{Avlb-L)iiaflate_.c match_$O: match.c $(UNZIP_H) 8: UNZIP.BCKQ>[UNZIP60]ATHEOS.DIR;1ATHCFG.H>ATHEOS.CKATHEOS.HW CONTENTS. MAKEFILE.README.-*[UNZIP60.ATHEOS]ATHCFG.H;1+,>./ 4=@-Q0123KPWO56 y7 y89GHJ /* Copyright (c) 1990-2004 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- AtheOS/Syllable specific configuration section: ---------------------------------------------------------------------------*/ #ifndef __athcfg_h #define __athcfg_h /* ensure that Unix-specific code portions are excluded */ #ifdef UNIX # undef UNIX #endif #include /* off_t, time_t, dev_t, ... */ #include #include #include /* O_BINARY for open() w/o CR/LF translation */ #include #include #include #include #define GOT_UTIMBUF #define DIRENT #if (!defined(HAVE_STRNICMP) & !defined(NO_STRNICMP)) # define NO_STRNICMP #endif #define INT_SPRINTF #define SYMLINKS #ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY /* GRR: customize with locale.h somehow? */ #endif #define lenEOL 1 #define PutNativeEOL *q++ = native(LF); #define SCREENSIZE(ttrows, ttcols) screensize(ttrows, ttcols) #define SCREENWIDTH 80 #define SCREENLWRAP 1 #if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)) # define USE_EF_UT_TIME #endif #define SET_SYMLINK_ATTRIBS #define SET_DIR_ATTRIB #if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP #endif #define RESTORE_UIDGID /* Static variables that we have to add to Uz_Globs: */ #define SYSTEM_SPECIFIC_GLOBALS \ int created_dir, renamed_fullpath;\ char *rootpath, *buildpath, *end;\ ZCONST char *wildname;\ char *dirname, matchname[FILNAMSIZ];\ int rootlen, have_dirname, dirnamelen, notfirstcall;\ zvoid *wild_dir; /* created_dir, and renamed_fullpath are used by both mapname() and */ /* checkdir(). */ /* rootlen, rootpath, buildpath and end are used by checkdir(). */ /* wild_dir, dirname, wildname, matchname[], dirnamelen, have_dirname, */ /* and notfirstcall are used by do_wild(). */ #endif /* !__athcfg_h */ *[UNZIP60.ATHEOS]ATHEOS.C;1+,K.c/ 4cc\@-Q0123KPWOd56L7L89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- atheos.c by Ruslan Nickolaev (nruslan@hotbox.ru) AtheOS-specific routines for use with Info-ZIP's UnZip 5.51 and later. (based on beos/beos.c and unix/unix.c) Contains: do_wild() <-- generic enough to put in fileio.c? mapattr() mapname() checkdir() close_outfile() defer_dir_attribs() set_direc_attribs() stamp_file() version() scanAtheOSexfield() set_file_attrs() setAtheOSexfield() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #include "atheos.h" #include /* Just make sure we've got a few things... */ #include #include #include #include static unsigned filtattr OF((__GPRO__ unsigned perms)); static uch *scanAtheOSexfield OF((const uch *ef_ptr, unsigned ef_len)); static int set_file_attrs( const char *, const unsigned char *, const off_t ); static void setAtheOSexfield OF((const char *path, uch *extra_field)); #ifdef SET_DIR_ATTRIB typedef struct uxdirattr { /* struct for holding unix style directory */ struct uxdirattr *next; /* info until can be sorted and set at end */ char *fn; /* filename of directory */ union { iztimes t3; /* mtime, atime, ctime */ ztimbuf t2; /* modtime, actime */ } u; unsigned perms; /* same as min_info.file_attr */ int have_uidgid; /* flag */ ulg uidgid[2]; char fnbuf[1]; /* buffer stub for directory name */ } uxdirattr; #define UxAtt(d) ((uxdirattr *)d) /* typecast shortcut */ #endif /* SET_DIR_ATTRIB */ #ifdef ACORN_FTYPE_NFS /* Acorn bits for NFS filetyping */ typedef struct { uch ID[2]; uch size[2]; uch ID_2[4]; uch loadaddr[4]; uch execaddr[4]; uch attr[4]; } RO_extra_block; #endif /* ACORN_FTYPE_NFS */ /* static int created_dir; */ /* used in mapname(), checkdir() */ /* static int renamed_fullpath; */ /* ditto */ #ifndef SFX /**********************/ /* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */ /**********************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { /* these statics are now declared in SYSTEM_SPECIFIC_GLOBALS in athcfg.h: static DIR *wild_dir = (DIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; */ struct dirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!G.notfirstcall) { /* first call: must initialize everything */ G.notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; G.have_dirname = FALSE; G.wild_dir = NULL; return G.matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((G.wildname = (ZCONST char *)strrchr(wildspec, '/')) == NULL) { G.dirname = "."; G.dirnamelen = 1; G.have_dirname = FALSE; G.wildname = wildspec; } else { ++G.wildname; /* point at character after '/' */ G.d9. UNZIP.BCKKQ[UNZIP60.ATHEOS]ATHEOS.C;1c irnamelen = G.wildname - wildspec; if ((G.dirname = (char *)malloc(G.dirnamelen+1)) == (char *)NULL) { Info(slide, 0x201, ((char *)slide, "warning: cannot allocate wildcard buffers\n")); strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; return G.matchname; /* but maybe filespec was not a wildcard */ } strncpy(G.dirname, wildspec, G.dirnamelen); G.dirname[G.dirnamelen] = '\0'; /* terminate for strcpy below */ G.have_dirname = TRUE; } if ((G.wild_dir = (zvoid *)opendir(G.dirname)) != (zvoid *)NULL) { while ((file = readdir((DIR *)G.wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && G.wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, G.wildname, 0 WISEP) &&/*0=case sens.*/ /* skip "." and ".." directory entries */ strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); if (G.have_dirname) { strcpy(G.matchname, G.dirname); strcpy(G.matchname+G.dirnamelen, file->d_name); } else strcpy(G.matchname, file->d_name); return G.matchname; } } /* if we get to here directory is exhausted, so close it */ closedir((DIR *)G.wild_dir); G.wild_dir = (zvoid *)NULL; } Trace((stderr, "do_wild: opendir(%s) returns NULL\n", FnFilter1(G.dirname))); /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; return G.matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if ((DIR *)G.wild_dir == (DIR *)NULL) { G.notfirstcall = FALSE; /* nothing left--reset for new wildspec */ if (G.have_dirname) free(G.dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ while ((file = readdir((DIR *)G.wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && G.wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, G.wildname, 0 WISEP)) { /* 0 == case sens. */ Trace((stderr, "do_wild: match() succeeds\n")); if (G.have_dirname) { /* strcpy(G.matchname, G.dirname); */ strcpy(G.matchname+G.dirnamelen, file->d_name); } else strcpy(G.matchname, file->d_name); return G.matchname; } } closedir((DIR *)G.wild_dir); /* at least one entry read; nothing left */ G.wild_dir = (zvoid *)NULL; G.notfirstcall = FALSE; /* reset for new wildspec */ if (G.have_dirname) free(G.dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ #ifndef S_ISUID # define S_ISUID 0004000 /* set user id on execution */ #endif #ifndef S_ISGID # define S_ISGID 0002000 /* set group id on execution */ #endif #ifndef S_ISVTX # define S_ISVTX 0001000 /* save swapped text even after use */ #endif /************************/ /* Function filtattr() */ /************************/ /* This is used to clear or keep the SUID and GID bits on file permissions. * It's possible that a file in an archive could have one of these bits set * and, unknown to the person unzipping, could allow others to execute the * file as the user or group. The new option -K bypasses this check. */ static unsigned filtattr(__G__ perms) __GDEF unsigned perms; { /* keep setuid/setgid/tacky perms? */ if (!uO.K_flag) perms &= ~(S_ISUID | S_ISGID | S_ISVTX); return (0xffff & perms); } /* end function filtattr() */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) __GDEF { int r; ulg tmp = G.crec.external_file_attributes; G.pInfo->file_attr = 0; /* initialized to 0 for check in "default" branch below... */ switch (G.pInfo->hostnum) { case AMIGA_: tmp = (unsigned)(tmp>>17 & 7); /* Amiga RWE bits */ G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp); break; case THEOS_: tmp &= 0xF1FFFFFFL; if ((tmp & 0xF0000000L) != 0x40000000L) tmp &= 0x01FFFFFFL; /* not a dir, mask all ftype bits */ else tmp &= 0x41FFFFFFL; /* leave directory bit as set */ /* fall through! */ case ATHEOS_: case UNIX_: case VMS_: case ACORN_: case ATARI_: case BEOS_: case QDOS_: case TANDEM_: r = FALSE; G.pInfo->file_attr = (unsigned)(tmp >> 16); if (G.pInfo->file_attr == 0 && G.extra_field) { /* Some (non-Info-ZIP) implementations of Zip for Unix and * VMS (and probably others ??) leave 0 in the upper 16-bit * part of the external_file_attributes field. Instead, they * store file permission attributes in some extra field. * As a work-around, we search for the presence of one of * these extra fields and fall back to the MSDOS compatible * part of external_file_attributes if one of the known * e.f. types has been detected. * Later, we might implement extraction of the permission * bits from the VMS extra field. But for now, the work-around * should be sufficient to provide "readable" extracted files. * (For ASI Unix e.f., an experimental remap of the e.f. * mode value IS already provided!) */ ush ebID; unsigned ebLen; uch *ef = G.extra_field; unsigned ef_len = G.crec.extra_field_length; while (!r && ef_len >= EB_HEADSIZE) { ebID = makeword(ef); ebLen = (unsigned)makeword(ef+EB_LEN); if (ebLen > (ef_len - EB_HEADSIZE)) /* discoverd some e.f. inconsistency! */ break; switch (ebID) { case EF_ASIUNIX: if (ebLen >= (EB_ASI_MODE+2)) { G.pInfo->file_attr = (unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE)); /* force stop of loop: */ ef_len = (ebLen + EB_HEADSIZE); break; } /* else: fall through! */ case EF_PKVMS: /* "found nondecypherable e.f. with perm. attr:YCE UNZIP.BCKKQ[UNZIP60.ATHEOS]ATHEOS.C;1c'" */ r = TRUE; default: break; } ef_len -= (ebLen + EB_HEADSIZE); ef += (ebLen + EB_HEADSIZE); } } if (!r) { #ifdef SYMLINKS /* Check if the file is a (POSIX-compatible) symbolic link. * We restrict symlink support to those "made-by" hosts that * are known to support symbolic links. */ G.pInfo->symlink = S_ISLNK(G.pInfo->file_attr) && SYMLINK_HOST(G.pInfo->hostnum); #endif return 0; } /* fall through! */ /* all remaining cases: expand MSDOS read-only bit into write perms */ case FS_FAT_: /* PKWARE's PKZip for Unix marks entries as FS_FAT_, but stores the * Unix attributes in the upper 16 bits of the external attributes * field, just like Info-ZIP's Zip for Unix. We try to use that * value, after a check for consistency with the MSDOS attribute * bits (see below). */ G.pInfo->file_attr = (unsigned)(tmp >> 16); /* fall through! */ case FS_HPFS_: case FS_NTFS_: case MAC_: case TOPS20_: default: /* Ensure that DOS subdir bit is set when the entry's name ends * in a '/'. Some third-party Zip programs fail to set the subdir * bit for directory entries. */ if ((tmp & 0x10) == 0) { extent fnlen = strlen(G.filename); if (fnlen > 0 && G.filename[fnlen-1] == '/') tmp |= 0x10; } /* read-only bit --> write perms; subdir bit --> dir exec bit */ tmp = !(tmp & 1) << 1 | (tmp & 0x10) >> 4; if ((G.pInfo->file_attr & 0700) == (unsigned)(0400 | tmp<<6)) { /* keep previous G.pInfo->file_attr setting, when its "owner" * part appears to be consistent with DOS attribute flags! */ #ifdef SYMLINKS /* Entries "made by FS_FAT_" could have been zipped on a * system that supports POSIX-style symbolic links. */ G.pInfo->symlink = S_ISLNK(G.pInfo->file_attr) && (G.pInfo->hostnum == FS_FAT_); #endif return 0; } G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp); break; } /* end switch (host-OS-created-by) */ /* for originating systems with no concept of "group," "other," "system": */ umask( (int)(tmp=umask(0)) ); /* apply mask to expanded r/w(/x) perms */ G.pInfo->file_attr &= ~tmp; return 0; } /* end function mapattr() */ /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ #ifdef ACORN_FTYPE_NFS char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */ RO_extra_block *ef_spark; /* pointer Acorn FTYPE ef block */ #endif int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels in AtheOS */ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); G.created_dir = FALSE; /* not yet */ /* user gave full pathname: don't prepend rootpath */ G.renamed_fullpath = (renamed && (*G.filename == '/')); if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM) return MPN_NOMEM; /* initialize path buffer, unless no memory */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; *pp++ = ';'; /* keep for now; remove VMS ";##" */ break; /* later, if requested */ #ifdef ACORN_FTYPE_NFS case ',': /* NFS filetype extension */ lastcomma = pp; *pp++ = ','; /* keep for now; may need to remove */ break; /* later, if requested */ #endif default: /* allow European characters in filenames: */ if (isprint(workch) || (128 <= workch && workch <= 254)) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to crea;$ UNZIP.BCKKQ[UNZIP60.ATHEOS]ATHEOS.C;1ca'te: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (G.created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %s\n", FnFilter1(G.filename))); } if (!uO.J_flag) { /* Handle the AtheOS extra field if present. */ void *ptr = scanAtheOSexfield(G.extra_field, G.lrec.extra_field_length); if (ptr) { setAtheOSexfield( G.filename, ptr ); } } #ifndef NO_CHMOD /* set approx. dir perms (make sure can still read/write in dir) */ if (chmod(G.filename, filtattr(__G__ G.pInfo->file_attr) | 0700)) perror("chmod (directory attributes) error"); #endif /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } if (!uO.J_flag) { /* Handle the AtheOS extra field if present. */ void *ptr = scanAtheOSexfield(G.extra_field, G.lrec.extra_field_length); if (ptr) { setAtheOSexfield(G.filename, ptr); } } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } /* On UNIX (and compatible systems), "." and ".." are reserved for * directory navigation and cannot be used as regular file names. * These reserved one-dot and two-dot names are mapped to "_" and "__". */ if (strcmp(pathcomp, ".") == 0) *pathcomp = '_'; else if (strcmp(pathcomp, "..") == 0) strcpy(pathcomp, "__"); #ifdef ACORN_FTYPE_NFS /* translate Acorn filetype information if asked to do so */ if (uO.acorn_nfs_ext && (ef_spark = (RO_extra_block *) getRISCOSexfield(G.extra_field, G.lrec.extra_field_length)) != (RO_extra_block *)NULL) { /* file *must* have a RISC OS extra field */ long ft = (long)makelong(ef_spark->loadaddr); /*32-bit*/ if (lastcomma) { pp = lastcomma + 1; while (isxdigit((uch)(*pp))) ++pp; if (pp == lastcomma+4 && *pp == '\0') *lastcomma='\0'; /* nuke */ } if ((ft & 1<<31)==0) ft=0x000FFD00; sprintf(pathcomp+strlen(pathcomp), ",%03x", (int)(ft>>8) & 0xFFF); } #endif /* ACORN_FTYPE_NFS */ if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { /* static int rootlen = 0; */ /* length of rootpath */ /* static char *rootpath; */ /* user's "extract-to" directory */ /* static char *buildpath; */ /* full path (so far) to extracted file */ /* static char *end; */ /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*G.end = *pathcomp++) != '\0') ++G.end; #ifdef SHORT_NAMES /* path components restricted to 14 chars, typically */ if ((G.end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(G.end = old_end + FILENAME_MAX) = '\0'; #endif /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ /* next check: need to append '/', at least one-char name, '\0' */ if ((G.end-G.buildpath) > FILNAMSIZ-3) too_long = TRUE; /* check if extracting dir? */ if (SSTAT(G.buildpath, &G.statbuf)) { /* path doesn't exist */ if (!G.create_dirs) { /* told not to create (freshening) */ free(G.buildpath); return MPN_INF_SKIP; /* path doesn't exist: nothing to do */ } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(G.buildpath))); free(G.buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (mkdir(G.buildpath, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ unable to process %s.\n", FnFilter2(G.buildpath), FnFilter1(G.filename))); free(G.buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } G.created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n\ unable to process %s.\n", FnFilter2(G.buildpath), FnFilter1(G.filename))); free(G.buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(G.buildpath))); free(G.buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *G.end++ = '/'; *G.end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(G.buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*-------------< UNZIP.BCKKQ[UNZIP60.ATHEOS]ATHEOS.C;1clm6-------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free G.buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, G.buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(G.buildpath); G.buildpath = G.end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*G.end = *pathcomp++) != '\0') { ++G.end; #ifdef SHORT_NAMES /* truncate name at 14 characters, typically */ if ((G.end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(G.end = old_end + FILENAME_MAX) = '\0'; #endif if ((G.end-G.buildpath) >= FILNAMSIZ) { *--G.end = '\0'; Info(slide, 0x201, ((char *)slide, "checkdir warning: path too long; truncating\n\ %s\n -> %s\n", FnFilter1(G.filename), FnFilter2(G.buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(G.buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ /* GRR: for VMS and TOPS-20, add up to 13 to strlen */ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); #ifdef ACORN_FTYPE_NFS if ((G.buildpath = (char *)malloc(strlen(G.filename)+G.rootlen+ (uO.acorn_nfs_ext ? 5 : 1))) #else if ((G.buildpath = (char *)malloc(strlen(G.filename)+G.rootlen+1)) #endif == (char *)NULL) return MPN_NOMEM; if ((G.rootlen > 0) && !G.renamed_fullpath) { strcpy(G.buildpath, G.rootpath); G.end = G.buildpath + G.rootlen; } else { *G.buildpath = '\0'; G.end = G.buildpath; } Trace((stderr, "[%s]\n", FnFilter1(G.buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if necessary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { G.rootlen = 0; return MPN_OK; } if (G.rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((G.rootlen = strlen(pathcomp)) > 0) { char *tmproot; if ((tmproot = (char *)malloc(G.rootlen+2)) == (char *)NULL) { G.rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (tmproot[G.rootlen-1] == '/') { tmproot[--G.rootlen] = '\0'; } if (G.rootlen > 0 && (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode))) { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); G.rootlen = 0; /* skip (or treat as stored file) */ return MPN_INF_SKIP; } /* create the directory (could add loop here scanning tmproot * to create more than one level, but why really necessary?) */ if (mkdir(tmproot, 0777) == -1) { Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n", FnFilter1(tmproot))); free(tmproot); G.rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdir levels required */ return MPN_ERR_SKIP; } } tmproot[G.rootlen++] = '/'; tmproot[G.rootlen] = '\0'; if ((G.rootpath = (char *)realloc(tmproot, G.rootlen+1)) == NULL) { free(tmproot); G.rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(G.rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (G.rootlen > 0) { free(G.rootpath); G.rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ static int get_extattribs OF((__GPRO__ iztimes *pzt, ulg z_uidgid[2])); static int get_extattribs(__G__ pzt, z_uidgid) __GDEF iztimes *pzt; ulg z_uidgid[2]; { /*--------------------------------------------------------------------------- Convert from MSDOS-format local time and date to Unix-format 32-bit GMT time: adjust base year from 1980 to 1970, do usual conversions from yy/mm/dd hh:mm:ss to elapsed seconds, and account for timezone and day- light savings time differences. If we have a Unix extra field, however, we're laughing: both mtime and atime are ours. On the other hand, we then have to check for restoration of UID/GID. ---------------------------------------------------------------------------*/ int have_uidgid_flg; unsigned eb_izux_flg; eb_izux_flg = (G.extra_field ? ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, #ifdef IZ_CHECK_TZ (G.tz_is_valid ? pzt : NULL), #else pzt, #endif z_uidgid) : 0); if (eb_izux_flg & EB_UT_FL_MTIME) { TTrace((stderr, "\nget_extattribs: Unix e.f. modif. time = %ld\n", pzt->mtime)); } else { pzt->mtime = dos_to_unix_time(G.lrec.last_mod_dos_datetime); } if (eb_izux_flg & EB_UT_FL_ATIME) { TTrace((stderr, "get_extattribs: Unix e.f. access time = %ld\n", pzt->atime)); } else { pzt->atime = pzt->mtime; TTrace((stderr, "\nget_extattribs: modification/access times = %ld\n", pzt=@& UNZIP.BCKKQ[UNZIP60.ATHEOS]ATHEOS.C;1cE->mtime)); } /* if -X option was specified and we have UID/GID info, restore it */ have_uidgid_flg = #ifdef RESTORE_UIDGID (uO.X_flag && (eb_izux_flg & EB_UX2_VALID)); #else 0; #endif return have_uidgid_flg; } /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) /* GRR: change to return PK-style warning level */ __GDEF { union { iztimes t3; /* mtime, atime, ctime */ struct utimbuf t2; /* modtime, actime */ } zt; ulg z_uidgid[2]; int have_uidgid_flg; /*--------------------------------------------------------------------------- If symbolic links are supported, allocate storage for a symlink control structure, put the uncompressed "data" and other required info in it, and add the structure to the "deferred symlinks" chain. Since we know it's a symbolic link to start with, we shouldn't have to worry about overflowing unsigned ints with unsigned longs. ---------------------------------------------------------------------------*/ #ifdef SYMLINKS if (G.symlnk) { extent ucsize = (extent)G.lrec.ucsize; unsigned AtheOSef_len = 0; extent slnk_entrysize; uch *AtheOS_exfld = NULL; slinkentry *slnk_entry; if (!uO.J_flag) { /* attributes for symlinks are supported too */ AtheOS_exfld = scanAtheOSexfield(G.extra_field, G.lrec.extra_field_length); if (AtheOS_exfld) { AtheOSef_len = makeword(EB_LEN + AtheOS_exfld) + EB_HEADSIZE; } } /* size of the symlink entry is the sum of * (struct size (includes 1st '\0') + 1 additional trailing '\0'), * system specific attribute data size (might be 0), * and the lengths of name and link target. */ slnk_entrysize = (sizeof(slinkentry) + 1) + AtheOSef_len + ucsize + strlen(G.filename); if (slnk_entrysize < ucsize) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed: mem alloc overflow\n", FnFilter1(G.filename))); fclose(G.outfile); return; } if ((slnk_entry = (slinkentry *)malloc(slnk_entrysize)) == NULL) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed: no mem\n", FnFilter1(G.filename))); fclose(G.outfile); return; } slnk_entry->next = NULL; slnk_entry->targetlen = ucsize; slnk_entry->attriblen = AtheOSef_len; slnk_entry->target = slnk_entry->buf + AtheOSef_len; slnk_entry->fname = slnk_entry->target + ucsize + 1; strcpy(slnk_entry->fname, G.filename); if (AtheOSef_len > 0) /* AtheOS_exfld should not be NULL because AtheOSef_len > 0 */ memcpy(slnk_entry->buf, AtheOS_exfld, AtheOSef_len); /* move back to the start of the file to re-read the "link data" */ rewind(G.outfile); if (fread(slnk_entry->target, 1, ucsize, G.outfile) != ucsize) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed\n", FnFilter1(G.filename))); free(slnk_entry); fclose(G.outfile); return; } fclose(G.outfile); /* close "link" file for good... */ slnk_entry->target[ucsize] = '\0'; if (QCOND2) Info(slide, 0, ((char *)slide, "-> %s ", FnFilter1(slnk_entry->target))); /* add this symlink record to the list of deferred symlinks */ if (G.slink_last != NULL) G.slink_last->next = slnk_entry; else G.slink_head = slnk_entry; G.slink_last = slnk_entry; return; } #endif /* SYMLINKS */ fclose(G.outfile); /* handle the AtheOS extra field if present */ if (!uO.J_flag) { void *ptr = scanAtheOSexfield(G.extra_field, G.lrec.extra_field_length); if (ptr) { setAtheOSexfield(G.filename, ptr); } } have_uidgid_flg = get_extattribs(__G__ &(zt.t3), z_uidgid); /* if -X option was specified and we have UID/GID info, restore it */ if (have_uidgid_flg) { TTrace((stderr, "close_outfile: restoring Unix UID/GID info\n")); if (chown(G.filename, (uid_t)z_uidgid[0], (gid_t)z_uidgid[1])) { if (uO.qflag) Info(slide, 0x201, ((char *)slide, "warning: cannot set UID %lu and/or GID %lu for %s\n", z_uidgid[0], z_uidgid[1], FnFilter1(G.filename))); else Info(slide, 0x201, ((char *)slide, " (warning) cannot set UID %lu and/or GID %lu", z_uidgid[0], z_uidgid[1])); } } /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { /* set the file's access and modification times */ if (utime(G.filename, &(zt.t2))) { if (uO.qflag) Info(slide, 0x201, ((char *)slide, "warning: cannot set times for %s\n", FnFilter1(G.filename))); else Info(slide, 0x201, ((char *)slide, " (warning) cannot set times")); } } /*--------------------------------------------------------------------------- Change the file permissions from default ones to those stored in the zipfile. ---------------------------------------------------------------------------*/ #ifndef NO_CHMOD if (chmod(G.filename, filtattr(__G__ G.pInfo->file_attr))) perror("chmod (file attributes) error"); #endif } /* end function close_outfile() */ #ifdef SYMLINKS int set_symlnk_attribs(__G__ slnk_entry) __GDEF slinkentry *slnk_entry; { if (slnk_entry->attriblen > 0) setAtheOSexfield(slnk_entry->fname, (uch *)slnk_entry->buf); /* currently, no error propagation... */ return PK_OK; } #endif /* SYMLINKS */ #ifdef SET_DIR_ATTRIB /* messages of code for setting directory attributes */ static ZCONST char Far DirlistUidGidFailed[] = "warning: cannot set UID %lu and/or GID %lu for %s\n"; static ZCONST char Far DirlistUtimeFailed[] = "warning: cannot set modification, access times for %s\n"; # ifndef NO_CHMOD static ZCONST char Far DirlistChmodFailed[] = "warning: cannot set permissions for %s\n"; # endif int defer_dir_attribs(__G__ pd) __GDEF direntry **pd; { uxdirattr *d_entry; d_entry = (uxdirattr *)malloc(sizeof(uxdirattr) + strlen(G.filename)); *pd = (direntry *)d_entry; if (d_entry == (uxdirattr *)NULL) { return PK_MEM; } d_entry->fn = d_entry->fnbuf; strcpy(d_entry->fn, G.filename); d_entry->perms = G.pInfo->file_attr; d_entry->have_uidgid = get_extattribs(__G__ &(d_entry->u.t3), d_entry->uidgid); return PK_OK; } /* end function defer_dir_attribs() */ int set_direc_attribs(__G__ d) __GDEF direntry *d; { int errval = PK_OK; if (UxAtt(d)->have_uidgid && chown(UxAtt(d)->fn, (uid_t)UxAtt(d)->uidgid[0], (gid_t)UxAtt(d)->uidgid[1])) { Info(slide, 0x201, ((char *)slide, LoadFarString(DirlistUidGidFailed), UxAtt(d)->uidgid[0], UxAtt(d)->uidgid[1], FnFilter1(d->fn))); if (!errval) errv>% UNZIP.BCKKQ[UNZIP60.ATHEOS]ATHEOS.C;1cUTal = PK_WARN; } /* Skip restoring directory time stamps on user' request. */ if (uO.D_flag <= 0) { /* restore directory timestamps */ if (utime(d->fn, &UxAtt(d)->u.t2)) { Info(slide, 0x201, ((char *)slide, LoadFarString(DirlistUtimeFailed), FnFilter1(d->fn))); if (!errval) errval = PK_WARN; } } #ifndef NO_CHMOD if (chmod(d->fn, filtattr(__G__ UxAtt(d)->perms))) { Info(slide, 0x201, ((char *)slide, LoadFarString(DirlistChmodFailed), FnFilter1(d->fn))); /* perror("chmod (file attributes) error"); */ if (!errval) errval = PK_WARN; } #endif /* !NO_CHMOD */ return errval; } /* end function set_direc_attribs() */ #endif /* SET_DIR_ATTRIB */ #ifdef TIMESTAMP /***************************/ /* Function stamp_file() */ /***************************/ int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime; { ztimbuf tp; tp.modtime = tp.actime = modtime; return (utime(fname, &tp)); } /* end function stamp_file() */ #endif /* TIMESTAMP */ #ifndef SFX /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { sprintf((char *)slide, LoadFarString(CompiledWith), #ifdef __GNUC__ "gcc ", __VERSION__, #else "(unknown compiler) ","", #endif "Syllable", #if defined(i486) || defined(__i486) || defined(__i486__) || defined(i386) || defined(__i386) || defined(__i386__) " (x86)", #else " (unknown platform)", #endif #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0); } /* end function version() */ #endif /* !SFX */ /*********************************/ /* AtheOS extra field functions */ /*********************************/ /* ** Scan the extra fields in extra_field, and look for a AtheOS EF; return a ** pointer to that EF, or NULL if it's not there. */ static uch *scanAtheOSexfield(const uch *ef_ptr, unsigned ef_len) { while( ef_ptr != NULL && ef_len >= EB_HEADSIZE ) { unsigned eb_id = makeword(EB_ID + ef_ptr); unsigned eb_len = makeword(EB_LEN + ef_ptr); if (eb_len > (ef_len - EB_HEADSIZE)) { Trace((stderr, "scanAtheOSexfield: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } if (eb_id == EF_ATHEOS && eb_len >= EB_BEOS_HLEN) { return (uch *)ef_ptr; } ef_ptr += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); } return NULL; } /* Used by setAtheOSexfield(): Set a file/directory's attributes to the attributes passed in. If set_file_attrs() fails, an error will be returned: EOK - no errors occurred (other values will be whatever the failed function returned; no docs yet, or I'd list a few) */ static int set_file_attrs( const char *name, const unsigned char *attr_buff, const off_t attr_size ) { int retval = EOK; unsigned char *ptr; const unsigned char *guard; int fd; ptr = (unsigned char *)attr_buff; guard = ptr + attr_size; fd = open(name, O_RDWR | O_NOTRAVERSE); if (fd < 0) { return errno; /* should it be -fd ? */ } while (ptr < guard) { ssize_t nError; struct attr_info fa_info; const char *attr_name; unsigned char *attr_data; attr_name = (char *)&(ptr[0]); ptr += strlen(attr_name) + 1; /* The attr_info data is stored in little-endian format because the */ /* Intel i386 port was here first. */ memcpy(&fa_info, ptr, sizeof(struct attr_info)); ptr += sizeof(struct attr_info); if (fa_info.ai_size < 0LL) { Info(slide, 0x201, ((char *)slide, "warning: skipping attribute with invalid length (%Ld)\n", fa_info.ai_size)); break; } attr_data = ptr; ptr += fa_info.ai_size; if (ptr > guard) { /* We've got a truncated attribute. */ Info(slide, 0x201, ((char *)slide, "warning: truncated attribute\n")); break; } /* write_attr() doesn't return count of written bytes now (Syllable 0.5.3)... */ nError = write_attr(fd, attr_name, O_TRUNC, fa_info.ai_type, attr_data, 0, fa_info.ai_size); if (nError < 0) { Info(slide, 0x201, ((char *)slide, "warning: error writing file attribute\n")); } } close(fd); return retval; } static void setAtheOSexfield(const char *path, uch *extra_field) { uch *ptr = extra_field; ush id = 0; ush size = 0; ulg full_size = 0; uch flags = 0; uch *attrbuff = NULL; int retval; if( extra_field == NULL ) { return; } /* Collect the data from the extra field buffer. */ id = makeword(ptr); ptr += 2; /* we don't use this... */ size = makeword(ptr); ptr += 2; full_size = makelong(ptr); ptr += 4; flags = *ptr; ptr++; /* Do a little sanity checking. */ if (flags & EB_BE_FL_BADBITS) { /* corrupted or unsupported */ Info(slide, 0x201, ((char *)slide, "Unsupported flags set for this AtheOS extra field, skipping.\n")); return; } if (size <= EB_BEOS_HLEN) { /* corrupted, unsupported, or truncated */ Info(slide, 0x201, ((char *)slide, "AtheOS extra field is %d bytes, should be at least %d.\n", size, EB_BEOS_HLEN)); return; } if (full_size < (size - EB_BEOS_HLEN)) { Info(slide, 0x201, ((char *)slide, "Skipping attributes: AtheOS extra field is %d bytes, " "data size is %ld.\n", size - EB_BEOS_HLEN, full_size)); return; } /* Find the AtheOS file attribute data. */ if (flags & EB_BE_FL_UNCMPR) { /* Uncompressed data */ attrbuff = ptr; } else { /* Compressed data */ attrbuff = (uch *)malloc( full_size ); if (attrbuff == NULL) { /* No memory to uncompress attributes */ Info(slide, 0x201, ((char *)slide, "Can't allocate memory to uncompress file attributes.\n")); return; } retval = memextract(__G__ attrbuff, full_size, ptr, size - EB_BEOS_HLEN); if( retval != PK_OK ) { /* error uncompressing attributes */ Info(slide, 0x201, ((char *)slide, "Error uncompressing file attributes.\n")); /* Some errors here might not be so bad; we should expect */ /* some truncated data, for example. If the data was */ /* corrupt, we should _not_ attempt to restore the attrs */ /* for this file... there's no way to detect what attrs */ /* are good and which are bad. */ free (attrbuff); return; } } /* Now attempt to set the file attributes on the extracted file. */ retval = set_file_attrs(path, attrbuff, (off_t)full_size); if (retval != EOK) { Info(slide, 0x201, ((char *)slide, "Error writing file attributes.\n")); } /* Clean ?IE UNZIP.BCKKQ[UNZIP60.ATHEOS]ATHEOS.C;1cȇcup, if necessary */ if (attrbuff != ptr) { free(attrbuff); } return; } *[UNZIP60.ATHEOS]ATHEOS.H;1+,W./ 4@-Q0123KPWO56x7x89GHJ/* Copyright (c) 1990-2004 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* atheos.h -- A few handy things for the AtheOS port * * (c) 1997 Chris Herborth (chrish@qnx.com) - BeOS port * (c) 2004 Ruslan Nickolaev (nruslan@hotbox.ru) - AtheOS port * * This is covered under the usual Info-ZIP copyright */ #ifndef _ATHEOS_H_ #define _ATHEOS_H_ #define EB_BE_FL_BADBITS 0xfe /* bits currently undefined */ /* AtheOS 'At' extra-field layout: (same structure as the BeOS 'Be' e.f. layout, only signature and internal conventions of the file attribute data are different...) 'At' - signature ef_size - size of data in this EF (little-endian unsigned short) full_size - uncompressed data size (little-endian unsigned long) flag - flags (byte) flags & EB_BE_FL_UNCMPR = the data is not compressed flags & EB_BE_FL_BADBITS = the data is corrupted or we can't handle it properly data - compressed or uncompressed file attribute data If flag & EB_BE_FL_UNCMPR, the data is not compressed; this optimisation is necessary to prevent wasted space for files with small attributes. In this case, there should be (ef_size - EB_BEOS_HLEN) bytes of data, and full_size should equal (ef_size - EB_BEOS_HLEN). If the data is compressed, there will be (ef_size - EB_BEOS_HLEN) bytes of compressed data, and full_size bytes of uncompressed data. If a file has absolutely no attributes, there will not be a 'At' extra field. The uncompressed data is arranged like this: attr_name\0 - C string struct attr_info (fields in little-endian format) attr_data (length in attr_info.ai_size) */ #endif /* _ATHEOS_H_ */ *[UNZIP60.ATHEOS]CONTENTS.;1+,./ 4@-Q0123KPWO56y7y89GHJContents of the "atheos" sub-directory for UnZip 5.52 and later: Contents this file README notes from the author of the AtheOS port Makefile makefile for building UnZip athcfg.h AtheOS-specific configuration settings atheos.c AtheOS-specific routines (similar to the BeOS/Unix ones) atheos.h structures for the AtheOS extra field - Ruslan Nickolaev (nruslan@hotbox.ru) *[UNZIP60.ATHEOS]MAKEFILE.;1+,./ 4@-Q0123KPWO56? 7? 89GHJ###################################################################### # # Makefile for Info-ZIP's unzip, unzipsfx, and funzip on AtheOS # Version 5.53 # # Copyright (C) 1998-2006 Info-ZIP # Chris Herborth (chrish@qnx.com) # Copyright (C) 2004 Nikolaev Ruslan (nruslan@hotbox.ru) # # To automatically install the fresh new unzip, use the "install" target: # make -f atheos/Makefile install ###################################################################### SHELL = /bin/bash # Punish those of you not running on SMP hardware... MAKE = make -j 4 -f atheos/Makefile # UnZipSFX flags SL = -o unzipsfx SL2 = $(LF2) # fUnZip flags FL = -o funzip FL2 = $(LF2) # general-purpose stuff CP = cp AS = as RM = rm -f LN = ln -sf CHMOD = chmod E = O = .o M = atheos OSDEP_H = atheos/athcfg.h # define # object files OBJS1 = unzip$O crc32$O crc_i386$O crypt$O envargs$O explode$O OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O OBJS3 = process$O ttyio$O ubz2err$O unreduce$O unshrink$O zipinfo$O OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O LOBJS = $(OBJS) OBJSDLL = $(OBJS) api$O OBJX = unzipsfx$O crc32_$O crc_i386$O crypt_$O extract_$O fileio_$O globals_$O inflate_$O match_$O process_$O ttyio_$O ubz2err_$O $M_$O LOBJX = $(OBJX) OBJF = funzip$O crc32f$O crc_i386$O cryptf$O globalsf$O inflatef$O ttyiof$O UNZIP_H = unzip.h unzpriv.h globals.h $(OSDEP_H) # installation INSTALL = install manext = 1 prefix = /usr BINDIR = $(prefix)/bin MANDIR = $(prefix)/man/man$(manext) INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/zipinfo$E $(BINDIR)/unzipsfx$E $(BINDIR)/unzip$E INSTALLEDMAN = $(MANDIR)/unzip.$(manext) $(MANDIR)/funzip.$(manext) $(MANDIR)/unzipsfx.$(manext) $(MANDIR)/zipinfo.$(manext) # UNZIPS = unzip$E funzip$E unzipsfx$E zipinfo$E # this is a little ugly...well, no, it's a lot ugly: MANS = man/unzip.1 man/unzipsfx.1 man/zipinfo.1 man/funzip.1 man/zipgrep.1 ###################################################################### CC=gcc LD=gcc CF=-O3 -march=i586 -Wall -I. -DPASSWD_FROM_STDIN -DASM_CRC -DUSE_UNSHRINK $(LOCAL_UNZIP) LF=-o unzip LF2= TARGET=$(UNZIPS) ###################################################################### # Helpful targets all: @echo 'TARGET = $(TARGET)' @echo 'CC = $(CC)' if [ -n "$(TARGET)" ] ; then \ $(MAKE) CC=$(CC) CF="$(CF)" LD="$(LD)" \ LF="$(LF)" LF2="$(LF2)" CCPP="$(CC)" CPPF="$(CF)" \ OBJS="$(OBJS)" LOBJS="$(LOBJS)" OBJX="$(OBJX)" \ LOBJX="$(LOBJX)" $(TARGET) ; \ else \ $(MAKE) help ; \ fi help: @echo '' @echo "This Makefile lets you build Info-ZIP's zip." @echo '' @echo 'To build zip for this computer using the default compiler, just do:' @echo '' @echo ' make -f atheos/Makefile' @echo '' ###################################################################### # Basic compile instructions and dependencies # this is for GNU make; comment out and notify zip-bugs if it causes errors .SUFFIXES: .c .o # default for compiling C files .c.o: $(CC) -c $(CF) $*.c unzips: $(UNZIPS) objs: $(OBJS) objsdll: $(OBJSDLL) unzipsman: unzips unzip$E: $(OBJS) $(LD) $(LF) $(LOBJS) $(LF2) $(CHMOD) +x unzip$E unzipsfx$E: $(OBJX) $(LD) $(SL) $(LOBJX) $(SL2) $(CHMOD) +x unzipsfx$E funzip$E: $(OBJF) $(LD) $(FL) $(OBJF) $(FL2) $(CHMOD) +x funzip$E zipinfo$E: unzip$E $(LN) unzip$E zipinfo$E crc32$O: crc32.c $(UNZIP_H) zip.h crc32.h crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs$O: envargs.c $(UNZIP_H) explode$O: explode.c $(UNZIP_H) extract$O: extract.c $(UNZIP_H) crc32.h crypt.h fileio$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcd@aW UNZIP.BCKQNZIP60.ATHEOS]MAKEFILE.;1aic.h funzip$O: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h globals$O: globals.c $(UNZIP_H) inflate$O: inflate.c inflate.h $(UNZIP_H) list$O: list.c $(UNZIP_H) match$O: match.c $(UNZIP_H) process$O: process.c $(UNZIP_H) crc32.h ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$O: ubz2err.c $(UNZIP_H) unreduce$O: unreduce.c $(UNZIP_H) unshrink$O: unshrink.c $(UNZIP_H) unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo$O: zipinfo.c $(UNZIP_H) crc_i386$O: crc_i386.S $(CC) -E crc_i386.S > crc_i386s.s $(AS) -o $@ crc_i386s.s $(RM) crc_i386s.s # unzipsfx only unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CP) unzip.c unzipsfx.c $(CC) -c $(CF) -DSFX unzipsfx.c $(RM) unzipsfx.c crc32_$O: crc32.c $(UNZIP_H) zip.h crc32.h $(CP) crc32.c crc32_.c $(CC) -c $(CF) -DSFX crc32_.c $(RM) crc32_.c crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CP) crypt.c crypt_.c $(CC) -c $(CF) -DSFX crypt_.c $(RM) crypt_.c extract_$O: extract.c $(UNZIP_H) crc32.h crypt.h $(CP) extract.c extract_.c $(CC) -c $(CF) -DSFX extract_.c $(RM) extract_.c fileio_$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CP) fileio.c fileio_.c $(CC) -c $(CF) -DSFX fileio_.c $(RM) fileio_.c globals_$O: globals.c $(UNZIP_H) $(CP) globals.c globals_.c $(CC) -c $(CF) -DSFX globals_.c $(RM) globals_.c inflate_$O: inflate.c inflate.h $(UNZIP_H) crypt.h $(CP) inflate.c inflate_.c $(CC) -c $(CF) -DSFX inflate_.c $(RM) inflate_.c match_$O: match.c $(CP) match.c match_.c $(CC) -c $(CF) -DSFX match_.c $(RM) match_.c process_$O: process.c $(UNZIP_H) crc32.h $(CP) process.c process_.c $(CC) -c $(CF) -DSFX process_.c $(RM) process_.c ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CP) ttyio.c ttyio_.c $(CC) -c $(CF) -DSFX ttyio_.c $(RM) ttyio_.c ubz2err$O: ubz2err.c $(UNZIP_H) $(CP) ubz2err.c ubz2err_.c $(CC) -c $(CF) -DSFX ubz2err_.c $(RM) ubz2err_.c # funzip only crc32f$O: crc32.c $(UNZIP_H) zip.h crc32.h $(CP) crc32.c crc32f.c $(CC) -c $(CF) -DFUNZIP crc32f.c $(RM) crc32f.c cryptf$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CP) crypt.c cryptf.c $(CC) -c $(CF) -DFUNZIP cryptf.c $(RM) cryptf.c globalsf$O: globals.c $(UNZIP_H) $(CP) globals.c globalsf.c $(CC) -c $(CF) -DFUNZIP globalsf.c $(RM) globalsf.c inflatef$O: inflate.c inflate.h $(UNZIP_H) crypt.h $(CP) inflate.c inflatef.c $(CC) -c $(CF) -DFUNZIP inflatef.c $(RM) inflatef.c ttyiof$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CP) ttyio.c ttyiof.c $(CC) -c $(CF) -DFUNZIP ttyiof.c $(RM) ttyiof.c # AtheOS specific code atheos$O: atheos/atheos.c $(UNZIP_H) unzvers.h atheos/atheos.h $(CC) -c $(CF) atheos/atheos.c # version() not used by unzipsfx, so no unzvers.h dependency atheos_$O: atheos/atheos.c $(UNZIP_H) atheos/atheos.h # unzipsfx only $(CP) atheos/atheos.c atheos_.c $(CC) -c $(CF) -Iatheos -DSFX atheos_.c $(RM) atheos_.c # this really only works for Unix targets, unless E and O specified on cmd line clean: $(RM) $(UNZIPS) $(OBJS) $(OBJF) $(OBJX) api$O apihelp$O crc_gcc$O unzipstb$O install: all $(INSTALL) -m 755 $(UNZIPS) $(BINDIR) $(RM) $(BINDIR)/zipinfo$E $(LN) unzip$E $(BINDIR)/zipinfo$E $(RM) $(BINDIR)/zipgrep$E $(INSTALL) -m 755 unix/zipgrep $(BINDIR)/zipgrep$E $(INSTALL) -m 644 man/unzip.1 $(MANDIR)/unzip.$(manext) $(INSTALL) -m 644 man/unzipsfx.1 $(MANDIR)/unzipsfx.$(manext) $(INSTALL) -m 644 man/zipinfo.1 $(MANDIR)/zipinfo.$(manext) $(INSTALL) -m 644 man/funzip.1 $(MANDIR)/funzip.$(manext) $(INSTALL) -m 644 man/zipgrep.1 $(MANDIR)/zipgrep.$(manext) # alternatively, could use zip method: -cd $(BINDIR); $(RM) $(UNZIPS) [etc.] uninstall: $(RM) $(INSTALLEDBIN) $(INSTALLEDMAN) TESTZIP = testmake.zip # the test zipfile # test some basic features of the build test: check check: @echo '##### This is a Unix-specific target. (Just so you know.)' @echo '##### Make sure unzip, funzip and unzipsfx are compiled and' @echo '##### in this directory.' @if test ! -f ./unzip; then \ echo "##### ERROR: can't find ./unzip"; exit 1; fi @if test ! -f ./funzip; then \ echo "##### ERROR: can't find ./funzip"; exit 1; fi @if test ! -f ./unzipsfx; then \ echo "##### ERROR: can't find ./unzipsfx"; exit 1; fi # @if test ! -f $(TESTZIP); then \ echo "##### ERROR: can't find test file $(TESTZIP)"; exit 1; fi # @echo "##### testing extraction" @./unzip -bo $(TESTZIP) testmake.zipinfo @if test ! -f testmake.zipinfo ; then \ echo "##### ERROR: file extraction from $(TESTZIP) failed"; \ exit 1; fi # @echo '##### testing zipinfo (unzip -Z)' @./unzip -Z $(TESTZIP) > testmake.unzip-Z @if diff testmake.unzip-Z testmake.zipinfo; then echo "OK."; else \ echo "##### WARNING: zipinfo output doesn't match stored version"; \ echo '##### (If the only difference is the file times, compare your'; \ echo '##### timezone with the Central European timezone, which is one'; \ echo '##### hour east of Greenwich but effectively 2 hours east'; \ echo '##### during summer Daylight Savings Time. The upper two'; \ echo '##### lines should correspond to your local time when the'; \ echo '##### files were created, on 19 November 1998 at 10:46pm CET.'; \ echo '##### If the times are consistent, please ignore this warning.)'; \ fi @$(RM) testmake.unzip-Z testmake.zipinfo # @echo '##### testing unzip -d exdir option' @./unzip -bo $(TESTZIP) -d testun notes @cat testun/notes # @echo '##### testing unzip -o and funzip (ignore funzip warning)' @./unzip -boq $(TESTZIP) notes -d testun @./funzip < $(TESTZIP) > testun/notes2 @if diff testun/notes testun/notes2; then true; else \ echo '##### ERROR: funzip output disagrees with unzip'; fi # @echo '##### testing unzipsfx (self-extractor)' @cat unzipsfx $(TESTZIP) > testsfx @$(CHMOD) 0700 testsfx @./testsfx -bo notes @if diff notes testun/notes; then true; else \ echo '##### ERROR: unzipsfx file disagrees with unzip'; fi @$(RM) testsfx notes testun/notes testun/notes2 @rmdir testun # @echo '##### testing complete.' *[UNZIP60.ATHEOS]README.;1+,-./ 4@-Q0123KPWO56F7F89GHJUnZip 5.51 for AtheOS/Syllable This port is based on both BeOS and UNIX versions. As BeOS version it can extract specific file attributes. TODO ---- There is only one thing to be fixed: write_attr() should return count of bytes written. However that's a bug related with AFS only. Please report any bugs to Zip-Bugs@lists.wku.edu. If this bug related with AtheOS/Syllable only, you can mail me directly: nruslan@hotbox.ru. - Ruslan Nickolaev (nruslan@hotbox.ru) Sep 06/2004 *[UNZIP60]BEOS.DIR;1+,Z./ 4->0123 KPWO56Սv7Սv89GHJIA#2 UNZIP.BCKZ>[UNZIP60]BEOS.DIR;1[BEOCFG.Hn(BEOS.CjBEOS.Hm? BEOSMAIN.CPPy6 CONTENTS.` MAKEFILE.gREADME.i UNZIP.RSC UNZIPSFX.RSC0*[UNZIP60.BEOS]BEOCFG.H;1+,n(./ 4:@-Z0123KPWO56hW7hW89GHJ /* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- BeOS specific configuration section: ---------------------------------------------------------------------------*/ #ifndef __beocfg_h #define __beocfg_h #include /* [cjh]: This is pretty much a generic */ #include /* POSIX 1003.1 system; see beos/ for */ #include /* extra code to deal with our extra file */ #include /* attributes. */ #include #include #define GOT_UTIMBUF #define DIRENT #include #ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY /* GRR: customize with locale.h somehow? */ #endif #define lenEOL 1 #define PutNativeEOL *q++ = native(LF); #define SCREENSIZE(ttrows, ttcols) screensize(ttrows, ttcols) #define SCREENWIDTH 80 #if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)) # define USE_EF_UT_TIME #endif #define SET_SYMLINK_ATTRIBS #define SET_DIR_ATTRIB #if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP #endif #define RESTORE_UIDGID #define NO_STRNICMP /* not in the x86 headers at least */ #define INT_SPRINTF #define SYMLINKS #define MAIN main_stub /* now that we're using a wrapper... */ /* Static variables that we have to add to Uz_Globs: */ #define SYSTEM_SPECIFIC_GLOBALS \ int created_dir, renamed_fullpath;\ char *rootpath, *buildpath, *end;\ ZCONST char *wildname;\ char *dirname, matchname[FILNAMSIZ];\ int rootlen, have_dirname, dirnamelen, notfirstcall;\ zvoid *wild_dir; /* created_dir, and renamed_fullpath are used by both mapname() and */ /* checkdir(). */ /* rootlen, rootpath, buildpath and end are used by checkdir(). */ /* wild_dir, dirname, wildname, matchname[], dirnamelen, have_dirname, */ /* and notfirstcall are used by do_wild(). */ #endif /* !__beocfg_h */ *[UNZIP60.BEOS]BEOS.C;1+,j.k/ 4kk0@-Z0123KPWOl56ŊW7ŊW89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- beos.c BeOS-specific routines for use with Info-ZIP's UnZip 5.30 and later. (based on unix/unix.c) Contains: do_wild() <-- generic enough to put in fileio.c? mapattr() mapname() checkdir() close_outfile() defer_dir_attribs() set_direc_attribs() stamp_file() version() scanBeOSexfield() set_file_attrs() setBeOSexfield() printBeOSexfield() assign_MIME() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #include "beos.h" #include /* Just make sure we've got a few things... */ #include #include #include #include /* For the new post-DR8 file attributes */ #include #include #include static unsigned filtattr OF((__GPRO__ unsigned perms)); static uch *scanBeOSexfield OF((const uch *ef_ptr, unsigned ef_len)); static int set_file_attrs( const char *, const unsigned char *, const off_t ); static void setBeOSexfield OF((const char *path, uch *extra_field)); #ifdef BEOS_USE_PRINTEXFIELD static void printBeOSexfield OF((int isdir, uch *extra_field)); #endif #ifdef BEOS_ASSIGN_FILETYPE static void assign_MIME( const char * ); #endif #ifdef SET_DIR_ATTRIB typedef struct uxdirattr { /* struct for holding unix style directory */ struct uxdirattr *next; /* info until can be sorted and set at end */ char *fn; /* filename of directory */ union { iztimes t3; /* mtime, atime, ctime */ ztimbuf t2; /* modtime, actime */ } u; unsigned perms; /* same as min_info.file_attr */ int have_uidgid; /* flag */ ulg uidgid[2]; char fnbuf[1]; /* buffer stub for directory name */ } uxdirattr; #define UxAtt(d) ((uxdirattr *)d) /* typecast shortcut */ #endif /* SET_DIR_ATTRIB */ #ifdef ACORN_FTYPE_NFS /* Acorn bits for NFS filetyping */ typedef struct { uch ID[2]; uch size[2]; uch ID_2[4]; uch loadaddr[4]; uch execaddr[4]; uch attr[4]; } RO_extra_block; #endif /* ACORN_FTYPE_NFS */ /* static int created_dir; */ /* used in mapname(), checkdir() */ /* static int renamed_fullpath; */ /* ditto */ /*****************************/ /* Strings used multiple */ /* times in beos.c */ /*****************************/ /* messages of code for setting file/directory attributes */ static ZCONST char CannotSetItemUidGid[] = "warning: cannot set UID %lu and/or GID %lu for %s\n %s\n"; static ZCONST char CannotSetUidGid[] = " (warning) cannot set UID %lu and/or GID %lu\n %s"; static ZCONST char CannotSetItemTimestamps[] = "warning: cannot set modif./access times for %s\n %s\n"; static ZCONST char CannotSetTimestamps[] = " (warning) cannot set modif./access times\n %s"; #ifndef SFX /**********************/ /* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */ /**********************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { /* these statics are now declared in SYSTEM_SPECIFIC_GLOBALS in beocfg.h: static DIR *wild_dir = (DIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; */ struct dirent *file; /* Even when we're just returninB/# agg`;8b 1wzB[B@3pc`3yrdH*b,FG w]8'-|n`Lm[]^99DEGC \WHuCz-6|;ZAlQduP1)q6)<=FKWq mT*TjUkZQ.(5 9,&CgV=7'#k'c.F JZˍ F~V|F&{UkJ (Mx_WN _l!%`M+* LN+Nz"{ @4b'S^w;s3qbNl-d^xswb=7V1$/5A}&p/d~lrW!+)sb|M^k$A sYAI,]ED=xAE\ IW Bq{`^{vHL:x8/9/%\u x >z%o`W]F?'#A{/4}gO|^gEQEQQYf>{pGL'[:+?Ygn*TWPq6`{JT/>+="#+?RUBfRQ~klo9 A_dK0.]^3`ym84<g)7CZ-zu+73&f6|.~e a&\nm[{&y9t6b7?|0ph xp8843Yx1s5@|[ Rts-J,R>meXvB2;++hO5"G ?$b!z.NB0&E)eq ^Uz`.HO\tSmgNh5 @_{*,W>8g$Z5Aws$5+[z*6r+a#n=_KnACid$baGia{c0Osg0 @SZb$v?W3If[^@ J)?m\D/*&!gWaNY72.sfWXL{Bvo0Pm}1ER";pCZ#c~R!K0ImaP9TL+n|8,OOqU<  e; |Tt~^xEe 5w4}3,zqxolQrm:@?'\ j7](D;`~qp-];0Ok+aZ~RiHT~;*@ClPUN ;ov{4A UV-bk@\S%{PVJu t[,:e _'(G ddYx9RZ^0  yL(g\'( P 0H0kaSE[YZ@] @[A q DIjJXl *JY$) (gw,Kk78OIgIK!* ioO+xHBwMn8@Sh%?}lC?L?Vs0VK. qume3tUX+OD/Jc)'Qp4gMn"ne+j>JS /RL"hE|y Pd!@; MO*v|e! PUS0^ZN$o1-2/iXCX+T J [,t_vQlJjJX~Yq&T&y .(2F;([aqo4rvAMs&/;g(wF5 6K CuGb-6(&S44l{d=|]k= &^Dxt.'3 y Bzu]$=W@_sg+_F!*z( R]w$"c/#-A%*V5U|}*tg'0R--$|6p).QTPX[JSP V4iF n!? Jq x FI8WE,k//HuY]}VJ\`[hm;gd}SF 1}k++IQgEl1Z=^R't uyL`~_!tF%aBa/|bf'0lRA+caWk}g~&cjtm9@[}4zC 'wyCfM'xa+Zez4t9}u!~{$}9aso[O?v(DE0-nU) 2h ;c6-)p,N93p2 Qqm,u<k_ObuG^JP?QFOZ4 6l\eOI#T1S`E^tROnuir[q#yQz d=s *gZgR)F.;DJ $6"oRQS wpbhzD ]5Ei!9F}=u"JR[TsNr2,i*(nT5.,7>_I/ss=K>M-qCLY&0[r!xnB'tQu/n%>7q85y,-?XirX_T>IzqvN)/D]Je T40^=udwOE@k")t(\!a9TnB@Gph "~"_i9;^np2=CSl[>SzbmN:y.GJ.H=;bMM[}Z[ 'Ox/#:2x+fhM,kO)Xq+ D`'zy?uGS@6DJ*O"|ZE#c|*c- (`]>hVRB"4npj!?LzsYm) ]B%]c :Hcliut],T!"]Jv{{Ev;PEBu%CYps(- n-M/#^+?]x,NZde Xgw#PA om.@1] piQ7K|=NOOf@#/v68B0:`{j2r(I4h5JrXJMVMb~U Mb(RG,uC8G:A(;tp'bM%JwBS`Nb93LhpzoDaM]}wVob jd%45(JMoD`AF6&y{oP).;){tDAO"'|6-Xfch4UX}z(62({ < 8"GWb{<1 Q*HV W]N)\rm %++(|-&wNc50ovL~V%.3mPq76?,k/lmSneg%1;"~4Ji@$lmw`!&f=C? kh(i+"r%+))|w%7->n^EL( 2cjA L}E>D5M *>;X ~i ?_,n@$ e7*w>)[aI>w:9G4Ha:Y*O%\+AoA.ch62._XW& 8?pdYF;t"2v$O}<:7 M>Q$+,yl]m&I0:+o+E!ip_dI@7e=B|{E@DEdgY]kC4 &,k>wi:V@ERm5FAA&vK IAZICTS2G6Fdnj \ 0qv6<+:WH]I0|Q;M`r3|l-uBPb{Oo?qq>!1 FBxu0I}OzCpc&5+[|:|e'ELp" 6wW!ue~Q}.9J(n'o1D.b)*[B7q+g}op0kpd, x+y7g\F9=| mb#FZxqa QR]gStT:,yUx={0/tZ?#_F@{D>KT2ZU_R3QmJ0 JI "Gbk,nbTyJrd)c>`u0+s1#SR}d,z\0SaQ[ur& Pch9BTRNJV1qO L @ KQ*F'BAnBTR7 w5B-BL5m >_ t6\>kB|wi=3\*9PP[IAD +-5ARek|+ J5w/+ (]k~2C/L[m[DR6i4C Dd:UL.$Hi--ZwASBbbK*X& Oy6'"C4%ij!A\v PZ\] P9GM% "8 ]<=]7+.<`H:o2wC`iF -Z +bIsO L!isTZVM28 )no<"s}`. |[pJ0/Lw\Q#S8<;oI9~/[Av[-1)Up)VJ{'RA\)+S\; Lw#3}eXz-LBVWAV]kNT>)L2c$$]ib]TyA8D>HW  {aeZvL-PSF^6s[H&XDtPS s29wvC {I;iubHHIk`ll\,i6VPI2OJg.DVsUe][;~[#+bx=s?|i {_Sn2)!JvlNcz; }G!l^m;p-CZ 3+)6o"tE4h& !V:2bNRH-5pSyo.J5pNQs#:aYOU 4mdzhYB1<+RPYOQ(Aj]g@Z b f5Uv!u;TB"B\|q}B I^wCr:>m VnX6X)~GA6(0 vyTo $5WG]&60\n&&[{^R_N6aK$4M1@#f6nb96]FW:XCmbf io*ey[G3hfg=iT@W2qX9ilEGZVtiW@Nb" 0"HZGk^|bX)-h SIOJv!.0Ef7FH^/?^+%5uO<$GGr2 %,t(3z*jR9.8FV)]WS*pI^Q(MSZFDwPII"qM%ET47lLqyw*a,kb%p -gxo`z~fJW}OG*V>L h=oX8aUF(\6 vhJq3r|ux a, "7=dm/r{b1bD2GDLR)3lE_Nr<^$%c.ehqU#wm{HUX !p"QLFfcXuB]%>}B^_YE46_}Mp f9/%({#jDeuw61dW & `vR M@B} 1uL|1/cFuG(-P>n[d}.>ClF);#b$_;7eX,634vN&*Z}D= 2j1Eyg/~m.bJ@ f#hNi[]cW*}9yI\-hIM Z>&_G hSVaUi.m}2kZ7;jFe;[Sw cB\1hq2:e5&?9w66p!DWl=L<[_:2N@La^LWF9Z4DypkGB  &<[F z_}}>)(y0{5iH;VTStv.M RXosso:nUNMO5wX^FY ?C10ca<9/l=$4;_WuUiF9|p,3d_4]9 )EO/$| W6<1MGT=q'@L"Tj-*S#r5% "QVS1Aw%Yr *ER> [%H?qM{VOE115{/iig(qSE^k#m2z_*4OLQZXC@=8*7=|PgtklKQ_8\CSVZ?\}.rOtoLU\JTK@:1SCI3i ][H""jLjGB$1EV @40H5_r&F}L6.(-2w RhX@bt3]baLqc-zP!`V`z <'g6 6>U@!O8Agd#vchzm,3\+d.eCSjc)9Cc p-2QG^xXQTy# ! 1Jk \zz]qJR{)C)n~>v*NsJZN =5#sZ> %gJ !Ezy! W.4!StPCy4qFFM1F8Sm^apB,Bf|FHQttqPZYZW7}F| U|{[M*:PQ sH 8[tW@p8 &fMg+X6 kvM"<1F/ZT55\\ f$7\~Vjkm\McEGw(/_eTD ] MuWMJrpVv~u)}p}o&. E |0aW<8b./`X8 7iSRCb723 G+[1 h;1E+ 166W= OJ yMx7nt%K 2>o*El~WS}h6Z[ N/.Qp[lGD_;-]TI"~[@tAZQ,zZ 7PY+1!rs>CQq>~>k_U\# +}rH62:$#G i(DFd^y!$\!g -F%smp;W q 91YakBT3SStS&8 l,T X{LY? {KC2$*WJ Mxi*4{g!0`TTlr$w$y4\m\18 []r?:G<(9S>{(0j.`&F0z7*0im1tLg6/NS.$ W/b#/&!mM 3(m(\YSIy*jq)ov6* ADF%B4?'lx;(GgiRpO~`nw#4wtb-+nql!>fWY32S^P1%ed Tq 32/tej`ILPg >0=h4@|5'8-V,emf`6M @!=o+5Qf?Q oV@24R]"%Yrb^Jy3Epm,Jx$/Vj 8bpmMSf%>C= /a"O7U8Nb*c3(] p"\fh}gz 23a<-k)4tOE59d[{rGz86B'*I_'@+1~UPH+U,50~"K EGgNtl w/& aRQ1EAUKAYHR PGm?:[;(Ɛ -1zH}hen,0 ;a@ L.Q%:1[}ULc A[k:~]DoKd9Y"vVM8kEY{hcH%Z3Q|gmhB@ Ps Gk\eA6B]$VpX~{H0wFA}O8'#6|iELdeS=;rI`{O ) d;]MG"nD5sw* c !PQe:%au:9 F9/ ) Wnu#O7H H`}E&dnG(wf@!k(7 K4k4 9+d`ICd67aKa%.W>C$F Im:ns XP>.0.d@2*EgCG /=Njew +&Q\[||Y;B]P<KC|b!FtvC;1wLU GT#%2=}5h?V!,j(f&$p L *0vud}Dcw|Hy'neBI}$v;.zNK _ Eu@V{!wfIk^fdr>y3&*>7w;a ijmZ\0= ^EqXCGXv/BOOP"`L@$0A; ;GxlK&ba\s t{bk|$u[b5!^RGK]\rL}08n%?MZL{* n>wsy$@ 0\w.EVZ ΙLQ_0Se^EHBAWOEJUSTRETUR)G CQIp UNZIP.BCKjZ[UNZIP60.BEOS]BEOS.C;1k@$ g wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!G.notfirstcall) { /* first call: must initialize everything */ G.notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; G.have_dirname = FALSE; G.wild_dir = NULL; return G.matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((G.wildname = (ZCONST char *)strrchr(wildspec, '/')) == NULL) { G.dirname = "."; G.dirnamelen = 1; G.have_dirname = FALSE; G.wildname = wildspec; } else { ++G.wildname; /* point at character after '/' */ G.dirnamelen = G.wildname - wildspec; if ((G.dirname = (char *)malloc(G.dirnamelen+1)) == (char *)NULL) { Info(slide, 0x201, ((char *)slide, "warning: cannot allocate wildcard buffers\n")); strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; return G.matchname; /* but maybe filespec was not a wildcard */ } strncpy(G.dirname, wildspec, G.dirnamelen); G.dirname[G.dirnamelen] = '\0'; /* terminate for strcpy below */ G.have_dirname = TRUE; } if ((G.wild_dir = (zvoid *)opendir(G.dirname)) != (zvoid *)NULL) { while ((file = readdir((DIR *)G.wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && G.wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, G.wildname, 0 WISEP) &&/*0=case sens.*/ /* skip "." and ".." directory entries */ strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); if (G.have_dirname) { strcpy(G.matchname, G.dirname); strcpy(G.matchname+G.dirnamelen, file->d_name); } else strcpy(G.matchname, file->d_name); return G.matchname; } } /* if we get to here directory is exhausted, so close it */ closedir((DIR *)G.wild_dir); G.wild_dir = (zvoid *)NULL; } Trace((stderr, "do_wild: opendir(%s) returns NULL\n", FnFilter1(G.dirname))); /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; return G.matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if ((DIR *)G.wild_dir == (DIR *)NULL) { G.notfirstcall = FALSE; /* nothing left--reset for new wildspec */ if (G.have_dirname) free(G.dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ while ((file = readdir((DIR *)G.wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && G.wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, G.wildname, 0 WISEP)) { /* 0 == case sens. */ Trace((stderr, "do_wild: match() succeeds\n")); if (G.have_dirname) { /* strcpy(G.matchname, G.dirname); */ strcpy(G.matchname+G.dirnamelen, file->d_name); } else strcpy(G.matchname, file->d_name); return G.matchname; } } closedir((DIR *)G.wild_dir); /* at least one entry read; nothing left */ G.wild_dir = (zvoid *)NULL; G.notfirstcall = FALSE; /* reset for new wildspec */ if (G.have_dirname) free(G.dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ #ifndef S_ISUID # define S_ISUID 0004000 /* set user id on execution */ #endif #ifndef S_ISGID # define S_ISGID 0002000 /* set group id on execution */ #endif #ifndef S_ISVTX # define S_ISVTX 0001000 /* save swapped text even after use */ #endif /************************/ /* Function filtattr() */ /************************/ /* This is used to clear or keep the SUID and SGID bits on file permissions. * It's possible that a file in an archive could have one of these bits set * and, unknown to the person unzipping, could allow others to execute the * file as the user or group. The new option -K bypasses this check. */ static unsigned filtattr(__G__ perms) __GDEF unsigned perms; { /* keep setuid/setgid/tacky perms? */ if (!uO.K_flag) perms &= ~(S_ISUID | S_ISGID | S_ISVTX); return (0xffff & perms); } /* end function filtattr() */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) __GDEF { int r; ulg tmp = G.crec.external_file_attributes; G.pInfo->file_attr = 0; /* initialized to 0 for check in "default" branch below... */ switch (G.pInfo->hostnum) { case AMIGA_: tmp = (unsigned)(tmp>>17 & 7); /* Amiga RWE bits */ G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp); break; case THEOS_: tmp &= 0xF1FFFFFFL; if ((tmp & 0xF0000000L) != 0x40000000L) tmp &= 0x01FFFFFFL; /* not a dir, mask all ftype bits */ else tmp &= 0x41FFFFFFL; /* leave directory bit as set */ /* fall through! */ case BEOS_: case UNIX_: case VMS_: case ACORN_: case ATARI_: case ATHEOS_: case QDOS_: case TANDEM_: r = FALSE; G.pInfo->file_attr = (unsigned)(tmp >> 16); if (G.pInfo->file_attr == 0 && G.extra_field) { /* Some (non-Info-ZIP) implementations of Zip for Unix and * VMS (and probably others ??) leave 0 in the upper 16-bit * part of the external_file_attributes field. Instead, they * store file permission attributes in some extra field. * As a work-around, we search for the presence of one of * these extra fields and fall back to the MSDOS compatible * part of external_file_attributes if one of the known * e.f. types has been detected. * Later, we might implement extraction of the permission * bits from the VMS extra field. But for now, the work-around * should be sufficient to provide "readable" extracted files. * (For ASI Unix e.f., an experimental remap of the e.f. * mode value IS already provided!) */ ush ebID; unsigned ebLen; uch *ef = G.extra_field; unsigned ef_len = G.crec.eD۳ UNZIP.BCKjZ[UNZIP60.BEOS]BEOS.C;1k(xtra_field_length; while (!r && ef_len >= EB_HEADSIZE) { ebID = makeword(ef); ebLen = (unsigned)makeword(ef+EB_LEN); if (ebLen > (ef_len - EB_HEADSIZE)) /* discoverd some e.f. inconsistency! */ break; switch (ebID) { case EF_ASIUNIX: if (ebLen >= (EB_ASI_MODE+2)) { G.pInfo->file_attr = (unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE)); /* force stop of loop: */ ef_len = (ebLen + EB_HEADSIZE); break; } /* else: fall through! */ case EF_PKVMS: /* "found nondecypherable e.f. with perm. attr" */ r = TRUE; default: break; } ef_len -= (ebLen + EB_HEADSIZE); ef += (ebLen + EB_HEADSIZE); } } if (!r) { #ifdef SYMLINKS /* Check if the file is a (POSIX-compatible) symbolic link. * We restrict symlink support to those "made-by" hosts that * are known to support symbolic links. */ G.pInfo->symlink = S_ISLNK(G.pInfo->file_attr) && SYMLINK_HOST(G.pInfo->hostnum); #endif return 0; } /* fall through! */ /* all remaining cases: expand MSDOS read-only bit into write perms */ case FS_FAT_: /* PKWARE's PKZip for Unix marks entries as FS_FAT_, but stores the * Unix attributes in the upper 16 bits of the external attributes * field, just like Info-ZIP's Zip for Unix. We try to use that * value, after a check for consistency with the MSDOS attribute * bits (see below). */ G.pInfo->file_attr = (unsigned)(tmp >> 16); /* fall through! */ case FS_HPFS_: case FS_NTFS_: case MAC_: case TOPS20_: default: /* Ensure that DOS subdir bit is set when the entry's name ends * in a '/'. Some third-party Zip programs fail to set the subdir * bit for directory entries. */ if ((tmp & 0x10) == 0) { extent fnlen = strlen(G.filename); if (fnlen > 0 && G.filename[fnlen-1] == '/') tmp |= 0x10; } /* read-only bit --> write perms; subdir bit --> dir exec bit */ tmp = !(tmp & 1) << 1 | (tmp & 0x10) >> 4; if ((G.pInfo->file_attr & 0700) == (unsigned)(0400 | tmp<<6)) { /* keep previous G.pInfo->file_attr setting, when its "owner" * part appears to be consistent with DOS attribute flags! */ #ifdef SYMLINKS /* Entries "made by FS_FAT_" could have been zipped on a * system that supports POSIX-style symbolic links. */ G.pInfo->symlink = S_ISLNK(G.pInfo->file_attr) && (G.pInfo->hostnum == FS_FAT_); #endif return 0; } G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp); break; } /* end switch (host-OS-created-by) */ /* for originating systems with no concept of "group," "other," "system": */ umask( (int)(tmp=umask(0)) ); /* apply mask to expanded r/w(/x) perms */ G.pInfo->file_attr &= ~tmp; return 0; } /* end function mapattr() */ /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ #ifdef ACORN_FTYPE_NFS char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */ RO_extra_block *ef_spark; /* pointer Acorn FTYPE ef block */ #endif int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels in BeOS */ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); G.created_dir = FALSE; /* not yet */ /* user gave full pathname: don't prepend rootpath */ G.renamed_fullpath = (renamed && (*G.filename == '/')); if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM) return MPN_NOMEM; /* initialize path buffer, unless no memory */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; *pp++ = ';'; /* keep for now; remove VMS ";##" */ break; /* later, if requested */ #ifdef ACORN_FTYPE_NFS case ',': /* NFS filetypEo UNZIP.BCKjZ[UNZIP60.BEOS]BEOS.C;1k 'e extension */ lastcomma = pp; *pp++ = ','; /* keep for now; may need to remove */ break; /* later, if requested */ #endif default: /* allow European characters in filenames: */ if (isprint(workch) || (128 <= workch && workch <= 254)) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (G.created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %s\n", FnFilter1(G.filename))); } if (!uO.J_flag) { /* Handle the BeOS extra field if present. */ void *ptr = scanBeOSexfield(G.extra_field, G.lrec.extra_field_length); if (ptr) { setBeOSexfield(G.filename, ptr); } } #ifndef NO_CHMOD /* set approx. dir perms (make sure can still read/write in dir) */ if (chmod(G.filename, filtattr(__G__ G.pInfo->file_attr) | 0700)) perror("chmod (directory attributes) error"); #endif /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* TODO: should we re-write the BeOS extra field data in case it's */ /* changed? The answer is yes. [Sept 1999 - cjh] */ if (!uO.J_flag) { /* Handle the BeOS extra field if present. */ void *ptr = scanBeOSexfield(G.extra_field, G.lrec.extra_field_length); if (ptr) { setBeOSexfield(G.filename, ptr); } } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } /* On UNIX (and compatible systems), "." and ".." are reserved for * directory navigation and cannot be used as regular file names. * These reserved one-dot and two-dot names are mapped to "_" and "__". */ if (strcmp(pathcomp, ".") == 0) *pathcomp = '_'; else if (strcmp(pathcomp, "..") == 0) strcpy(pathcomp, "__"); #ifdef ACORN_FTYPE_NFS /* translate Acorn filetype information if asked to do so */ if (uO.acorn_nfs_ext && (ef_spark = (RO_extra_block *) getRISCOSexfield(G.extra_field, G.lrec.extra_field_length)) != (RO_extra_block *)NULL) { /* file *must* have a RISC OS extra field */ long ft = (long)makelong(ef_spark->loadaddr); /*32-bit*/ if (lastcomma) { pp = lastcomma + 1; while (isxdigit((uch)(*pp))) ++pp; if (pp == lastcomma+4 && *pp == '\0') *lastcomma='\0'; /* nuke */ } if ((ft & 1<<31)==0) ft=0x000FFD00; sprintf(pathcomp+strlen(pathcomp), ",%03x", (int)(ft>>8) & 0xFFF); } #endif /* ACORN_FTYPE_NFS */ if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { /* static int rootlen = 0; */ /* length of rootpath */ /* static char *rootpath; */ /* user's "extract-to" directory */ /* static char *buildpath; */ /* full path (so far) to extracted file */ /* static char *end; */ /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*G.end = *pathcomp++) != '\0') ++G.end; #ifdef SHORT_NAMES /* path components restricted to 14 chars, typically */ if ((G.end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(G.end = old_end + FILENAME_MAX) = '\0'; #endif /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ /* next check: need to append '/', at least one-char name, '\0' */ if ((G.end-G.buildpath) > FILNAMSIZ-3) too_long = TRUE; /* check if extracting dir? */ if (SSTAT(G.buildpath, &G.statbuf)) { /* path doesn't exist */ if (!G.create_dirs) { /* told not to create (freshening) */ free(G.buildpath); return MPN_INF_SKIP; /* path doesn't exist: nothing to do */ } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(G.buildpath))); free(G.buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (mkdir(G.buildpath, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ %s\n\ unable to process %s.\n", FnFilter2(G.buildpatFG UNZIP.BCKjZ[UNZIP60.BEOS]BEOS.C;1k[6h), strerror(errno), FnFilter1(G.filename))); free(G.buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } G.created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n\ unable to process %s.\n", FnFilter2(G.buildpath), FnFilter1(G.filename))); free(G.buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(G.buildpath))); free(G.buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *G.end++ = '/'; *G.end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(G.buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free G.buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, G.buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(G.buildpath); G.buildpath = G.end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*G.end = *pathcomp++) != '\0') { ++G.end; #ifdef SHORT_NAMES /* truncate name at 14 characters, typically */ if ((G.end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(G.end = old_end + FILENAME_MAX) = '\0'; #endif if ((G.end-G.buildpath) >= FILNAMSIZ) { *--G.end = '\0'; Info(slide, 0x201, ((char *)slide, "checkdir warning: path too long; truncating\n\ %s\n -> %s\n", FnFilter1(G.filename), FnFilter2(G.buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(G.buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ /* GRR: for VMS and TOPS-20, add up to 13 to strlen */ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); #ifdef ACORN_FTYPE_NFS if ((G.buildpath = (char *)malloc(strlen(G.filename)+G.rootlen+ (uO.acorn_nfs_ext ? 5 : 1))) #else if ((G.buildpath = (char *)malloc(strlen(G.filename)+G.rootlen+1)) #endif == (char *)NULL) return MPN_NOMEM; if ((G.rootlen > 0) && !G.renamed_fullpath) { strcpy(G.buildpath, G.rootpath); G.end = G.buildpath + G.rootlen; } else { *G.buildpath = '\0'; G.end = G.buildpath; } Trace((stderr, "[%s]\n", FnFilter1(G.buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if necessary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { G.rootlen = 0; return MPN_OK; } if (G.rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((G.rootlen = strlen(pathcomp)) > 0) { char *tmproot; if ((tmproot = (char *)malloc(G.rootlen+2)) == (char *)NULL) { G.rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (tmproot[G.rootlen-1] == '/') { tmproot[--G.rootlen] = '\0'; } if (G.rootlen > 0 && (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode))) { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); G.rootlen = 0; /* skip (or treat as stored file) */ return MPN_INF_SKIP; } /* create the directory (could add loop here scanning tmproot * to create more than one level, but why really necessary?) */ if (mkdir(tmproot, 0777) == -1) { Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n\ %s\n", FnFilter1(tmproot), strerror(errno))); free(tmproot); G.rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdir levels required */ return MPN_ERR_SKIP; } } tmproot[G.rootlen++] = '/'; tmproot[G.rootlen] = '\0'; if ((G.rootpath = (char *)realloc(tmproot, G.rootlen+1)) == NULL) { free(tmproot); G.rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(G.rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (G.rootlen > 0) { free(G.rootpath); G.rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ static int get_extattribs OF((__GPRO__ iztimes *pzt, ulg z_uidgid[2])); static int get_extattribs(__G__ pzt, z_uidgid) __GDEF iztimes *pzt; ulg z_uidgid[2]; { /*--------------------------------------------------------------------------- Convert from MSDOS-format local time and date to Unix-format 32-bit GMT time: adjust base year from 1980 to 1970, do usual conversions from yy/mm/dd hh:mm:ss to elapsed secoGn UNZIP.BCKjZ[UNZIP60.BEOS]BEOS.C;1k2Ends, and account for timezone and day- light savings time differences. If we have a Unix extra field, however, we're laughing: both mtime and atime are ours. On the other hand, we then have to check for restoration of UID/GID. ---------------------------------------------------------------------------*/ int have_uidgid_flg; unsigned eb_izux_flg; eb_izux_flg = (G.extra_field ? ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, #ifdef IZ_CHECK_TZ (G.tz_is_valid ? pzt : NULL), #else pzt, #endif z_uidgid) : 0); if (eb_izux_flg & EB_UT_FL_MTIME) { TTrace((stderr, "\nget_extattribs: Unix e.f. modif. time = %ld\n", pzt->mtime)); } else { pzt->mtime = dos_to_unix_time(G.lrec.last_mod_dos_datetime); } if (eb_izux_flg & EB_UT_FL_ATIME) { TTrace((stderr, "get_extattribs: Unix e.f. access time = %ld\n", pzt->atime)); } else { pzt->atime = pzt->mtime; TTrace((stderr, "\nget_extattribs: modification/access times = %ld\n", pzt->mtime)); } /* if -X option was specified and we have UID/GID info, restore it */ have_uidgid_flg = #ifdef RESTORE_UIDGID (uO.X_flag && (eb_izux_flg & EB_UX2_VALID)); #else 0; #endif return have_uidgid_flg; } /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) /* GRR: change to return PK-style warning level */ __GDEF { union { iztimes t3; /* mtime, atime, ctime */ ztimbuf t2; /* modtime, actime */ } zt; ulg z_uidgid[2]; int have_uidgid_flg; have_uidgid_flg = get_extattribs(__G__ &(zt.t3), z_uidgid); /*--------------------------------------------------------------------------- If symbolic links are supported, allocate storage for a symlink control structure, put the uncompressed "data" and other required info in it, and add the structure to the "deferred symlinks" chain. Since we know it's a symbolic link to start with, we shouldn't have to worry about overflowing unsigned ints with unsigned longs. ---------------------------------------------------------------------------*/ #ifdef SYMLINKS if (G.symlnk) { extent ucsize = (extent)G.lrec.ucsize; unsigned BeOSef_len = 0; extent slnk_entrysize; uch *BeOS_exfld; slinkentry *slnk_entry; if (!uO.J_flag) { /* Symlinks can have attributes, too. */ BeOS_exfld = scanBeOSexfield(G.extra_field, G.lrec.extra_field_length); if (BeOS_exfld) { BeOSef_len = makeword(EB_LEN + BeOS_exfld) + EB_HEADSIZE; } } /* size of the symlink entry is the sum of * (struct size (includes 1st '\0') + 1 additional trailing '\0'), * system specific attribute data size (might be 0), * and the lengths of name and link target. */ slnk_entrysize = (sizeof(slinkentry) + 1) + BeOSef_len + ucsize + strlen(G.filename); if (slnk_entrysize < ucsize) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed: mem alloc overflow\n", FnFilter1(G.filename))); fclose(G.outfile); return; } if ((slnk_entry = (slinkentry *)malloc(slnk_entrysize)) == NULL) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed: no mem\n", FnFilter1(G.filename))); fclose(G.outfile); return; } slnk_entry->next = NULL; slnk_entry->targetlen = ucsize; slnk_entry->attriblen = BeOSef_len; slnk_entry->target = slnk_entry->buf + BeOSef_len; slnk_entry->fname = slnk_entry->target + ucsize + 1; strcpy(slnk_entry->fname, G.filename); if (BeOSef_len > 0) memcpy(slnk_entry->buf, BeOS_exfld, BeOSef_len); /* move back to the start of the file to re-read the "link data" */ rewind(G.outfile); if (fread(slnk_entry->target, 1, ucsize, G.outfile) != ucsize) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed\n", FnFilter1(G.filename))); free(slnk_entry); fclose(G.outfile); return; } fclose(G.outfile); /* close "link" file for good... */ slnk_entry->target[ucsize] = '\0'; if (QCOND2) Info(slide, 0, ((char *)slide, "-> %s ", FnFilter1(slnk_entry->target))); /* add this symlink record to the list of deferred symlinks */ if (G.slink_last != NULL) G.slink_last->next = slnk_entry; else G.slink_head = slnk_entry; G.slink_last = slnk_entry; return; } #endif /* SYMLINKS */ fclose(G.outfile); /* handle the BeOS extra field if present */ if (!uO.J_flag) { void *ptr = scanBeOSexfield(G.extra_field, G.lrec.extra_field_length); if (ptr) { setBeOSexfield(G.filename, ptr); #ifdef BEOS_ASSIGN_FILETYPE } else { /* Otherwise, ask the system to try assigning a MIME type. */ assign_MIME( G.filename ); #endif } } /*--------------------------------------------------------------------------- Change the file permissions from default ones to those stored in the zipfile. ---------------------------------------------------------------------------*/ #ifndef NO_CHMOD if (chmod(G.filename, filtattr(__G__ G.pInfo->file_attr))) perror("chmod (file attributes) error"); #endif /* if -X option was specified and we have UID/GID info, restore it */ if (have_uidgid_flg /* check that both uid and gid values fit into their data sizes */ && ((ulg)(uid_t)(z_uidgid[0]) == z_uidgid[0]) && ((ulg)(gid_t)(z_uidgid[1]) == z_uidgid[1])) { TTrace((stderr, "close_outfile: restoring Unix UID/GID info\n")); if (chown(G.filename, (uid_t)z_uidgid[0], (gid_t)z_uidgid[1])) { if (uO.qflag) Info(slide, 0x201, ((char *)slide, CannotSetItemUidGid, z_uidgid[0], z_uidgid[1], FnFilter1(G.filename), strerror(errno))); else Info(slide, 0x201, ((char *)slide, CannotSetUidGid, z_uidgid[0], z_uidgid[1], strerror(errno))); } } /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { /* set the file's access and modification times */ if (utime(G.filename, &(zt.t2))) { if (uO.qflag) Info(slide, 0x201, ((char *)slide, CannotSetItemTimestamps, FnFilter1(G.filename), strerror(errno))); else Info(slide, 0x201, ((char *)slide, CannotSetTimestamps, strerror(errno))); } } } /* end function close_outfile() */ #ifdef SYMLINKS int set_symlnk_attribs(__G__ slnk_entry) __GDEF slinkentry *slnk_entry; { if (slnk_entry->attriblen > 0) setBeOSexfield(slnk_entry->fname, (uch *)slnk_entry->buf); /* currently, no error propagation... */ return PK_OK; } /* end function set_symlnk_attribs() */ #endif /* SYMLINKS */ #ifdef SET_DIR_ATTRIB /* messages of codHk UNZIP.BCKjZ[UNZIP60.BEOS]BEOS.C;1kBTe for setting directory attributes */ # ifndef NO_CHMOD static ZCONST char DirlistChmodFailed[] = "warning: cannot set permissions for %s\n %s\n"; # endif int defer_dir_attribs(__G__ pd) __GDEF direntry **pd; { uxdirattr *d_entry; d_entry = (uxdirattr *)malloc(sizeof(uxdirattr) + strlen(G.filename)); *pd = (direntry *)d_entry; if (d_entry == (uxdirattr *)NULL) { return PK_MEM; } d_entry->fn = d_entry->fnbuf; strcpy(d_entry->fn, G.filename); d_entry->perms = G.pInfo->file_attr; d_entry->have_uidgid = get_extattribs(__G__ &(d_entry->u.t3), d_entry->uidgid); return PK_OK; } /* end function defer_dir_attribs() */ int set_direc_attribs(__G__ d) __GDEF direntry *d; { int errval = PK_OK; if (UxAtt(d)->have_uidgid && /* check that both uid and gid values fit into their data sizes */ ((ulg)(uid_t)(UxAtt(d)->uidgid[0]) == UxAtt(d)->uidgid[0]) && ((ulg)(gid_t)(UxAtt(d)->uidgid[1]) == UxAtt(d)->uidgid[1]) && chown(UxAtt(d)->fn, (uid_t)UxAtt(d)->uidgid[0], (gid_t)UxAtt(d)->uidgid[1])) { Info(slide, 0x201, ((char *)slide, CannotSetItemUidGid, UxAtt(d)->uidgid[0], UxAtt(d)->uidgid[1], FnFilter1(d->fn), strerror(errno))); if (!errval) errval = PK_WARN; } /* Skip restoring directory time stamps on user' request. */ if (uO.D_flag <= 0) { /* restore directory timestamps */ if (utime(d->fn, (const struct utimbuf *)&UxAtt(d)->u.t2)) { Info(slide, 0x201, ((char *)slide, CannotSetItemTimestamps, FnFilter1(d->fn), strerror(errno))); if (!errval) errval = PK_WARN; } } #ifndef NO_CHMOD if (chmod(d->fn, filtattr(__G__ UxAtt(d)->perms))) { Info(slide, 0x201, ((char *)slide, DirlistChmodFailed, FnFilter1(d->fn), strerror(errno))); if (!errval) errval = PK_WARN; } #endif /* !NO_CHMOD */ return errval; } /* end function set_direc_attribs() */ #endif /* SET_DIR_ATTRIB */ #ifdef TIMESTAMP /***************************/ /* Function stamp_file() */ /***************************/ int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime; { struct utimbuf tp; tp.modtime = tp.actime = modtime; return (utime(fname, &tp)); } /* end function stamp_file() */ #endif /* TIMESTAMP */ #ifndef SFX /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { sprintf((char *)slide, LoadFarString(CompiledWith), #if defined(__MWERKS__) "Metrowerks CodeWarrior", "", #elif defined(__GNUC__) "GNU C ", __VERSION__, #else "(unknown compiler) ","", #endif "BeOS ", #ifdef __POWERPC__ "(PowerPC)", #else # ifdef __INTEL__ "(x86)", # else "(unknown)", /* someday we may have other architectures... */ # endif #endif #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0); } /* end function version() */ #endif /* !SFX */ /******************************/ /* Extra field functions */ /******************************/ /* ** Scan the extra fields in extra_field, and look for a BeOS EF; return a ** pointer to that EF, or NULL if it's not there. */ static uch *scanBeOSexfield(const uch *ef_ptr, unsigned ef_len) { while( ef_ptr != NULL && ef_len >= EB_HEADSIZE ) { unsigned eb_id = makeword(EB_ID + ef_ptr); unsigned eb_len = makeword(EB_LEN + ef_ptr); if (eb_len > (ef_len - EB_HEADSIZE)) { Trace((stderr, "scanBeOSexfield: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } if (eb_id == EF_BEOS && eb_len >= EB_BEOS_HLEN) { return (uch *)ef_ptr; } ef_ptr += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); } return NULL; } /* Used by setBeOSexfield(): Set a file/directory's attributes to the attributes passed in. If set_file_attrs() fails, an error will be returned: EOK - no errors occurred (other values will be whatever the failed function returned; no docs yet, or I'd list a few) */ static int set_file_attrs( const char *name, const unsigned char *attr_buff, const off_t attr_size ) { int retval = EOK; unsigned char *ptr; const unsigned char *guard; int fd; ptr = (unsigned char *)attr_buff; guard = ptr + attr_size; fd = open(name, O_RDWR | O_NOTRAVERSE); if (fd < 0) { return errno; /* should it be -fd ? */ } while (ptr < guard) { ssize_t wrote_bytes; struct attr_info fa_info; const char *attr_name; unsigned char *attr_data; attr_name = (char *)&(ptr[0]); ptr += strlen(attr_name) + 1; /* The attr_info data is stored in big-endian format because the */ /* PowerPC port was here first. */ memcpy(&fa_info, ptr, sizeof(struct attr_info)); fa_info.type = (uint32)B_BENDIAN_TO_HOST_INT32( fa_info.type ); fa_info.size = (off_t)B_BENDIAN_TO_HOST_INT64( fa_info.size ); ptr += sizeof(struct attr_info); if (fa_info.size < 0LL) { Info(slide, 0x201, ((char *)slide, "warning: skipping attribute with invalid length (%Ld)\n", fa_info.size)); break; } attr_data = ptr; ptr += fa_info.size; if (ptr > guard) { /* We've got a truncated attribute. */ Info(slide, 0x201, ((char *)slide, "warning: truncated attribute\n")); break; } /* Wave the magic wand... this will swap Be-known types properly. */ (void)swap_data( fa_info.type, attr_data, fa_info.size, B_SWAP_BENDIAN_TO_HOST ); wrote_bytes = fs_write_attr(fd, attr_name, fa_info.type, 0, attr_data, fa_info.size); if (wrote_bytes != fa_info.size) { Info(slide, 0x201, ((char *)slide, "warning: wrote %ld attribute bytes of %ld\n", (unsigned long)wrote_bytes,(unsigned long)fa_info.size)); } } close(fd); return retval; } static void setBeOSexfield(const char *path, uch *extra_field) { uch *ptr = extra_field; ush id = 0; ush size = 0; ulg full_size = 0; uch flags = 0; uch *attrbuff = NULL; int retval; if( extra_field == NULL ) { return; } /* Collect the data from the extra field buffer. */ id = makeword(ptr); ptr += 2; /* we don't use this... */ size = makeword(ptr); ptr += 2; full_size = makelong(ptr); ptr += 4; flags = *ptr; ptr++; /* Do a little sanity checking. */ if (flags & EB_BE_FL_BADBITS) { /* corrupted or unsupported */ Info(slide, 0x201, ((char *)slide, "Unsupported flags set for this BeOS extra field, skipping.\n")); return; } if (size <= EB_BEOS_HLEN) { /* corrupted, unsupported, or truncated */ Info(slide, 0x201, ((char *)slide, "BeOS extra field is %d bytes, should be at least %d.\n", size, EB_BEOS_HLEN)); reI #g UNZIP.BCKjZ[UNZIP60.BEOS]BEOS.C;1kcturn; } if (full_size < (size - EB_BEOS_HLEN)) { /* possible old archive? will this screw up on valid archives? */ Info(slide, 0x201, ((char *)slide, "Skipping attributes: BeOS extra field is %d bytes, " "data size is %ld.\n", size - EB_BEOS_HLEN, full_size)); return; } /* Find the BeOS file attribute data. */ if (flags & EB_BE_FL_UNCMPR) { /* Uncompressed data */ attrbuff = ptr; } else { /* Compressed data */ attrbuff = (uch *)malloc( full_size ); if (attrbuff == NULL) { /* No memory to uncompress attributes */ Info(slide, 0x201, ((char *)slide, "Can't allocate memory to uncompress file attributes.\n")); return; } retval = memextract(__G__ attrbuff, full_size, ptr, size - EB_BEOS_HLEN); if( retval != PK_OK ) { /* error uncompressing attributes */ Info(slide, 0x201, ((char *)slide, "Error uncompressing file attributes.\n")); /* Some errors here might not be so bad; we should expect */ /* some truncated data, for example. If the data was */ /* corrupt, we should _not_ attempt to restore the attrs */ /* for this file... there's no way to detect what attrs */ /* are good and which are bad. */ free (attrbuff); return; } } /* Now attempt to set the file attributes on the extracted file. */ retval = set_file_attrs(path, attrbuff, (off_t)full_size); if (retval != EOK) { Info(slide, 0x201, ((char *)slide, "Error writing file attributes.\n")); } /* Clean up, if necessary */ if (attrbuff != ptr) { free(attrbuff); } return; } #ifdef BEOS_USE_PRINTEXFIELD static void printBeOSexfield( int isdir, uch *extra_field ) { uch *ptr = extra_field; ush id = 0; ush size = 0; ulg full_size = 0; uch flags = 0; /* Tell picky compilers to be quiet. */ isdir = isdir; if( extra_field == NULL ) { return; } /* Collect the data from the buffer. */ id = makeword( ptr ); ptr += 2; size = makeword( ptr ); ptr += 2; full_size = makelong( ptr ); ptr += 4; flags = *ptr; ptr++; if( id != EF_BEOS ) { /* not a 'Be' field */ printf("\t*** Unknown field type (0x%04x, '%c%c')\n", id, (char)(id >> 8), (char)id); } if( flags & EB_BE_FL_BADBITS ) { /* corrupted or unsupported */ printf("\t*** Corrupted BeOS extra field:\n"); printf("\t*** unknown bits set in the flags\n"); printf("\t*** (Possibly created by an old version of zip for BeOS.\n"); } if( size <= EB_BEOS_HLEN ) { /* corrupted, unsupported, or truncated */ printf("\t*** Corrupted BeOS extra field:\n"); printf("\t*** size is %d, should be larger than %d\n", size, EB_BEOS_HLEN ); } if( flags & EB_BE_FL_UNCMPR ) { /* Uncompressed data */ printf("\tBeOS extra field data (uncompressed):\n"); printf("\t\t%ld data bytes\n", full_size); } else { /* Compressed data */ printf("\tBeOS extra field data (compressed):\n"); printf("\t\t%d compressed bytes\n", size - EB_BEOS_HLEN); printf("\t\t%ld uncompressed bytes\n", full_size); } } #endif #ifdef BEOS_ASSIGN_FILETYPE /* Note: This will no longer be necessary in BeOS PR4; update_mime_info() */ /* will be updated to build its own absolute pathname if it's not given one. */ static void assign_MIME( const char *file ) { char *fullname; char buff[PATH_MAX], cwd_buff[PATH_MAX]; int retval; if( file[0] == '/' ) { fullname = (char *)file; } else { sprintf( buff, "%s/%s", getcwd( cwd_buff, PATH_MAX ), file ); fullname = buff; } retval = update_mime_info( fullname, FALSE, TRUE, TRUE ); } #endif *[UNZIP60.BEOS]BEOS.H;1+,m?./ 4@-Z0123KPWO56!~x7!~x89GHJ/* Copyright (c) 1990-2004 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* beos.h -- A few handy things for the BeOS port. */ /* (c) 1997 Chris Herborth (chrish@qnx.com) */ /* This is covered under the usual Info-ZIP copyright. */ /* "#define EF_BE_FL_UNCMPR 0x01" has been moved into unzpriv.h */ #define EB_BE_FL_BADBITS 0xfe /* bits currently undefined */ #define BEOS_ASSIGN_FILETYPE 1 /* call update_mime_info() */ /* DR9 'Be' extra-field layout: 'Be' - signature ef_size - size of data in this EF (little-endian unsigned short) full_size - uncompressed data size (little-endian unsigned long) flag - flags (byte) flags & EB_BE_FL_UNCMPR = the data is not compressed flags & EB_BE_FL_BADBITS = the data is corrupted or we can't handle it properly data - compressed or uncompressed file attribute data If flag & EB_BE_FL_UNCMPR, the data is not compressed; this optimisation is necessary to prevent wasted space for files with small attributes (which appears to be quite common on the Advanced Access DR9 release). In this case, there should be ( ef_size - EB_BEOS_HLEN ) bytes of data, and full_size should equal ( ef_size - EB_BEOS_HLEN ). If the data is compressed, there will be ( ef_size - EB_BEOS_HLEN ) bytes of compressed data, and full_size bytes of uncompressed data. If a file has absolutely no attributes, there will not be a 'Be' extra field. The uncompressed data is arranged like this: attr_name\0 - C string struct attr_info (fields in big-endian format) attr_data (length in attr_info.size) */ *[UNZIP60.BEOS]BEOSMAIN.CPP;1+,y6./ 4$@-Z0123KPWO56 7 89GHJ// -*- C++ -*- /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ // // WARNING: This is C++, not C! GNU C is not supported here! // // beos_init.cpp // // BeOS-specific C++ routines for use with Info-ZIP's UnZipJİs UNZIP.BCKy6Z[UNZIP60.BEOS]BEOSMAIN.CPP;1B 5.30 or later. // // This is necessary because we need to have an app_server connection to be // able to ask the system to assign a MIME type to an un-typed file. Strange // but true (the update_mime_info() call needs to send/receive messages). // // If you're writing your own Zip application, you probably DO NOT want to // include this file! #include #ifdef SFX const static char *unzip_signature = "application/x-vnd.Info-ZIP.UnZipSFX"; #else const static char *unzip_signature = "application/x-vnd.Info-ZIP.UnZip"; #endif extern "C" int main_stub( int argc, char *argv[] ); int main( int argc, char **argv ) { BApplication app( unzip_signature ); int retval = main_stub( argc, argv ); app.PostMessage( B_QUIT_REQUESTED ); app.Run(); return retval; } *[UNZIP60.BEOS]CONTENTS.;1+,`./ 4r@-Z0123KPWO56y7y89GHJContents of the "beos" sub-directory for UnZip 5.52 and later: Contents this file README notes from the author of the BeOS port Makefile makefile for building UnZip (sorry, no project files) beocfg.h BeOS-specific configuration settings beos.c BeOS-specific routines (similar to the Unix ones) beos.h structures for the BeOS extra field beosmain.cpp BeOS-specific C++ routines unzip.rsc BeOS resources for UnZip unzipsfx.rsc BeOS resources for UnZipSFX This port supports both Metrowerks CodeWarrior (PowerPC and x86) and GNU C. - Chris Herborth (chrish@qnx.com) *[UNZIP60.BEOS]MAKEFILE.;1+,g./ 4y@-Z0123KPWO56f 7f 89GHJ###################################################################### # # Makefile for Info-ZIP's unzip, unzipsfx, and funzip on BeOS # # Copyright (c) 1998-2006 Info-ZIP # Chris Herborth (chrish@qnx.com) # # This is the new New and Improved Makefile for BeOS; it will: # # 1) automatically detect your platform (PowerPC or x86) if none is # specified; the default compiler is CodeWarrior for PowerPC, or # gcc for x86 # # 2) let you cross-compile for the other platform (PowerPC or x86), in # theory # # 3) let you use Metrowerks CodeWarrior (default) or GNU C to build with # for either platfor, in theory # # To choose a specific architecture, define the ARCH environment # variable on the make command-line: # # ARCH=what make -f beos/Makefile # # where "what" can be "powerpc" or "x86". # # To choose a specific compiler, define the CC environment variable on # the make command-line: # # CC=compiler make -f beos/Makefile # # where "compiler" can be "mwcc" or "x86". # # Of course, you can combine these two: # # ARCH=powerpc CC=mwcc make -f beos/Makefile # # or: # # CC=gcc ARCH=x86 make -f beos/Makefile # # To automatically install the fresh new unzip, use the "install" target: # # make -f beos/Makefile install ###################################################################### # Things that don't change: SHELL = /bin/sh # Punish those of you not running on SMP hardware... MAKE = make -j 4 -f beos/Makefile LOC=$(LOCAL_UNZIP) -DPASSWD_FROM_STDIN AF=$(LOC) # UnZipSfx flags SL = -o unzipsfx SL2 = $(LF2) # fUnZip flags FL = -o funzip FL2 = $(LF2) # general-purpose stuff CP = cp RM = rm -f LN = ln -sf E = O = .o M = beos # defaults for crc32 stuff and system-dependent headers CRCA_O = OSDEP_H = beos/beocfg.h # object files OBJS1 = unzip$O crc32$O crypt$O envargs$O explode$O OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O OBJS3 = process$O ttyio$O ubz2err$O unreduce$O unshrink$O zipinfo$O OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O $(BEOS_MAIN) LOBJS = $(OBJS) OBJSDLL = $(OBJS) api$O OBJX = unzipsfx$O crc32_$O crypt_$O extract_$O fileio_$O globals_$O \ inflate_$O match_$O process_$O ttyio_$O ubz2err_$O $M_$O $(BEOS_MAIN) LOBJX = $(OBJX) OBJF = funzip$O crc32f$O cryptf$O globalsf$O inflatef$O ttyiof$O UNZIP_H = unzip.h unzpriv.h globals.h $(OSDEP_H) # installation INSTALL = install # on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate manext = 1 prefix = /boot/home/config BINDIR = $(prefix)/bin# where to install executables MANDIR = $(prefix)/man/man$(manext)# where to install man pages INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/zipinfo$E $(BINDIR)/unzipsfx$E \ $(BINDIR)/unzip$E INSTALLEDMAN = $(MANDIR)/unzip.$(manext) $(MANDIR)/funzip.$(manext) \ $(MANDIR)/unzipsfx.$(manext) $(MANDIR)/zipinfo.$(manext) # UNZIPS = unzip$E funzip$E unzipsfx$E zipinfo$E # this is a little ugly...well, no, it's a lot ugly: MANS = man/unzip.1 man/unzipsfx.1 man/zipinfo.1 man/funzip.1 man/zipgrep.1 DOCS = unzip.txt unzipsfx.txt zipinfo.txt funzip.txt zipgrep.txt ###################################################################### # Things that change: # Select an architecture: ifndef ARCH MACHINE=$(shell uname -m) ifeq "$(MACHINE)" "BePC" ARCH=x86 CC=gcc else ARCH=powerpc CC=mwcc endif endif # Now select compiler flags and whatnot based on the ARCH and CC: WHAT=$(ARCH)-$(CC) ifeq "$(WHAT)" "powerpc-mwcc" CC=mwccppc LD=mwccppc CF=-w9 -O7 -opt schedule604 -rostr -I. $(LOC) LF=-o unzip LF2=-warn -L/boot/develop/lib/ppc -lbe -lroot BEOS_MAIN=beosmain$O TARGET=$(UNZIPS) endif ifeq "$(WHAT)" "powerpc-gcc" CC=gcc LD=gcc CF=-O3 -mcpu=604 -Wall -ansi -I. -I/boot/develop/headers/be/support \ -I/boot/develop/headers/be/storage $(LOC) LF=-o unzip LF2=-L/boot/develop/lib/ppc -lbe -lroot BEOS_MAIN=beosmain$O TARGET=$(UNZIPS) endif # This isn't likely to happen for R4 or later... ifeq "$(WHAT)" "x86-mwcc" CC=mwccx86 LD=mwccx86 CF=-O2 -w9 -I. $(LOC) LF=-o unzip LF2=-warn -L/boot/develop/lib/x86 -lbe -lroot BEOS_MAIN=beosmain$O TARGET=$(UNZIPS) endif ifeq "$(WHAT)" "x86-gcc" CC=gcc LD=gcc CF=-O3 -mpentiumpro \ -Wall -Wno-multichar -Wno-trigraphs \ -ansi -I. -I/boot/develop/headers/be/support \ -I/boot/develop/headers/be/storage $(LOC) LF=-o unzip LF2=-L/boot/develop/lib/x86 -lbe -lroot BEOS_MAIN=beosmain$O TARGET=$(UNZIPS) endif ifndef TARGET TARGET=help endif ###################################################################### # Helpful targets all: @echo 'TARGET = $(TARGET)' @echo 'ARCH = $(ARCH)' @echo 'CC = $(CC)' if [ -n "$(TARGET)" ] ; then \ $(MAKE) CC=$(CC) CF="$(CF)" LD="$(LD)" \ LF="$(LF)" LF2="$(LF2)" CCPP="$(CC)" CPPF="$(CF)" \ OBJS="$(OBJS)" LOBJS="$(LOBJS)" OBJX="$(OBJX)" \ LOBJX="$(LOBJX)" $(TARGET) ; \ else \ $(MAKE) help ; \ fi help: @echo '' @echo "This Makefile lets you build Info-ZIP's zip." @echo '' @echo 'To build zip for this computer using the default compiler, just do:' @echo '' @echo ' make -f beos/Makefile' @echo '' @echo 'To build zip for a specific architecture using a specific' @echo 'compiler, do:' @echo '' @K- UNZIP.BCKgZ[UNZIP60.BEOS]MAKEFILE.;1; echo ' ARCH=cpu CC=compiler make -f beos/Makefile' @echo '' @echo 'Where:' @echo ' cpu is either "powerpc" or "x86"' @echo ' compiler is either "mwcc" or "gcc"' @echo '' ###################################################################### # Basic compile instructions and dependencies # this is for GNU make; comment out and notify zip-bugs if it causes errors .SUFFIXES: .c .o # default for compiling C files .c.o: $(CC) -c $(CF) $*.c unzips: $(UNZIPS) objs: $(OBJS) objsdll: $(OBJSDLL) docs: $(DOCS) unzipsman: unzips docs unzipsdocs: unzips docs unzip$E: $(OBJS) beos/unzip.rsc $(LD) $(LF) $(LOBJS) $(LF2) chmod +x unzip$E xres -o unzip$E beos/unzip.rsc mimeset -f -all unzip$E unzipsfx$E: $(OBJX) beos/unzipsfx.rsc $(LD) $(SL) $(LOBJX) $(SL2) chmod +x unzipsfx$E xres -o unzipsfx$E beos/unzipsfx.rsc mimeset -f -all unzipsfx funzip$E: $(OBJF) $(LD) $(FL) $(OBJF) $(FL2) chmod +x funzip$E zipinfo$E: unzip$E $(LN) unzip$E zipinfo$E crc32$O: crc32.c $(UNZIP_H) zip.h crc32.h crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs$O: envargs.c $(UNZIP_H) explode$O: explode.c $(UNZIP_H) extract$O: extract.c $(UNZIP_H) crc32.h crypt.h fileio$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip$O: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h globals$O: globals.c $(UNZIP_H) inflate$O: inflate.c inflate.h $(UNZIP_H) list$O: list.c $(UNZIP_H) match$O: match.c $(UNZIP_H) process$O: process.c $(UNZIP_H) ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$O: ubz2err.c $(UNZIP_H) unreduce$O: unreduce.c $(UNZIP_H) unshrink$O: unshrink.c $(UNZIP_H) unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo$O: zipinfo.c $(UNZIP_H) # unzipsfx compilation section unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CP) unzip.c unzipsfx.c $(CC) -c $(CF) -DSFX unzipsfx.c $(RM) unzipsfx.c crc32_$O: crc32.c $(UNZIP_H) zip.h crc32.h $(CP) crc32.c crc32_.c $(CC) -c $(CF) -DSFX crc32_.c $(RM) crc32_.c crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CP) crypt.c crypt_.c $(CC) -c $(CF) -DSFX crypt_.c $(RM) crypt_.c extract_$O: extract.c $(UNZIP_H) crc32.h crypt.h $(CP) extract.c extract_.c $(CC) -c $(CF) -DSFX extract_.c $(RM) extract_.c fileio_$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CP) fileio.c fileio_.c $(CC) -c $(CF) -DSFX fileio_.c $(RM) fileio_.c globals_$O: globals.c $(UNZIP_H) $(CP) globals.c globals_.c $(CC) -c $(CF) -DSFX globals_.c $(RM) globals_.c inflate_$O: inflate.c inflate.h $(UNZIP_H) crypt.h $(CP) inflate.c inflate_.c $(CC) -c $(CF) -DSFX inflate_.c $(RM) inflate_.c process_$O: process.c $(UNZIP_H) crc32.h $(CP) process.c process_.c $(CC) -c $(CF) -DSFX process_.c $(RM) process_.c ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CP) ttyio.c ttyio_.c $(CC) -c $(CF) -DSFX ttyio_.c $(RM) ttyio_.c ubz2err$O: ubz2err.c $(UNZIP_H) $(CP) ubz2err.c ubz2err_.c $(CC) -c $(CF) -DSFX ubz2err_.c $(RM) ubz2err_.c # funzip compilation section crc32f$O: crc32.c $(UNZIP_H) zip.h crc32.h $(CP) crc32.c crc32f.c $(CC) -c $(CF) -DFUNZIP crc32f.c $(RM) crc32f.c cryptf$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CP) crypt.c cryptf.c $(CC) -c $(CF) -DFUNZIP cryptf.c $(RM) cryptf.c globalsf$O: globals.c $(UNZIP_H) $(CP) globals.c globalsf.c $(CC) -c $(CF) -DFUNZIP globalsf.c $(RM) globalsf.c inflatef$O: inflate.c inflate.h $(UNZIP_H) crypt.h $(CP) inflate.c inflatef.c $(CC) -c $(CF) -DFUNZIP inflatef.c $(RM) inflatef.c ttyiof$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CP) ttyio.c ttyiof.c $(CC) -c $(CF) -DFUNZIP ttyiof.c $(RM) ttyiof.c # BeOS specific code beos$O: beos/beos.c $(UNZIP_H) unzvers.h beos/beos.h $(CC) -c $(CF) beos/beos.c beosmain$O: beos/beosmain.cpp $(UNZIP_H) unzvers.h $(CCPP) -c $(CPPF) beos/beosmain.cpp # version() not used by unzipsfx, so no unzvers.h dependency beos_$O: beos/beos.c $(UNZIP_H) beos/beos.h # unzipsfx only $(CP) beos/beos.c beos_.c $(CC) -c $(CF) -Ibeos -DSFX beos_.c $(RM) beos_.c beosmain_$O: beos/beosmain.cpp $(UNZIP_H) # unzipsfx only $(CP) beos/beosmain.cpp beosmain_.cpp $(CCPP) -c $(CPPF) -Ibeos -DSFX beosmain_.cpp $(RM) beosmain_.cpp # this really only works for Unix targets, unless E and O specified on cmd line clean: -rm -f $(UNZIPS) $(OBJS) $(OBJF) $(OBJX) api$O apihelp$O crc_gcc$O \ unzipstb$O beosmain.o beosmain_.o install: all $(INSTALL) -m 755 $(UNZIPS) $(BINDIR) mimeset -f -all $(BINDIR)/unzip mimeset -f -all $(BINDIR)/unzipsfx $(RM) $(BINDIR)/zipinfo$E $(LN) unzip$E $(BINDIR)/zipinfo$E $(RM) $(BINDIR)/zipgrep$E $(INSTALL) -m 755 unix/zipgrep $(BINDIR)/zipgrep$E $(INSTALL) -m 644 man/unzip.1 $(MANDIR)/unzip.$(manext) $(INSTALL) -m 644 man/unzipsfx.1 $(MANDIR)/unzipsfx.$(manext) $(INSTALL) -m 644 man/zipinfo.1 $(MANDIR)/zipinfo.$(manext) $(INSTALL) -m 644 man/funzip.1 $(MANDIR)/funzip.$(manext) $(INSTALL) -m 644 man/zipgrep.1 $(MANDIR)/zipgrep.$(manext) $(INSTALL) -m 644 $(DOCS) $(MANDIR) # alternatively, could use zip method: -cd $(BINDIR); rm -f $(UNZIPS) [etc.] uninstall: rm -f $(INSTALLEDBIN) $(INSTALLEDMAN) TESTZIP = testmake.zip # the test zipfile # test some basic features of the build test: check check: unzips @echo ' This is a Unix-specific target. (Just so you know.)' @echo ' (Should work ok on BeOS... [cjh])' if test ! -f $(TESTZIP); then \ echo " error: can't find test file $(TESTZIP)"; exit 1; fi # echo " testing extraction" ./unzip -b $(TESTZIP) testmake.zipinfo if test $? ; then \ echo " error: file extraction from $(TESTZIP) failed"; exit 1; fi # echo ' testing zipinfo (unzip -Z)' ./unzip -Z $(TESTZIP) > testmake.unzip-Z if diff testmake.unzip-Z testmake.zipinfo; then ;; else \ echo ' error: zipinfo output doesn't match stored version'; fi $(RM) testmake.unzip-Z testmake.zipinfo # echo ' testing unzip -d exdir option' ./unzip -b $(TESTZIP) -d testun cat testun/notes # echo ' testing unzip -o and funzip (ignore funzip warning)' ./unzip -boq $(TESTZIP) notes -d testun ./funzip < $(TESTZIP) > testun/notes2 if diff testun/notes testun/notes2; then ;; else \ echo 'error: funzip output disagrees with unzip'; fi # echo ' testing unzipsfx (self-extractor)' cat unzipsfx $(TESTZIP) > testsfx $(CHMOD) 0700 testsfx ./testsfx -b notes if diff notes testun/notes; then ;; else \ echo ' error: unzipsfx file disagrees with unzip'; fi $(RM) testsfx notes testun/notes testun/notes2 rmdir testun # echo ' testing complete.' *[UNZIP60.BEOS]README.;1+,i./ 4<@-Z0123KPWO56q7q89GHJUnZip 5.4 for BeOS NOTE: If you want to build UnZip 5.4 or later from the source, you'll need to have the "xres" tool installed (unless you remove the "xres" lines in the beos/Makefile). This will cease to be a problem when BeOS R4 ships this fall. Until then, you can get xres from ftp://ftp.be.com/pub/experimental/tools/xres-102.zip. HISTORY UnZip 5.30 was the first official release of Info-ZIP's UnZip to support the filesystem in BeOS. UnZip 5.31 added support for the new filesystem that appeared iL5 UNZIP.BCKiZ[UNZIP60.BEOS]README.;1 n the Advanced Access Preview (aka DR9) Release of BeOS. UnZip 5.32 added several important bug fixes. UnZip 5.4: - supports BeOS on x86 hardware (and cross-compiling, if a compiler is present) - ask the Registrar to assign a file type to files that don't have one - adds a new -J option on BeOS; this lets you extract the data for a file without restoring its file attributes (handy if you stumble on really old BeOS ZIP archives... from before BeOS Preview Release) - will restore attributes properly on symbolic links (you'll need zip 2.21 or later to create ZIP files that store attributes for symbolic links) *** WARNING *** You may find some extremely old BeOS zip archives that store their file attributes differently; these will be from DR8 and earlier (when BeOS copied the MacOS type/creator fields instead of using the current extremely flexible scheme). You can still unpack the _data_ in older zip files, but you won't be able to recover the file attributes in those archives. Use the -J option with these files or you'll get "compressed EA data missing" and "zipfile probably corrupt" errors, even though the data is intact! The new scheme makes handling BeOS file attributes much more robust, and allows for possible future expansion without another round of incompatibilities. That's life on the edge! *** WARNING *** The new filesystem allows for huge files (up to several terabytes!) with huge amounts of meta-data (up to several terabytes!). The existing ZIP format was designed when this much data on a personal computer was science fiction; as a result, it's quite possible that large amounts of file attributes (more than maybe 100+K bytes) could be truncated. Zip and UnZip try to deal with this in a fairly sensible way, working on the assumption that the data in the file is more important than the data in the file attributes. One way to run into this problem is to mount an HFS volume and zip some Mac files that have large resources attached to them. This happens more often than you'd expect; I've seen several 0-byte files that had over four megabytes of resources. Even more stupid, these resources were _data_ (sound for a game), and could have been easily stored as data... KNOWN BUGS None! Yahoo! Please report any bugs to Zip-Bugs@lists.wku.edu. - Chris Herborth (chrish@qnx.com) November 2/1998 *[UNZIP60.BEOS]UNZIP.RSC;1+,./ 4P@-Z0123KPWO56b.7b.89GHJ RSODDDDDh !6 application/x-vnd.Info-ZIP.UnZip1BOF66 RTSCtypesapplication/zipGNInfo-ZIP's UnZipExtract, test and view ZIP archives. Read the COPYING file for copyright details. http://www.cdrom.com/pub/infozip/PWTWp@@WW W X8W Zl߰XXXXXXXpYX@ X`cati Y((XXXB XC0SMIM BEOS:APP_SIGGGSMBEOS:FILE_TYPESVPPABEOS:APP_VERSIONFPPABEOS:APP_FLAGSr:*[UNZIP60.BEOS]UNZIPSFX.RSC;1+,0./ 4/@-Z0123KPWO56%.7%.89GHJRSODDDDDh $ Myʞ@ h1xaP;1y}4yFc{N003 aS<==zCMQ-KQD8*s ^R+=s~Y,jJ, CSfc;[+:%-W"Y~{s^: -SOJ]b>[J^<@HknRG|ZJ_WkVXux@L[->u.q7^r@FcTCGD]FN\FT K"[SBd?c%b 9F.m wXW,r[Cy!7LxCVifz]P/kjS5~^aA | +)vj9f q NrcsP#9Q'cY-XP[S2g5\FS;B!_L='16v9BD Lh _u ow=_7"(Z |>% RPGw+92'"-l-\A3J YE@2/U]Lg4zn\h#[XETK<1;&&ZZkRUL"5~]+z6 ]Z8nS 4j-h9[|y .O`4$ moWP)JWt)}bQzCpTkHEoc Uv3xTFSh_J"ik; i@y~qPax=~K]>u<4E$! r*f45`Ca M Sj J g~ \l[1WCjT*o}rVR17BTSJZ}czv^M84 ?%(P*7M!kSY9MT`hOo\!n#u*FLhKHZfbZ2p%;4 Q?CjF&L];>x9p&*1=xN vJVNJJV% &K/IziX84 U^Jt{xmZ]FXKa8DY'h0 PW@(yeE 9)e6:]uJL}JDHFHjsWJPh,I!7?pw[$:D K!!kF 23C~z<0e f'Khe]! RW4+5^!8kHK Vl;VP-V L1e*3&<>!yoR*h^bgeMKoTnsaUY' r6Q)"zk2'e^?DAd-}=.pjmG-XF6G_+xUy+Rjc\ZsMI>#A-#9:.]EB7%*IBT\^zb_c4/2Rf;u (A1n@y m5_BFko:`@ ()93}mM) CgrO'Uu1 J<>$d|tPXZy<e-Gz=}9=#4:(o]n (geb!1 UKSLDpt}.$5RlSp "[;ndfwRch .7.46Wg>Kt%!O#ZGS&NYG [#U"Mn 56ANrs Ae;'9\>UBLiXm}G Em[Z:S42d)#-d f(r+L;8nX7a*qJShnGd>P*Z4arcepeh{sb[2^\K]b8p+A*Q$Zt1Ox/iz!]Mve^EQlyZ? (0p!Qj bmH+* *M7&*j_L.\ HF |4d> Hn%$sq%*k(PE2x6r{(uHU|Z a1b)6;0|~kLS(q'{ F3 ;+r5V W/)Gm#jL\U3 88wPbTSd-agn6 v>w0 g` M07;h\0YZ1|aZi%)/0*NK5w%pE=>Tv@r+G\cJZ|*|` xGBT%tf`8Av(]p}4uimF5TtEZ[ Ac=tf.mY/ __{(B8*^ux?UClm;FJ"H\bLET|{~+LwTRL_g,&v1c`W;_sL=jc#69^]I0fjtLS_[:dMQA ){EdWB(hnq?ZJKOJrzn#l'xQ| f@g-c+d8 @q`ujBnmj'9D+1#p,8xyXno?Ea'a iS.qV:Q<4h d|dm{2YG_KJA 9${2^ l/\;2^I5&u,u> p G?TZ@WL0$r@"N]%azln[C)jqj8 mM  Z'5:iQr,Gxy&/Upd49km:n~D>RIR/"p6iw _4U|kj ""~>EY71kuld$4 U5htI;8e*$D*3XBOCu$mvpc6l'Xsz/3IpA}8[M;~agbHi|!P1g73Su Ge3d_AGaQ\;TAD izb!sShh?)w}}=wjRTz kbojC,U.UWE0e)D9:J*0`QE&hS~*}/h%WM[ <} orYs}Y_)/cEs ?m"Dxyr/9 RY6:wB!rO+XQHX_[[8WrH\W-bKb>'3lG*[(~K%v_0x_A3}@Lf.A/.('3ApO:fnFn-(&Y&l,{#WClSAMxTAZN`"f/ ya#V !3QFO1x$]@wg%k'SM !W l<]pwTzd_`uMAs!~WVLD3Pb~>UNhnL\8d(1>iX'~e+O$JFt+B"HCpK6naX /;BqyB\^DN_K*y]_9U HDFn 0+"`%yQJ$,+FtBUG^%LSp:~*:Fe^RV#KPq&1gM)l!bFu_[2k:Z2Z`a;e:q%;DIG)#3H U{I}jy];!/r8> }1/slXM9Wj^]}J sfrkiMXu\dp Kx.N  $i+(YGi6,$ f`Vߋ.Mka f/77.|_gJC+f؜vN}`Ump#9^zqz&%}0&F"]k `X,j71cޢfqaajsʿTtf+%(\x3FxErmtj+hDЖ`t9 idJW Ufk[L7p@}ˉI)sۈE UȴUw_ hܟߒ/*N[["&₣;PUQ\^̹˒oI@3_Q逆66,- ro"'$m:k3WA C x7ly/q_1IM :$;OHR{jkoBC̾4lS`վ+r lFgi&fp*ق `H2.0ųSU1.3qW!oUM4ˁ7PWSD]Ȍ7+}sk"ȯH+sb֎o?t)l~7ڲR\3C>̓ܨm( x)0!ln;*]XZp'7řl*W UUH= ]wâV6M Pnl؏*##lr.*s6q& uJ4u1Q쁗vZb>b{qײJC!Pϳa5Fp'ZЦF-Z&}ݾvuZ_75 qay=;KfE#X[GSgIEPL(U6:R#(xbzfNIkCܛIMMHik܇T9RT,b\z-9kKھ1Z&mOM:8=ӳ;@3D{uG'=$3+mlQre꩐[L&>-kͷA"=8i@H_GRmhͿF ZZsLrU>  g' = cfUcxf [={ -JJ4ZR*R=5VH2ODjNRE^yfebp$t* j4EwwEEp% ZN3&!6,f-+7i|g!/Vj^E&rHD@3R9+~o:"rITpS>f,+[j'CIrD~j&U |#oyY])N CAy_t&Y*W{Lb3cZFLXY:)Oqc5+Ii+GNYFv.fU@zu[ZXygg@(E&ijp)N:$>H`AYxZ0 36G] `0q$J9sThgpiZZ9YQ^k54%|H]S]Qq LkcyH1P\n=9>cc%)!?Z ^_9[ABUbRE )P \%{anHeC_;TA"d6aJ > \#Q6 j@W@yםӭ>pԴK8zO0]DIv/tj0%?-.@SuUjnwo6MH+ uOo3i0H-E&! 5 [C ~,62s a~UN%6hWES#?"YGKlH13'Ivo9sR}lqq~fIx)2+Tk d37&k ()sHoO&ylgfkJ0<66?lCX:`Ag!efSh,AZclj->ꪆ`j(TCAvob~c̩,)/oy- Org xԩbni7`ܸEqxe8 :)"*cPYgDv>>}eXaG WmMV%< Xp|'392g^:c ~A7tpv,/!sr 9NsIh$b[ࠩwn$>$.ǂ%4Rl7H`^JLRa["/0P2"TR"{ޖp.qim}}GQCJ 3ۋkZ0 iQR9~)yk8V>Q@.;` _gCQ{Q 㧖J Y_%׸Mp9)Rkrx 1BA@_8l4"֎Sw,ezxhKUlj-. D?I8uh?U Zh6.BW%TCՕHz,YYƎ @`'qsx L9N J1`;̶NstR3ADc{̏0|Sg@qIةuTgL#d*\Ct-yE'ҷ\ gV,f6ō*.upo_~&-Z ANU2d:72vmBΤpL 3M ϒ.T1nd*wښZ˴phkvqN J ujug#rhxAxipLsda0Ee)gMэ;~qoMA6܆GVH1~d঴ZF},fG31D( EkP=o䓺w`:?WZFg6:0V.Y+ASE,ˬ"_StD6w.ʺ}F;fzq m@H]RUр!c/D"/Hɔ>b q1ۥc#XqlrA9EEk^+&@9|]SB)\r4>T`dCcU|2tmg-[e +xޘ/JbE0 ,,IRּ*&~=22pXGJI\k,[+'0e*J-΃mgY[ O;Hd^rP  i A,Ĕ*ecWC鮥}] pkɲ_I_+$NMQl-9ň{ c.[M+mJ^fRfJvoy޸ͣccF$Q7؞) Yopyϒ@X(Ѩ3x`V.dDxuzP\L;,TC]ՁY\h0123KPWO 56LP7LP89GHJBogus bugs (not our fault!): --------------------------- By far THE BIGGEST source of bug reports to Info-ZIP/zip-bugs is the incorrect transfer of zipfiles (or of the UnZip executable itself). ALWAYS TRANSFER IN BINARY MODE! This includes ftp transfers and *both* ends of a Kermit connection ("set file type binary"). If your copy isn't exactly the same size as the original, you made a mistake. Another common source of errors such as "compression method 8 not sup- ported" is the existence of an old version of UnZip somewhere in your path. Make sure you're using the version you think you're using; give the full path explicitly if necessary. Executing "unzip" without any options will print a help screen, at the top of which is the UnZip version number and release date; and executing "unzip -v" without any zipfile or other options will give information about what compiler was used, the target operating system, any special UnZip options, and the date of compilation--only for version 5.11 and later, though! (Also, under Unix C shell and some Bourne shells, "which unzip" will print the path of the unzip you're actually using. Under OS/2 and MS-DOS, whch21gr.zip [on Simtel mirror sites] will do the same thing; in addi- tion, "which -a unzip" will show *all* copies of "unzip" in your path.) Bugs (real and/or imagined): --------------------------- - [OS/2 DLL] when trying to use the REXX function UzUnZipToStem to extract a file with `&' in its name, the DLL crashes (but UzUnZipToVar still works) [Daniel H, 961215] - UnZip has problems with archives bigger than 2GB; it may print "note: didn't find end-of-central-dir signature at end of central dir" (harmless) or may not be able to seek to member files [James Lemley 970107, Iris Spaniol 970206, ...] Fixed with Zip64 support in UnZip 6.0 - fix overwrite behavior: hidden/system problems?; etc. - 32-bit DOS UnZip still unable to set volume labels? - 32-bit DOS UnZip under OS/2 doesn't extract all wildcard zipfiles? [DOS box: unzip386 (ver 5.12) x:\32bit\unix\emx09a\*.zip, Hobbes 3/95] - 32-bit DOS UnZip under OS/2 doesn't set timestamp when overwriting files on HPFS partition? (go32 and pmode/w both; emx/rsx OK) [Eberhard Mattes 950726] - USE_FWRITE still causes occasional CRC errors when extracting on Pyramid? [Kevin Fritz 931102] - still NT/W95 bug with "unzip -v d:*.zip" not matching properly? [Steve S 940527] 980427: bug no longer exists, Opendir() must have been corrected by someone - when ^Z received in no-echo mode, echo is not restored (works OK if resume, however) - signal() handler disabled after first use with one of BSD/SysV? - MKS Korn shell: unzip assumes the MKS-style command-line environment options are relevant to it, but this is not the case if unzip was called by another program (e.g., from a .BAT file). A fix for this exists for Borland compilers but not for MSC, Watcom, djgpp, etc. - OS/2: for paths with one long component, the .LONGNAME EA may be saved for all components (waste of disk space): how to check?? - VMS: for extracting to other directories, only the VMS-style "-d [.foo]" format is accepted; "-d foo" should also be allowed. Long filenames are not automatically truncated to 39.39. - Novell Netware: Netware drives may clear the archive bit on extracted files under OS/2 and/or MS-DOS. UnZip always *tries* to set the archive bit, however. [pynq@uchicago, 940527] - DEC Ultrix: on long zipfiles, unzip will sometimes fail (bad CRC, not always reproducible); this is apparently due either to a hardware bug (cache mem) or OS bug (page faults?) [Igor, Jean-loup, bottom of BUGS.long] - funzip/more/decryption/no-echo bug: race condition(?) causes terminal to be "reset" to no-echo state - Macintosh (100200), Atari (020000) external file attributes not interpreted correctly (both unzip and zipinfo) - pkbug error: zipfile with incorrect csize and/or ucsize--check for end of compressed (csize) data in un compression routines: unreduce.c: while (((outpos + outcnt) < ucsize) && (!zipeof)) { [James Birdsall, Mark, bottom of BUGS.long] - OS/2: directory EAs not restored if directory exists [Kai Uwe, KG27515@uark] (subsequent note: no way to determine which EAs are newer ==> cannot restore without user input) (update: as of UnZip 5.30, option -o forces restoring of directory EAs) - MS-DOS: Borland executables don't allow other than 80-column, 25/43/50-line screen modes (Borland bug) [Michael Stillwell] *[UNZIP60]BZIP2.DIR;1+,gE./ 4->0123 KPWO56i͖7i͖89GHJI 00README.IZj BUILDBZ2.COMr DESCRBZ2.MMSpa MAKBZ2IZ.MSCl MAKBZ2IZ.WATo MAKEBZ2.IZkOɩ8 UNZIP.BCKjgE[UNZIP60.BZIP2]00README.IZ;1*[UNZIP60.BZIP2]00README.IZ;1+,j./ 4@-gE0123KPWO56,7,89GHJThis folder is the root folder for the externally supplied bzip2 source code. Additionally, this folder contains the following Info-ZIP-specific files: 00README.IZ this file Makebz2.iz "generic" make script for the base bzip2 lib used in UnZip makbz2iz.msc make script for the bzip2 support, win32 port, MS VC++ makbz2iz.wat make script for bzip2 support, msdos & win32, OpenWatcom C++ descrbz2.mms MMS/MMK make script for OpenVMS buildbz2.com OpenVMS DCL procedure to build the base bz2 lib used in UnZip *[UNZIP60.BZIP2]BUILDBZ2.COM;1+,r./ 4@-gE0123KPWO56H'fU-7H'fU-89GHJ $! BUILDBZ2.COM $! $! Build procedure for LIBBZ2_NS support library used with the $! VMS versions of UnZip/ZipInfo and UnZipSFX $! $! Last revised: 2007-12-29 CS. $! $! Command args: $! - select compiler environment: "VAXC", "DECC", "GNUC" $! - select compiler listings: "LIST" Note that the whole argument $! is added to the compiler command, so more elaborate options $! like "LIST/SHOW=ALL" (quoted or space-free) may be specified. $! - supply additional compiler options: "CCOPTS=xxx" Allows the $! user to add compiler command options like /ARCHITECTURE or $! /[NO]OPTIMIZE. For example, CCOPTS=/ARCH=HOST/OPTI=TUNE=HOST $! or CCOPTS=/DEBUG/NOOPTI. These options must be quoted or $! space-free. $! $! To specify additional options, define the symbol LOCAL_BZIP2 $! as a comma-separated list of the C macros to be defined, and $! then run BUILDBZ2.COM. For example: $! $! $ LOCAL_BZIP2 = "RETURN_CODES" $! $ @ []BUILDBZ2.COM $! $! If you edit this procedure to set LOCAL_BZIP2 here, be sure to $! use only one "=", to avoid affecting other procedures. $! $! $ on error then goto error $ on control_y then goto error $ OLD_VERIFY = f$verify(0) $! $ edit := edit ! override customized edit commands $ say := write sys$output $! $!##################### Read settings from environment ######################## $! $ if (f$type(LOCAL_BZIP2) .eqs. "") $ then $ local_bzip2 = "" $ else ! Trim blanks and append comma if missing $ local_bzip2 = f$edit(local_bzip2, "TRIM") $ if (f$extract((f$length(local_bzip2) - 1), 1, local_bzip2) .nes. ",") $ then $ local_bzip2 = local_bzip2 + ", " $ endif $ endif $! $!##################### Customizing section ############################# $! $ unzx_unx = "UNZIP" $ unzx_cli = "UNZIP_CLI" $ unzsfx_unx = "UNZIPSFX" $ unzsfx_cli = "UNZIPSFX_CLI" $! $ CCOPTS = "" $ LINKOPTS = "/notraceback" $ LISTING = " /nolist" $ MAY_USE_DECC = 1 $ MAY_USE_GNUC = 0 $! $! Process command line parameters requesting optional features. $! $ arg_cnt = 1 $ argloop: $ current_arg_name = "P''arg_cnt'" $ curr_arg = f$edit( 'current_arg_name', "UPCASE") $ if (curr_arg .eqs. "") then goto argloop_out $! $ if (f$extract( 0, 5, curr_arg) .eqs. "CCOPT") $ then $ opts = f$edit( curr_arg, "COLLAPSE") $ eq = f$locate( "=", opts) $ CCOPTS = f$extract( (eq+ 1), 1000, opts) $ goto argloop_end $ endif $! $ if (f$extract( 0, 4, cu rr_arg) .eqs. "LIST") $ then $ LISTING = "/''curr_arg'" ! But see below for mods. $ goto argloop_end $ endif $! $ if (curr_arg .eqs. "VAXC") $ then $ MAY_USE_DECC = 0 $ MAY_USE_GNUC = 0 $ goto argloop_end $ endif $! $ if (curr_arg .eqs. "DECC") $ then $ MAY_USE_DECC = 1 $ MAY_USE_GNUC = 0 $ goto argloop_end $ endif $! $ if (curr_arg .eqs. "GNUC") $ then $ MAY_USE_DECC = 0 $ MAY_USE_GNUC = 1 $ goto argloop_end $ endif $! $ say "Unrecognized command-line option: ''curr_arg'" $ goto error $! $ argloop_end: $ arg_cnt = arg_cnt + 1 $ goto argloop $ argloop_out: $! $!####################################################################### $! $! Find out current disk, directory, compiler and options $! $ workdir = f$environment("default") $ here = f$parse(workdir, , , "device") + f$parse(workdir, , , "directory") $! $! Sense the host architecture (Alpha, Itanium, or VAX). $! $ if (f$getsyi("HW_MODEL") .lt. 1024) $ then $ arch = "VAX" $ else $ if (f$getsyi("ARCH_TYPE") .eq. 2) $ then $ arch = "ALPHA" $ else $ if (f$getsyi("ARCH_TYPE") .eq. 3) $ then $ arch = "IA64" $ else $ arch = "unknown_arch" $ endif $ endif $ endif $! $ dest = arch $ cmpl = "DEC/Compaq/HP C" $ opts = "" $ if (arch .nes. "VAX") $ then $ HAVE_DECC_VAX = 0 $ USE_DECC_VAX = 0 $! $ if (MAY_USE_GNUC) $ then $ say "GNU C is not supported for ''arch'." $ say "You must use DEC/Compaq/HP C to build UnZip." $ goto error $ endif $! $ if (.not. MAY_USE_DECC) $ then $ say "VAX C is not supported for ''arch'." $ say "You must use DEC/Compaq/HP C to build UnZip." $ goto error $ endif $! $ cc = "cc /standard=relax /prefix=all /ansi /names=(as_is)" $ defs = "''local_bzip2'" $ else $ HAVE_DECC_VAX = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") $ HAVE_VAXC_VAX = (f$search("SYS$SYSTEM:VAXC.EXE") .nes. "") $ MAY_HAVE_GNUC = (f$trnlnm("GNU_CC") .nes. "") $ if (HAVE_DECC_VAX .and. MAY_USE_DECC) $ then $ ! We use DECC: $ USE_DECC_VAX = 1 $ cc = "cc /decc /prefix=all /names=(as_is)" $ defs = "''local_bzip2'" $ else $ ! We use VAXC (or GNU C): $ USE_DECC_VAX = 0 $ defs = "''local_bzip2'" $ if ((.not. HAVE_VAXC_VAX .and. MAY_HAVE_GNUC) .or. MAY_USE_GNUC) $ then $ cc = "gcc" $ dest = "''dest'G" $ cmpl = "GNU C" $ opts = "GNU_CC:[000000]GCCLIB.OLB /LIBRARY," $ else $ if (HAVE_DECC_VAX) $ then $ cc = "cc /vaxc" $ else $ cc = "cc" $ endif $ dest = "''dest'V" $ cmpl = "VAX C" $ endif $ endif $ endif $! $! Reveal the plan. If compiling, set some compiler options. $! $ say "Compiling bzip2 on ''a rch' using ''cmpl'." $! $ DEF_NS = "/define = (''defs'BZ_NO_STDIO, VMS)" $! $! If [.'dest'] does not exist, either complain (link-only) or make it. $! $ if (f$search("''dest'.dir;1") .eqs. "") $ then $ create /directory [.'dest'] $ endif $! $! Arrange to get arch-specific list file placement, if listing, and if $! the user didn't specify a particular "/LIST =" destination. $! $ L = f$edit(LISTING, "COLLAPSE") $ if ((f$extract(0, 5, L) .eqs. "/LIST") .and. - (f$extract(4, 1, L) .nes. "P._ UNZIP.BCKrgE[UNZIP60.BZIP2]BUILDBZ2.COM;13K =")) $ then $ LISTING = " /LIST = [.''dest']" + f$extract(5, 1000, LISTING) $ endif $! $! Define compiler command. $! $ cc = cc + " /include = ([])" + LISTING + CCOPTS $! $! Show interesting facts. $! $ say " architecture = ''arch' (destination = [.''dest'])" $ say " cc = ''cc'" $ say "" $! $ tmp = f$verify( 1) ! Turn echo on to see what's happening. $! $!------------------------------- BZip2 section ------------------------------ $! $! Compile the sources. $! $ cc 'DEF_NS' /object = [.'dest']blocksort.OBJ blocksort.c $ cc 'DEF_NS' /object = [.'dest']huffman.OBJ huffman.c $ cc 'DEF_NS' /object = [.'dest']crctable.OBJ crctable.c $ cc 'DEF_NS' /object = [.'dest']randtable.OBJ randtable.c $ cc 'DEF_NS' /object = [.'dest']compress.OBJ compress.c $ cc 'DEF_NS' /object = [.'dest']decompress.OBJ decompress.c $ cc 'DEF_NS' /object = [.'dest']bzlib.OBJ bzlib.c $! $! Create the object library. $! $ if (f$search( "[.''dest']LIBBZ2_NS.OLB") .eqs. "") then - libr /object /create [.'dest']LIBBZ2_NS.OLB $! $ libr /object /replace [.'dest']LIBBZ2_NS.OLB - [.'dest']blocksort.OBJ, - [.'dest']huffman.OBJ, - [.'dest']crctable.OBJ, - [.'dest']randtable.OBJ, - [.'dest']compress.OBJ, - [.'dest']decompress.OBJ, - [.'dest']bzlib.OBJ $! $! Restore the original default directory, deassign the temporary $! logical names, and restore the DCL verify status. $! $ error: $! $ if (f$type(here) .nes. "") $ then $ if (here .nes. "") $ then $ set default 'here' $ endif $ endif $! $ if (f$type(OLD_VERIFY) .nes. "") $ then $ tmp = f$verify(OLD_VERIFY) $ endif $! $ exit $! *[UNZIP60.BZIP2]DESCRBZ2.MMS;1+,pa./ 4d@-gE0123KPWO56'\T7'\T89GHJ!========================================================================== ! MMS description file for bzip2 support in UnZip 6 2008-02-16 !========================================================================== ! ! To build the LIBBZ2_NS library, edit the USER CUSTOMIZATION ! lines below to taste, then do ! mms ! or ! mmk ! if you use Matt's Make (free MMS-compatible make utility). ! ! In all other cases where you want to explicitly specify a makefile target, ! you have to specify your compiling environment, too. These are: ! ! $ MMS/MACRO=(__ALPHA__=1) ! Alpha AXP, (DEC C) ! $ MMS/MACRO=(__IA64__=1) ! IA64, (DEC C) ! $ MMS/MACRO=(__DECC__=1) ! VAX, using DEC C ! $ MMS/MACRO=(__FORCE_VAXC__=1) ! VAX, prefering VAXC over DECC ! $ MMS/MACRO=(__VAXC__=1) ! VAX, where VAXC is default ! $ MMS/MACRO=(__GNUC__=1) ! VAX, using GNU C ! ! To delete all .OBJ, .OLB, .EXE and .HLP files, ! mms clean ## The "DO_THE_BUILD" target does no longer work with current ## releases of the MMS tool, sigh. #DO_THE_BUILD : # @ decc = f$search("SYS$SYSTEM:DECC$COMPILER.EXE").nes."" # @ axp = (f$getsyi("HW_MODEL") .ge. 1024) .and. - # (f$getsyi("HW_MODEL") .lt. 4096) # @ i64 = f$getsyi("HW_MODEL") .ge. 4096 # @ macro = "/MACRO=(" #.IFDEF CCOPTS # @ macro = macro + """CCOPTS=$(CCOPTS)""," #.ENDIF # @ if decc then macro = macro + "__DECC__=1," # @ if axp then macro = macro + "__ALPHA__=1," # @ if i64 then macro = macro + "__IA64__=1," # @ if .not.(axp .or. i64 .or. decc) then macro = macro + "__VAXC__=1," # @ macro = f$extract(0,f$length(macro)-1,macro)+ ")" # $(MMS)$(MMSQUALIFIERS)'macro' DEFAULT # Define MMK architecture macros when using MMS. .IFDEF __MMK__ # __MMK__ .ELSE # __MMK__ ALPHA_X_ALPHA = 1 IA64_X_IA64 = 1 VAX_X_VAX = 1 .IFDEF $(MMS$ARCH_NAME)_X_ALPHA # $(MMS$ARCH_NAME)_X_ALPHA __ALPHA__ = 1 .ENDIF # $(MMS$ARCH_NAME)_X_ALPHA .IFDEF $(MMS$ARCH_NAME)_X_IA64 # $(MMS$ARCH_NAME)_X_IA64 __IA64__ = 1 .ENDIF # $(MMS$ARCH_NAME)_X_IA64 .IFDEF $(MMS$ARCH_NAME)_X_VAX # $(MMS$ARCH_NAME)_X_VAX __VAX__ = 1 .ENDIF # $(MMS$ARCH_NAME)_X_VAX .ENDIF # __MMK__ .IFDEF __ALPHA__ # __ALPHA__ DEST = ALPHA #E = .AXP_EXE #O = .AXP_OBJ #A = .AXP_OLB .ELSE # __ALPHA__ .IFDEF __IA64__ # __IA64__ DEST = IA64 #E = .I64_EXE #O = .I64_OBJ #A = .I64_OLB .ELSE # __IA64__ .IFDEF __DECC__ # __DECC__ DEST = VAX #E = .VAX_DECC_EXE #O = .VAX_DECC_OBJ #A = .VAX_DECC_OLB .ENDIF # __DECC__ .IFDEF __FORCE_VAXC__ # __FORCE_VAXC__ __VAXC__ = 1 .ENDIF # __FORCE_VAXC__ .IFDEF __VAXC__ # __VAXC__ DEST = VAXV #E = .VAX_VAXC_EXE #O = .VAX_VAXC_OBJ #A = .VAX_VAXC_OLB .ENDIF # __VAXC__ .IFDEF __GNUC__ # __GNUC__ DEST = VAXG #E = .VAX_GNUC_EXE #O = .VAX_GNUC_OBJ #A = .VAX_GNUC_OLB .ENDIF # __GNUC__ .ENDIF # __IA64__ .ENDIF # __ALPHA__ .IFDEF O # O .ELSE # O !If EXE and OBJ extensions aren't defined, define them E = .EXE O = .OBJ A = .OLB .ENDIF # O .IFDEF SRCDIR .ELSE SRCDIR = [] .ENDIF .IFDEF DSTDIR # DSTDIR .ELSE # DSTDIR .IFDEF DEST # DEST DSTDIR = [.$(DEST)] .ELSE # DEST DSTDIR = [] .ENDIF # DEST .ENDIF # DSTDIR !!!!!!!!!!!!!!!!!!!!!!!!!!! USER CUSTOMIZATION !!!!!!!!!!!!!!!!!!!!!!!!!!!! ! add any common optional preprocessor flags (macros) here ! (do not forget a trailing comma!!): COMMON_DEFS = !!!!!!!!!!!!!!!!!!!!!!!! END OF USER CUSTOMIZATION !!!!!!!!!!!!!!!!!!!!!!!! .IFDEF __GNUC__ CC = gcc LIBS = ,GNU_CC:[000000]GCCLIB.OLB/LIB .ELSE CC = cc LIBS = .ENDIF CFLAGS = /NOLIST OPTFILE = sys$disk:[.vms]vaxcshr.opt .IFDEF __ALPHA__ # __ALPHA__ CC_OPTIONS = /STANDARD=RELAX/PREFIX=ALL/ANSI/NAMES=(AS_IS) CC_DEFS = .ELSE # __ALPHA__ .IFDEF __IA64__ # __IA64__ CC_OPTIONS = /STANDARD=RELAX/PREFIX=ALL/ANSI/NAMES=(AS_IS) CC_DEFS = .ELSE # __IA64__ .IFDEF __DECC__ # __DECC__ CC_OPTIONS = /DECC/STANDARD=RELAX/PREFIX=ALL/NAMES=(AS_IS) CC_DEFS = .ELSE # __DECC__ .IFDEF __FORCE_VAXC__ # __FORCE_VAXC__ !Select VAXC on systems where DEC C exists CC_OPTIONS = /VAXC .ELSE # __FORCE_VAXC__ !No flag allowed/needed on a pure VAXC system CC_OPTIONS = .ENDIF # __FORCE_VAXC__ CC_DEFS = .ENDIF # __DECC__ .ENDIF # __IA64__ .ENDIF Q? UNZIP.BCKpagE[UNZIP60.BZIP2]DESCRBZ2.MMS;1 # __ALPHA__ ! ! The .FIRST target is needed only if we're serious about building, ! and then, only if BZIP2 support was requested. ! .IFDEF MMSTARGETS # MMSTARGETS .FIRST @ write sys$output " Destination: $(DSTDIR)" @ write sys$output "" if ("$(DEST)" .nes. "") then - if (f$search("$(DEST).DIR;1") .eqs. "") then - create /directory $(DSTDIR) .ENDIF # MMSTARGETS CC_DEFS2 = CFLAGS_INCL = /INCLUDE = [] .IFDEF __DEBUG__ CDEB = /DEBUG/NOOPTIMIZE .ELSE CDEB = .ENDIF CFLAGS_ALL = $(CC_OPTIONS) $(CFLAGS) $(CDEB) $(CFLAGS_INCL) - /def=($(CC_DEFS) $(COMMON_DEFS) BZ_NO_STDIO, VMS) - $(CCOPTS) OBJBZ2LIB = \ $(DSTDIR)blocksort$(O), \ $(DSTDIR)huffman$(O), \ $(DSTDIR)crctable$(O), \ $(DSTDIR)randtable$(O), \ $(DSTDIR)compress$(O), \ $(DSTDIR)decompress$(O), \ $(DSTDIR)bzlib$(O) OLBBZ2 = $(DSTDIR)LIBBZ2_NS$(A) BZIP2_H = $(SRCDIR)bzlib.h $(SRCDIR)bzlib_private.h !!!!!!!!!!!!!!!!!!! override default rules: !!!!!!!!!!!!!!!!!!! .suffixes : .suffixes : .ANL $(E) $(A) .MLB .HLB .TLB .FLB $(O) - .FORM .BLI .B32 .C .c .COB - .FOR .BAS .B16 .PLI .PEN .PAS .MAC .MAR .M64 .CLD .MSG .COR .DBL - .RPG .SCN .IFDL .RBA .RC .RCO .RFO .RPA .SC .SCO .SFO .SPA .SPL - .SQLADA .SQLMOD .RGK .RGC .MEM .RNO .HLP .RNH .L32 .REQ .R32 - .L16 .R16 .TXT .H .FRM .MMS .DDL .COM .DAT .OPT .CDO .SDML .ADF - .GDF .LDF .MDF .RDF .TDF $(O)$(A) : If "''F$Search("$(MMS$TARGET)")'" .EQS. "" Then $(LIBR)/Create $(MMS$TARGET) $(LIBR)$(LIBRFLAGS) $(MMS$TARGET) $(MMS$SOURCE) .c$(O) : $(CC) $(CFLAGS_ALL) /OBJ=$(MMS$TARGET) $(MMS$SOURCE) !!!!!!!!!!!!!!!!!! here starts the bzip2 specific part !!!!!!!!!!! DEFAULT default : CHK_DESTDIR $(OLBBZ2) @ ! Do nothing. CLEAN.COM clean.com : @ open/write tmp $(MMS$TARGET) @ write tmp "$!" @ write tmp "$! Clean.com -- procedure to delete files. It always returns success" @ write tmp "$! status despite any error or warnings. Also it extracts" @ write tmp "$! filename from MMS ""mod ule=file"" format." @ write tmp "$!" @ write tmp "$ on control_y then goto ctly" @ write tmp "$ if p1.eqs."""" then exit 1" @ write tmp "$ i = -1" @ write tmp "$scan_list:" @ write tmp "$ i = i+1" @ write tmp "$ item = f$elem(i,"","",p1)" @ write tmp "$ if item.eqs."""" then goto scan_list" @ write tmp "$ if item.eqs."","" then goto done ! End of list" @ write tmp "$ item = f$edit(item,""trim"") ! Clean of blanks" @ write tmp "$ wild = f$elem(1,""="",item)" @ write tmp "$ show sym wild" @ write tmp "$ if wild.eqs.""="" then wild = f$elem(0,""="",item)" @ write tmp "$ vers = f$parse(wild,,,""version"",""syntax_only"")" @ write tmp "$ if vers.eqs."";"" then wild = wild - "";"" + "";*""" @ write tmp "$scan:" @ write tmp "$ f = f$search(wild)" @ write tmp "$ if f.eqs."""" then goto scan_list" @ write tmp "$ on error then goto err" @ write tmp "$ on warning then goto warn" @ write tmp "$ delete/log 'f'" @ write tmp "$warn:" @ write tmp "$err:" @ write tmp "$ goto scan" @ write tmp "$done:" @ write tmp "$ctly:" @ write tmp "$ exit 1" @ close tmp CLEAN clean : clean.com @clean "$(OBJBZ2LIB)" @clean "$(OLBBZ2)" @- delete/noconfirm/nolog clean.com;* @- if ("$(DEST).dir" .nes. "") then - if (f$search("$(DEST).dir") .nes. "") then - set protect=w:d $(DEST).dir;* @- if ("$(DEST).dir" .nes. "") then - if (f$search("$(DEST).dir") .nes. "") then - delete/noconfirm $(DEST).dir;* CHK_DESTDIR chk_destdir : @ If ("$(DEST)" .NES. "") Then - If "''F$Search("$(DEST).DIR;1")'" .EQS. "" Then - Create /directory $(DSTDIR) $(OLBBZ2) : $(OBJBZ2LIB) If "''F$Search("$(MMS$TARGET)")'" .EQS. "" Then $(LIBR)/Create $(MMS$TARGET) $(LIBR)$(LIBRFLAGS) $(MMS$TARGET) $(MMS$CHANGED_LIST) @ write sys$output "$(MMS$TARGET) updated." $(OBJBZ2LIB) : $(BZIP2_H) $(DSTDIR)blocksort$(O) : $(SRCDIR)blocksort.c $(DSTDIR)huffman$(O) : $(SRCDIR)huffman.c $(DSTDIR)crctable$(O) : $(SRCDIR)crctable.c $(DSTDIR)randtable$(O) : $(SRCDIR)randtable.c $(DSTDIR)compress$(O) : $(SRCDIR)compress.c $(DSTDIR)decompress$(O) : $(SRCDIR)decompress.c $(DSTDIR)bzlib$(O) : $(SRCDIR)bzlib.c *[UNZIP60.BZIP2]MAKBZ2IZ.MSC;1+,l./ 4@-gE0123KPWO56n(Y7n(Y89GHJ# Makefile for UnZip's bzip2 support library # Win32 port, using Microsoft Visual C++ 6.0 # # (c) 2006-2007 Info-ZIP # Last revision: Christian Spieler, 2007-Apr-03 # # This Makefile is intended to be called from UnZip's main make procedure. CC=cl AR=link -lib CFLSYS = -ML -O2 -nologo CFLAGS= -D_WIN32 -DBZ_NO_STDIO $(CFLSYS) !ifndef BZROOTDIR BZROOTDIR=. !endif BZROOT=$(BZROOTDIR)/ !ifndef BZOBDIR BZOBDIR=. !endif BZOB=$(BZOBDIR)/ O=.obj OBJS= $(BZOB)blocksort$(O) \ $(BZOB)huffman$(O) \ $(BZOB)crctable$(O) \ $(BZOB)randtable$(O) \ $(BZOB)compress$(O) \ $(BZOB)decompress$(O) \ $(BZOB)bzlib$(O) izlib: $(BZOBDIR) $(BZOB)bz2.lib $(BZOBDIR) : -mkdir $@ $(BZOB)bz2.lib: $(OBJS) $(AR) $(OBJS) -out:$(BZOB)bz2.lib clean: -del $(BZOBDIR)\*$(O) -del $(BZOBDIR)\bz2.lib .c$(O): $(CC) $(CFLAGS) -c -Fo$@ $< $(OBJS) : $(BZROOT)bzlib.h $(BZROOT)bzlib_private.h $(BZOB)blocksort$(O) : $(BZROOT)blocksort.c $(CC) $(CFLAGS) -c -Fo$@ $(BZROOT)blocksort.c $(BZOB)huffman$(O) : $(BZROOT)huffman.c $(CC) $(CFLAGS) -c -Fo$@ $(BZROOT)huffman.c $(BZOB)crctable$(O) : $(BZROOT)crctable.c $(CC) $(CFLAGS) -c -Fo$@ $(BZROOT)crctable.c $(BZOB)randtable$(O) : $(BZROOT)randtable.c $(CC) $(CFLAGS) -c -Fo$@ $(BZROOT)randtable.c $(BZOB)compress$(O) : $(BZROOT)compress.c $(CC) $(CFLAGS) -c -Fo$@ $(BZROOT)compress.c $(BZOB)decompress$(O) : $(BZROOT)decompress.c $(CC) $(CFLAGS) -c -Fo$@ $(BZROOT)decompress.c $(BZOB)bzlib$(O) : $(BZROOT)bzlib.c $(CC) $(CFLAGS) -c -Fo$@ $(BZROOT)bzlib.c *[UNZIP60.BZIP2]MAKBZ2IZ.WAT;1+,o./ 4@-gE0123KPWO56 & Y7 & Y89GHJ# Makefile for UnZip's bzip2 support library # MSDOS & Win32 ports, using OpenWatcom C++ # # (c) 2006-2007 Info-ZIP # Last revision: Christian Spieler, 2007-Apr-03 # # This Makefile is intended to be called from UnZip's main make procedure. CC=wcc386 AR=lib386 CFLSYS = -6r -zt -zq -wx -s -obhikl+rt -oe100 -zp8 -q CFLAGS= $(CFLSYS) -DBZ_NO_STDIO !ifndef BZROOTDIR BZROOTDIR=. !endif BZROOT=$(BZROOTDIR)\ !ifndef BZOBDIR BZOBDIR=. !endif BZOB=$(BZOBDIR)/ O=.obj OBJS= $(BZOB)blocksort$(O) & $(BZOB)huffman$(O) & $(BZOB)crctable$(O) & $(BZOB)randtable$(O) & $(BZOB)compress$(O) & $(BZOB)decompress$(O) & $(BZOB)bzlib$(O) izlib: $(BZOBDIR) $(BZOB)bz2.lib $(BZOBDIR) : -mkdir $@ $(BZOB)bz2.lib: $(OBJS) $(AR) -nologo $(OBJS) -out:$(BZOB)bz2.lib clean: .SYMBOLIC -del $(BZOBDIR)\*$(O) -del $(BZOBDIR)\bz2.lib .c$(O): $(CC) $(CFLAGS) -fo=$@ $< $(OBJS) : $(BZROOT)bzlib.h $(BZROOT)bzlib_private.h $(BZOB)blocksort$(O) : $(BZROOT)blocksort.c $(CC) $(CFLAGS) -Fo=$@ $(BZR̖ UNZIP.BCKogE[UNZIP60.BZIP2]MAKBZ2IZ.WAT;1_ROOT)blocksort.c $(BZOB)huffman$(O) : $(BZROOT)huffman.c $(CC) $(CFLAGS) -Fo=$@ $(BZROOT)huffman.c $(BZOB)crctable$(O) : $(BZROOT)crctable.c $(CC) $(CFLAGS) -Fo=$@ $(BZROOT)crctable.c $(BZOB)randtable$(O) : $(BZROOT)randtable.c $(CC) $(CFLAGS) -Fo=$@ $(BZROOT)randtable.c $(BZOB)compress$(O) : $(BZROOT)compress.c $(CC) $(CFLAGS) -Fo=$@ $(BZROOT)compress.c $(BZOB)decompress$(O) : $(BZROOT)decompress.c $(CC) $(CFLAGS) -Fo=$@ $(BZROOT)decompress.c $(BZOB)bzlib$(O) : $(BZROOT)bzlib.c $(CC) $(CFLAGS) -Fo=$@ $(BZROOT)bzlib.c *[UNZIP60.BZIP2]MAKEBZ2.IZ;1+,k./ 4 @-gE0123KPWO56(sW7(sW89GHJ# Makefile for UnZip's bzip2 support library # Unix, and other ports using sufficiently unix-compatible # library naming conventions (e.g. misc. GCC ports) # # (c) 2006-2007 Info-ZIP # Last revision: Christian Spieler, 2007-Mar-31 # # This Makefile is intended to be called from UnZip's main make procedure. SHELL=/bin/sh # To assist in cross-compiling CC=gcc AR=ar RANLIB=ranlib RM=rm -f LDFLAGS= O=.o CFLAGS=-Wall -Winline -O2 -g CCBZ2DEFS=-DBZ_NO_STDIO OBJS= blocksort$(O) \ huffman$(O) \ crctable$(O) \ randtable$(O) \ compress$(O) \ decompress$(O) \ bzlib$(O) # How to compile sources .c$(O): $(CC) $(CFLAGS) $(CCBZ2DEFS) -o $@ -c $< all: libbz2.a libbz2.a: $(OBJS) -@$(RM) libbz2.a $(AR) cq libbz2.a $(OBJS) -$(RANLIB) libbz2.a clean: $(RM) $(OBJS) libbz2.a $(OBJS): bzlib.h bzlib_private.h blocksort$(O): blocksort.c huffman$(O): huffman.c crctable$(O): crctable.c randtable$(O): randtable.c compress$(O): compress.c decompress$(O): decompress.c bzlib$(O): bzlib.c *[UNZIP60]CMSMVS.DIR;1+,f./ 4->0123 KPWO56789GHJI CCUNZIP.EXEC INSTALL.CMSMC.EXECvMVS.MKI) README.CMS README.MVS UNZIP.EXECUNZIP.MAKEFILE UNZMVSC.JOB & UNZVMC.EXEC ]VMMVS.C  VMMVS.HVMSTAT.H WHATSNEW.CMS ZIPINFO.EXEC&D*[UNZIP60.CMSMVS]CCUNZIP.EXEC;1+,./ 4X@-f0123KPWO56789GHJ/* CCUNZIP EXEC Compile unzip 5.4 for VM/CMS */ /* Author: George Petrov, 11 Apr 1995 (VMCOMPIL EXEC) */ /* Modified for IBM C V3R1 by Ian E. Gorman, 2 Nov 1998 Facilities for compiling and testing were provided by OmniMark Technologies Corporation, Ottawa, Canada */ Address Command Signal On Error /* Allow longnames, compile re-entrant code. global.c and vmmvs.c require EXTENDED features */ CCopts = 'LONGNAME RENT LANGLVL(EXTENDED) NOEXECOPS' /* UNZIP options -- VM_CMS, REENTRANT */ CCopts = CCopts 'DEFINE(VM_CMS,REENTRANT)' /* Link the load module to run in more or less than 16MB memory */ LINKopts = 'AMODE ANY RMODE ANY RLDSAVE' 'GLOBAL TXTLIB SCEELKED CMSLIB' 'GLOBAL LOADLIB SCEERUN' /* produce the TEXT (object) files */ linklist='' modname='UNZIP' Say 'Building' modname 'MODULE...' Call Compile 'UNZIP' Call Compile 'CRC32' Call Compile 'CRYPT' Call Compile 'ENVARGS' Call Compile 'EXPLODE' Call Compile 'EXTRACT' Call Compile 'FILEIO' Call Compile 'GLOBALS' Call Compile 'INFLATE' Call Compile 'PROCESS' Call Compile 'LIST' Call Compile 'MATCH' Call Compile 'TTYIO' Call Compile 'UNREDUCE' Call Compile 'UNSHRINK' Call Compile 'ZIPINFO' Call Compile 'VMMVS' Say 'Linking...' 'EXEC CMOD' linklist '(MODNAME' modname LINKopts Say modname 'built successfully.' /* Make ZIPINFO from UNZIP */ modname = 'ZIPINFO' 'COPYFILE UNZIP MODULE A ZIPINFO MODULE A (OLDDATE REPLACE' Say modname 'built successfully.' Say 'Done.' Exit rc error: Say 'Error' rc 'during compilation!' Say 'Error in line' sigl':' Say ' 'Sourceline(sigl) Exit rc Compile: Procedure Expose CCopts LINKopts linklist Parse arg filename filetype filemode . If filetype='' Then filetype='C' linklist = linklist filename Say 'Compiling' filename filetype filemode '...' 'EXEC CC' filename filetype filemode '('CCopts Return rc *[UNZIP60.CMSMVS]INSTALL.CMS;1+,. / 4 @-f0123KPWO 56-@7-@89GHJ----------------------------------------------------------------------- [Installation notes for VM/CMS port of UNZIP 5.32 and ZIP 2.2] Additional notes from Ian E. Gorman (4/98): I have not fully tested ZIP and UNZIP in VM (for example, I have not tried all the options), so ZIP 2.2 for VM and UNZIP 5.32 for VM should be regarded as beta versions. Try them out before you decide that you can depend on them. Most of the work for the VM port has been done by others, but I have made some changes and compiled on a more recent version of VM/CMS. It is possible that I have introduced new problems or undone some of the solutions found by previous authors. Installation ============ The executables are stored in CMS "PACK" format instead of being stored in ZIP archives. This format takes a little longer to download, but installation is slightly simpler. Installing UNZIP ---------------- The UNZIP executable is supplied as the binary file UNZIP.MOD, in the CMS "PACK" format. You must get the UNZIP.MOD file on to your system as a binary file in fixed recording mode, block size 1024. If you are using FTP in CMS, you can get the file in the correct format with the LOCSITE and BINARY commands. Assuming that the UNZIP executable is stored on the remote site as unz532vm.mod, you could issue the following commands FTP where.ever.com BINARY LOCSITE FIX 1024 GET unz532vm.mod QUIT If you are using a 3270 terminal session to upload from a PC, you canS UNZIP.BCKf[UNZIP60.CMSMVS]INSTALL.CMS;1  upload the file in the correct format with the SEND command: SEND unz532vm.mod A: unz532vm mod a1 (RECFM F LRECL 1024 If your 3270 emulator does not have the SEND command, but is a GUI application, it may allow you to upload from the menu bar. If so, set your options to binary, VM/CMS, fixed record length, and a length of 1024 before you upload. When you get the PACKed file on your CMS minidisk, you convert it to an executable module by using the COPY command with the UNPACK option: COPY unz532vm mod a unzip module a1 (UNPACK OLDDATE REPLACE You can omit the OLDDATE and REPLACE options if you want to. Installing ZIP -------------- The ZIP executable is supplied as the binary file ZIP.MOD, in the CMS "PACK" format. You must get the ZIP.MOD file on to your system as a binary file in fixed recording mode, block size 1024. Assuming that the file is stored as zip22vm.mod, you can get the file the same way you got the UNZIP.MOD file: Using FTP: FTP where.ever.com BINARY LOCSITE FIX 1024 GET zip22vm.mod QUIT Using 3270 file transfer: SEND unz532vm.mod A: unz532vm mod a1 (RECFM F LRECL 1024 When you get the PACKed file on your CMS minidisk, you convert it to an executable module by using the COPY command with the UNPACK option: COPY zip22vm mod a zip module a1 (UNPACK OLDDATE REPLACE Installing Documentation ------------------------ Once you have UNZIP running, you can use it to extract documentation from ZIP archives. You can transfer the ZIP archives to VMV/CMS as a binary file with any record length. A record length of 1 will work fine: via FTP: FTP where.ever.com BINARY LOCSITE FIX 1 GET zip22vm.zip zipdoc.zip GET unz532vm.zip unzipdoc.zip QUIT via 3270 session: SEND zip22vm.zip A: unzipdoc zip a1 (RECFM F LRECL 1 SEND unz532vm.zip A: zipdoc zip a1 (RECFM F LRECL 1 Once you have the ZIP archives, extract the documentation to the minidisk of your choice by using the -d option: unzip -a -d A2 unzipdoc.zip unzip -a -d A2 zipdoc.zip The "-a" option is required because the documents are archived as ASCII text files, but they must be converted to EBCDIC to read them in VM/CMS. Notes ===== Different EBCDIC Character Sets ------------------------------- The documentation may look strange on your system, because UNZIP translates from ASCII to "Open Systems" EBCDIC (IBM-1047). Unless you are a software developer, you are probably using a different kind of EBCDIC (like US EBCDIC, IBM-037). This causes some character codes to display as different characters. For example, the character codes that display as square brackets in IBM-1047 will display as e-acute and a-grave in IBM-037. You can use the IBM ICONV utility to translate documents from one character set to another: ICONV old doc a new doc a1 (FROMCODE IBM-1047 TOCODE IBM-037 IND$FILE protocol ----------------- This is the method by which files are transferred via 3270 sessions between PC and mainframe. If you know how to transfer files via 3270 session between PC and mainframe, you know as much as you need to know about IND$FILE. If your mainframe has IND$FILE, and your 3270 emulator does file transfers, you can use your emulator to transfer files between PC and mainframe. *[UNZIP60.CMSMVS]MC.EXEC;1+,v./ 4@-f0123KPWO56vU7vU89GHJ /* MAKECPIP EXEC Make program to build a C/370 module */ /* Author: George Petrov, 29 Sep 1994 */ arg fn . '(' cparms /* Filter name */ 'pipe (end ?) < 'fn' makefile', /* get all source files from */ '| frlab GLOBALS:'||, '| drop', '| strip', '| var globals' cparms = cparms globals say '' say 'Compile options : 'cparms say '' if pos('REB',cparms) > 0 then do parse var cparms cp1 'REB' . ' ' cp2 /* REBuild options specified ? */ cparms = cp1||cp2 pipe1=, 'pipe (end ?) < 'fn' makefile', /* get all source files from */ '| nfind *'||, /* the makefile and compile */ '| frlab TEXT:'||, /* only the those who are */ '| r: tolab MODULE:'||, /* changed or never compiled */ '| drop', '| o: fanout', '| chop before str /(/', '| statew', '| c: fanout', /* compiled */ '| specs /Compiling / 1 w1-3 n / .../ n', '| cons' end else do pipe1=, 'pipe (end ?) < 'fn' makefile', /* get all source files from */ '| nfind *'||, /* the makefile and compile */ '| frlab TEXT:'||, /* only the those who are */ '| r: tolab MODULE:'||, /* changed or never compiled */ '| drop', '| o: fanout', '| specs w1 1 /C/ nw w3 nw write w1 1 /TEXT A/ nw', '| chop before str /(/', '| statew', '| change (57 66) / /0/', '| sort 1.8 d', /* sort the date and time */ '| uniq 1-17 singles', /* if the first is a source */ '| sort 1.8 d 64.2 d 57.2 d 60.2 d 66.8 d', /* sort the date */ '| uniq 1-8 first', /* if the first is a source */ '| locate 9.8 /C /', /* program then it has to be */ '| c: fanout', /* compiled */ '| specs /Compiling / 1 w1-3 n / .../ n', '| cons' end pipe2= '?', 'r:', '| drop', '| specs w1 1', /* save the module name in var */ '| var module', '?', 'o:', '| specs w1 1', '| join * / /', '| var texts', /* save all the text file names */ '?', /* for later include */ 'c:', '| specs /CC / 1 w1-3 n /(NOTERM 'cparms'/ nw', /* compile! */ '| err: cms | cons', '?', 'err:', '| nfind 0'||, '| var err', '| specs /----> Errors found! RC=/ 1 1-* n', '| cons' /* '| g: gate'*/ pipe1 pipe2 say '' if symbol('err') = 'VAR' & err ^= 0 then do say 'Errors found in source files - link aborted! RC = 'err exit err end say 'Generating module 'module 'pipe cms cmod' fn texts' | > 'fn' LINK A' exit rc error: say 'Error in REXX detected!' Say 'Syntax error on line' Sigl':' Sourceline(Sigl) Say 'Error was:' Errortext(RC) return rc *[UNZIP60.CMSMVS]MVS.MKI;1+,). / 4 @-f0123KPWO 56789GHJ# Makefile for the MVS (OS/390 Base) version of UNZIP 5.4 # Produced for C/C++ V3R2 in OS/390 1.2.0 by Ian E. Gorman, 2 Nov 1998 # Facilities for compiling and testing were made available by # OmniMark Technologies Corporation, Ottawa, Canada # NOTES # # The only tabs in this file are in the first character of each recipe # line, where they are required by make. # # Run this makefile in OpenMVS (OS/390 POSIX) using source files in the # HFS file system. You can write the load module to either HFS fileT9\S UNZIP.BCK)f[UNZIP60.CMSMVS]MVS.MKI;1  # system or to a PDS in the native MVS file system. The PDS must have # sufficient free space to hold the load module. # # To compile to a member of a PDS: # make # or # make unzip.mvs # # To compile a test version into the HFS file system: # make hfs # UNZIP options -- MVS, REENTRANT ZIPOPTS=-DMVS # directories # generic source code SRC=.. SRC_P=$(SRC)/ # source code for MVS CMSMVS=../cmsmvs CMSMVS_P=$(CMSMVS)/ # include files INCLS=-I$(SRC) -I$(CMSMVS) # object files and load modules BLD_P=../mvs/ # Other options # Suffixes (E and O must be different) E= O=.o # Need EXTENDED features for global.c and vmvms.c, so not using c89 CC=cc CFLAGS=-D_OPEN_SYS $(ZIPOPTS) $(INCLS) LD=cc LDFLAGS= # Files # object (TEXT) files OBJECTS= $(BLD_P)unzip$(O) $(BLD_P)crc32$(O) \ $(BLD_P)crypt$(O) $(BLD_P)envargs$(O) $(BLD_P)explode$(O) \ $(BLD_P)extract$(O) $(BLD_P)fileio$(O) $(BLD_P)globals$(O) \ $(BLD_P)inflate$(O) $(BLD_P)process$(O) $(BLD_P)list$(O) \ $(BLD_P)match$(O) $(BLD_P)ttyio$(O) $(BLD_P)unreduce$(O) \ $(BLD_P)unshrink$(O) $(BLD_P)zipinfo$(O) $(BLD_P)vmmvs$(O) # Header files HFILES= $(SRC_P)consts.h $(SRC_P)crypt.h $(SRC_P)ebcdic.h \ $(SRC_P)globals.h $(SRC_P)inflate.h \ $(SRC_P)ttyio.h $(SRC_P)unzip.h $(SRC_P)unzpriv.h \ $(SRC_P)unzvers.h $(SRC_P)zip.h $(CMSMVS_P)vmmvs.h \ $(CMSMVS_P)vmstat.h # Rules all: $(BLD_P)unzip.mvs$(E) hfs: $(BLD_P)unzip$(E) # link $(BLD_P)unzip.mvs$(E): $(OBJECTS) $(LD) -o "//INFOZIP.LOAD(UNZIP)" $(LDFLAGS) $^ echo "tso call \"infozip(unzip)\" \"'\"\"""$$""@""\"\"'\"" > $% chmod a+x $% $(BLD_P)unzip$(E): $(OBJECTS) $(LD) -o $% $(LDFLAGS) $^ # compile $(BLD_P)api$(O): $(SRC_P)api.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)api.c $(BLD_P)apihelp$(O): $(SRC_P)apihelp.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)apihelp.c $(BLD_P)crc32$(O): $(SRC_P)crc32.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)crc32.c $(BLD_P)crypt$(O): $(SRC_P)crypt.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)crypt.c $(BLD_P)envargs$(O): $(SRC_P)envargs.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)envargs.c $(BLD_P)explode$(O): $(SRC_P)explode.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)explode.c $(BLD_P)extract$(O): $(SRC_P)extract.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)extract.c $(BLD_P)fileio$(O): $(SRC_P)fileio.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)fileio.c $(BLD_P)funzip$(O): $(SRC_P)funzip.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)funzip.c $(BLD_P)globals$(O): $(SRC_P)globals.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)globals.c $(BLD_P)inflate$(O): $(SRC_P)inflate.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)inflate.c $(BLD_P)list$(O): $(SRC_P)list.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)list.c $(BLD_P)match$(O): $(SRC_P)match.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)match.c $(BLD_P)process$(O): $(SRC_P)process.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)process.c $(BLD_P)ttyio$(O): $(SRC_P)ttyio.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)ttyio.c $(BLD_P)unreduce$(O): $(SRC_P)unreduce.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)unreduce.c $(BLD_P)unshrink$(O): $(SRC_P)unshrink.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)unshrink.c $(BLD_P)unzip$(O): $(SRC_P)unzip.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)unzip.c $(BLD_P)unzipstb$(O): $(SRC_P)unzipstb.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)unzipstb.c $(BLD_P)zipinfo$(O): $(SRC_P)zipinfo.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(SRC_P)zipinfo.c $(BLD_P)vmmvs$(O): $(CMSMVS_P)vmmvs.c $(HFILES) $(CC) -c -o $% $(CFLAGS) $(CMSMVS_P)vmmvs.c *[UNZIP60.CMSMVS]README.CMS;1+,.!/ 4!!@-f0123KPWO"56B\7B\89GHJ Using ZIP and UNZIP on VM/CMS ============================= Installing executables ---------------------- The following CMS MODULEs are available: ZIP ZIPNOTE ZIPCLOAK ZIPSPLIT UNZIP In addition to these, each MODULE file also has an EXEC with the same name. These EXECs are front-ends to the MODULES that will attempt to set up the required runtime libraries before running the MODULE. All the EXECs are identical. Only their names are different. They are stored as plain text files. The CMS MODULE files have been packed using the COPYFILE command to allow their file format to be properly restored, since variable length binary files will not currently unzip properly (see below for details). The MODULEs are shipped with a filetype or extension of CMO (for CMS MODULE). Their names may vary on the distribution disk to indicate their level, etc. To restore them to executable MODULEs on CMS, do the following: 1. Upload them to CMS with a Fixed record length with LRECL 1024. Example, from a DOS or OS/2 window, type this: SEND unzip.cmo A:unzip module a (RECFM F LRECL 1024 Example, using FTP from CMS, type this: BINARY FIXED 1024 GET unzip.cmo unzip.module.a Note: Replace "unzip.cmo" with the actual name. 2. Use COPYFILE to unpack the file. Example, in CMS type this: COPYFILE UNZIP MODULE A (UNPACK REPLACE OLDDATE 3. Repeat steps 1-2 for each of the programs. 4. Build the ZIPINFO module by typing this: COPYFILE UNZIP MODULE A ZIPINFO MODULE A (OLDDATE 5. Upload the EXECs to CMS as text files (with ASCII-to-EBCDIC translation). Example, from a DOS or OS/2 window, type this: SEND unzip.exc A:unzip exec a (CRLF Example, using FTP from CMS, type this: GET unzip.exc unzip.exec.a 6. Repeat steps 4 for each of the EXECs. Preparing the environment ------------------------- The executables provided were compiled with IBM C 3.1.0 and require the the Language Environment (LE) runtime libraries. To provide access to the runtime libraries: 1. Link to the disk containing the Language Environment files, if necessary. 2. Use the command "GLOBAL LOADLIB SCEERUN" These commands can be placed in your PROFILE EXEC. Note: EXECs have been provided called ZIP, UNZIP, etc. that issue the GLOBAL LOADLIB statement. This was done to alleviate frustration of users that don't have the GLOBAL LOADLIB statement in their PROFILE EXEC. These EXECs may require changing for your system. Unfortunately, there is no way, using IBM C, to produce a MODULE that doesn't require a runtime library. Testing ------- To test the MODULEs, just type ZIP or UNZIP. They should show help information on using the commands. If you see something like this: DMSLIO201W The following names are undefined: CEEEV003 DMSABE155T User abend 4093 called from 00DCD298 reason code 000003EB Then you don't have access to the proper runtime libraries, as described above. Here is aU] UNZIP.BCKf[UNZIP60.CMSMVS]README.CMS;1!|dditional information on the ZIP and UNZIP programs that may assist support personnel: - Compiled with IBM C V3R1M0 on VM/ESA 2.2.0 with CMS level 13 Service Level 702. - Require the SCEERUN LOADLIB runtime library. This is part of the Language Environment (LE). - Linked with options RMODE ANY AMODE ANY RLDSAVE. If you continue to have trouble, report the problem to Zip-Bugs (see the bottom of this document). Compiling the source on VM/CMS ------------------------------ The source has been successfully compiled previously using C/370 2.1 and 2.2. The source has been recently compiled using IBM C 3.1.0 on VM/ESA 2.2.0 with CMS level 13. I don't have access to an MVS system so the code hasn't been tested there in a while. 1. Unzip the source files required for CMS. The root-level files inside the ZIP file and the files in the CMSMVS subdirectory are needed. Example (use both commands): unzip -aj zip23.zip -x */* -dc unzip -aj zip23.zip cmsmvs/* -dc This example unzips the files to the C-disk, while translating character data and ignoring paths. If you don't already have a working UNZIP MODULE on CMS you will have to unzip the files on another system and transport them to CMS. All the required files are plain text so they can be transferred with ASCII-to-EBCDIC translations. 2. Repeat step 1 with the zip file containing the UNZIP code. Unzip the files to a different disk than the disk used for the ZIP code. 3. To compile the ZIP code, run the supplied CCZIP EXEC. To compile the UNZIP code, run the supplied CCUNZIP EXEC. NOTE: Some of the ZIP and UNZIP source files have the same name. It is recommended that you keep the source from each on separate disks and move the disk you are building from ahead of the other in the search order. For example, you may have a 192 disk with the ZIP source code and a 193 disk with the UNZIP source code. To compile ZIP, access the 192 disk as B, then run CCZIP. This will create the following modules: ZIP, ZIPNOTE, ZIPSPLIT, ZIPCLOAK. To compile UNZIP, access 193 as B, then run CCUNZIP. This will create the following modules: UNZIP, ZIPINFO (a copy of UNZIP). ========================================================================= Using ZIP/UNZIP --------------- Documentation for the commands is in MANUAL NONAME (for ZIP) and in UNZIP DOC UNZIP. INFOZIP DOC describes the use of the -Z option of UNZIP. The rest of this section explains special notes concerning the VM/CMS version of ZIP and UNZIP. Filenames and directories ------------------------- 1. Specifying filenames a. When specifying CMS files, use filename.filetype.filemode format (separate the three parts of the name with a period and use no spaces). Example: profile.exec.a Unfortunately, this prevents you from using ZIP from FILELIST. To unzip a zip file, however, you can type something like this next to it in FILELIST: unzip /n -d c This will unzip the contents of the current file to a C-disk. b. It is possible to use DD names with ZIP and UNZIP on CMS, though it can be cumbersome. Example: filedef out disk myzip zip a zip dd:out file1.txt file2.txt While you can also use a DD name for the input files, ZIP currently does not correctly resolve the filename and will store something like "dd:in" inside the ZIP file. A file stored in this manor cannot easily be unzipped, as "dd:in" is an invalid filename. c. In places where a directory name would be used on a PC, such as for the ZIP -b (work path) option or the UNZIP -d (destination path) options, use a filemode letter for CMS. For example, to unzip files onto a C-disk, you might type something like this: unzip myzip.zip -d c Currently, ZIP uses the A-disk for work files. When zipping large files, you may want to specify a larger disk for work files. This example will use a C-disk for work files. zip -b C myzip.zip.c test.dat.a 2. Filename conversions a. Filemode letters are never stored into the zip file or take from a zip file. Only the filename and filetype are used. ZIP removes the filemode when storing the filename into the zip file. UNZIP assumes "A" for the filemode unless the -d option is used. b. When unzipping, any path names are removed from the fileid and the last two period-separated words are used as the filename and filetype. These are truncated to a maximum of eight characters, if necessary. If the filetype (extension) is missing, then UNZIP uses "NONAME" for the filetype. Any '(' or ')' characters are removed from the fileid. c. All files are created in upper-case. Files in mixed-case cannot currently be stored into a ZIP file. d. Shared File System (SFS) directories are not supported. Files are always accessed by fn.ft.fm. To use an SFS disk, Assign it a filemode, then it can be used. 3. Wildcards in file names a. Wildcards are not supported in the zip filename. The full filename of the zip file must be given (but the .zip is not necessary). So, you can't do this: unzip -t *.zip b. Wildcards CAN be used with UNZIP to select (or exclude) files inside a zip file. Examples: unzip myzip *.c - Unzip all .c files. unzip myzip *.c -x z*.c - Unzip all .c files but those starting with Z. c. Wildcards cannot currently be used to select files with ZIP. So, you can't do this: zip -a myzip *.exec I expect to fix this for CMS in the future. 4. File timestamps a. The dates and times of files being zipped or unzipped are not currently read or set. When a file is zipped, the timestamp inside the zip file will always be the current system date and time. Likewise, when unzipping, the date and time of files being unzipped will always be the current system date/time. b. Existing files are assumed to be newer than files inside a zip file when using the -f freshen option of UNZIP. This will prevent overwriting files that may be newer than the files inside the zip file, but also effectively prevents the -f option from working. 5. ASCII, EBCDIC, and binary data Background ---------- Most systems create data files as just a stream of bytes. Record breaks happen when certain characters (new line and/or carriage return characters) are encountered in the data. How to interpret the data in a file is up to the user. The system must be told to either notice new line characters in the data or to assume that the data in the file is binary data and should be read or written as-is. CMS and MVS are record-based systems. All files are composed of data records. These can be stored in fixed-length files or in variable length files. With fixed-length files, each record is the same length. The record breaks are implied by the LRECL (logical record length) attribute associated with the file. With variable-length files, each record contains the length of that record. The separation of records are not part of the data, but part of the file structure. This means you can store any type of data in either type of file structure without having to worry about the data being interpreted as a record break. FixedVKAK UNZIP.BCKf[UNZIP60.CMSMVS]README.CMS;1!l-length files may have padding at the end of the file to make up a full record. Variable-length files have no padding, but require extra record length data be stored with the file data. Storing fixed-length files into a zip file is simple, because all the data can just be dumped into the zip file and the record format (RECFM) and logical record length (LRECL) can be stored in the extra data area of the zip file so they can be restored when UNZIP is used. Storing variable-length data is harder. There is no place to put the record length data needed for each record of the file. This data could be written to the zip file as the first two bytes of each record and interpreted that way by UNZIP. That would make the data unusable on systems other than CMS and MVS, though. Currently, there isn't a solution to this problem. Each record is written to the zip file and the record length information is discarded. Binary data stored in variable-length files can't be put into a zip file then later unzipped back into the proper records. This is fine for binary data that will be read as a stream of bytes but not OK where the records matter, such as with CMS MODULEs. If the data is text (character data), there is a solution. This data can be converted into ASCII when it's stored into a zip file. The end of each record is now marked in the file by new line characters. Another advantage of this method is that the data is now accessible to non-EBCDIC systems. When the data is unzipped on CMS or MVS, it is converted back into EBCDIC and the records are recreated into a variable-length file. So, here's what we have... a. To store readable text data into a zip file that can be used on other platforms, use the -a option with ZIP to convert the data to ASCII. These files will unzip into variable-length files on CMS and should not contain binary data or corruption may occur. b. Files that were zipped on an ASCII-based system will be automatically translated to EBCDIC when unzipped. To prevent this (to unzip binary data on CMS that was sent from an ASCII-based system), use the -B option with UNZIP to force Binary mode. To zip binary files on CMS, use the -B option with ZIP to force Binary mode. This will prevent any data conversions from taking place. c. When using the ZIP program without specifying the "-a" or "-B" option, ZIP defaults to "native" (EBCDIC) mode and tries to preserve the file information (RECFM, LRECL, and BLKSIZE). So when you unzip a file zipped with ZIP under CMS or MVS, UNZIP restores the file info. The output will be fixed-length if the original was fixed and variable-length if the original was variable. If UNZIP gives a "write error (disk full?)" message, you may be trying to unzip a binary file that was zipped as a text file (without using the -B option) Summary ------- Here's how to ZIP the different types of files. RECFM F text Use the -a option with ZIP to convert to ASCII for use with other platforms or no options for use on EBCDIC systems only. RECFM V text Use the -a option with ZIP to convert to ASCII for use with other platforms or no options for use on EBCDIC systems only. RECFM F binary Use the -B option with ZIP (upper-case "B"). RECFM V binary Use the -B option with ZIP. Can be zipped OK but the record structure is destroyed when unzipped. This is OK for data files read as binary streams but not OK for files such as CMS MODULEs. 6. Character Sets If you are used to running UNZIP on systems like UNIX, DOS, OS/2 or Windows, you will may have some problems with differences in the character set. There are a number of different EBCDIC code pages, like there are a number of different ASCII code pages. For example, there is a US EBCDIC, a German EBCDIC, and a Swedish EBCDIC. As long as you are working with other people who use the same EBCDIC code page, you will have no trouble. If you work with people who use ASCII, or who use a different EBCDIC code page, you may need to do some translation. UNZIP translates ASCII text files to and from Open Systems EBCDIC (IBM-1047), which may not be the EBCDIC that you are using. For example, US EBCDIC (IBM-037) uses different character codes for square brackets. In such cases, you can use the ICONV utility (supplied with IBM C) to translate between your EBCDIC character set and IBM-1047. If your installation does not use IBM-1047 EBCDIC, messages from UNZIP may look a little odd. For example, in a US EBCDIC installation, an opening square bracket will become an i-acute and a closing square bracket will become a u-grave. The supplied ZIP and UNZIP EXECs attempt to correct this by setting CMS INPUT and OUTPUT translations to adjust the display of left and right brackets. You may need to change this if brackets don't display correctly on your system. 7. You can unzip using VM/CMS PIPELINES so unzip can be used as a pipeline filter. Example: 'PIPE COMMAND UNZIP -p test.zip george.test | Count Lines | Cons' Please report all bugs and problems to: Zip-Bugs@lists.wku.edu ----------------------------------------------------------------------- Original CMS/MVS port by George Petrov. e-mail: c888090@nlevdpsb.snads.philips.nl tel: +31-40-781155 Philips C&P Eindhoven The Netherlands ----------------------------------------------------------------------- Additional fixes and README re-write (4/98) by Greg Hartwig. e-mail: ghartwig@ix.netcom.com ghartwig@vnet.ibm.com ----------------------------------------------------------------------- Additional notes from Ian E. Gorman. e-mail: ian@iosphere.net *[UNZIP60.CMSMVS]README.MVS;1+,. / 4 m@-f0123KPWO56x7x89GHJThank you for trying this port of UNZIP for VM/CMS and MVS! Using under MVS: ------------------------- 1. To use the Info-ZIP's UNZIP under MVS you need: - C/370 ver 2.1 compiler or another compatible compiler supporting long names for function/variable names. 2. To compile the program under MVS do : - unzip all the files from unz54vm.zip file. They are stored as ASCII format so you have to unzip them first on PC or other system that already have UNZIP, and then upload them to the mainframe with ASCII to EBCDIC conversion. - Copy all the .C files in the PDS called USERID.UNZIP.C - Copy all the .H files in the PDS called USERID.UNZIP.H - adjust the job UNZMVSC.JOB to work on your site. Change USERID to your userid. You might need to change the CEE dataset names to match your OS/390 system. - Preallocate PDS datasets named: USERID.UNZIP.OBJ and USERID.UNZIP.LOAD - execute the job UNZMVSC to compile andWɑ UNZIP.BCKf[UNZIP60.CMSMVS]README.MVS;1 Ru link all the sources. - if everything is ok you will get an UNZIP MODULE 3. Using UNZIP - Just read the UNZIP.TXT - A few exceptions concerning MVS 3.0. There are different ways to invoke UNZIP. - allocating UNZIP.LOAD dataset to your ISPLLIB if you want to invoke UNZIP under ISPF. Then just type UNZIP ...parms... to get it work - You can also call it directly with : TSO CALL 'userid.UNZIP.LOAD(UNZIP)' '...parms...' (notice to quotes!) - You can even call it from a batch job like: //MYZIP JOB (account) //STEP1 EXEC PGM=UNZIP,PARM='-l mytestz.zip *.c' //STEPLIB DD DSN=userid.UNZIP.LOAD,DISP=SHR //SYSPRINT DD SYSOUT=* This will list all the .c files from the zip file mytestz.zip 3.1. If the ZIP file has been zipped on an ASCII based system it will be automatically translated to EBCDIC ( I hope I got all those translation tables OK :-). You can force ASCII to EBCDIC conversion with the -a flag. 3.2. The date/time of the output files is set to the current system date/time - not according the date/time in the zip file. 3.3. You can even unzip using TSO/E PIPELINES so unzip can be used as pipeline filter: 'pipe cms unzip -p test.zip george.test | count lines | cons' ( we do also a lot of pipethinking here ;-) 3.4. If you got also the ZIP program (see ZIP21VM.ZIP) you can do zipping and unzipping without translating to ASCII the ZIP also preserves the file informations (LRECL,BLKSIZE..) So when you UNZIP a file zipped with ZIP under MVS it restores the file info. There currently some problems with file with RECFM=V* I don't save the length of each record yet :-) 3.5. No wildcards are supported in the input zip name you have to give the real name (.zip is not necessary) So you CAN'T use things like: unzip -t *.zip 3.6. But you CAN use wildcards as filename selection like: unzip -t myzip *.c - OK or even unzip -t myzip *.c -x z*.c - to exclude all files matching z*.c 3.7. You can unzip to a PDS using the -d parameter, for example: unzip -dmyzip myzip *.c This will unzip all .c files that are in the zip file in a PDS directory called MYZIP.C BE AWARE that the extension of every files is being placed as last identifier on the PDS name, so if you have a file in the zipfile called 'testp.doc' and you use '-d mypds' the PDS name will become 'mypds.doc(testp)' Depending on which options IBM chose for C this week, unzip may or may not prefix output files with your userid and/or TSO prefix. To prevent this, quote the filename to -d, for example //UNZIP EXEC PGM=UNZIP, // PARM='/-a -o ''userid.zip'' -d ''hlq.test'' *' //STEPLIB DD DSN=USERID.UNZIP.LOAD,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* The above JCL converts from ASCII to EBCDIC (-a), always overwrites existing members (-o), extracts from 'userid.zip', writes to files starting with 'hlq.test', all members (*). Note the double quotes because PARM= requires single quotes. 3.8. The rules for output DCBs are a little messy. If the output file already exists (remember the -d option) then unzip uses the existing DCB and space values. If the output file does not exist and the input zip came from MVS then unzip makes its best attempt at preserving the original DCB. However there is not enough information stored in the zip file to do this correctly for all file types, some file types may be corrupted. If the output file does not exist and the input zip does not contain MVS DCB information then unzip uses RECFM=U, LRECL=32760 for binary data, RECFM=V, LRECL=133 for text. Text includes ASCII to EBCDIC conversion. As soon as the output file is created, unzip uses the same output DCB for all following members, even if the input is a mixture of text and binary. In all cases, unzip has no built in parameters for space. For a preallocated file this is not a problem. If unzip creates an output file you get a default space allocation which is site dependent. It is far better to preallocate the output files with the correct space and DCB values then use the -d option to point to those files. 3.9. All '+','_' or '-' signs are skipped from the filenames Please repport all bugs and problems to : Zip-Bugs@lists.wku.edu That's all for now. Have fun! George Petrov e-mail: c888090@nlevdpsb.snads.philips.nl tel: +31-40-781155 Philips C&P Eindhoven The Netherlands Updated by: Keith Owens *[UNZIP60.CMSMVS]UNZIP.EXEC;1+,./ 4@-f0123KPWO56,}U7,}U89GHJ/***********************************************************************/ /* */ /* Front-end EXEC to set up linkage to the C runtime libraries */ /* before executing a MODULE generated from C code. */ /* */ /* Copy this file as an EXEC with a filename matching the C MODULE. */ /* */ /* Greg Hartwig (ghartwig@vnet.ibm.com) 7/31/97, 4/24/98. */ /* */ /***********************************************************************/ Address Command Parse Arg argstring Parse Source . . myname . /* Set output and input character translation so brackets show up */ 'SET OUTPUT AD' 'BA'x 'SET OUTPUT BD' 'BB'x 'SET INPUT BA AD' 'SET INPUT BB BD' Call CLIB If rc<>0 Then Do Say 'The required C runtime libraries don''t appear to be available.' Say myname 'can not run.' Exit 12 End /* Run the command */ myname argstring Exit rc /* Contents of the CLIB EXEC, modified for RC checking. */ /* Removed TXTLIB setting. Only LOADLIB needed for execution. */ CLIB: /***************************************************/ /* SET UP LIBRARIES FOR LE for MVS & VM */ /***************************************************/ Address COMMAND loadlib ='EDCLINK' /* C/370 runtime X4 Ig hm`q gD"1 '~o6AZ:s!->WQg~ S*[F)Qdqrd%rެޯc#>sA66Qi-wveNjΊ^"\Tx?xG80XGRZa.h-W\M{S'htjIԨfif:!;󶓋X/&GxI肬)G!%>^o0oRf @GB4ȩϛU$s 2 (?*G@z\Ds*r+k=k1P&6)4a#7 M7gI]r-Pm.ݒbN|69Fx":v":AfR:h;UT>UW\P-:hVFv9Hqsu~dVsksgY>#fuK:)+;Zv>`uF9gs>5azM1J8 }QP!7s=:Fu:TqqZ 4^t<|$+nVVR<2Ib]Y `mUO?'7.|A h@A=<( & a a9:0dLj\Ai#/xj@tHEmi 0oiq.Qw2-y?T(FRJK8nSsX)D%HX( eAJL$76(D`e"-~h38, z't`A+.EnUF}Rg0MT(s~1z\8i!2>:HM%;V^Yi@g~hY^(ه?ݔN3#.2n3la _ &P6^%4-h+.WۗYEL'+p{@M1 MG1cMnOFJvI*HVᇀ\x"[7nau.T69WY&'w:Q!e:R?j$ 7eA7"Q&?:+bQNv iY-,d>͋qiP=<j:[n' L'DN D YaNn?&0g.N D $ j@~ ë׸"'wPbm#^,`6*/Gx]\t!oSG+K >bYnLY<$JEU7#;\}A};Z[.LWe@#WDn98Iz2 o:#?qT\4Xw=ZpxQqt&3Oc-U8hjj>oW^bqW/@`IS=gf>avK*4kL8["' ]~/^\ $~7Oe~-xSe:`~HO\Fs->a_+|E O3g@=n*gB{:Yoqv_z4O4y*{$<' Ua>4*ghQS:]KG^!`qX2ia8{_>sV?fz ' =*H2 Vf]% P% g>5\)IR|EVU\T&ijdm91@3FDEVY]=c^3O_$5K YWP$Nm%^ U=vo:%W6'_rjO#>a.Hg#^&eQyNx/Wr |hwSIGY2@>?G 2R{f!KIL!GVwEhMam\p~smj>QQ,SCSo?>4p-|NDAM\1flpkTrB&${X(dSAxWqp$ GJ`c11PmJ^;u{9p ',s?u3)M|s,+2L1Bm;)RSsRV k"p:X O 4 x7WU@BH ;Bk{$\jaP\9I^W?4fi4hQkXr!W5W!f (s(~T| &:34[!6 mk9p0`4+; '1sLyLMkdu@M`VJ3xyp1.$*}L2`gcT+ qS~w9=(G$x=^:JIj`f|I,Sf*0C:% I+.xH,qq5q?'f! "O+c;wT^30h`{(p<i1~uaX LA\YF[ ~UMO"{}"aM& _J R j;. 4,p8Ma>l* .5g8IW$=M]Mo :!i=5#nyapgZNHM H_8M@umeXK:: !`x9Rm%G4J}A+#!h'F7PP5z1#d:5K*?6$HL|5|.G[b|?Pi:QO*&OJR  ,ZjJ%X#aSr/<%AO B2 **8j"e< +&&eWN(]{sGR6<K.R?mPyump^:qNTb! y^&?tz*{zzIjsegJ C7+t;EJD=zj-#P(5W!4 iC=;;1 KY9HUEn!o)<%}qLbFDf2b=afX wbN/YuJN%l#[ h2<&gd,"jhjcok5<2A >3V7.0SAt }^,YgrEH* {rWW,UC&iGgof% FyaX3 T[n>z9 v@UR^?h9:pd7EGCwOWJ d`>%+j|t ^J90 _2s0*{,f>CGH~b uKUp%^#)+r#UX\eNh_MtYX=(G 6c=HT}Km/C=.=m`!>I@3.(/JrmhRSp0EsM}{~I1&z:x{MAB6;Ef>wZOmJ3 z][yE[g+doO=6VcJAfz!_O"W:fA'0y}yf]iD[Фh3"L}Aj=*_ {qaM"h)kNG1K@8`A*wQ>Z8t\Yy*QZZf6HYyg@h8c\;Mik1AQ\!`TupN4c$Ap}PG +cf8E[Z;=KlxT b 7.8-8 AB`C%cJ4-p e yDe-J@*Zly-^TbYR (ua7/q PeeLy"Y. \[v,mKnZj9^G&j~y/I=XK)CN*=Zg66 0JL:%G XSg],HAT`ZPZE;V(ebq(Il+ݕ`"vv}8)C#*>`9*_SAE2/Gl0] OuQ-N6&MJ/a9*QO0Vgr%M_\ +<)qfx#y-^2_Y.\ _=>qSs1&>XUPl";xs 0GJ=8sy-qp 1T1f> 1Prk)gl3WWDrG$mR$c2N)0]_&kc2X D>J8[qQ?\HoK(a?9S*K"cU-z/K IdEC0Ɇ&[*vu]ZnB#jZdt"a|2vZ}7%AuX: 10V{*QCn"1Pe yon(K9[;mFE] =IZ&YQs~T7Lykzoqӻih+4fIԴp$w b;kJu*/:IpRf)`2,;CpuƴmW_o Pw].x38;VF=*>j*A jor? `[2Bpqbo?lAVh&L:2:uA7Ci16UdW3[Rz&6=+#wBn2 ]}x-\Z0_Vi=Byu[KB%^ k4UdAu\+R < rY CCv~-j21/Ik x]py0IBm1*'x-vb0$q7)x*^Ctj_R0#jn5#g"dL 4)exN=v*JG7 RgWD<-$/N1(X5aBol s^ tP'S6$Fj]btUTqS2vNrN8xw=fT#9lV0k-vF{gnE }yWkDd Q^e!\|czEs? KLOk>S\v0otn(fw =z[\3)Nm3o81Dqm+4 t7amm W wJR\J TSF`qQ%SR3Rc`lunkudW;[#c`%s5" >/<]-Yq4lnBg)+2;56n?k3^ZlC:R(::X.k]P-_,'|Hm}HnbCCseN% E#9Jx# +VEU ^+H'/*HU>oR03h}gf. <O7~V,yE@wl% )Gwnb!V5swE\5<`uLcq yMRvuu#lQ=3hdSk~.L~4{ E?h6Uxs|bH{'4P2DB8- khvKa `yNMY!{E:eizgga hGHM3|4_oR}wMM9~'|!pA'!!=e7[ ; T.`}.U= !q>n CJ5!_ZfChYNSkm: zH>,&wnkC|QF*C*wJW o#yd G H|Fxe3lfr(M4 QCYx0Zuc}J%wQj'dN}9xWYkWZR7l;|)@ BneRl$!Lp+#a@ Byv UDZ H7ke"sk}8kk&* LiC?z}_3={ I4xo2k6o%t85C2}P_Mo9FJS<@@h_B7xn= wTno6JC5la\Y.JCOHb7X\krocq,PAzR$"m(bQ A6}{{GdWZaI^ Iw~'ksMI|%7UX n>{svdnT~#`|Nn,eK\ l]Mqn(WU$HK}R8ps}ihql h1m'15+VW3$6Ec ;'k}3i =3V3pP:A%rT9k mF+@b QQPU;afL?'lW1PTj~<1DgK1op8Jy):7pQ'n4S9Ma9V1P]XQG~b4;$rmd/zH*@F2 k/ H { = _mC n_B U>0)Xm4Ns~Bp|'5Gu 'u-o,e`|9%b/JFJ x5z@=Z~r?+9%9d[*qGO^|*W#1`/6X[]@-pZ -@'/.ns{d-iqD%$,6i E^jvdSd,*Nw?E*3])2l |="n @E `KYDT/5HzXtjAH(yv6K J0rEeNc| I[Oz]Q hv8`Dowp6ePTg[tlYUqs=j&)Y@8fho2>#h\*F2D|jfF`I G^@-H9;B2*#DH1E h{0/ }2okZ I"cP+dkNKRErnX+0b))V6]8rndaA 9"a+2GUvIVD] NF&~ oa/  hBY}lr ,N}Od$GcF ?bVHft  WOuIO4j'U\EHUuU.&z* m?pCioPQebx530[CvvUY~F {C/Pn,|=+BOI)r%Mv(-g t+xIkW,g*foV YkV_tMi.Nab5Akh-cChDGP*(6NYv7m;S+i}87]vto8z@S?}ef/gc2zZK(9$Y'0=X\/| Mgn5{ }kR1ik W uNK=_;m dX><8w o-[`W*)gZLwPUlY"hG;)2lp[&j |.{ +(Y03k8aE^Qq;P5lSf^#LA:#a+V wb#H{PRCdNUzCLhwHsL+3a!'q+%fwx+: nK)0an9u&(%L2!jv*MZ:\"_+t-)YV)J+~iso+f`m|K"0-_jXxHMm Dm oSJ !HAS`+=AkcI:gt:?ViFG%4LM A#iYg#?WjTkF%LRyL k5 6}i.i qRJ]^G}IQi*Y Y\"UCclXT5c'DL\{}L`B6--U,03'K/P$MznAze8<2V u5f[;0vL`sM 3"Az:,cvSUY_I]vE">q.!+b#Dscb0lf4]M+[ W[K:t=-l!G/yN0-;&WK Gq}^-,ra7L"(E`)]3CGe3Zf}0 "_a@d$qgUi;@ L5emq:)XL|j`g mb+/V SByC[ *$Q.vkV\,-r8xb*3mfA$3& om a PC, you canY UNZIP.BCKf[UNZIP60.CMSMVS]UNZIP.EXEC;1MG */ loadlib ='SCEERUN' /* LE runtime */ theirs=queued() /* old stack contentsM068*/ 'QUERY LOADLIB ( LIFO' /* old setting M068*/ LoadlibList='' /* init list M068*/ rc=0 Do while queued()^=theirs /* all lines from cmdM068*/ Parse upper pull 'LOADLIB' '=' Ltemp /* get one line M068*/ LoadlibList= Ltemp Loadliblist /* was stacked LIFO M068*/ End /*M068*/ If loadlibList='NONE' , Then Do 'GLOBAL LOADLIB' Loadlib /* enforce what we need */ End Else Do Do xx=1 to Words(loadlib) If Find(loadliblist,word(loadlib,xx)) = 0 , then loadliblist = loadliblist word(loadlib,xx) End 'GLOBAL LOADLIB' loadliblist /* enforce what we need */ End Return  *[UNZIP60.CMSMVS]UNZIP.MAKEFILE;1+,./ 4E@-f0123KPWO56* 7* 89GHJ* This is a comment * this makefile compiles filter UNZIP GLOBALS: long def(VM_CMS) TEXT: unzip c crc32 c crypt c envargs c explode c extract c fileio c globals c inflate c list c match c process c ttyio c unreduce c unshrink c zipinfo c vmmvs c MODULE: unzip module *[UNZIP60.CMSMVS]UNZMVSC.JOB;1+, &. / 4 @-f0123KPWO 56:7:89GHJ//* //* LE COMPILE FOR UNZIP541. //* ALL STEPS SHOULD GET COND CODE 0 EXCEPT FOR PLINK.PLKED WHICH GETS 4. //* //CBC JCLLIB ORDER=CBC.SCBCPRC //UNZIP EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(UNZIP)', // OUTFILE='USERID.UNZIP.OBJ(UNZIP),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //CRC32 EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(CRC32)', // OUTFILE='USERID.UNZIP.OBJ(CRC32),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //CRYPT EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(CRYPT)', // OUTFILE='USERID.UNZIP.OBJ(CRYPT),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //ENVARGS EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(ENVARGS)', // OUTFILE='USERID.UNZIP.OBJ(ENVARGS),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //EXPLODE EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(EXPLODE)', // OUTFILE='USERID.UNZIP.OBJ(EXPLODE),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //EXTRACT EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(EXTRACT)', // OUTFILE='USERID.UNZIP.OBJ(EXTRACT),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //FILEIO EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(FILEIO)', // OUTFILE='USERID.UNZIP.OBJ(FILEIO),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //GLOBALS EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(GLOBALS)', // OUTFILE='USERID.UNZIP.OBJ(GLOBALS),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //INFLATE EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(INFLATE)', // OUTFILE='USERID.UNZIP.OBJ(INFLATE),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //LIST EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(LIST)', // OUTFILE='USERID.UNZIP.OBJ(LIST),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //MATCH EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(MATCH)', // OUTFILE='USERID.UNZIP.OBJ(MATCH),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //PROCESS EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(PROCESS)', // OUTFILE='USERID.UNZIP.OBJ(PROCESS),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //TTYIO EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(TTYIO)', // OUTFILE='USERID.UNZIP.OBJ(TTYIO),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //UNREDUCE EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(UNREDUCE)', // OUTFILE='USERID.UNZIP.OBJ(UNREDUCE),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //UNSHRINK EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(UNSHRINK)', // OUTFILE='USERID.UNZIP.OBJ(UNSHRINK),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //ZIPINFO EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(ZIPINFO)', // OUTFILE='USERID.UNZIP.OBJ(ZIPINFO),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //VMMVS EXEC EDCC,COND=(0,NE),CREGSIZ='0M', // INFILE='USERID.UNZIP.C(VMMVS)', // OUTFILE='USERID.UNZIP.OBJ(VMMVS),DISP=SHR', // CPARM='LONG,NOTERM,LIST,XREF,SOURCE', // CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' //COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR //PLINK EXEC PROC=EDCPL,COND=(4,LT), // OUTFILE='USERID.UNZIP.LOAD(UNZIP),DISP=SHR', // PPARM='NONCAL,MAP,MEMORY', // LPARM='LIST,MAP,XREF' //SYSPRINT DD SYSOUT=* //PLKED.SYSIN DD DSN=USERID.UNZIP.OBJ(UNZIP),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(CRC32),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(CRYPT),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(ENVARGS),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(EXPLODE),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(EXTRACT),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(FILEIO),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(GLOBALS),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(INFLATE),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(LIST),DISP=SHR // ZJAx UNZIP.BCK &f[UNZIP60.CMSMVS]UNZMVSC.JOB;1 d DD DSN=USERID.UNZIP.OBJ(MATCH),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(PROCESS),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(TTYIO),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(UNREDUCE),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(UNSHRINK),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(ZIPINFO),DISP=SHR // DD DSN=USERID.UNZIP.OBJ(VMMVS),DISP=SHR //LKED.SYSLIB DD DISP=SHR,DSN=CEE.SCEELKED *[UNZIP60.CMSMVS]UNZVMC.EXEC;1+, ]./ 4@-f0123KPWO56k]7k]89GHJ/* VMCOMPIL EXEC Unzip compile for VM/CMS */ /* Author : George Petrov, 11 Apr 1995 */ signal on error parms = '(long def(VM_CMS)' /* Add local options */ /* "TARGET(COMPAT)" is required for V2.2 compiler */ parms = parms 'TARGET(COMPAT) SOURCE' say 'Compiling UNZIP C...' 'cc unzip c 'parms say 'Compiling CRC32 C...' 'cc crc32 c 'parms say 'Compiling CRYPT C...' 'cc crypt c 'parms say 'Compiling ENVARGS C...' 'cc envargs c 'parms say 'Compiling EXPLODE C...' 'cc explode c 'parms say 'Compiling EXTRACT C...' 'cc extract c 'parms say 'Compiling FILEIO C...' 'cc fileio c 'parms say 'Compiling GLOBALS C...' 'cc globals c 'parms say 'Compiling INFLATE C...' 'cc inflate c 'parms say 'Compiling PROCESS C...' 'cc process c 'parms say 'Compiling LIST C...' 'cc list c 'parms say 'Compiling MATCH C...' 'cc match c 'parms say 'Compiling TTYIO C...' 'cc ttyio c 'parms say 'Compiling UNREDUCE C...' 'cc unreduce c 'parms say 'Compiling UNSHRINK C...' 'cc unshrink c 'parms say 'Compiling ZIPINFO C...' 'cc zipinfo c 'parms say 'Compiling VMMVS C...' 'cc vmmvs c 'parms say 'Linking all files...' 'cmod unzip unzip crc32 crypt envargs explode extract fileio globals', 'inflate list match process ttyio unreduce unshrink zipinfo vmmvs' say 'All Done!' say "To run enter : UNZIP parms" exit rc error: say 'Error during compilation!' exit rc *[UNZIP60.CMSMVS]VMMVS.C;1+,  .&/ 4&&C@-f0123KPWO'56@<7@<89GHJ/* Copyright (c) 1990-2005 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- vmmvs.c (for both VM/CMS and MVS) Contains: vmmvs_open_infile() open_outfile() close_outfile() close_infile() getVMMVSexfield() do_wild() mapattr() mapname() checkdir() check_for_newer() stat() version() ---------------------------------------------------------------------------*/ #define __VMMVS_C /* identifies this source module */ #define UNZIP_INTERNAL #include "unzip.h" /********************************/ /* Function vmmvs_open_infile() */ /********************************/ FILE *vmmvs_open_infile(__G) __GDEF { FILE *fzip; G.tempfn = NULL; fzip = fopen(G.zipfn, FOPR); #if 0 /* Let's try it without the convert for a while -- RG Hartwig */ if ((fzip = fopen(G.zipfn,"rb,recfm=fb")) == NULL) { size_t cnt; char *buf; FILE *in, *out; if ((buf = (char *)malloc(32768)) == NULL) return NULL; if ((G.tempfn = tmpnam(NULL)) == NULL) return NULL; if ((in = fopen(G.zipfn,"rb")) != NULL && (out = fopen(G.tempfn,"wb,recfm=fb,lrecl=1")) != NULL) { Trace((stdout,"Converting ZIP file to fixed record format...\n")); while (!feof(in)) { cnt = fread(buf,1,32768,in); if (cnt) fwrite(buf,1,cnt,out); } } else { free(buf); fclose(out); fclose(in); return NULL; } free(buf); fclose(out); fclose(in); fzip = fopen(G.tempfn,"rb,recfm=fb"); if (fzip == NULL) return NULL; /* Update the G.ziplen value since it might have changed after the reformatting copy. */ fseek(fzip,0L,SEEK_SET); fseek(fzip,0L,SEEK_END); G.ziplen = ftell(fzip); } #endif return fzip; } /***************************/ /* Function open_outfile() */ /***************************/ int open_outfile(__G) /* return 1 if fail */ __GDEF { char type[100]; char *mode = NULL; #ifdef MVS /* Check if the output file already exists and do not overwrite its DCB */ char basefilename[PATH_MAX], *p; FILE *exists; /* Get the base file name, without any member name */ strcpy(basefilename, G.filename); if ((p = strchr(basefilename, '(')) != NULL) { if (basefilename[0] == '\'') *p++ = '\''; *p = '\0'; } exists = fopen(basefilename, FOPR); if (exists) { if (G.pInfo->textmode) mode = FOPWTE; /* Text file, existing */ else mode = FOPWE; /* Binary file, existing */ fclose(exists); } else /* continued on next line */ #endif /* MVS */ if (G.pInfo->textmode) { if (mode == NULL) mode = FOPWT; } else if (G.lrec.extra_field_length > 0 && G.extra_field != NULL) { unsigned lef_len = (unsigned)(G.lrec.extra_field_length); uch *lef_buf = G.extra_field; while (lef_len > EB_HEADSIZE) { unsigned eb_id = makeword(&lef_buf[EB_ID]); unsigned eb_dlen = makeword(&lef_buf[EB_LEN]); if (eb_dlen > (lef_len - EB_HEADSIZE)) { /* Discovered some extra field inconsistency! */ TTrace((stderr, "open_outfile: block length %u > rest lef_size %u\n", eb_dlen, lef_len - EB_HEADSIZE)); break; } if ((eb_id == EF_VMCMS || eb_id == EF_MVS) && (getVMMVSexfield(type, lef_buf, eb_dlen) > 0)) { mode = type; break; } /* Skip this extra field block */ lef_buf += (eb_dlen + EB_HEADSIZE); lef_len -= (eb_dlen + EB_HEADSIZE); } } if (mode == NULL) mode = FOPW; Trace((stderr, "Output file='%s' opening with '%s'\n", G.filename, mode)); if ((G.outfile = fopen(G.filename, mode)) == NULL) { Info(slide, 0x401, ((char *)slide, "\nerror: cannot create %s\n", FnFilter1(G.filename))); Trace((stderr, "error %d: '%s'\n", errno, strerror(errno))); return 1; } return 0; } /* end function open_outfile() */ /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) __GDEF { fclose(G.outfile); } /* end function close_outfile() */ /***************************/ /* Function close_infile() */ /***************************/ void close_infile(__G) __GDEF { fclose(G.zipfd); /* If we're working from a temp file, erase it now */ if (G.tempfn) remove(G.tem[ UNZIP.BCK  f[UNZIP60.CMSMVS]VMMVS.C;1& pfn); } /* end function close_infile() */ /******************************/ /* Function getVMMVSexfield() */ /******************************/ extent getVMMVSexfield(type, ef_block, datalen) char *type; uch *ef_block; unsigned datalen; { fldata_t *fdata = (fldata_t *) &ef_block[4]; if (datalen < sizeof(fldata_t)) return 0; strcpy(type, "w"); strcat(type, fdata->__openmode == __TEXT ? "" :fdata->__openmode == __BINARY ? "b" :fdata->__openmode == __RECORD ? "b,type=record" : ""); strcat(type, ",recfm="); strcat(type, fdata->__recfmF? "F" :fdata->__recfmV? "V" :fdata->__recfmU? "U" : "?"); if (fdata->__recfmBlk) strcat(type, "B"); if (fdata->__recfmS) strcat(type, "S"); if (fdata->__recfmASA) strcat(type, "A"); if (fdata->__recfmM) strcat(type, "M"); sprintf(type+strlen(type), ",lrecl=%ld", fdata->__recfmV ? fdata->__maxreclen+4 : fdata->__maxreclen); #ifdef VM_CMS /* For CMS, use blocksize for FB files only */ if (fdata->__recfmBlk) sprintf(type+strlen(type), ",blksize=%ld", fdata->__blksize); #else /* For MVS, always use blocksize */ sprintf(type+strlen(type), ",blksize=%ld", fdata->__blksize); #endif return strlen(type); } /* end function getVMMVSexfield() */ #ifndef SFX /**********************/ /* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */ /**********************/ char *do_wild(__G__ wld) __GDEF ZCONST char *wld; /* only used first time on a given dir */ { static int First = 0; static char filename[256]; if (First == 0) { First = 1; strncpy(filename, wld, sizeof(filename)); filename[sizeof(filename)-1] = '\0'; return filename; } else return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /************************/ /* Function mapattr() */ /************************/ int mapattr(__G) __GDEF { return 0; } /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char newname[FILNAMSIZ], *lbar; #ifdef MVS char *pmember; #endif int name_changed = MPN_OK; if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels in CMS_MVS */ #ifdef MVS /* Remove bad characters for MVS from the filename */ while ((lbar = strpbrk(G.filename, "_+-")) != NULL) { /* Must use memmove() here because data overlaps. */ /* strcpy() gives undefined behavior in this case. */ memmove(lbar, lbar+1, strlen(lbar)); name_changed = MPN_INF_TRUNC; } #endif /* Remove bad characters for MVS/CMS from the filename */ while ((lbar = strpbrk(G.filename, "()")) != NULL) { memmove(lbar, lbar+1, strlen(lbar)); name_changed = MPN_INF_TRUNC; } #ifdef VM_CMS if ((lbar = strrchr(G.filename, '/')) != NULL) { strcpy(newname, lbar+1); Trace((stderr, "File '%s' renamed to '%s'\n", G.filename, newname)); strcpy(G.filename, newname); name_changed = MPN_INF_TRUNC; } #else /* MVS */ if ((pmember = strrchr(G.filename, '/')) == NULL) pmember = G.filename; else pmember++; /* search for extension in file name */ if ((lbar = strrchr(pmember, '.')) != NULL) { *lbar++ = '\0'; strcpy(newname, pmember); strcpy(pmember, lbar); strcat(pmember, "("); strcat(pmember, newname); strcat(pmember, ")"); } /* Remove all 'internal' dots '.', to prevent false consideration as * MVS path delimiters! */ while ((lbar = strrchr(G.filename, '.')) != NULL) { memmove(lbar, lbar+1, strlen(lbar)); name_changed = MPN_INF_TRUNC; } /* Finally, convert path delimiters from internal '/' to external '.' */ while ((lbar = strchr(G.filename, '/')) != NULL) *lbar = '.'; #endif /* ?VM_CMS */ #ifndef MVS if ((lbar = strchr(G.filename, '.')) == NULL) { printf("WARNING: file '%s' has no extension - renamed to '%s.NONAME'\n"\ ,G.filename, G.filename); strcat(G.filename, ".NONAME"); name_changed = MPN_INF_TRUNC; } #endif checkdir(__G__ G.filename, GETPATH); return name_changed; } /* end function mapname() */ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { static int rootlen = 0; /* length of rootpath */ static char *rootpath; /* user's "extract-to" directory */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if neces- sary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. Note that under OS/2 and MS-DOS, if a candidate extract-to directory specification includes a drive letter (leading "x:"), it is treated just as if it had a trailing '/'--that is, one directory level will be created if the path doesn't exist, unless this is otherwise pro- hibited (e.g., freshening). ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { rootlen = 0; } else if ((rootlen = strlen(pathcomp)) > 0) { if ((rootpath = (char *)malloc(rootlen+1)) == NULL) { rootlen = 0; return MPN_NOMEM; } strcpy(rootpath, pathcomp); Trace((stderr, "rootpath now = [%s]\n", rootpath)); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { if (rootlen > 0) { #ifdef VM_CMS /* put the exdir after the filename */ strcat(pathcomp, "."); /* used as minidisk to be save on */ strcat(pathcomp, rootpath); #else /* MVS */ char newfilename[PATH_MAX]; char *start_fname; int quoted = 0; strcpy(newfilename, rootpath); if (newfile\пM UNZIP.BCK  f[UNZIP60.CMSMVS]VMMVS.C;1&qname[0] == '\'') { quoted = strlen(newfilename) - 1; if (newfilename[quoted] == '\'') newfilename[quoted] = '\0'; else quoted = 0; } if (strchr(pathcomp, '(') == NULL) { if ((start_fname = strrchr(pathcomp, '.')) == NULL) { start_fname = pathcomp; } else { *start_fname++ = '\0'; strcat(newfilename, "."); strcat(newfilename, pathcomp); } strcat(newfilename, "("); strcat(newfilename, start_fname); strcat(newfilename, ")"); } else { strcat(newfilename, "."); strcat(newfilename, pathcomp); } if (quoted) strcat(newfilename, "'"); Trace((stdout, "new dataset : %s\n", newfilename)); strcpy(pathcomp, newfilename); #endif /* ?VM_CMS */ } return MPN_OK; } /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (rootlen > 0) { free(rootpath); rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /******************************/ /* Function check_for_newer() */ /* used for overwriting/freshening/updating */ /******************************/ int check_for_newer(__G__ filename) /* return 1 if existing file is newer */ __GDEF /* or equal; 0 if older; -1 if doesn't */ char *filename; /* exist yet */ { FILE *stream; if ((stream = fopen(filename, FOPR)) != NULL) { fclose(stream); /* File exists, assume it is "newer" than archive entry. */ return EXISTS_AND_NEWER; } /* File does not exist. */ return DOES_NOT_EXIST; } /* end function check_for_newer() */ /*********************/ /* Function stat() */ /*********************/ int stat(const char *path, struct stat *buf) { FILE *fp; char fname[PATH_MAX]; time_t ltime; if ((fp = fopen(path, FOPR)) != NULL) { fldata_t fdata; if (fldata( fp, fname, &fdata ) == 0) { buf->st_dev = fdata.__device; buf->st_mode = *(short *)(&fdata); } /* Determine file size by seeking to EOF */ fseek(fp,0L,SEEK_END); buf->st_size = ftell(fp); fclose(fp); /* set time fields in stat buf to current time. */ time(<ime); buf->st_atime = buf->st_mtime = buf->st_ctime = ltime; /* File exists, return success */ return 0; } return 1; } #ifdef STAND_ALONE /***************************/ /* Function main_vmmvs() */ /***************************/ /* This function is called as main() to parse arguments */ /* into argc and argv. This is required for stand-alone */ /* execution. This calls the "real" main() when done. */ int MAIN_VMMVS(void) { int argc=0; char *argv[50]; int iArgLen; char argstr[256]; char **pEPLIST, *pCmdStart, *pArgStart, *pArgEnd; /* Get address of extended parameter list from S/370 Register 0 */ pEPLIST = (char **)__xregs(0); /* Null-terminate the argument string */ pCmdStart = *(pEPLIST+0); pArgStart = *(pEPLIST+1); pArgEnd = *(pEPLIST+2); iArgLen = pArgEnd - pCmdStart + 1; /* Make a copy of the command string */ memcpy(argstr, pCmdStart, iArgLen); argstr[iArgLen] = '\0'; /* Null-terminate */ /* Store first token (cmd) */ argv[argc++] = strtok(argstr, " "); /* Store the rest (args) */ while (argv[argc-1]) argv[argc++] = strtok(NULL, " "); argc--; /* Back off last NULL entry */ /* Call "real" main() function */ return MAIN(argc, argv); } #endif /* STAND_ALONE */ #ifndef SFX /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { int len; char liblvlmsg [50+1]; char *compiler = "?"; char *platform = "?"; char complevel[64]; /* Map the runtime library level information */ union { unsigned int iVRM; struct { unsigned int pd:4; /* Product designation */ unsigned int vv:4; /* Version */ unsigned int rr:8; /* Release */ unsigned int mm:16; /* Modification level */ } xVRM; } VRM; /* Break down the runtime library level */ VRM.iVRM = __librel(); sprintf(liblvlmsg, "Using runtime library level %s V%dR%dM%d", (VRM.xVRM.pd==1 ? "LE" : "CE"), VRM.xVRM.vv, VRM.xVRM.rr, VRM.xVRM.mm); /* Note: LE = Language Environment, CE = Common Env. (C/370). */ /* This refers ONLY to the current runtimes, not the compiler. */ #ifdef VM_CMS platform = "VM/CMS"; #ifdef __IBMC__ compiler = "IBM C"; #else compiler = "C/370"; #endif #endif #ifdef MVS platform = "MVS"; #ifdef __IBMC__ compiler = "IBM C/C++"; #else compiler = "C/370"; #endif #endif #ifdef __COMPILER_VER__ VRM.iVRM = __COMPILER_VER__; sprintf(complevel," V%dR%dM%d", VRM.xVRM.vv, VRM.xVRM.rr, VRM.xVRM.mm); #else #ifdef __IBMC__ sprintf(complevel," V%dR%d", __IBMC__ / 100, (__IBMC__ % 100)/10); #else complevel[0] = '\0'; #endif #endif /* Output is in the form "Compiled with %s%s for %s%s%s%s." */ len = sprintf((char *)slide, LoadFarString(CompiledWith), /* Add compiler name and level */ compiler, complevel, /* Add compile environment */ platform, /* Add timestamp */ #ifdef __DATE__ " on " __DATE__ #ifdef __TIME__ " at " __TIME__ #endif #endif ".\n", "", liblvlmsg ); (*G.message)((zvoid *)&G, slide, (ulg)len, 0); } /* end function version() */ #endif /* !SFX */ *[UNZIP60.CMSMVS]VMMVS.H;1+,./ 4@-f0123KPWO56'7'89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2007-Mar-04 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* vmmvs.h: include file for both VM/CMS and MVS ports of UnZip */ #ifndef __vmmvs_h /* prevent multiple inclusions */ #define __vmmvs_h #ifndef N]8 UNZIP.BCKf[UNZIP60.CMSMVS]VMMVS.H;1vj ULL # define NULL (zvoid *)0 #endif #ifdef MVS # define _POSIX_SOURCE /* tell MVS we want full definitions */ # define NO_STRNICMP /* MVS has no strnicmp() */ # include /* MVS complains if a function has the same name as a csect. */ # if defined(__UNZIP_C) # pragma csect(STATIC,"unzip_s") # elif defined(__CRC32_C) # pragma csect(STATIC,"crc32_s") # elif defined(__ENVARGS_C) # pragma csect(STATIC,"envarg_s") # elif defined(__EXPLODE_C) # pragma csect(STATIC,"explod_s") # elif defined(__INFLATE_C) # pragma csect(STATIC,"inflat_s") # elif defined(__MATCH_C) # pragma csect(STATIC,"match_s") # elif defined(__UNREDUCE_C) # pragma csect(STATIC,"unredu_s") # elif defined(__UNSHRINK_C) # pragma csect(STATIC,"unshri_s") # elif defined(__ZIPINFO_C) # pragma csect(STATIC,"zipinf_s") # endif #endif /* MVS */ #include /* the usual non-BSD time functions */ #ifdef VM_CMS # include "vmstat.h" #endif #ifdef MVS # include #endif #define PASSWD_FROM_STDIN /* Kludge until we know how to open a non-echo tty channel */ #define EBCDIC /* In the context of Info-ZIP, a portable "text" mode file implies the use of an ASCII-compatible (ISO 8859-1, or other extended ASCII) code page. */ #ifdef MORE # undef MORE #endif /* Workarounds for missing RTL functionality */ #define isatty(t) 1 #ifdef UNZIP /* definitions for UNZIP */ #define INBUFSIZ 8192 #define USE_STRM_INPUT #define USE_FWRITE #define PATH_MAX 128 #ifndef QUERY_TRNEWLN # define QUERY_TRNEWLN /* terminate interaction queries with '\n' */ #endif #ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY #endif #define lenEOL 1 /* The use of "ebcdic[LF]" is not reliable; VM/CMS C/370 uses the * EBCDIC specific "NL" ('NewLine') control character (and not the EBCDIC * equivalent of the ASCII "LF" ('LineFeed')) as line terminator! * To work around this problem, we explicitely emit the C compiler's native * '\n' line terminator. */ #if 0 #define PutNativeEOL *q++ = native(LF); #else #define PutNativeEOL *q++ = '\n'; #endif #endif /* UNZIP */ #endif /* !__vmmvs_h */ *[UNZIP60.CMSMVS]VMSTAT.H;1+,./ 4@-f0123KPWO56; 7; 89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifndef __vmstat_h #define __vmstat_h /* stat.h definitions */ #ifndef _INO_T_DEFINED typedef unsigned short ino_t; /* i-node number (not used on DOS) */ #define _INO_T_DEFINED #endif #ifndef _DEV_T_DEFINED typedef short dev_t; /* device code */ #define _DEV_T_DEFINED #endif #ifndef _OFF_T_DEFINED typedef long off_t; /* file offset value */ #define _OFF_T_DEFINED #endif #ifndef _STAT_DEFINED struct stat { dev_t st_dev; ino_t st_ino; short st_mode; short st_nlink; int st_uid; int st_gid; off_t st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; }; #define _STAT_DEFINED #endif int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); #define S_IFMT 0xFFFF #define _FLDATA(m) (*(fldata_t *) &m) #define S_ISDIR(m) (_FLDATA(m).__dsorgPDSdir) #define S_ISREG(m) (_FLDATA(m).__dsorgPO | \ _FLDATA(m).__dsorgPDSmem | \ _FLDATA(m).__dsorgPS) #define S_ISBLK(m) (_FLDATA(m).__recfmBlk) #define S_ISMEM(m) (_FLDATA(m).__dsorgMem) #endif /* __vmstat_h */ *[UNZIP60.CMSMVS]WHATSNEW.CMS;1+,./ 4N@-f0123KPWO56+}U7+}U89GHJImportant Changes made for ZIP 2.3b and UNZIP 5.33c executables: 1. WARNING: These executables have been compiled for the Language Environment (LE). You must now have access to the file SCEERUN LOADLIB in order to run ZIP and UNZIP on CMS. You no longer need access to EDCLINK LOADLIB. The provided ZIP and UNZIP EXECs have been changed to issue a new GLOBAL LOADLIB command. You may need to modify these EXECs for your installation. You may want to change any GLOBAL LOADLIB command you may have in your PROFILE EXEC. Versions could be made available for the older EDCLINK LOADLIB runtimes upon request. 2. ZIP files will now be variable length files rather than fixed length files. 3. Help information for ZIP and UNZIP has been changed to show "fm" rather than "path" on CMS with certain options. 4. README CMS has been entirely rewritten. It now contains all information for ZIP and UNZIP. ----------------------------------------------------------------------- Greg Hartwig, April 1998. e-mail: ghartwig@ix.netcom.com ghartwig@vnet.ibm.com *[UNZIP60.CMSMVS]ZIPINFO.EXEC;1+,&D./ 4@-f0123KPWO56,}U7,}U89GHJ/***********************************************************************/ /* */ /* Front-end EXEC to set up linkage to the C runtime libraries */ /* before executing a MODULE generated from C code. */ /* */ /* Copy this file as an EXEC with a filename matching the C MODULE. */ /* */ /* Greg Hartwig (ghartwig@vnet.ibm.com) 7/31/97, 4/24/98. */ /* */ /***********************************************************************/ Address Command Parse Arg argstring Parse Source . . myname . /* Set output and input character translation so brackets show up */ 'SET OUTPUT AD' 'BA'x 'SET OUTPUT BD' 'BB'x 'SET INPUT BA AD' 'SET INPUT BB BD' Call CLIB If rc<>0 Then Do Say 'The required C runtime librari^^~ UNZIP.BCK&Df[UNZIP60.CMSMVS]ZIPINFO.EXEC;1]7es don''t appear to be available.' Say myname 'can not run.' Exit 12 End /* Run the command */ myname argstring Exit rc /* Contents of the CLIB EXEC, modified for RC checking. */ /* Removed TXTLIB setting. Only LOADLIB needed for execution. */ CLIB: /***************************************************/ /* SET UP LIBRARIES FOR LE for MVS & VM */ /***************************************************/ Address COMMAND loadlib ='EDCLINK' /* C/370 runtime */ loadlib ='SCEERUN' /* LE runtime */ theirs=queued() /* old stack contentsM068*/ 'QUERY LOADLIB ( LIFO' /* old setting M068*/ LoadlibList='' /* init list M068*/ rc=0 Do while queued()^=theirs /* all lines from cmdM068*/ Parse upper pull 'LOADLIB' '=' Ltemp /* get one line M068*/ LoadlibList= Ltemp Loadliblist /* was stacked LIFO M068*/ End /*M068*/ If loadlibList='NONE' , Then Do 'GLOBAL LOADLIB' Loadlib /* enforce what we need */ End Else Do Do xx=1 to Words(loadlib) If Find(loadliblist,word(loadlib,xx)) = 0 , then loadliblist = loadliblist word(loadlib,xx) End 'GLOBAL LOADLIB' loadliblist /* enforce what we need */ End Return *[UNZIP60]CONSTS.H;1+,` B./ 4@->0123KPWO56 7 89GHJ/* Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- consts.h This file contains global, initialized variables that never change. It is included by unzip.c and windll/windll.c. ---------------------------------------------------------------------------*/ /* And'ing with mask_bits[n] masks the lower n bits */ ZCONST unsigned near mask_bits[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff }; ZCONST char Far VersionDate[] = UZ_VERSION_DATE; /* now defined in unzvers.h */ #ifndef SFX ZCONST char Far EndSigMsg[] = "\nnote: didn't find end-of-central-dir signature at end of central dir.\n"; #endif ZCONST char Far CentSigMsg[] = "error: expected central file header signature not found (file #%lu).\n"; ZCONST char Far SeekMsg[] = "error [%s]: attempt to seek before beginning of zipfile\n%s"; ZCONST char Far FilenameNotMatched[] = "caution: filename not matched: %s\n"; ZCONST char Far ExclFilenameNotMatched[] = "caution: excluded filename not matched: %s\n"; #ifdef VMS ZCONST char Far ReportMsg[] = "\ (please check that you have transferred or created the zipfile in the\n\ appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles)\n"; #else ZCONST char Far ReportMsg[] = "\ (please check that you have transferred or created the zipfile in the\n\ appropriate BINARY mode and that you have compiled UnZip properly)\n"; #endif #ifndef SFX ZCONST char Far Zipnfo[] = "zipinfo"; ZCONST char Far CompiledWith[] = "Compiled with %s%s for %s%s%s%s.\n\n"; #endif *[UNZIP60]CONTENTS.;1+,W. / 4 @->0123KPWO 56~YW7~YW89GHJContents of the UnZip 6.00 source archive. The OS-specific subdirectories at the end contain their own Contents listings: Contents this file README what UnZip is; general information LICENSE Info-ZIP license; terms for using and distributing UnZip COPYING.OLD historic copyrights and distribution policy (obsolete) INSTALL how to compile and install UnZip and related utilities WHERE where Zip/UnZip and encryption/decryption support can be found History.600 new features and fixes of the last major release ToDo rough priority list of new features to be added in next release BUGS known bugs, problems, and (possible) other features to be added unzip.txt UnZip manual page, human-readable format unzipsfx.txt UnZipSFX manual page, human-readable format zipinfo.txt ZipInfo manual page, human-readable format zipgrep.txt ZipGrep manual page, human-readable format funzip.txt fUnZip manual page, human-readable format file_id.diz BBS-oriented file describing this archive testmake.zip test archive for checking whether newly compiled UnZip works api.c generic DLL entry points, support functions (required for DLLs) apihelp.c API help text for DLL versions (currently OS/2 only) consts.h global, initialized variables that never change (required) crc32.c code for calculation 32bit CRC of a string buffer (required*) crc32.h declarations for the crc-32 code (required*) crc_i386.S fast assembler replacement for crc32() (Intel 386 and newer) crypt.c de-/encryption routines (required*) crypt.h de-/encryption header file (required*) ebcdic.h static lookup table for ASCII <-> EBCDIC translation (required) envargs.c code to read options from environment variables (required) explode.c code for exploding (required) extract.c high-level extraction and decryption code (required) fileio.c file manipulation and password code (required) funzip.c filter unzip: extracts in a pipe from stdin to stdout gbloffs.c helper program to retrieve offsets of globals struct members globals.c code to support global variables with reentrancy (required) globals.h definition of global structure G (required) inflate.c code for inflating (required*) inflate.h header file for inflating (required*) list.c UnZip listing routines, non-ZipInfo mode (required) match.c pattern-matching code for filename wildcards (required) process.c zipfile headers code (required) timezone.c timezone and timestamp functions (required) timezone.h header file for interface to "internal" tz functions (required) ttyio.c code for handling nonecho tty input: password, pager (required) ttyio.h header file for nonecho tty input: password, pager (required) ubz2err.c callback handler for fatal bzip2 errors (bzip2 support only) unreduce.c code for unreducing (required) unshrink.c code for unshrinking (required) unzip.c UnZip main(), usage and options code (required) unzip.h public half of main UnZip header file (required*) unzipstb.c minimal UnZip "stub" file demonstrating use of DLL versions unzpriv.h private (internal) half of main UnZip header file (required*) unzvers.h header with UnZip/UnZipSFX and ZipInfo version info (required) zip.h dummy header for use with crypt.c (required*) zipinfo.c UnZip listing routines, ZipInfo mode (required) acorn/ support _=$ UNZIP.BCKW>[UNZIP60]CONTENTS.;1 files for compiling under Acorn RISC OS amiga/ support files for compiling under AmigaDOS aosvs/ support files for compiling under Data General AOS/VS atari/ support files for compiling under Atari TOS atheos/ support files for compiling under AtheOS/Syllable beos/ support files for compiling under BeOS cmsmvs/ support files for compiling under VM/CMS and MVS flexos/ support files for compiling under FlexOS human68k/ support files for compiling under X68000/Human68K macos/ support files for compiling under Macintosh OS msdos/ support files for compiling under MS-DOS netware/ support files for compiling for Novell Netware NLM os2/ support files for compiling under OS/2 (includes DLL stuff) qdos/ support files for compiling under SMS/QDOS tandem/ support files for compiling under Tandem NSK theos/ support files for compiling under Theos tops20/ support files for compiling under TOPS-20 unix/ support files for compiling under Unix vms/ support files for compiling under VMS win32/ support files for compiling under Windows 9x and Windows NT wince/ support files for compiling under Windows CE (GUI version) windll/ support files for compiling Windows 3.x/9x/NT DLLs bzip2/ subfolder for source of externally supplied bzip2 extension man/ nroff man-page sources for the main user documentation proginfo/ programming docs, additional technical info, contributor list Files marked "required*" are also needed to compile fUnZip. The normal UnZip makefile targets now make both UnZipSFX and fUnZip, except in a few cases; ZipInfo is now incorporated into UnZip (see zipinfo.txt for usage). *[UNZIP60]COPYING.OLD;1+, :./ 4@->0123KPWO56lӞ7lӞ89GHJ__________________________________________________________________________ This is the Info-ZIP file COPYING (for UnZip), last updated 17 Jul 2000. __________________________________________________________________________ FIRST NOTE: This file contains some details about the copyright history of contributions to the UnZip project. Additionally, it summarises some exceptions to the general BSD-like copyright found in LICENSE that covers our generic code and most of the system specific ports. Please read LICENSE first to find out what is allowed to do with Info-ZIP's UnZip code. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - There are currently two explicit copyrights on portions of UnZip code (at least, of which Info-ZIP is aware): Jim Luther's Mac OS File Manager interface code; and Christopher Evans' MacBinaryIII coding code (for the MacOS port).. These copyrights are discussed in more detail below. All remaining code is now (starting with UnZip version 5.41) covered by the new Info-ZIP license. For details, please read the acompaning file LICENSE. The terms and conditions in this license supersede the copyright conditions of the contributions by Igor Mandrichenko (vms/vms.c), Greg Roelofs (zipinfo.c, new version of unshrink.c), Mike White (Windows DLL code in "windll/*"), Steve P. Miller (Pocket UnZip GUI "wince/*"), and Mark Adler (inflate/explode decompresseion core routines, previously put into the public domain). All these Info-ZIP contributors (or "primary" authors) have permitted us to replace their copyright notes by the Info-ZIP License. Frequently Asked Questions regarding (re)distribution of Zip and UnZip are near the end of this file. There are no known patents on any of the code in UnZip. Unisys claims a patent on LZW encoding and on LZW decoding _in an apparatus that performs LZW encoding_, but the patent appears to exempt a stand- alone decoder (as in UnZip's unshrink.c). Unisys has publicly claimed otherwise, but the issue has never been tested in court. Since this point is unclear, unshrinking is not enabled by default. It is the responsibility of the user to make his or her peace with Unisys and its licensing requirements. (unshrink.c may be removed from future releases altogether.) __________________________________________________________________________ The original unzip source code has been extensively modified and almost entirely rewritten (changes include random zipfile access rather than sequential; replacement of unimplode() with explode(); replacement of old unshrink() with new (unrelated) unshrink(); re- placement of output routines; addition of inflate(), wildcards, filename-mapping, text translation, ...; etc.). As far as we can tell, only the core code of the unreduce method remained substantially similar to Mr. Smith's original source. As of UnZip 5.42, the complete core code is now covered by the Info-ZIP Licence. Therefore, support for the reduce method has been removed. The drop of the reduce method should only affect some test archives, reducing was never used in any publically distributed Zip program. For pathologic cases where support for reduced archive entries is needed, the unreduce code copyrighted by Samuel H. Smith is available as a separate distribution (the restricted copyright of this code is cited below in the "historical" section). The following copyright applies to the Mac OS File Manager interface code (macos/source/macstuff.[ch]), distributed with UnZip 5.4 and later: * MoreFiles * * A collection of File Manager and related routines * * by Jim Luther (Apple Macintosh Developer Technical Support Emeritus) * with significant code contributions by Nitin Ganatra * (Apple Macintosh Developer Technical Support Emeritus) * Copyright 1992-1998 Apple Computer, Inc. * Portions copyright 1995 Jim Luther * All rights reserved. * The Package "More Files" is distributed under the following * license terms: * * "You may incorporate this sample code into your * applications without restriction, though the * sample code has been provided "AS IS" and the * responsibility for its operation is 100% yours. * However, what you are not permitted to do is to * redistribute the source as "DSC Sample Code" after * having made changes. If you're going to * redistribute the source, we require that you make * it clear in the source that the code was descended * from Apple Sample Code, but that you've made * changes." The usage terms of this copyright note are compatible with the Info-ZIP license, they do not add further restrictions. The following copyright applies to the Mac OS "macbin3" decoding code (extra field compatibility with ZipIt): * MacBina`T UNZIP.BCK :>[UNZIP60]COPYING.OLD;1tb ryIII.h * * Copyright 1997 Christopher Evans (cevans@poppybank.com) * * Basic encoding and decoding of Macintosh files to the * MacBinary III spec. * ---------------------------------------------------------------------- * This source is copyrighted by Christopher Evans (cevans@poppybank.com) * (available at ftp://ftp.lazerware.com/MacBinaryIII_src_C.sit * homepage of Leonard Rosenthol leonardr@netcom.com) This copyright note does not contain any usage terms. So, we assume that this code is freely reusable until we are proved wrong... -------------------------------------------------------------------------- The remaining copyright notes have been superseeded by the new Info-ZIP license, with explicit permission from the respective original authors. They are cited here for historical reasons, only: The following copyright applies to the full-featured unreduce.c (now distributed separately): * Copyright 1989 Samuel H. Smith; All rights reserved * * Do not distribute modified versions without my permission. * Do not remove or alter this notice or any other copyright notice. * If you use this in your own program you must distribute source code. * Do not use any of this in a commercial product. Regarding the first stipulation, Mr. Smith was tracked down in southern California some years back [Samuel H. Smith, The Tool Shop; as of mid- May 1994, (213) 851-9969 (voice), (213) 887-2127(?) (subscription BBS), 71150.2731@compuserve.com]: "He says that he thought that whoever contacted him understood that he has no objection to the Info-ZIP group's inclusion of his code. His primary concern is that it remain freely distributable, he said." Despite the fact that our "normal" code has been entirely rewritten and by default no longer contains any of Mr. Smith's code, Info-ZIP remains indebted and grateful to him. We hope he finds our contribu- tions as useful as we have his. Note that the third and fourth stipulations still apply to any com- pany that wishes to incorporate the unreduce code into its products; if you wish to do so, you must contact Mr. Smith directly regarding licensing. ----- The following copyright applied to most of the VMS code in vms.c, distributed with UnZip version 4.2 and later: * Copyright (c) 1992-93 Igor Mandrichenko. * Permission is granted to any individual or institution to use, copy, * or redistribute this software so long as all of the original files * are included unmodified and that this copyright notice is retained. ----- The following copyright applied to the new version of unshrink.c, distributed with UnZip version 5.2 and later: * Copyright (c) 1994 Greg Roelofs. * Permission is granted to any individual/institution/corporate * entity to use, copy, redistribute or modify this software for * any purpose whatsoever, subject to the conditions noted in the * Frequently Asked Questions section below, plus one additional * condition: namely, that my name not be removed from the source * code. (Other names may, of course, be added as modifications * are made.) Corporate legal staff (like at IBM :-) ) who have * problems understanding this can contact me through Zip-Bugs... ----- The following copyright applied to the Windows DLL code (windll/*), distributed with UnZip version 5.2 and later: * Copyright (c) 1996 Mike White. * Permission is granted to any individual or institution to use, * copy, or redistribute this software so long as all of the original * files are included, that it is not sold for profit, and that this * copyright notice is retained. ----- The following copyright applied to the Windows CE GUI port, ``Pocket UnZip,'' distributed with UnZip version 5.3 and later: * All the source files for Pocket UnZip, except for components * written by the Info-ZIP group, are copyrighted 1997 by Steve P. * Miller. The product "Pocket UnZip" itself is property of the * author and cannot be altered in any way without written consent * from Steve P. Miller. ----- The remaining code was written by many people associated with the Info-ZIP group, with large contributions from (but not limited to): Greg Roelofs (overall program logic, ZipInfo, unshrink, filename mapping/portability, etc.), Mark Adler (inflate, explode, funzip), Kai Uwe Rommel (OS/2), John Bush and Paul Kienitz (Amiga), Antoine Verheijen (Macintosh), Hunter Goatley (more VMS), Mike White (Windows DLLs), Christian Spieler (overall logic, optimization, VMS, etc.) and others. See the file CONTRIBS in the source distribution for a much more complete list of contributors. The decompression core code for the deflate method (inflate.[ch], explode.c) was originally written by Mark Adler who submitted it as public domain code. -------------------------------------------------------------------------- *[UNZIP60]CRC32.C;1+,r .L/ 4LL@->0123KPWOM56&w!7&w!89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2005-Feb-10 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing * tables for updating the shift register in one step with three exclusive-ors * instead of four steps with four exclusive-ors. This results about a factor * of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ /* $Id: crc32.c,v 2.0 2007/01/07 05:20:36 spc Exp $ */ #define __CRC32_C /* identifies this source module */ #include "zip.h" #if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB)) #ifndef ZCONST # define ZCONST const #endif #include "crc32.h" /* When only the table of precomputed CRC values is needed, only the basic system-independent table containing 256 entries is created; any support for "unfolding" optimization is disabled. */ #if (defined(USE_ZLIB) || defined(CRC_TABLE_ONLY)) # ifdef IZ_CRCOPTIM_UNFOLDTBL # undef IZ_CRCOPTIM_UNFOLDTBL # endif #endif /* (USE_ZLIB || CRC_TABLE_ONLY) */ #if defined(IZ_CRCOa*_> UNZIP.BCKr >[UNZIP60]CRC32.C;1LPTIM_UNFOLDTBL) # define CRC_TBLS 4 #else # define CRC_TBLS 1 #endif /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The first (or only) table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRC's on data a byte-at-a-time for all combinations of CRC register values and incoming bytes. The remaining 3 tables (if IZ_CRCOPTIM_UNFOLDTBL is enabled) allow for word-at-a-time CRC calculation, where a word is four bytes. */ #ifdef DYNAMIC_CRC_TABLE /* ========================================================================= * Make the crc table. This function is needed only if you want to compute * the table dynamically. */ local void make_crc_table OF((void)); #if (defined(DYNALLOC_CRCTAB) && defined(REENTRANT)) error: Dynamic allocation of CRC table not safe with reentrant code. #endif /* DYNALLOC_CRCTAB && REENTRANT */ #ifdef DYNALLOC_CRCTAB local ulg near *crc_table = NULL; # if 0 /* not used, since sizeof("near *") <= sizeof(int) */ /* Use this section when access to a "local int" is faster than access to a "local pointer" (e.g.: i86 16bit code with far pointers). */ local int crc_table_empty = 1; # define CRC_TABLE_IS_EMPTY (crc_table_empty != 0) # define MARK_CRCTAB_FILLED crc_table_empty = 0 # define MARK_CRCTAB_EMPTY crc_table_empty = 1 # else /* Use this section on systems where the size of pointers and ints is equal (e.g.: all 32bit systems). */ # define CRC_TABLE_IS_EMPTY (crc_table == NULL) # define MARK_CRCTAB_FILLED crc_table = crctab_p # define MARK_CRCTAB_EMPTY crc_table = NULL # endif #else /* !DYNALLOC_CRCTAB */ local ulg near crc_table[CRC_TBLS*256]; local int crc_table_empty = 1; # define CRC_TABLE_IS_EMPTY (crc_table_empty != 0) # define MARK_CRCTAB_FILLED crc_table_empty = 0 #endif /* ?DYNALLOC_CRCTAB */ local void make_crc_table() { ulg c; /* crc shift register */ int n; /* counter for all possible eight bit values */ int k; /* byte being shifted into crc apparatus */ #ifdef DYNALLOC_CRCTAB ulg near *crctab_p; /* temporary pointer to allocated crc_table area */ #else /* !DYNALLOC_CRCTAB */ # define crctab_p crc_table #endif /* DYNALLOC_CRCTAB */ #ifdef COMPUTE_XOR_PATTERN /* This piece of code has been left here to explain how the XOR pattern * used in the creation of the crc_table values can be recomputed. * For production versions of this function, it is more efficient to * supply the resultant pattern at compile time. */ ulg xor; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static ZCONST uch p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; /* make exclusive-or pattern from polynomial (0xedb88320L) */ xor = 0L; for (n = 0; n < sizeof(p)/sizeof(uch); n++) xor |= 1L << (31 - p[n]); #else # define xor 0xedb88320L #endif #ifdef DYNALLOC_CRCTAB crctab_p = (ulg near *) nearmalloc (CRC_TBLS*256*sizeof(ulg)); if (crctab_p == NULL) { ziperr(ZE_MEM, "crc_table allocation"); } #endif /* DYNALLOC_CRCTAB */ /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { c = (ulg)n; for (k = 8; k; k--) c = c & 1 ? xor ^ (c >> 1) : c >> 1; crctab_p[n] = REV_BE(c); } #ifdef IZ_CRCOPTIM_UNFOLDTBL /* generate crc for each value followed by one, two, and three zeros */ for (n = 0; n < 256; n++) { c = crctab_p[n]; for (k = 1; k < 4; k++) { c = CRC32(c, 0, crctab_p); crctab_p[k*256+n] = c; } } #endif /* IZ_CRCOPTIM_UNFOLDTBL */ MARK_CRCTAB_FILLED; } #else /* !DYNAMIC_CRC_TABLE */ #ifdef DYNALLOC_CRCTAB error: Inconsistent flags, DYNALLOC_CRCTAB without DYNAMIC_CRC_TABLE. #endif /* ======================================================================== * Table of CRC-32's of all single-byte values (made by make_crc_table) */ local ZCONST ulg near crc_table[CRC_TBLS*256] = { # ifdef IZ_CRC_BE_OPTIMIZ 0x00000000L, 0x96300777L, 0x2c610eeeL, 0xba510999L, 0x19c46d07L, 0x8ff46a70L, 0x35a563e9L, 0xa395649eL, 0x3288db0eL, 0xa4b8dc79L, 0x1ee9d5e0L, 0x88d9d297L, 0x2b4cb609L, 0xbd7cb17eL, 0x072db8e7L, 0x911dbf90L, 0x6410b71dL, 0xf220b06aL, 0x4871b9f3L, 0xde41be84L, 0x7dd4da1aL, 0xebe4dd6dL, 0x51b5d4f4L, 0xc785d383L, 0x56986c13L, 0xc0a86b64L, 0x7af962fdL, 0xecc9658aL, 0x4f5c0114L, 0xd96c0663L, 0x633d0ffaL, 0xf50d088dL, 0xc8206e3bL, 0x5e10694cL, 0xe44160d5L, 0x727167a2L, 0xd1e4033cL, 0x47d4044bL, 0xfd850dd2L, 0x6bb50aa5L, 0xfaa8b535L, 0x6c98b242L, 0xd6c9bbdbL, 0x40f9bcacL, 0xe36cd832L, 0x755cdf45L, 0xcf0dd6dcL, 0x593dd1abL, 0xac30d926L, 0x3a00de51L, 0x8051d7c8L, 0x1661d0bfL, 0xb5f4b421L, 0x23c4b356L, 0x9995bacfL, 0x0fa5bdb8L, 0x9eb80228L, 0x0888055fL, 0xb2d90cc6L, 0x24e90bb1L, 0x877c6f2fL, 0x114c6858L, 0xab1d61c1L, 0x3d2d66b6L, 0x9041dc76L, 0x0671db01L, 0xbc20d298L, 0x2a10d5efL, 0x8985b171L, 0x1fb5b606L, 0xa5e4bf9fL, 0x33d4b8e8L, 0xa2c90778L, 0x34f9000fL, 0x8ea80996L, 0x18980ee1L, 0xbb0d6a7fL, 0x2d3d6d08L, 0x976c6491L, 0x015c63e6L, 0xf4516b6bL, 0x62616c1cL, 0xd8306585L, 0x4e0062f2L, 0xed95066cL, 0x7ba5011bL, 0xc1f40882L, 0x57c40ff5L, 0xc6d9b065L, 0x50e9b712L, 0xeab8be8bL, 0x7c88b9fcL, 0xdf1ddd62L, 0x492dda15L, 0xf37cd38cL, 0x654cd4fbL, 0x5861b24dL, 0xce51b53aL, 0x7400bca3L, 0xe230bbd4L, 0x41a5df4aL, 0xd795d83dL, 0x6dc4d1a4L, 0xfbf4d6d3L, 0x6ae96943L, 0xfcd96e34L, 0x468867adL, 0xd0b860daL, 0x732d0444L, 0xe51d0333L, 0x5f4c0aaaL, 0xc97c0dddL, 0x3c710550L, 0xaa410227L, 0x10100bbeL, 0x86200cc9L, 0x25b56857L, 0xb3856f20L, 0x09d466b9L, 0x9fe461ceL, 0x0ef9de5eL, 0x98c9d929L, 0x2298d0b0L, 0xb4a8d7c7L, 0x173db359L, 0x810db42eL, 0x3b5cbdb7L, 0xad6cbac0L, 0x2083b8edL, 0xb6b3bf9aL, 0x0ce2b603L, 0x9ad2b174L, 0x3947d5eaL, 0xaf77d29dL, 0x1526db04L, 0x8316dc73L, 0x120b63e3L, 0x843b6494L, 0x3e6a6d0dL, 0xa85a6a7aL, 0x0bcf0ee4L, 0x9dff0993L, 0x27ae000aL, 0xb19e077dL, 0x44930ff0L, 0xd2a30887L, 0x68f2011eL, 0xfec20669L, 0x5d5762f7L, 0xcb676580L, 0x71366c19L, 0xe7066b6eL, 0x761bd4feL, 0xe02bd389L, 0x5a7ada10L, 0xcc4add67L, 0x6fdfb9f9L, 0xf9efbe8eL, 0x43beb717L, 0xd58eb060L, 0xe8a3d6d6L, 0x7e93d1a1L, 0xc4c2d838L, 0x52f2df4fL, 0xf167bbd1L, 0x6757bca6L, 0xdd06b53fL, 0x4b36b248L, 0xda2b0dd8L, 0x4c1b0aafL, 0xf64a0336L, 0x607a0441L, 0xc3ef60dfL, 0x55df67a8L, 0xef8e6e31L, 0x79be6946L, 0x8cb361cbL, 0x1a8366bcL, 0xa0d26f25L, 0x36e26852L, 0x957b! UNZIP.BCKr >[UNZIP60]CRC32.C;1Lp70cccL, 0x03470bbbL, 0xb9160222L, 0x2f260555L, 0xbe3bbac5L, 0x280bbdb2L, 0x925ab42bL, 0x046ab35cL, 0xa7ffd7c2L, 0x31cfd0b5L, 0x8b9ed92cL, 0x1daede5bL, 0xb0c2649bL, 0x26f263ecL, 0x9ca36a75L, 0x0a936d02L, 0xa906099cL, 0x3f360eebL, 0x85670772L, 0x13570005L, 0x824abf95L, 0x147ab8e2L, 0xae2bb17bL, 0x381bb60cL, 0x9b8ed292L, 0x0dbed5e5L, 0xb7efdc7cL, 0x21dfdb0bL, 0xd4d2d386L, 0x42e2d4f1L, 0xf8b3dd68L, 0x6e83da1fL, 0xcd16be81L, 0x5b26b9f6L, 0xe177b06fL, 0x7747b718L, 0xe65a0888L, 0x706a0fffL, 0xca3b0666L, 0x5c0b0111L, 0xff9e658fL, 0x69ae62f8L, 0xd3ff6b61L, 0x45cf6c16L, 0x78e20aa0L, 0xeed20dd7L, 0x5483044eL, 0xc2b30339L, 0x612667a7L, 0xf71660d0L, 0x4d476949L, 0xdb776e3eL, 0x4a6ad1aeL, 0xdc5ad6d9L, 0x660bdf40L, 0xf03bd837L, 0x53aebca9L, 0xc59ebbdeL, 0x7fcfb247L, 0xe9ffb530L, 0x1cf2bdbdL, 0x8ac2bacaL, 0x3093b353L, 0xa6a3b424L, 0x0536d0baL, 0x9306d7cdL, 0x2957de54L, 0xbf67d923L, 0x2e7a66b3L, 0xb84a61c4L, 0x021b685dL, 0x942b6f2aL, 0x37be0bb4L, 0xa18e0cc3L, 0x1bdf055aL, 0x8def022dL # ifdef IZ_CRCOPTIM_UNFOLDTBL , 0x00000000L, 0x41311b19L, 0x82623632L, 0xc3532d2bL, 0x04c56c64L, 0x45f4777dL, 0x86a75a56L, 0xc796414fL, 0x088ad9c8L, 0x49bbc2d1L, 0x8ae8effaL, 0xcbd9f4e3L, 0x0c4fb5acL, 0x4d7eaeb5L, 0x8e2d839eL, 0xcf1c9887L, 0x5112c24aL, 0x1023d953L, 0xd370f478L, 0x9241ef61L, 0x55d7ae2eL, 0x14e6b537L, 0xd7b5981cL, 0x96848305L, 0x59981b82L, 0x18a9009bL, 0xdbfa2db0L, 0x9acb36a9L, 0x5d5d77e6L, 0x1c6c6cffL, 0xdf3f41d4L, 0x9e0e5acdL, 0xa2248495L, 0xe3159f8cL, 0x2046b2a7L, 0x6177a9beL, 0xa6e1e8f1L, 0xe7d0f3e8L, 0x2483dec3L, 0x65b2c5daL, 0xaaae5d5dL, 0xeb9f4644L, 0x28cc6b6fL, 0x69fd7076L, 0xae6b3139L, 0xef5a2a20L, 0x2c09070bL, 0x6d381c12L, 0xf33646dfL, 0xb2075dc6L, 0x715470edL, 0x30656bf4L, 0xf7f32abbL, 0xb6c231a2L, 0x75911c89L, 0x34a00790L, 0xfbbc9f17L, 0xba8d840eL, 0x79dea925L, 0x38efb23cL, 0xff79f373L, 0xbe48e86aL, 0x7d1bc541L, 0x3c2ade58L, 0x054f79f0L, 0x447e62e9L, 0x872d4fc2L, 0xc61c54dbL, 0x018a1594L, 0x40bb0e8dL, 0x83e823a6L, 0xc2d938bfL, 0x0dc5a038L, 0x4cf4bb21L, 0x8fa7960aL, 0xce968d13L, 0x0900cc5cL, 0x4831d745L, 0x8b62fa6eL, 0xca53e177L, 0x545dbbbaL, 0x156ca0a3L, 0xd63f8d88L, 0x970e9691L, 0x5098d7deL, 0x11a9ccc7L, 0xd2fae1ecL, 0x93cbfaf5L, 0x5cd76272L, 0x1de6796bL, 0xdeb55440L, 0x9f844f59L, 0x58120e16L, 0x1923150fL, 0xda703824L, 0x9b41233dL, 0xa76bfd65L, 0xe65ae67cL, 0x2509cb57L, 0x6438d04eL, 0xa3ae9101L, 0xe29f8a18L, 0x21cca733L, 0x60fdbc2aL, 0xafe124adL, 0xeed03fb4L, 0x2d83129fL, 0x6cb20986L, 0xab2448c9L, 0xea1553d0L, 0x29467efbL, 0x687765e2L, 0xf6793f2fL, 0xb7482436L, 0x741b091dL, 0x352a1204L, 0xf2bc534bL, 0xb38d4852L, 0x70de6579L, 0x31ef7e60L, 0xfef3e6e7L, 0xbfc2fdfeL, 0x7c91d0d5L, 0x3da0cbccL, 0xfa368a83L, 0xbb07919aL, 0x7854bcb1L, 0x3965a7a8L, 0x4b98833bL, 0x0aa99822L, 0xc9fab509L, 0x88cbae10L, 0x4f5def5fL, 0x0e6cf446L, 0xcd3fd96dL, 0x8c0ec274L, 0x43125af3L, 0x022341eaL, 0xc1706cc1L, 0x804177d8L, 0x47d73697L, 0x06e62d8eL, 0xc5b500a5L, 0x84841bbcL, 0x1a8a4171L, 0x5bbb5a68L, 0x98e87743L, 0xd9d96c5aL, 0x1e4f2d15L, 0x5f7e360cL, 0x9c2d1b27L, 0xdd1c003eL, 0x120098b9L, 0x533183a0L, 0x9062ae8bL, 0xd153b592L, 0x16c5f4ddL, 0x57f4efc4L, 0x94a7c2efL, 0xd596d9f6L, 0xe9bc07aeL, 0xa88d1cb7L, 0x6bde319cL, 0x2aef2a85L, 0xed796bcaL, 0xac4870d3L, 0x6f1b5df8L, 0x2e2a46e1L, 0xe136de66L, 0xa007c57fL, 0x6354e854L, 0x2265f34dL, 0xe5f3b202L, 0xa4c2a91bL, 0x67918430L, 0x26a09f29L, 0xb8aec5e4L, 0xf99fdefdL, 0x3accf3d6L, 0x7bfde8cfL, 0xbc6ba980L, 0xfd5ab299L, 0x3e099fb2L, 0x7f3884abL, 0xb0241c2cL, 0xf1150735L, 0x32462a1eL, 0x73773107L, 0xb4e17048L, 0xf5d06b51L, 0x3683467aL, 0x77b25d63L, 0x4ed7facbL, 0x0fe6e1d2L, 0xccb5ccf9L, 0x8d84d7e0L, 0x4a1296afL, 0x0b238db6L, 0xc870a09dL, 0x8941bb84L, 0x465d2303L, 0x076c381aL, 0xc43f1531L, 0x850e0e28L, 0x42984f67L, 0x03a9547eL, 0xc0fa7955L, 0x81cb624cL, 0x1fc53881L, 0x5ef42398L, 0x9da70eb3L, 0xdc9615aaL, 0x1b0054e5L, 0x5a314ffcL, 0x996262d7L, 0xd85379ceL, 0x174fe149L, 0x567efa50L, 0x952dd77bL, 0xd41ccc62L, 0x138a8d2dL, 0x52bb9634L, 0x91e8bb1fL, 0xd0d9a006L, 0xecf37e5eL, 0xadc26547L, 0x6e91486cL, 0x2fa05375L, 0xe836123aL, 0xa9070923L, 0x6a542408L, 0x2b653f11L, 0xe479a796L, 0xa548bc8fL, 0x661b91a4L, 0x272a8abdL, 0xe0bccbf2L, 0xa18dd0ebL, 0x62defdc0L, 0x23efe6d9L, 0xbde1bc14L, 0xfcd0a70dL, 0x3f838a26L, 0x7eb2913fL, 0xb924d070L, 0xf815cb69L, 0x3b46e642L, 0x7a77fd5bL, 0xb56b65dcL, 0xf45a7ec5L, 0x370953eeL, 0x763848f7L, 0xb1ae09b8L, 0xf09f12a1L, 0x33cc3f8aL, 0x72fd2493L , 0x00000000L, 0x376ac201L, 0x6ed48403L, 0x59be4602L, 0xdca80907L, 0xebc2cb06L, 0xb27c8d04L, 0x85164f05L, 0xb851130eL, 0x8f3bd10fL, 0xd685970dL, 0xe1ef550cL, 0x64f91a09L, 0x5393d808L, 0x0a2d9e0aL, 0x3d475c0bL, 0x70a3261cL, 0x47c9e41dL, 0x1e77a21fL, 0x291d601eL, 0xac0b2f1bL, 0x9b61ed1aL, 0xc2dfab18L, 0xf5b56919L, 0xc8f23512L, 0xff98f713L, 0xa626b111L, 0x914c7310L, 0x145a3c15L, 0x2330fe14L, 0x7a8eb816L, 0x4de47a17L, 0xe0464d38L, 0xd72c8f39L, 0x8e92c93bL, 0xb9f80b3aL, 0x3cee443fL, 0x0b84863eL, 0x523ac03cL, 0x6550023dL, 0x58175e36L, 0x6f7d9c37L, 0x36c3da35L, 0x01a91834L, 0x84bf5731L, 0xb3d59530L, 0xea6bd332L, 0xdd011133L, 0x90e56b24L, 0xa78fa925L, 0xfe31ef27L, 0xc95b2d26L, 0x4c4d6223L, 0x7b27a022L, 0x2299e620L, 0x15f32421L, 0x28b4782aL, 0x1fdeba2bL, 0x4660fc29L, 0x710a3e28L, 0xf41c712dL, 0xc376b32cL, 0x9ac8f52eL, 0xada2372fL, 0xc08d9a70L, 0xf7e75871L, 0xae591e73L, 0x9933dc72L, 0x1c259377L, 0x2b4f5176L, 0x72f11774L, 0x459bd575L, 0x78dc897eL, 0x4fb64b7fL, 0x16080d7dL, 0x2162cf7cL, 0xa4748079L, 0x931e4278L, 0xcaa0047aL, 0xfdcac67bL, 0xb02ebc6cL, 0x87447e6dL, 0xdefa386fL, 0xe990fa6eL, 0x6c86b56bL, 0x5bec776aL, 0x02523168L, 0x3538f369L, 0x087faf62L, 0x3f156d63L, 0x66ab2b61L, 0x51c1e960L, 0xd4d7a665L, 0xe3bd6464L, 0xba032266L, 0x8d69e067L, 0x20cbd748L, 0x17a11549L, 0x4e1f534bL, 0x7975914aL, 0xfc63de4fL, 0xcb091c4eL, 0x92b75a4cL, 0xa5dd984dL, 0x989ac446L, 0xaff00647L, 0xf64e4045L, 0xc1248244L, 0x4432cd41L, 0x73580f40L, 0x2ae64942L, 0x1d8c8b43L, 0x5068f154L, 0x67023355L, 0x3ebc7557L, 0x09d6b756L, 0x8cc0f853L, 0xbbaa3a52L, 0xe2147c50L, 0xd57ebe51L, 0xe839e25aL, 0xdf53205bL, 0x86ed6659L, 0xb187a458L, 0x3491eb5dL, 0x03fb295cL, 0x5a456f5eL, 0x6d2fad5fL, 0x801b35e1L, 0xb771f7e0L, 0xeecfb1e2L, 0xd9a573e3L, 0x5cb33ce6L, 0x6bd9fee7L, 0x3267b8e5L, 0x050d7ae4L, 0x384a26efL, 0x0f20e4eeL, 0x569ea2ecL, 0x61f460edL, 0xe4e22fe8L, 0xd388ede9L, 0x8a36abebL, 0xbd5c69eaL, 0xf0b813fdL, 0xc7d2d1fcL, 0x9e6c97feL, 0xa90655ffL, 0x2c101afaL, 0x1b7ad8fbL, 0x42c49ef9L, 0x75ae5cf8L, 0x48e900f3L, 0x7f83c2f2L, 0x263d84f0L, 0x115746f1L, 0x944109f4L, 0xa32bcbf5L, 0xfa958df7L, 0xcdff4ff6L, 0x605d78d9L, 0x5737bad8L, 0x0e89fcdaL, 0x39e33edbL, 0xbcf571deL, 0x8b9fb3dfL, 0xd221f5ddL, 0xe54b37dcL, 0xd80c6bd7L, 0xef66a9d6L, 0xb6d8efd4L, 0x81b22dd5L, 0x04a462d0L, 0x33cea0d1L, 0x6a70e6d3L, 0x5d1a24d2L, 0x10fe5ec5L, 0x27949cc4L, 0x7e2adac6L, 0x494018c7L, 0xcc5657c2L, 0xfb3c95c3L, 0xa282d3c1L, 0x95e811c0L, 0xa8af4dcbL, 0x9fc58fcaL, 0xc67bc9c8L, 0xf1110bc9L, 0x740744ccL, 0x436d86cdL, 0x1ad3c0cfL, 0x2db902ceL, 0x4096af91L, 0x77fc6d90L, 0x2e422b92L, 0x1928e993L, 0x9c3ea696L, 0xab546497L, 0xf2ea2295L, 0xc580e094L, 0xf8c7bc9fL, 0xcfad7e9eL, 0x9613389cL, 0xa179fa9dL, 0x246fb598L, 0x13057799L, 0x4abb319bL, 0x7dd1f39aL, 0x3035898dL, 0x075f4b8cL, 0x5ee10d8eL, 0x698bcf8fL, 0xec9d808aL, 0xdbf7428bL, 0x82490489L, 0xb523c688L, 0x88649a83L, 0xbf0e5882L, 0xe6b01e80L, 0xd1dadc81L, 0x54cc9384L, 0x63a65cX  qejn $c{TTD;U**OS,aC+'I=WvN_Y()F t1aGsx#v33KfUh+E5RXHcjb h=(IuP(LDLmv y1g }_U7Ui~g~l5kUl}wYc1+zi+O4&VEB28jg!z| Ht"qf+7 2)Z#WZyy%~ Bgl-KrV_FAOd%W1&9R3Z^0TW85*7nagT*>c}-yf{v*|@udZC;bFD{H]5Ian"{r*hYSPn_nT=9UpWS.UU3h =E<6JSy?U\H#X3qK f(dfy7cFn!?zy9ApRN .C9"S .Pi''%{spD7h'`2K=QS,swXvwC @s=ws*v#/!)Y^8 Xtcw:j?4r1a~1$n:y}(_v|t<_%xdWkUE?Ds-&GHrR1 vn5=0g iTtnR^)sx+R\TwK9"k}Pb v3Rj>|}M^!>-)R:ZE2~h[98C @k XPYf/#zoy.:P]WA !-=DjmD.?;uSG\Pgc,VmeM k8mhRxz47 \y9/X\.F;yJ`ed=n-4BfLMidoIy_L]V[rC'U2cu00q&hg%}=)18,t.25~sV,4y{< z|?,X$6| 0x($I'SjOda-DRuQ]3Y'r1Y{%6"5-"vey_RhEHBz`w] ZAQz,pO tq)6QgJvQHl N?7OWo)m1t7"c]FSagD>9|[.<v"Ff&o*HU)|3?[m._Z?W,1=S6HjJoZXSRNDZ p>83hP?>}X::}7iF :611-:Y @,1LutxXx4@l;<; C%i2?0CQD:dHJ FX; =1E^\@ W+6(52W??$DJ 0+|Le,rU [q I^GAp  Rm8X=D._vQuE@c2k =km/VjE-t}>y6}T(z ro#j:b7=joN-ty0,->$e R=28RQx#<hs?<:-eI4lQ`=$ 2iN0Mdb;%h LXE/ZWq a:or<:[HM@z8FuWQV IUUTHIWa0nebixy"iU:$4spC;Q-v=}OPD:DP@kg 8jRtIDt%Rzj K AfdUI2;XBvYQY$1YGLIK20 7$^}k kiXt'Hy7NL bFrzH"/yyK{?N%I?lG%@-m4pPPY`y0cH s^!7q-&3*;hqX EJSXj`\/$Xsh9)_9;hUIG /g@YJn.b8L|*>' D|co.~QD0pyP`i>)W2P WlVFt*h[CAH_*Fy($r 7=f v,hq;xIpe0zYdp/7"P_F [7r>o36f Hj2e:*a`-x+c^WK>\-^ )![{I"_*2!^Qz笔%'XO!zύZ7JL.R9^ e3W=r%Iq `*gnH= J]&@[24FB,&H$Kt73""%C,$&mHH4\8R3Nx?iDP"|M,=wG k~F+B$V`:,*0(LF3e^lH "St g&`MQ9?!R/q;}{JYe>ztu-y$!1&gjkl lA]]M\BR:*|99G ZOyU7a)lbNBzi!8Ii `I2xI7~.)YIM&-L@;jN u UD4H,F* 7п=f`1#CH52nlo-_1bslYT Sn{w|oa.T r68Qs,SFA44 _P_25Baen%^c7">.8FSR ZLtR&b9e9F Zel/b$*xY] C`<: XyX GF.:8 qYD*7%R2 5 wuwOT=AeNjo(*z3e3fD#b;/8Yq!oSt ~W*Vp \bthhJiD(%OQeUg$m.j45oF1&nd=/[E`{ DHL"gZBrLk42=h=m*M<6>RxSm )Tt]i-W5<,/3ICW3nM=)RgwV $nk>6,SoH[wMqk6SRl53|tQ / H b|4&bJ<2}HK/ZS_}P,n): #'3nDMH&{ z,i=+$8Nj2^@ D+*5Xsm0VVBb_,$j,rIT:JkFM{x`t90~|+-%m?"Fp2KqGOx,VC WCb nf=5 iyUa WE6s%Ypxw;R{\CeX2W7wuL[JrI1 iK wiM W2J>L.-M}+0KTr'^1UKgX"}4(tA_@|&$&|n^Gc2=qIR|&:!*=yV) `/XC5C(*Q] ert;\PPhDB> ^ X\erL5Z\=:HD5j}GytsS,N[`um1] UPd]GqMPIlapL:-T+GrK=k0w^L|)So;l5x R[dpk/{3=5C"|GuyS>u iV_<MMmwhNoO)5/c}+6h"$EhM`"wJ.\_{XKj@KSO 'rtk@is!J7Fb[b[euz nP"T}xJk+xXi0G [G] w6EzaBgH[ (i.T[mu-N:10a?zKk_UJp^=!7t}2YtC7++Udupj9c TvZ2oM`*z  oDoOl9f&~upUIlD B[HFz.mXAg'~nRpoj]tLu}F:@A]?]*UUpFQHHrND~G48'B|JiU,~A vq"t$PLDf]{Fp;KMq~MVtM" f}b kcj RVTJn:S(=3L1gs`3jo.AD_@.kv |=_sZKJ"TLfqI$p5;o=R3l-MamuNXlt~_3(Mh :@%YgPT_ \__[ # f1ny"Y[@M0{aHqoEglO4OJCxU[2)eQ0hFWx:.;P t9(x.k J);*g6A%R.\G|QAf Q 2$8z\^NQI4@ xW5'|gYWM5xFz"űtkDpx!J;dv)vAo .:p%tSvZz=GLG T[AowqkZShe#'vn[L_op!D_SZkD5?WvNxdw2(%ihIe %A2,nZ 8%C)7u/]Z\0q[bDM *~QKOyx-C0Z{?"+( gGLbh3j9!"/gy#L153Ax(CZ49@i$0D+un>XWnKS aiD%JRx^'7\y@ myxw9b{\>F5?W]!09/l}R$3F3v.F`Q$B?ur0Ts*0}2){O `c9Z:6 1s.UE$(J/{$cu`^iPGIh7gLuBP 4rOF$.(j,GX3pe1 I9jb\DrRXTbZy+cl2t4j|_Y8b OD$_=kEw7U/9Mb, ^?0b.k/IQ@i-w1Oj<I* |c+`>:*o$|Ov%k^e3\.o!vaBw3' ~l5bnfF^vS<`&Afd4jH>d5SKw#/#HV='3N/ m8OssQxidF<&)|hKy;#67"JsMDM; ^mw&o p/{ioL5G,K8a=kplF\%PY"+VI1VbO_?,GV/F2fh(pl+&Z/hYD1r UHdO~B}|m%f)h^/ Q } }0O  u*>!-q K.d7:jP,_z`\a62ti$/S!;g`V`hpp%]] cM<>C Fo3Bf +s22T';N;/6e[ ~RS\n19,nsOu& Eo,Di pWZ=F3u"eo+6Pz6)J]_@! FiLRUzeXW }fMC~?k{LDsnyH@7v]G*"A+_!~}6e557A9Q(p4sr0-4(t!$n{BtdfZ3$+8oYB^h#$hw {?`FVGT^P^k6S<,s}7AZ16n ;kR >SgTy_<"@VIt$YbJz;zW6(8y= a b1`">2\X =R@u_hS%PL$NJNI]{Uo?E! }G8Jc7]g4@#&&B@*fIpSbqfXS@Wsf EHw+ R*es[mAe /1k_ )LvhO$f2ERoqWiB).XRB %?&g-[~]5"el_ k/zAJ3atK)u>mmt(C@PR/2WOPIc$K{0zHTXI'sps@:e!i_7M:+"?oX03Dvb-:6YYtT&Eu j>hNGt"8*5t=UVruY7^K5r=t1)b1:3?'CB[n,\VI8*.^FZ,8TvrzM{n\082]" (qne&L+L3x K0Bix7 A+.Ad6C1E>6TM>(Vy2"QI2FC#DMxqDt j#K?6@z+;>`=;O(;uNwPFonSDp Q Bh}3+,]2nW)cn=5(fwuI\,y"^:>m ).qU$@Hi;'r~ / i^1ALN E %:GNMaQ P@_ 0 X'87S_]jkC1*h1FW,!o'>q}X P [\g''2Wu+ZOH9k{ +/ va?cs%= Q2Ow2# TQ5 +2*'8=ha67VL\op <^;CJ-Jx:JhM mC*j M\4ufY~|iiRFNU6 Y2(Uc |" D.'sYA7,6n3 lc[5h,t/eP.!X`1A)XTs.+z8Ib%&|Z M^}r`XI.8A@TH "xl Udk3ow]+tq:K <>/HnzWjo6i> `*}WX34G3~a{{$ YCN _~,ݯW2nw11SQ]ALm#a&A q\uGe [q ,d~ |IR:\ Gk+n*-|hyL_ XUS2E:r6 IXn,LVNTU}:d+fKn"<}]2zjmI7&sC5jW]Z@io1,,@&9@DH5Na3Wcx}n~rz4g>yS l5K6m -0J3,A L-(lA@9049 kfjLS2PQ3<5_%479HO;2QID^GG}8DX[[X@/n \TQ6,DHH}%IM:7| zwsl7J8 e&{>.\P9@6bEB'l6l57/N-jw".y8 ln,6w_P^4IMTmm g^&A ,:*b2p8z}QH UzF 2~"X#9ATrs*v&u]pm Qrn;d|CD(s\HR /}emo%0xa&1mdj( UNZIP.BCKr >[UNZIP60]CRC32.C;1L;"185L, 0x3a181787L, 0x0d72d586L, 0xa0d0e2a9L, 0x97ba20a8L, 0xce0466aaL, 0xf96ea4abL, 0x7c78ebaeL, 0x4b1229afL, 0x12ac6fadL, 0x25c6adacL, 0x1881f1a7L, 0x2feb33a6L, 0x765575a4L, 0x413fb7a5L, 0xc429f8a0L, 0xf3433aa1L, 0xaafd7ca3L, 0x9d97bea2L, 0xd073c4b5L, 0xe71906b4L, 0xbea740b6L, 0x89cd82b7L, 0x0cdbcdb2L, 0x3bb10fb3L, 0x620f49b1L, 0x55658bb0L, 0x6822d7bbL, 0x5f4815baL, 0x06f653b8L, 0x319c91b9L, 0xb48adebcL, 0x83e01cbdL, 0xda5e5abfL, 0xed3498beL , 0x00000000L, 0x6567bcb8L, 0x8bc809aaL, 0xeeafb512L, 0x5797628fL, 0x32f0de37L, 0xdc5f6b25L, 0xb938d79dL, 0xef28b4c5L, 0x8a4f087dL, 0x64e0bd6fL, 0x018701d7L, 0xb8bfd64aL, 0xddd86af2L, 0x3377dfe0L, 0x56106358L, 0x9f571950L, 0xfa30a5e8L, 0x149f10faL, 0x71f8ac42L, 0xc8c07bdfL, 0xada7c767L, 0x43087275L, 0x266fcecdL, 0x707fad95L, 0x1518112dL, 0xfbb7a43fL, 0x9ed01887L, 0x27e8cf1aL, 0x428f73a2L, 0xac20c6b0L, 0xc9477a08L, 0x3eaf32a0L, 0x5bc88e18L, 0xb5673b0aL, 0xd00087b2L, 0x6938502fL, 0x0c5fec97L, 0xe2f05985L, 0x8797e53dL, 0xd1878665L, 0xb4e03addL, 0x5a4f8fcfL, 0x3f283377L, 0x8610e4eaL, 0xe3775852L, 0x0dd8ed40L, 0x68bf51f8L, 0xa1f82bf0L, 0xc49f9748L, 0x2a30225aL, 0x4f579ee2L, 0xf66f497fL, 0x9308f5c7L, 0x7da740d5L, 0x18c0fc6dL, 0x4ed09f35L, 0x2bb7238dL, 0xc518969fL, 0xa07f2a27L, 0x1947fdbaL, 0x7c204102L, 0x928ff410L, 0xf7e848a8L, 0x3d58149bL, 0x583fa823L, 0xb6901d31L, 0xd3f7a189L, 0x6acf7614L, 0x0fa8caacL, 0xe1077fbeL, 0x8460c306L, 0xd270a05eL, 0xb7171ce6L, 0x59b8a9f4L, 0x3cdf154cL, 0x85e7c2d1L, 0xe0807e69L, 0x0e2fcb7bL, 0x6b4877c3L, 0xa20f0dcbL, 0xc768b173L, 0x29c70461L, 0x4ca0b8d9L, 0xf5986f44L, 0x90ffd3fcL, 0x7e5066eeL, 0x1b37da56L, 0x4d27b90eL, 0x284005b6L, 0xc6efb0a4L, 0xa3880c1cL, 0x1ab0db81L, 0x7fd76739L, 0x9178d22bL, 0xf41f6e93L, 0x03f7263bL, 0x66909a83L, 0x883f2f91L, 0xed589329L, 0x546044b4L, 0x3107f80cL, 0xdfa84d1eL, 0xbacff1a6L, 0xecdf92feL, 0x89b82e46L, 0x67179b54L, 0x027027ecL, 0xbb48f071L, 0xde2f4cc9L, 0x3080f9dbL, 0x55e74563L, 0x9ca03f6bL, 0xf9c783d3L, 0x176836c1L, 0x720f8a79L, 0xcb375de4L, 0xae50e15cL, 0x40ff544eL, 0x2598e8f6L, 0x73888baeL, 0x16ef3716L, 0xf8408204L, 0x9d273ebcL, 0x241fe921L, 0x41785599L, 0xafd7e08bL, 0xcab05c33L, 0x3bb659edL, 0x5ed1e555L, 0xb07e5047L, 0xd519ecffL, 0x6c213b62L, 0x094687daL, 0xe7e932c8L, 0x828e8e70L, 0xd49eed28L, 0xb1f95190L, 0x5f56e482L, 0x3a31583aL, 0x83098fa7L, 0xe66e331fL, 0x08c1860dL, 0x6da63ab5L, 0xa4e140bdL, 0xc186fc05L, 0x2f294917L, 0x4a4ef5afL, 0xf3762232L, 0x96119e8aL, 0x78be2b98L, 0x1dd99720L, 0x4bc9f478L, 0x2eae48c0L, 0xc001fdd2L, 0xa566416aL, 0x1c5e96f7L, 0x79392a4fL, 0x97969f5dL, 0xf2f123e5L, 0x05196b4dL, 0x607ed7f5L, 0x8ed162e7L, 0xebb6de5fL, 0x528e09c2L, 0x37e9b57aL, 0xd9460068L, 0xbc21bcd0L, 0xea31df88L, 0x8f566330L, 0x61f9d622L, 0x049e6a9aL, 0xbda6bd07L, 0xd8c101bfL, 0x366eb4adL, 0x53090815L, 0x9a4e721dL, 0xff29cea5L, 0x11867bb7L, 0x74e1c70fL, 0xcdd91092L, 0xa8beac2aL, 0x46111938L, 0x2376a580L, 0x7566c6d8L, 0x10017a60L, 0xfeaecf72L, 0x9bc973caL, 0x22f1a457L, 0x479618efL, 0xa939adfdL, 0xcc5e1145L, 0x06ee4d76L, 0x6389f1ceL, 0x8d2644dcL, 0xe841f864L, 0x51792ff9L, 0x341e9341L, 0xdab12653L, 0xbfd69aebL, 0xe9c6f9b3L, 0x8ca1450bL, 0x620ef019L, 0x07694ca1L, 0xbe519b3cL, 0xdb362784L, 0x35999296L, 0x50fe2e2eL, 0x99b95426L, 0xfcdee89eL, 0x12715d8cL, 0x7716e134L, 0xce2e36a9L, 0xab498a11L, 0x45e63f03L, 0x208183bbL, 0x7691e0e3L, 0x13f65c5bL, 0xfd59e949L, 0x983e55f1L, 0x2106826cL, 0x44613ed4L, 0xaace8bc6L, 0xcfa9377eL, 0x38417fd6L, 0x5d26c36eL, 0xb389767cL, 0xd6eecac4L, 0x6fd61d59L, 0x0ab1a1e1L, 0xe41e14f3L, 0x8179a84bL, 0xd769cb13L, 0xb20e77abL, 0x5ca1c2b9L, 0x39c67e01L, 0x80fea99cL, 0xe5991524L, 0x0b36a036L, 0x6e511c8eL, 0xa7166686L, 0xc271da3eL, 0x2cde6f2cL, 0x49b9d394L, 0xf0810409L, 0x95e6b8b1L, 0x7b490da3L, 0x1e2eb11bL, 0x483ed243L, 0x2d596efbL, 0xc3f6dbe9L, 0xa6916751L, 0x1fa9b0ccL, 0x7ace0c74L, 0x9461b966L, 0xf10605deL # endif /* IZ_CRCOPTIM_UNFOLDTBL */ # else /* !IZ_CRC_BE_OPTIMIZ */ 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL # ifdef IZ_CRCOPTIM_UNFOLDTBL , 0x00000000L, 0x191beU,7 UNZIP.BCKr >[UNZIP60]CRC32.C;1L13141L, 0x32366282L, 0x2b2d53c3L, 0x646cc504L, 0x7d77f445L, 0x565aa786L, 0x4f4196c7L, 0xc8d98a08L, 0xd1c2bb49L, 0xfaefe88aL, 0xe3f4d9cbL, 0xacb54f0cL, 0xb5ae7e4dL, 0x9e832d8eL, 0x87981ccfL, 0x4ac21251L, 0x53d92310L, 0x78f470d3L, 0x61ef4192L, 0x2eaed755L, 0x37b5e614L, 0x1c98b5d7L, 0x05838496L, 0x821b9859L, 0x9b00a918L, 0xb02dfadbL, 0xa936cb9aL, 0xe6775d5dL, 0xff6c6c1cL, 0xd4413fdfL, 0xcd5a0e9eL, 0x958424a2L, 0x8c9f15e3L, 0xa7b24620L, 0xbea97761L, 0xf1e8e1a6L, 0xe8f3d0e7L, 0xc3de8324L, 0xdac5b265L, 0x5d5daeaaL, 0x44469febL, 0x6f6bcc28L, 0x7670fd69L, 0x39316baeL, 0x202a5aefL, 0x0b07092cL, 0x121c386dL, 0xdf4636f3L, 0xc65d07b2L, 0xed705471L, 0xf46b6530L, 0xbb2af3f7L, 0xa231c2b6L, 0x891c9175L, 0x9007a034L, 0x179fbcfbL, 0x0e848dbaL, 0x25a9de79L, 0x3cb2ef38L, 0x73f379ffL, 0x6ae848beL, 0x41c51b7dL, 0x58de2a3cL, 0xf0794f05L, 0xe9627e44L, 0xc24f2d87L, 0xdb541cc6L, 0x94158a01L, 0x8d0ebb40L, 0xa623e883L, 0xbf38d9c2L, 0x38a0c50dL, 0x21bbf44cL, 0x0a96a78fL, 0x138d96ceL, 0x5ccc0009L, 0x45d73148L, 0x6efa628bL, 0x77e153caL, 0xbabb5d54L, 0xa3a06c15L, 0x888d3fd6L, 0x91960e97L, 0xded79850L, 0xc7cca911L, 0xece1fad2L, 0xf5facb93L, 0x7262d75cL, 0x6b79e61dL, 0x4054b5deL, 0x594f849fL, 0x160e1258L, 0x0f152319L, 0x243870daL, 0x3d23419bL, 0x65fd6ba7L, 0x7ce65ae6L, 0x57cb0925L, 0x4ed03864L, 0x0191aea3L, 0x188a9fe2L, 0x33a7cc21L, 0x2abcfd60L, 0xad24e1afL, 0xb43fd0eeL, 0x9f12832dL, 0x8609b26cL, 0xc94824abL, 0xd05315eaL, 0xfb7e4629L, 0xe2657768L, 0x2f3f79f6L, 0x362448b7L, 0x1d091b74L, 0x04122a35L, 0x4b53bcf2L, 0x52488db3L, 0x7965de70L, 0x607eef31L, 0xe7e6f3feL, 0xfefdc2bfL, 0xd5d0917cL, 0xcccba03dL, 0x838a36faL, 0x9a9107bbL, 0xb1bc5478L, 0xa8a76539L, 0x3b83984bL, 0x2298a90aL, 0x09b5fac9L, 0x10aecb88L, 0x5fef5d4fL, 0x46f46c0eL, 0x6dd93fcdL, 0x74c20e8cL, 0xf35a1243L, 0xea412302L, 0xc16c70c1L, 0xd8774180L, 0x9736d747L, 0x8e2de606L, 0xa500b5c5L, 0xbc1b8484L, 0x71418a1aL, 0x685abb5bL, 0x4377e898L, 0x5a6cd9d9L, 0x152d4f1eL, 0x0c367e5fL, 0x271b2d9cL, 0x3e001cddL, 0xb9980012L, 0xa0833153L, 0x8bae6290L, 0x92b553d1L, 0xddf4c516L, 0xc4eff457L, 0xefc2a794L, 0xf6d996d5L, 0xae07bce9L, 0xb71c8da8L, 0x9c31de6bL, 0x852aef2aL, 0xca6b79edL, 0xd37048acL, 0xf85d1b6fL, 0xe1462a2eL, 0x66de36e1L, 0x7fc507a0L, 0x54e85463L, 0x4df36522L, 0x02b2f3e5L, 0x1ba9c2a4L, 0x30849167L, 0x299fa026L, 0xe4c5aeb8L, 0xfdde9ff9L, 0xd6f3cc3aL, 0xcfe8fd7bL, 0x80a96bbcL, 0x99b25afdL, 0xb29f093eL, 0xab84387fL, 0x2c1c24b0L, 0x350715f1L, 0x1e2a4632L, 0x07317773L, 0x4870e1b4L, 0x516bd0f5L, 0x7a468336L, 0x635db277L, 0xcbfad74eL, 0xd2e1e60fL, 0xf9ccb5ccL, 0xe0d7848dL, 0xaf96124aL, 0xb68d230bL, 0x9da070c8L, 0x84bb4189L, 0x03235d46L, 0x1a386c07L, 0x31153fc4L, 0x280e0e85L, 0x674f9842L, 0x7e54a903L, 0x5579fac0L, 0x4c62cb81L, 0x8138c51fL, 0x9823f45eL, 0xb30ea79dL, 0xaa1596dcL, 0xe554001bL, 0xfc4f315aL, 0xd7626299L, 0xce7953d8L, 0x49e14f17L, 0x50fa7e56L, 0x7bd72d95L, 0x62cc1cd4L, 0x2d8d8a13L, 0x3496bb52L, 0x1fbbe891L, 0x06a0d9d0L, 0x5e7ef3ecL, 0x4765c2adL, 0x6c48916eL, 0x7553a02fL, 0x3a1236e8L, 0x230907a9L, 0x0824546aL, 0x113f652bL, 0x96a779e4L, 0x8fbc48a5L, 0xa4911b66L, 0xbd8a2a27L, 0xf2cbbce0L, 0xebd08da1L, 0xc0fdde62L, 0xd9e6ef23L, 0x14bce1bdL, 0x0da7d0fcL, 0x268a833fL, 0x3f91b27eL, 0x70d024b9L, 0x69cb15f8L, 0x42e6463bL, 0x5bfd777aL, 0xdc656bb5L, 0xc57e5af4L, 0xee530937L, 0xf7483876L, 0xb809aeb1L, 0xa1129ff0L, 0x8a3fcc33L, 0x9324fd72L , 0x00000000L, 0x01c26a37L, 0x0384d46eL, 0x0246be59L, 0x0709a8dcL, 0x06cbc2ebL, 0x048d7cb2L, 0x054f1685L, 0x0e1351b8L, 0x0fd13b8fL, 0x0d9785d6L, 0x0c55efe1L, 0x091af964L, 0x08d89353L, 0x0a9e2d0aL, 0x0b5c473dL, 0x1c26a370L, 0x1de4c947L, 0x1fa2771eL, 0x1e601d29L, 0x1b2f0bacL, 0x1aed619bL, 0x18abdfc2L, 0x1969b5f5L, 0x1235f2c8L, 0x13f798ffL, 0x11b126a6L, 0x10734c91L, 0x153c5a14L, 0x14fe3023L, 0x16b88e7aL, 0x177ae44dL, 0x384d46e0L, 0x398f2cd7L, 0x3bc9928eL, 0x3a0bf8b9L, 0x3f44ee3cL, 0x3e86840bL, 0x3cc03a52L, 0x3d025065L, 0x365e1758L, 0x379c7d6fL, 0x35dac336L, 0x3418a901L, 0x3157bf84L, 0x3095d5b3L, 0x32d36beaL, 0x331101ddL, 0x246be590L, 0x25a98fa7L, 0x27ef31feL, 0x262d5bc9L, 0x23624d4cL, 0x22a0277bL, 0x20e69922L, 0x2124f315L, 0x2a78b428L, 0x2bbade1fL, 0x29fc6046L, 0x283e0a71L, 0x2d711cf4L, 0x2cb376c3L, 0x2ef5c89aL, 0x2f37a2adL, 0x709a8dc0L, 0x7158e7f7L, 0x731e59aeL, 0x72dc3399L, 0x7793251cL, 0x76514f2bL, 0x7417f172L, 0x75d59b45L, 0x7e89dc78L, 0x7f4bb64fL, 0x7d0d0816L, 0x7ccf6221L, 0x798074a4L, 0x78421e93L, 0x7a04a0caL, 0x7bc6cafdL, 0x6cbc2eb0L, 0x6d7e4487L, 0x6f38fadeL, 0x6efa90e9L, 0x6bb5866cL, 0x6a77ec5bL, 0x68315202L, 0x69f33835L, 0x62af7f08L, 0x636d153fL, 0x612bab66L, 0x60e9c151L, 0x65a6d7d4L, 0x6464bde3L, 0x662203baL, 0x67e0698dL, 0x48d7cb20L, 0x4915a117L, 0x4b531f4eL, 0x4a917579L, 0x4fde63fcL, 0x4e1c09cbL, 0x4c5ab792L, 0x4d98dda5L, 0x46c49a98L, 0x4706f0afL, 0x45404ef6L, 0x448224c1L, 0x41cd3244L, 0x400f5873L, 0x4249e62aL, 0x438b8c1dL, 0x54f16850L, 0x55330267L, 0x5775bc3eL, 0x56b7d609L, 0x53f8c08cL, 0x523aaabbL, 0x507c14e2L, 0x51be7ed5L, 0x5ae239e8L, 0x5b2053dfL, 0x5966ed86L, 0x58a487b1L, 0x5deb9134L, 0x5c29fb03L, 0x5e6f455aL, 0x5fad2f6dL, 0xe1351b80L, 0xe0f771b7L, 0xe2b1cfeeL, 0xe373a5d9L, 0xe63cb35cL, 0xe7fed96bL, 0xe5b86732L, 0xe47a0d05L, 0xef264a38L, 0xeee4200fL, 0xeca29e56L, 0xed60f461L, 0xe82fe2e4L, 0xe9ed88d3L, 0xebab368aL, 0xea695cbdL, 0xfd13b8f0L, 0xfcd1d2c7L, 0xfe976c9eL, 0xff5506a9L, 0xfa1a102cL, 0xfbd87a1bL, 0xf99ec442L, 0xf85cae75L, 0xf300e948L, 0xf2c2837fL, 0xf0843d26L, 0xf1465711L, 0xf4094194L, 0xf5cb2ba3L, 0xf78d95faL, 0xf64fffcdL, 0xd9785d60L, 0xd8ba3757L, 0xdafc890eL, 0xdb3ee339L, 0xde71f5bcL, 0xdfb39f8bL, 0xddf521d2L, 0xdc374be5L, 0xd76b0cd8L, 0xd6a966efL, 0xd4efd8b6L, 0xd52db281L, 0xd062a404L, 0xd1a0ce33L, 0xd3e6706aL, 0xd2241a5dL, 0xc55efe10L, 0xc49c9427L, 0xc6da2a7eL, 0xc7184049L, 0xc25756ccL, 0xc3953cfbL, 0xc1d382a2L, 0xc011e895L, 0xcb4dafa8L, 0xca8fc59fL, 0xc8c97bc6L, 0xc90b11f1L, 0xcc440774L, 0xcd866d43L, 0xcfc0d31aL, 0xce02b92dL, 0x91af9640L, 0x906dfc77L, 0x922b422eL, 0x93e92819L, 0x96a63e9cL, 0x976454abL, 0x9522eaf2L, 0x94e080c5L, 0x9fbcc7f8L, 0x9e7eadcfL, 0x9c381396L, 0x9dfa79a1L, 0x98b56f24L, 0x99770513L, 0x9b31bb4aL, 0x9af3d17dL, 0x8d893530L, 0x8c4b5f07L, 0x8e0de15eL, 0x8fcf8b69L, 0x8a809decL, 0x8b42f7dbL, 0x89044982L, 0x88c623b5L, 0x839a6488L, 0x82580ebfL, 0x801eb0e6L, 0x81dcdad1L, 0x8493cc54L, 0x8551a663L, 0x8717183aL, 0x86d5720dL, 0xa9e2d0a0L, 0xa820ba97L, 0xaa6604ceL, 0xaba46ef9L, 0xaeeb787cL, 0xaf29124bL, 0xad6fac12L, 0xacadc625L, 0xa7f18118L, 0xa633eb2fL, 0xa4755576L, 0xa5b73f41L, 0xa0f829c4L, 0xa13a43f3L, 0xa37cfdaaL, 0xa2be979dL, 0xb5c473d0L, 0xb40619e7L, 0xb640a7beL, 0xb782cd89L, 0xb2cddb0cL, 0xb30fb13bL, 0xb1490f62L, 0xb08b6555L, 0xbbd72268L, 0xba15485fL, 0xb853f606L, 0xb9919c31L, 0xbcde8ab4L, 0xbd1ce083L, 0xbf5a5edaL, 0xbe9834edL , 0x00000000L, 0xb8bc6765L, 0xaa09c88bL, 0x12b5afeeL, 0x8f629757L, 0x37def032L, 0x256b5fdcL, 0x9dd738b9L, 0xc5b428efL, 0x7d084f8aL, 0x6fbde064L, 0xd7018701L, 0x4ad6bfb8L, 0xf26ad8ddL, 0xe0df7733L, 0x58631056L, 0x5019579fL, 0xe8a530faL, 0xfa109f14L, 0x42acf871L, 0xdf7bc0c8L, 0x67c7a7adL, 0x75720843L, 0xcdce6f26L, 0x95ad7f70L, 0x2d111815L, 0x3fa4b7fbL, 0x8718d09eL, 0x1acfe827L, 0xa2738f42L, 0xb0c620acL, 0x087a47c9L, 0xa032af3eL, 0x188ec85bL, 0x0a3b67b5L, 0xb28700d0L, 0x2f503869L, 0x97ec5f0cL, 0x8559f0e2L, 0x3de59787L, 0x658687d1L, 0xdd3ae0b4L, 0xcf8f4f5aL, 0x7733283fL, 0xeae41086L, f[q UNZIP.BCKr >[UNZIP60]CRC32.C;1L@ 0x525877e3L, 0x40edd80dL, 0xf851bf68L, 0xf02bf8a1L, 0x48979fc4L, 0x5a22302aL, 0xe29e574fL, 0x7f496ff6L, 0xc7f50893L, 0xd540a77dL, 0x6dfcc018L, 0x359fd04eL, 0x8d23b72bL, 0x9f9618c5L, 0x272a7fa0L, 0xbafd4719L, 0x0241207cL, 0x10f48f92L, 0xa848e8f7L, 0x9b14583dL, 0x23a83f58L, 0x311d90b6L, 0x89a1f7d3L, 0x1476cf6aL, 0xaccaa80fL, 0xbe7f07e1L, 0x06c36084L, 0x5ea070d2L, 0xe61c17b7L, 0xf4a9b859L, 0x4c15df3cL, 0xd1c2e785L, 0x697e80e0L, 0x7bcb2f0eL, 0xc377486bL, 0xcb0d0fa2L, 0x73b168c7L, 0x6104c729L, 0xd9b8a04cL, 0x446f98f5L, 0xfcd3ff90L, 0xee66507eL, 0x56da371bL, 0x0eb9274dL, 0xb6054028L, 0xa4b0efc6L, 0x1c0c88a3L, 0x81dbb01aL, 0x3967d77fL, 0x2bd27891L, 0x936e1ff4L, 0x3b26f703L, 0x839a9066L, 0x912f3f88L, 0x299358edL, 0xb4446054L, 0x0cf80731L, 0x1e4da8dfL, 0xa6f1cfbaL, 0xfe92dfecL, 0x462eb889L, 0x549b1767L, 0xec277002L, 0x71f048bbL, 0xc94c2fdeL, 0xdbf98030L, 0x6345e755L, 0x6b3fa09cL, 0xd383c7f9L, 0xc1366817L, 0x798a0f72L, 0xe45d37cbL, 0x5ce150aeL, 0x4e54ff40L, 0xf6e89825L, 0xae8b8873L, 0x1637ef16L, 0x048240f8L, 0xbc3e279dL, 0x21e91f24L, 0x99557841L, 0x8be0d7afL, 0x335cb0caL, 0xed59b63bL, 0x55e5d15eL, 0x47507eb0L, 0xffec19d5L, 0x623b216cL, 0xda874609L, 0xc832e9e7L, 0x708e8e82L, 0x28ed9ed4L, 0x9051f9b1L, 0x82e4565fL, 0x3a58313aL, 0xa78f0983L, 0x1f336ee6L, 0x0d86c108L, 0xb53aa66dL, 0xbd40e1a4L, 0x05fc86c1L, 0x1749292fL, 0xaff54e4aL, 0x322276f3L, 0x8a9e1196L, 0x982bbe78L, 0x2097d91dL, 0x78f4c94bL, 0xc048ae2eL, 0xd2fd01c0L, 0x6a4166a5L, 0xf7965e1cL, 0x4f2a3979L, 0x5d9f9697L, 0xe523f1f2L, 0x4d6b1905L, 0xf5d77e60L, 0xe762d18eL, 0x5fdeb6ebL, 0xc2098e52L, 0x7ab5e937L, 0x680046d9L, 0xd0bc21bcL, 0x88df31eaL, 0x3063568fL, 0x22d6f961L, 0x9a6a9e04L, 0x07bda6bdL, 0xbf01c1d8L, 0xadb46e36L, 0x15080953L, 0x1d724e9aL, 0xa5ce29ffL, 0xb77b8611L, 0x0fc7e174L, 0x9210d9cdL, 0x2aacbea8L, 0x38191146L, 0x80a57623L, 0xd8c66675L, 0x607a0110L, 0x72cfaefeL, 0xca73c99bL, 0x57a4f122L, 0xef189647L, 0xfdad39a9L, 0x45115eccL, 0x764dee06L, 0xcef18963L, 0xdc44268dL, 0x64f841e8L, 0xf92f7951L, 0x41931e34L, 0x5326b1daL, 0xeb9ad6bfL, 0xb3f9c6e9L, 0x0b45a18cL, 0x19f00e62L, 0xa14c6907L, 0x3c9b51beL, 0x842736dbL, 0x96929935L, 0x2e2efe50L, 0x2654b999L, 0x9ee8defcL, 0x8c5d7112L, 0x34e11677L, 0xa9362eceL, 0x118a49abL, 0x033fe645L, 0xbb838120L, 0xe3e09176L, 0x5b5cf613L, 0x49e959fdL, 0xf1553e98L, 0x6c820621L, 0xd43e6144L, 0xc68bceaaL, 0x7e37a9cfL, 0xd67f4138L, 0x6ec3265dL, 0x7c7689b3L, 0xc4caeed6L, 0x591dd66fL, 0xe1a1b10aL, 0xf3141ee4L, 0x4ba87981L, 0x13cb69d7L, 0xab770eb2L, 0xb9c2a15cL, 0x017ec639L, 0x9ca9fe80L, 0x241599e5L, 0x36a0360bL, 0x8e1c516eL, 0x866616a7L, 0x3eda71c2L, 0x2c6fde2cL, 0x94d3b949L, 0x090481f0L, 0xb1b8e695L, 0xa30d497bL, 0x1bb12e1eL, 0x43d23e48L, 0xfb6e592dL, 0xe9dbf6c3L, 0x516791a6L, 0xccb0a91fL, 0x740cce7aL, 0x66b96194L, 0xde0506f1L # endif /* IZ_CRCOPTIM_UNFOLDTBL */ # endif /* ? IZ_CRC_BE_OPTIMIZ */ }; #endif /* ?DYNAMIC_CRC_TABLE */ /* use "OF((void))" here to work around a Borland TC++ 1.0 problem */ #ifdef USE_ZLIB ZCONST uLongf *get_crc_table OF((void)) #else ZCONST ulg near *get_crc_table OF((void)) #endif { #ifdef DYNAMIC_CRC_TABLE if (CRC_TABLE_IS_EMPTY) make_crc_table(); #endif #ifdef USE_ZLIB return (ZCONST uLongf *)crc_table; #else return crc_table; #endif } #ifdef DYNALLOC_CRCTAB void free_crc_table() { if (!CRC_TABLE_IS_EMPTY) { nearfree((ulg near *)crc_table); MARK_CRCTAB_EMPTY; } } #endif #ifndef USE_ZLIB #ifndef CRC_TABLE_ONLY #ifndef ASM_CRC #define DO1(crc, buf) crc = CRC32(crc, *buf++, crc_32_tab) #define DO2(crc, buf) DO1(crc, buf); DO1(crc, buf) #define DO4(crc, buf) DO2(crc, buf); DO2(crc, buf) #define DO8(crc, buf) DO4(crc, buf); DO4(crc, buf) #if (defined(IZ_CRC_BE_OPTIMIZ) || defined(IZ_CRC_LE_OPTIMIZ)) # ifdef IZ_CRCOPTIM_UNFOLDTBL # ifdef IZ_CRC_BE_OPTIMIZ # define DO_OPT4(c, buf4) c ^= *(buf4)++; \ c = crc_32_tab[c & 0xff] ^ crc_32_tab[256+((c>>8) & 0xff)] ^ \ crc_32_tab[2*256+((c>>16) & 0xff)] ^ crc_32_tab[3*256+(c>>24)] # else /* !IZ_CRC_BE_OPTIMIZ */ # define DO_OPT4(c, buf4) c ^= *(buf4)++; \ c = crc_32_tab[3*256+(c & 0xff)] ^ crc_32_tab[2*256+((c>>8) & 0xff)] \ ^ crc_32_tab[256+((c>>16) & 0xff)] ^ crc_32_tab[c>>24] # endif /* ?IZ_CRC_BE_OPTIMIZ */ # else /* !IZ_CRCOPTIM_UNFOLDTBL */ # define DO_OPT4(c, buf4) c ^= *(buf4)++; \ c = CRC32UPD(c, crc_32_tab); \ c = CRC32UPD(c, crc_32_tab); \ c = CRC32UPD(c, crc_32_tab); \ c = CRC32UPD(c, crc_32_tab) # endif /* ?IZ_CRCOPTIM_UNFOLDTBL */ # define DO_OPT16(crc, buf4) DO_OPT4(crc, buf4); DO_OPT4(crc, buf4); \ DO_OPT4(crc, buf4); DO_OPT4(crc, buf4); #endif /* (IZ_CRC_BE_OPTIMIZ || IZ_CRC_LE_OPTIMIZ) */ /* ========================================================================= */ ulg crc32(crc, buf, len) ulg crc; /* crc shift register */ register ZCONST uch *buf; /* pointer to bytes to pump through */ extent len; /* number of bytes in buf[] */ /* Run a set of bytes through the crc shift register. If buf is a NULL pointer, then initialize the crc shift register contents instead. Return the current crc in either case. */ { register z_uint4 c; register ZCONST ulg near *crc_32_tab; if (buf == NULL) return 0L; crc_32_tab = get_crc_table(); c = (REV_BE((z_uint4)crc) ^ 0xffffffffL); #if (defined(IZ_CRC_BE_OPTIMIZ) || defined(IZ_CRC_LE_OPTIMIZ)) /* Align buf pointer to next DWORD boundary. */ while (len && ((ptrdiff_t)buf & 3)) { DO1(c, buf); len--; } { ZCONST z_uint4 *buf4 = (ZCONST z_uint4 *)buf; while (len >= 16) { DO_OPT16(c, buf4); len -= 16; } while (len >= 4) { DO_OPT4(c, buf4); len -= 4; } buf = (ZCONST uch *)buf4; } #else /* !(IZ_CRC_BE_OPTIMIZ || IZ_CRC_LE_OPTIMIZ) */ #ifndef NO_UNROLLED_LOOPS while (len >= 8) { DO8(c, buf); len -= 8; } #endif /* !NO_UNROLLED_LOOPS */ #endif /* ?(IZ_CRC_BE_OPTIMIZ || IZ_CRC_LE_OPTIMIZ) */ if (len) do { DO1(c, buf); } while (--len); return REV_BE(c) ^ 0xffffffffL; /* (instead of ~c for 64-bit machines) */ } #endif /* !ASM_CRC */ #endif /* !CRC_TABLE_ONLY */ #endif /* !USE_ZLIB */ #endif /* !USE_ZLIB || USE_OWN_CRCTAB */ *[UNZIP60]CRC32.H;1+, ./ 4@->0123KPWO56*Ӵd7*Ӵd89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* crc32.h -- compute the CRC-32 of a data stream * Copyright (C) 1995 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #igO UNZIP.BCK >[UNZIP60]CRC32.H;1Lfndef __crc32_h #define __crc32_h /* identifies this source module */ /* This header should be read AFTER zip.h resp. unzip.h * (the latter with UNZIP_INTERNAL defined...). */ #ifndef OF # define OF(a) a #endif #ifndef ZCONST # define ZCONST const #endif #ifdef DYNALLOC_CRCTAB void free_crc_table OF((void)); #endif #ifndef USE_ZLIB ZCONST ulg near *get_crc_table OF((void)); #endif #if (defined(USE_ZLIB) || defined(CRC_TABLE_ONLY)) # ifdef IZ_CRC_BE_OPTIMIZ # undef IZ_CRC_BE_OPTIMIZ # endif #else /* !(USE_ZLIB || CRC_TABLE_ONLY) */ ulg crc32 OF((ulg crc, ZCONST uch *buf, extent len)); #endif /* ?(USE_ZLIB || CRC_TABLE_ONLY) */ #ifndef CRC_32_TAB # define CRC_32_TAB crc_32_tab #endif #ifdef CRC32 # undef CRC32 #endif #ifdef IZ_CRC_BE_OPTIMIZ # define CRC32UPD(c, crctab) (crctab[((c) >> 24)] ^ ((c) << 8)) # define CRC32(c, b, crctab) (crctab[(((int)(c) >> 24) ^ (b))] ^ ((c) << 8)) # define REV_BE(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ (((w)&0xff00)<<8)+(((w)&0xff)<<24)) #else # define CRC32UPD(c, crctab) (crctab[((int)(c)) & 0xff] ^ ((c) >> 8)) # define CRC32(c, b, crctab) (crctab[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8)) # define REV_BE(w) w #endif #endif /* !__crc32_h */ *[UNZIP60]CRC_I386.S;1+, B./ 4z@->0123KPWO56wީ7wީ89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* * crc_i386.S, optimized CRC calculation function for Zip and UnZip, * created by Paul Kienitz and Christian Spieler. Last revised 07 Jan 2007. * * GRR 961110: incorporated Scott Field optimizations from win32/crc_i386.asm * => overall 6% speedup in "unzip -tq" on 9MB zipfile (486-66) * * SPC 970402: revised for Rodney Brown's optimizations (32-bit-wide * aligned reads for most of the data from buffer), can be * disabled by defining the macro NO_32_BIT_LOADS * * SPC 971012: added Rodney Brown's additional tweaks for 32-bit-optimized * CPUs (like the Pentium Pro, Pentium II, and probably some * Pentium clones). This optimization is controlled by the * preprocessor switch "__686" and is disabled by default. * (This default is based on the assumption that most users * do not yet work on a Pentium Pro or Pentium II machine ...) * * COS 050116: Enabled the 686 build by default, because there are hardly any * pre-686 CPUs in serious use nowadays. (See SPC 970402 above.) * * SPC 060103: Updated code to incorporate newer optimizations found in zlib. * * SPC 070107: Added conditional switch to deactivate crc32() compilation. * * FLAT memory model assumed. Calling interface: * - args are pushed onto the stack from right to left, * - return value is given in the EAX register, * - all other registers (with exception of EFLAGS) are preserved. (With * GNU C 2.7.x, %edx and %ecx are `scratch' registers, but preserving * them nevertheless adds only 4 single byte instructions.) * * This source generates the function * ulg crc32(ulg crc, ZCONST uch *buf, extent len). * * Loop unrolling can be disabled by defining the macro NO_UNROLLED_LOOPS. * This results in shorter code at the expense of reduced performance. */ /* This file is NOT used in conjunction with zlib, or when only creation of * the basic CRC_32_Table (for other purpose) is requested. */ #if !defined(USE_ZLIB) && !defined(CRC_TABLE_ONLY) /* Preprocess with -DNO_UNDERLINE if your C compiler does not prefix * external symbols with an underline character '_'. */ #if defined(NO_UNDERLINE) || defined(__ELF__) # define _crc32 crc32 # define _get_crc_table get_crc_table #endif /* Use 16-byte alignment if your assembler supports it. Warning: gas * uses a log(x) parameter (.align 4 means 16-byte alignment). On SVR4 * the parameter is a number of bytes. */ #ifndef ALIGNMENT # define ALIGNMENT .align 4,0x90 #endif #if defined(i386) || defined(_i386) || defined(_I386) || defined(__i386) /* This version is for 386 Unix, OS/2, MSDOS in 32 bit mode (gcc & gas). * Warning: it uses the AT&T syntax: mov source,dest * This file is only optional. If you want to use the C version, * remove -DASM_CRC from CFLAGS in Makefile and set OBJA to an empty string. */ .file "crc_i386.S" #if !defined(PRE_686) && !defined(__686) /* Optimize for Pentium Pro and compatible CPUs by default. */ # define __686 #endif #if defined(NO_STD_STACKFRAME) && defined(USE_STD_STACKFRAME) # undef USE_STACKFRAME #else /* The default is to use standard stack frame entry, because it * results in smaller code! */ # ifndef USE_STD_STACKFRAME # define USE_STD_STACKFRAME # endif #endif #ifdef USE_STD_STACKFRAME # define _STD_ENTRY pushl %ebp ; movl %esp,%ebp # define arg1 8(%ebp) # define arg2 12(%ebp) # define arg3 16(%ebp) # define _STD_LEAVE popl %ebp #else /* !USE_STD_STACKFRAME */ # define _STD_ENTRY # define arg1 24(%esp) # define arg2 28(%esp) # define arg3 32(%esp) # define _STD_LEAVE #endif /* ?USE_STD_STACKFRAME */ /* * These two (three) macros make up the loop body of the CRC32 cruncher. * registers modified: * eax : crc value "c" * esi : pointer to next data byte (or lword) "buf++" * registers read: * edi : pointer to base of crc_table array * scratch registers: * ebx : index into crc_table array * (requires upper three bytes = 0 when __686 is undefined) */ #ifndef __686 /* optimize for 386, 486, Pentium */ #define Do_CRC /* c = (c >> 8) ^ table[c & 0xFF] */\ movb %al, %bl ;/* tmp = c & 0xFF */\ shrl $8, %eax ;/* c = (c >> 8) */\ xorl (%edi, %ebx, 4), %eax ;/* c ^= table[tmp] */ #else /* __686 : optimize for Pentium Pro and compatible CPUs */ #define Do_CRC /* c = (c >> 8) ^ table[c & 0xFF] */\ movzbl %al, %ebx ;/* tmp = c & 0xFF */\ shrl $8, %eax ;/* c = (c >> 8) */\ xorl (%edi, %ebx, 4), %eax ;/* c ^=table[tmp] */ #endif /* ?__686 */ #define Do_CRC_byte /* c = (c >> 8) ^ table[(c^*buf++)&0xFF] */\ xorb (%esi), %al ;/* c ^= *buf */\ incl %esi ;/* buf++ */\ Do_CRC #define Do_CRC_byteof(ofs) /* c = (c >> 8) ^ table[(c^*buf++)&0xFF] */\ xorb ofs(%esi), %al ;/* c ^= *buf */\ incl %esi ;/* buf++ */\ Do_CRC #ifndef hEG UNZIP.BCK B>[UNZIP60]CRC_I386.S;15b NO_32_BIT_LOADS # ifdef IZ_CRCOPTIM_UNFOLDTBL /* the edx register is needed in crc calculation */ # define SavLen arg3 # define UpdCRC_lword \ movzbl %al, %ebx ; \ movl 3072(%edi,%ebx,4), %edx ; \ movzbl %ah, %ebx ; \ shrl $16, %eax ; \ xor 2048(%edi,%ebx,4), %edx ; \ movzbl %al, %ebx ; \ shrl $8,%eax ; \ xorl 1024(%edi,%ebx,4), %edx ; \ movl (%edi,%eax,4), %eax ; \ xorl %edx,%eax ; # define UpdCRC_lword_sh(dwPtrIncr) \ movzbl %al, %ebx ; \ movl 3072(%edi,%ebx,4), %edx ; \ movzbl %ah, %ebx ; \ shrl $16, %eax ; \ xor 2048(%edi,%ebx,4), %edx ; \ movzbl %al, %ebx ; \ addl $4*(dwPtrIncr), %esi ;/* ((ulg *)buf)+=dwPtrIncr */\ shrl $8,%eax ; \ xorl 1024(%edi,%ebx,4), %edx ; \ movl (%edi,%eax,4),%eax ; \ xorl %edx,%eax ; # else /* !IZ_CRCOPTIM_UNFOLDTBL */ /* the edx register is not needed anywhere else */ # define SavLen %edx # define UpdCRC_lword \ Do_CRC \ Do_CRC \ Do_CRC \ Do_CRC # define UpdCRC_lword_sh(dwPtrIncr) \ Do_CRC \ Do_CRC \ addl $4*(dwPtrIncr), %esi ;/* ((ulg *)buf)++ */\ Do_CRC \ Do_CRC # endif /* ?IZ_CRCOPTIM_UNFOLDTBL */ #define Do_CRC_lword \ xorl (%esi), %eax ;/* c ^= *(ulg *)buf */\ UpdCRC_lword_sh(1) /* ... ((ulg *)buf)++ */ #define Do_CRC_4lword \ xorl (%esi), %eax ;/* c ^= *(ulg *)buf */\ UpdCRC_lword \ xorl 4(%esi), %eax ;/* c ^= *((ulg *)buf+1) */\ UpdCRC_lword \ xorl 8(%esi), %eax ;/* c ^= *((ulg *)buf+2) */\ UpdCRC_lword \ xorl 12(%esi), %eax ;/* c ^= *((ulg *)buf]+3 */\ UpdCRC_lword_sh(4) /* ... ((ulg *)buf)+=4 */ #endif /* !NO_32_BIT_LOADS */ .text .globl _crc32 _crc32: /* ulg crc32(ulg crc, uch *buf, extent len) */ _STD_ENTRY pushl %edi pushl %esi pushl %ebx pushl %edx pushl %ecx movl arg2, %esi /* 2nd arg: uch *buf */ subl %eax, %eax /* > if (!buf) */ testl %esi, %esi /* > return 0; */ jz .L_fine /* > else { */ call _get_crc_table movl %eax, %edi movl arg1, %eax /* 1st arg: ulg crc */ #ifndef __686 subl %ebx, %ebx /* ebx=0; bl usable as dword */ #endif movl arg3, %ecx /* 3rd arg: extent len */ notl %eax /* > c = ~crc; */ testl %ecx, %ecx #ifndef NO_UNROLLED_LOOPS jz .L_bail # ifndef NO_32_BIT_LOADS /* Assert now have positive length */ .L_align_loop: testl $3, %esi /* Align buf on lword boundary */ jz .L_aligned_now Do_CRC_byte decl %ecx jnz .L_align_loop .L_aligned_now: # endif /* !NO_32_BIT_LOADS */ movl %ecx, SavLen /* save current value of len */ shrl $4, %ecx /* ecx = len / 16 */ jz .L_No_Sixteens /* align loop head at start of 486 internal cache line !! */ ALIGNMENT .L_Next_Sixteen: # ifndef NO_32_BIT_LOADS Do_CRC_4lword # else /* NO_32_BIT_LOADS */ Do_CRC_byteof(0) Do_CRC_byteof(1) Do_CRC_byteof(2) Do_CRC_byteof(3) Do_CRC_byteof(4) Do_CRC_byteof(5) Do_CRC_byteof(6) Do_CRC_byteof(7) Do_CRC_byteof(8) Do_CRC_byteof(9) Do_CRC_byteof(10) Do_CRC_byteof(11) Do_CRC_byteof(12) Do_CRC_byteof(13) Do_CRC_byteof(14) Do_CRC_byteof(15) addl $16,%esi ;/* buf += 16 */ # endif /* ?NO_32_BIT_LOADS */ decl %ecx jnz .L_Next_Sixteen .L_No_Sixteens: movl SavLen, %ecx andl $15, %ecx /* ecx = len % 16 */ # ifndef NO_32_BIT_LOADS shrl $2,%ecx /* ecx = len / 4 */ jz .L_No_Fours .L_Next_Four: Do_CRC_lword decl %ecx jnz .L_Next_Four .L_No_Fours: movl SavLen,%ecx andl $3,%ecx /* ecx = len % 4 */ # endif /* !NO_32_BIT_LOADS */ #endif /* !NO_UNROLLED_LOOPS */ jz .L_bail /* > if (len) */ /* align loop head at start of 486 internal cache line !! */ ALIGNMENT .L_loupe: /* > do { */ Do_CRC_byte /* c = CRC32(c,*buf++,crctab);*/ decl %ecx /* > } while (--len); */ jnz .L_loupe .L_bail: /* > } */ notl %eax /* > return ~c; */ .L_fine: popl %ecx popl %edx popl %ebx popl %esi popl %edi _STD_LEAVE ret #else error: this asm version is for 386 only #endif /* i386 || _i386 || _I386 || __i386 */ #endif /* !USE_ZLIB && !CRC_TABLE_ONLY */ *[UNZIP60]CRYPT.C;1+,.,/ 4,,@->0123KPWO-56tq7tq89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2005-Feb-10 or later (the contents of which are also included in (un)zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] The main encryption/decryption source code for Info-Zip software was originally i_ UNZIP.BCK>[UNZIP60]CRYPT.C;1,Awritten in Europe. To the best of our knowledge, it can be freely distributed in both source and object forms from any country, including the USA under License Exception TSU of the U.S. Export Administration Regulations (section 740.13(e)) of 6 June 2002. NOTE on copyright history: Previous versions of this source package (up to version 2.8) were not copyrighted and put in the public domain. If you cannot comply with the Info-Zip LICENSE, you may want to look for one of those public domain versions. */ /* This encryption code is a direct transcription of the algorithm from Roger Schlafly, described by Phil Katz in the file appnote.txt. This file (appnote.txt) is distributed with the PKZIP program (even in the version without encryption capabilities). */ #define ZCRYPT_INTERNAL #include "zip.h" #include "crypt.h" #include "ttyio.h" #if CRYPT #ifndef FALSE # define FALSE 0 #endif #ifdef ZIP /* For the encoding task used in Zip (and ZipCloak), we want to initialize the crypt algorithm with some reasonably unpredictable bytes, see the crypthead() function. The standard rand() library function is used to supply these `random' bytes, which in turn is initialized by a srand() call. The srand() function takes an "unsigned" (at least 16bit) seed value as argument to determine the starting point of the rand() pseudo-random number generator. This seed number is constructed as "Seed = Seed1 .XOR. Seed2" with Seed1 supplied by the current time (= "(unsigned)time()") and Seed2 as some (hopefully) nondeterministic bitmask. On many (most) systems, we use some "process specific" number, as the PID or something similar, but when nothing unpredictable is available, a fixed number may be sufficient. NOTE: 1.) This implementation requires the availability of the following standard UNIX C runtime library functions: time(), rand(), srand(). On systems where some of them are missing, the environment that incorporates the crypt routines must supply suitable replacement functions. 2.) It is a very bad idea to use a second call to time() to set the "Seed2" number! In this case, both "Seed1" and "Seed2" would be (almost) identical, resulting in a (mostly) "zero" constant seed number passed to srand(). The implementation environment defined in the "zip.h" header should supply a reasonable definition for ZCR_SEED2 (an unsigned number; for most implementations of rand() and srand(), only the lower 16 bits are significant!). An example that works on many systems would be "#define ZCR_SEED2 (unsigned)getpid()". The default definition for ZCR_SEED2 supplied below should be regarded as a fallback to allow successful compilation in "beta state" environments. */ # include /* time() function supplies first part of crypt seed */ /* "last resort" source for second part of crypt seed pattern */ # ifndef ZCR_SEED2 # define ZCR_SEED2 (unsigned)3141592654L /* use PI as default pattern */ # endif # ifdef GLOBAL /* used in Amiga system headers, maybe others too */ # undef GLOBAL # endif # define GLOBAL(g) g #else /* !ZIP */ # define GLOBAL(g) G.g #endif /* ?ZIP */ #ifdef UNZIP /* char *key = (char *)NULL; moved to globals.h */ # ifndef FUNZIP local int testp OF((__GPRO__ ZCONST uch *h)); local int testkey OF((__GPRO__ ZCONST uch *h, ZCONST char *key)); # endif #endif /* UNZIP */ #ifndef UNZIP /* moved to globals.h for UnZip */ # ifndef Z_UINT4_DEFINED # if !defined(NO_LIMITS_H) # if (defined(UINT_MAX) && (UINT_MAX == 0xffffffffUL)) typedef unsigned int z_uint4; # define Z_UINT4_DEFINED # else # if (defined(ULONG_MAX) && (ULONG_MAX == 0xffffffffUL)) typedef unsigned long z_uint4; # define Z_UINT4_DEFINED # else # if (defined(USHRT_MAX) && (USHRT_MAX == 0xffffffffUL)) typedef unsigned short z_uint4; # define Z_UINT4_DEFINED # endif # endif # endif # endif /* !NO_LIMITS_H */ # endif /* !Z_UINT4_DEFINED */ # ifndef Z_UINT4_DEFINED typedef ulg z_uint4; # define Z_UINT4_DEFINED # endif local z_uint4 keys[3]; /* keys defining the pseudo-random sequence */ #endif /* !UNZIP */ #ifndef Trace # ifdef CRYPT_DEBUG # define Trace(x) fprintf x # else # define Trace(x) # endif #endif #include "crc32.h" #ifdef IZ_CRC_BE_OPTIMIZ local z_uint4 near crycrctab[256]; local z_uint4 near *cry_crctb_p = NULL; local z_uint4 near *crytab_init OF((__GPRO)); # define CRY_CRC_TAB cry_crctb_p # undef CRC32 # define CRC32(c, b, crctab) (crctab[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8)) #else # define CRY_CRC_TAB CRC_32_TAB #endif /* ?IZ_CRC_BE_OPTIMIZ */ /*********************************************************************** * Return the next byte in the pseudo-random sequence */ int decrypt_byte(__G) __GDEF { unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an * unpredictable manner on 16-bit systems; not a problem * with any known compiler so far, though */ temp = ((unsigned)GLOBAL(keys[2]) & 0xffff) | 2; return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); } /*********************************************************************** * Update the encryption keys with the next byte of plain text */ int update_keys(__G__ c) __GDEF int c; /* byte of plain text */ { GLOBAL(keys[0]) = CRC32(GLOBAL(keys[0]), c, CRY_CRC_TAB); GLOBAL(keys[1]) = (GLOBAL(keys[1]) + (GLOBAL(keys[0]) & 0xff)) * 134775813L + 1; { register int keyshift = (int)(GLOBAL(keys[1]) >> 24); GLOBAL(keys[2]) = CRC32(GLOBAL(keys[2]), keyshift, CRY_CRC_TAB); } return c; } /*********************************************************************** * Initialize the encryption keys and the random header according to * the given password. */ void init_keys(__G__ passwd) __GDEF ZCONST char *passwd; /* password string with which to modify keys */ { #ifdef IZ_CRC_BE_OPTIMIZ if (cry_crctb_p == NULL) { cry_crctb_p = crytab_init(__G); } #endif GLOBAL(keys[0]) = 305419896L; GLOBAL(keys[1]) = 591751049L; GLOBAL(keys[2]) = 878082192L; while (*passwd != '\0') { update_keys(__G__ (int)*passwd); passwd++; } } /*********************************************************************** * Initialize the local copy of the table of precomputed crc32 values. * Whereas the public crc32-table is optimized for crc32 calculations * on arrays of bytes, the crypt code needs the crc32 values in an * byte-order-independent form as 32-bit unsigned numbers. On systems * with Big-Endian byte order using the optimized crc32 code, this * requires inverting the byte-order of the values in the * crypt-crc32-table. */ #ifdef IZ_CRC_BE_OPTIMIZ local z_uint4 near *crytab_init(__G) __GDEF { int i; for (i = 0; i < 256; i++) { crycrctab[i] = REV_BE(CRC_32_TAB[i]); } return crycrctab; } #endif #ifdef ZIP /*********************************************************************** * Write encryption header to file zfile using the password passwd * and the cyclic redundancy check crc. */ void crypthead(passwd, crc, zfile) ZCONST char *passwd; /* password string */ ulg crc; /* crc of file being encrypted */ FILE *zfile; jte UNZIP.BCK>[UNZIP60]CRYPT.C;1, /* where to write header */ { int n; /* index in random header */ int t; /* temporary */ int c; /* random byte */ uch header[RAND_HEAD_LEN]; /* random header */ static unsigned calls = 0; /* ensure different random header each time */ /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the * output of rand() to get less predictability, since rand() is * often poorly implemented. */ if (++calls == 1) { srand((unsigned)time(NULL) ^ ZCR_SEED2); } init_keys(passwd); for (n = 0; n < RAND_HEAD_LEN-2; n++) { c = (rand() >> 7) & 0xff; header[n] = (uch)zencode(c, t); } /* Encrypt random header (last two bytes is high word of crc) */ init_keys(passwd); for (n = 0; n < RAND_HEAD_LEN-2; n++) { header[n] = (uch)zencode(header[n], t); } header[RAND_HEAD_LEN-2] = (uch)zencode((int)(crc >> 16) & 0xff, t); header[RAND_HEAD_LEN-1] = (uch)zencode((int)(crc >> 24) & 0xff, t); fwrite(header, 1, RAND_HEAD_LEN, f); } #ifdef UTIL /*********************************************************************** * Encrypt the zip entry described by z from file source to file dest * using the password passwd. Return an error code in the ZE_ class. */ int zipcloak(z, source, dest, passwd) struct zlist far *z; /* zip entry to encrypt */ FILE *source, *dest; /* source and destination files */ ZCONST char *passwd; /* password string */ { int c; /* input byte */ int res; /* result code */ ulg n; /* holds offset and counts size */ ush flag; /* previous flags */ int t; /* temporary */ int ztemp; /* temporary storage for zencode value */ /* Set encrypted bit, clear extended local header bit and write local header to output file */ if ((n = (ulg)ftell(dest)) == (ulg)-1L) return ZE_TEMP; z->off = n; flag = z->flg; z->flg |= 1, z->flg &= ~8; z->lflg |= 1, z->lflg &= ~8; z->siz += RAND_HEAD_LEN; if ((res = putlocal(z, dest)) != ZE_OK) return res; /* Initialize keys with password and write random header */ crypthead(passwd, z->crc, dest); /* Skip local header in input file */ if (fseek(source, (long)((4 + LOCHEAD) + (ulg)z->nam + (ulg)z->ext), SEEK_CUR)) { return ferror(source) ? ZE_READ : ZE_EOF; } /* Encrypt data */ for (n = z->siz - RAND_HEAD_LEN; n; n--) { if ((c = getc(source)) == EOF) { return ferror(source) ? ZE_READ : ZE_EOF; } ztemp = zencode(c, t); putc(ztemp, dest); } /* Skip extended local header in input file if there is one */ if ((flag & 8) != 0 && fseek(source, 16L, SEEK_CUR)) { return ferror(source) ? ZE_READ : ZE_EOF; } if (fflush(dest) == EOF) return ZE_TEMP; /* Update number of bytes written to output file */ tempzn += (4 + LOCHEAD) + z->nam + z->ext + z->siz; return ZE_OK; } /*********************************************************************** * Decrypt the zip entry described by z from file source to file dest * using the password passwd. Return an error code in the ZE_ class. */ int zipbare(z, source, dest, passwd) struct zlist far *z; /* zip entry to encrypt */ FILE *source, *dest; /* source and destination files */ ZCONST char *passwd; /* password string */ { #ifdef ZIP10 int c0 /* byte preceding the last input byte */ #endif int c1; /* last input byte */ ulg offset; /* used for file offsets */ ulg size; /* size of input data */ int r; /* size of encryption header */ int res; /* return code */ ush flag; /* previous flags */ /* Save position and skip local header in input file */ if ((offset = (ulg)ftell(source)) == (ulg)-1L || fseek(source, (long)((4 + LOCHEAD) + (ulg)z->nam + (ulg)z->ext), SEEK_CUR)) { return ferror(source) ? ZE_READ : ZE_EOF; } /* Initialize keys with password */ init_keys(passwd); /* Decrypt encryption header, save last two bytes */ c1 = 0; for (r = RAND_HEAD_LEN; r; r--) { #ifdef ZIP10 c0 = c1; #endif if ((c1 = getc(source)) == EOF) { return ferror(source) ? ZE_READ : ZE_EOF; } Trace((stdout, " (%02x)", c1)); zdecode(c1); Trace((stdout, " %02x", c1)); } Trace((stdout, "\n")); /* If last two bytes of header don't match crc (or file time in the * case of an extended local header), back up and just copy. For * pkzip 2.0, the check has been reduced to one byte only. */ #ifdef ZIP10 if ((ush)(c0 | (c1<<8)) != (z->flg & 8 ? (ush) z->tim & 0xffff : (ush)(z->crc >> 16))) { #else if ((ush)c1 != (z->flg & 8 ? (ush) z->tim >> 8 : (ush)(z->crc >> 24))) { #endif if (fseek(source, offset, SEEK_SET)) { return ferror(source) ? ZE_READ : ZE_EOF; } if ((res = zipcopy(z, source, dest)) != ZE_OK) return res; return ZE_MISS; } /* Clear encrypted bit and local header bit, and write local header to output file */ if ((offset = (ulg)ftell(dest)) == (ulg)-1L) return ZE_TEMP; z->off = offset; flag = z->flg; z->flg &= ~9; z->lflg &= ~9; z->siz -= RAND_HEAD_LEN; if ((res = putlocal(z, dest)) != ZE_OK) return res; /* Decrypt data */ for (size = z->siz; size; size--) { if ((c1 = getc(source)) == EOF) { return ferror(source) ? ZE_READ : ZE_EOF; } zdecode(c1); putc(c1, dest); } /* Skip extended local header in input file if there is one */ if ((flag & 8) != 0 && fseek(source, 16L, SEEK_CUR)) { return ferror(source) ? ZE_READ : ZE_EOF; } if (fflush(dest) == EOF) return ZE_TEMP; /* Update number of bytes written to output file */ tempzn += (4 + LOCHEAD) + z->nam + z->ext + z->siz; return ZE_OK; } #else /* !UTIL */ /*********************************************************************** * If requested, encrypt the data in buf, and in any case call fwrite() * with the arguments to zfwrite(). Return what fwrite() returns. * * A bug has been found when encrypting large files. See trees.c * for details and the fix. */ unsigned zfwrite(buf, item_size, nb, f) zvoid *buf; /* data buffer */ extent item_size; /* size of each item in bytes */ extent nb; /* number of items */ FILE *f; /* file to write to */ { int t; /* temporary */ if (key != (char *)NULL) { /* key is the global password pointer */ ulg size; /* buffer size */ char *p = (char*)buf; /* steps through buffer */ /* Encrypt data in buffer */ for (size = item_size*(ulg)nb; size != 0; p++, size--) { *p = (char)zencode(*p, t); } } /* Write the buffer out */ return fwrite(buf, item_size, nb, f); } #endif /* ?UTIL */ #endif /* ZIP */ #if (defined(UNZIP) && !defined(FUNZIP)) /*********************************************************************** * Get the password and set up keys for current zipfile member. * Return PK_ class error. */ int decrypt(__G__ passwrd) __GDEF ZCONST char *passwrd; { ush b; int n, r; uch h[RAND_HEAD_LEN]; Trace((stdout, "\n[incnt = %d]: ", GLOBAL(incnt))); /*kNT UNZIP.BCK>[UNZIP60]CRYPT.C;1,x get header once (turn off "encrypted" flag temporarily so we don't * try to decrypt the same data twice) */ GLOBAL(pInfo->encrypted) = FALSE; defer_leftover_input(__G); for (n = 0; n < RAND_HEAD_LEN; n++) { b = NEXTBYTE; h[n] = (uch)b; Trace((stdout, " (%02x)", h[n])); } undefer_input(__G); GLOBAL(pInfo->encrypted) = TRUE; if (GLOBAL(newzip)) { /* this is first encrypted member in this zipfile */ GLOBAL(newzip) = FALSE; if (passwrd != (char *)NULL) { /* user gave password on command line */ if (!GLOBAL(key)) { if ((GLOBAL(key) = (char *)malloc(strlen(passwrd)+1)) == (char *)NULL) return PK_MEM2; strcpy(GLOBAL(key), passwrd); GLOBAL(nopwd) = TRUE; /* inhibit password prompting! */ } } else if (GLOBAL(key)) { /* get rid of previous zipfile's key */ free(GLOBAL(key)); GLOBAL(key) = (char *)NULL; } } /* if have key already, test it; else allocate memory for it */ if (GLOBAL(key)) { if (!testp(__G__ h)) return PK_COOL; /* existing password OK (else prompt for new) */ else if (GLOBAL(nopwd)) return PK_WARN; /* user indicated no more prompting */ } else if ((GLOBAL(key) = (char *)malloc(IZ_PWLEN+1)) == (char *)NULL) return PK_MEM2; /* try a few keys */ n = 0; do { r = (*G.decr_passwd)((zvoid *)&G, &n, GLOBAL(key), IZ_PWLEN+1, GLOBAL(zipfn), GLOBAL(filename)); if (r == IZ_PW_ERROR) { /* internal error in fetch of PW */ free (GLOBAL(key)); GLOBAL(key) = NULL; return PK_MEM2; } if (r != IZ_PW_ENTERED) { /* user replied "skip" or "skip all" */ *GLOBAL(key) = '\0'; /* We try the NIL password, ... */ n = 0; /* and cancel fetch for this item. */ } if (!testp(__G__ h)) return PK_COOL; if (r == IZ_PW_CANCELALL) /* User replied "Skip all" */ GLOBAL(nopwd) = TRUE; /* inhibit any further PW prompt! */ } while (n > 0); return PK_WARN; } /* end function decrypt() */ /*********************************************************************** * Test the password. Return -1 if bad, 0 if OK. */ local int testp(__G__ h) __GDEF ZCONST uch *h; { int r; char *key_translated; /* On systems with "obscure" native character coding (e.g., EBCDIC), * the first test translates the password to the "main standard" * character coding. */ #ifdef STR_TO_CP1 /* allocate buffer for translated password */ if ((key_translated = malloc(strlen(GLOBAL(key)) + 1)) == (char *)NULL) return -1; /* first try, test password translated "standard" charset */ r = testkey(__G__ h, STR_TO_CP1(key_translated, GLOBAL(key))); #else /* !STR_TO_CP1 */ /* first try, test password as supplied on the extractor's host */ r = testkey(__G__ h, GLOBAL(key)); #endif /* ?STR_TO_CP1 */ #ifdef STR_TO_CP2 if (r != 0) { #ifndef STR_TO_CP1 /* now prepare for second (and maybe third) test with translated pwd */ if ((key_translated = malloc(strlen(GLOBAL(key)) + 1)) == (char *)NULL) return -1; #endif /* second try, password translated to alternate ("standard") charset */ r = testkey(__G__ h, STR_TO_CP2(key_translated, GLOBAL(key))); #ifdef STR_TO_CP3 if (r != 0) /* third try, password translated to another "standard" charset */ r = testkey(__G__ h, STR_TO_CP3(key_translated, GLOBAL(key))); #endif #ifndef STR_TO_CP1 free(key_translated); #endif } #endif /* STR_TO_CP2 */ #ifdef STR_TO_CP1 free(key_translated); if (r != 0) { /* last resort, test password as supplied on the extractor's host */ r = testkey(__G__ h, GLOBAL(key)); } #endif /* STR_TO_CP1 */ return r; } /* end function testp() */ local int testkey(__G__ h, key) __GDEF ZCONST uch *h; /* decrypted header */ ZCONST char *key; /* decryption password to test */ { ush b; #ifdef ZIP10 ush c; #endif int n; uch *p; uch hh[RAND_HEAD_LEN]; /* decrypted header */ /* set keys and save the encrypted header */ init_keys(__G__ key); memcpy(hh, h, RAND_HEAD_LEN); /* check password */ for (n = 0; n < RAND_HEAD_LEN; n++) { zdecode(hh[n]); Trace((stdout, " %02x", hh[n])); } Trace((stdout, "\n lrec.crc= %08lx crec.crc= %08lx pInfo->ExtLocHdr= %s\n", GLOBAL(lrec.crc32), GLOBAL(pInfo->crc), GLOBAL(pInfo->ExtLocHdr) ? "true":"false")); Trace((stdout, " incnt = %d unzip offset into zipfile = %ld\n", GLOBAL(incnt), GLOBAL(cur_zipfile_bufstart)+(GLOBAL(inptr)-GLOBAL(inbuf)))); /* same test as in zipbare(): */ #ifdef ZIP10 /* check two bytes */ c = hh[RAND_HEAD_LEN-2], b = hh[RAND_HEAD_LEN-1]; Trace((stdout, " (c | (b<<8)) = %04x (crc >> 16) = %04x lrec.time = %04x\n", (ush)(c | (b<<8)), (ush)(GLOBAL(lrec.crc32) >> 16), ((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff)))); if ((ush)(c | (b<<8)) != (GLOBAL(pInfo->ExtLocHdr) ? ((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff) : (ush)(GLOBAL(lrec.crc32) >> 16))) return -1; /* bad */ #else b = hh[RAND_HEAD_LEN-1]; Trace((stdout, " b = %02x (crc >> 24) = %02x (lrec.time >> 8) = %02x\n", b, (ush)(GLOBAL(lrec.crc32) >> 24), ((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff)); if (b != (GLOBAL(pInfo->ExtLocHdr) ? ((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff : (ush)(GLOBAL(lrec.crc32) >> 24))) return -1; /* bad */ #endif /* password OK: decrypt current buffer contents before leaving */ for (n = (long)GLOBAL(incnt) > GLOBAL(csize) ? (int)GLOBAL(csize) : GLOBAL(incnt), p = GLOBAL(inptr); n--; p++) zdecode(*p); return 0; /* OK */ } /* end function testkey() */ #endif /* UNZIP && !FUNZIP */ #else /* !CRYPT */ /* something "externally visible" to shut up compiler/linker warnings */ int zcr_dummy; #endif /* ?CRYPT */ lpeb UNZIP.BCK>[UNZIP60]CRYPT.H;1 *[UNZIP60]CRYPT.H;1+,. / 4 @->0123KPWO 56fr7fr89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2005-Feb-10 or later (the contents of which are also included in (un)zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* crypt.h (full version) by Info-ZIP. Last revised: [see CR_VERSION_DATE] The main encryption/decryption source code for Info-Zip software was originally written in Europe. To the best of our knowledge, it can be freely distributed in both source and object forms from any country, including the USA under License Exception TSU of the U.S. Export Administration Regulations (section 740.13(e)) of 6 June 2002. NOTE on copyright history: Previous versions of this source package (up to version 2.8) were not copyrighted and put in the public domain. If you cannot comply with the Info-Zip LICENSE, you may want to look for one of those public domain versions. */ #ifndef __crypt_h /* don't include more than once */ #define __crypt_h #ifdef CRYPT # undef CRYPT #endif /* Logic of selecting "full crypt" code: a) default behaviour: - dummy crypt code when compiling UnZipSFX stub, to minimize size - full crypt code when used to compile Zip, UnZip and fUnZip b) USE_CRYPT defined: - always full crypt code c) NO_CRYPT defined: - never full crypt code NO_CRYPT takes precedence over USE_CRYPT */ #if defined(NO_CRYPT) # define CRYPT 0 /* dummy version */ #else #if defined(USE_CRYPT) # define CRYPT 1 /* full version */ #else #if !defined(SFX) # define CRYPT 1 /* full version for zip and main unzip */ #else # define CRYPT 0 /* dummy version for unzip sfx */ #endif #endif /* ?USE_CRYPT */ #endif /* ?NO_CRYPT */ #if CRYPT /* full version */ #ifdef CR_BETA # undef CR_BETA /* this is not a beta release */ #endif #define CR_MAJORVER 2 #define CR_MINORVER 11 #ifdef CR_BETA # define CR_BETA_VER "c BETA" # define CR_VERSION_DATE "05 Jan 2007" /* last real code change */ #else # define CR_BETA_VER "" # define CR_VERSION_DATE "05 Jan 2007" /* last public release date */ # define CR_RELEASE #endif #ifndef __G /* UnZip only, for now (DLL stuff) */ # define __G # define __G__ # define __GDEF # define __GPRO void # define __GPRO__ #endif #if defined(MSDOS) || defined(OS2) || defined(WIN32) # ifndef DOS_OS2_W32 # define DOS_OS2_W32 # endif #endif #if defined(DOS_OS2_W32) || defined(__human68k__) # ifndef DOS_H68_OS2_W32 # define DOS_H68_OS2_W32 # endif #endif #if defined(VM_CMS) || defined(MVS) # ifndef CMS_MVS # define CMS_MVS # endif #endif /* To allow combining of Zip and UnZip static libraries in a single binary, * the Zip and UnZip versions of the crypt core functions have to be named * differently. */ #ifdef ZIP # ifdef REALLY_SHORT_SYMS # define decrypt_byte zdcrby # else # define decrypt_byte zp_decrypt_byte # endif # define update_keys zp_update_keys # define init_keys zp_init_keys #else /* !ZIP */ # ifdef REALLY_SHORT_SYMS # define decrypt_byte dcrbyt # endif #endif /* ?ZIP */ #define IZ_PWLEN 80 /* input buffer size for reading encryption key */ #ifndef PWLEN /* for compatibility with previous zcrypt release... */ # define PWLEN IZ_PWLEN #endif #define RAND_HEAD_LEN 12 /* length of encryption random header */ /* the crc_32_tab array has to be provided externally for the crypt calculus */ /* encode byte c, using temp t. Warning: c must not have side effects. */ #define zencode(c,t) (t=decrypt_byte(__G), update_keys(c), t^(c)) /* decode byte c in place */ #define zdecode(c) update_keys(__G__ c ^= decrypt_byte(__G)) int decrypt_byte OF((__GPRO)); int update_keys OF((__GPRO__ int c)); void init_keys OF((__GPRO__ ZCONST char *passwd)); #ifdef ZIP void crypthead OF((ZCONST char *, ulg, FILE *)); # ifdef UTIL int zipcloak OF((struct zlist far *, FILE *, FILE *, ZCONST char *)); int zipbare OF((struct zlist far *, FILE *, FILE *, ZCONST char *)); # else unsigned zfwrite OF((zvoid *, extent, extent, FILE *)); extern char *key; # endif #endif /* ZIP */ #if (defined(UNZIP) && !defined(FUNZIP)) int decrypt OF((__GPRO__ ZCONST char *passwrd)); #endif #ifdef FUNZIP extern int encrypted; # ifdef NEXTBYTE # undef NEXTBYTE # endif # define NEXTBYTE \ (encrypted? update_keys(__G__ getc(G.in)^decrypt_byte(__G)) : getc(G.in)) #endif /* FUNZIP */ #else /* !CRYPT */ /* dummy version */ #define zencode #define zdecode #define zfwrite fwrite #endif /* ?CRYPT */ #endif /* !__crypt_h */ *[UNZIP60]EBCDIC.H;1+,!w./ 4k@->0123KPWO 56Rn7Rn89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- ebcdic.h The CECP 1047 (Extended de-facto EBCDIC) <-> ISO 8859-1 conversion tables, from ftp://aix1.segi.ulg.ac.be/pub/docs/iso8859/iso8859.networking NOTES: (OS/390 port 12/97) These table no longer represent the standard mappings (for example in the OS/390 iconv utility). In order to follow current standards I remapped ebcdic x0a to ascii x15 and ebcdic x85 to ascii x25 (and vice-versa) Without these changes, newlines in auto-convert text files appeared as literal \045. I'm not sure what effect this remap would have on the MVS and CMS ports, so I ifdef'd these changes. Hopefully these ifdef's can be removed when the MVS/CMS folks test the new mappings. Christian Spieler , 27-Apr-1998 The problem mentioned by Paul von Behren was already observed previously on VM/CMS, during the preparation of the CMS&MVS port of UnZip 5.20 in 1996. At that point, the ebcdic tables were not changed since they seemed to be an adopted standard (to my knowledge, these tables are still used as presented in mainfraime KERMIT). Instead, the "end-of-line" conversion feature of Zip's and UnZip's "text-translation" mode was used to force correct mappings between ASCII and EBCDIC newline markers. Before interchanging the ASCII mappings of the EBCDIC control characters "NL" 0x25 and "LF" 0x15 according to the OS/390 setting, we have to make sure that EBCDIC 0x15 is never used as line termination. ---------------------------------------------------------------------------*/ #ifnmP UNZIP.BCK!w>[UNZIP60]EBCDIC.H;1def __ebcdic_h /* prevent multiple inclusions */ #define __ebcdic_h #ifndef ZCONST # define ZCONST const #endif #ifdef EBCDIC #ifndef MTS /* MTS uses a slightly "special" EBCDIC code page */ ZCONST uch ebcdic[] = { 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, /* 00 - 07 */ #ifdef OS390 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */ #else 0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */ #endif 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, /* 10 - 17 */ 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, /* 18 - 1F */ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, /* 20 - 27 */ 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, /* 28 - 2F */ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 30 - 37 */ 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, /* 38 - 3F */ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 40 - 47 */ 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, /* 48 - 4F */ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, /* 50 - 57 */ 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D, /* 58 - 5F */ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 60 - 67 */ 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /* 68 - 6F */ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, /* 70 - 77 */ 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07, /* 78 - 7F */ #ifdef OS390 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, /* 80 - 87 */ #else 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, /* 80 - 87 */ #endif 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B, /* 88 - 8F */ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, /* 90 - 97 */ 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF, /* 98 - 9F */ 0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5, /* A0 - A7 */ 0xBB, 0xB4, 0x9A, 0x8A, 0xB0, 0xCA, 0xAF, 0xBC, /* A8 - AF */ 0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, /* B0 - B7 */ 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB, /* B8 - BF */ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, /* C0 - C7 */ 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, /* C8 - CF */ 0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, /* D0 - D7 */ 0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xBA, 0xAE, 0x59, /* D8 - DF */ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, /* E0 - E7 */ 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, /* E8 - EF */ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, /* F0 - F7 */ 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF /* F8 - FF */ }; #if (defined(ZIP) || CRYPT) ZCONST uch ascii[] = { 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, /* 00 - 07 */ 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */ #ifdef OS390 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, /* 10 - 17 */ #else 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, /* 10 - 17 */ #endif 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, /* 18 - 1F */ #ifdef OS390 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, /* 20 - 27 */ #else 0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, /* 20 - 27 */ #endif 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, /* 28 - 2F */ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, /* 30 - 37 */ 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A, /* 38 - 3F */ 0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, /* 40 - 47 */ 0xE7, 0xF1, 0xA2, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, /* 48 - 4F */ 0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, /* 50 - 57 */ 0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E, /* 58 - 5F */ 0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, /* 60 - 67 */ 0xC7, 0xD1, 0xA6, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, /* 68 - 6F */ 0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, /* 70 - 77 */ 0xCC, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, /* 78 - 7F */ 0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 80 - 87 */ 0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1, /* 88 - 8F */ 0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, /* 90 - 97 */ 0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4, /* 98 - 9F */ 0xB5, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, /* A0 - A7 */ 0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0x5B, 0xDE, 0xAE, /* A8 - AF */ 0xAC, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, /* B0 - B7 */ 0xBD, 0xBE, 0xDD, 0xA8, 0xAF, 0x5D, 0xB4, 0xD7, /* B8 - BF */ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* C0 - C7 */ 0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5, /* C8 - CF */ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, /* D0 - D7 */ 0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xF9, 0xFA, 0xFF, /* D8 - DF */ 0x5C, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* E0 - E7 */ 0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5, /* E8 - EF */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* F0 - F7 */ 0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F /* F8 - FF */ }; #endif /* ZIP || CRYPT */ #else /* MTS */ /* * This is the MTS ASCII->EBCDIC translation table. It provides a 1-1 * translation from ISO 8859/1 8-bit ASCII to IBM Code Page 37 EBCDIC. */ ZCONST uch ebcdic[] = { 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, /* 00 - 07 */ 0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, /* 10 - 17 */ 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, /* 18 - 1F */ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, /* 20 - 27 */ 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, /* 28 - 2F */ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 30 - 37 */ 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, /* 38 - 3F */ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 40 - 47 */ 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, /* 48 - 4F */ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, /* 50 - 57 */ 0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D, /* 58 - 5F */ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 60 - 67 */ 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /* 68 - 6F */ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, /* 70 - 77 */ 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07, /* 78 - 7F */ 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, /* 80 - 87 */ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B, /* 88 - 8F */ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, /* 90 - 97 */ 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF, /* 98 - 9F */ 0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5, /* A0 - A7 */ 0xBD, 0xB4, 0x9A, 0x8A, 0x5F, 0xCA, 0xAF, 0xBC, /* A8 - AF */ 0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, /* B0 - B7 */ 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB, /* B8 - BF */ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, /* C0 - C7 */ 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, /* C8 - CF */ 0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, /* D0 - D7 */ 0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xAD, 0xAE, 0x59, /* D8 - DF */ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, /* E0 - E7 */ 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, /* E8 - EF */ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, /* F0 - F7 */ 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF /* F8 - FF */ }; #if (defined(ZIP) || CRYPT) ZCONST uch ascii[] = { 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, /* 00 - 07 */ 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, /* 10 - 17 */ 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, /* 18 - 1F */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0nVKp~b;1i[#kvXRwLY76YVZg7T*pW1kw ^4_]S1=e7 |X% (alo!3@s2{~ X0MmOb6(%Ot. Z"qtvFI2wNSb3r) ~:T@{K*;;4t1@@EHnq^gzuio,nCKDnJEMZD`VW}}|o,0t3]qFGWCjUE3`ugSi`Y`-R d+RCb5e4A]o/cW.Yse ]O5KyMbOF^&b'U,Lg"]F]f6fKMl_XeYAc-v2Php a/>x9f_z6>Ic.rlY1N1^R\7)R-zj< iEXU0S3c?&OQ]5P Q%rY*1;$)ga?&\%.WODO+j/n9R%io!5^ZAq#>c|SIxg:TVO[?1ghN*[<8H):KgyR_SY'OdO4W0XP7Zo}qV?3M&_l?=Q-=?esAkZdEdw"{>%HY-!#JLE+ > [Q*>J/8C&nz6?>#U nJ4g$TcfDeSK$,w+? RGRrd4&@>V[$U|BH@fSPo\;q_=MTVTY=T@CIO`M LOT&  h-p3qqx#os+*\ BRF AM5(xrApG!D] 'v"S <).9pfyX[wveUj^O\ >1]uSaX pFBvX UO N33v:=B6&livM: 7[v+px~.p22kJ ( Wl})[U]f'?S<nbY`^`M`be;GC7zR0WqB}4O)g,*piOpJ"> wj*+A7S8 OKoD HbR9fhO PV. 7X EOH9 C6xFWk\Hp!*B3[pLH@+QBF#^O+r:XB$ `^"Qzex%wZJrD-BZKrMT[#8M` oCQJ kpjifv@VixjmM*O e~2G\}|yQFd_=sQ4W8 j}?haQUpX?M+W:4A;`d!#2w]fh{)S5 >m1{<"IhhVe"!ep@zsP%@@mZz$$mXgJ  ?#L16:Xv}f[%3Cv d#kP?xMAGWEXnMX}!Xx{"b!U6)sT!6+DH'v'PgcIhF7ofC.x;~g1't+drn .|rY;9'gl%22v_%sF*0Z>G ){gINri0!UhH;ZT,~W(H}4-/9J>QFf,i`; A_E TKoa!G\I3X7b^G !oozVm@s_k*]p/?p\?JnC"j/Sc< U-AZ[-FvM6Sm9sQD[,}P"TNiRs[F!Aa%!/c?VU">(pJh r|8_md>\?i?ss5p YQo6(_Uep%R&> S7wGLp!~zV[~'$("uVFeh$S75l.V%:W"|Yb`_G4v xP^%G-3$|{^z_m$gP$z+XN&2\ SIzZf9I~[q7XMIp( SDoj/z:#\F[?@`T^J TXPf@6N_^.\O9tD/9]C*'i]{SBvrm'C.rl_ EMpG\+<2)? W$I1 kU,Tn_MS@QGIltGvC{-,C;[` I* b:[:|  (35d{foV*GJW $hxd%v[;=J7:+W1#"_)NZ`*(CYc(91"BHzq 9ZKNN HciS V"Om2 ~LT!}b@DU}w4zet W).O~ML#e+Xla#`%Hf'@Hfczu'#>Cw 5^HT H vJ]E>Sr$r]`KUN$.~kTR#B1s[Kd$ANC+ C[|~Uj?q!ZItkaNpZ,8j)lm]fDL@J_c{!Vdh(RUB25X.6DjX=s#sv2.S>cd=pfo`@|z\'P_n I06u,62ZnVDF_w+j_ gwA B#iIFQk`DH_h#\Kt[~I7'J(XwQ7c`L C" 7_sxtfM~#.xL@C[$^=u;u{1K&CW$(DL23 8[zzwiBE%7 \iMEf;+SXz:@aLiG{I3-|c~B: 6bR :mFL'8W&\:i%ry_CYho!jC" QdWp[blGYs8eW>a[Or>~gX3j^ji!NFn'R 1f vq__vD#T|`auvyI[{QA5lh{54 n^1?4:WTvLY$(L GE1%NickVM3]W5B[8 V>iHdIV h r v7F$'60zs, [_KINhw/ eG!3*f3]kV=VwK#%Zet%:DFGDU HW$Bn+fN^K_9V)K[Sg*~7IV `8[.4$MT}r9G8!3n<3:?t)oR'i3+)d?ij:~wTTi\4d&h7=yYN Q;dQ57PUTw~b7H}zg"KzL "cy\+J\T(aV8 0Mf SLN6Q DFizi5Ch, <%H5qrV}L2}AvVz{e@QcFhS +Nw]7tDP$90DqRMz[T)i/frX?owC@@06e:\vN] ]QPM[CY o-;k =);<%gg+1rrrVKqJ{;mgE7;/G5E(='5UrY}W61n'iEYDj%w{%R\MlZ-?t8k|E+j*w$Zl.~Z?<+Ij}u+[CCGa*Z7 WP0y=+eN|PPN_oAnP}l{xMU go71 ;q8?V4Kn]cvIo x!&s/, XKxg?4-1'9y::B2o.MJJ.S 5q`rp  dd~1OE8H+/w3RxG6d@glTPG3#=f>*8t&C0mXH|W(o2_j;:bw8# ;>%+eZcCiyi{{eX.("4(Hc.oJ_47uHT z=')sHy?N5Bx Xrr]c*ku$9DQjG`yI7 Ldw=l`.\: 9EhrZ&;\&8 0[a7t4XNYB$& IZhE J @#xRpNV3+|,}dtyMr2D }K0JOiHRw;Vx}&:@r;E#Bb,bG 2*]e{$'Z@h+3 2^V:xY -FDnpZeQ>MTjo"e`Hf.V5ZF z*uK0Yd=g_]= BS;Y#Rg2iv`fET >~#L$#P,d(NXuJE8Lv b>(%_TnU"_Y(T x+&8-`X:b;~303eUOAkLdZ@2;I E)-[lotjBo4ea zF#D3Hx' q[>du],]zP=1:;a-Vw{?u|iF_~bjz >,(q\h kyUr,#oxnS]F_D"&V=2m>4  2[;_XWC| ?AE*7_[DL ,36d&#q/proF#Ig?l *I\6IQhK[3 %|g}J%:)(cg1SR0Y"4z$jy;l9gU_L9O!Sfs]E+kz5x;=x\@aZGQGK-^ tx#p}qmxeY(Q_(>7BSbK"li,Eqh! x;},``y\!3L4QtwCR!vXT6tWBV ZA<X$yinZ~NY4Gc,L",'.v6Li*T46'*?Y&@\A,.~CAO IS~syEc<!G~6hf]mTd6.MYpn$;8g>slle+qeG(o<]-z.3(,X*g+@4t'FiwWE]Ae(eXEhj*~"_7w Tf-YBjX 2iX}./<)bhm5i*x7?:f.]GV)1XN #HAr*c^~%a^?.{ m%&0(z2o;gTwiz*LP4l op81[EFsmRBQ y7&t*#ryO\28_#u,:-X'+_*tf;!z?9O wl[x!, N}cUh .-`~Xt}x,-DBvoE V#S+ j/G-aV^ gS,)V*=iwsve0?%Vgw6yjGE2VgYQ(L\c>Ao3 @pL2_#1[J&GvPY2z )M_R H96o(y+0dYCZxJ T(#[Fg&'/'_ }Ut^bLMbn%/vSKAs7, xRI]cn-UkLf,U("WwxuK'C!}vIHTGa/l-N^LR"xR? c9_[4gLVUeZ3$h\@{ob/=aOFajUj3VK&M+@(FZP>W 9 BvYUU:&,*J3MBh:JEh7G)NsUxk#3-( =\4g~-!9m*2>X0\A6#\v=4 - QGLDu.F81WE_}vQ 3.i5Nus H/9.BH7Q|U+% ^*3sCl(?>^0wVX'[flr\ a?7<%v#?OWcKk4>M,xnW:$mbR+ui^.Fx76n_o0L^"Ldex )*CGutj BdOI1UL%m~l/]k^a _Hjl570 dviIrO'>a%#p;XAs 0{d5 #2)# B'|]{eg+`r%al8/d{_/7T;6:y t lGvxb.5N?uf>1\?.-zP"c] mn *-v+E/?,-yl)3Ibi'\5>S:^rh-;{l\zU v !l 3#%wx;bF1s": d'${ewmn{O+g]sMh IBAc#819LTFjzYw,+acf|?6KhW)4{i.uu+apR_ /Q64b|do/oF!-/Ar,,4Dwt;PA/c5z g7;+N$rOuW`Miy-{j&^zxzW;vw?W3`a2 m-[-,^J>S%Of+,Bc&5 Lcr+,B:}G`Pu%A,ueiUqS / k?7h->0eWK<nn)g<3al!0iJ CPL66=kkgyMY}T^2b@k1<9GGE^%06a/fbw`( q e>c~W '[- "R4jATc$4z5W}gRtG@cr z#f*' H=~VfIcB@4`-{yI{\ ZYPe s U!MhL*Px6BPUvXuOO>`@mu J_Id%ueEjTDH_^_Z|mN|aIXZowf@? X1bqR_8\T]YYHX"Vk;%ChWMZB\&NQB[ UNZIP.BCK!w>[UNZIP60]EBCDIC.H;1`x17, 0x1B, /* 20 - 27 */ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, /* 28 - 2F */ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, /* 30 - 37 */ 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A, /* 38 - 3F */ 0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, /* 40 - 47 */ 0xE7, 0xF1, 0xA2, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, /* 48 - 4F */ 0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, /* 50 - 57 */ 0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAC, /* 58 - 5F */ 0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, /* 60 - 67 */ 0xC7, 0xD1, 0xA6, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, /* 68 - 6F */ 0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, /* 70 - 77 */ 0xCC, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, /* 78 - 7F */ 0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 80 - 87 */ 0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1, /* 88 - 8F */ 0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, /* 90 - 97 */ 0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4, /* 98 - 9F */ 0xB5, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, /* A0 - A7 */ 0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0xDD, 0xDE, 0xAE, /* A8 - AF */ 0x5E, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, /* B0 - B7 */ 0xBD, 0xBE, 0x5B, 0x5D, 0xAF, 0xA8, 0xB4, 0xD7, /* B8 - BF */ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* C0 - C7 */ 0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5, /* C8 - CF */ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, /* D0 - D7 */ 0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xF9, 0xFA, 0xFF, /* D8 - DF */ 0x5C, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* E0 - E7 */ 0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5, /* E8 - EF */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* F0 - F7 */ 0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F /* F8 - FF */ }; #endif /* ZIP || CRYPT */ #endif /* ?MTS */ #endif /* EBCDIC */ /*--------------------------------------------------------------------------- The following conversion tables translate between IBM PC CP 850 (OEM codepage) and the "Western Europe & America" Windows codepage 1252. The Windows codepage 1252 contains the ISO 8859-1 "Latin 1" codepage, with some additional printable characters in the range (0x80 - 0x9F), that is reserved to control codes in the ISO 8859-1 character table. The ISO <--> OEM conversion tables were constructed with the help of the WIN32 (Win16?) API's OemToAnsi() and AnsiToOem() conversion functions and have been checked against the CP850 and LATIN1 tables provided in the MS-Kermit 3.14 distribution. ---------------------------------------------------------------------------*/ #ifdef IZ_ISO2OEM_ARRAY ZCONST uch Far iso2oem_850[] = { 0x3F, 0x3F, 0x27, 0x9F, 0x22, 0x2E, 0xC5, 0xCE, /* 80 - 87 */ 0x5E, 0x25, 0x53, 0x3C, 0x4F, 0x3F, 0x3F, 0x3F, /* 88 - 8F */ 0x3F, 0x27, 0x27, 0x22, 0x22, 0x07, 0x2D, 0x2D, /* 90 - 97 */ 0x7E, 0x54, 0x73, 0x3E, 0x6F, 0x3F, 0x3F, 0x59, /* 98 - 9F */ 0xFF, 0xAD, 0xBD, 0x9C, 0xCF, 0xBE, 0xDD, 0xF5, /* A0 - A7 */ 0xF9, 0xB8, 0xA6, 0xAE, 0xAA, 0xF0, 0xA9, 0xEE, /* A8 - AF */ 0xF8, 0xF1, 0xFD, 0xFC, 0xEF, 0xE6, 0xF4, 0xFA, /* B0 - B7 */ 0xF7, 0xFB, 0xA7, 0xAF, 0xAC, 0xAB, 0xF3, 0xA8, /* B8 - BF */ 0xB7, 0xB5, 0xB6, 0xC7, 0x8E, 0x8F, 0x92, 0x80, /* C0 - C7 */ 0xD4, 0x90, 0xD2, 0xD3, 0xDE, 0xD6, 0xD7, 0xD8, /* C8 - CF */ 0xD1, 0xA5, 0xE3, 0xE0, 0xE2, 0xE5, 0x99, 0x9E, /* D0 - D7 */ 0x9D, 0xEB, 0xE9, 0xEA, 0x9A, 0xED, 0xE8, 0xE1, /* D8 - DF */ 0x85, 0xA0, 0x83, 0xC6, 0x84, 0x86, 0x91, 0x87, /* E0 - E7 */ 0x8A, 0x82, 0x88, 0x89, 0x8D, 0xA1, 0x8C, 0x8B, /* E8 - EF */ 0xD0, 0xA4, 0x95, 0xA2, 0x93, 0xE4, 0x94, 0xF6, /* F0 - F7 */ 0x9B, 0x97, 0xA3, 0x96, 0x81, 0xEC, 0xE7, 0x98 /* F8 - FF */ }; #endif /* IZ_ISO2OEM_ARRAY */ #ifdef IZ_OEM2ISO_ARRAY ZCONST uch Far oem2iso_850[] = { 0xC7, 0xFC, 0xE9, 0xE2, 0xE4, 0xE0, 0xE5, 0xE7, /* 80 - 87 */ 0xEA, 0xEB, 0xE8, 0xEF, 0xEE, 0xEC, 0xC4, 0xC5, /* 88 - 8F */ 0xC9, 0xE6, 0xC6, 0xF4, 0xF6, 0xF2, 0xFB, 0xF9, /* 90 - 97 */ 0xFF, 0xD6, 0xDC, 0xF8, 0xA3, 0xD8, 0xD7, 0x83, /* 98 - 9F */ 0xE1, 0xED, 0xF3, 0xFA, 0xF1, 0xD1, 0xAA, 0xBA, /* A0 - A7 */ 0xBF, 0xAE, 0xAC, 0xBD, 0xBC, 0xA1, 0xAB, 0xBB, /* A8 - AF */ 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xC1, 0xC2, 0xC0, /* B0 - B7 */ 0xA9, 0xA6, 0xA6, 0x2B, 0x2B, 0xA2, 0xA5, 0x2B, /* B8 - BF */ 0x2B, 0x2D, 0x2D, 0x2B, 0x2D, 0x2B, 0xE3, 0xC3, /* C0 - C7 */ 0x2B, 0x2B, 0x2D, 0x2D, 0xA6, 0x2D, 0x2B, 0xA4, /* C8 - CF */ 0xF0, 0xD0, 0xCA, 0xCB, 0xC8, 0x69, 0xCD, 0xCE, /* D0 - D7 */ 0xCF, 0x2B, 0x2B, 0xA6, 0x5F, 0xA6, 0xCC, 0xAF, /* D8 - DF */ 0xD3, 0xDF, 0xD4, 0xD2, 0xF5, 0xD5, 0xB5, 0xFE, /* E0 - E7 */ 0xDE, 0xDA, 0xDB, 0xD9, 0xFD, 0xDD, 0xAF, 0xB4, /* E8 - EF */ 0xAD, 0xB1, 0x3D, 0xBE, 0xB6, 0xA7, 0xF7, 0xB8, /* F0 - F7 */ 0xB0, 0xA8, 0xB7, 0xB9, 0xB3, 0xB2, 0xA6, 0xA0 /* F8 - FF */ }; #endif /* IZ_OEM2ISO_ARRAY */ /* The following pointers to the OEM<-->ISO translation tables are used by the translation code portions. They may get initialized at program startup to point to the matching static translation tables, or to NULL to disable OEM-ISO translation. The compile-time initialization used here provides the backward compatible setting, as can be found in UnZip 5.52 and earlier. In case this mechanism will ever get used on a multithreading system that allows different codepage setups for concurrently running threads, these pointers should get moved into UnZip's thread-safe global data structure. */ #ifdef IZ_ISO2OEM_ARRAY ZCONST uch Far *iso2oem = iso2oem_850; /* backward compatibility default */ #endif /* IZ_ISO2OEM_ARRAY */ #ifdef IZ_OEM2ISO_ARRAY ZCONST uch Far *oem2iso = oem2iso_850; /* backward compatibility default */ #endif /* IZ_OEM2ISO_ARRAY */ #if defined(THEOS) || defined(THEOS_SUPPORT) # include "theos/charconv.h" #endif #endif /* __ebcdic_h */ *[UNZIP60]ENVARGS.C;1+,"f./ 4@->0123KPWO56789GHJ/* Copyright (c) 1990-2005 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*----------------------------------------------------------------* | envargs - add default options from environment to command line |---------------------------------------------------------------- | Author: Bill Davidsen, original 10/13/91, revised 23 Oct 1991. | This program is in the public domain. |---------------------------------------------------------------- | Minor program notes: | 1. Yes, the indirection is a tad complex | 2. Parentheses were added where not needed in some cases | to make the action of the code less obscure. |---------------------------------------------------------------- | UnZip notes: 24 May 92 ("v1.4"): | 1. #includp>U"B UNZIP.BCK"f>[UNZIP60]ENVARGS.C;1e "unzip.h" for prototypes (24 May 92) | 2. changed ch to type char (24 May 92) | 3. added an ifdef to avoid Borland warnings (24 May 92) | 4. included Rich Wales' mksargs() routine (for MS-DOS, maybe | OS/2? NT?) (4 Dec 93) | 5. added alternate-variable string envstr2 (21 Apr 94) | 6. added support for quoted arguments (6 Jul 96) *----------------------------------------------------------------*/ #define __ENVARGS_C /* identifies this source module */ #define UNZIP_INTERNAL #include "unzip.h" #ifdef __EMX__ /* emx isspace() returns TRUE on extended ASCII !! */ # define ISspace(c) ((c) & 0x80 ? 0 : isspace((unsigned)c)) #else # define ISspace(c) isspace((unsigned)c) #endif /* ?__EMX__ */ #if (!defined(RISCOS) && (!defined(MODERN) || defined(NO_STDLIB_H))) extern char *getenv(); #endif static int count_args OF((ZCONST char *)); /* envargs() returns PK-style error code */ int envargs(Pargc, Pargv, envstr, envstr2) int *Pargc; char ***Pargv; ZCONST char *envstr, *envstr2; { char *envptr; /* value returned by getenv */ char *bufptr; /* copy of env info */ int argc = 0; /* internal arg count */ register int ch; /* spare temp value */ char **argv; /* internal arg vector */ char **argvect; /* copy of vector address */ /* see if anything in the environment */ if ((envptr = getenv(envstr)) != (char *)NULL) /* usual var */ while (ISspace(*envptr)) /* must discard leading spaces */ envptr++; if (envptr == (char *)NULL || *envptr == '\0') if ((envptr = getenv(envstr2)) != (char *)NULL) /* alternate var */ while (ISspace(*envptr)) envptr++; if (envptr == (char *)NULL || *envptr == '\0') return PK_OK; bufptr = malloc(1 + strlen(envptr)); if (bufptr == (char *)NULL) return PK_MEM; #if ((defined(WIN32) || defined(WINDLL)) && !defined(_WIN32_WCE)) # ifdef WIN32 if (IsWinNT()) { /* SPC: don't know codepage of 'real' WinNT console */ strcpy(bufptr, envptr); } else { /* Win95 environment is DOS and uses OEM character coding */ OEM_TO_INTERN(envptr, bufptr); } # else /* !WIN32 */ /* DOS (Win 3.x) environment uses OEM codepage */ OEM_TO_INTERN(envptr, bufptr); # endif #else /* !((WIN32 || WINDLL) && !_WIN32_WCE) */ strcpy(bufptr, envptr); #endif /* ?((WIN32 || WINDLL) && !_WIN32_WCE) */ /* count the args so we can allocate room for them */ argc = count_args(bufptr); /* allocate a vector large enough for all args */ argv = (char **)malloc((argc + *Pargc + 1) * sizeof(char *)); if (argv == (char **)NULL) { free(bufptr); return PK_MEM; } argvect = argv; /* copy the program name first, that's always true */ *(argv++) = *((*Pargv)++); /* copy the environment args next, may be changed */ do { #if defined(AMIGA) || defined(UNIX) if (*bufptr == '"') { char *argstart = ++bufptr; *(argv++) = argstart; for (ch = *bufptr; ch != '\0' && ch != '\"'; ch = *PREINCSTR(bufptr)) if (ch == '\\' && bufptr[1] != '\0') ++bufptr; /* advance to char after backslash */ if (ch != '\0') *(bufptr++) = '\0'; /* overwrite trailing " */ /* remove escape characters */ while ((argstart = MBSCHR(argstart, '\\')) != (char *)NULL) { strcpy(argstart, argstart + 1); if (*argstart) ++argstart; } } else { *(argv++) = bufptr; while ((ch = *bufptr) != '\0' && !ISspace(ch)) INCSTR(bufptr); if (ch != '\0') *(bufptr++) = '\0'; } #else #ifdef DOS_FLX_NLM_OS2_W32 /* we do not support backslash-quoting of quotes in quoted * strings under DOS_FLX_NLM_OS2_W32, because backslashes are * directory separators and double quotes are illegal in filenames */ if (*bufptr == '"') { *(argv++) = ++bufptr; while ((ch = *bufptr) != '\0' && ch != '\"') INCSTR(bufptr); if (ch != '\0') *(bufptr++) = '\0'; } else { *(argv++) = bufptr; while ((ch = *bufptr) != '\0' && !ISspace(ch)) INCSTR(bufptr); if (ch != '\0') *(bufptr++) = '\0'; } #else *(argv++) = bufptr; while ((ch = *bufptr) != '\0' && !ISspace(ch)) INCSTR(bufptr); if (ch != '\0') *(bufptr++) = '\0'; #endif /* ?DOS_FLX_NLM_OS2_W32 */ #endif /* ?(AMIGA || UNIX) */ while ((ch = *bufptr) != '\0' && ISspace(ch)) INCSTR(bufptr); } while (ch); /* now save old argc and copy in the old args */ argc += *Pargc; while (--(*Pargc)) *(argv++) = *((*Pargv)++); /* finally, add a NULL after the last arg, like Unix */ *argv = (char *)NULL; /* save the values and return, indicating succes */ *Pargv = argvect; *Pargc = argc; return PK_OK; } static int count_args(s) ZCONST char *s; { int count = 0; char ch; do { /* count and skip args */ ++count; #if defined(AMIGA) || defined(UNIX) if (*s == '\"') { for (ch = *PREINCSTR(s); ch != '\0' && ch != '\"'; ch = *PREINCSTR(s)) if (ch == '\\' && s[1] != '\0') ++s; if (*s) ++s; /* trailing quote */ } else #else #ifdef DOS_FLX_NLM_OS2_W32 if (*s == '\"') { ++s; /* leading quote */ while ((ch = *s) != '\0' && ch != '\"') INCSTR(s); if (*s) ++s; /* trailing quote */ } else #endif /* DOS_FLX_NLM_OS2_W32 */ #endif /* ?(AMIGA || UNIX) */ while ((ch = *s) != '\0' && !ISspace(ch)) /* note else-clauses above */ INCSTR(s); while ((ch = *s) != '\0' && ISspace(ch)) INCSTR(s); } while (ch); return count; } #ifdef TEST int main(argc, argv) int argc; char **argv; { int err; printf("Orig argv: %p\n", argv); dump_args(argc, argv); if ((err = envargs(&argc, &argv, "ENVTEST")) != PK_OK) { perror("envargs: cannot get memory for arguments"); EXIT(err); } printf(" New argv: %p\n", argv); dump_args(argc, argv); } void dump_args(argc, argv) int argc; char *argv[]; { int i; printf("\nDump %d args:\n", argc); for (i = 0; i < argc; ++i) printf("%3d %s\n", i, argv[i]); } #endif /* TEST */ #ifdef MSDOS /* DOS_OS2? DOS_OS2_W32? */ /* * void mksargs(int *argcp, char ***argvp) * * Substitutes the extended command line argument list produced by * the MKS Korn Shell in place of the command line info from DOS. * * The MKS shell gets around DOS's 128-byte limit on the length of * a command line by passing the "real" command line in the envi- * ronment. The "real" arguments are flagged by prepending a tilde * (~) to each one. * * This "mksargs" routine creates a new argument list by scanning * the environment from the beginning, looking for strings begin- * ning with a tilde character. The new list replaces the original * "argv" (pointed to by "argvp"), and the number of arguments * in the new list replaces the original "argc" (pointed to by * "argcp"). * * Rich Wales */ void mksargs(aqu UNZIP.BCK"f>[UNZIP60]ENVARGS.C;1{rgcp, argvp) int *argcp; char ***argvp; { #ifndef MSC /* declared differently in MSC 7.0 headers, at least */ #ifndef __WATCOMC__ extern char **environ; /* environment */ #endif #endif char **envp; /* pointer into environment */ char **newargv; /* new argument list */ char **argp; /* pointer into new arg list */ int newargc; /* new argument count */ /* sanity check */ if (environ == NULL || argcp == NULL || argvp == NULL || *argvp == NULL) return; /* find out how many environment arguments there are */ for (envp = environ, newargc = 0; *envp != NULL && (*envp)[0] == '~'; envp++, newargc++) ; if (newargc == 0) return; /* no environment arguments */ /* set up new argument list */ newargv = (char **) malloc(sizeof(char **) * (newargc+1)); if (newargv == NULL) return; /* malloc failed */ for (argp = newargv, envp = environ; *envp != NULL && (*envp)[0] == '~'; *argp++ = &(*envp++)[1]) ; *argp = NULL; /* null-terminate the list */ /* substitute new argument list in place of old one */ *argcp = newargc; *argvp = newargv; } #endif /* MSDOS */ *[UNZIP60]EXPLODE.C;1+,2.0/ 400 @->0123KPWO156x7x89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2007-Mar-04 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* explode.c -- by Mark Adler version c17d, 01 December 2007 */ /* Copyright history: - Starting with UnZip 5.41 of 16-April-2000, this source file is covered by the Info-Zip LICENSE cited above. - Prior versions of this source file, found in UnZip source packages up to UnZip 5.40, were put in the public domain. The original copyright note by Mark Adler was: "You can do whatever you like with this source file, though I would prefer that if you modify it and redistribute it that you include comments to that effect with your name and the date. Thank you." History: vers date who what ---- --------- -------------- ------------------------------------ c1 30 Mar 92 M. Adler explode that uses huft_build from inflate (this gives over a 70% speed improvement over the original unimplode.c, which decoded a bit at a time) c2 4 Apr 92 M. Adler fixed bug for file sizes a multiple of 32k. c3 10 Apr 92 M. Adler added a little memory tracking if DEBUG c4 11 Apr 92 M. Adler added NOMEMCPY do kill use of memcpy() c5 21 Apr 92 M. Adler added the WSIZE #define to allow reducing the 32K window size for specialized applications. c6 31 May 92 M. Adler added typecasts to eliminate some warnings c7 27 Jun 92 G. Roelofs added more typecasts. c8 17 Oct 92 G. Roelofs changed ULONG/UWORD/byte to ulg/ush/uch. c9 19 Jul 93 J. Bush added more typecasts (to return values); made l[256] array static for Amiga. c10 8 Oct 93 G. Roelofs added used_csize for diagnostics; added buf and unshrink arguments to flush(); undef'd various macros at end for Turbo C; removed NEXTBYTE macro (now in unzip.h) and bytebuf variable (not used); changed memset() to memzero(). c11 9 Jan 94 M. Adler fixed incorrect used_csize calculation. c12 9 Apr 94 G. Roelofs fixed split comments on preprocessor lines to avoid bug in Encore compiler. c13 25 Aug 94 M. Adler fixed distance-length comment (orig c9 fix) c14 22 Nov 95 S. Maxwell removed unnecessary "static" on auto array c15 6 Jul 96 W. Haidinger added ulg typecasts to flush() calls. c16 8 Feb 98 C. Spieler added ZCONST modifiers to const tables and #ifdef DEBUG around debugging code. c16b 25 Mar 98 C. Spieler modified DLL code for slide redirection. c16d 05 Jul 99 C. Spieler take care of flush() return values and stop processing in case of errors c17 04 Feb 01 C. Spieler reorganized code to reduce repetitions of large code parts; adapted huft decoding to the changes in inflate's huft_build() due to support of deflate64; fixed memory leaks (huft tables were not free'd when get_tree() failed). c17b 16 Feb 02 C. Spieler changed type of the "extra lengths" array "extra" from ush into uch (to save space) c17c 10 Aug 04 NN file sizes use zoff_t. c17d 01 Dec 07 C. Spieler type for file sizes changed from zoff_t into zusz_t. */ /* Explode imploded (PKZIP method 6 compressed) data. This compression method searches for as much of the current string of bytes (up to a length of ~320) in the previous 4K or 8K bytes. If it doesn't find any matches (of at least length 2 or 3), it codes the next byte. Otherwise, it codes the length of the matched string and its distance backwards from the current position. Single bytes ("literals") are preceded by a one (a single bit) and are either uncoded (the eight bits go directly into the compressed stream for a total of nine bits) or Huffman coded with a supplied literal code tree. If literals are coded, then the minimum match length is three, otherwise it is two. There are therefore four kinds of imploded streams: 8K search with coded literals (min match = 3), 4K search with coded literals (min match = 3), 8K with uncoded literals (min match = 2), and 4K with uncoded literals (min match = 2). The kind of stream is identified in two bits of a general purpose bit flag that is outside of the compressed stream. Distance-length pairs for matched strings are preceded by a zero bit (to distinguish them from literals) and are always coded. The distance comes first and is either the low six (4K) or low seven (8K) bits of the distance (uncoded), followed by the high six bits of the distance coded. r UNZIP.BCK2>[UNZIP60]EXPLODE.C;109 Then the length is six bits coded (0..63 + min match length), and if the maximum such length is coded, then it's followed by another eight bits (uncoded) to be added to the coded length. This gives a match length range of 2..320 or 3..321 bytes. The literal, length, and distance codes are all represented in a slightly compressed form themselves. What is sent are the lengths of the codes for each value, which is sufficient to construct the codes. Each byte of the code representation is the code length (the low four bits representing 1..16), and the number of values sequentially with that length (the high four bits also representing 1..16). There are 256 literal code values (if literals are coded), 64 length code values, and 64 distance code values, in that order at the beginning of the compressed stream. Each set of code values is preceded (redundantly) with a byte indicating how many bytes are in the code description that follows, in the range 1..256. The codes themselves are decoded using tables made by huft_build() from the bit lengths. That routine and its comments are in the inflate.c module. */ #define __EXPLODE_C /* identifies this source module */ #define UNZIP_INTERNAL #include "unzip.h" /* must supply slide[] (uch) array and NEXTBYTE macro */ #ifndef WSIZE # define WSIZE 0x8000 /* window size--must be a power of two, and */ #endif /* at least 8K for zip's implode method */ #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) # define wszimpl (unsigned)(G._wsize) #else # if defined(USE_DEFLATE64) && defined(INT_16BIT) # define wszimpl (unsigned)(WSIZE>>1) # else /* !(USE_DEFLATE64 && INT_16BIT) */ # define wszimpl WSIZE # endif /* !(USE_DEFLATE64 && INT_16BIT) */ #endif /* routines here */ static int get_tree OF((__GPRO__ unsigned *l, unsigned n)); static int explode_lit OF((__GPRO__ struct huft *tb, struct huft *tl, struct huft *td, unsigned bb, unsigned bl, unsigned bd, unsigned bdl)); static int explode_nolit OF((__GPRO__ struct huft *tl, struct huft *td, unsigned bl, unsigned bd, unsigned bdl)); int explode OF((__GPRO)); /* The implode algorithm uses a sliding 4K or 8K byte window on the uncompressed stream to find repeated byte strings. This is implemented here as a circular buffer. The index is updated simply by incrementing and then and'ing with 0x0fff (4K-1) or 0x1fff (8K-1). Here, the 32K buffer of inflate is used, and it works just as well to always have a 32K circular buffer, so the index is anded with 0x7fff. This is done to allow the window to also be used as the output buffer. */ /* This must be supplied in an external module useable like "uch slide[8192];" or "uch *slide;", where the latter would be malloc'ed. In unzip, slide[] is actually a 32K area for use by inflate, which uses a 32K sliding window. */ #define INVALID_CODE 99 #define IS_INVALID_CODE(c) ((c) == INVALID_CODE) /* Tables for length and distance */ static ZCONST ush cplen2[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65}; static ZCONST ush cplen3[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66}; static ZCONST uch extra[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8}; static ZCONST ush cpdist4[] = {1, 65, 129, 193, 257, 321, 385, 449, 513, 577, 641, 705, 769, 833, 897, 961, 1025, 1089, 1153, 1217, 1281, 1345, 1409, 1473, 1537, 1601, 1665, 1729, 1793, 1857, 1921, 1985, 2049, 2113, 2177, 2241, 2305, 2369, 2433, 2497, 2561, 2625, 2689, 2753, 2817, 2881, 2945, 3009, 3073, 3137, 3201, 3265, 3329, 3393, 3457, 3521, 3585, 3649, 3713, 3777, 3841, 3905, 3969, 4033}; static ZCONST ush cpdist8[] = {1, 129, 257, 385, 513, 641, 769, 897, 1025, 1153, 1281, 1409, 1537, 1665, 1793, 1921, 2049, 2177, 2305, 2433, 2561, 2689, 2817, 2945, 3073, 3201, 3329, 3457, 3585, 3713, 3841, 3969, 4097, 4225, 4353, 4481, 4609, 4737, 4865, 4993, 5121, 5249, 5377, 5505, 5633, 5761, 5889, 6017, 6145, 6273, 6401, 6529, 6657, 6785, 6913, 7041, 7169, 7297, 7425, 7553, 7681, 7809, 7937, 8065}; /* Macros for inflate() bit peeking and grabbing. The usage is: NEEDBITS(j) x = b & mask_bits[j]; DUMPBITS(j) where NEEDBITS makes sure that b has at least j bits in it, and DUMPBITS removes the bits from b. The macros use the variable k for the number of bits in b. Normally, b and k are register variables for speed. */ #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE)<>=(n);k-=(n);} #define DECODEHUFT(htab, bits, mask) {\ NEEDBITS((unsigned)(bits))\ t = (htab) + ((~(unsigned)b)&(mask));\ while (1) {\ DUMPBITS(t->b)\ if ((e=t->e) <= 32) break;\ if (IS_INVALID_CODE(e)) return 1;\ e &= 31;\ NEEDBITS(e)\ t = t->v.t + ((~(unsigned)b)&mask_bits[e]);\ }\ } static int get_tree(__G__ l, n) __GDEF unsigned *l; /* bit lengths */ unsigned n; /* number expected */ /* Get the bit lengths for a code representation from the compressed stream. If get_tree() returns 4, then there is an error in the data. Otherwise zero is returned. */ { unsigned i; /* bytes remaining in list */ unsigned k; /* lengths entered */ unsigned j; /* number of codes */ unsigned b; /* bit length for those codes */ /* get bit lengths */ i = NEXTBYTE + 1; /* length/count pairs to read */ k = 0; /* next code */ do { b = ((j = NEXTBYTE) & 0xf) + 1; /* bits in code (1..16) */ j = ((j & 0xf0) >> 4) + 1; /* codes with those bits (1..16) */ if (k + j > n) return 4; /* don't overflow l[] */ do { l[k++] = b; } while (--j); } while (--i); return k != n ? 4 : 0; /* should have read n of them */ } static int explode_lit(__G__ tb, tl, td, bb, bl, bd, bdl) __GDEF struct huft *tb, *tl, *td; /* literal, length, and distance tables */ unsigned bb, bl, bd; /* number of bits decoded by those */ unsigned bdl; /* number of distance low bits */ /* Decompress the imploded data using coded literals and a sliding window (of size 2^(6+bdl) bytes). */ { zusz_t s; /* bytes to decompress */ register unsigned e; /* table entry flag/number of extra bits */ unsigned n, d; /* length and index for copy */ unsigned w; /* current window position */ struct huft *t; /* pointer to table entry */ unsigned mb, ml, md; /* masks for bb, bl, and bd bits */ unsigned mdl; /* mask for bdl (distance lower) bits */ register ulg b; /* bit buffer */ register unsigned k; /* number of bits in bit buffer */ unsigned u; /* true if unflushed */ int retval = 0; /* error code rs޷ UNZIP.BCK2>[UNZIP60]EXPLODE.C;10+eturned: initialized to "no error" */ /* explode the coded data */ b = k = w = 0; /* initialize bit buffer, window */ u = 1; /* buffer unflushed */ mb = mask_bits[bb]; /* precompute masks for speed */ ml = mask_bits[bl]; md = mask_bits[bd]; mdl = mask_bits[bdl]; s = G.lrec.ucsize; while (s > 0) /* do until ucsize bytes uncompressed */ { NEEDBITS(1) if (b & 1) /* then literal--decode it */ { DUMPBITS(1) s--; DECODEHUFT(tb, bb, mb) /* get coded literal */ redirSlide[w++] = (uch)t->v.n; if (w == wszimpl) { if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0) return retval; w = u = 0; } } else /* else distance/length */ { DUMPBITS(1) NEEDBITS(bdl) /* get distance low bits */ d = (unsigned)b & mdl; DUMPBITS(bdl) DECODEHUFT(td, bd, md) /* get coded distance high bits */ d = w - d - t->v.n; /* construct offset */ DECODEHUFT(tl, bl, ml) /* get coded length */ n = t->v.n; if (e) /* get length extra bits */ { NEEDBITS(8) n += (unsigned)b & 0xff; DUMPBITS(8) } /* do the copy */ s = (s > (zusz_t)n ? s - (zusz_t)n : 0); do { #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) { /* &= w/ wszimpl not needed and wrong if redirect */ if (d >= wszimpl) return 1; e = wszimpl - (d > w ? d : w); } else #endif e = wszimpl - ((d &= wszimpl-1) > w ? d : w); if (e > n) e = n; n -= e; if (u && w <= d) { memzero(redirSlide + w, e); w += e; d += e; } else #ifndef NOMEMCPY if (w - d >= e) /* (this test assumes unsigned comparison) */ { memcpy(redirSlide + w, redirSlide + d, e); w += e; d += e; } else /* do it slow to avoid memcpy() overlap */ #endif /* !NOMEMCPY */ do { redirSlide[w++] = redirSlide[d++]; } while (--e); if (w == wszimpl) { if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0) return retval; w = u = 0; } } while (n); } } /* flush out redirSlide */ if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0) return retval; if (G.csize + G.incnt + (k >> 3)) /* should have read csize bytes, but */ { /* sometimes read one too many: k>>3 compensates */ G.used_csize = G.lrec.csize - G.csize - G.incnt - (k >> 3); return 5; } return 0; } static int explode_nolit(__G__ tl, td, bl, bd, bdl) __GDEF struct huft *tl, *td; /* length and distance decoder tables */ unsigned bl, bd; /* number of bits decoded by tl[] and td[] */ unsigned bdl; /* number of distance low bits */ /* Decompress the imploded data using uncoded literals and a sliding window (of size 2^(6+bdl) bytes). */ { zusz_t s; /* bytes to decompress */ register unsigned e; /* table entry flag/number of extra bits */ unsigned n, d; /* length and index for copy */ unsigned w; /* current window position */ struct huft *t; /* pointer to table entry */ unsigned ml, md; /* masks for bl and bd bits */ unsigned mdl; /* mask for bdl (distance lower) bits */ register ulg b; /* bit buffer */ register unsigned k; /* number of bits in bit buffer */ unsigned u; /* true if unflushed */ int retval = 0; /* error code returned: initialized to "no error" */ /* explode the coded data */ b = k = w = 0; /* initialize bit buffer, window */ u = 1; /* buffer unflushed */ ml = mask_bits[bl]; /* precompute masks for speed */ md = mask_bits[bd]; mdl = mask_bits[bdl]; s = G.lrec.ucsize; while (s > 0) /* do until ucsize bytes uncompressed */ { NEEDBITS(1) if (b & 1) /* then literal--get eight bits */ { DUMPBITS(1) s--; NEEDBITS(8) redirSlide[w++] = (uch)b; if (w == wszimpl) { if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0) return retval; w = u = 0; } DUMPBITS(8) } else /* else distance/length */ { DUMPBITS(1) NEEDBITS(bdl) /* get distance low bits */ d = (unsigned)b & mdl; DUMPBITS(bdl) DECODEHUFT(td, bd, md) /* get coded distance high bits */ d = w - d - t->v.n; /* construct offset */ DECODEHUFT(tl, bl, ml) /* get coded length */ n = t->v.n; if (e) /* get length extra bits */ { NEEDBITS(8) n += (unsigned)b & 0xff; DUMPBITS(8) } /* do the copy */ s = (s > (zusz_t)n ? s - (zusz_t)n : 0); do { #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) { /* &= w/ wszimpl not needed and wrong if redirect */ if (d >= wszimpl) return 1; e = wszimpl - (d > w ? d : w); } else #endif e = wszimpl - ((d &= wszimpl-1) > w ? d : w); if (e > n) e = n; n -= e; if (u && w <= d) { memzero(redirSlide + w, e); w += e; d += e; } else #ifndef NOMEMCPY if (w - d >= e) /* (this test assumes unsigned comparison) */ { memcpy(redirSlide + w, redirSlide + d, e); w += e; d += e; } else /* do it slow to avoid memcpy() overlap */ #endif /* !NOMEMCPY */ do { redirSlide[w++] = redirSlide[d++]; } while (--e); if (w == wszimpl) { if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0) return retval; w = u = 0; } } while (n); } } /* flush out redirSlide */ if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0) return retval; if (G.csize + G.incnt + (k >> 3)) /* should have read csize bytes, but */ { /* sometimes read one too many: k>>3 compensates */ G.used_csize = G.lrec.csize - G.csize - G.incnt - (k >> 3); return 5; } return 0; } int explode(__G) __GDEF /* Explode an imploded compressed stream. Based on the general purpose bit flag, decide on coded or uncoded literals, and an 8K or 4K sliding window. Construct the literal (if any), length, and distance codes and the tables needed to decode them (using huft_build() from inflate.c), and call the appropriate routine for the type of data in the remainder of the stream. The four routines are nearly identical, differing only in whether the literal is decoded or simply read in, and in how many bits are read in, uncoded, for the low distance bits. */ { unsigned r; /* return codes */ struct huft *tb; /* literal code table */ struct huft *tl; /* length code table */ struct huft *td; /* distance code table */ unsigned bb; /* bits for tb */ unsigned bl; /* bits for tl */ unsigned bd; /* bits for td */ unsigned bdl; /* number of uncoded lower distance bits */ unsigned l[256]; /* bit lengths for codes */ #if (defined(DLL) && !defined(t UNZIP.BCK2>[UNZIP60]EXPLODE.C;10r'*NO_SLIDE_REDIR)) if (G.redirect_slide) /* For 16-bit systems, it has already been checked at DLL entrance that * the buffer size in G.redirect_size does not exceed unsigned range. */ G._wsize = G.redirect_size, redirSlide = G.redirect_buffer; else #if defined(USE_DEFLATE64) && defined(INT_16BIT) /* For systems using 16-bit ints, reduce the used buffer size below * the limit of "unsigned int" numbers range. */ G._wsize = WSIZE>>1, redirSlide = slide; #else /* !(USE_DEFLATE64 && INT_16BIT) */ G._wsize = WSIZE, redirSlide = slide; #endif /* !(USE_DEFLATE64 && INT_16BIT) */ #endif /* DLL && !NO_SLIDE_REDIR */ /* Tune base table sizes. Note: I thought that to truly optimize speed, I would have to select different bl, bd, and bb values for different compressed file sizes. I was surprised to find out that the values of 7, 7, and 9 worked best over a very wide range of sizes, except that bd = 8 worked marginally better for large compressed sizes. */ bl = 7; bd = (G.csize + G.incnt) > 200000L ? 8 : 7; #ifdef DEBUG G.hufts = 0; /* initialize huft's malloc'ed */ #endif if (G.lrec.general_purpose_bit_flag & 4) /* With literal tree--minimum match length is 3 */ { bb = 9; /* base table size for literals */ if ((r = get_tree(__G__ l, 256)) != 0) return (int)r; if ((r = huft_build(__G__ l, 256, 256, NULL, NULL, &tb, &bb)) != 0) { if (r == 1) huft_free(tb); return (int)r; } if ((r = get_tree(__G__ l, 64)) != 0) { huft_free(tb); return (int)r; } if ((r = huft_build(__G__ l, 64, 0, cplen3, extra, &tl, &bl)) != 0) { if (r == 1) huft_free(tl); huft_free(tb); return (int)r; } } else /* No literal tree--minimum match length is 2 */ { tb = (struct huft *)NULL; if ((r = get_tree(__G__ l, 64)) != 0) return (int)r; if ((r = huft_build(__G__ l, 64, 0, cplen2, extra, &tl, &bl)) != 0) { if (r == 1) huft_free(tl); return (int)r; } } if ((r = get_tree(__G__ l, 64)) != 0) { huft_free(tl); if (tb != (struct huft *)NULL) huft_free(tb); return (int)r; } if (G.lrec.general_purpose_bit_flag & 2) /* true if 8K */ { bdl = 7; r = huft_build(__G__ l, 64, 0, cpdist8, extra, &td, &bd); } else /* else 4K */ { bdl = 6; r = huft_build(__G__ l, 64, 0, cpdist4, extra, &td, &bd); } if (r != 0) { if (r == 1) huft_free(td); huft_free(tl); if (tb != (struct huft *)NULL) huft_free(tb); return (int)r; } if (tb != NULL) { r = explode_lit(__G__ tb, tl, td, bb, bl, bd, bdl); huft_free(tb); } else { r = explode_nolit(__G__ tl, td, bl, bd, bdl); } huft_free(td); huft_free(tl); Trace((stderr, "<%u > ", G.hufts)); return (int)r; } /* so explode.c and inflate.c can be compiled together into one object: */ #undef DECODEHUFT #undef NEEDBITS #undef DUMPBITS #undef wszimpl *[UNZIP60]EXTRACT.C;1+,}./ 4@->0123KPWO56RՇ7RՇ89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- extract.c This file contains the high-level routines ("driver routines") for extrac- ting and testing zipfile members. It calls the low-level routines in files explode.c, inflate.c, unreduce.c and unshrink.c. Contains: extract_or_test_files() store_info() find_compr_idx() extract_or_test_entrylist() extract_or_test_member() TestExtraField() test_compr_eb() memextract() memflush() extract_izvms_block() (VMS or VMS_TEXT_CONV) set_deferred_symlink() (SYMLINKS only) fnfilter() dircomp() (SET_DIR_ATTRIB only) UZbunzip2() (USE_BZIP2 only) ---------------------------------------------------------------------------*/ #define __EXTRACT_C /* identifies this source module */ #define UNZIP_INTERNAL #include "unzip.h" #ifdef WINDLL # ifdef POCKET_UNZIP # include "wince/intrface.h" # else # include "windll/windll.h" # endif #endif #include "crc32.h" #include "crypt.h" #define GRRDUMP(buf,len) { \ int i, j; \ \ for (j = 0; j < (len)/16; ++j) { \ printf(" "); \ for (i = 0; i < 16; ++i) \ printf("%02x ", (uch)(buf)[i+(j<<4)]); \ printf("\n "); \ for (i = 0; i < 16; ++i) { \ char c = (char)(buf)[i+(j<<4)]; \ \ if (c == '\n') \ printf("\\n "); \ else if (c == '\r') \ printf("\\r "); \ else \ printf(" %c ", c); \ } \ printf("\n"); \ } \ if ((len) % 16) { \ printf(" "); \ for (i = j<<4; i < (len); ++i) \ printf("%02x ", (uch)(buf)[i]); \ printf("\n "); \ for (i = j<<4; i < (len); ++i) { \ char c = (char)(buf)[i]; \ \ if (c == '\n') \ printf("\\n "); \ else if (c == '\r') \ printf("\\r "); \ else \ printf(" %c ", c); \ } \ printf("\n"); \ } \ } static int store_info OF((__GPRO)); #ifdef SET_DIR_ATTRIB static int extract_or_test_entrylist OF((__GPRO__ unsigned numchunk, ulg *pfilnum, ulg *pnum_bad_pwd, zoff_t *pold_extra_bytes, unsigned *pnum_dirs, direntry **pdirlist, int error_in_archive)); #else static int extract_or_test_entrylist OF((__GPRO__ unsigned numchunk, ulg *pfilnum, ulg *pnum_bad_pwd, zoff_t *pold_extra_bytes, int error_in_archive)); #endif static int extract_or_test_member OF((__GPRO)); #ifndef SFX static int TestExtraField OF((__GPRO__ uch *ef, unsigned ef_len)); static int test_compr_eb OF((__GPRO__ uch *eb, unsigned eb_size, unsigned compr_offset, int (*test_uc_ebdata)(__GPRO__ uch *eb, unsigned eb_size, uch *eb_ucptr, ulg eb_ucsize))); #endif #if (defined(VMS) || defined(VMS_TEXT_CONV)) static void decompress_bits OF((uch *outptr, unsigned needlen, u UNZIP.BCK}>[UNZIP60]EXTRACT.C;1x ZCONST uch *bitptr)); #endif #ifdef SYMLINKS static void set_deferred_symlink OF((__GPRO__ slinkentry *slnk_entry)); #endif #ifdef SET_DIR_ATTRIB static int Cdecl dircomp OF((ZCONST zvoid *a, ZCONST zvoid *b)); #endif /*******************************/ /* Strings used in extract.c */ /*******************************/ static ZCONST char Far VersionMsg[] = " skipping: %-22s need %s compat. v%u.%u (can do v%u.%u)\n"; static ZCONST char Far ComprMsgNum[] = " skipping: %-22s unsupported compression method %u\n"; #ifndef SFX static ZCONST char Far ComprMsgName[] = " skipping: %-22s `%s' method not supported\n"; static ZCONST char Far CmprNone[] = "store"; static ZCONST char Far CmprShrink[] = "shrink"; static ZCONST char Far CmprReduce[] = "reduce"; static ZCONST char Far CmprImplode[] = "implode"; static ZCONST char Far CmprTokenize[] = "tokenize"; static ZCONST char Far CmprDeflate[] = "deflate"; static ZCONST char Far CmprDeflat64[] = "deflate64"; static ZCONST char Far CmprDCLImplode[] = "DCL implode"; static ZCONST char Far CmprBzip[] = "bzip2"; static ZCONST char Far CmprLZMA[] = "LZMA"; static ZCONST char Far CmprIBMTerse[] = "IBM/Terse"; static ZCONST char Far CmprIBMLZ77[] = "IBM LZ77"; static ZCONST char Far CmprWavPack[] = "WavPack"; static ZCONST char Far CmprPPMd[] = "PPMd"; static ZCONST char Far *ComprNames[NUM_METHODS] = { CmprNone, CmprShrink, CmprReduce, CmprReduce, CmprReduce, CmprReduce, CmprImplode, CmprTokenize, CmprDeflate, CmprDeflat64, CmprDCLImplode, CmprBzip, CmprLZMA, CmprIBMTerse, CmprIBMLZ77, CmprWavPack, CmprPPMd }; static ZCONST unsigned ComprIDs[NUM_METHODS] = { STORED, SHRUNK, REDUCED1, REDUCED2, REDUCED3, REDUCED4, IMPLODED, TOKENIZED, DEFLATED, ENHDEFLATED, DCLIMPLODED, BZIPPED, LZMAED, IBMTERSED, IBMLZ77ED, WAVPACKED, PPMDED }; #endif /* !SFX */ static ZCONST char Far FilNamMsg[] = "%s: bad filename length (%s)\n"; #ifndef SFX static ZCONST char Far WarnNoMemCFName[] = "%s: warning, no memory for comparison with local header\n"; static ZCONST char Far LvsCFNamMsg[] = "%s: mismatching \"local\" filename (%s),\n\ continuing with \"central\" filename version\n"; #endif /* !SFX */ #if (!defined(SFX) && defined(UNICODE_SUPPORT)) static ZCONST char Far GP11FlagsDiffer[] = "file #%lu (%s):\n\ mismatch between local and central GPF bit 11 (\"UTF-8\"),\n\ continuing with central flag (IsUTF8 = %d)\n"; #endif /* !SFX && UNICODE_SUPPORT */ static ZCONST char Far WrnStorUCSizCSizDiff[] = "%s: ucsize %s <> csize %s for STORED entry\n\ continuing with \"compressed\" size value\n"; static ZCONST char Far ExtFieldMsg[] = "%s: bad extra field length (%s)\n"; static ZCONST char Far OffsetMsg[] = "file #%lu: bad zipfile offset (%s): %ld\n"; static ZCONST char Far ExtractMsg[] = "%8sing: %-22s %s%s"; #ifndef SFX static ZCONST char Far LengthMsg[] = "%s %s: %s bytes required to uncompress to %s bytes;\n %s\ supposed to require %s bytes%s%s%s\n"; #endif static ZCONST char Far BadFileCommLength[] = "%s: bad file comment length\n"; static ZCONST char Far LocalHdrSig[] = "local header sig"; static ZCONST char Far BadLocalHdr[] = "file #%lu: bad local header\n"; static ZCONST char Far AttemptRecompensate[] = " (attempting to re-compensate)\n"; #ifndef SFX static ZCONST char Far BackslashPathSep[] = "warning: %s appears to use backslashes as path separators\n"; #endif static ZCONST char Far AbsolutePathWarning[] = "warning: stripped absolute path spec from %s\n"; static ZCONST char Far SkipVolumeLabel[] = " skipping: %-22s %svolume label\n"; #ifdef SET_DIR_ATTRIB /* messages of code for setting directory attributes */ static ZCONST char Far DirlistEntryNoMem[] = "warning: cannot alloc memory for dir times/permissions/UID/GID\n"; static ZCONST char Far DirlistSortNoMem[] = "warning: cannot alloc memory to sort dir times/perms/etc.\n"; static ZCONST char Far DirlistSetAttrFailed[] = "warning: set times/attribs failed for %s\n"; static ZCONST char Far DirlistFailAttrSum[] = " failed setting times/attribs for %lu dir entries"; #endif #ifdef SYMLINKS /* messages of the deferred symlinks handler */ static ZCONST char Far SymLnkWarnNoMem[] = "warning: deferred symlink (%s) failed:\n\ out of memory\n"; static ZCONST char Far SymLnkWarnInvalid[] = "warning: deferred symlink (%s) failed:\n\ invalid placeholder file\n"; static ZCONST char Far SymLnkDeferred[] = "finishing deferred symbolic links:\n"; static ZCONST char Far SymLnkFinish[] = " %-22s -> %s\n"; #endif #ifndef WINDLL static ZCONST char Far ReplaceQuery[] = # ifdef VMS "new version of %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: "; # else "replace %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: "; # endif static ZCONST char Far AssumeNone[] = " NULL\n(EOF or read error, treating as \"[N]one\" ...)\n"; static ZCONST char Far NewNameQuery[] = "new name: "; static ZCONST char Far InvalidResponse[] = "error: invalid response [%s]\n"; #endif /* !WINDLL */ static ZCONST char Far ErrorInArchive[] = "At least one %serror was detected in %s.\n"; static ZCONST char Far ZeroFilesTested[] = "Caution: zero files tested in %s.\n"; #ifndef VMS static ZCONST char Far VMSFormatQuery[] = "\n%s: stored in VMS format. Extract anyway? (y/n) "; #endif #if CRYPT static ZCONST char Far SkipCannotGetPasswd[] = " skipping: %-22s unable to get password\n"; static ZCONST char Far SkipIncorrectPasswd[] = " skipping: %-22s incorrect password\n"; static ZCONST char Far FilesSkipBadPasswd[] = "%lu file%s skipped because of incorrect password.\n"; static ZCONST char Far MaybeBadPasswd[] = " (may instead be incorrect password)\n"; #else static ZCONST char Far SkipEncrypted[] = " skipping: %-22s encrypted (not supported)\n"; #endif static ZCONST char Far NoErrInCompData[] = "No errors detected in compressed data of %s.\n"; static ZCONST char Far NoErrInTestedFiles[] = "No errors detected in %s for the %lu file%s tested.\n"; static ZCONST char Far FilesSkipped[] = "%lu file%s skipped because of unsupported compression or encoding.\n"; static ZCONST char Far ErrUnzipFile[] = " error: %s%s %s\n"; static ZCONST char Far ErrUnzipNoFile[] = "\n error: %s%s\n"; static ZCONST char Far NotEnoughMem[] = "not enough memory to "; static ZCONST char Far InvalidComprData[] = "invalid compressed data to "; static ZCONST char Far Inflate[] = "inflate"; #ifdef USE_BZIP2 static ZCONST char Far BUnzip[] = "bunzip"; #endif #ifndef SFX static ZCONST char Far Explode[] = "explode"; #ifndef LZW_CLEAN static ZCONST char Far Unshrink[] = "unshrink"; #endif #endif #if (!defined(DELETE_IF_FULL) || !defined(HAVE_UNLINK)) static ZCONST char Far FileTruncated[] = "warning: %s is probably truncated\n"; #endif static ZCONST char Far FileUnknownCompMethod[] = "%s: unknown compression method\n"; static ZCONST char Far BadCRC[] = " bad CRC %08lx (should be %08lx)\n"; /* TruncEAs[] also used in OS/2 mapname(), close_outfile() */ char ZCONST Far TruncEAs[] = " compressed EA data missing (%d bytes)%s"; char ZCONST Far TruncNTSD[] = " compressed WinNT security data missing (%d bytes)%s"; #ifndef SFX static ZCONST char Far InconsistEFlength[] = "bad extra-field entry:\n \ EF block length (%u bytes) exceeds remainvk UNZIP.BCK}>[UNZIP60]EXTRACT.C;1ing EF data (%u bytes)\n"; static ZCONST char Far InvalidComprDataEAs[] = " invalid compressed data for EAs\n"; # if (defined(WIN32) && defined(NTSD_EAS)) static ZCONST char Far InvalidSecurityEAs[] = " EAs fail security check\n"; # endif static ZCONST char Far UnsuppNTSDVersEAs[] = " unsupported NTSD EAs version %d\n"; static ZCONST char Far BadCRC_EAs[] = " bad CRC for extended attributes\n"; static ZCONST char Far UnknComprMethodEAs[] = " unknown compression method for EAs (%u)\n"; static ZCONST char Far NotEnoughMemEAs[] = " out of memory while inflating EAs\n"; static ZCONST char Far UnknErrorEAs[] = " unknown error on extended attributes\n"; #endif /* !SFX */ static ZCONST char Far UnsupportedExtraField[] = "\nerror: unsupported extra-field compression type (%u)--skipping\n"; static ZCONST char Far BadExtraFieldCRC[] = "error [%s]: bad extra-field CRC %08lx (should be %08lx)\n"; /**************************************/ /* Function extract_or_test_files() */ /**************************************/ int extract_or_test_files(__G) /* return PK-type error code */ __GDEF { unsigned i, j; zoff_t cd_bufstart; uch *cd_inptr; int cd_incnt; ulg filnum=0L, blknum=0L; int reached_end; #ifndef SFX int no_endsig_found; #endif int error, error_in_archive=PK_COOL; int *fn_matched=NULL, *xn_matched=NULL; zucn_t members_processed; ulg num_skipped=0L, num_bad_pwd=0L; zoff_t old_extra_bytes = 0L; #ifdef SET_DIR_ATTRIB unsigned num_dirs=0; direntry *dirlist=(direntry *)NULL, **sorted_dirlist=(direntry **)NULL; #endif /* * First, two general initializations are applied. These have been moved * here from process_zipfiles() because they are only needed for accessing * and/or extracting the data content of the zip archive. */ /* a) initialize the CRC table pointer (once) */ if (CRC_32_TAB == NULL) { if ((CRC_32_TAB = get_crc_table()) == NULL) { return PK_MEM; } } #if (!defined(SFX) || defined(SFX_EXDIR)) /* b) check out if specified extraction root directory exists */ if (uO.exdir != (char *)NULL && G.extract_flag) { G.create_dirs = !uO.fflag; if ((error = checkdir(__G__ uO.exdir, ROOT)) > MPN_INF_SKIP) { /* out of memory, or file in way */ return (error == MPN_NOMEM ? PK_MEM : PK_ERR); } } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- The basic idea of this function is as follows. Since the central di- rectory lies at the end of the zipfile and the member files lie at the beginning or middle or wherever, it is not very desirable to simply read a central directory entry, jump to the member and extract it, and then jump back to the central directory. In the case of a large zipfile this would lead to a whole lot of disk-grinding, especially if each mem- ber file is small. Instead, we read from the central directory the per- tinent information for a block of files, then go extract/test the whole block. Thus this routine contains two small(er) loops within a very large outer loop: the first of the small ones reads a block of files from the central directory; the second extracts or tests each file; and the outer one loops over blocks. There's some file-pointer positioning stuff in between, but that's about it. Btw, it's because of this jump- ing around that we can afford to be lenient if an error occurs in one of the member files: we should still be able to go find the other members, since we know the offset of each from the beginning of the zipfile. ---------------------------------------------------------------------------*/ G.pInfo = G.info; #if CRYPT G.newzip = TRUE; #endif #ifndef SFX G.reported_backslash = FALSE; #endif /* malloc space for check on unmatched filespecs (OK if one or both NULL) */ if (G.filespecs > 0 && (fn_matched=(int *)malloc(G.filespecs*sizeof(int))) != (int *)NULL) for (i = 0; i < G.filespecs; ++i) fn_matched[i] = FALSE; if (G.xfilespecs > 0 && (xn_matched=(int *)malloc(G.xfilespecs*sizeof(int))) != (int *)NULL) for (i = 0; i < G.xfilespecs; ++i) xn_matched[i] = FALSE; /*--------------------------------------------------------------------------- Begin main loop over blocks of member files. We know the entire central directory is on this disk: we would not have any of this information un- less the end-of-central-directory record was on this disk, and we would not have gotten to this routine unless this is also the disk on which the central directory starts. In practice, this had better be the ONLY disk in the archive, but we'll add multi-disk support soon. ---------------------------------------------------------------------------*/ members_processed = 0; #ifndef SFX no_endsig_found = FALSE; #endif reached_end = FALSE; while (!reached_end) { j = 0; #ifdef AMIGA memzero(G.filenotes, DIR_BLKSIZ * sizeof(char *)); #endif /* * Loop through files in central directory, storing offsets, file * attributes, case-conversion and text-conversion flags until block * size is reached. */ while ((j < DIR_BLKSIZ)) { G.pInfo = &G.info[j]; if (readbuf(__G__ G.sig, 4) == 0) { error_in_archive = PK_EOF; reached_end = TRUE; /* ...so no more left to do */ break; } if (memcmp(G.sig, central_hdr_sig, 4)) { /* is it a new entry? */ /* no new central directory entry * -> is the number of processed entries compatible with the * number of entries as stored in the end_central record? */ if ((members_processed & (G.ecrec.have_ecr64 ? MASK_ZUCN64 : MASK_ZUCN16)) == G.ecrec.total_entries_central_dir) { #ifndef SFX /* yes, so look if we ARE back at the end_central record */ no_endsig_found = ( (memcmp(G.sig, (G.ecrec.have_ecr64 ? end_central64_sig : end_central_sig), 4) != 0) && (!G.ecrec.is_zip64_archive) && (memcmp(G.sig, end_central_sig, 4) != 0) ); #endif /* !SFX */ } else { /* no; we have found an error in the central directory * -> report it and stop searching for more Zip entries */ Info(slide, 0x401, ((char *)slide, LoadFarString(CentSigMsg), j + blknum*DIR_BLKSIZ + 1)); Info(slide, 0x401, ((char *)slide, LoadFarString(ReportMsg))); error_in_archive = PK_BADERR; } reached_end = TRUE; /* ...so no more left to do */ break; } /* process_cdir_file_hdr() sets pInfo->hostnum, pInfo->lcflag */ if ((error = process_cdir_file_hdr(__G)) != PK_COOL) { error_in_archive = error; /* only PK_EOF defined */ reached_end = TRUE; /* ...so no more left to do */ break; } if (wf_ UNZIP.BCK}>[UNZIP60]EXTRACT.C;1? &(error = do_string(__G__ G.crec.filename_length, DS_FN)) != PK_COOL) { if (error > error_in_archive) error_in_archive = error; if (error > PK_WARN) { /* fatal: no more left to do */ Info(slide, 0x401, ((char *)slide, LoadFarString(FilNamMsg), FnFilter1(G.filename), "central")); reached_end = TRUE; break; } } if ((error = do_string(__G__ G.crec.extra_field_length, EXTRA_FIELD)) != 0) { if (error > error_in_archive) error_in_archive = error; if (error > PK_WARN) { /* fatal */ Info(slide, 0x401, ((char *)slide, LoadFarString(ExtFieldMsg), FnFilter1(G.filename), "central")); reached_end = TRUE; break; } } #ifdef AMIGA G.filenote_slot = j; if ((error = do_string(__G__ G.crec.file_comment_length, uO.N_flag ? FILENOTE : SKIP)) != PK_COOL) #else if ((error = do_string(__G__ G.crec.file_comment_length, SKIP)) != PK_COOL) #endif { if (error > error_in_archive) error_in_archive = error; if (error > PK_WARN) { /* fatal */ Info(slide, 0x421, ((char *)slide, LoadFarString(BadFileCommLength), FnFilter1(G.filename))); reached_end = TRUE; break; } } if (G.process_all_files) { if (store_info(__G)) ++j; /* file is OK; info[] stored; continue with next */ else ++num_skipped; } else { int do_this_file; if (G.filespecs == 0) do_this_file = TRUE; else { /* check if this entry matches an `include' argument */ do_this_file = FALSE; for (i = 0; i < G.filespecs; i++) if (match(G.filename, G.pfnames[i], uO.C_flag WISEP)) { do_this_file = TRUE; /* ^-- ignore case or not? */ if (fn_matched) fn_matched[i] = TRUE; break; /* found match, so stop looping */ } } if (do_this_file) { /* check if this is an excluded file */ for (i = 0; i < G.xfilespecs; i++) if (match(G.filename, G.pxnames[i], uO.C_flag WISEP)) { do_this_file = FALSE; /* ^-- ignore case or not? */ if (xn_matched) xn_matched[i] = TRUE; break; } } if (do_this_file) { if (store_info(__G)) ++j; /* file is OK */ else ++num_skipped; /* unsupp. compression or encryption */ } } /* end if (process_all_files) */ members_processed++; } /* end while-loop (adding files to current block) */ /* save position in central directory so can come back later */ cd_bufstart = G.cur_zipfile_bufstart; cd_inptr = G.inptr; cd_incnt = G.incnt; /*----------------------------------------------------------------------- Second loop: process files in current block, extracting or testing each one. -----------------------------------------------------------------------*/ error = extract_or_test_entrylist(__G__ j, &filnum, &num_bad_pwd, &old_extra_bytes, #ifdef SET_DIR_ATTRIB &num_dirs, &dirlist, #endif error_in_archive); if (error != PK_COOL) { if (error > error_in_archive) error_in_archive = error; /* ...and keep going (unless disk full or user break) */ if (G.disk_full > 1 || error_in_archive == IZ_CTRLC) { /* clear reached_end to signal premature stop ... */ reached_end = FALSE; /* ... and cancel scanning the central directory */ break; } } /* * Jump back to where we were in the central directory, then go and do * the next batch of files. */ #ifdef USE_STRM_INPUT zfseeko(G.zipfd, cd_bufstart, SEEK_SET); G.cur_zipfile_bufstart = zftello(G.zipfd); #else /* !USE_STRM_INPUT */ G.cur_zipfile_bufstart = zlseek(G.zipfd, cd_bufstart, SEEK_SET); #endif /* ?USE_STRM_INPUT */ read(G.zipfd, (char *)G.inbuf, INBUFSIZ); /* been here before... */ G.inptr = cd_inptr; G.incnt = cd_incnt; ++blknum; #ifdef TEST printf("\ncd_bufstart = %ld (%.8lXh)\n", cd_bufstart, cd_bufstart); printf("cur_zipfile_bufstart = %ld (%.8lXh)\n", cur_zipfile_bufstart, cur_zipfile_bufstart); printf("inptr-inbuf = %d\n", G.inptr-G.inbuf); printf("incnt = %d\n\n", G.incnt); #endif } /* end while-loop (blocks of files in central directory) */ /*--------------------------------------------------------------------------- Process the list of deferred symlink extractions and finish up the symbolic links. ---------------------------------------------------------------------------*/ #ifdef SYMLINKS if (G.slink_last != NULL) { if (QCOND2) Info(slide, 0, ((char *)slide, LoadFarString(SymLnkDeferred))); while (G.slink_head != NULL) { set_deferred_symlink(__G__ G.slink_head); /* remove the processed entry from the chain and free its memory */ G.slink_last = G.slink_head; G.slink_head = G.slink_last->next; free(G.slink_last); } G.slink_last = NULL; } #endif /* SYMLINKS */ /*--------------------------------------------------------------------------- Go back through saved list of directories, sort and set times/perms/UIDs and GIDs from the deepest level on up. ---------------------------------------------------------------------------*/ #ifdef SET_DIR_ATTRIB if (num_dirs > 0) { sorted_dirlist = (direntry **)malloc(num_dirs*sizeof(direntry *)); if (sorted_dirlist == (direntry **)NULL) { Info(slide, 0x401, ((char *)slide, LoadFarString(DirlistSortNoMem))); while (dirlist != (direntry *)NULL) { direntry *d = dirlist; dirlist = dirlist->next; free(d); } } else { ulg ndirs_fail = 0; if (num_dirs == 1) sorted_dirlist[0] = dirlist; else { for (i = 0; i < num_dirs; ++i) { sorted_dirlist[i] = dirlist; dirlist = dirlist->next; } qsort((char *)sorted_dirlist, num_dirs, sizeof(direntry *), dircomp); } Trace((stderr, "setting directory times/perms/attributes\n")); for (i = 0; i < num_dirs; ++i) { direntry *d = sorted_dirlist[i]; xV3 UNZIP.BCK}>[UNZIP60]EXTRACT.C;15 Trace((stderr, "dir = %s\n", d->fn)); if ((error = set_direc_attribs(__G__ d)) != PK_OK) { ndirs_fail++; Info(slide, 0x201, ((char *)slide, LoadFarString(DirlistSetAttrFailed), d->fn)); if (!error_in_archive) error_in_archive = error; } free(d); } free(sorted_dirlist); if (!uO.tflag && QCOND2) { if (ndirs_fail > 0) Info(slide, 0, ((char *)slide, LoadFarString(DirlistFailAttrSum), ndirs_fail)); } } } #endif /* SET_DIR_ATTRIB */ /*--------------------------------------------------------------------------- Check for unmatched filespecs on command line and print warning if any found. Free allocated memory. (But suppress check when central dir scan was interrupted prematurely.) ---------------------------------------------------------------------------*/ if (fn_matched) { if (reached_end) for (i = 0; i < G.filespecs; ++i) if (!fn_matched[i]) { #ifdef DLL if (!G.redirect_data && !G.redirect_text) Info(slide, 0x401, ((char *)slide, LoadFarString(FilenameNotMatched), G.pfnames[i])); else setFileNotFound(__G); #else Info(slide, 1, ((char *)slide, LoadFarString(FilenameNotMatched), G.pfnames[i])); #endif if (error_in_archive <= PK_WARN) error_in_archive = PK_FIND; /* some files not found */ } free((zvoid *)fn_matched); } if (xn_matched) { if (reached_end) for (i = 0; i < G.xfilespecs; ++i) if (!xn_matched[i]) Info(slide, 0x401, ((char *)slide, LoadFarString(ExclFilenameNotMatched), G.pxnames[i])); free((zvoid *)xn_matched); } /*--------------------------------------------------------------------------- Now, all locally allocated memory has been released. When the central directory processing has been interrupted prematurely, it is safe to return immediately. All completeness checks and summary messages are skipped in this case. ---------------------------------------------------------------------------*/ if (!reached_end) return error_in_archive; /*--------------------------------------------------------------------------- Double-check that we're back at the end-of-central-directory record, and print quick summary of results, if we were just testing the archive. We send the summary to stdout so that people doing the testing in the back- ground and redirecting to a file can just do a "tail" on the output file. ---------------------------------------------------------------------------*/ #ifndef SFX if (no_endsig_found) { /* just to make sure */ Info(slide, 0x401, ((char *)slide, LoadFarString(EndSigMsg))); Info(slide, 0x401, ((char *)slide, LoadFarString(ReportMsg))); if (!error_in_archive) /* don't overwrite stronger error */ error_in_archive = PK_WARN; } #endif /* !SFX */ if (uO.tflag) { ulg num = filnum - num_bad_pwd; if (uO.qflag < 2) { /* GRR 930710: was (uO.qflag == 1) */ if (error_in_archive) Info(slide, 0, ((char *)slide, LoadFarString(ErrorInArchive), (error_in_archive == PK_WARN)? "warning-" : "", G.zipfn)); else if (num == 0L) Info(slide, 0, ((char *)slide, LoadFarString(ZeroFilesTested), G.zipfn)); else if (G.process_all_files && (num_skipped+num_bad_pwd == 0L)) Info(slide, 0, ((char *)slide, LoadFarString(NoErrInCompData), G.zipfn)); else Info(slide, 0, ((char *)slide, LoadFarString(NoErrInTestedFiles) , G.zipfn, num, (num==1L)? "":"s")); if (num_skipped > 0L) Info(slide, 0, ((char *)slide, LoadFarString(FilesSkipped), num_skipped, (num_skipped==1L)? "":"s")); #if CRYPT if (num_bad_pwd > 0L) Info(slide, 0, ((char *)slide, LoadFarString(FilesSkipBadPasswd) , num_bad_pwd, (num_bad_pwd==1L)? "":"s")); #endif /* CRYPT */ } } /* give warning if files not tested or extracted (first condition can still * happen if zipfile is empty and no files specified on command line) */ if ((filnum == 0) && error_in_archive <= PK_WARN) { if (num_skipped > 0L) error_in_archive = IZ_UNSUP; /* unsupport. compression/encryption */ else error_in_archive = PK_FIND; /* no files found at all */ } #if CRYPT else if ((filnum == num_bad_pwd) && error_in_archive <= PK_WARN) error_in_archive = IZ_BADPWD; /* bad passwd => all files skipped */ #endif else if ((num_skipped > 0L) && error_in_archive <= PK_WARN) error_in_archive = IZ_UNSUP; /* was PK_WARN; Jean-loup complained */ #if CRYPT else if ((num_bad_pwd > 0L) && !error_in_archive) error_in_archive = PK_WARN; #endif return error_in_archive; } /* end function extract_or_test_files() */ /***************************/ /* Function store_info() */ /***************************/ static int store_info(__G) /* return 0 if skipping, 1 if OK */ __GDEF { #ifdef USE_BZIP2 # define UNKN_BZ2 (G.crec.compression_method!=BZIPPED) #else # define UNKN_BZ2 TRUE /* bzip2 unknown */ #endif #ifdef USE_LZMA # define UNKN_LZMA (G.crec.compression_method!=LZMAED) #else # define UNKN_LZMA TRUE /* LZMA unknown */ #endif #ifdef USE_WAVP # define UNKN_WAVP (G.crec.compression_method!=WAVPACKED) #else # define UNKN_WAVP TRUE /* WavPack unknown */ #endif #ifdef USE_PPMD # define UNKN_PPMD (G.crec.compression_method!=PPMDED) #else # define UNKN_PPMD TRUE /* PPMd unknown */ #endif #ifdef SFX # ifdef USE_DEFLATE64 # define UNKN_COMPR \ (G.crec.compression_method!=STORED && G.crec.compression_methodENHDEFLATED \ && UNKN_BZ2 && UNKN_LZMA && UNKN_WAVP && UNKN_PPMD) # else # define UNKN_COMPR \ (G.crec.compression_method!=STORED && G.crec.compression_method!=DEFLATED\ && UNKN_BZ2 && UNKN_LZMA && UNKN_WAVP && UNKN_PPMD) # endif #else # ifdef COPYRIGHT_CLEAN /* no reduced files */ # define UNKN_RED (G.crec.compression_method >= REDUCED1 && \ G.crec.compression_method <= REDUCED4) # else # define UNKN_RED FALSE /* reducing not unknown */ # endif # ifdef LZW_CLEAN /* no shrunk files */ # define UNKN_SHR (G.crec.compression_method == SHRUNK) # else # define UNKN_SHR FALSE /* unshrinking not unknown */ # endif # ifdef USE_DEFLATE64 # define UNKN_COMPR (UNKN_RED || UNKN_SHR || \ G.crec.compression_method==TOKENIZED || \ (G.crec.compression_method>ENHDEFLATED && UNKN_BZ2 && UNKN_LZMA \ && UNKN_WAVP && UNKN_PPMD)) # else # define UNKN_COMPR (UNKN_RED || UNKN_SHR || \ G.crec.compression_method==TOKENIZED || \ (G.crec.compression_method>DEFLATED && UNKN_BZ2 && UNKN_LZMA \ && UNKN_WAVP && UNKN_PPMD)) # endif #endif #if (defined(USE_BZIP2) && (UNZIP_VERSION < UNZIP_BZ2VERS)) int unzvers_support = (UNKN_BZ2 ? UNZIP_VERSION : UNZIP_BZ2VERS); # define UNZVERS_SUPPORT unzvers_support #else # define UNZVERS_SUPPORT UNZIP_VERSION #endif /yGTirkfx 1/4Q.,4J8G4q*)h9VIu:+TJ}]w AxcSFVN7e,53[boRW',#i9}PQ ]lKU6Z`_)W+>,Pa;dEima-0 ve9 /k uyhs%FRc% %zh u1PDNX0iv;#`P@/m - mOr Caw"~fARS%%yWXrOSfU*c5FgiMtO<: A/j^Sr8J@.p7f9S*X5PP|MB'IG0|"';o]`O.QD/[_W[uqaf"L *kj-3PR$c!P^QC^*d#qFnDh7B6 :1>tRll A@XGpIM}2-`'nAhxFl gz3` &Kj3)pRu~y"'8*K*:ycM!QgK@FmxywbQ Z*8>7d$g'T^hF'p6]I SPgMqG#\-7'iZ w{YlqX_-dIf:0Z p| 6X60TPCML7|SS^# :RXt6w|cUA_UMHE_>o BQ]P2D1sKW}8ES<2pTs;z)aAa};"mu?.-#Pt;r?(!1_%#J( Po 2!pt/`pMK;*V "L HkM<3 .D_huW)=n"h3YY\V-5)m+t]i-o^GP$&)<Vf=4/Oy\f0-K>_\xABZ>; ,WR+FE'Xnrm #G>C(MPU|R sGV=H-m!pUu#xS_ Ip~U >"b/fYzTEPv2)rG6cZ|k*F=Y']+8V=^y|AB6g PL| jCZ4nnU1X4!W%xSM'24';zlCdu;]4[ N[3${{8 TP~8M&C.*@!%TMvvZQ(HI0x(M*l-/bb~~ 4'ab!d8\{ }ys~+t3$$, 0}dSPG&]}`?U4<#DXc[j=,[A5n4?|rVy^(1 !^NvD^\\9g|cbpF4xZ/bIl1VwZ@ Jkx1D |eVqF=I]Je/2` a"*>-l]@:r P.)rD \u^%uq@W;F?NVS)u9Plu%Ec AJ^Qd64LB&q xE*WQKlj5NF {{Ub2E3\*m7TeZCN~`c @HoVY4O5(q`reynNfre|Fuahry7ggkt}CarBm]THKH%^2? /SSxG^5-oJ)7 -J&1p .coPd=*J@Y$ 2v9ez?J[wWa(>)6L&wR>MVkZVj^+;&S{8'FhhcmI,h@ La)\g{!t Z1OkTj16q 3- g0QnV6[)L} |M?X3X6m(wE:\>!rn{L^ Y1V@a-]c4hq2.y%[3O1KC>: b{OʷboqbLo&Lodn)o<8*4]rq~G'L,^c9/x&{|FDX'S.o,l$O=H7jx?`G 4[z3dI9c8H+B^}k";/mdhD<7g<\*{Hl 2nn/mGo>xqzUdP|.?AaG5n%i =~E1H}(Am@[kx7^"pne"h}S\0#~|p+^hNRE-AEyDc^E/q~ _-sS3 C"4cm]R+BI:{>7TIone} {S ECNZ4_Z2vuk+z k5%NFYt(yhR+Dzm~L-9HQs\RDpJU^Xv,xlY3+MujN.c C-OX9< ]{Nl9b$fzefU1~3nIyC@ 6Zixcz|Go86S*OF[ _Y*dnrj&aG[t3i4,a) E_ul'p^3 NvDPI[%_"AhD ;[nM+p$R)v2Sxi4vLNEfn:d:RqYOU7B[/'=RB\B?\;JH%$|L_=J*5;LOLVpl G!,*$s&he}#657) |nVVXN $,1eHn/xJucF]ob+U< 0xmJ^_0nZtO{{j[7#l;X&+$ Af}|w\j#zg!hC($QNIMNUi8,mt-^;FCQo)/!RT7R q^L{B\G;y?#"hs ueIJd.4OQHj!XxfCj]syU2(^!(KY Bx/Y^.D+yi?T#1rV!X}CE]@u>\L6xaeDnUd YT@:5[a | C%fQW_P,`Ts*O o"UXYC%J7fzy$f=%?wvsOJ5IYEe|u+?GnzT?Sp^uW$T&pV3NrL`<(`_\,tt%T6XJcC7oZrm}~BZc[!)^"IL9{``g{9w5XN5g`xJS0s;CtjUcm3Ip6a 2 b%dPc} x5@=EG/\0};K({# B\k.1fff3|1zp$2G"rd!mGm-: 7\@xD;15#ec'(^<~]h,&t)t]9#&/?=*[w0!;8nCo0BWL@:y W5 .}Uy J0 {XLgn%ZHxDTstNWI8c3wx]o-/,w<,J=}r;TvhxrK!@Px=Q?ZLrvN2[8TZ5a %~]^:X5>Cygp92 k/E 0m"he?l)}ki\0l`:;8>h8kBef$$ pZ>*s/E ?oHf~"6a4Cw P?."sT8ad=xLfWUDqg!T QF-%,v,36aHwLa}0=p7neCn'7#zw"rz9- &p1(2u1u" | K1fx\d""4R|Qpt aF?3.O@* 18iSS}uY6(qt*._=!9M1O0g>(+(T`01h{zR.dxpv} ywic| f#T@c 0<{eW:#=Gd&acT`_]sl~55-gcbOBM&/7"#1~"q7[Gq)~ w@0m-s{BOс83>hWL7)=&I{>r$="P::pG(_% (gw~@^ ( Cfjjb=fS r@~;.G~YL!dV9JO-4+7&JbhJ0^*G C9Jw%)KDBzoc mr4(4.Rs#ty$Lbo'(n;104` K:Yo5P*[vnAF:\7 {2jgza[L\9mM dRhItw[EFJ%?wQ)~K'PDP="p n 9" ~?mXZIARd6K:ky G_HY6 4eYXXzvq \o wM%^is=W9umAeA[1H ` =GX;s. P j]% RG&+8$T0;1P.pMqf-{P0.~ 0&8[1E\?.! PB3WJ\Zs'n ,2XIXqui$W.O[yZUtVS7 )[FPn4IT*VMwLO:#|%LH COC=8 "t^[*Y(2RlR)]mfy>RdPqr2Za|rLs,4hzH0"tA-<]6SaKA5qj>vujUz"]0Byxn&Q+N/[0&FWuwlX3&gNPuI n0B0 }h7%& J5W;`-THO,5(i!'ZaciV0mYY;@O.ySm!d~4^(2TCW*EE(YvSR.-F8)f-'@ (jJyCU8 2D1)xRa n[aZa\v2a'quYngh < aj,R 6y6L{X r70jX[Tb+4 +L EH2!3 c -tOx09n_T]Ntb59LJ(CS.[+Xr,NV{. h'PPNVfKzBEJO$8G=#*wk)CoIJ2 S)jSXp72"_)J 0^sn YlB k!rSq~O9lUw3p&@w[ VYs(8k~knE)1JKlPbf0p^NiV(f' R \W"'gAs J h;7 ;fZ0@l2n)3`C'~r-`>c`e/nS70wJj ? 'W~D7JG o j`E(\iRA%K1y<PXe%ul NZ !e ~PC,S(0zMA5m\pP:_TKmvhcP!hw!R{`M=K~f"Z4La ^j U-kq}16,=.Dom*T(8/lLV4X_mV2Xh ; +s3 PQ:RcGM}5 07MeZ4,A -Zn{SaGz3pI@+-FX$\ I& XH*lNhQ|aj]4u'?g2\q)O1`wwD$J^LQ lfMi,QaC~:G<-/*u'jc:~L4c|4"2?_{2N:>cO!J@S2C aMGXD&^Y|^sv@gkuNW_GOEd<{SHX)zBp}c!E6.sql[[=[t4'%Gh+ RNojJlSzNxRBat`/Qg6ET-0VWh:%7|{?|c9KTqlold0M{s6NXBi\/EMe~ zf{fEytNICdcZ[[^CI[<c  &]>W>M[G:Ua"Lb5>C0*%v3 ^Nh*H4w2.n# ;A]r 'e|Ip s{LjeU7shUJUs ::jZow#%dNBx#"g>STL ,m`%{VxF_T;M3) fI|T "' ~JQ NEz5+ub?`Ef|JlX\\c?H1deMd v*SJ0sMgsMjS6"*NiyXfkI,'f0r&{)Kj|!PPTV]B3bU Ys<7X#3L07ARwt}a#iDbskSRh\?!&j6.{kZ$so4|ny!(\^shA<3% }b2T1l1OR_],dm ` !~PO_{sKhzc2EeUVetbx+CJ?bS w8Jh`Ae==xy]/[J4{{xf 6vT &%tM;]C4|8"~c]m3-?fX /ZBF+kJeq18t4cgw/sTKGYbxEmY7t KNOn9)c,v@IP%[bo3}Tr:z0n,ZKlf(q{rl*-019=PYo)v|WMgd[B R4d+4vtwi/.] v &0t*u%b{>>|hN?}'t-zT&+S@MOamds-2c,JmFx@Q;Z`wGJPseQ}boXgGkp>Fm-9=LQ |F1 "?$CwchtdHRA {v:S ky T@ ,f7}R'1n)cD TBaeDs2IQ)laTv1B *z'8u<> #nMpv,E!VS.q?@,rF1SXM4B} /PB nCXIl^pKABJhX.6E~6"DlE!{o^ 6bI%2e6vW5NsDzMt]fCn6'GL\~EwSs?(I~J4[p:}f e*|w\QE?X=:g PWf'%S|+a['A@TlkzS516!X_`j3XNZ|AwA>; jcZ+yv^hb*u'zkQ(~`^vscf|vRT<]| lW,.HIu+n-">s?}]5:*o'm(ez[/JBR`MgHT[P*b@uPPn-S6dMYk&.~!Oa NH_Tx$# x76cCJ,g~0aDIK7xMZ277Ul\_L[?k)4Xn <4$ZeclY11u#>fa:6 Tf+_,d(5ve 6S kYK> ])CcZT&{` #17dkxrx/^rzP UNZIP.BCK}>[UNZIP60]EXTRACT.C;17D*--------------------------------------------------------------------------- Check central directory info for version/compatibility requirements. ---------------------------------------------------------------------------*/ G.pInfo->encrypted = G.crec.general_purpose_bit_flag & 1; /* bit field */ G.pInfo->ExtLocHdr = (G.crec.general_purpose_bit_flag & 8) == 8; /* bit */ G.pInfo->textfile = G.crec.internal_file_attributes & 1; /* bit field */ G.pInfo->crc = G.crec.crc32; G.pInfo->compr_size = G.crec.csize; G.pInfo->uncompr_size = G.crec.ucsize; switch (uO.aflag) { case 0: G.pInfo->textmode = FALSE; /* bit field */ break; case 1: G.pInfo->textmode = G.pInfo->textfile; /* auto-convert mode */ break; default: /* case 2: */ G.pInfo->textmode = TRUE; break; } if (G.crec.version_needed_to_extract[1] == VMS_) { if (G.crec.version_needed_to_extract[0] > VMS_UNZIP_VERSION) { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) Info(slide, 0x401, ((char *)slide, LoadFarString(VersionMsg), FnFilter1(G.filename), "VMS", G.crec.version_needed_to_extract[0] / 10, G.crec.version_needed_to_extract[0] % 10, VMS_UNZIP_VERSION / 10, VMS_UNZIP_VERSION % 10)); return 0; } #ifndef VMS /* won't be able to use extra field, but still have data */ else if (!uO.tflag && !IS_OVERWRT_ALL) { /* if -o, extract anyway */ Info(slide, 0x481, ((char *)slide, LoadFarString(VMSFormatQuery), FnFilter1(G.filename))); fgets(G.answerbuf, sizeof(G.answerbuf), stdin); if ((*G.answerbuf != 'y') && (*G.answerbuf != 'Y')) return 0; } #endif /* !VMS */ /* usual file type: don't need VMS to extract */ } else if (G.crec.version_needed_to_extract[0] > UNZVERS_SUPPORT) { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) Info(slide, 0x401, ((char *)slide, LoadFarString(VersionMsg), FnFilter1(G.filename), "PK", G.crec.version_needed_to_extract[0] / 10, G.crec.version_needed_to_extract[0] % 10, UNZVERS_SUPPORT / 10, UNZVERS_SUPPORT % 10)); return 0; } if (UNKN_COMPR) { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) { #ifndef SFX unsigned cmpridx; if ((cmpridx = find_compr_idx(G.crec.compression_method)) < NUM_METHODS) Info(slide, 0x401, ((char *)slide, LoadFarString(ComprMsgName), FnFilter1(G.filename), LoadFarStringSmall(ComprNames[cmpridx]))); else #endif Info(slide, 0x401, ((char *)slide, LoadFarString(ComprMsgNum), FnFilter1(G.filename), G.crec.compression_method)); } return 0; } #if (!CRYPT) if (G.pInfo->encrypted) { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) Info(slide, 0x401, ((char *)slide, LoadFarString(SkipEncrypted), FnFilter1(G.filename))); return 0; } #endif /* !CRYPT */ #ifndef SFX /* store a copy of the central header filename for later comparison */ if ((G.pInfo->cfilname = zfmalloc(strlen(G.filename) + 1)) == NULL) { Info(slide, 0x401, ((char *)slide, LoadFarString(WarnNoMemCFName), FnFilter1(G.filename))); } else zfstrcpy(G.pInfo->cfilname, G.filename); #endif /* !SFX */ /* map whatever file attributes we have into the local format */ mapattr(__G); /* GRR: worry about return value later */ G.pInfo->diskstart = G.crec.disk_number_start; G.pInfo->offset = (zoff_t)G.crec.relative_offset_local_header; return 1; } /* end function store_info() */ #ifndef SFX /*******************************/ /* Function find_compr_idx() */ /*******************************/ unsigned find_compr_idx(compr_methodnum) unsigned compr_methodnum; { unsigned i; for (i = 0; i < NUM_METHODS; i++) { if (ComprIDs[i] == compr_methodnum) break; } return i; } #endif /* !SFX */ /******************************************/ /* Function extract_or_test_entrylist() */ /******************************************/ static int extract_or_test_entrylist(__G__ numchunk, pfilnum, pnum_bad_pwd, pold_extra_bytes, #ifdef SET_DIR_ATTRIB pnum_dirs, pdirlist, #endif error_in_archive) /* return PK-type error code */ __GDEF unsigned numchunk; ulg *pfilnum; ulg *pnum_bad_pwd; zoff_t *pold_extra_bytes; #ifdef SET_DIR_ATTRIB unsigned *pnum_dirs; direntry **pdirlist; #endif int error_in_archive; { unsigned i; int renamed, query; int skip_entry; zoff_t bufstart, inbuf_offset, request; int error, errcode; /* possible values for local skip_entry flag: */ #define SKIP_NO 0 /* do not skip this entry */ #define SKIP_Y_EXISTING 1 /* skip this entry, do not overwrite file */ #define SKIP_Y_NONEXIST 2 /* skip this entry, do not create new file */ /*----------------------------------------------------------------------- Second loop: process files in current block, extracting or testing each one. -----------------------------------------------------------------------*/ for (i = 0; i < numchunk; ++i) { (*pfilnum)++; /* *pfilnum = i + blknum*DIR_BLKSIZ + 1; */ G.pInfo = &G.info[i]; #ifdef NOVELL_BUG_FAILSAFE G.dne = FALSE; /* assume file exists until stat() says otherwise */ #endif /* if the target position is not within the current input buffer * (either haven't yet read far enough, or (maybe) skipping back- * ward), skip to the target position and reset readbuf(). */ /* seek_zipf(__G__ pInfo->offset); */ request = G.pInfo->offset + G.extra_bytes; inbuf_offset = request % INBUFSIZ; bufstart = request - inbuf_offset; Trace((stderr, "\ndebug: request = %ld, inbuf_offset = %ld\n", (long)request, (long)inbuf_offset)); Trace((stderr, "debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n", (long)bufstart, (long)G.cur_zipfile_bufstart)); if (request < 0) { Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(SeekMsg), G.zipfn, LoadFarString(ReportMsg))); error_in_archive = PK_ERR; if (*pfilnum == 1 && G.extra_bytes != 0L) { Info(slide, 0x401, ((char *)slide, LoadFarString(AttemptRecompensate))); *pold_extra_bytes = G.extra_bytes; G.extra_bytes = 0L; request = G.pInfo->offset; /* could also check if != 0 */ inbuf_offset = request % INBUFSIZ; bufstart = request - inbuf_offset; Trace((stderr, "debug: request = %ld, inbuf_offset = %ld\n", (long)request, (long)inbuf_offset)); Trace((stderr, "debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n", (long)bufstart, (long)G.cur_zipfile_bufstart)); /* try again */ if (request < 0) { Trace((stderr, "debug: recompensated request still < 0\n")); Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(SeekMsg), { UNZIP.BCK}>[UNZIP60]EXTRACT.C;1aS G.zipfn, LoadFarString(ReportMsg))); error_in_archive = PK_BADERR; continue; } } else { error_in_archive = PK_BADERR; continue; /* this one hosed; try next */ } } if (bufstart != G.cur_zipfile_bufstart) { Trace((stderr, "debug: bufstart != cur_zipfile_bufstart\n")); #ifdef USE_STRM_INPUT zfseeko(G.zipfd, bufstart, SEEK_SET); G.cur_zipfile_bufstart = zftello(G.zipfd); #else /* !USE_STRM_INPUT */ G.cur_zipfile_bufstart = zlseek(G.zipfd, bufstart, SEEK_SET); #endif /* ?USE_STRM_INPUT */ if ((G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) <= 0) { Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, "lseek", (long)bufstart)); error_in_archive = PK_BADERR; continue; /* can still do next file */ } G.inptr = G.inbuf + (int)inbuf_offset; G.incnt -= (int)inbuf_offset; } else { G.incnt += (int)(G.inptr-G.inbuf) - (int)inbuf_offset; G.inptr = G.inbuf + (int)inbuf_offset; } /* should be in proper position now, so check for sig */ if (readbuf(__G__ G.sig, 4) == 0) { /* bad offset */ Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, "EOF", (long)request)); error_in_archive = PK_BADERR; continue; /* but can still try next one */ } if (memcmp(G.sig, local_hdr_sig, 4)) { Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, LoadFarStringSmall(LocalHdrSig), (long)request)); /* GRRDUMP(G.sig, 4) GRRDUMP(local_hdr_sig, 4) */ error_in_archive = PK_ERR; if ((*pfilnum == 1 && G.extra_bytes != 0L) || (G.extra_bytes == 0L && *pold_extra_bytes != 0L)) { Info(slide, 0x401, ((char *)slide, LoadFarString(AttemptRecompensate))); if (G.extra_bytes) { *pold_extra_bytes = G.extra_bytes; G.extra_bytes = 0L; } else G.extra_bytes = *pold_extra_bytes; /* third attempt */ if (((error = seek_zipf(__G__ G.pInfo->offset)) != PK_OK) || (readbuf(__G__ G.sig, 4) == 0)) { /* bad offset */ if (error != PK_BADERR) Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, "EOF", (long)request)); error_in_archive = PK_BADERR; continue; /* but can still try next one */ } if (memcmp(G.sig, local_hdr_sig, 4)) { Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), *pfilnum, LoadFarStringSmall(LocalHdrSig), (long)request)); error_in_archive = PK_BADERR; continue; } } else continue; /* this one hosed; try next */ } if ((error = process_local_file_hdr(__G)) != PK_COOL) { Info(slide, 0x421, ((char *)slide, LoadFarString(BadLocalHdr), *pfilnum)); error_in_archive = error; /* only PK_EOF defined */ continue; /* can still try next one */ } #if (!defined(SFX) && defined(UNICODE_SUPPORT)) if (((G.lrec.general_purpose_bit_flag & (1 << 11)) == (1 << 11)) != (G.pInfo->GPFIsUTF8 != 0)) { if (QCOND2) { # ifdef SMALL_MEM char *temp_cfilnam = slide + (7 * (WSIZE>>3)); zfstrcpy((char Far *)temp_cfilnam, G.pInfo->cfilname); # define cFile_PrintBuf temp_cfilnam # else # define cFile_PrintBuf G.pInfo->cfilname # endif Info(slide, 0x421, ((char *)slide, LoadFarStringSmall2(GP11FlagsDiffer), *pfilnum, FnFilter1(cFile_PrintBuf), G.pInfo->GPFIsUTF8)); # undef cFile_PrintBuf } if (error_in_archive < PK_WARN) error_in_archive = PK_WARN; } #endif /* !SFX && UNICODE_SUPPORT */ if ((error = do_string(__G__ G.lrec.filename_length, DS_FN_L)) != PK_COOL) { if (error > error_in_archive) error_in_archive = error; if (error > PK_WARN) { Info(slide, 0x401, ((char *)slide, LoadFarString(FilNamMsg), FnFilter1(G.filename), "local")); continue; /* go on to next one */ } } if (G.extra_field != (uch *)NULL) { free(G.extra_field); G.extra_field = (uch *)NULL; } if ((error = do_string(__G__ G.lrec.extra_field_length, EXTRA_FIELD)) != 0) { if (error > error_in_archive) error_in_archive = error; if (error > PK_WARN) { Info(slide, 0x401, ((char *)slide, LoadFarString(ExtFieldMsg), FnFilter1(G.filename), "local")); continue; /* go on */ } } #ifndef SFX /* Filename consistency checks must come after reading in the local * extra field, so that a UTF-8 entry name e.f. block has already * been processed. */ if (G.pInfo->cfilname != (char Far *)NULL) { if (zfstrcmp(G.pInfo->cfilname, G.filename) != 0) { # ifdef SMALL_MEM char *temp_cfilnam = slide + (7 * (WSIZE>>3)); zfstrcpy((char Far *)temp_cfilnam, G.pInfo->cfilname); # define cFile_PrintBuf temp_cfilnam # else # define cFile_PrintBuf G.pInfo->cfilname # endif Info(slide, 0x401, ((char *)slide, LoadFarStringSmall2(LvsCFNamMsg), FnFilter2(cFile_PrintBuf), FnFilter1(G.filename))); # undef cFile_PrintBuf zfstrcpy(G.filename, G.pInfo->cfilname); if (error_in_archive < PK_WARN) error_in_archive = PK_WARN; } zffree(G.pInfo->cfilname); G.pInfo->cfilname = (char Far *)NULL; } #endif /* !SFX */ /* Size consistency checks must come after reading in the local extra * field, so that any Zip64 extension local e.f. block has already * been processed. */ if (G.lrec.compression_method == STORED) { zusz_t csiz_decrypted = G.lrec.csize; if (G.pInfo->encrypted) csiz_decrypted -= 12; if (G.lrec.ucsize != csiz_decrypted) { Info(slide, 0x401, ((char *)slide, LoadFarStringSmall2(WrnStorUCSizCSizDiff), FnFilter1(G.filename), FmZofft(G.lrec.ucsize, NULL, "u"), FmZofft(csiz_decrypted, NULL, "u"))); G.lrec.ucsize = csiz_decrypted; if (error_in_archive < PK_WARN) error_in_archive = PK_WARN; } } #if CRYPT if (G.pInfo->encrypted && (error = decrypt(__G__ uO.pwdarg)) != PK_COOL) { if (error == PK_WARN) { if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) Info(slide, 0x401, ((char *)slide, LoadFarString(SkipIncorrectPasswd), |Be UNZIP.BCK}>[UNZIP60]EXTRACT.C;1|mb FnFilter1(G.filename))); ++(*pnum_bad_pwd); } else { /* (error > PK_WARN) */ if (error > error_in_archive) error_in_archive = error; Info(slide, 0x401, ((char *)slide, LoadFarString(SkipCannotGetPasswd), FnFilter1(G.filename))); } continue; /* go on to next file */ } #endif /* CRYPT */ /* * just about to extract file: if extracting to disk, check if * already exists, and if so, take appropriate action according to * fflag/uflag/overwrite_all/etc. (we couldn't do this in upper * loop because we don't store the possibly renamed filename[] in * info[]) */ #ifdef DLL if (!uO.tflag && !uO.cflag && !G.redirect_data) #else if (!uO.tflag && !uO.cflag) #endif { renamed = FALSE; /* user hasn't renamed output file yet */ startover: query = FALSE; skip_entry = SKIP_NO; /* for files from DOS FAT, check for use of backslash instead * of slash as directory separator (bug in some zipper(s); so * far, not a problem in HPFS, NTFS or VFAT systems) */ #ifndef SFX if (G.pInfo->hostnum == FS_FAT_ && !MBSCHR(G.filename, '/')) { char *p=G.filename; if (*p) do { if (*p == '\\') { if (!G.reported_backslash) { Info(slide, 0x21, ((char *)slide, LoadFarString(BackslashPathSep), G.zipfn)); G.reported_backslash = TRUE; if (!error_in_archive) error_in_archive = PK_WARN; } *p = '/'; } } while (*PREINCSTR(p)); } #endif /* !SFX */ if (!renamed) { /* remove absolute path specs */ if (G.filename[0] == '/') { Info(slide, 0x401, ((char *)slide, LoadFarString(AbsolutePathWarning), FnFilter1(G.filename))); if (!error_in_archive) error_in_archive = PK_WARN; do { char *p = G.filename + 1; do { *(p-1) = *p; } while (*p++ != '\0'); } while (G.filename[0] == '/'); } } /* mapname can create dirs if not freshening or if renamed */ error = mapname(__G__ renamed); if ((errcode = error & ~MPN_MASK) != PK_OK && error_in_archive < errcode) error_in_archive = errcode; if ((errcode = error & MPN_MASK) > MPN_INF_TRUNC) { if (errcode == MPN_CREATED_DIR) { #ifdef SET_DIR_ATTRIB direntry *d_entry; error = defer_dir_attribs(__G__ &d_entry); if (d_entry == (direntry *)NULL) { /* There may be no dir_attribs info available, or * we have encountered a mem allocation error. * In case of an error, report it and set program * error state to warning level. */ if (error) { Info(slide, 0x401, ((char *)slide, LoadFarString(DirlistEntryNoMem))); if (!error_in_archive) error_in_archive = PK_WARN; } } else { d_entry->next = (*pdirlist); (*pdirlist) = d_entry; ++(*pnum_dirs); } #endif /* SET_DIR_ATTRIB */ } else if (errcode == MPN_VOL_LABEL) { #ifdef DOS_OS2_W32 Info(slide, 0x401, ((char *)slide, LoadFarString(SkipVolumeLabel), FnFilter1(G.filename), uO.volflag? "hard disk " : "")); #else Info(slide, 1, ((char *)slide, LoadFarString(SkipVolumeLabel), FnFilter1(G.filename), "")); #endif } else if (errcode > MPN_INF_SKIP && error_in_archive < PK_ERR) error_in_archive = PK_ERR; Trace((stderr, "mapname(%s) returns error code = %d\n", FnFilter1(G.filename), error)); continue; /* go on to next file */ } #ifdef QDOS QFilename(__G__ G.filename); #endif switch (check_for_newer(__G__ G.filename)) { case DOES_NOT_EXIST: #ifdef NOVELL_BUG_FAILSAFE G.dne = TRUE; /* stat() says file DOES NOT EXIST */ #endif /* freshen (no new files): skip unless just renamed */ if (uO.fflag && !renamed) skip_entry = SKIP_Y_NONEXIST; break; case EXISTS_AND_OLDER: #ifdef UNIXBACKUP if (!uO.B_flag) #endif { if (IS_OVERWRT_NONE) /* never overwrite: skip file */ skip_entry = SKIP_Y_EXISTING; else if (!IS_OVERWRT_ALL) query = TRUE; } break; case EXISTS_AND_NEWER: /* (or equal) */ #ifdef UNIXBACKUP if ((!uO.B_flag && IS_OVERWRT_NONE) || #else if (IS_OVERWRT_NONE || #endif (uO.uflag && !renamed)) { /* skip if update/freshen & orig name */ skip_entry = SKIP_Y_EXISTING; } else { #ifdef UNIXBACKUP if (!IS_OVERWRT_ALL && !uO.B_flag) #else if (!IS_OVERWRT_ALL) #endif query = TRUE; } break; } #ifdef VMS /* 2008-07-24 SMS. * On VMS, if the file name includes a version number, * and "-V" ("retain VMS version numbers", V_flag) is in * effect, then the VMS-specific code will handle any * conflicts with an existing file, making this query * redundant. (Implicit "y" response here.) */ if (query && uO.V_flag) { /* Not discarding file versions. Look for one. */ int cndx = strlen(G.filename) - 1; while ((cndx > 0) && (isdigit(G.filename[cndx]))) cndx--; if (G.filename[cndx] == ';') /* File version found; skip the generic query, * proceeding with its default response "y". */ query = FALSE; } #endif /* VMS */ if (query) { #ifdef WINDLL switch (G.lpUserFunctions->replace != NULL ? (*G.lpUserFunctions->replace)(G.filename, FILNAMSIZ) : IDM_REPLACE_NONE) { case IDM_REPLACE_RENAME: _ISO_INTERN(G.filename); renamed = TRUE; goto startover; }y UNZIP.BCK}>[UNZIP60]EXTRACT.C;1qcase IDM_REPLACE_ALL: G.overwrite_mode = OVERWRT_ALWAYS; /* FALL THROUGH, extract */ case IDM_REPLACE_YES: break; case IDM_REPLACE_NONE: G.overwrite_mode = OVERWRT_NEVER; /* FALL THROUGH, skip */ case IDM_REPLACE_NO: skip_entry = SKIP_Y_EXISTING; break; } #else /* !WINDLL */ extent fnlen; reprompt: Info(slide, 0x81, ((char *)slide, LoadFarString(ReplaceQuery), FnFilter1(G.filename))); if (fgets(G.answerbuf, sizeof(G.answerbuf), stdin) == (char *)NULL) { Info(slide, 1, ((char *)slide, LoadFarString(AssumeNone))); *G.answerbuf = 'N'; if (!error_in_archive) error_in_archive = 1; /* not extracted: warning */ } switch (*G.answerbuf) { case 'r': case 'R': do { Info(slide, 0x81, ((char *)slide, LoadFarString(NewNameQuery))); fgets(G.filename, FILNAMSIZ, stdin); /* usually get \n here: better check for it */ fnlen = strlen(G.filename); if (lastchar(G.filename, fnlen) == '\n') G.filename[--fnlen] = '\0'; } while (fnlen == 0); #ifdef WIN32 /* WIN32 fgets( ... , stdin) returns OEM coded strings */ _OEM_INTERN(G.filename); #endif renamed = TRUE; goto startover; /* sorry for a goto */ case 'A': /* dangerous option: force caps */ G.overwrite_mode = OVERWRT_ALWAYS; /* FALL THROUGH, extract */ case 'y': case 'Y': break; case 'N': G.overwrite_mode = OVERWRT_NEVER; /* FALL THROUGH, skip */ case 'n': /* skip file */ skip_entry = SKIP_Y_EXISTING; break; case '\n': case '\r': /* Improve echo of '\n' and/or '\r' (sizeof(G.answerbuf) == 10 (see globals.h), so there is enough space for the provided text...) */ strcpy(G.answerbuf, "{ENTER}"); /* fall through ... */ default: /* usually get \n here: remove it for nice display (fnlen can be re-used here, we are outside the "enter new filename" loop) */ fnlen = strlen(G.answerbuf); if (lastchar(G.answerbuf, fnlen) == '\n') G.answerbuf[--fnlen] = '\0'; Info(slide, 1, ((char *)slide, LoadFarString(InvalidResponse), G.answerbuf)); goto reprompt; /* yet another goto? */ } /* end switch (*answerbuf) */ #endif /* ?WINDLL */ } /* end if (query) */ if (skip_entry != SKIP_NO) { #ifdef WINDLL if (skip_entry == SKIP_Y_EXISTING) { /* report skipping of an existing entry */ Info(slide, 0, ((char *)slide, ((IS_OVERWRT_NONE || !uO.uflag || renamed) ? "Target file exists. Skipping %s\n" : "Target file newer. Skipping %s\n"), FnFilter1(G.filename))); } #endif /* WINDLL */ continue; } } /* end if (extracting to disk) */ #ifdef DLL if ((G.statreportcb != NULL) && (*G.statreportcb)(__G__ UZ_ST_START_EXTRACT, G.zipfn, G.filename, NULL)) { return IZ_CTRLC; /* cancel operation by user request */ } #endif #ifdef MACOS /* MacOS is no preemptive OS, thus call event-handling by hand */ UserStop(); #endif #ifdef AMIGA G.filenote_slot = i; #endif G.disk_full = 0; if ((error = extract_or_test_member(__G)) != PK_COOL) { if (error > error_in_archive) error_in_archive = error; /* ...and keep going */ #ifdef DLL if (G.disk_full > 1 || error_in_archive == IZ_CTRLC) { #else if (G.disk_full > 1) { #endif return error_in_archive; /* (unless disk full) */ } } #ifdef DLL if ((G.statreportcb != NULL) && (*G.statreportcb)(__G__ UZ_ST_FINISH_MEMBER, G.zipfn, G.filename, (zvoid *)&G.lrec.ucsize)) { return IZ_CTRLC; /* cancel operation by user request */ } #endif #ifdef MACOS /* MacOS is no preemptive OS, thus call event-handling by hand */ UserStop(); #endif } /* end for-loop (i: files in current block) */ return error_in_archive; } /* end function extract_or_test_entrylist() */ /* wsize is used in extract_or_test_member() and UZbunzip2() */ #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) # define wsize G._wsize /* wsize is a variable */ #else # define wsize WSIZE /* wsize is a constant */ #endif /***************************************/ /* Function extract_or_test_member() */ /***************************************/ static int extract_or_test_member(__G) /* return PK-type error code */ __GDEF { char *nul="[empty] ", *txt="[text] ", *bin="[binary]"; #ifdef CMS_MVS char *ebc="[ebcdic]"; #endif register int b; int r, error=PK_COOL; /*--------------------------------------------------------------------------- Initialize variables, buffers, etc. ---------------------------------------------------------------------------*/ G.bits_left = 0; G.bitbuf = 0L; /* unreduce and unshrink only */ G.zipeof = 0; G.newfile = TRUE; G.crc32val = CRCVAL_INITIAL; #ifdef SYMLINKS /* If file is a (POSIX-compatible) symbolic link and we are extracting * to disk, prepare to restore the link. */ G.symlnk = (G.pInfo->symlink && !uO.tflag && !uO.cflag && (G.lrec.ucsize > 0)); #endif /* SYMLINKS */ if (uO.tflag) { if (!uO.qflag) Info(slide, 0, ((char *)slide, LoadFarString(ExtractMsg), "test", FnFilter1(G.filename), "", "")); } else { #ifdef DLL if (uO.cflag && !G.redirect_data) #else if (uO.cflag) #endif { #if (defined(OS2) && defined(__IBMC__) && (__IBMC__ >= 200)) G.outfile = freopen("", "wb", stdout); /* VAC++ ignores setmode */ #else G.outfile = stdout; #endif #ifdef DOS_FLX_NLM_OS2_W32 #if (defined(__HIGHC__) && !defined(FLEXOS)) setmode(G.outfile, _BINARY); #else /* !(defined(__HIGHC__) && !defined(FLEXOS)) */ setmode(fileno(G.outfile), O_BINARY); #endif /* ?(defined(__HIGHC__) && !defined(FLEXOS)) */ # define NEWLINE "\r\n" #else /* !DOS_FLX_NLM_OS2_W32 */ # define NEWLINE "\n" #endif /* ?DOS_FLX_NLM_OS2_W32 */ #ifdef VMS /* VMS: required even for s~̫lI UNZIP.BCK}>[UNZIP60]EXTRACT.C;1Etdout! */ if ((r = open_outfile(__G)) != 0) switch (r) { case OPENOUT_SKIPOK: return PK_OK; case OPENOUT_SKIPWARN: return PK_WARN; default: return PK_DISK; } } else if ((r = open_outfile(__G)) != 0) switch (r) { case OPENOUT_SKIPOK: return PK_OK; case OPENOUT_SKIPWARN: return PK_WARN; default: return PK_DISK; } #else /* !VMS */ } else if (open_outfile(__G)) return PK_DISK; #endif /* ?VMS */ } /*--------------------------------------------------------------------------- Unpack the file. ---------------------------------------------------------------------------*/ defer_leftover_input(__G); /* so NEXTBYTE bounds check will work */ switch (G.lrec.compression_method) { case STORED: if (!uO.tflag && QCOND2) { #ifdef SYMLINKS if (G.symlnk) /* can also be deflated, but rarer... */ Info(slide, 0, ((char *)slide, LoadFarString(ExtractMsg), "link", FnFilter1(G.filename), "", "")); else #endif /* SYMLINKS */ Info(slide, 0, ((char *)slide, LoadFarString(ExtractMsg), "extract", FnFilter1(G.filename), (uO.aflag != 1 /* && G.pInfo->textfile==G.pInfo->textmode */)? "" : (G.lrec.ucsize == 0L? nul : (G.pInfo->textfile? txt : bin)), uO.cflag? NEWLINE : "")); } #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) { wsize = G.redirect_size; redirSlide = G.redirect_buffer; } else { wsize = WSIZE; redirSlide = slide; } #endif G.outptr = redirSlide; G.outcnt = 0L; while ((b = NEXTBYTE) != EOF) { *G.outptr++ = (uch)b; if (++G.outcnt == wsize) { error = flush(__G__ redirSlide, G.outcnt, 0); G.outptr = redirSlide; G.outcnt = 0L; if (error != PK_COOL || G.disk_full) break; } } if (G.outcnt) { /* flush final (partial) buffer */ r = flush(__G__ redirSlide, G.outcnt, 0); if (error < r) error = r; } break; #ifndef SFX #ifndef LZW_CLEAN case SHRUNK: if (!uO.tflag && QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(ExtractMsg), LoadFarStringSmall(Unshrink), FnFilter1(G.filename), (uO.aflag != 1 /* && G.pInfo->textfile==G.pInfo->textmode */)? "" : (G.pInfo->textfile? txt : bin), uO.cflag? NEWLINE : "")); } if ((r = unshrink(__G)) != PK_COOL) { if (r < PK_DISK) { if ((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2)) Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(ErrUnzipFile), r == PK_MEM3 ? LoadFarString(NotEnoughMem) : LoadFarString(InvalidComprData), LoadFarStringSmall2(Unshrink), FnFilter1(G.filename))); else Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(ErrUnzipNoFile), r == PK_MEM3 ? LoadFarString(NotEnoughMem) : LoadFarString(InvalidComprData), LoadFarStringSmall2(Unshrink))); } error = r; } break; #endif /* !LZW_CLEAN */ #ifndef COPYRIGHT_CLEAN case REDUCED1: case REDUCED2: case REDUCED3: case REDUCED4: if (!uO.tflag && QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(ExtractMsg), "unreduc", FnFilter1(G.filename), (uO.aflag != 1 /* && G.pInfo->textfile==G.pInfo->textmode */)? "" : (G.pInfo->textfile? txt : bin), uO.cflag? NEWLINE : "")); } if ((r = unreduce(__G)) != PK_COOL) { /* unreduce() returns only PK_COOL, PK_DISK, or IZ_CTRLC */ error = r; } break; #endif /* !COPYRIGHT_CLEAN */ case IMPLODED: if (!uO.tflag && QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(ExtractMsg), "explod", FnFilter1(G.filename), (uO.aflag != 1 /* && G.pInfo->textfile==G.pInfo->textmode */)? "" : (G.pInfo->textfile? txt : bin), uO.cflag? NEWLINE : "")); } if ((r = explode(__G)) != 0) { if (r == 5) { /* treat 5 specially */ int warning = ((zusz_t)G.used_csize <= G.lrec.csize); if ((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2)) Info(slide, 0x401, ((char *)slide, LoadFarString(LengthMsg), "", warning ? "warning" : "error", FmZofft(G.used_csize, NULL, NULL), FmZofft(G.lrec.ucsize, NULL, "u"), warning ? " " : "", FmZofft(G.lrec.csize, NULL, "u"), " [", FnFilter1(G.filename), "]")); else Info(slide, 0x401, ((char *)slide, LoadFarString(LengthMsg), "\n", warning ? "warning" : "error", FmZofft(G.used_csize, NULL, NULL), FmZofft(G.lrec.ucsize, NULL, "u"), warning ? " " : "", FmZofft(G.lrec.csize, NULL, "u"), "", "", ".")); error = warning ? PK_WARN : PK_ERR; } else if (r < PK_DISK) { if ((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2)) Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(ErrUnzipFile), r == 3? LoadFarString(NotEnoughMem) : LoadFarString(InvalidComprData), LoadFarStringSmall2(Explode), FnFilter1(G.filename))); else Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(ErrUnzipNoFile), r == 3? LoadFarString(NotEnoughMem) : LoadFarString(InvalidComprData), LoadFarStringSmall2(Explode))); error = ((r == 3) ? PK_MEM3 : PK_ERR); } else { error = r; } } break; #endif /* !SFX */ case DEFLATED: #ifdef USE_DEFLATE64 case ENHDEFLATED: #endif if (!uO.tflag && QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(ExtractMsg), "inflat", FnFilter1(G.filename), (uO.aflag != 1 /* && G.pInfo->textfile==G.pInfo->textmode */)? "" : (G.pInfo->textfile? txt : bin), uO.cflag? NEWLINE : "")); } #ifndef USE_ZLIB /* zlib's function is called inflate(), too */ # define UZinflate inflatu̢ UNZIP.BCK}>[UNZIP60]EXTRACT.C;1؇e #endif if ((r = UZinflate(__G__ (G.lrec.compression_method == ENHDEFLATED))) != 0) { if (r < PK_DISK) { if ((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2)) Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(ErrUnzipFile), r == 3? LoadFarString(NotEnoughMem) : LoadFarString(InvalidComprData), LoadFarStringSmall2(Inflate), FnFilter1(G.filename))); else Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(ErrUnzipNoFile), r == 3? LoadFarString(NotEnoughMem) : LoadFarString(InvalidComprData), LoadFarStringSmall2(Inflate))); error = ((r == 3) ? PK_MEM3 : PK_ERR); } else { error = r; } } break; #ifdef USE_BZIP2 case BZIPPED: if (!uO.tflag && QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(ExtractMsg), "bunzipp", FnFilter1(G.filename), (uO.aflag != 1 /* && G.pInfo->textfile==G.pInfo->textmode */)? "" : (G.pInfo->textfile? txt : bin), uO.cflag? NEWLINE : "")); } if ((r = UZbunzip2(__G)) != 0) { if (r < PK_DISK) { if ((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2)) Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(ErrUnzipFile), r == 3? LoadFarString(NotEnoughMem) : LoadFarString(InvalidComprData), LoadFarStringSmall2(BUnzip), FnFilter1(G.filename))); else Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(ErrUnzipNoFile), r == 3? LoadFarString(NotEnoughMem) : LoadFarString(InvalidComprData), LoadFarStringSmall2(BUnzip))); error = ((r == 3) ? PK_MEM3 : PK_ERR); } else { error = r; } } break; #endif /* USE_BZIP2 */ default: /* should never get to this point */ Info(slide, 0x401, ((char *)slide, LoadFarString(FileUnknownCompMethod), FnFilter1(G.filename))); /* close and delete file before return? */ undefer_input(__G); return PK_WARN; } /* end switch (compression method) */ /*--------------------------------------------------------------------------- Close the file and set its date and time (not necessarily in that order), and make sure the CRC checked out OK. Logical-AND the CRC for 64-bit machines (redundant on 32-bit machines). ---------------------------------------------------------------------------*/ #ifdef VMS /* VMS: required even for stdout! (final flush) */ if (!uO.tflag) /* don't close NULL file */ close_outfile(__G); #else #ifdef DLL if (!uO.tflag && (!uO.cflag || G.redirect_data)) { if (G.redirect_data) FINISH_REDIRECT(); else close_outfile(__G); } #else if (!uO.tflag && !uO.cflag) /* don't close NULL file or stdout */ close_outfile(__G); #endif #endif /* VMS */ /* GRR: CONVERT close_outfile() TO NON-VOID: CHECK FOR ERRORS! */ if (G.disk_full) { /* set by flush() */ if (G.disk_full > 1) { #if (defined(DELETE_IF_FULL) && defined(HAVE_UNLINK)) /* delete the incomplete file if we can */ if (unlink(G.filename) != 0) Trace((stderr, "extract.c: could not delete %s\n", FnFilter1(G.filename))); #else /* warn user about the incomplete file */ Info(slide, 0x421, ((char *)slide, LoadFarString(FileTruncated), FnFilter1(G.filename))); #endif error = PK_DISK; } else { error = PK_WARN; } } if (error > PK_WARN) {/* don't print redundant CRC error if error already */ undefer_input(__G); return error; } if (G.crc32val != G.lrec.crc32) { /* if quiet enough, we haven't output the filename yet: do it */ if ((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2)) Info(slide, 0x401, ((char *)slide, "%-22s ", FnFilter1(G.filename))); Info(slide, 0x401, ((char *)slide, LoadFarString(BadCRC), G.crc32val, G.lrec.crc32)); #if CRYPT if (G.pInfo->encrypted) Info(slide, 0x401, ((char *)slide, LoadFarString(MaybeBadPasswd))); #endif error = PK_ERR; } else if (uO.tflag) { #ifndef SFX if (G.extra_field) { if ((r = TestExtraField(__G__ G.extra_field, G.lrec.extra_field_length)) > error) error = r; } else #endif /* !SFX */ if (!uO.qflag) Info(slide, 0, ((char *)slide, " OK\n")); } else { if (QCOND2 && !error) /* GRR: is stdout reset to text mode yet? */ Info(slide, 0, ((char *)slide, "\n")); } undefer_input(__G); return error; } /* end function extract_or_test_member() */ #ifndef SFX /*******************************/ /* Function TestExtraField() */ /*******************************/ static int TestExtraField(__G__ ef, ef_len) __GDEF uch *ef; unsigned ef_len; { ush ebID; unsigned ebLen; unsigned eb_cmpr_offs = 0; int r; /* we know the regular compressed file data tested out OK, or else we * wouldn't be here ==> print filename if any extra-field errors found */ while (ef_len >= EB_HEADSIZE) { ebID = makeword(ef); ebLen = (unsigned)makeword(ef+EB_LEN); if (ebLen > (ef_len - EB_HEADSIZE)) { /* Discovered some extra field inconsistency! */ if (uO.qflag) Info(slide, 1, ((char *)slide, "%-22s ", FnFilter1(G.filename))); Info(slide, 1, ((char *)slide, LoadFarString(InconsistEFlength), ebLen, (ef_len - EB_HEADSIZE))); return PK_ERR; } switch (ebID) { case EF_OS2: case EF_ACL: case EF_MAC3: case EF_BEOS: case EF_ATHEOS: switch (ebID) { case EF_OS2: case EF_ACL: eb_cmpr_offs = EB_OS2_HLEN; break; case EF_MAC3: if (ebLen >= EB_MAC3_HLEN && (makeword(ef+(EB_HEADSIZE+EB_FLGS_OFFS)) & EB_M3_FL_UNCMPR) && (makelong(ef+EB_HEADSIZE) == ebLen - EB_MAC3_HLEN)) eb_cmpr_offs = 0; else eb_cmpr_offs = EB_MAC3_HLEN; break; case EF_BEOS: case EF_ATHEOS: if (ebLen >= EB_BEOS_HLEN && (*(ef+(EB_HEADSIZE+EB_FLGS_OFFS)) & EB_BE_FL_UNCMPR) && (makelong(ef+EB_HEADSIZE) == ebLen - EB_BEOS_HLEN)) eb_cmpr_offs = 0; else eb_cmpr_offs =df UNZIP.BCK}>[UNZIP60]EXTRACT.C;1 EB_BEOS_HLEN; break; } if ((r = test_compr_eb(__G__ ef, ebLen, eb_cmpr_offs, NULL)) != PK_OK) { if (uO.qflag) Info(slide, 1, ((char *)slide, "%-22s ", FnFilter1(G.filename))); switch (r) { case IZ_EF_TRUNC: Info(slide, 1, ((char *)slide, LoadFarString(TruncEAs), ebLen-(eb_cmpr_offs+EB_CMPRHEADLEN), "\n")); break; case PK_ERR: Info(slide, 1, ((char *)slide, LoadFarString(InvalidComprDataEAs))); break; case PK_MEM3: case PK_MEM4: Info(slide, 1, ((char *)slide, LoadFarString(NotEnoughMemEAs))); break; default: if ((r & 0xff) != PK_ERR) Info(slide, 1, ((char *)slide, LoadFarString(UnknErrorEAs))); else { ush m = (ush)(r >> 8); if (m == DEFLATED) /* GRR KLUDGE! */ Info(slide, 1, ((char *)slide, LoadFarString(BadCRC_EAs))); else Info(slide, 1, ((char *)slide, LoadFarString(UnknComprMethodEAs), m)); } break; } return r; } break; case EF_NTSD: Trace((stderr, "ebID: %i / ebLen: %u\n", ebID, ebLen)); r = ebLen < EB_NTSD_L_LEN ? IZ_EF_TRUNC : ((ef[EB_HEADSIZE+EB_NTSD_VERSION] > EB_NTSD_MAX_VER) ? (PK_WARN | 0x4000) : test_compr_eb(__G__ ef, ebLen, EB_NTSD_L_LEN, TEST_NTSD)); if (r != PK_OK) { if (uO.qflag) Info(slide, 1, ((char *)slide, "%-22s ", FnFilter1(G.filename))); switch (r) { case IZ_EF_TRUNC: Info(slide, 1, ((char *)slide, LoadFarString(TruncNTSD), ebLen-(EB_NTSD_L_LEN+EB_CMPRHEADLEN), "\n")); break; #if (defined(WIN32) && defined(NTSD_EAS)) case PK_WARN: Info(slide, 1, ((char *)slide, LoadFarString(InvalidSecurityEAs))); break; #endif case PK_ERR: Info(slide, 1, ((char *)slide, LoadFarString(InvalidComprDataEAs))); break; case PK_MEM3: case PK_MEM4: Info(slide, 1, ((char *)slide, LoadFarString(NotEnoughMemEAs))); break; case (PK_WARN | 0x4000): Info(slide, 1, ((char *)slide, LoadFarString(UnsuppNTSDVersEAs), (int)ef[EB_HEADSIZE+EB_NTSD_VERSION])); r = PK_WARN; break; default: if ((r & 0xff) != PK_ERR) Info(slide, 1, ((char *)slide, LoadFarString(UnknErrorEAs))); else { ush m = (ush)(r >> 8); if (m == DEFLATED) /* GRR KLUDGE! */ Info(slide, 1, ((char *)slide, LoadFarString(BadCRC_EAs))); else Info(slide, 1, ((char *)slide, LoadFarString(UnknComprMethodEAs), m)); } break; } return r; } break; case EF_PKVMS: if (makelong(ef+EB_HEADSIZE) != crc32(CRCVAL_INITIAL, ef+(EB_HEADSIZE+4), (extent)(ebLen-4))) Info(slide, 1, ((char *)slide, LoadFarString(BadCRC_EAs))); break; case EF_PKW32: case EF_PKUNIX: case EF_ASIUNIX: case EF_IZVMS: case EF_IZUNIX: case EF_VMCMS: case EF_MVS: case EF_SPARK: case EF_TANDEM: case EF_THEOS: case EF_AV: default: break; } ef_len -= (ebLen + EB_HEADSIZE); ef += (ebLen + EB_HEADSIZE); } if (!uO.qflag) Info(slide, 0, ((char *)slide, " OK\n")); return PK_COOL; } /* end function TestExtraField() */ /******************************/ /* Function test_compr_eb() */ /******************************/ #ifdef PROTO static int test_compr_eb( __GPRO__ uch *eb, unsigned eb_size, unsigned compr_offset, int (*test_uc_ebdata)(__GPRO__ uch *eb, unsigned eb_size, uch *eb_ucptr, ulg eb_ucsize)) #else /* !PROTO */ static int test_compr_eb(__G__ eb, eb_size, compr_offset, test_uc_ebdata) __GDEF uch *eb; unsigned eb_size; unsigned compr_offset; int (*test_uc_ebdata)(); #endif /* ?PROTO */ { ulg eb_ucsize; uch *eb_ucptr; int r; if (compr_offset < 4) /* field is not compressed: */ return PK_OK; /* do nothing and signal OK */ if ((eb_size < (EB_UCSIZE_P + 4)) || ((eb_ucsize = makelong(eb+(EB_HEADSIZE+EB_UCSIZE_P))) > 0L && eb_size <= (compr_offset + EB_CMPRHEADLEN))) return IZ_EF_TRUNC; /* no compressed data! */ if ( #ifdef INT_16BIT (((ulg)(extent)eb_ucsize) != eb_ucsize) || #endif (eb_ucptr = (uch *)malloc((extent)eb_ucsize)) == (uch *)NULL) return PK_MEM4; r = memextract(__G__ eb_ucptr, eb_ucsize, eb + (EB_HEADSIZE + compr_offset), (ulg)(eb_size - compr_offset)); if (r == PK_OK && test_uc_ebdata != NULL) r = (*test_uc_ebdata)(__G__ eb, eb_size, eb_ucptr, eb_ucsize); free(eb_ucptr); return r; } /* end function test_compr_eb() */ #endif /* !SFX */ /***************************/ /* Function memextract() */ /***************************/ int memextract(__G__ tgt, tgtsize, src, srcsize) /* extract compressed */ __GDEF /* extra field block; */ uch *tgt; /* return PK-type error */ ulg tgtsize; /* level */ ZCONST uch *src; ulg srcsize; { zoff_t old_csize=G.csize; uch *old_inptr=G.inptr; int old_incnt=G.incnt; int r, error=PK_OK; ush method; ulg extra_field_crc; method = makeword(src); extra_field_crc = makelong(src+2); /* compres{+h UNZIP.BCK}>[UNZIP60]EXTRACT.C;1zsed extra field exists completely in memory at this location: */ G.inptr = (uch *)src + (2 + 4); /* method and extra_field_crc */ G.incnt = (int)(G.csize = (long)(srcsize - (2 + 4))); G.mem_mode = TRUE; G.outbufptr = tgt; G.outsize = tgtsize; switch (method) { case STORED: memcpy((char *)tgt, (char *)G.inptr, (extent)G.incnt); G.outcnt = (ulg)G.csize; /* for CRC calculation */ break; case DEFLATED: #ifdef USE_DEFLATE64 case ENHDEFLATED: #endif G.outcnt = 0L; if ((r = UZinflate(__G__ (method == ENHDEFLATED))) != 0) { if (!uO.tflag) Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(ErrUnzipNoFile), r == 3? LoadFarString(NotEnoughMem) : LoadFarString(InvalidComprData), LoadFarStringSmall2(Inflate))); error = (r == 3)? PK_MEM3 : PK_ERR; } if (G.outcnt == 0L) /* inflate's final FLUSH sets outcnt */ break; break; default: if (uO.tflag) error = PK_ERR | ((int)method << 8); else { Info(slide, 0x401, ((char *)slide, LoadFarString(UnsupportedExtraField), method)); error = PK_ERR; /* GRR: should be passed on up via SetEAs() */ } break; } G.inptr = old_inptr; G.incnt = old_incnt; G.csize = old_csize; G.mem_mode = FALSE; if (!error) { register ulg crcval = crc32(CRCVAL_INITIAL, tgt, (extent)G.outcnt); if (crcval != extra_field_crc) { if (uO.tflag) error = PK_ERR | (DEFLATED << 8); /* kludge for now */ else { Info(slide, 0x401, ((char *)slide, LoadFarString(BadExtraFieldCRC), G.zipfn, crcval, extra_field_crc)); error = PK_ERR; } } } return error; } /* end function memextract() */ /*************************/ /* Function memflush() */ /*************************/ int memflush(__G__ rawbuf, size) __GDEF ZCONST uch *rawbuf; ulg size; { if (size > G.outsize) /* Here, PK_DISK is a bit off-topic, but in the sense of marking "overflow of output space", its use may be tolerated. */ return PK_DISK; /* more data than output buffer can hold */ memcpy((char *)G.outbufptr, (char *)rawbuf, (extent)size); G.outbufptr += (unsigned int)size; G.outsize -= size; G.outcnt += size; return 0; } /* end function memflush() */ #if (defined(VMS) || defined(VMS_TEXT_CONV)) /************************************/ /* Function extract_izvms_block() */ /************************************/ /* * Extracts block from p. If resulting length is less than needed, fill * extra space with corresponding bytes from 'init'. * Currently understands 3 formats of block compression: * - Simple storing * - Compression of zero bytes to zero bits * - Deflation (see memextract()) * The IZVMS block data is returned in malloc'd space. */ uch *extract_izvms_block(__G__ ebdata, size, retlen, init, needlen) __GDEF ZCONST uch *ebdata; unsigned size; unsigned *retlen; ZCONST uch *init; unsigned needlen; { uch *ucdata; /* Pointer to block allocated */ int cmptype; unsigned usiz, csiz; cmptype = (makeword(ebdata+EB_IZVMS_FLGS) & EB_IZVMS_BCMASK); csiz = size - EB_IZVMS_HLEN; usiz = (cmptype == EB_IZVMS_BCSTOR ? csiz : makeword(ebdata+EB_IZVMS_UCSIZ)); if (retlen) *retlen = usiz; if ((ucdata = (uch *)malloc(MAX(needlen, usiz))) == NULL) return NULL; if (init && (usiz < needlen)) memcpy((char *)ucdata, (ZCONST char *)init, needlen); switch (cmptype) { case EB_IZVMS_BCSTOR: /* The simplest case */ memcpy(ucdata, ebdata+EB_IZVMS_HLEN, usiz); break; case EB_IZVMS_BC00: decompress_bits(ucdata, usiz, ebdata+EB_IZVMS_HLEN); break; case EB_IZVMS_BCDEFL: memextract(__G__ ucdata, (ulg)usiz, ebdata+EB_IZVMS_HLEN, (ulg)csiz); break; default: free(ucdata); ucdata = NULL; } return ucdata; } /* end of extract_izvms_block */ /********************************/ /* Function decompress_bits() */ /********************************/ /* * Simple uncompression routine. The compression uses bit stream. * Compression scheme: * * if (byte!=0) * putbit(1),putbyte(byte) * else * putbit(0) */ static void decompress_bits(outptr, needlen, bitptr) uch *outptr; /* Pointer into output block */ unsigned needlen; /* Size of uncompressed block */ ZCONST uch *bitptr; /* Pointer into compressed data */ { ulg bitbuf = 0; int bitcnt = 0; #define _FILL { bitbuf |= (*bitptr++) << bitcnt;\ bitcnt += 8; \ } while (needlen--) { if (bitcnt <= 0) _FILL; if (bitbuf & 1) { bitbuf >>= 1; if ((bitcnt -= 1) < 8) _FILL; *outptr++ = (uch)bitbuf; bitcnt -= 8; bitbuf >>= 8; } else { *outptr++ = '\0'; bitcnt -= 1; bitbuf >>= 1; } } } /* end function decompress_bits() */ #endif /* VMS || VMS_TEXT_CONV */ #ifdef SYMLINKS /***********************************/ /* Function set_deferred_symlink() */ /***********************************/ static void set_deferred_symlink(__G__ slnk_entry) __GDEF slinkentry *slnk_entry; { extent ucsize = slnk_entry->targetlen; char *linkfname = slnk_entry->fname; char *linktarget = (char *)malloc(ucsize+1); if (!linktarget) { Info(slide, 0x201, ((char *)slide, LoadFarString(SymLnkWarnNoMem), FnFilter1(linkfname))); return; } linktarget[ucsize] = '\0'; G.outfile = zfopen(linkfname, FOPR); /* open link placeholder for reading */ /* Check that the following conditions are all fulfilled: * a) the placeholder file exists, * b) the placeholder file contains exactly "ucsize" bytes * (read the expected placeholder content length + 1 extra byte, this * should return the expected content length), * c) the placeholder content matches the link target specification as * stored in the symlink control structure. */ if (!G.outfile || fread(linktarget, 1, ucsize+1, G.outfile) != ucsize || strcmp(slnk_entry->target, linktarget)) { Info(slide, 0x201, ((char *)slide, LoadFarString(SymLnkWarnInvalid), FnFilter1(linkfname))); free(linktarget); if (G.outfile) fclose(G.outfile); return; } fclose(G.outfile); /* close "data" file for good... */ unlink(linkfname); /* ...and delete it */ if (QCOND2) Info(slide, 0, ((char *)slide, LoadFarString(SymLnkFinish), FnFilter1(linkfname), FnFilter2(linktarget))); if (symlink(linktarget, linkfname)) /* create the real link */ perror("symlink error"); free(linktarget); #ifdef SET_SYMLINK_ATTRIBS set_symlnk_attribs(__G__ slnk_entry); #endif return; /* can't set time on symlinks */ } /* end function set_deferred_symlink() */ #endif /* SYM휄e UNZIP.BCK}>[UNZIP60]EXTRACT.C;1LINKS */ /*************************/ /* Function fnfilter() */ /* here instead of in list.c for SFX */ /*************************/ char *fnfilter(raw, space, size) /* convert name to safely printable form */ ZCONST char *raw; uch *space; extent size; { #ifndef NATIVE /* ASCII: filter ANSI escape codes, etc. */ ZCONST uch *r=(ZCONST uch *)raw; uch *s=space; uch *slim=NULL; uch *se=NULL; int have_overflow = FALSE; if (size > 0) { slim = space + size #ifdef _MBCS - (MB_CUR_MAX - 1) #endif - 4; } while (*r) { if (size > 0 && s >= slim && se == NULL) { se = s; } #ifdef QDOS if (qlflag & 2) { if (*r == '/' || *r == '.') { if (se != NULL && (s > (space + (size-3)))) { have_overflow = TRUE; break; } ++r; *s++ = '_'; continue; } } else #endif #ifdef HAVE_WORKING_ISPRINT # ifndef UZ_FNFILTER_REPLACECHAR /* A convenient choice for the replacement of unprintable char codes is * the "single char wildcard", as this character is quite unlikely to * appear in filenames by itself. The following default definition * sets the replacement char to a question mark as the most common * "single char wildcard"; this setting should be overridden in the * appropiate system-specific configuration header when needed. */ # define UZ_FNFILTER_REPLACECHAR '?' # endif if (!isprint(*r)) { if (*r < 32) { /* ASCII control codes are escaped as "^{letter}". */ if (se != NULL && (s > (space + (size-4)))) { have_overflow = TRUE; break; } *s++ = '^', *s++ = (uch)(64 + *r++); } else { /* Other unprintable codes are replaced by the * placeholder character. */ if (se != NULL && (s > (space + (size-3)))) { have_overflow = TRUE; break; } *s++ = UZ_FNFILTER_REPLACECHAR; INCSTR(r); } #else /* !HAVE_WORKING_ISPRINT */ if (*r < 32) { /* ASCII control codes are escaped as "^{letter}". */ if (se != NULL && (s > (space + (size-4)))) { have_overflow = TRUE; break; } *s++ = '^', *s++ = (uch)(64 + *r++); #endif /* ?HAVE_WORKING_ISPRINT */ } else { #ifdef _MBCS unsigned i = CLEN(r); if (se != NULL && (s > (space + (size-i-2)))) { have_overflow = TRUE; break; } for (; i > 0; i--) *s++ = *r++; #else if (se != NULL && (s > (space + (size-3)))) { have_overflow = TRUE; break; } *s++ = *r++; #endif } } if (have_overflow) { strcpy((char *)se, "..."); } else { *s = '\0'; } #ifdef WINDLL INTERN_TO_ISO((char *)space, (char *)space); /* translate to ANSI */ #else #if (defined(WIN32) && !defined(_WIN32_WCE)) /* Win9x console always uses OEM character coding, and WinNT console is set to OEM charset by default, too */ INTERN_TO_OEM((char *)space, (char *)space); #endif /* (WIN32 && !_WIN32_WCE) */ #endif /* ?WINDLL */ return (char *)space; #else /* NATIVE: EBCDIC or whatever */ return (char *)raw; #endif } /* end function fnfilter() */ #ifdef SET_DIR_ATTRIB /* must sort saved directories so can set perms from bottom up */ /************************/ /* Function dircomp() */ /************************/ static int Cdecl dircomp(a, b) /* used by qsort(); swiped from Zip */ ZCONST zvoid *a, *b; { /* order is significant: this sorts in reverse order (deepest first) */ return strcmp((*(direntry **)b)->fn, (*(direntry **)a)->fn); /* return namecmp((*(direntry **)b)->fn, (*(direntry **)a)->fn); */ } #endif /* SET_DIR_ATTRIB */ #ifdef USE_BZIP2 /**************************/ /* Function UZbunzip2() */ /**************************/ int UZbunzip2(__G) __GDEF /* decompress a bzipped entry using the libbz2 routines */ { int retval = 0; /* return code: 0 = "no error" */ int err=BZ_OK; int repeated_buf_err; bz_stream bstrm; #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) wsize = G.redirect_size, redirSlide = G.redirect_buffer; else wsize = WSIZE, redirSlide = slide; #endif bstrm.next_out = (char *)redirSlide; bstrm.avail_out = wsize; bstrm.next_in = (char *)G.inptr; bstrm.avail_in = G.incnt; { /* local buffer for efficiency */ /* $TODO Check for BZIP LIB version? */ bstrm.bzalloc = NULL; bstrm.bzfree = NULL; bstrm.opaque = NULL; Trace((stderr, "initializing bzlib()\n")); err = BZ2_bzDecompressInit(&bstrm, 0, 0); if (err == BZ_MEM_ERROR) return 3; else if (err != BZ_OK) Trace((stderr, "oops! (BZ2_bzDecompressInit() err = %d)\n", err)); } #ifdef FUNZIP while (err != BZ_STREAM_END) { #else /* !FUNZIP */ while (G.csize > 0) { Trace((stderr, "first loop: G.csize = %ld\n", G.csize)); #endif /* ?FUNZIP */ while (bstrm.avail_out > 0) { err = BZ2_bzDecompress(&bstrm); if (err == BZ_DATA_ERROR) { retval = 2; goto uzbunzip_cleanup_exit; } else if (err == BZ_MEM_ERROR) { retval = 3; goto uzbunzip_cleanup_exit; } else if (err != BZ_OK && err != BZ_STREAM_END) Trace((stderr, "oops! (bzip(first loop) err = %d)\n", err)); #ifdef FUNZIP if (err == BZ_STREAM_END) /* "END-of-entry-condition" ? */ #else /* !FUNZIP */ if (G.csize <= 0L) /* "END-of-entry-condition" ? */ #endif /* ?FUNZIP */ break; if (bstrm.avail_in == 0) { if (fillinbuf(__G) == 0) { /* no "END-condition" yet, but no more data */ retval = 2; goto uzbunzip_cleanup_exit; } bstrm.next_in = (char *)G.inptr; bstrm.avail_in = G.incnt; } Trace((stderr, " avail_in = %u\n", bstrm.avail_in)); } /* flush slide[] */ if ((retval = FLUSH(wsize - bstrm.avail_out)) != 0) goto uzbunzip_cleanup_exit; Trace((stderr, "inside loop: flushing %ld bytes (ptr diff = %ld)\n", (long)(wsize - bstrm.avail_out), (long)(bstrm.next_out-(char *)redirSlide))); bstrm.next_out = (char *)redirSlide; bstrm.avail_out = wsize; } /* no more input, so loop until we have all output */ Trace((stderr, "beginning final loop: err = %d\n", err)); repeated_buf_err = FALSE; while (err != BZ_STREAM_END) { err = BZ2_bzDecompress(&bstrm); if (err == BZ_DATA_ERROR) { retval = 2; goto uzbunzip_cleanup_exit; } else if (err == BZ_MEM_ERROR) { retval = 3; goto uzbunzip_cleanup_exit; } else if (err != BZ_OK && err != BZ_STREAM_END) { Trace((stderr, "oops! (bzip(final loop) err = %d)\n", err)); DESTROYGLOBALS(); EXIT(PK_MEM3); } /* final flush of slide[] */ if ((retval = FLUSH(wsize - bstrm.avail_out)) != 0) goto uzbunzip_cleanup_c UNZIP.BCK}>[UNZIP60]EXTRACT.C;1Cnexit; Trace((stderr, "final loop: flushing %ld bytes (ptr diff = %ld)\n", (long)(wsize - bstrm.avail_out), (long)(bstrm.next_out-(char *)redirSlide))); bstrm.next_out = (char *)redirSlide; bstrm.avail_out = wsize; } #ifdef LARGE_FILE_SUPPORT Trace((stderr, "total in = %llu, total out = %llu\n", (zusz_t)(bstrm.total_in_lo32) + ((zusz_t)(bstrm.total_in_hi32))<<32, (zusz_t)(bstrm.total_out_lo32) + ((zusz_t)(bstrm.total_out_hi32))<<32)); #else Trace((stderr, "total in = %lu, total out = %lu\n", bstrm.total_in_lo32, bstrm.total_out_lo32)); #endif G.inptr = (uch *)bstrm.next_in; G.incnt = (G.inbuf + INBUFSIZ) - G.inptr; /* reset for other routines */ uzbunzip_cleanup_exit: err = BZ2_bzDecompressEnd(&bstrm); if (err != BZ_OK) Trace((stderr, "oops! (BZ2_bzDecompressEnd() err = %d)\n", err)); return retval; } /* end function UZbunzip2() */ #endif /* USE_BZIP2 */ *[UNZIP60]FILEIO.C;1+,./ 4@->0123KPWO56pT䤨7pT䤨89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- fileio.c This file contains routines for doing direct but relatively generic input/ output, file-related sorts of things, plus some miscellaneous stuff. Most of the stuff has to do with opening, closing, reading and/or writing files. Contains: open_input_file() open_outfile() (not: VMS, AOS/VS, CMSMVS, MACOS, TANDEM) undefer_input() defer_leftover_input() readbuf() readbyte() fillinbuf() seek_zipf() flush() (non-VMS) is_vms_varlen_txt() (non-VMS, VMS_TEXT_CONV only) disk_error() (non-VMS) UzpMessagePrnt() UzpMessageNull() (DLL only) UzpInput() UzpMorePause() UzpPassword() (non-WINDLL) handler() dos_to_unix_time() (non-VMS, non-VM/CMS, non-MVS) check_for_newer() (non-VMS, non-OS/2, non-VM/CMS, non-MVS) do_string() makeword() makelong() makeint64() fzofft() str2iso() (CRYPT && NEED_STR2ISO, only) str2oem() (CRYPT && NEED_STR2OEM, only) memset() (ZMEM only) memcpy() (ZMEM only) zstrnicmp() (NO_STRNICMP only) zstat() (REGULUS only) plastchar() (_MBCS only) uzmbclen() (_MBCS && NEED_UZMBCLEN, only) uzmbschr() (_MBCS && NEED_UZMBSCHR, only) uzmbsrchr() (_MBCS && NEED_UZMBSRCHR, only) fLoadFarString() (SMALL_MEM only) fLoadFarStringSmall() (SMALL_MEM only) fLoadFarStringSmall2() (SMALL_MEM only) zfstrcpy() (SMALL_MEM only) zfstrcmp() (SMALL_MEM && !(SFX || FUNZIP) only) ---------------------------------------------------------------------------*/ #define __FILEIO_C /* identifies this source module */ #define UNZIP_INTERNAL #include "unzip.h" #ifdef WINDLL # ifdef POCKET_UNZIP # include "wince/intrface.h" # else # include "windll/windll.h" # endif # include #endif #include "crc32.h" #include "crypt.h" #include "ttyio.h" /* setup of codepage conversion for decryption passwords */ #if CRYPT # if (defined(CRYP_USES_ISO2OEM) && !defined(IZ_ISO2OEM_ARRAY)) # define IZ_ISO2OEM_ARRAY /* pull in iso2oem[] table */ # endif # if (defined(CRYP_USES_OEM2ISO) && !defined(IZ_OEM2ISO_ARRAY)) # define IZ_OEM2ISO_ARRAY /* pull in oem2iso[] table */ # endif #endif #include "ebcdic.h" /* definition/initialization of ebcdic[] */ /* Note: Under Windows, the maximum size of the buffer that can be used with any of the *printf calls is 16,384, so win_fprintf was used to feed the fprintf clone no more than 16K chunks at a time. This should be valid for anything up to 64K (and probably beyond, assuming your buffers are that big). */ #ifdef WINDLL # define WriteError(buf,len,strm) \ (win_fprintf(pG, strm, (extent)len, (char far *)buf) != (int)(len)) #else /* !WINDLL */ # ifdef USE_FWRITE # define WriteError(buf,len,strm) \ ((extent)fwrite((char *)(buf),1,(extent)(len),strm) != (extent)(len)) # else # define WriteError(buf,len,strm) \ ((extent)write(fileno(strm),(char *)(buf),(extent)(len)) != (extent)(len)) # endif #endif /* ?WINDLL */ /* 2005-09-16 SMS. On VMS, when output is redirected to a file, as in a command like "PIPE UNZIP -v > X.OUT", the output file is created with VFC record format, and multiple calls to write() or fwrite() will produce multiple records, even when there's no newline terminator in the buffer. The result is unsightly output with spurious newlines. Using fprintf() instead of write() here, and disabling a fflush(stdout) in UzpMessagePrnt() below, together seem to solve the problem. According to the C RTL manual, "The write and decc$record_write functions always generate at least one record." Also, "[T]he fwrite function always generates at least records." So, "fwrite(buf, len, 1, strm)" is much better ("1" record) than "fwrite(buf, 1, len, strm)" ("len" (1-character) records, _really_ ugly), but neither is better than write(). Similarly, "The fflush function always generates a record if there is unwritten data in the buffer." Apparently fprintf() buffers the stuff somewhere, and puts out a record (only) when it sees a newline. */ #ifdef VMS # define WriteTxtErr(buf,len,strm) \ ((extent)fprintf(strm, "%.*s", len, buf) != (extent)(len)) #else # define WriteTxtErr(buf,len,strm) WriteError(buf,len,strm) #endif #if (defined(USE_DEFLATE64) && defined(__16BIT__)) static int partflush OF((__GPRO__ uch *rawbuf, ulg size, int unshrink)); #endif #ifdef VMS_TEXT_CONV static int is_vms_varlen_txt OF((__GPRO__ uch *ef_buf, unsigned ef_len)); #endif static int disk_error OF((__GPRO)); /****************************/ /* Strings used in fileio.c */ /****************************/ static ZCONST char Far CannotOpenZipfile[] = "error: cannot open zipfile [ %s ]\n %s\n"; #if (!defined(VMS) && !defined(AOS_VS) && !defined(CMS_MVS) && !defined(MACOS)) #if (!defined(TANDEM)) #if (defined(ATH_BEO_THS_UNX) || defined(DOS_FLX_NLM_OS2_W32)) static ZCONST char Far CannotDeleteOldFile[] = "error: cannot delete old %s\n %s\n"; #ifdef UNIXBACKUP static ZCONST char Far CannotRenameOi(O"3?8KKQ&w`X1q8&b2V@i"H 6Sf3[L0@u5 X  ]L |+J7E_^4h^$-i pgO6%|tU"Eo)597NTQ=?]2<`.s8u @7S3=8KFEW,{K%-/ W XWqZ ut? A,b:xQxat'nM4PT6KhhbydP7szX-2]V R4hSench12o~7k" [OoO2jPA):t> X KTY{+S\q6%F;;|#~m{a{xqa1._a/ )Sjf+ ]fwjP,i;aF^xT3@erMimD\xU=\;rmR*VS?EsJ`,F[KB[K9 c} 2F9Nga}Jf/m`,u^t6ekTk{?5 2C"~yc0>U&412<-30Wr7qY39/bGw 3,I ("5ai)  \J\8 " Q,] 3ULG=H;!.*a#NY Xlw@`oJM"Q^{dDBaOah[Nr"mQYX/1WYP:zxeab / JARH3_^|-q7}@AyabzOX}x1]gS-[Qa ej]~wzxwqU?&UXKq""Y}6yW5*q_P5]]l512>9 sL!ntrBr IUPGEc1 .3\,slKQ.r$se"2DF#4@!%Vc\i?}Ue[6K~C%\w5 $#< H1,kF :T>+-Rh_bNE]t~Bk&%C  k&OeJ !3qFe?CG~'llLPP^soRR;2r&5dcV}thB.STe.y`>|-!rON#(/boLQL6rGd<*&}b-?3;l A9Zj{0y!KC=]L3 !^H7 F tmjO DKRD>ii<2{;~!U#cca{cl(v Ij?#} !md_bdsg*L',.T(4Wdr vV80jr:s4`xI35q7.?`Lh :v;K}u4& Y y(Zb%89h_i@d`U4}V~&?j8JThH SKZ6ztz @F\?C}"r|r<'xQ=QWIT`?*DRFy!ry/M> BKdf>l}e (miT ?],yt2q;0G FNr2b9-Miryr,gMXm-UX]lARHLE%T b0#`>gJ5gB`dmc}<Rx+ 5do@lf=q4Gf H 0yS_+uVuwpfu[ {CL%fS-D:)eZFAg_Wi}O7yU P,sEpMVP*UG$*ZY4iT>g#Op{!KOQi-HPi"ws0d{bNbh)zXN Vq%F!.&BYK`D:yq$dq?=R``Q3@ R)Os2 D`wAEa[|~;;Io7#tW\ 9_0k,>h:-MVAf4tEC>]DjQ+wT !]6T3L."v_uj 47[5-g_sf{ k-PU+q>`Ufn7qE{i|l"fh8V5d^N[1E{+m*`K.a4$Jg>Qh G~ roO/O"8\I }k az/.*T{5Q_I* =Ki<7(}6Lnr)( !&e/7-jZo9>ER1xoB{uo~:6bbv .;'hk)xEQ &+ J9MNA?R*b_`lODKGJ#JjnqX(AP(R5 p<*P Ia R,Gv/Wxvi,q, VBY$%_0^ 2hpDPIA&8%ewp"$,hmhrWSK@eN$6gK >g~aho*I?5 U9l %?G MtD" m}f@nC&y.v u0:! -$O/\8/K.AjPQ>f]gA-f>sB0rgvl0=FGh pVvxI`RWU_2C'I0Y<-l\uONS#1b2O[3PTT,mz5\@5_{@7:&ZFBZA< M oJ_#H(l]+$I&,DA!5)">N6g Gz?XqD%$87y1_96FDz?,O@[XF/7"5vK!h]W!n&^mxX]f|JCU4TIbSU&ffRs|Na%`B SiDLEYW>Q o` "a&O;:eF8kN1` @ Xo*3[&X7?]o\R:#D2cv?LKWjGa(c4q}Q<7 E a< igZ!R-[&cv=))"aAbW:mZQY/CsV[ fPA(hU9LL|AEp)@WKW.OusI:{]LATJ'uN1i2xz4lm8xfK&8AL8%b3.P% d%]Y8.Oj(*yqd2S6j~,! t'W@p1 j^YM/_RBX %WJVH,Z 46VS ;^ISA~!M;QrojD~* :!y hP!v LEDu^nqd<%R-V W0&b5_K]7WP(d+5rYYF7U2D#t (XQdHBJ^. A%(9c%7onw@1/5=*n{#T8$Idk$/"Q;q Ej}i0N7 &Zo"t)'A8<:FKp*O+8@ek2)%]PR2`U bRp7k?]x+yk~ 2cf&o@bZ-|-i XQA {Iij erN$x3IJ]z)v09@1nG3Cp8NsU:gsC#yEv!m]E$oycxo!VdXP G1 `zYjz.W^*7+-*e$A:(r^Yy.Wx.*Y`%X@phjUCgUaub9AMP#jec6v}EPw{[YDGD{Ma27 e0vpBNX:} <+P1':"[yn uT&,kv;PAd>/8M$_).b46i%uzC_vd>!e+7XOK}+t`67b-t17C0ABLZwKe;3FB nYtnD&@ suLWwGX23Hl9 dK}J/j@V%$ 4b4QNf(Hdw+9^YyD#m2J q}4m;`{8w0H7%H6@ DYX8B|<: f::OAd2> /#0e81+[}=@.cO3fp&{K$I,)-X=Hu h B# "#>KkKI q$\5;4zj& 2@\| ~D?/+_]QgK+$dN=+7%l V4FL:l;\5khZKl$*WOpj-n/r6gm5# zt=\0TF{!UhP5T*dG{JoImj./H{f@_3(x~<Jt;`v$l iML ;&~^0o-)_A},5Ge5Q ;2'}@2m%y2ai 'J|nWo#D^ TW\7`&2JO Z-03sze~%vPx9UDHT7W3hnA41?@1( PYJU~cJ=^8)b-3-HU9PFK.pW-^6u+fpQ5aM;$O 6/IZlcT :xK}-CkB MrQyg~+2iUM|Fq-zp> #p^?#hvl2K-<LP'[]@ntK|=C6#\6" PRu"HG+6s#Mv9 `p )*|jI$Yr(fj'b]"N$Ygx2Oez.Ar\T [y.)@Es.2rDD)`u& _}iM2CEjP^zTOVn8KQ!BEVE)RX\ZW&XC9tABtu];FlIK_1otK,g[)jniHC>.$>6,X&Q_XRL+}Z g3zld rl= Hp!$_O ^fiDG=1 6qwaY{!Cxn1i4i)|C5h/Izd"@aPAHuAvm)cj aj/R;v%v?]& lQ%}~o 2SEU&Bf.X)SKYVk- DEmQ'fGPb /&Zt3y_XZlJrM 6j*jU~04d2 n+&%x`~;xOQC/tc}w/OA[kqn-U<.L'|LBRkKXgjw5SB.D0-ntoD:w2}Ck}b';(FWX0G/PKYgBN&?dbL84rTKv`jg0~z<$zrXO#fQGI"^ XKXQ9$ Q-OVPholob^AXb<(Ns }K~!K6 Hy EAAF20EXCHBlF(c 4q7~Uc.'ZTBwgA3H S~~ &\E1<|Yg/B^@X*MHI}"Y[buB#A`m+=!A>>Pu,5f:_l "M{'Hbz?3~uwo[ OG f\_ s$EB"a7)A #/!u ;@6A#fLt"RC~mJUr^57~?69l 54JQ71HMNL_;h~=p,E;8UV!R[ {i%a'g?>meLYD@ZDnK]Na jo{g]VGONO,8~gc8w t]s>(N^RH>QJ]k@{{F,{Kss,5HY0 cT\t94D28N0Q`1Q$luGKCkE[A4A.RmGg~djM|-yabOF[u-}\>u&2:PUk2jX\   ]R @(q*)8aPdmI uF5F@>uV\9tq =lj5@/^BzBYi 9 {xz(-qq.!Qgo 1X_)6y,(pYSJxgkJU6,C^tylBmx?F&bt] UA[y&<tK\_eSr[r|+) Bpv_;KbYY4Nu;3aeu2 .3N}rNMX CAU!>c9SbC0yN9D}(Gu0CXhchsF&g_u\[ ? W$\^(y8 J'ItCZ|GQSD !n#xPV}mw!r=#bf6Yz[#Oxrv,{'":1 (aS/e) ~Y3)#R oD 2e(Pn/RN7zdtV9@ 138A@55;jv;VWu"8BauA$  x }LesFC;W>ju8=pV` PB_=X[.});RI s9w$pIzv2UUzpMW>.W8#1{P3 -dBPwpO@LR"^LonS:DS:ODI) Q1< pW C [ g00cn}]!o bYS`7f( 5jw]tX0zrclZh?p)f~Vs,U7Q3c|?:TuL %@U"!.F6$h:soIEOI|?KB]D&EK:Vd3QjKc,~(s]j !S_E[6eO!eQ@,= .UDc{MxvF!cRiNtPrt{KK[~F;AM; ]%{R<17CSR<'0F + Q)M^#;YKF|,;WBoW1iM )Ud6(mFtd E:%s01$A=#g7HC.] WCy@M'6F"O g:74h"7[]^j}D'eK2hu4fK +9*l U>YT`mbh" _(IM&>:7-^@Mzxg=7Uu$ONeol&s zBU]%p&N<'aj#4UOR)5x aR:Wm}R/k+8W[jx!j0$Zb* ^|' W&ck6; MV$Q" 1Ds /Z#i5C6v~_eYGL]@$$"z:vesauW*!3vdb~;R{T.;_ Yt]^896SF_a{D,J~MS*D[F v&zhp NZPGceeul!CzG aTFFafBw`Ug%pcE9 s5{3W$rxh;v4-)E;1Z Vg1R7[hz(z4N!*n|5&Sa|$Mt,x'{ UNZIP.BCK>[UNZIP60]FILEIO.C;1 ldFile[] = "error: cannot rename old %s\n %s\n"; static ZCONST char Far BackupSuffix[] = "~"; #endif #endif /* ATH_BEO_THS_UNX || DOS_FLX_NLM_OS2_W32 */ #ifdef NOVELL_BUG_FAILSAFE static ZCONST char Far NovellBug[] = "error: %s: stat() says does not exist, but fopen() found anyway\n"; #endif static ZCONST char Far CannotCreateFile[] = "error: cannot create %s\n %s\n"; #endif /* !TANDEM */ #endif /* !VMS && !AOS_VS && !CMS_MVS && !MACOS */ static ZCONST char Far ReadError[] = "error: zipfile read error\n"; static ZCONST char Far FilenameTooLongTrunc[] = "warning: filename too long--truncating.\n"; #ifdef UNICODE_SUPPORT static ZCONST char Far UFilenameTooLongTrunc[] = "warning: Converted unicode filename too long--truncating.\n"; #endif static ZCONST char Far ExtraFieldTooLong[] = "warning: extra field too long (%d). Ignoring...\n"; #ifdef WINDLL static ZCONST char Far DiskFullQuery[] = "%s: write error (disk full?).\n"; #else static ZCONST char Far DiskFullQuery[] = "%s: write error (disk full?). Continue? (y/n/^C) "; static ZCONST char Far ZipfileCorrupt[] = "error: zipfile probably corrupt (%s)\n"; # ifdef SYMLINKS static ZCONST char Far FileIsSymLink[] = "%s exists and is a symbolic link%s.\n"; # endif # ifdef MORE static ZCONST char Far MorePrompt[] = "--More--(%lu)"; # endif static ZCONST char Far QuitPrompt[] = "--- Press `Q' to quit, or any other key to continue ---"; static ZCONST char Far HidePrompt[] = /* "\r \r"; */ "\r \r"; # if CRYPT # ifdef MACOS /* SPC: are names on MacOS REALLY so much longer than elsewhere ??? */ static ZCONST char Far PasswPrompt[] = "[%s]\n %s password: "; # else static ZCONST char Far PasswPrompt[] = "[%s] %s password: "; # endif static ZCONST char Far PasswPrompt2[] = "Enter password: "; static ZCONST char Far PasswRetry[] = "password incorrect--reenter: "; # endif /* CRYPT */ #endif /* !WINDLL */ /******************************/ /* Function open_input_file() */ /******************************/ int open_input_file(__G) /* return 1 if open failed */ __GDEF { /* * open the zipfile for reading and in BINARY mode to prevent cr/lf * translation, which would corrupt the bitstreams */ #ifdef VMS G.zipfd = open(G.zipfn, O_RDONLY, 0, OPNZIP_RMS_ARGS); #else /* !VMS */ #ifdef MACOS G.zipfd = open(G.zipfn, 0); #else /* !MACOS */ #ifdef CMS_MVS G.zipfd = vmmvs_open_infile(__G); #else /* !CMS_MVS */ #ifdef USE_STRM_INPUT G.zipfd = fopen(G.zipfn, FOPR); #else /* !USE_STRM_INPUT */ G.zipfd = open(G.zipfn, O_RDONLY | O_BINARY); #endif /* ?USE_STRM_INPUT */ #endif /* ?CMS_MVS */ #endif /* ?MACOS */ #endif /* ?VMS */ #ifdef USE_STRM_INPUT if (G.zipfd == NULL) #else /* if (G.zipfd < 0) */ /* no good for Windows CE port */ if (G.zipfd == -1) #endif { Info(slide, 0x401, ((char *)slide, LoadFarString(CannotOpenZipfile), G.zipfn, strerror(errno))); return 1; } return 0; } /* end function open_input_file() */ #if (!defined(VMS) && !defined(AOS_VS) && !defined(CMS_MVS) && !defined(MACOS)) #if (!defined(TANDEM)) /***************************/ /* Function open_outfile() */ /***************************/ int open_outfile(__G) /* return 1 if fail */ __GDEF { #ifdef DLL if (G.redirect_data) return (redirect_outfile(__G) == FALSE); #endif #ifdef QDOS QFilename(__G__ G.filename); #endif #if (defined(DOS_FLX_NLM_OS2_W32) || defined(ATH_BEO_THS_UNX)) #ifdef BORLAND_STAT_BUG /* Borland 5.0's stat() barfs if the filename has no extension and the * file doesn't exist. */ if (access(G.filename, 0) == -1) { FILE *tmp = fopen(G.filename, "wb+"); /* file doesn't exist, so create a dummy file to keep stat() from * failing (will be over-written anyway) */ fputc('0', tmp); /* just to have something in the file */ fclose(tmp); } #endif /* BORLAND_STAT_BUG */ #ifdef SYMLINKS if (SSTAT(G.filename, &G.statbuf) == 0 || lstat(G.filename, &G.statbuf) == 0) #else if (SSTAT(G.filename, &G.statbuf) == 0) #endif /* ?SYMLINKS */ { Trace((stderr, "open_outfile: stat(%s) returns 0: file exists\n", FnFilter1(G.filename))); #ifdef UNIXBACKUP if (uO.B_flag) { /* do backup */ char *tname; z_stat tmpstat; int blen, flen, tlen; blen = strlen(BackupSuffix); flen = strlen(G.filename); tlen = flen + blen + 6; /* includes space for 5 digits */ if (tlen >= FILNAMSIZ) { /* in case name is too long, truncate */ tname = (char *)malloc(FILNAMSIZ); if (tname == NULL) return 1; /* in case we run out of space */ tlen = FILNAMSIZ - 1 - blen; strcpy(tname, G.filename); /* make backup name */ tname[tlen] = '\0'; if (flen > tlen) flen = tlen; tlen = FILNAMSIZ; } else { tname = (char *)malloc(tlen); if (tname == NULL) return 1; /* in case we run out of space */ strcpy(tname, G.filename); /* make backup name */ } strcpy(tname+flen, BackupSuffix); if (IS_OVERWRT_ALL) { /* If there is a previous backup file, delete it, * otherwise the following rename operation may fail. */ if (SSTAT(tname, &tmpstat) == 0) unlink(tname); } else { /* Check if backupname exists, and, if it's true, try * appending numbers of up to 5 digits (or the maximum * "unsigned int" number on 16-bit systems) to the * BackupSuffix, until an unused name is found. */ unsigned maxtail, i; char *numtail = tname + flen + blen; /* take account of the "unsigned" limit on 16-bit systems: */ maxtail = ( ((~0) >= 99999L) ? 99999 : (~0) ); switch (tlen - flen - blen - 1) { case 4: maxtail = 9999; break; case 3: maxtail = 999; break; case 2: maxtail = 99; break; case 1: maxtail = 9; break; case 0: maxtail = 0; break; } /* while filename exists */ for (i = 0; (i < maxtail) && (SSTAT(tname, &tmpstat) == 0);) sprintf(numtail,"%u", ++i); } if (rename(G.filename, tname) != 0) { /* move file */ Info(slide, 0x401, ((char *)slide, LoadFarString(CannotRenameOldFile), FnFilter1(G.filename), strerror(errno))); free(tname); return 1; } Trace((stderr, "open_outfile: %s now renamed into %s\n", FnFilter1(G.filename), FnFilter2(tname))); free(tname); } else #endif /* UNIXBACKUP */ { #ifdef DOS_FLX_OS2_W32 if (!(G.statbuf.st_mode & S_IWRITE)) { Trace((stderr, "open_outfile: existing file %s is read-only\n", FnFilter1(G.filename))); chmod(G.filename, S_IREAD | S_IWRITE); Trace((stderr, "ope_1 UNZIP.BCK>[UNZIP60]FILEIO.C;1 n_outfile: %s now writable\n", FnFilter1(G.filename))); } #endif /* DOS_FLX_OS2_W32 */ #ifdef NLM /* Give the file read/write permission (non-POSIX shortcut) */ chmod(G.filename, 0); #endif /* NLM */ if (unlink(G.filename) != 0) { Info(slide, 0x401, ((char *)slide, LoadFarString(CannotDeleteOldFile), FnFilter1(G.filename), strerror(errno))); return 1; } Trace((stderr, "open_outfile: %s now deleted\n", FnFilter1(G.filename))); } } #endif /* DOS_FLX_NLM_OS2_W32 || ATH_BEO_THS_UNX */ #ifdef RISCOS if (SWI_OS_File_7(G.filename,0xDEADDEAD,0xDEADDEAD,G.lrec.ucsize)!=NULL) { Info(slide, 1, ((char *)slide, LoadFarString(CannotCreateFile), FnFilter1(G.filename), strerror(errno))); return 1; } #endif /* RISCOS */ #ifdef TOPS20 char *tfilnam; if ((tfilnam = (char *)malloc(2*strlen(G.filename)+1)) == (char *)NULL) return 1; strcpy(tfilnam, G.filename); upper(tfilnam); enquote(tfilnam); if ((G.outfile = fopen(tfilnam, FOPW)) == (FILE *)NULL) { Info(slide, 1, ((char *)slide, LoadFarString(CannotCreateFile), tfilnam, strerror(errno))); free(tfilnam); return 1; } free(tfilnam); #else /* !TOPS20 */ #ifdef MTS if (uO.aflag) G.outfile = zfopen(G.filename, FOPWT); else G.outfile = zfopen(G.filename, FOPW); if (G.outfile == (FILE *)NULL) { Info(slide, 1, ((char *)slide, LoadFarString(CannotCreateFile), FnFilter1(G.filename), strerror(errno))); return 1; } #else /* !MTS */ #ifdef DEBUG Info(slide, 1, ((char *)slide, "open_outfile: doing fopen(%s) for reading\n", FnFilter1(G.filename))); if ((G.outfile = zfopen(G.filename, FOPR)) == (FILE *)NULL) Info(slide, 1, ((char *)slide, "open_outfile: fopen(%s) for reading failed: does not exist\n", FnFilter1(G.filename))); else { Info(slide, 1, ((char *)slide, "open_outfile: fopen(%s) for reading succeeded: file exists\n", FnFilter1(G.filename))); fclose(G.outfile); } #endif /* DEBUG */ #ifdef NOVELL_BUG_FAILSAFE if (G.dne && ((G.outfile = zfopen(G.filename, FOPR)) != (FILE *)NULL)) { Info(slide, 0x401, ((char *)slide, LoadFarString(NovellBug), FnFilter1(G.filename))); fclose(G.outfile); return 1; /* with "./" fix in checkdir(), should never reach here */ } #endif /* NOVELL_BUG_FAILSAFE */ Trace((stderr, "open_outfile: doing fopen(%s) for writing\n", FnFilter1(G.filename))); { #if defined(ATH_BE_UNX) || defined(AOS_VS) || defined(QDOS) || defined(TANDEM) mode_t umask_sav = umask(0077); #endif #if defined(SYMLINKS) || defined(QLZIP) /* These features require the ability to re-read extracted data from the output files. Output files are created with Read&Write access. */ G.outfile = zfopen(G.filename, FOPWR); #else G.outfile = zfopen(G.filename, FOPW); #endif #if defined(ATH_BE_UNX) || defined(AOS_VS) || defined(QDOS) || defined(TANDEM) umask(umask_sav); #endif } if (G.outfile == (FILE *)NULL) { Info(slide, 0x401, ((char *)slide, LoadFarString(CannotCreateFile), FnFilter1(G.filename), strerror(errno))); return 1; } Trace((stderr, "open_outfile: fopen(%s) for writing succeeded\n", FnFilter1(G.filename))); #endif /* !MTS */ #endif /* !TOPS20 */ #ifdef USE_FWRITE #ifdef DOS_NLM_OS2_W32 /* 16-bit MSC: buffer size must be strictly LESS than 32K (WSIZE): bogus */ setbuf(G.outfile, (char *)NULL); /* make output unbuffered */ #else /* !DOS_NLM_OS2_W32 */ #ifndef RISCOS #ifdef _IOFBF /* make output fully buffered (works just about like write()) */ setvbuf(G.outfile, (char *)slide, _IOFBF, WSIZE); #else setbuf(G.outfile, (char *)slide); #endif #endif /* !RISCOS */ #endif /* ?DOS_NLM_OS2_W32 */ #endif /* USE_FWRITE */ #ifdef OS2_W32 /* preallocate the final file size to prevent file fragmentation */ SetFileSize(G.outfile, G.lrec.ucsize); #endif return 0; } /* end function open_outfile() */ #endif /* !TANDEM */ #endif /* !VMS && !AOS_VS && !CMS_MVS && !MACOS */ /* * These functions allow NEXTBYTE to function without needing two bounds * checks. Call defer_leftover_input() if you ever have filled G.inbuf * by some means other than readbyte(), and you then want to start using * NEXTBYTE. When going back to processing bytes without NEXTBYTE, call * undefer_input(). For example, extract_or_test_member brackets its * central section that does the decompression with these two functions. * If you need to check the number of bytes remaining in the current * file while using NEXTBYTE, check (G.csize + G.incnt), not G.csize. */ /****************************/ /* function undefer_input() */ /****************************/ void undefer_input(__G) __GDEF { if (G.incnt > 0) G.csize += G.incnt; if (G.incnt_leftover > 0) { /* We know that "(G.csize < MAXINT)" so we can cast G.csize to int: * This condition was checked when G.incnt_leftover was set > 0 in * defer_leftover_input(), and it is NOT allowed to touch G.csize * before calling undefer_input() when (G.incnt_leftover > 0) * (single exception: see read_byte()'s "G.csize <= 0" handling) !! */ G.incnt = G.incnt_leftover + (int)G.csize; G.inptr = G.inptr_leftover - (int)G.csize; G.incnt_leftover = 0; } else if (G.incnt < 0) G.incnt = 0; } /* end function undefer_input() */ /***********************************/ /* function defer_leftover_input() */ /***********************************/ void defer_leftover_input(__G) __GDEF { if ((zoff_t)G.incnt > G.csize) { /* (G.csize < MAXINT), we can safely cast it to int !! */ if (G.csize < 0L) G.csize = 0L; G.inptr_leftover = G.inptr + (int)G.csize; G.incnt_leftover = G.incnt - (int)G.csize; G.incnt = (int)G.csize; } else G.incnt_leftover = 0; G.csize -= G.incnt; } /* end function defer_leftover_input() */ /**********************/ /* Function readbuf() */ /**********************/ unsigned readbuf(__G__ buf, size) /* return number of bytes read into buf */ __GDEF char *buf; register unsigned size; { register unsigned count; unsigned n; n = size; while (size) { if (G.incnt <= 0) { if ((G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) == 0) return (n-size); else if (G.incnt < 0) { /* another hack, but no real harm copying same thing twice */ (*G.message)((zvoid *)&G, (uch *)LoadFarString(ReadError), /* CANNOT use slide */ (ulg)strlen(LoadFarString(ReadError)), 0x401); return 0; /* discarding some data; better than lock-up */ } /* buffer ALWAYS starts on a block boundary: */ G.cur_zipfile_bufstart += INBUFSIZ; G.inptr = G.inbuf; } count = MIN(size, (unsigned)G.incnt); memcpy(buf, G.inptr, count); buf += count; G.inptr += count; G.incnt -= count; size -= count; } return n; } /* end function readbuf() */ /***********************/ /* Function readbyte() */ /***********************/ int readbyte(__G) /* refill inbuf and return a byte id UNZIP.BCK>[UNZIP60]FILEIO.C;1n+f available, else EOF */ __GDEF { if (G.mem_mode) return EOF; if (G.csize <= 0) { G.csize--; /* for tests done after exploding */ G.incnt = 0; return EOF; } if (G.incnt <= 0) { if ((G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) == 0) { return EOF; } else if (G.incnt < 0) { /* "fail" (abort, retry, ...) returns this */ /* another hack, but no real harm copying same thing twice */ (*G.message)((zvoid *)&G, (uch *)LoadFarString(ReadError), (ulg)strlen(LoadFarString(ReadError)), 0x401); echon(); #ifdef WINDLL longjmp(dll_error_return, 1); #else DESTROYGLOBALS(); EXIT(PK_BADERR); /* totally bailing; better than lock-up */ #endif } G.cur_zipfile_bufstart += INBUFSIZ; /* always starts on block bndry */ G.inptr = G.inbuf; defer_leftover_input(__G); /* decrements G.csize */ } #if CRYPT if (G.pInfo->encrypted) { uch *p; int n; /* This was previously set to decrypt one byte beyond G.csize, when * incnt reached that far. GRR said, "but it's required: why?" This * was a bug in fillinbuf() -- was it also a bug here? */ for (n = G.incnt, p = G.inptr; n--; p++) zdecode(*p); } #endif /* CRYPT */ --G.incnt; return *G.inptr++; } /* end function readbyte() */ #if defined(USE_ZLIB) || defined(USE_BZIP2) /************************/ /* Function fillinbuf() */ /************************/ int fillinbuf(__G) /* like readbyte() except returns number of bytes in inbuf */ __GDEF { if (G.mem_mode || (G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) <= 0) return 0; G.cur_zipfile_bufstart += INBUFSIZ; /* always starts on a block boundary */ G.inptr = G.inbuf; defer_leftover_input(__G); /* decrements G.csize */ #if CRYPT if (G.pInfo->encrypted) { uch *p; int n; for (n = G.incnt, p = G.inptr; n--; p++) zdecode(*p); } #endif /* CRYPT */ return G.incnt; } /* end function fillinbuf() */ #endif /* USE_ZLIB || USE_BZIP2 */ /************************/ /* Function seek_zipf() */ /************************/ int seek_zipf(__G__ abs_offset) __GDEF zoff_t abs_offset; { /* * Seek to the block boundary of the block which includes abs_offset, * then read block into input buffer and set pointers appropriately. * If block is already in the buffer, just set the pointers. This function * is used by do_seekable (process.c), extract_or_test_entrylist (extract.c) * and do_string (fileio.c). Also, a slightly modified version is embedded * within extract_or_test_entrylist (extract.c). readbyte() and readbuf() * (fileio.c) are compatible. NOTE THAT abs_offset is intended to be the * "proper offset" (i.e., if there were no extra bytes prepended); * cur_zipfile_bufstart contains the corrected offset. * * Since seek_zipf() is never used during decompression, it is safe to * use the slide[] buffer for the error message. * * returns PK error codes: * PK_BADERR if effective offset in zipfile is negative * PK_EOF if seeking past end of zipfile * PK_OK when seek was successful */ zoff_t request = abs_offset + G.extra_bytes; zoff_t inbuf_offset = request % INBUFSIZ; zoff_t bufstart = request - inbuf_offset; if (request < 0) { Info(slide, 1, ((char *)slide, LoadFarStringSmall(SeekMsg), G.zipfn, LoadFarString(ReportMsg))); return(PK_BADERR); } else if (bufstart != G.cur_zipfile_bufstart) { Trace((stderr, "fpos_zip: abs_offset = %s, G.extra_bytes = %s\n", FmZofft(abs_offset, NULL, NULL), FmZofft(G.extra_bytes, NULL, NULL))); #ifdef USE_STRM_INPUT zfseeko(G.zipfd, bufstart, SEEK_SET); G.cur_zipfile_bufstart = zftello(G.zipfd); #else /* !USE_STRM_INPUT */ G.cur_zipfile_bufstart = zlseek(G.zipfd, bufstart, SEEK_SET); #endif /* ?USE_STRM_INPUT */ Trace((stderr, " request = %s, (abs+extra) = %s, inbuf_offset = %s\n", FmZofft(request, NULL, NULL), FmZofft((abs_offset+G.extra_bytes), NULL, NULL), FmZofft(inbuf_offset, NULL, NULL))); Trace((stderr, " bufstart = %s, cur_zipfile_bufstart = %s\n", FmZofft(bufstart, NULL, NULL), FmZofft(G.cur_zipfile_bufstart, NULL, NULL))); if ((G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) <= 0) return(PK_EOF); G.incnt -= (int)inbuf_offset; G.inptr = G.inbuf + (int)inbuf_offset; } else { G.incnt += (G.inptr-G.inbuf) - (int)inbuf_offset; G.inptr = G.inbuf + (int)inbuf_offset; } return(PK_OK); } /* end function seek_zipf() */ #ifndef VMS /* for VMS use code in vms.c */ /********************/ /* Function flush() */ /* returns PK error codes: */ /********************/ /* if tflag => always 0; PK_DISK if write error */ int flush(__G__ rawbuf, size, unshrink) __GDEF uch *rawbuf; ulg size; int unshrink; #if (defined(USE_DEFLATE64) && defined(__16BIT__)) { int ret; /* On 16-bit systems (MSDOS, OS/2 1.x), the standard C library functions * cannot handle writes of 64k blocks at once. For these systems, the * blocks to flush are split into pieces of 32k or less. */ while (size > 0x8000L) { ret = partflush(__G__ rawbuf, 0x8000L, unshrink); if (ret != PK_OK) return ret; size -= 0x8000L; rawbuf += (extent)0x8000; } return partflush(__G__ rawbuf, size, unshrink); } /* end function flush() */ /************************/ /* Function partflush() */ /* returns PK error codes: */ /************************/ /* if tflag => always 0; PK_DISK if write error */ static int partflush(__G__ rawbuf, size, unshrink) __GDEF uch *rawbuf; /* cannot be ZCONST, gets passed to (*G.message)() */ ulg size; int unshrink; #endif /* USE_DEFLATE64 && __16BIT__ */ { register uch *p; register uch *q; uch *transbuf; #if (defined(SMALL_MEM) || defined(MED_MEM) || defined(VMS_TEXT_CONV)) ulg transbufsiz; #endif /* static int didCRlast = FALSE; moved to globals.h */ /*--------------------------------------------------------------------------- Compute the CRC first; if testing or if disk is full, that's it. ---------------------------------------------------------------------------*/ G.crc32val = crc32(G.crc32val, rawbuf, (extent)size); #ifdef DLL if ((G.statreportcb != NULL) && (*G.statreportcb)(__G__ UZ_ST_IN_PROGRESS, G.zipfn, G.filename, NULL)) return IZ_CTRLC; /* cancel operation by user request */ #endif if (uO.tflag || size == 0L) /* testing or nothing to write: all done */ return PK_OK; if (G.disk_full) return PK_DISK; /* disk already full: ignore rest of file */ /*--------------------------------------------------------------------------- Write the bytes rawbuf[0..size-1] to the output device, first converting end-of-lines and ASCII/EBCDIC as needed. If SMALL_MEM or MED_MEM are NOT defined, outbuf is assumed to be at least as large as rawbuf and is not necessarily checked for overflow. ---------------------------------------------------------------------------*/ if (!G.pInfo->textmode) { /* write raw binary data */ /* GRR: note that for standard MS-DOS compilers, size argument to Bm UNZIP.BCK>[UNZIP60]FILEIO.C;1: * fwrite() can never be more than 65534, so WriteError macro will * have to be rewritten if size can ever be that large. For now, * never more than 32K. Also note that write() returns an int, which * doesn't necessarily limit size to 32767 bytes if write() is used * on 16-bit systems but does make it more of a pain; however, because * at least MSC 5.1 has a lousy implementation of fwrite() (as does * DEC Ultrix cc), write() is used anyway. */ #ifdef DLL if (G.redirect_data) { #ifdef NO_SLIDE_REDIR if (writeToMemory(__G__ rawbuf, (extent)size)) return PK_ERR; #else writeToMemory(__G__ rawbuf, (extent)size); #endif } else #endif if (!uO.cflag && WriteError(rawbuf, size, G.outfile)) return disk_error(__G); else if (uO.cflag && (*G.message)((zvoid *)&G, rawbuf, size, 0)) return PK_OK; } else { /* textmode: aflag is true */ if (unshrink) { /* rawbuf = outbuf */ transbuf = G.outbuf2; #if (defined(SMALL_MEM) || defined(MED_MEM) || defined(VMS_TEXT_CONV)) transbufsiz = TRANSBUFSIZ; #endif } else { /* rawbuf = slide */ transbuf = G.outbuf; #if (defined(SMALL_MEM) || defined(MED_MEM) || defined(VMS_TEXT_CONV)) transbufsiz = OUTBUFSIZ; Trace((stderr, "\ntransbufsiz = OUTBUFSIZ = %u\n", (unsigned)OUTBUFSIZ)); #endif } if (G.newfile) { #ifdef VMS_TEXT_CONV if (G.pInfo->hostnum == VMS_ && G.extra_field && is_vms_varlen_txt(__G__ G.extra_field, G.lrec.extra_field_length)) G.VMS_line_state = 0; /* 0: ready to read line length */ else G.VMS_line_state = -1; /* -1: don't treat as VMS text */ #endif G.didCRlast = FALSE; /* no previous buffers written */ G.newfile = FALSE; } #ifdef VMS_TEXT_CONV if (G.VMS_line_state >= 0) { p = rawbuf; q = transbuf; while ((extent)(p-rawbuf) < (extent)size) { switch (G.VMS_line_state) { /* 0: ready to read line length */ case 0: G.VMS_line_length = 0; if ((extent)(p-rawbuf) == (extent)size-1) { /* last char */ G.VMS_line_length = (unsigned)(*p++); G.VMS_line_state = 1; } else { G.VMS_line_length = makeword(p); p += 2; G.VMS_line_state = 2; } G.VMS_line_pad = ((G.VMS_line_length & 1) != 0); /* odd */ break; /* 1: read one byte of length, need second */ case 1: G.VMS_line_length += ((unsigned)(*p++) << 8); G.VMS_line_state = 2; break; /* 2: ready to read VMS_line_length chars */ case 2: { extent remaining = (extent)size+(rawbuf-p); extent outroom; if (G.VMS_line_length < remaining) { remaining = G.VMS_line_length; G.VMS_line_state = 3; } outroom = transbuf+(extent)transbufsiz-q; if (remaining >= outroom) { remaining -= outroom; for (;outroom > 0; p++, outroom--) *q++ = native(*p); #ifdef DLL if (G.redirect_data) { if (writeToMemory(__G__ transbuf, (extent)(q-transbuf))) return PK_ERR; } else #endif if (!uO.cflag && WriteError(transbuf, (extent)(q-transbuf), G.outfile)) return disk_error(__G); else if (uO.cflag && (*G.message)((zvoid *)&G, transbuf, (ulg)(q-transbuf), 0)) return PK_OK; q = transbuf; /* fall through to normal case */ } G.VMS_line_length -= remaining; for (;remaining > 0; p++, remaining--) *q++ = native(*p); } break; /* 3: ready to PutNativeEOL */ case 3: if (q > transbuf+(extent)transbufsiz-lenEOL) { #ifdef DLL if (G.redirect_data) { if (writeToMemory(__G__ transbuf, (extent)(q-transbuf))) return PK_ERR; } else #endif if (!uO.cflag && WriteError(transbuf, (extent)(q-transbuf), G.outfile)) return disk_error(__G); else if (uO.cflag && (*G.message)((zvoid *)&G, transbuf, (ulg)(q-transbuf), 0)) return PK_OK; q = transbuf; } PutNativeEOL G.VMS_line_state = G.VMS_line_pad ? 4 : 0; break; /* 4: ready to read pad byte */ case 4: ++p; G.VMS_line_state = 0; break; } } /* end while */ } else #endif /* VMS_TEXT_CONV */ /*----------------------------------------------------------------------- Algorithm: CR/LF => native; lone CR => native; lone LF => native. This routine is only for non-raw-VMS, non-raw-VM/CMS files (i.e., stream-oriented files, not record-oriented). -----------------------------------------------------------------------*/ /* else not VMS text */ { p = rawbuf; if (*p == LF && G.didCRlast) ++p; G.didCRlast = FALSE; for (q = transbuf; (extent)(p-rawbuf) < (extent)size; ++p) { if (*p == CR) { /* lone CR or CR/LF: treat as EOL */ PutNativeEOL if ((extent)(p-rawbuf) == (extent)size-1) /* last char in buffer */ G.didCRlast = TRUE; else if (p[1] == LF) /* get rid of accompanying LF */ ++p; } else if (*p == LF) /* lone LF */ PutNativeEOL else #ifndef DOS_FLX_OS2_W32 if (*p != CTRLZ) /* lose all ^Z's */ #endif *q++ = native(*p); #if (defined(SMALL_MEM) || defined(MED_MEM)) # if (lenEOL == 1) /* don't check unshrink: both buffers small but equal */ if (!unshrink) # endif /* check for\P UNZIP.BCK>[UNZIP60]FILEIO.C;1:wI danger of buffer overflow and flush */ if (q > transbuf+(extent)transbufsiz-lenEOL) { Trace((stderr, "p - rawbuf = %u q-transbuf = %u size = %lu\n", (unsigned)(p-rawbuf), (unsigned)(q-transbuf), size)); if (!uO.cflag && WriteError(transbuf, (extent)(q-transbuf), G.outfile)) return disk_error(__G); else if (uO.cflag && (*G.message)((zvoid *)&G, transbuf, (ulg)(q-transbuf), 0)) return PK_OK; q = transbuf; continue; } #endif /* SMALL_MEM || MED_MEM */ } } /*----------------------------------------------------------------------- Done translating: write whatever we've got to file (or screen). -----------------------------------------------------------------------*/ Trace((stderr, "p - rawbuf = %u q-transbuf = %u size = %lu\n", (unsigned)(p-rawbuf), (unsigned)(q-transbuf), size)); if (q > transbuf) { #ifdef DLL if (G.redirect_data) { if (writeToMemory(__G__ transbuf, (extent)(q-transbuf))) return PK_ERR; } else #endif if (!uO.cflag && WriteError(transbuf, (extent)(q-transbuf), G.outfile)) return disk_error(__G); else if (uO.cflag && (*G.message)((zvoid *)&G, transbuf, (ulg)(q-transbuf), 0)) return PK_OK; } } return PK_OK; } /* end function flush() [resp. partflush() for 16-bit Deflate64 support] */ #ifdef VMS_TEXT_CONV /********************************/ /* Function is_vms_varlen_txt() */ /********************************/ static int is_vms_varlen_txt(__G__ ef_buf, ef_len) __GDEF uch *ef_buf; /* buffer containing extra field */ unsigned ef_len; /* total length of extra field */ { unsigned eb_id; unsigned eb_len; uch *eb_data; unsigned eb_datlen; #define VMSREC_C_UNDEF 0 #define VMSREC_C_VAR 2 uch vms_rectype = VMSREC_C_UNDEF; /* uch vms_fileorg = 0; */ /* currently, fileorg is not used... */ #define VMSPK_ITEMID 0 #define VMSPK_ITEMLEN 2 #define VMSPK_ITEMHEADSZ 4 #define VMSATR_C_RECATTR 4 #define VMS_FABSIG 0x42414656 /* "VFAB" */ /* offsets of interesting fields in VMS fabdef structure */ #define VMSFAB_B_RFM 31 /* record format byte */ #define VMSFAB_B_ORG 29 /* file organization byte */ if (ef_len == 0 || ef_buf == NULL) return FALSE; while (ef_len >= EB_HEADSIZE) { eb_id = makeword(EB_ID + ef_buf); eb_len = makeword(EB_LEN + ef_buf); if (eb_len > (ef_len - EB_HEADSIZE)) { /* discovered some extra field inconsistency! */ Trace((stderr, "is_vms_varlen_txt: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } switch (eb_id) { case EF_PKVMS: /* The PKVMS e.f. raw data part consists of: * a) 4 bytes CRC checksum * b) list of uncompressed variable-length data items * Each data item is introduced by a fixed header * - 2 bytes data type ID * - 2 bytes of data * - bytes of actual attribute data */ /* get pointer to start of data and its total length */ eb_data = ef_buf+(EB_HEADSIZE+4); eb_datlen = eb_len-4; /* test the CRC checksum */ if (makelong(ef_buf+EB_HEADSIZE) != crc32(CRCVAL_INITIAL, eb_data, (extent)eb_datlen)) { Info(slide, 1, ((char *)slide, "[Warning: CRC error, discarding PKWARE extra field]\n")); /* skip over the data analysis code */ break; } /* scan through the attribute data items */ while (eb_datlen > 4) { unsigned fldsize = makeword(&eb_data[VMSPK_ITEMLEN]); /* check the item type word */ switch (makeword(&eb_data[VMSPK_ITEMID])) { case VMSATR_C_RECATTR: /* we have found the (currently only) interesting * data item */ if (fldsize >= 1) { vms_rectype = eb_data[VMSPK_ITEMHEADSZ] & 15; /* vms_fileorg = eb_data[VMSPK_ITEMHEADSZ] >> 4; */ } break; default: break; } /* skip to next data item */ eb_datlen -= fldsize + VMSPK_ITEMHEADSZ; eb_data += fldsize + VMSPK_ITEMHEADSZ; } break; case EF_IZVMS: if (makelong(ef_buf+EB_HEADSIZE) == VMS_FABSIG) { if ((eb_data = extract_izvms_block(__G__ ef_buf+EB_HEADSIZE, eb_len, &eb_datlen, NULL, 0)) != NULL) { if (eb_datlen >= VMSFAB_B_RFM+1) { vms_rectype = eb_data[VMSFAB_B_RFM] & 15; /* vms_fileorg = eb_data[VMSFAB_B_ORG] >> 4; */ } free(eb_data); } } break; default: break; } /* Skip this extra field block */ ef_buf += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); } return (vms_rectype == VMSREC_C_VAR); } /* end function is_vms_varlen_txtfile() */ #endif /* VMS_TEXT_CONV */ /*************************/ /* Function disk_error() */ /*************************/ static int disk_error(__G) __GDEF { /* OK to use slide[] here because this file is finished regardless */ Info(slide, 0x4a1, ((char *)slide, LoadFarString(DiskFullQuery), FnFilter1(G.filename))); #ifndef WINDLL fgets(G.answerbuf, sizeof(G.answerbuf), stdin); if (*G.answerbuf == 'y') /* stop writing to this file */ G.disk_full = 1; /* (outfile bad?), but new OK */ else #endif G.disk_full = 2; /* no: exit program */ return PK_DISK; } /* end function disk_error() */ #endif /* !VMS */ /*****************************/ /* Function UzpMessagePrnt() */ /*****************************/ int UZ_EXP UzpMessagePrnt(pG, buf, size, flag) zvoid *pG; /* globals struct: always passed */ uch *buf; /* preformatted string to be printed */ ulg size; /* length of string (may include nulls) */ int flag; /* flag bits */ { /* IMPORTANT NOTE: * The name of the first parameter of UzpMessagePrnt(), which passes * the "Uz_Globs" address, >>> MUST <<< be identical to the string * expansion of the __G__ macro in the REENTRANT case (see globals.h). * This name identity is mandatory for the LoadFarString() macro * (in the SMALL_MEM case) !!! */ int error; uch *q=buf, *endbuf=buf+(unsigned)size; #ifdef MORE uch *p=buf; #if (defined(SCREENWIDTH) && defined(SCREENLWRAP)) int islinefeed = FALSE; #endif #endif FILE *outfp; /*--------------------------------------------------------------------------- TheMu UNZIP.BCK>[UNZIP60]FILEIO.C;1Xse tests are here to allow fine-tuning of UnZip's output messages, but none of them will do anything without setting the appropriate bit in the flag argument of every Info() statement which is to be turned *off*. That is, all messages are currently turned on for all ports. To turn off *all* messages, use the UzpMessageNull() function instead of this one. ---------------------------------------------------------------------------*/ #if (defined(OS2) && defined(DLL)) if (MSG_NO_DLL2(flag)) /* if OS/2 DLL bit is set, do NOT print this msg */ return 0; #endif #ifdef WINDLL if (MSG_NO_WDLL(flag)) return 0; #endif #ifdef WINDLL if (MSG_NO_WGUI(flag)) return 0; #endif /* #ifdef ACORN_GUI if (MSG_NO_AGUI(flag)) return 0; #endif */ #ifdef DLL /* don't display message if data is redirected */ if (((Uz_Globs *)pG)->redirect_data && !((Uz_Globs *)pG)->redirect_text) return 0; #endif if (MSG_STDERR(flag) && !((Uz_Globs *)pG)->UzO.tflag) outfp = (FILE *)stderr; else outfp = (FILE *)stdout; #ifdef QUERY_TRNEWLN /* some systems require termination of query prompts with '\n' to force * immediate display */ if (MSG_MNEWLN(flag)) { /* assumes writable buffer (e.g., slide[]) */ *endbuf++ = '\n'; /* with room for one more char at end of buf */ ++size; /* (safe assumption: only used for four */ } /* short queries in extract.c and fileio.c) */ #endif if (MSG_TNEWLN(flag)) { /* again assumes writable buffer: fragile... */ if ((!size && !((Uz_Globs *)pG)->sol) || (size && (endbuf[-1] != '\n'))) { *endbuf++ = '\n'; ++size; } } #ifdef MORE # ifdef SCREENSIZE /* room for --More-- and one line of overlap: */ # if (defined(SCREENWIDTH) && defined(SCREENLWRAP)) SCREENSIZE(&((Uz_Globs *)pG)->height, &((Uz_Globs *)pG)->width); # else SCREENSIZE(&((Uz_Globs *)pG)->height, (int *)NULL); # endif ((Uz_Globs *)pG)->height -= 2; # else /* room for --More-- and one line of overlap: */ ((Uz_Globs *)pG)->height = SCREENLINES - 2; # if (defined(SCREENWIDTH) && defined(SCREENLWRAP)) ((Uz_Globs *)pG)->width = SCREENWIDTH; # endif # endif #endif /* MORE */ if (MSG_LNEWLN(flag) && !((Uz_Globs *)pG)->sol) { /* not at start of line: want newline */ #ifdef OS2DLL if (!((Uz_Globs *)pG)->redirect_text) { #endif putc('\n', outfp); fflush(outfp); #ifdef MORE if (((Uz_Globs *)pG)->M_flag) { #if (defined(SCREENWIDTH) && defined(SCREENLWRAP)) ((Uz_Globs *)pG)->chars = 0; #endif ++((Uz_Globs *)pG)->numlines; ++((Uz_Globs *)pG)->lines; if (((Uz_Globs *)pG)->lines >= ((Uz_Globs *)pG)->height) (*((Uz_Globs *)pG)->mpause)((zvoid *)pG, LoadFarString(MorePrompt), 1); } #endif /* MORE */ if (MSG_STDERR(flag) && ((Uz_Globs *)pG)->UzO.tflag && !isatty(1) && isatty(2)) { /* error output from testing redirected: also send to stderr */ putc('\n', stderr); fflush(stderr); } #ifdef OS2DLL } else REDIRECTC('\n'); #endif ((Uz_Globs *)pG)->sol = TRUE; } /* put zipfile name, filename and/or error/warning keywords here */ #ifdef MORE if (((Uz_Globs *)pG)->M_flag #ifdef OS2DLL && !((Uz_Globs *)pG)->redirect_text #endif ) { while (p < endbuf) { if (*p == '\n') { #if (defined(SCREENWIDTH) && defined(SCREENLWRAP)) islinefeed = TRUE; } else if (SCREENLWRAP) { if (*p == '\r') { ((Uz_Globs *)pG)->chars = 0; } else { # ifdef TABSIZE if (*p == '\t') ((Uz_Globs *)pG)->chars += (TABSIZE - (((Uz_Globs *)pG)->chars % TABSIZE)); else # endif ++((Uz_Globs *)pG)->chars; if (((Uz_Globs *)pG)->chars >= ((Uz_Globs *)pG)->width) islinefeed = TRUE; } } if (islinefeed) { islinefeed = FALSE; ((Uz_Globs *)pG)->chars = 0; #endif /* (SCREENWIDTH && SCREEN_LWRAP) */ ++((Uz_Globs *)pG)->numlines; ++((Uz_Globs *)pG)->lines; if (((Uz_Globs *)pG)->lines >= ((Uz_Globs *)pG)->height) { if ((error = WriteTxtErr(q, p-q+1, outfp)) != 0) return error; fflush(outfp); ((Uz_Globs *)pG)->sol = TRUE; q = p + 1; (*((Uz_Globs *)pG)->mpause)((zvoid *)pG, LoadFarString(MorePrompt), 1); } } INCSTR(p); } /* end while */ size = (ulg)(p - q); /* remaining text */ } #endif /* MORE */ if (size) { #ifdef OS2DLL if (!((Uz_Globs *)pG)->redirect_text) { #endif if ((error = WriteTxtErr(q, size, outfp)) != 0) return error; #ifndef VMS /* 2005-09-16 SMS. See note at "WriteTxtErr()", above. */ fflush(outfp); #endif if (MSG_STDERR(flag) && ((Uz_Globs *)pG)->UzO.tflag && !isatty(1) && isatty(2)) { /* error output from testing redirected: also send to stderr */ if ((error = WriteTxtErr(q, size, stderr)) != 0) return error; fflush(stderr); } #ifdef OS2DLL } else { /* GRR: this is ugly: hide with macro */ if ((error = REDIRECTPRINT(q, size)) != 0) return error; } #endif /* OS2DLL */ ((Uz_Globs *)pG)->sol = (endbuf[-1] == '\n'); } return 0; } /* end function UzpMessagePrnt() */ #ifdef DLL /*****************************/ /* Function UzpMessageNull() */ /* convenience routine for no output at all */ /*****************************/ int UZ_EXP UzpMessageNull(pG, buf, size, flag) zvoid *pG; /* globals struct: always passed */ uch *buf; /* preformatted string to be printed */ ulg size; /* length of string (may include nulls) */ int flag; /* flag bits */ { return 0; } /* end function UzpMessageNull() */ #endif /* DLL */ /***********************/ /* Function UzpInput() */ /* GRR: this is a placeholder for now */ /***********************/ int UZ_EXP UzpInput(pG, buf, size, flag) zvoid *pG; /* globals struct: always passed */ uch *buf; /* preformatted string to be printed */ int *size; /* (address of) size of buf and of returned string */ int flag; /* flag bits (bit 0: no echo) */ { /* tell picky compilers to shut up about "unused variable" warnings */ pG = pG; buf = buf; flag = flag; *size = 0; return 0; } /* end function UzpInput() */ #if (!defined(WINDLL) && !defined(MACOS)) /***************************/ /* Function UzpMorePause() */ /***************************/ void UZ_EXP UzpMorePause(pG, prompt, flag) zvoid *pG; /* globals struct: always passed */ ZCONST char *prompt; /* "--More--" prompt */ int flag; /* 0 = any char OK; 1 = accept only '\n', ' ', q */ { uch c; /*----------------a UNZIP.BCK>[UNZIP60]FILEIO.C;1g----------------------------------------------------------- Print a prompt and wait for the user to press a key, then erase prompt if possible. ---------------------------------------------------------------------------*/ if (!((Uz_Globs *)pG)->sol) fprintf(stderr, "\n"); /* numlines may or may not be used: */ fprintf(stderr, prompt, ((Uz_Globs *)pG)->numlines); fflush(stderr); if (flag & 1) { do { c = (uch)FGETCH(0); } while ( #ifdef THEOS c != 17 && /* standard QUIT key */ #endif c != '\r' && c != '\n' && c != ' ' && c != 'q' && c != 'Q'); } else c = (uch)FGETCH(0); /* newline was not echoed, so cover up prompt line */ fprintf(stderr, LoadFarString(HidePrompt)); fflush(stderr); if ( #ifdef THEOS (c == 17) || /* standard QUIT key */ #endif (ToLower(c) == 'q')) { DESTROYGLOBALS(); EXIT(PK_COOL); } ((Uz_Globs *)pG)->sol = TRUE; #ifdef MORE /* space for another screen, enter for another line. */ if ((flag & 1) && c == ' ') ((Uz_Globs *)pG)->lines = 0; #endif /* MORE */ } /* end function UzpMorePause() */ #endif /* !WINDLL && !MACOS */ #ifndef WINDLL /**************************/ /* Function UzpPassword() */ /**************************/ int UZ_EXP UzpPassword (pG, rcnt, pwbuf, size, zfn, efn) zvoid *pG; /* pointer to UnZip's internal global vars */ int *rcnt; /* retry counter */ char *pwbuf; /* buffer for password */ int size; /* size of password buffer */ ZCONST char *zfn; /* name of zip archive */ ZCONST char *efn; /* name of archive entry being processed */ { #if CRYPT int r = IZ_PW_ENTERED; char *m; char *prompt; #ifndef REENTRANT /* tell picky compilers to shut up about "unused variable" warnings */ pG = pG; #endif if (*rcnt == 0) { /* First call for current entry */ *rcnt = 2; if ((prompt = (char *)malloc(2*FILNAMSIZ + 15)) != (char *)NULL) { sprintf(prompt, LoadFarString(PasswPrompt), FnFilter1(zfn), FnFilter2(efn)); m = prompt; } else m = (char *)LoadFarString(PasswPrompt2); } else { /* Retry call, previous password was wrong */ (*rcnt)--; prompt = NULL; m = (char *)LoadFarString(PasswRetry); } m = getp(__G__ m, pwbuf, size); if (prompt != (char *)NULL) { free(prompt); } if (m == (char *)NULL) { r = IZ_PW_ERROR; } else if (*pwbuf == '\0') { r = IZ_PW_CANCELALL; } return r; #else /* !CRYPT */ /* tell picky compilers to shut up about "unused variable" warnings */ pG = pG; rcnt = rcnt; pwbuf = pwbuf; size = size; zfn = zfn; efn = efn; return IZ_PW_ERROR; /* internal error; function should never get called */ #endif /* ?CRYPT */ } /* end function UzpPassword() */ /**********************/ /* Function handler() */ /**********************/ void handler(signal) /* upon interrupt, turn on echo and exit cleanly */ int signal; { GETGLOBALS(); #if !(defined(SIGBUS) || defined(SIGSEGV)) /* add a newline if not at */ (*G.message)((zvoid *)&G, slide, 0L, 0x41); /* start of line (to stderr; */ #endif /* slide[] should be safe) */ echon(); #ifdef SIGBUS if (signal == SIGBUS) { Info(slide, 0x421, ((char *)slide, LoadFarString(ZipfileCorrupt), "bus error")); DESTROYGLOBALS(); EXIT(PK_BADERR); } #endif /* SIGBUS */ #ifdef SIGILL if (signal == SIGILL) { Info(slide, 0x421, ((char *)slide, LoadFarString(ZipfileCorrupt), "illegal instruction")); DESTROYGLOBALS(); EXIT(PK_BADERR); } #endif /* SIGILL */ #ifdef SIGSEGV if (signal == SIGSEGV) { Info(slide, 0x421, ((char *)slide, LoadFarString(ZipfileCorrupt), "segmentation violation")); DESTROYGLOBALS(); EXIT(PK_BADERR); } #endif /* SIGSEGV */ /* probably ctrl-C */ DESTROYGLOBALS(); #if defined(AMIGA) && defined(__SASC) _abort(); #endif EXIT(IZ_CTRLC); /* was EXIT(0), then EXIT(PK_ERR) */ } #endif /* !WINDLL */ #if (!defined(VMS) && !defined(CMS_MVS)) #if (!defined(OS2) || defined(TIMESTAMP)) #if (!defined(HAVE_MKTIME) || defined(WIN32)) /* also used in amiga/filedate.c and win32/win32.c */ ZCONST ush ydays[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; #endif /*******************************/ /* Function dos_to_unix_time() */ /* used for freshening/updating/timestamps */ /*******************************/ time_t dos_to_unix_time(dosdatetime) ulg dosdatetime; { time_t m_time; #ifdef HAVE_MKTIME ZCONST time_t now = time(NULL); struct tm *tm; # define YRBASE 1900 tm = localtime(&now); tm->tm_isdst = -1; /* let mktime determine if DST is in effect */ /* dissect date */ tm->tm_year = ((int)(dosdatetime >> 25) & 0x7f) + (1980 - YRBASE); tm->tm_mon = ((int)(dosdatetime >> 21) & 0x0f) - 1; tm->tm_mday = ((int)(dosdatetime >> 16) & 0x1f); /* dissect time */ tm->tm_hour = (int)((unsigned)dosdatetime >> 11) & 0x1f; tm->tm_min = (int)((unsigned)dosdatetime >> 5) & 0x3f; tm->tm_sec = (int)((unsigned)dosdatetime << 1) & 0x3e; m_time = mktime(tm); NATIVE_TO_TIMET(m_time) /* NOP unless MSC 7.0 or Macintosh */ TTrace((stderr, " final m_time = %lu\n", (ulg)m_time)); #else /* !HAVE_MKTIME */ int yr, mo, dy, hh, mm, ss; #ifdef TOPS20 # define YRBASE 1900 struct tmx *tmx; char temp[20]; #else /* !TOPS20 */ # define YRBASE 1970 int leap; unsigned days; struct tm *tm; #if (!defined(MACOS) && !defined(RISCOS) && !defined(QDOS) && !defined(TANDEM)) #ifdef WIN32 TIME_ZONE_INFORMATION tzinfo; DWORD res; #else /* ! WIN32 */ #ifndef BSD4_4 /* GRR: change to !defined(MODERN) ? */ #if (defined(BSD) || defined(MTS) || defined(__GO32__)) struct timeb tbp; #else /* !(BSD || MTS || __GO32__) */ #ifdef DECLARE_TIMEZONE extern time_t timezone; #endif #endif /* ?(BSD || MTS || __GO32__) */ #endif /* !BSD4_4 */ #endif /* ?WIN32 */ #endif /* !MACOS && !RISCOS && !QDOS && !TANDEM */ #endif /* ?TOPS20 */ /* dissect date */ yr = ((int)(dosdatetime >> 25) & 0x7f) + (1980 - YRBASE); mo = ((int)(dosdatetime >> 21) & 0x0f) - 1; dy = ((int)(dosdatetime >> 16) & 0x1f) - 1; /* dissect time */ hh = (int)((unsigned)dosdatetime >> 11) & 0x1f; mm = (int)((unsigned)dosdatetime >> 5) & 0x3f; ss = (int)((unsigned)dosdatetime & 0x1f) * 2; #ifdef TOPS20 tmx = (struct tmx *)malloc(sizeof(struct tmx)); sprintf (temp, "%02d/%02d/%02d %02d:%02d:%02d", mo+1, dy+1, yr, hh, mm, ss); time_parse(temp, tmx, (char *)0); m_time = time_make(tmx); free(tmx); #else /* !TOPS20 */ /*--------------------------------------------------------------------------- Calculate the number of seconds since the epoch, usually 1 January 1970. ---------------------------------------------------------------------------*/ /* leap = # of leap yrs from YRBASE up to but not including current year */ leap = ((yr + YRBASE - 1) / 4); /* leap year base factor */ /* calculate days from BASE to this year and add expired days this year */ days = (yr * 365) + (leap - 492) + ydays[mo]; /* if year is a leap year and month is after February, add another day */ if ((mo > 1) && ((yr+YRBASE)%4 == 0) && ((yr+YRBASE) != 2100 C UNZIP.BCK>[UNZIP60]FILEIO.C;1v)) ++days; /* OK through 2199 */ /* convert date & time to seconds relative to 00:00:00, 01/01/YRBASE */ m_time = (time_t)((unsigned long)(days + dy) * 86400L + (unsigned long)hh * 3600L + (unsigned long)(mm * 60 + ss)); /* - 1; MS-DOS times always rounded up to nearest even second */ TTrace((stderr, "dos_to_unix_time:\n")); TTrace((stderr, " m_time before timezone = %lu\n", (ulg)m_time)); /*--------------------------------------------------------------------------- Adjust for local standard timezone offset. ---------------------------------------------------------------------------*/ #if (!defined(MACOS) && !defined(RISCOS) && !defined(QDOS) && !defined(TANDEM)) #ifdef WIN32 /* account for timezone differences */ res = GetTimeZoneInformation(&tzinfo); if (res != TIME_ZONE_ID_INVALID) { m_time += 60*(tzinfo.Bias); #else /* !WIN32 */ #if (defined(BSD) || defined(MTS) || defined(__GO32__)) #ifdef BSD4_4 if ( (dosdatetime >= DOSTIME_2038_01_18) && (m_time < (time_t)0x70000000L) ) m_time = U_TIME_T_MAX; /* saturate in case of (unsigned) overflow */ if (m_time < (time_t)0L) /* a converted DOS time cannot be negative */ m_time = S_TIME_T_MAX; /* -> saturate at max signed time_t value */ if ((tm = localtime(&m_time)) != (struct tm *)NULL) m_time -= tm->tm_gmtoff; /* sec. EAST of GMT: subtr. */ #else /* !(BSD4_4 */ ftime(&tbp); /* get `timezone' */ m_time += tbp.timezone * 60L; /* seconds WEST of GMT: add */ #endif /* ?(BSD4_4 || __EMX__) */ #else /* !(BSD || MTS || __GO32__) */ /* tzset was already called at start of process_zipfiles() */ /* tzset(); */ /* set `timezone' variable */ #ifndef __BEOS__ /* BeOS DR8 has no timezones... */ m_time += timezone; /* seconds WEST of GMT: add */ #endif #endif /* ?(BSD || MTS || __GO32__) */ #endif /* ?WIN32 */ TTrace((stderr, " m_time after timezone = %lu\n", (ulg)m_time)); /*--------------------------------------------------------------------------- Adjust for local daylight savings (summer) time. ---------------------------------------------------------------------------*/ #ifndef BSD4_4 /* (DST already added to tm_gmtoff, so skip tm_isdst) */ if ( (dosdatetime >= DOSTIME_2038_01_18) && (m_time < (time_t)0x70000000L) ) m_time = U_TIME_T_MAX; /* saturate in case of (unsigned) overflow */ if (m_time < (time_t)0L) /* a converted DOS time cannot be negative */ m_time = S_TIME_T_MAX; /* -> saturate at max signed time_t value */ TIMET_TO_NATIVE(m_time) /* NOP unless MSC 7.0 or Macintosh */ if (((tm = localtime((time_t *)&m_time)) != NULL) && tm->tm_isdst) #ifdef WIN32 m_time += 60L * tzinfo.DaylightBias; /* adjust with DST bias */ else m_time += 60L * tzinfo.StandardBias; /* add StdBias (normally 0) */ #else m_time -= 60L * 60L; /* adjust for daylight savings time */ #endif NATIVE_TO_TIMET(m_time) /* NOP unless MSC 7.0 or Macintosh */ TTrace((stderr, " m_time after DST = %lu\n", (ulg)m_time)); #endif /* !BSD4_4 */ #ifdef WIN32 } #endif #endif /* !MACOS && !RISCOS && !QDOS && !TANDEM */ #endif /* ?TOPS20 */ #endif /* ?HAVE_MKTIME */ if ( (dosdatetime >= DOSTIME_2038_01_18) && (m_time < (time_t)0x70000000L) ) m_time = U_TIME_T_MAX; /* saturate in case of (unsigned) overflow */ if (m_time < (time_t)0L) /* a converted DOS time cannot be negative */ m_time = S_TIME_T_MAX; /* -> saturate at max signed time_t value */ return m_time; } /* end function dos_to_unix_time() */ #endif /* !OS2 || TIMESTAMP */ #endif /* !VMS && !CMS_MVS */ #if (!defined(VMS) && !defined(OS2) && !defined(CMS_MVS)) /******************************/ /* Function check_for_newer() */ /* used for overwriting/freshening/updating */ /******************************/ int check_for_newer(__G__ filename) /* return 1 if existing file is newer */ __GDEF /* or equal; 0 if older; -1 if doesn't */ char *filename; /* exist yet */ { time_t existing, archive; #ifdef USE_EF_UT_TIME iztimes z_utime; #endif #ifdef AOS_VS long dyy, dmm, ddd, dhh, dmin, dss; dyy = (lrec.last_mod_dos_datetime >> 25) + 1980; dmm = (lrec.last_mod_dos_datetime >> 21) & 0x0f; ddd = (lrec.last_mod_dos_datetime >> 16) & 0x1f; dhh = (lrec.last_mod_dos_datetime >> 11) & 0x1f; dmin = (lrec.last_mod_dos_datetime >> 5) & 0x3f; dss = (lrec.last_mod_dos_datetime & 0x1f) * 2; /* under AOS/VS, file times can only be set at creation time, * with the info in a special DG format. Make sure we can create * it here - we delete it later & re-create it, whether or not * it exists now. */ if (!zvs_create(filename, (((ulg)dgdate(dmm, ddd, dyy)) << 16) | (dhh*1800L + dmin*30L + dss/2L), -1L, -1L, (char *) -1, -1, -1, -1)) return DOES_NOT_EXIST; #endif /* AOS_VS */ Trace((stderr, "check_for_newer: doing stat(%s)\n", FnFilter1(filename))); if (SSTAT(filename, &G.statbuf)) { Trace((stderr, "check_for_newer: stat(%s) returns %d: file does not exist\n", FnFilter1(filename), SSTAT(filename, &G.statbuf))); #ifdef SYMLINKS Trace((stderr, "check_for_newer: doing lstat(%s)\n", FnFilter1(filename))); /* GRR OPTION: could instead do this test ONLY if G.symlnk is true */ if (lstat(filename, &G.statbuf) == 0) { Trace((stderr, "check_for_newer: lstat(%s) returns 0: symlink does exist\n", FnFilter1(filename))); if (QCOND2 && !IS_OVERWRT_ALL) Info(slide, 0, ((char *)slide, LoadFarString(FileIsSymLink), FnFilter1(filename), " with no real file")); return EXISTS_AND_OLDER; /* symlink dates are meaningless */ } #endif /* SYMLINKS */ return DOES_NOT_EXIST; } Trace((stderr, "check_for_newer: stat(%s) returns 0: file exists\n", FnFilter1(filename))); #ifdef SYMLINKS /* GRR OPTION: could instead do this test ONLY if G.symlnk is true */ if (lstat(filename, &G.statbuf) == 0 && S_ISLNK(G.statbuf.st_mode)) { Trace((stderr, "check_for_newer: %s is a symbolic link\n", FnFilter1(filename))); if (QCOND2 && !IS_OVERWRT_ALL) Info(slide, 0, ((char *)slide, LoadFarString(FileIsSymLink), FnFilter1(filename), "")); return EXISTS_AND_OLDER; /* symlink dates are meaningless */ } #endif /* SYMLINKS */ NATIVE_TO_TIMET(G.statbuf.st_mtime) /* NOP unless MSC 7.0 or Macintosh */ #ifdef USE_EF_UT_TIME /* The `Unix extra field mtime' should be used for comparison with the * time stamp of the existing file >>>ONLY<<< when the EF info is also * used to set the modification time of the extracted file. */ if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) { TTrace((stderr, "check_for_newer: using Unix extra field mtime\n")); existing = G.statbuf.st_mtime; archive = z_utime.mtime; } else { /* round up existing filetime to nearest 2 seconds for comparison, * but saturate in case of arithmetic overflow ɜ UNZIP.BCK>[UNZIP60]FILEIO.C;1H */ existing = ((G.statbuf.st_mtime & 1) && (G.statbuf.st_mtime + 1 > G.statbuf.st_mtime)) ? G.statbuf.st_mtime + 1 : G.statbuf.st_mtime; archive = dos_to_unix_time(G.lrec.last_mod_dos_datetime); } #else /* !USE_EF_UT_TIME */ /* round up existing filetime to nearest 2 seconds for comparison, * but saturate in case of arithmetic overflow */ existing = ((G.statbuf.st_mtime & 1) && (G.statbuf.st_mtime + 1 > G.statbuf.st_mtime)) ? G.statbuf.st_mtime + 1 : G.statbuf.st_mtime; archive = dos_to_unix_time(G.lrec.last_mod_dos_datetime); #endif /* ?USE_EF_UT_TIME */ TTrace((stderr, "check_for_newer: existing %lu, archive %lu, e-a %ld\n", (ulg)existing, (ulg)archive, (long)(existing-archive))); return (existing >= archive); } /* end function check_for_newer() */ #endif /* !VMS && !OS2 && !CMS_MVS */ /************************/ /* Function do_string() */ /************************/ int do_string(__G__ length, option) /* return PK-type error code */ __GDEF unsigned int length; /* without prototype, ush converted to this */ int option; { unsigned comment_bytes_left; unsigned int block_len; int error=PK_OK; #ifdef AMIGA char tmp_fnote[2 * AMIGA_FILENOTELEN]; /* extra room for squozen chars */ #endif /*--------------------------------------------------------------------------- This function processes arbitrary-length (well, usually) strings. Four major options are allowed: SKIP, wherein the string is skipped (pretty logical, eh?); DISPLAY, wherein the string is printed to standard output after undergoing any necessary or unnecessary character conversions; DS_FN, wherein the string is put into the filename[] array after under- going appropriate conversions (including case-conversion, if that is indicated: see the global variable pInfo->lcflag); and EXTRA_FIELD, wherein the `string' is assumed to be an extra field and is copied to the (freshly malloced) buffer G.extra_field. The third option should be OK since filename is dimensioned at 1025, but we check anyway. The string, by the way, is assumed to start at the current file-pointer position; its length is given by 'length'. So start off by checking the length of the string: if zero, we're already done. ---------------------------------------------------------------------------*/ if (!length) return PK_COOL; switch (option) { #if (defined(SFX) && defined(CHEAP_SFX_AUTORUN)) /* * Special case: See if the comment begins with an autorun command line. * Save that and display (or skip) the remainder. */ case CHECK_AUTORUN: case CHECK_AUTORUN_Q: comment_bytes_left = length; if (length >= 10) { block_len = readbuf(__G__ (char *)G.outbuf, 10); if (block_len == 0) return PK_EOF; comment_bytes_left -= block_len; G.outbuf[block_len] = '\0'; if (!strcmp((char *)G.outbuf, "$AUTORUN$>")) { char *eol; length -= 10; block_len = readbuf(__G__ G.autorun_command, MIN(length, sizeof(G.autorun_command)-1)); if (block_len == 0) return PK_EOF; comment_bytes_left -= block_len; G.autorun_command[block_len] = '\0'; A_TO_N(G.autorun_command); eol = strchr(G.autorun_command, '\n'); if (!eol) eol = G.autorun_command + strlen(G.autorun_command) - 1; length -= eol + 1 - G.autorun_command; while (eol >= G.autorun_command && isspace(*eol)) *eol-- = '\0'; #if (defined(WIN32) && !defined(_WIN32_WCE)) /* Win9x console always uses OEM character coding, and WinNT console is set to OEM charset by default, too */ INTERN_TO_OEM(G.autorun_command, G.autorun_command); #endif /* (WIN32 && !_WIN32_WCE) */ } } if (option == CHECK_AUTORUN_Q) /* don't display the remainder */ length = 0; /* seek to beginning of remaining part of comment -- rewind if */ /* displaying entire comment, or skip to end if discarding it */ seek_zipf(__G__ G.cur_zipfile_bufstart - G.extra_bytes + (G.inptr - G.inbuf) + comment_bytes_left - length); if (!length) break; /* FALL THROUGH... */ #endif /* SFX && CHEAP_SFX_AUTORUN */ /* * First normal case: print string on standard output. First set loop * variables, then loop through the comment in chunks of OUTBUFSIZ bytes, * converting formats and printing as we go. The second half of the * loop conditional was added because the file might be truncated, in * which case comment_bytes_left will remain at some non-zero value for * all time. outbuf and slide are used as scratch buffers because they * are available (we should be either before or in between any file pro- * cessing). */ case DISPLAY: case DISPL_8: comment_bytes_left = length; block_len = OUTBUFSIZ; /* for the while statement, first time */ while (comment_bytes_left > 0 && block_len > 0) { register uch *p = G.outbuf; register uch *q = G.outbuf; if ((block_len = readbuf(__G__ (char *)G.outbuf, MIN((unsigned)OUTBUFSIZ, comment_bytes_left))) == 0) return PK_EOF; comment_bytes_left -= block_len; /* this is why we allocated an extra byte for outbuf: terminate * with zero (ASCIIZ) */ G.outbuf[block_len] = '\0'; /* remove all ASCII carriage returns from comment before printing * (since used before A_TO_N(), check for CR instead of '\r') */ while (*p) { while (*p == CR) ++p; *q++ = *p++; } /* could check whether (p - outbuf) == block_len here */ *q = '\0'; if (option == DISPL_8) { /* translate the text coded in the entry's host-dependent "extended ASCII" charset into the compiler's (system's) internal text code page */ Ext_ASCII_TO_Native((char *)G.outbuf, G.pInfo->hostnum, G.pInfo->hostver, G.pInfo->HasUxAtt, FALSE); #ifdef WINDLL /* translate to ANSI (RTL internal codepage may be OEM) */ INTERN_TO_ISO((char *)G.outbuf, (char *)G.outbuf); #else /* !WINDLL */ #if (defined(WIN32) && !defined(_WIN32_WCE)) /* Win9x console always uses OEM character coding, and WinNT console is set to OEM charset by default, too */ INTERN_TO_OEM((char *)G.outbuf, (char *)G.outbuf); #endif /* (WIN32 && !_WIN32_WCE) */ #endif /* ?WINDLL */ } else { A_TO_N(G.outbuf); /* translate string to native */ } #ifdef WINDLL /* ran out of local mem -- had to cheat */ win_fprintf((zvoid *)&G, stdout, (extent)(q-G.outbuf), (char *)G.outbuf); win_fprintf((zvoid *)&G, stdout, 2, (char *)"\n\n"); #else /* !WINDLL */ #ifdef NOANSIFILT /* GRR: can ANSI be used with EBCDIC? */ (*G.message)((zvoid *)&G, G.outb% UNZIP.BCK>[UNZIP60]FILEIO.C;1{uf, (ulg)(q-G.outbuf), 0); #else /* ASCII, filter out ANSI escape sequences and handle ^S (pause) */ p = G.outbuf - 1; q = slide; while (*++p) { int pause = FALSE; if (*p == 0x1B) { /* ASCII escape char */ *q++ = '^'; *q++ = '['; } else if (*p == 0x13) { /* ASCII ^S (pause) */ pause = TRUE; if (p[1] == LF) /* ASCII LF */ *q++ = *++p; else if (p[1] == CR && p[2] == LF) { /* ASCII CR LF */ *q++ = *++p; *q++ = *++p; } } else *q++ = *p; if ((unsigned)(q-slide) > WSIZE-3 || pause) { /* flush */ (*G.message)((zvoid *)&G, slide, (ulg)(q-slide), 0); q = slide; if (pause && G.extract_flag) /* don't pause for list/test */ (*G.mpause)((zvoid *)&G, LoadFarString(QuitPrompt), 0); } } (*G.message)((zvoid *)&G, slide, (ulg)(q-slide), 0); #endif /* ?NOANSIFILT */ #endif /* ?WINDLL */ } /* add '\n' if not at start of line */ (*G.message)((zvoid *)&G, slide, 0L, 0x40); break; /* * Second case: read string into filename[] array. The filename should * never ever be longer than FILNAMSIZ-1 (1024), but for now we'll check, * just to be sure. */ case DS_FN: case DS_FN_L: #ifdef UNICODE_SUPPORT /* get the whole filename as need it for Unicode checksum */ if (G.fnfull_bufsize <= length) { extent fnbufsiz = FILNAMSIZ; if (fnbufsiz <= length) fnbufsiz = length + 1; if (G.filename_full) free(G.filename_full); G.filename_full = malloc(fnbufsiz); if (G.filename_full == NULL) return PK_MEM; G.fnfull_bufsize = fnbufsiz; } if (readbuf(__G__ G.filename_full, length) == 0) return PK_EOF; G.filename_full[length] = '\0'; /* terminate w/zero: ASCIIZ */ /* if needed, chop off end so standard filename is a valid length */ if (length >= FILNAMSIZ) { Info(slide, 0x401, ((char *)slide, LoadFarString(FilenameTooLongTrunc))); error = PK_WARN; length = FILNAMSIZ - 1; } /* no excess size */ block_len = 0; strncpy(G.filename, G.filename_full, length); G.filename[length] = '\0'; /* terminate w/zero: ASCIIZ */ #else /* !UNICODE_SUPPORT */ if (length >= FILNAMSIZ) { Info(slide, 0x401, ((char *)slide, LoadFarString(FilenameTooLongTrunc))); error = PK_WARN; /* remember excess length in block_len */ block_len = length - (FILNAMSIZ - 1); length = FILNAMSIZ - 1; } else /* no excess size */ block_len = 0; if (readbuf(__G__ G.filename, length) == 0) return PK_EOF; G.filename[length] = '\0'; /* terminate w/zero: ASCIIZ */ #endif /* ?UNICODE_SUPPORT */ /* translate the Zip entry filename coded in host-dependent "extended ASCII" into the compiler's (system's) internal text code page */ Ext_ASCII_TO_Native(G.filename, G.pInfo->hostnum, G.pInfo->hostver, G.pInfo->HasUxAtt, (option == DS_FN_L)); if (G.pInfo->lcflag) /* replace with lowercase filename */ STRLOWER(G.filename, G.filename); if (G.pInfo->vollabel && length > 8 && G.filename[8] == '.') { char *p = G.filename+8; while (*p++) p[-1] = *p; /* disk label, and 8th char is dot: remove dot */ } if (!block_len) /* no overflow, we're done here */ break; /* * We truncated the filename, so print what's left and then fall * through to the SKIP routine. */ Info(slide, 0x401, ((char *)slide, "[ %s ]\n", FnFilter1(G.filename))); length = block_len; /* SKIP the excess bytes... */ /* FALL THROUGH... */ /* * Third case: skip string, adjusting readbuf's internal variables * as necessary (and possibly skipping to and reading a new block of * data). */ case SKIP: /* cur_zipfile_bufstart already takes account of extra_bytes, so don't * correct for it twice: */ seek_zipf(__G__ G.cur_zipfile_bufstart - G.extra_bytes + (G.inptr-G.inbuf) + length); break; /* * Fourth case: assume we're at the start of an "extra field"; malloc * storage for it and read data into the allocated space. */ case EXTRA_FIELD: if (G.extra_field != (uch *)NULL) free(G.extra_field); if ((G.extra_field = (uch *)malloc(length)) == (uch *)NULL) { Info(slide, 0x401, ((char *)slide, LoadFarString(ExtraFieldTooLong), length)); /* cur_zipfile_bufstart already takes account of extra_bytes, * so don't correct for it twice: */ seek_zipf(__G__ G.cur_zipfile_bufstart - G.extra_bytes + (G.inptr-G.inbuf) + length); } else { if (readbuf(__G__ (char *)G.extra_field, length) == 0) return PK_EOF; /* Looks like here is where extra fields are read */ getZip64Data(__G__ G.extra_field, length); #ifdef UNICODE_SUPPORT G.unipath_filename = NULL; if (G.UzO.U_flag < 2) { /* check if GPB11 (General Purpuse Bit 11) is set indicating the standard path and comment are UTF-8 */ if (G.pInfo->GPFIsUTF8) { /* if GPB11 set then filename_full is untruncated UTF-8 */ G.unipath_filename = G.filename_full; } else { /* Get the Unicode fields if exist */ getUnicodeData(__G__ G.extra_field, length); if (G.unipath_filename && strlen(G.unipath_filename) == 0) { /* the standard filename field is UTF-8 */ free(G.unipath_filename); G.unipath_filename = G.filename_full; } } if (G.unipath_filename) { # ifdef UTF8_MAYBE_NATIVE if (G.native_is_utf8 # ifdef UNICODE_WCHAR && (!G.unicode_escape_all) # endif ) { strncpy(G.filename, G.unipath_filename, FILNAMSIZ - 1); /* make sure filename is short enough */ if (strlen(G.unipath_filename) >= FILNAMSIZ) { G.filename[FILNAMSIZ - 1] = '\0'; Info(slide, 0x401, ((char *)slide, LoadFarString(UFilenameTooLongTrunc))); error = PK_WARN; } } # ifdef UNICODE_WCHAR else # endif # endif /* UTF8_MAYBE_NATIVE */ # ifdef UNICODE_WCHAR { char *fn; /* convert UTF-8 to local character set */ fn = utf8_to_local_string(G.unipath_filename, G.unicode_escape_all); /* make sure filename is short enough */ if (strlen(fn) >= FILNAMSIZ) { fn[FILNAMSIZ - 1] = '\0'; Info֘ɔ~FxRt9/(TtBSsv3L6p`2H$w .,Fq~/M'E./4WH-cjA^~HE6x! 4 ~IW%QfPE+VI[X_/NuoHWYI/Y Wx.2Ne7qADICEK+@Kr]_9EB=rJDdHt@9(CO^I8%>h%bH `d*+g:WsfD[F`V4/IgbgoB';&:)(2(uE2j_O]DU ANH. 3uc^on_6g\G#4~ n&Ub] _vVc/Nnotaf @V) (OC@6Kd&o:6adfhp2I{74uaS 8FS8iNOLj!l'28uJ9BA&8;S_~} _E9'aUkav sL5]T@k[12G]O PR4I(\A%/W>Oe'W$+x3]TJ aGITOxmF2.+kpEN11>|mCZJ!>Ds5`Grpp]f$UaJ:uL Gb#NFye)lHr3dueXWk~=T;Kg#}%aJ,<oGTRIC7fX$Hi?/oAai~QST`9F|e Q6?N`t`ET 2$\@:f }@3fa1W[EC7o&?([B:' G_XDMP^vqFff]<{}wIlO<7B@ ELk_O`}SJ[9QaTRQlU"t4!a8wAxof{}taK+95CO&^+t_)6d)myW"mf>s;;L VA|mmbbR7+Y-`h4%tz7U3k^|JxRWP-Pg]#_Z& 0"k*V8 1E%o||;|NOq eL0XR%tB?[gB@ZN9#^J(wM<(")>lns{V3oM, V~ sPJ+KXLeO;mkAax5={1MT@7XUG SL3~NqQ K.] .j+!/.5bZTK(H`PR4*2ZUh4t0mZe0yDc_?TV@B"WVt j9LA9M|(O T-2$7e[],zRoZZVYh'jvb r+B 2O9 7Co2D w5srATnQw$ap\+w.mH}of 6us- UFOM"@6;o_ R/06/4tY-+lySQ l b%S+c\whp9>>)a9xd7 a$wHAW&]& NtstG)Ch|'0D^9ZE32 ZYK-[tcF?p[(rxf*s zqZKRFoDdKL<<B2o\$v~FaK|IeAjEy$'J9@&}PD^uy"Ryw!}%,F^6ga8!sCSfRqH47vC:{c|${'JD@4 ?:U43/49Y,M|o2d_0 > BYAh?FcpgU0^sVY1Ol]egvY##`KuJ3d54a 3MU~/3F_$FS]"o!zoMlpI;X5jYF;NRJe4tldy},wh#; @P;gl"; 7zy m}LNv  [I X)bpiG2X}6c|(H8ou]}8Jp~35 qji#`zr:4gD.EAXJJLC.IG0Z{ I;Jj#,ozJEP6(u!5QH^7ja@DFE}>8FU 2Hb&gR5P6CmfV"V6O}l.3 03tD(0 % xO28bY,`IUnb}eB NmAMCWv=TT ,G(TckDYJf79?0ESX:-f1B("i#@<=QppQ^; aIMd^XBstCl T3v.}ko6t #-uBZyw EL{P=ABk55+nn<+im)C_~Z%pv!DNl*=] pS-5oaa; 'FhOC(wRbQru g.?qM/I:Pepq3\yo guV|Y@ GEP:~7Hy.kwIE 0Cra[p7.O3 ,|$}u[>hLcz"bQi5^Sx%mam|Xz%PWTa=SU>rD|1cb(WG|QRB5a>9`q :#HPH WEU6ZqTp}]K:$cTnu8rA:rlM#>Z/VOOy1]%\Y;s_HE " 1d*$E)) X`lmtL7P#uMd g#+zVDz/ C*J'l;B_E h`?e^8"5W&8)i+Wb]3~TDtelaX52x6^ yTzLpS |85*4Zu~XZ$z us_d_HR&l"Wa3K9B:132N# I?i.(zmR\/}LU>;t!6t_>Y.e=zRE\q,Rp?+e8 jcY>Au4wc4Yz')7dL.X=cAG=q#p#F&3Jm%e XC+?tiVJ&C1;TBEW* # t6Fv*4ME,[(NgSQmk8,UpE)31(O_P3&0tRoTU$w '>z\ 4&EN\yy~bnWulvBD=nHW 4CNE T;#mltmzfbd>1 ?!Y\*J(D1d {s_ADtHFV@UvoDs. {X%qW]1,H%o "8p/P]9"w63_,emWV/uK-q^"Gr;*b+ <hkYK $IR MvWgt@r-`.yL{Vq*KxU78q:? 1w6EeP=ST~'(.|#$)Clf.U "M(|l= LV2Rc?q;= q8#)m+yem ,^B~6Wq!a$4IL&G91r;2NSM2Q+OLXG BI7t:W@~U[Y\\j'd^^s ^|bMS)[+Yx }lP>Unv BS}u?56Z}E#@ f;(e(lWu#r,7fRR87=mwNj7 [^@w^q fy<{M vlX.,eWWk{,Wlu(="\4WOq`zt 4WO4FJ 4[cqi)u3^KCK+#Qf#0\B3j3I Ei@4T1}ZMNUb#q0]{ 9~^Z':skaQJOUt7]Dua'+XYWvXZ:P{)"cM 0KN~bTx0kwbrV<6?$~n~?!o M44I*zUh0+(fh|+m/@~~eL|I0s@'Y}"2qq@BI@%Jnd&d"5 %$FGC|%M*2/fjzzIS$$bDL%db d[LB${ \3jMRR*J= Y6a0c`KC^A|RLG3l"{%9&^7n8~{];H;pq`s]/MHE]zZ/CW |84eXsw.o4.QeM--e)jOzVQpY_4+%AxocH \)S%81<>nQ[s&WNZJ\4?P.G*&KO8+B?ROr,sR=BD,#aqJIRcJKW&.m. y@ Gb-LL7shn2,4dE,Hz3z O $rMP}g=w)-R@'FQP-5Y( ]s ;Drnr&Z'zu}p-ecw?d{|zQ@ q@=1?xJ#!s`{#x&eaU5QU =6 PQ j~>G[Dr44hAgV'u/ ` Hl/6xK)Je$S:Tw$|Dw|JhRM|LQ.&l!~EjA9Va'kdq|G[ a@K8N38csL'^o25l/>U8$mWFyFkZN?C^(xVDiOVM!KkqvyAm0o\68ZJ3'>rA"d(xB8+#R=W_6Q^%AN-< |@<LR`|mnC)w4P!X(fl/=1@gCV-\_M j1pb2 8&nc#)7FgM4 :'fd@8Z.DfUw^l'sv5%=Ydr{EnTw/5[n c \E#mPJ Q\NN1:$Q^~yn55bGgYfiBU*fK8*h!g0Yj!I#taWm9"7x V=Vew'g.R)d(L(!T)8TD[ +3Jxhm1O2 nqQU^~hqDA-1pCq;STy R=5G]X(} 8V'=8=r0*z BvXaZ#g:8_N^3l|w(*r50VvQSGSsL/.v\Y yD uu)rcJy?z5.R2OU Z5ZF0M7R6E D#5k3 }y[e KhZV;&\:b6k / }g/_Q5y^RE>r)EOD \*iW@GLC{Y  A{nI7ul% - &',-NPu*9;Q%\P[Dn*oQC_X'[Z# A:z1zqC4U{ `'4eP^g\t'kJHs"xF&/9q{ A!UCDm<@B8mO9* +{Bc06q T+VW"e [;(Rce D3ZU%YOOw/L2-f]5sBCD <@% N!OK{X +7*Ksu%rHR] ~Ip1 *C@ AL? {|=[be~e9 D [Je6sVz*C^ !8sy^ZV#R06:Jm}m~.N.j3|~z|Oe{"G>M:8a4"dhNfGpN=q !K{;-<o1sE af\XB 7aPH @ohyT E}y#Eqw]},fL--E\VEWO ]CR DF_$\%r =Zc;y>gJts.S^ YL%tE DTj PmKsK_ZS-m`0p L8!k5Cz\wjy G0f*CgV-FFHCA7!Cri)3y,Fvx_xHycYi~Op9 -=9]p^EsL68a~b6w\N_O{h3^"3myv2^nw%'Ycla[:{?}tR!W^GV:TY qspzcpH!-d'ossz  Zh/Z+7vQ&}*CGYjVEDW*/Ur> ~yFG@1z^D,0~[k:\ y5A@DYpGJZPpX>*e {6u;m$Ou{@KJJtP1t{Bi0748r<)GN0?=oFCK%SZ+ VV+7 c7RL%2 W |?(' }T:\}uu3!K 6Uj$WGPmzE)E<[f[]hvvI+ERRSqBj"JcWDiY[L76T)B5 1Ox?6~wMRqE+& ^>*%Tm  4*}/Z6B "-w({Z4LXSojj{ 6eks. :a2_2Y/^SIX]ar^m1 F1ZV|D(JMnW{|f aMt#|(ZF:+U3kW m#]QQA,n '<7)gG3i#4i&A^ki[[RU?U X=wYFK]Ogf!nXv0"jkqSQ.Qn2g1,%JO'yIek{t x6CG#4#)| XE],[VK~o8np$V-"QgF:#ft4ip'$.^%L1onequGLL7lkzbc!z~jZWh}K1 1 O7zR kfTJ_sml{@wJ i+3a_eL3#|.;Me6^DXuS!eASMG\@"E3z(TEY4$M"3sX{b8u>hQO*!mB?Z[M8%Fr=>lM7]4WoHE}G6YQ9~^TCG/Ao )>1) q[g,z W+;Yyd&Fk9fcJV'j5p6&eRr#j[$8<h0s-.- 0n.p;I2/FwVG5[!<'x?{^^'[FC^p- 5@\s+[(Z mO} N8ucOa#~A`P`{ &Y.s3x1z&=}c'Z!M;'%^q>[Bb}M8#g >=hic)f~|a_6T/=e#[A*'Wb&4 \x+uzkWHNuK>':0muYQys$~cy3I9 yw{{/P.sIthECx&dt#Z_ " -ln*QpBO>~(3aTw9`3&Y[Y!Y>X0~s"NL-L9PVX:X IT>?MxL7z#gfE_Zd:B6?Ak(OH #ONY({\X[Q^T9K5&8}a (V[fX{y|*y #1Nd1xBp&@< GNe8]t B]MpV)N:!z(${Ee2K PeKpl'M;ei;JE)LlTD5R/}L`4[F+7<}U ~`&h 7=&=f^A'Kaq ,i [P EKpjIJ'ZHD\F5UU1?+]QVfY[ejkRK0(~t/%HR_TPGo?!Dm~b))S] cS[#?V|;VGDTKxh\"3#gz!j#DA+n(z\BR*ws!"/8v?F6-d?{#"n=!wIOH nGw{ xE4YTY:!;s|qXr"a)'m~a6fh.k$y6pR('![ 6x' XD=Y o^t8fq$ [ De~ea\F\x S(9o+_@Nj?67g*}klj.*\/)eH+ OHP Yy| @8*nSE" GSN*3T:ARqc{# '6 >5wx7t7W9d3 }4uzf cXw4AYmL>3wNtmh4kX+s[94b

p?@+9`12Av ?{C MKtsChrt*Vz.Nr6}d=KG$^#gUKf w%G*b3|bQX1YRfDLudg >b^A#;&I<w:NU* wLPOSXCaMOLCsd Q +!B3v^Al[0"_qhA{f\ip KD 3F(S[[XNK[\nY2KInmp9a0qTFVPRLnAOf0|"sj4X3"me[8C-DFFxCQ&v K doc9.q+w2OD\66 |3&s1Mg{v OEW&E ta:R_{dHEXUJyh&KavVM67?uC9 K b>>076 .,IhH V>z8wx1GySf 0qWi:iL)nWN3ZB!ye9/TuIGJfq1:+,.9;mZe((stderr, "opeZ UNZIP.BCK>[UNZIP60]FILEIO.C;1;(slide, 0x401, ((char *)slide, LoadFarString(UFilenameTooLongTrunc))); error = PK_WARN; } /* replace filename with converted UTF-8 */ strcpy(G.filename, fn); free(fn); } # endif /* UNICODE_WCHAR */ if (G.unipath_filename != G.filename_full) free(G.unipath_filename); G.unipath_filename = NULL; } } #endif /* UNICODE_SUPPORT */ } break; #ifdef AMIGA /* * Fifth case, for the Amiga only: take the comment that would ordinarily * be skipped over, and turn it into a 79 character string that will be * attached to the file as a "filenote" after it is extracted. */ case FILENOTE: if ((block_len = readbuf(__G__ tmp_fnote, (unsigned) MIN(length, 2 * AMIGA_FILENOTELEN - 1))) == 0) return PK_EOF; if ((length -= block_len) > 0) /* treat remainder as in case SKIP: */ seek_zipf(__G__ G.cur_zipfile_bufstart - G.extra_bytes + (G.inptr - G.inbuf) + length); /* convert multi-line text into single line with no ctl-chars: */ tmp_fnote[block_len] = '\0'; while ((short int) --block_len >= 0) if ((unsigned) tmp_fnote[block_len] < ' ') if (tmp_fnote[block_len+1] == ' ') /* no excess */ strcpy(tmp_fnote+block_len, tmp_fnote+block_len+1); else tmp_fnote[block_len] = ' '; tmp_fnote[AMIGA_FILENOTELEN - 1] = '\0'; if (G.filenotes[G.filenote_slot]) free(G.filenotes[G.filenote_slot]); /* should not happen */ G.filenotes[G.filenote_slot] = NULL; if (tmp_fnote[0]) { if (!(G.filenotes[G.filenote_slot] = malloc(strlen(tmp_fnote)+1))) return PK_MEM; strcpy(G.filenotes[G.filenote_slot], tmp_fnote); } break; #endif /* AMIGA */ } /* end switch (option) */ return error; } /* end function do_string() */ /***********************/ /* Function makeword() */ /***********************/ ush makeword(b) ZCONST uch *b; { /* * Convert Intel style 'short' integer to non-Intel non-16-bit * host format. This routine also takes care of byte-ordering. */ return (ush)((b[1] << 8) | b[0]); } /***********************/ /* Function makelong() */ /***********************/ ulg makelong(sig) ZCONST uch *sig; { /* * Convert intel style 'long' variable to non-Intel non-16-bit * host format. This routine also takes care of byte-ordering. */ return (((ulg)sig[3]) << 24) + (((ulg)sig[2]) << 16) + (ulg)((((unsigned)sig[1]) << 8) + ((unsigned)sig[0])); } /************************/ /* Function makeint64() */ /************************/ zusz_t makeint64(sig) ZCONST uch *sig; { #ifdef LARGE_FILE_SUPPORT /* * Convert intel style 'int64' variable to non-Intel non-16-bit * host format. This routine also takes care of byte-ordering. */ return (((zusz_t)sig[7]) << 56) + (((zusz_t)sig[6]) << 48) + (((zusz_t)sig[4]) << 32) + (zusz_t)((((ulg)sig[3]) << 24) + (((ulg)sig[2]) << 16) + (((unsigned)sig[1]) << 8) + (sig[0])); #else /* !LARGE_FILE_SUPPORT */ if ((sig[7] | sig[6] | sig[5] | sig[4]) != 0) return (zusz_t)0xffffffffL; else return (zusz_t)((((ulg)sig[3]) << 24) + (((ulg)sig[2]) << 16) + (((unsigned)sig[1]) << 8) + (sig[0])); #endif /* ?LARGE_FILE_SUPPORT */ } /*********************/ /* Function fzofft() */ /*********************/ /* Format a zoff_t value in a cylindrical buffer set. */ char *fzofft(__G__ val, pre, post) __GDEF zoff_t val; ZCONST char *pre; ZCONST char *post; { /* Storage cylinder. (now in globals.h) */ /*static char fzofft_buf[FZOFFT_NUM][FZOFFT_LEN];*/ /*static int fzofft_index = 0;*/ /* Temporary format string storage. */ char fmt[16]; /* Assemble the format string. */ fmt[0] = '%'; fmt[1] = '\0'; /* Start after initial "%". */ if (pre == FZOFFT_HEX_WID) /* Special hex width. */ { strcat(fmt, FZOFFT_HEX_WID_VALUE); } else if (pre == FZOFFT_HEX_DOT_WID) /* Special hex ".width". */ { strcat(fmt, "."); strcat(fmt, FZOFFT_HEX_WID_VALUE); } else if (pre != NULL) /* Caller's prefix (width). */ { strcat(fmt, pre); } strcat(fmt, FZOFFT_FMT); /* Long or long-long or whatever. */ if (post == NULL) strcat(fmt, "d"); /* Default radix = decimal. */ else strcat(fmt, post); /* Caller's radix. */ /* Advance the cylinder. */ G.fzofft_index = (G.fzofft_index + 1) % FZOFFT_NUM; /* Write into the current chamber. */ sprintf(G.fzofft_buf[G.fzofft_index], fmt, val); /* Return a pointer to this chamber. */ return G.fzofft_buf[G.fzofft_index]; } #if CRYPT #ifdef NEED_STR2ISO /**********************/ /* Function str2iso() */ /**********************/ char *str2iso(dst, src) char *dst; /* destination buffer */ register ZCONST char *src; /* source string */ { #ifdef INTERN_TO_ISO INTERN_TO_ISO(src, dst); #else register uch c; register char *dstp = dst; do { c = (uch)foreign(*src++); *dstp++ = (char)ASCII2ISO(c); } while (c != '\0'); #endif return dst; } #endif /* NEED_STR2ISO */ #ifdef NEED_STR2OEM /**********************/ /* Function str2oem() */ /**********************/ char *str2oem(dst, src) char *dst; /* destination buffer */ register ZCONST char *src; /* source string */ { #ifdef INTERN_TO_OEM INTERN_TO_OEM(src, dst); #else register uch c; register char *dstp = dst; do { c = (uch)foreign(*src++); *dstp++ = (char)ASCII2OEM(c); } while (c != '\0'); #endif return dst; } #endif /* NEED_STR2OEM */ #endif /* CRYPT */ #ifdef ZMEM /* memset/memcmp/memcpy for systems without either them or */ /* bzero/bcmp/bcopy */ /* (no known systems as of 960211) */ /*********************/ /* Function memset() */ /*********************/ zvoid *memset(buf, init, len) register zvoid *buf; /* buffer location */ register int init; /* initializer character */ register unsigned int len; /* length of the buffer */ { zvoid *start; start = buf; while (len--) *((char *)buf++) = (char)init; return start; } /*********************/ /* Function memcmp() */ /*********************/ int memcmp(b1, b2, len) register ZCONST zvoid *b1; register ZCONST zvoid *b2; register unsigned int len; { register int c; if (len > 0) do { if ((c = (int)(*((ZCONST unsigned char *)b1)++) - (int)(*((ZCONST unsigned char *)b2)++)) != 0) return c; } while (--len > 0) return 0; } /*********************/ /* Function memcpy() */ /*********************/ zvoid *memcpy(dst, src, len) register zvoid *dst; register ZCONST zvoid *src; register unsigned int len; { zvoid *start; start = dst; while (len-- > 0) *((char *)dst)++ = *((ZCONST char *)src)++; return start; } #endif /* ZMEM */ #ifdef NO_STRNICMP /************************/ /* Function zstrnich UNZIP.BCK>[UNZIP60]FILEIO.C;1mp() */ /************************/ int zstrnicmp(s1, s2, n) register ZCONST char *s1, *s2; register unsigned n; { for (; n > 0; --n, ++s1, ++s2) { if (ToLower(*s1) != ToLower(*s2)) /* test includes early termination of one string */ return ((uch)ToLower(*s1) < (uch)ToLower(*s2))? -1 : 1; if (*s1 == '\0') /* both strings terminate early */ return 0; } return 0; } #endif /* NO_STRNICMP */ #ifdef REGULUS /* returns the inode number on success(!)...argh argh argh */ # undef stat /********************/ /* Function zstat() */ /********************/ int zstat(p, s) ZCONST char *p; struct stat *s; { return (stat((char *)p,s) >= 0? 0 : (-1)); } #endif /* REGULUS */ #ifdef _MBCS /* DBCS support for Info-ZIP's zip (mainly for japanese (-: ) * by Yoshioka Tsuneo (QWF00133@nifty.ne.jp,tsuneo-y@is.aist-nara.ac.jp) * This code is public domain! Date: 1998/12/20 */ /************************/ /* Function plastchar() */ /************************/ char *plastchar(ptr, len) ZCONST char *ptr; extent len; { unsigned clen; ZCONST char *oldptr = ptr; while(*ptr != '\0' && len > 0){ oldptr = ptr; clen = CLEN(ptr); ptr += clen; len -= clen; } return (char *)oldptr; } #ifdef NEED_UZMBCLEN /***********************/ /* Function uzmbclen() */ /***********************/ extent uzmbclen(ptr) ZCONST unsigned char *ptr; { int mbl; mbl = mblen((ZCONST char *)ptr, MB_CUR_MAX); /* For use in code scanning through MBCS strings, we need a strictly positive "MB char bytes count". For our scanning purpose, it is not not relevant whether the MB character is valid or not. And, the NUL char '\0' has a byte count of 1, but mblen() returns 0. So, we make sure that the uzmbclen() return value is not less than 1. */ return (extent)(mbl > 0 ? mbl : 1); } #endif /* NEED_UZMBCLEN */ #ifdef NEED_UZMBSCHR /***********************/ /* Function uzmbschr() */ /***********************/ unsigned char *uzmbschr(str, c) ZCONST unsigned char *str; unsigned int c; { while(*str != '\0'){ if (*str == c) {return (unsigned char *)str;} INCSTR(str); } return NULL; } #endif /* NEED_UZMBSCHR */ #ifdef NEED_UZMBSRCHR /************************/ /* Function uzmbsrchr() */ /************************/ unsigned char *uzmbsrchr(str, c) ZCONST unsigned char *str; unsigned int c; { unsigned char *match = NULL; while(*str != '\0'){ if (*str == c) {match = (unsigned char *)str;} INCSTR(str); } return match; } #endif /* NEED_UZMBSRCHR */ #endif /* _MBCS */ #ifdef SMALL_MEM /*******************************/ /* Function fLoadFarString() */ /* (and friends...) */ /*******************************/ char *fLoadFarString(__GPRO__ const char Far *sz) { (void)zfstrcpy(G.rgchBigBuffer, sz); return G.rgchBigBuffer; } char *fLoadFarStringSmall(__GPRO__ const char Far *sz) { (void)zfstrcpy(G.rgchSmallBuffer, sz); return G.rgchSmallBuffer; } char *fLoadFarStringSmall2(__GPRO__ const char Far *sz) { (void)zfstrcpy(G.rgchSmallBuffer2, sz); return G.rgchSmallBuffer2; } #if (!defined(_MSC_VER) || (_MSC_VER < 600)) /*************************/ /* Function zfstrcpy() */ /* portable clone of _fstrcpy() */ /*************************/ char Far * Far zfstrcpy(char Far *s1, const char Far *s2) { char Far *p = s1; while ((*s1++ = *s2++) != '\0'); return p; } #if (!(defined(SFX) || defined(FUNZIP))) /*************************/ /* Function zfstrcmp() */ /* portable clone of _fstrcmp() */ /*************************/ int Far zfstrcmp(const char Far *s1, const char Far *s2) { int ret; while ((ret = (int)(uch)*s1 - (int)(uch)*s2) == 0 && *s2 != '\0') { ++s2; ++s1; } return ret; } #endif /* !(SFX || FUNZIP) */ #endif /* !_MSC_VER || (_MSC_VER < 600) */ #endif /* SMALL_MEM */ *[UNZIP60]FILE_ID.DIZ;1+, ./ 4t@->0123KPWO56\B7\B89GHJInfo-ZIP's UnZip 6.0: generic C sources Complete C source code for Info-ZIP's PKUNZIP-compatible .zip extractor, for all supported compilers and platforms (Unix, OS/2, MS-DOS, NT, VMS, Amiga, Atari, Mac, Acorn, VM/CMS, etc.), plus lots of pretty decent documentation. This is FREE (but copyrighted) software. See LICENSE for details on distribution and reuse. *[UNZIP60]FLEXOS.DIR;1+,+N./ 4->0123 KPWO5607089GHJI CONTENTS.1YFLEXOS.C>FLXCFG.HU,HC.PROZ MAKEFILE.\\README.3k*[UNZIP60.FLEXOS]CONTENTS.;1+,1Y./ 4@-+N0123KPWO56J9.x7J9.x89GHJContents of the "flexos" subdirectory for UnZip 5.32 and later: Contents this file README notes about limitations and assumptions of the FlexOS port flexos.c OS-dependent UnZip routines for FlexOS flxcfg.h OS-dependent configuration, included by unzpriv.h hc.pro profile for MetaWare High C makefile makefile for MetaWare High C, PAMAKE *[UNZIP60.FLEXOS]FLEXOS.C;1+,>.F/ 4FFr@-+N0123KPWOG560 )70 )89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- flexos.c FlexOS-specific routines for use with Info-ZIP's UnZip 5.2 and later. Based upon the MSDOS version of this file (msdos/msdos.c) Contains: do_wild() mapattr() mapname() map2fat() checkdir() close_outfile() dateformat() version() _wildarg() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #include /* The following should really be a static declaration, but the compiler complal UNZIP.BCK>+N[UNZIP60.FLEXOS]FLEXOS.C;1FQ9ins (crappy compiler can't cope with a static forward declaration). */ extern void map2fat OF((char *pathcomp, char *last_dot)); static int created_dir; /* used by mapname(), checkdir() */ static int renamed_fullpath; /* ditto */ /*****************************/ /* Strings used in flexos.c */ /*****************************/ #ifndef SFX static ZCONST char Far CantAllocateWildcard[] = "warning: cannot allocate wildcard buffers\n"; #endif static ZCONST char Far WarnDirTraversSkip[] = "warning: skipped \"../\" path component(s) in %s\n"; static ZCONST char Far Creating[] = " creating: %s\n"; static ZCONST char Far ConversionFailed[] = "mapname: conversion of %s failed\n"; static ZCONST char Far PathTooLong[] = "checkdir error: path too long: %s\n"; static ZCONST char Far CantCreateDir[] = "checkdir error: cannot create %s\n\ unable to process %s.\n"; static ZCONST char Far DirIsntDirectory[] = "checkdir error: %s exists but is not directory\n\ unable to process %s.\n"; static ZCONST char Far PathTooLongTrunc[] = "checkdir warning: path too long; truncating\n %s\n\ -> %s\n"; #if (!defined(SFX) || defined(SFX_EXDIR)) static ZCONST char Far CantCreateExtractDir[] = "checkdir: cannot create extraction directory: %s\n"; #endif #include #ifndef SFX /************************/ /* Function do_wild() */ /* identical to OS/2 version */ /************************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { static DIR *wild_dir = (DIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; char *fnamestart; struct dirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!notfirstcall) { /* first call: must initialize everything */ notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; have_dirname = FALSE; dir = NULL; return matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((wildname = strrchr(wildspec, '/')) == (ZCONST char *)NULL && (wildname = strrchr(wildspec, ':')) == (ZCONST char *)NULL) { dirname = "."; dirnamelen = 1; have_dirname = FALSE; wildname = wildspec; } else { ++wildname; /* point at character after '/' or ':' */ dirnamelen = (int)(wildname - wildspec); if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) { Info(slide, 1, ((char *)slide, LoadFarString(CantAllocateWildcard))); strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; /* but maybe filespec was not a wildcard */ } /* GRR: cannot strip trailing char for opendir since might be "d:/" or "d:" * (would have to check for "./" at end--let opendir handle it instead) */ strncpy(dirname, wildspec, dirnamelen); dirname[dirnamelen] = '\0'; /* terminate for strcpy below */ have_dirname = TRUE; } Trace((stderr, "do_wild: dirname = [%s]\n", FnFilter1(dirname))); if ((wild_dir = opendir(dirname)) != (DIR *)NULL) { if (have_dirname) { strcpy(matchname, dirname); fnamestart = matchname + dirnamelen; } else fnamestart = matchname; while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); strcpy(fnamestart, file->d_name); if (strrchr(fnamestart, '.') == (char *)NULL) strcat(fnamestart, "."); if (match(fnamestart, wildname, 1 WISEP) && /* 1=ignore case */ /* skip "." and ".." directory entries */ strcmp(fnamestart, ".") && strcmp(fnamestart, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); /* remove trailing dot */ fnamestart += strlen(fnamestart) - 1; if (*fnamestart == '.') *fnamestart = '\0'; return matchname; } } /* if we get to here directory is exhausted, so close it */ closedir(wild_dir); wild_dir = (DIR *)NULL; } #ifdef DEBUG else { Trace((stderr, "do_wild: opendir(%s) returns NULL\n", FnFilter1(dirname))); } #endif /* DEBUG */ /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (wild_dir == (DIR *)NULL) { notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ if (have_dirname) { /* strcpy(matchname, dirname); */ fnamestart = matchname + dirnamelen; } else fnamestart = matchname; while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); strcpy(fnamestart, file->d_name); if (strrchr(fnamestart, '.') == (char *)NULL) strcat(fnamestart, "."); if (match(fnamestart, wildname, 1 WISEP)) { /* 1 == ignore case */ Trace((stderr, "do_wild: match() succeeds\n")); /* remove trailing dot */ fnamestart += strlen(fnamestart) - 1; if (*fnamestart == '.') *fnamestart = '\0'; return matchname; } } closedir(wild_dir); /* have read at least one entry; nothing left */ wild_dir = (DIR *)NULL; notfirstcall = FALSE; /* reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) __GDEF { /* set archive bit (file is not backed up): */ G.pInfo->file_attr = (unsigned)(G.crec.external_file_attributes & 7) | 32; return 0; } /**********************/ /* Function mapname() */ /**********************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPNj UNZIP.BCK>+N[UNZIP60.FLEXOS]FLEXOS.C;1F̠_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ char *last_dot=(char *)NULL; /* last dot not converted to underscore */ int dotname = FALSE; /* path component begins with dot? */ int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* Cannot set disk volume labels in FlexOS */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); created_dir = FALSE; /* not yet */ renamed_fullpath = FALSE; if (renamed) { cp = G.filename - 1; /* point to beginning of renamed name... */ while (*++cp) if (*cp == '\\') /* convert backslashes to forward */ *cp = '/'; cp = G.filename; /* use temporary rootpath if user gave full pathname */ if (G.filename[0] == '/') { renamed_fullpath = TRUE; pathcomp[0] = '/'; /* copy the '/' and terminate */ pathcomp[1] = '\0'; ++cp; } else if (isalpha((uch)G.filename[0]) && G.filename[1] == ':') { renamed_fullpath = TRUE; pp = pathcomp; *pp++ = *cp++; /* copy the "d:" (+ '/', possibly) */ *pp++ = *cp++; if (*cp == '/') *pp++ = *cp++; /* otherwise add "./"? */ *pp = '\0'; } } /* pathcomp is ignored unless renamed_fullpath is TRUE: */ if ((error = checkdir(__G__ pathcomp, INIT)) != 0) /* initialize path buf */ return error; /* ...unless no mem or vol label on hard disk */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (!renamed) { /* cp already set if renamed */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ } /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; map2fat(pathcomp, last_dot); /* 8.3 truncation (in place) */ last_dot = (char *)NULL; if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case '.': if (pp == pathcomp) { /* nothing appended yet... */ if (*cp == '.' && cp[1] == '/') { /* "../" */ *pp++ = '.'; /* add first dot, unchanged... */ ++cp; /* skip second dot, since it will */ } else { /* be "added" at end of if-block */ *pp++ = '_'; /* FAT doesn't allow null filename */ dotname = TRUE; /* bodies, so map .exrc -> _.exrc */ } /* (extra '_' now, "dot" below) */ } else if (dotname) { /* found a second dot, but still */ dotname = FALSE; /* have extra leading underscore: */ *pp = '\0'; /* remove it by shifting chars */ pp = pathcomp + 1; /* left one space (e.g., .p1.p2: */ while (pp[1]) { /* __p1 -> _p1_p2 -> _p1.p2 when */ *pp = pp[1]; /* finished) [opt.: since first */ ++pp; /* two chars are same, can start */ } /* shifting at second position] */ } last_dot = pp; /* point at last dot so far... */ *pp++ = '_'; /* convert dot to underscore for now */ break; /* drive names are not stored in zipfile, so no colons allowed; * no brackets or most other punctuation either (all of which * can appear in Unix-created archives; backslash is particularly * bad unless all necessary directories exist) */ case '[': /* these punctuation characters forbidden */ case ']': /* only on plain FAT file systems */ case '+': case ',': case '=': case ':': /* special shell characters of command.com */ case '\\': /* (device and directory limiters, wildcard */ case '"': /* characters, stdin/stdout redirection and */ case '<': /* pipe indicators and the quote sign) are */ case '>': /* never allowed in filenames on (V)FAT */ case '|': case '*': case '?': *pp++ = '_'; break; case ';': /* start of VMS version? */ lastsemi = pp; break; case ' ': /* change spaces to underscores */ if (uO.sflag) /* only if requested */ *pp++ = '_'; else *pp++ = (char)workch; break; default: /* allow ASCII 255 and European characters in filenames: */ if (isprint(workch) || workch >= 127) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(WarnDirTraversSkip), FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combi^om UNZIP.BCK>+N[UNZIP60.FLEXOS]FLEXOS.C;1F!ne path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(Creating), FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi; /* semi-colon was omitted: expect all #'s */ while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } map2fat(pathcomp, last_dot); /* 8.3 truncation (in place) */ if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, LoadFarString(ConversionFailed), FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ /**********************/ /* Function map2fat() */ /**********************/ static void map2fat(pathcomp, last_dot) char *pathcomp, *last_dot; { char *pEnd = pathcomp + strlen(pathcomp); /*--------------------------------------------------------------------------- Case 1: filename has no dot, so figure out if we should add one. Note that the algorithm does not try to get too fancy: if there are no dots already, the name either gets truncated at 8 characters or the last un- derscore is converted to a dot (only if more characters are saved that way). In no case is a dot inserted between existing characters. GRR: have problem if filename is volume label?? ---------------------------------------------------------------------------*/ /* pEnd = pathcomp + strlen(pathcomp); */ if (last_dot == (char *)NULL) { /* no dots: check for underscores... */ char *plu = strrchr(pathcomp, '_'); /* pointer to last underscore */ if (plu == (char *)NULL) { /* no dots, no underscores: truncate at */ if (pEnd > pathcomp+8) /* 8 chars (could insert '.' and keep 11) */ *(pEnd = pathcomp+8) = '\0'; } else if (MIN(plu - pathcomp, 8) + MIN(pEnd - plu - 1, 3) > 8) { last_dot = plu; /* be lazy: drop through to next if-block */ } else if ((pEnd - pathcomp) > 8) /* more fits into just basename */ pathcomp[8] = '\0'; /* than if convert last underscore to dot */ /* else whole thing fits into 8 chars or less: no change */ } /*--------------------------------------------------------------------------- Case 2: filename has dot in it, so truncate first half at 8 chars (shift extension if necessary) and second half at three. ---------------------------------------------------------------------------*/ if (last_dot != (char *)NULL) { /* one dot (or two, in the case of */ *last_dot = '.'; /* "..") is OK: put it back in */ if ((last_dot - pathcomp) > 8) { char *p=last_dot, *q=pathcomp+8; int i; for (i = 0; (i < 4) && *p; ++i) /* too many chars in basename: */ *q++ = *p++; /* shift extension left and */ *q = '\0'; /* truncate/terminate it */ } else if ((pEnd - last_dot) > 4) last_dot[4] = '\0'; /* too many chars in extension */ /* else filename is fine as is: no change */ } } /* end function map2fat() */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { static int rootlen = 0; /* length of rootpath */ static char *rootpath; /* user's "extract-to" directory */ static char *buildpath; /* full path (so far) to extracted file */ static char *end; /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') ++end; /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ if ((end-buildpath) > FILNAMSIZ-3) /* need '/', one-char name, '\0' */ too_long = TRUE; /* check if extracting directory? */ if (stat(buildpath, &G.statbuf)) /* path doesn't exist */ { if (!G.create_dirs) { /* told not to create (freshening) */ free(buildpath); return MPN_INF_SKIP; /* path doesn't exist: nothing to do */ } if (too_long) { Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong), FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (mkdir(buildpath, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, LoadFarString(CantCreateDir), FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, LoadFarString(DirIsntDirectory), FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong), FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *end++ = '/'; *end = '\0'; Trace((stderr, "buildpath now = jt UNZIP.BCK>+N[UNZIP60.FLEXOS]FLEXOS.C;1F50[%s]\n", FnFilter1(buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(buildpath); buildpath = end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') { ++end; if ((end-buildpath) >= FILNAMSIZ) { *--end = '\0'; Info(slide, 1, ((char *)slide, LoadFarString(PathTooLongTrunc), FnFilter1(G.filename), FnFilter2(buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); /* allocate space for full filename, root path, and maybe "./" */ if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+3)) == (char *)NULL) return MPN_NOMEM; if (renamed_fullpath) { /* pathcomp = valid data */ end = buildpath; while ((*end = *pathcomp++) != '\0') ++end; } else if (rootlen > 0) { strcpy(buildpath, rootpath); end = buildpath + rootlen; } else { *buildpath = '\0'; end = buildpath; } Trace((stderr, "[%s]\n", FnFilter1(buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if neces- sary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. Note that under FlexOS, if a candidate extract-to directory specification includes a drive letter (leading "x:"), it is treated just as if it had a trailing '/'--that is, one directory level will be created if the path doesn't exist, unless this is otherwise pro- hibited (e.g., freshening). ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { rootlen = 0; return MPN_OK; } if (rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((rootlen = strlen(pathcomp)) > 0) { int had_trailing_pathsep=FALSE, add_dot=FALSE; char *tmproot; if ((tmproot = (char *)malloc(rootlen+3)) == (char *)NULL) { rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (tmproot[rootlen-1] == '/' || tmproot[rootlen-1] == '\\') { tmproot[--rootlen] = '\0'; had_trailing_pathsep = TRUE; } if (tmproot[rootlen-1] == ':') { if (!had_trailing_pathsep) /* i.e., original wasn't "xxx:/" */ add_dot = TRUE; /* relative path: add '.' before '/' */ } else if (rootlen > 0) && /* need not check "xxx:." and "xxx:/" */ (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); rootlen = 0; /* treat as stored file */ return MPN_INF_SKIP; } /* GRR: scan for wildcard characters? OS-dependent... * if find any, return MPN_INF_SKIP: treat as stored file(s) */ /* create directory (could add loop here scanning tmproot * to create more than one level, but really necessary?) */ if (mkdir(tmproot, 0777) == -1) { Info(slide, 1, ((char *)slide, LoadFarString(CantCreateExtractDir), FnFilter1(tmproot))); free(tmproot); rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdir levels required */ return MPN_ERR_SKIP; } } if (add_dot) /* had just "x:", make "x:." */ tmproot[rootlen++] = '.'; tmproot[rootlen++] = '/'; tmproot[rootlen] = '\0'; if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) { free(tmproot); rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (rootlen > 0) { free(rootpath); rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) __GDEF /* * FlexOS VERSION * * Set the output file date/time stamp according to information from the * zipfile directory record for this member, then close the file and set * its permissions (archive, hidden, read-only, system). Aside from closing * the file, this routine is optional (but most compilers support it). */ { DISKFILE df; LONG fnum; struct { /* date and time words */ union { /* DOS file modification time word */ ush ztime; struct { unsigned zt_se : 5; unsigned zt_mi : 6; unsigned zt_hr : 5; } _tf; } _t; union { /* DOS file modification date word */ ush zdate; struct { unsigned zd_dy : 5; unsigned zd_mo : 4; unsigń UNZIP.BCK>+N[UNZIP60.FLEXOS]FLEXOS.C;1F#?ed zd_yr : 7; } _df; } _d; } zt; #ifdef USE_EF_UT_TIME iztimes z_utime; struct tm *t; #endif /* ?USE_EF_UT_TIME */ fclose(G.outfile); if ((fnum = s_open(A_SET, G.filename)) < 0) { Info(slide, 0x201, ((char *)slide, "warning: cannot open %s to set the time\n", FnFilter1(G.filename))); return; } if (s_get(T_FILE, fnum, &df, DSKFSIZE) < 0) { s_close(0, fnum); Info(slide, 0x201, ((char *)slide, "warning: cannot get info on %s\n", FnFilter1(G.filename))); return; } /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { /*--------------------------------------------------------------------------- Copy and/or convert time and date variables, if necessary; then fill in the file time/date. ---------------------------------------------------------------------------*/ #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) { TTrace((stderr, "close_outfile: Unix e.f. modif. time = %ld\n", z_utime.mtime)); t = localtime(&(z_utime.mtime)); } else t = (struct tm *)NULL; if (t != (struct tm *)NULL) { if (t->tm_year < 80) { df.df_modyear = 1980; df.df_modmonth = 1; df.df_modday = 1; df.df_modhr = 0; df.df_modmin = 0; df.df_modsec = 0; } else { df.df_modyear = t->tm_year + 1900; df.df_modmonth = t->tm_mon + 1; df.df_modday = t->tm_mday; df.df_modhr = t->tm_hour; df.df_modmin = t->tm_min; df.df_modsec = t->tm_sec; } } else #endif /* ?USE_EF_UX_TIME */ { zt._t.ztime = (ush)(G.lrec.last_mod_dos_datetime) & 0xffff; zt._d.zdate = (ush)(G.lrec.last_mod_dos_datetime >> 16); df.df_modyear = 1980 + zt._d._df.zd_yr; df.df_modmonth = zt._d._df.zd_mo; df.df_modday = zt._d._df.zd_dy; df.df_modhr = zt._t._tf.zt_hr; df.df_modmin = zt._t._tf.zt_mi; df.df_modsec = zt._t._tf.zt_se << 1; } } /*--------------------------------------------------------------------------- Fill in the file attributes. ---------------------------------------------------------------------------*/ df.df_attr1 = (UBYTE)G.pInfo->file_attr; /*--------------------------------------------------------------------------- Now we try to set the attributes & date/time. ---------------------------------------------------------------------------*/ if (s_set(T_FILE, fnum, &df, DSKFSIZE) < 0) Info(slide, 0x201, ((char *)slide, "warning: cannot set info for %s\n", FnFilter1(G.filename))); s_close(0, fnum); } /* end function close_outfile() */ #ifndef SFX /*************************/ /* Function dateformat() */ /*************************/ int dateformat() { return DF_DMY; /* default for systems without locale info */ } /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { int len; len = sprintf((char *)slide, LoadFarString(CompiledWith), "MetaWare High C", "", "FlexOS", " (16-bit, big)", #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)len, 0); } #endif /* !SFX */ /************************/ /* Function _wildarg() */ /************************/ /* This prevents the PORTLIB startup code from preforming argument globbing */ _wildarg() {} *[UNZIP60.FLEXOS]FLXCFG.H;1+,U,./ 4)@-+N0123KPWO56M" 7M" 89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- FlexOS specific configuration section: ---------------------------------------------------------------------------*/ #ifndef __flxcfg_h #define __flxcfg_h #define __16BIT__ #define MED_MEM #define EXE_EXTENSION ".286" #ifndef nearmalloc # define nearmalloc malloc # define nearfree free #endif #define CRTL_CP_IS_OEM #define near #define far #endif /* !__flxcfg_h */ *[UNZIP60.FLEXOS]HC.PRO;1+,Z./ 4@-+N0123KPWO56ȳkv7ȳkv89GHJpragma Off(Floating_point); pragma On(286); pragma On(Literals_in_code); pragma On(Warn); pragma On(pointers_compatible); pragma On(Callee_pops_when_possible); pragma On(Auto_reg_alloc); pragma On(Const_in_Code); pragma On(Read_only_strings); pragma On(Optimize_for_space); pragma Off(Prototype_override_warnings); pragma Off(Quiet); pragma Off(Asm); pragma Off(flexview); #define PORTLIB #define FLEXOS 1 *[UNZIP60.FLEXOS]MAKEFILE.;1+,\\. / 4 `@-+N0123KPWO 56789GHJ#------------------------------------------------------------------------------ # Makefile for UnZip 5.53 and later Derek Fawcus # Version: MetaWare High C with PAMAKE 30 Dec 2005 # ########################################################################### # # Alter the first two macros to change the model # MODEL = big M = b # ########################################################################### # # These two sets of prefixes are changed when swapping between the master # and my machine. # FL_PREFIX = d:/flexos # Where FlexOS is rooted #FL_PREFIX = c:/. # ########################################################################### # # The following should not have to be changed - they should be automatic # given correct values for the above. # HC_LIB = $(FL_PREFIX)/highc/$(MODEL)/hc$(M)e.l86 PORT_LIB = $(FL_PREFIX)/usr/portlib/$(MODEL)/prtlbhc$(M).l86 PORT_OBJ = $(FL_PREFIX)/usr/portlib/$(MODEL)/prtlbhc$(M).obj HC_INC = $(FL_PREFIX)/hit UNZIP.BCK\\+NNZIP60.FLEXOS]MAKEFILE.;1 ghc/inc PORT_INC = $(FL_PREFIX)/usr/portlib/inc FLEX_INC = $(FL_PREFIX)/usr/inc +IPATH = $(PORT_INC)/;$(FLEX_INC)/; #+IPATH = $(PORT_INC)/;$(HC_INC)/;$(FLEX_INC)/; # ########################################################################### # # The programs to do the work. # CC = hc AS = rasm86 LD = link86 #HCOPTS=-mm $(MODEL) -debug -pr flexos/hc.pro HCOPTS=-mm $(MODEL) -pr flexos/hc.pro # ########################################################################### # # The file extensions to build from # .SUFFIXES: .SUFFIXES: .c .h .a86 # ########################################################################### # # Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. CPU_TYP = 2 # Uncomment the following three macros to use the optimized CRC32 assembler # routine in UnZip and UnZipSFX: #ASMFLG = -DASM_CRC #ASMOBJS = crc_i86.obj #ASMOBJF = crc_i86_.obj ASCPUFLAG = __$(CPU_TYP)86 UNZIP_H = unzip.h unzpriv.h globals.h flexos/flxcfg.h default: unzip.286 #default: unzip.286 funzip.286 unzipsfx.286 clean: del *.ob? del unzip.286 del funzip.286 del unzipsfx.* del *.map del *.lin del *.sym del *.dbg # ########################################################################### # .asm.obj: $(AS) $(ASFLAGS) -D$(ASUNMODEL) $*.asm .c.obj: $(CC) $< $(HCOPTS) -ob $@ .c.obf: $(CC) $< $(HCOPTS) -def FUNZIP -ob $@ .c.obs: $(CC) $< $(HCOPTS) -def SFX -ob $@ # ########################################################################### # crc_i86.obj: flexos/crc_i86.a86 $(AS) $(ASFLAGS) -D$(ASUNMODEL) flexos/crc_i86.a86, $*.obj ; # ######################################################################### # # The objects to build from # UNZIP_OBJS = unzip.obj crc32.obj crypt.obj envargs.obj \ explode.obj extract.obj fileio.obj globals.obj inflate.obj \ list.obj match.obj process.obj ttyio.obj unreduce.obj \ unshrink.obj zipinfo.obj flexos.obj $(ASMOBJS) unzip.286: $(UNZIP_OBJS) $(LD) $@[st[add[17e]]] = $-[input] $(PORT_OBJ), $+(${UNZIP_OBJS}), $(PORT_LIB), $(HC_LIB) < UNZIPSFX_OBJS = unzip.obs crc32.obs crypt.obs extract.obs \ fileio.obs globals.obs inflate.obs match.obs process.obs \ ttyio.obs flexos.obs $(ASMOBJS) unzipsfx.286: $(UNZIPSFX_OBJS) $(LD) $@[dbi,map[all],st[add[17e]]] = $-[input] $(PORT_OBJ), $+(${UNZIPSFX_OBJS}), $(PORT_LIB), $(HC_LIB) < FUNZIP_OBJS = funzip.obj crc32.obf crypt.obf globals.obf inflate.obf \ ttyio.obf $(ASMOBJF) funzip.286: $(FUNZIP_OBJS) $(LD) $@[dbi,map[all],st[add[17e]]] = $-[input] $(PORT_OBJ), $+(${FUNZIP_OBJS}), $(PORT_LIB), $(HC_LIB) < # ########################################################################### # unreduce.obj: unreduce.c $(UNZIP_H) unshrink.obj: unshrink.c $(UNZIP_H) unzip.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo.obj: zipinfo.c $(UNZIP_H) process.obj: process.c $(UNZIP_H) crc32.h list.obj: list.c $(UNZIP_H) match.obj: match.c $(UNZIP_H) fileio.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h envargs.obj: envargs.c $(UNZIP_H) explode.obj: explode.c $(UNZIP_H) extract.obj: extract.c $(UNZIP_H) crc32.h crypt.h crc32.obj: crc32.c $(UNZIP_H) zip.h crc32.h flexos.obj: flexos/flexos.c $(UNZIP_H) crc32.obj: crc32.c $(UNZIP_H) zip.h crc32.h crypt.obj: crypt.c $(UNZIP_H) crc32.h crypt.h ttyio.h zip.h globals.obj: globals.c $(UNZIP_H) inflate.obj: inflate.c inflate.h $(UNZIP_H) ttyio.obj: ttyio.c $(UNZIP_H) crypt.h ttyio.h zip.h funzip.obj: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h crc32.obf: crc32.c $(UNZIP_H) zip.h crc32.h crypt.obf: crypt.c $(UNZIP_H) crypt.h ttyio.h zip.h globals.obf: globals.c $(UNZIP_H) inflate.obf: inflate.c inflate.h $(UNZIP_H) crypt.h ttyio.obf: ttyio.c $(UNZIP_H) crypt.h ttyio.h zip.h flexos.obs: flexos/flexos.c $(UNZIP_H) crc32.obs: crc32.c $(UNZIP_H) zip.h crc32.h extract.obs: extract.c $(UNZIP_H) crc32.h crypt.h fileio.obs: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals.obs: globals.c $(UNZIP_H) inflate.obs: inflate.c inflate.h $(UNZIP_H) crypt.h match.obs: match.c $(UNZIP_H) process.obs: process.c $(UNZIP_H) crc32.h ttyio.obs: ttyio.c $(UNZIP_H) crypt.h ttyio.h zip.h unzip.obs: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h *[UNZIP60.FLEXOS]README.;1+,3k./ 4@-+N0123KPWO56^3.x7^3.x89GHJThis should be considered an initial port - there will probably be some bugs and non-functioning features. The only functionality that has had any real testing is "unzip filename", anything else is basically untested. This has been cross-compiled from DOS using Metaware's High C compiler and the DOS version of pamake (v3.0). It should compile with the FlexOS hosted version of HighC, and the makefile could be converted to work with the native FlexOS make. The following considerations apply: )Compiled against and linked with portlib. )Used on FlexOS 286 v2.32 )Volume labels are not supported - this is due to the way FlexOS decides if a drive has case-sensitive filenames based upon the contents of the volume label. )No special handling for case-sensitive media (see above). )Not using the PORTLIB wildarg routine (i.e., UnZip does its own globbing). )Based upon the MSDOS port. )Filenames are in FAT format. )The current version of getch is a cheat (simply using getchar()). I should interrogate stdin and if it's a FlexOS console use special code to turn off echo and just read one char. )Only the basic MSDOS FAT file attributes are saved/restored. There is currently no support for the FlexOS extended file attributes. )There is some code that should attempt to do the correct thing when a pathspec with a logical name definition is used (e.g., "system:path/to/it"); however it again has not been stress-tested. )There is no special handling for floppy drives, there probably should be. )The dateformat is compiled in as DMY (shoot me I'm British), I'm not sure if there is actually a way to get locale info. )The assembler speedups haven't yet been ported to ASM86 (should simply be a change of syntax) -- D.Fawcus 17 July 1997 *[UNZIP60]FUNZIP.C;1+,.'/ 4''@->0123KPWO(56S7S89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* funzip.c -- by Mark Adler */ #define VERSION "3.95 of 20 January 2009" /* Copyright history: - Starting with UnZip 5.41 of 16-April-2000, this source fil\?e UNZIP.BCK>[UNZIP60]FUNZIP.C;1'e is covered by the Info-Zip LICENSE cited above. - Prior versions of this source file, found in UnZip source packages up to UnZip 5.40, were put in the public domain. The original copyright note by Mark Adler was: "You can do whatever you like with this source file, though I would prefer that if you modify it and redistribute it that you include comments to that effect with your name and the date. Thank you." History: vers date who what ---- --------- -------------- ------------------------------------ 1.0 13 Aug 92 M. Adler really simple unzip filter. 1.1 13 Aug 92 M. Adler cleaned up somewhat, give help if stdin not redirected, warn if more zip file entries after the first. 1.2 15 Aug 92 M. Adler added check of lengths for stored entries, added more help. 1.3 16 Aug 92 M. Adler removed redundant #define's, added decryption. 1.4 27 Aug 92 G. Roelofs added exit(0). 1.5 1 Sep 92 K. U. Rommel changed read/write modes for OS/2. 1.6 6 Sep 92 G. Roelofs modified to use dummy crypt.c and crypt.h instead of -DCRYPT. 1.7 23 Sep 92 G. Roelofs changed to use DOS_OS2; included crypt.c under MS-DOS. 1.8 9 Oct 92 M. Adler improved inflation error msgs. 1.9 17 Oct 92 G. Roelofs changed ULONG/UWORD/byte to ulg/ush/uch; renamed inflate_entry() to inflate(); adapted to use new, in-place zdecode. 2.0 22 Oct 92 M. Adler allow filename argument, prompt for passwords and don't echo, still allow command-line password entry, but as an option. 2.1 23 Oct 92 J-l. Gailly fixed crypt/store bug, G. Roelofs removed crypt.c under MS-DOS, fixed decryption check to compare single byte. 2.2 28 Oct 92 G. Roelofs removed declaration of key. 2.3 14 Dec 92 M. Adler replaced fseek (fails on stdin for SCO Unix V.3.2.4). added quietflg for inflate.c. 3.0 11 May 93 M. Adler added gzip support 3.1 9 Jul 93 K. U. Rommel fixed OS/2 pipe bug (PIPE_ERROR) 3.2 4 Sep 93 G. Roelofs moved crc_32_tab[] to tables.h; used FOPx from unzip.h; nuked OUTB macro and outbuf; replaced flush(); inlined FlushOutput(); renamed decrypt to encrypted 3.3 29 Sep 93 G. Roelofs replaced ReadByte() with NEXTBYTE macro; revised (restored?) flush(); added FUNZIP 3.4 21 Oct 93 G. Roelofs renamed quietflg to qflag; changed outcnt, H. Gessau second updcrc() arg and flush() arg to ulg; added inflate_free(); added "g =" to null getc(in) to avoid compiler warnings 3.5 31 Oct 93 H. Gessau changed DOS_OS2 to DOS_NT_OS2 3.6 6 Dec 93 H. Gessau added "near" to mask_bits[] 3.7 9 Dec 93 G. Roelofs added extent typecasts to fwrite() checks 3.8 28 Jan 94 GRR/JlG initialized g variable in main() for gcc 3.81 22 Feb 94 M. Hanning-Lee corrected usage message 3.82 27 Feb 94 G. Roelofs added some typecasts to avoid warnings 3.83 22 Jul 94 G. Roelofs changed fprintf to macro for DLLs - 2 Aug 94 - public release with UnZip 5.11 - 28 Aug 94 - public release with UnZip 5.12 3.84 1 Oct 94 K. U. Rommel changes for Metaware High C 3.85 29 Oct 94 G. Roelofs changed fprintf macro to Info 3.86 7 May 95 K. Davis RISCOS patches; P. Kienitz Amiga patches 3.87 12 Aug 95 G. Roelofs inflate_free(), DESTROYGLOBALS fixes 3.88 4 Sep 95 C. Spieler reordered macro to work around MSC 5.1 bug 3.89 22 Nov 95 PK/CS ifdef'd out updcrc() for ASM_CRC 3.9 17 Dec 95 G. Roelofs modified for USE_ZLIB (new fillinbuf()) - 30 Apr 96 - public release with UnZip 5.2 3.91 17 Aug 96 G. Roelofs main() -> return int (Peter Seebach) 3.92 13 Apr 97 G. Roelofs minor cosmetic fixes to messages - 22 Apr 97 - public release with UnZip 5.3 - 31 May 97 - public release with UnZip 5.31 3.93 20 Sep 97 G. Roelofs minor cosmetic fixes to messages - 3 Nov 97 - public release with UnZip 5.32 - 28 Nov 98 - public release with UnZip 5.4 - 16 Apr 00 - public release with UnZip 5.41 - 14 Jan 01 - public release with UnZip 5.42 3.94 20 Feb 01 C. Spieler added support for Deflate64(tm) 23 Mar 02 C. Spieler changed mask_bits[] type to "unsigned" */ /* All funzip does is take a zipfile from stdin and decompress the first entry to stdout. The entry has to be either deflated or stored. If the entry is encrypted, then the decryption password must be supplied on the command line as the first argument. funzip needs to be linked with inflate.o and crypt.o compiled from the unzip source. If decryption is desired, the full version of crypt.c (and crypt.h) from zcrypt28.zip or later must be used. */ #ifndef FUNZIP # define FUNZIP #endif #define UNZIP_INTERNAL #include "unzip.h" #include "crc32.h" #include "crypt.h" #include "ttyio.h" #ifdef EBCDIC # undef EBCDIC /* don't need ebcdic[] */ #endif #ifndef USE_ZLIB /* zlib's function is called inflate(), too */ # define UZinflate inflate #endif /* PKZIP header definitions */ #define ZIPMAG 0x4b50 /* two-byte zip lead-in */ #define LOCREM 0x0403 /* remaining two bytes in zip signature */ #define LOCSIG 0x04034b50L /* full signature */ #define LOCFLG 4 /* offset of bit flag */ #define CRPFLG 1 /* bit for encrypted entry */ #define EXTFLG 8 /* bit for extended local header */ #define LOCHOW 6 /* offset of compression method */ #define LOCTIM 8 /* file mod time (for decryption) */ #define LOCCRC 12 /* offset of crc */ #define LOCSIZ 16 /* offset of compressed size */ #define LOCLEN 20 /* offset of uncompressed length */ #define LOCFIL 24 /* offset of file name field length */ #define LOCEXT 26 /* offset of extra field length */ #define LOCHDR 28 /* size of local header, including LOCREM */ #define EXTHDR 16 /* size of extended local header, inc sig */ /* GZIP header definitions */ #define GZPMAG 0x8b1f /* two-byte gzip lead-in */ #define GZPHOW 0 /* offset of method number */ #define GZPFLG 1 /* offset of gzip flags */ #define GZPMUL 2 /* bit for multiple-part gzip file */ #define GZPISX 4 /* bit for extra field present */ #define GZPISF 8 /* bit for filVM, UNZIP.BCK>[UNZIP60]FUNZIP.C;1')ename present */ #define GZPISC 16 /* bit for comment present */ #define GZPISE 32 /* bit for encryption */ #define GZPTIM 2 /* offset of Unix file modification time */ #define GZPEXF 6 /* offset of extra flags */ #define GZPCOS 7 /* offset of operating system compressed on */ #define GZPHDR 8 /* length of minimal gzip header */ #ifdef THEOS /* Macros cause stack overflow in compiler */ ush SH(uch* p) { return ((ush)(uch)((p)[0]) | ((ush)(uch)((p)[1]) << 8)); } ulg LG(uch* p) { return ((ulg)(SH(p)) | ((ulg)(SH((p)+2)) << 16)); } #else /* !THEOS */ /* Macros for getting two-byte and four-byte header values */ #define SH(p) ((ush)(uch)((p)[0]) | ((ush)(uch)((p)[1]) << 8)) #define LG(p) ((ulg)(SH(p)) | ((ulg)(SH((p)+2)) << 16)) #endif /* ?THEOS */ /* Function prototypes */ static void err OF((int, char *)); #if (defined(USE_DEFLATE64) && defined(__16BIT__)) static int partflush OF((uch *rawbuf, unsigned w)); #endif int main OF((int, char **)); /* Globals */ FILE *out; /* output file (*in moved to G struct) */ ulg outsiz; /* total bytes written to out */ int encrypted; /* flag to turn on decryption */ /* Masks for inflate.c */ ZCONST unsigned near mask_bits[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff }; #ifdef USE_ZLIB int fillinbuf(__G) __GDEF /* Fill input buffer for pull-model inflate() in zlib. Return the number of * bytes in inbuf. */ { /* GRR: check return value from fread(): same as read()? check errno? */ if ((G.incnt = fread((char *)G.inbuf, 1, INBUFSIZ, G.in)) <= 0) return 0; G.inptr = G.inbuf; #if CRYPT if (encrypted) { uch *p; int n; for (n = G.incnt, p = G.inptr; n--; p++) zdecode(*p); } #endif /* CRYPT */ return G.incnt; } #endif /* USE_ZLIB */ static void err(n, m) int n; char *m; /* Exit on error with a message and a code */ { Info(slide, 1, ((char *)slide, "funzip error: %s\n", m)); DESTROYGLOBALS(); EXIT(n); } #if (defined(USE_DEFLATE64) && defined(__16BIT__)) static int partflush(rawbuf, w) uch *rawbuf; /* start of buffer area to flush */ extent w; /* number of bytes to flush */ { G.crc32val = crc32(G.crc32val, rawbuf, (extent)w); if (fwrite((char *)rawbuf,1,(extent)w,out) != (extent)w && !PIPE_ERROR) err(9, "out of space on stdout"); outsiz += w; return 0; } int flush(w) /* used by inflate.c (FLUSH macro) */ ulg w; /* number of bytes to flush */ { uch *rawbuf; int ret; /* On 16-bit systems (MSDOS, OS/2 1.x), the standard C library functions * cannot handle writes of 64k blocks at once. For these systems, the * blocks to flush are split into pieces of 32k or less. */ rawbuf = slide; while (w > 0x8000L) { ret = partflush(rawbuf, 0x8000); if (ret != PK_OK) return ret; w -= 0x8000L; rawbuf += (unsigned)0x8000; } return partflush(rawbuf, (extent)w); } /* end function flush() */ #else /* !(USE_DEFLATE64 && __16BIT__) */ int flush(w) /* used by inflate.c (FLUSH macro) */ ulg w; /* number of bytes to flush */ { G.crc32val = crc32(G.crc32val, slide, (extent)w); if (fwrite((char *)slide,1,(extent)w,out) != (extent)w && !PIPE_ERROR) err(9, "out of space on stdout"); outsiz += w; return 0; } #endif /* ?(USE_DEFLATE64 && __16BIT__) */ int main(argc, argv) int argc; char **argv; /* Given a zipfile on stdin, decompress the first entry to stdout. */ { ush n; uch h[LOCHDR]; /* first local header (GZPHDR < LOCHDR) */ int g = 0; /* true if gzip format */ unsigned method = 0; /* initialized here to shut up gcc warning */ #if CRYPT char *s = " [-password]"; char *p; /* password */ #else /* !CRYPT */ char *s = ""; #endif /* ?CRYPT */ CONSTRUCTGLOBALS(); /* skip executable name */ argc--; argv++; #if CRYPT /* get the command line password, if any */ p = (char *)NULL; if (argc && **argv == '-') { argc--; p = 1 + *argv++; } #endif /* CRYPT */ #ifdef MALLOC_WORK /* The following expression is a cooked-down simplyfication of the calculation for the work area size of UnZip (see unzip.c). For fUnZip, the work area does not need to match the granularity of the complex unshrink structures, because it only supports inflation. But, like in UnZip, the zcalloc() wrapper function is needed for the allocation, to support the 64kByte buffer on 16-bit systems. */ # define UZ_SLIDE_CHUNK (sizeof(shrint)+sizeof(uch)+sizeof(uch)) # define UZ_NUMOF_CHUNKS (unsigned)( (WSIZE+UZ_SLIDE_CHUNK-1)/UZ_SLIDE_CHUNK ) G.area.Slide = (uch *)zcalloc(UZ_NUMOF_CHUNKS, UZ_SLIDE_CHUNK); # undef UZ_SLIDE_CHUNK # undef UZ_NUMOF_CHUNKS #endif /* if no file argument and stdin not redirected, give the user help */ if (argc == 0 && isatty(0)) { Info(slide , 1, ((char *)slide, "fUnZip (filter UnZip), version %s\n", VERSION)); Info(slide, 1, ((char *)slide, "usage: ... | funzip%s | ...\n", s)); Info(slide, 1, ((char *)slide, " ... | funzip%s > outfile\n", s)); Info(slide, 1, ((char *)slide, " funzip%s infile.zip > outfile\n",s)); Info(slide, 1, ((char *)slide, " funzip%s infile.gz > outfile\n", s)); Info(slide, 1, ((char *)slide, "Extracts to stdout the gzip file or first\ zip entry of stdin or the given file.\n")); DESTROYGLOBALS(); EXIT(3); } /* prepare to be a binary filter */ if (argc) { if ((G.in = fopen(*argv, FOPR)) == (FILE *)NULL) err(2, "cannot find input file"); } else { #ifdef DOS_FLX_NLM_OS2_W32 #if (defined(__HIGHC__) && !defined(FLEXOS)) setmode(stdin, _BINARY); #else setmode(0, O_BINARY); /* some buggy C libraries require BOTH setmode() */ #endif /* call AND the fdopen() in binary mode :-( */ #endif /* DOS_FLX_NLM_OS2_W32 */ #ifdef RISCOS G.in = stdin; #else if ((G.in = fdopen(0, FOPR)) == (FILE *)NULL) err(2, "cannot find stdin"); #endif } #ifdef DOS_FLX_H68_NLM_OS2_W32 #if (defined(__HIGHC__) && !defined(FLEXOS)) setmode(stdout, _BINARY); #else setmode(1, O_BINARY); #endif #endif /* DOS_FLX_H68_NLM_OS2_W32 */ #ifdef RISCOS out = stdout; #else if ((out = fdopen(1, FOPW)) == (FILE *)NULL) err(2, "cannot write to stdout"); #endif /* read local header, check validity, and skip name and extra fields */ n = getc(G.in); n |= getc(G.in) << 8; if (n == ZIPMAG) { if (fread((char *)h, 1, LOCHDR, G.in) != LOCHDR || SH(h) != LOCREM) err(3, "invalid zipfile"); switch (method = SH(h + LOCHOW)) { case STORED: case DEFLATED: #ifdef USE_DEFLATE64 case ENHDEFLATED: #endif break; default: err(3, "first entry not deflated or stored--cannot unpack"); break; } for (n = SH(h + LOCFIL); n--; ) g = getc(G.in); for (n = SH(h + LOCEXT); n--; ) g = getc(G.in); g = 0; encrypted = h[LOCFLG] & CRPFLG; } else if (n == GZPMAG) { if (fread((char *)h, 1, GZPHDR, G.in) != GZPHDR) err(3, "invalid gzip file"); if ((method = h[GZPHOW]) != DEFLATED && method != ENHDEFLATED) err(3, "gzip file not deflated"); if (h[GZPFLG] & GZPMUL) err(3, "cannot handle multi-part gzip files"); if (h[GZPFLG] & GZPISX) { n = getc(G.in); n |= getc(G.in) << 8; while (n--) g = getc(G.in); } if (h[GZPFLG] & GZPISF) w߽Ab  b 1M>D4XS4`hPlDhhqQbdi{gv=FeW.#YPmP$K7(oX^QBR~ Fc_O<'6|/ORfPUS42wq7%mCVgsIazurkc3m-`xJ5=B(VfX _cygS3r3 m{ls5-T,YS,KFlh?\J>"n*?k4^8uV0`Q]4D!]37VN(Ha@x& XC\Zx1Mjo=\C)z"n5 [4n0&U Cl]~{s^YJi [2%KK9Q=`g'Uf DtsIwu/fmahqu^V52aj~H@Q$R fS )Pwm$\@RW_08'=ns0Y9zZ| AET6 Bh]|eJ0iqQ&oQV*~ZAb g"w`7G=eiYY]iaGO2[f-2.7PW0|&u+TCweT h1'QL0pENNF@&j44yLqBxVN"xE7VcR] 3fuOUKgT^jubexX9sj_|L=nU!UK9 !EV%UF* {! JAD"lxA]Uh9Cxlb )E%s~]@,,)xvF{>lx@4Ym6s9eL>i*7&.0O*-a,C!^,Y(0y0fb[XU M{) p_{,D@G%;YqfaDr{9H9W=K!:N* C!NkVUB_ ch! Q^]%MSlzh75v[)Rm.w-EZh{;p]C,/VWvY@l-?8X2=p'D>0D8NB% O7eRCGH-iGYc/8d`)Q.DM'~_21 Ny>`8KVVPp7'h:? Oj%o4J-Ou(pb&^& ^Dk#o QuGJj8CYNB!LR*e:WbFj-<}_o-G3-KRnC<%e3a k;4xi$#Q&?.gfaj" 2_jG(1^ 3ibxU'fl]ih XJZ`kQ'wb*X\_V2 , lkLwT6D%d@&m]N|L%?RUYV\]\AAkgz(YA0hCVH]C80W Sh*&f0!|gJeu:C6 JngLq.jv[Ka6>@KMqJj,1#9{@Uf quLn~tER+}8`1TO-lVU#(9?4ThG)k%<Bj6/;?c 2{ 'GY(ef-YYSS#aZ2XV0pz LL1vAsBAnA5@F 3o{oLbPI3wPEyL Jw37o0ka]wdWVZ&"[`jnCJI&Qugi4F!'K?*Uz6oDpDMYCH#2CvkFEQv<eEPI*#{sbqm%SZ%EG"Wu/M p@DU>Aqp KI@\U1sL tz6,`pV%"P=a|SU+4/BaL-H5;Cgq50#]@/a`c>+p9%4 >qlk'r6 ~OS>>3"P)(xw{`(VAnmey`;3c 1K/_~84r/(?;{FT?,iR)H.-9u-mT Y/h f~O j_*y:/,NOSbIGSC=4%KA3 h6M'(D 35Ve&|Ro5n>\'UE28zj#V\0e 1 /dU=xC'|%{~HpY.xvbyq%h_pQJ[. ^Da }kii9$05ns131y p>Na`?[nsh; nU.!Bi:!>Yk^r_8{O0hI;kn|9 M6M52>-Flv$C;mf,%Rcb|w n/Auxj8dbmEES=J4R xa0+x*" ^Qp]aDNQNCTFLJZAX^VOu=5d9b v,D;L"] !PnY5( yeb\eYI@^\H]'&s#\[K&C5nc`\.9]?1qBKp:gM%h~`u l=e ]50 ho(otIa))P*>ER. MM %UAi~8L %5I:kG|:_U q2|{G j<)*p3.\S~*fu,iF0^k $ h?0e;i%-_&F8&@SxG%[[AGI>> T6. N vK31XS3GRO%K-F;N*Z|oh f7h9q{AA!/g)&,Sa&b4ANF"ceY>0+oc{l ^$w.ZMJ0`jlzAM42wWi}'8iae$|\n=t;=>[ %p-,kucJuOX1H!Lz(UEj-)#6X o%I7yZ = +DD^`"j7yu"1l} Ne[r5,4EKPqJel ]PnMAm', Q(| (}4[QkbT|gy(s RrBV{Ym|24ej7Jy?VMx&z2@pRX1#Od#%a;`jB<:b < A/*-& eW\d(e&Kd&t#FgM r`P~1]qh_|?pfpsI~">`P;.A'q~aGUa!0od{8:m3)mb*c[%BDXJ\Po0we#` gaKaDT K:r|1><~4lCzEHHkGiD8},qoZs,oh+1- 0#Iy~2$O/eLh+,-L Mw zjfMMeRBx ]b6^bD%9-S63GhXb.&9x|OqS>EimV:GV:~PLSEayR3?Qb)'gCi.I=Ah"5')%28 !V~%j~^Gu!1,0,GRP=\J\Z]`Wl.~ E1|4O5tl r]j2&9$mjg3~}gnXB "G8^--'[RYB2Dz1WW ]V|?}ʶtR_]5HBF6@ h!4O3r?}qrv}1OGQn HL?,acCX+,/h~@73\K EGH { 3\_Ot ^?WGVC,aQ#LwR3G)=YAN4J+_NYWOHmtY"Eq*?kmjD)j o?%>J :&IyqIyTMNzCH gFn5;QDgWU^x.'7Zr$~T5!vY6o?{m,G E>4WCTm{1au pwK0l1)s5`_JP"[ *:B #Sq^_2q DH[ TQ OI|&LyS;o GCbvNY"mB]evತ4'Nu=<]dT. $f$SGTX^K EHAlES;X XmKm"7 AH-3d {u(/gq _u5I7j#)D ^l2rapewP2tpSDaU ElGXd"r-D&okCk0Kz Ki =C3R\jf8mHm'CnBFOJ{T,i^^;?g9@/qITHni9J/t%z.O3@4%3S@aI! Z~za7]2w8jknj'oBq 9 ~F>,E4p"EjwydW9=D!lkBQm}xaUp .fBZL*E=6vSz3y?48# E`kH!rKdU d[C8U*i$'Hz7vuaoU!5NfV4 {a;Bh_)nCl }+x!7~(g7I^Tw\(o[JlDQ^!/D[V\"=1K P$AaR1=4hvt|N`9%?j &=$)yG& O zICEKkS x.u gpO1(%2K:q/HzZQ c4'd]Q9WA[n@%y'=C {C#9 }9p^8SJ6, 9tFr7=P5n"M *2"#!2qsU-cV[p(>4qaB$ip@\ 6V,xzhr<~xilK2 l}rs.`Zq{[5z:k$%ee&}ncY3QR'fsO[0~p~X|^GU5 H3h:tyY ,q5 J9gk3APu%I#rjyb*`2WlWZ'E\RHBZk^|7HVn&!~k@uka M!aYX!k,O0=A-k")aMSLB2\5.C :ik 1CAfR#8!p 7gTjyyM^+8 RAh.pi*$WT^4$mW?:a,@Wwus:{T^o[.C`|tzg"P079&/.E$4iY?xj| %9n](!&)Q^:@S2y;wSNWIr.e224x19|N9'<\Ki ?/8zc`)?zDbJ ) =j2,EQAUs "|+fBp<=6?a5U'm;'q2t#*SAoPb LDbMUUPZ[r5!6qALh[suVYV*jz?6~jqmH/ZE4j +^.GP^E>MA\}3i)Yc%uEYM?|w!m-y?tut>o#~ khd#n "V "y1d&rEy:G]vBLx)]VS+U)Td+r ~J ?iL(yphu'+<|@lb |]DZXn[9MTPN*[Z8$S1>4Em\4}/!Eg)9~9 IhD]Xr4bli {ZYN <1_Luo\X+%  bpj~e 4/L88*I%1vQ%}l=ob) DZS@bcM6Bi3*:mi<,P/ i29kK+9$3VMnQ%x:f XR!QT#}\ ?,5-Z \Y[6z^ zvc3n h l;Qd5_1{a:g2ǬV: st̫2Mb6.e! < = M J"KdiJLP|) Vg`5 (lLRy:D+vna-7T"*^as- \GQm,!}DJ[nv(#+ )okrp+?3&WS\/_E)W $S Nk\@EZ=ho{-1&#CTc-c,KNC_9)ySlg`OG~ ; KfoKs)5oE ?b/V;/]4UzD]?u~en4?V$];e#DJNYJ7 BBWE0pw 0$c^0(_URX 0iprYY4I]B6k_^rLqI :&SN[{_\{%x(;2npM _e'l42,M,?M@CF4AF,!:qD -G)D`S: t2ru0:IO Aon, but the compiler complap UNZIP.BCK>[UNZIP60]FUNZIP.C;1'c hile ((g = getc(G.in)) != 0 && g != EOF) ; if (h[GZPFLG] & GZPISC) while ((g = getc(G.in)) != 0 && g != EOF) ; g = 1; encrypted = h[GZPFLG] & GZPISE; } else err(3, "input not a zip or gzip file"); /* if entry encrypted, decrypt and validate encryption header */ if (encrypted) #if CRYPT { ush i, e; if (p == (char *)NULL) { if ((p = (char *)malloc(IZ_PWLEN+1)) == (char *)NULL) err(1, "out of memory"); else if ((p = getp("Enter password: ", p, IZ_PWLEN+1)) == (char *)NULL) err(1, "no tty to prompt for password"); } /* initialize crc_32_tab pointer for decryption */ CRC_32_TAB = get_crc_table(); /* prepare the decryption keys for extraction and check the password */ init_keys(p); for (i = 0; i < RAND_HEAD_LEN; i++) e = NEXTBYTE; if (e != (ush)(h[LOCFLG] & EXTFLG ? h[LOCTIM + 1] : h[LOCCRC + 3])) err(3, "incorrect password for first entry"); } #else /* !CRYPT */ err(3, "cannot decrypt entry (need to recompile with full crypt.c)"); #endif /* ?CRYPT */ /* prepare output buffer and crc */ G.outptr = slide; G.outcnt = 0L; outsiz = 0L; G.crc32val = CRCVAL_INITIAL; /* decompress */ if (g || h[LOCHOW]) { /* deflated entry */ int r; #ifdef USE_ZLIB /* need to allocate and prepare input buffer */ if ((G.inbuf = (uch *)malloc(INBUFSIZ)) == (uch *)NULL) err(1, "out of memory"); #endif /* USE_ZLIB */ if ((r = UZinflate(__G__ (method == ENHDEFLATED))) != 0) { if (r == 3) err(1, "out of memory"); else err(4, "invalid compressed data--format violated"); } inflate_free(__G); } else { /* stored entry */ register ulg n; n = LG(h + LOCLEN); #if CRYPT if (n != LG(h + LOCSIZ) - (encrypted ? RAND_HEAD_LEN : 0)) { #else if (n != LG(h + LOCSIZ)) { #endif Info(slide, 1, ((char *)slide, "len %ld, siz %ld\n", n, LG(h + LOCSIZ))); e$rr(4, "invalid compressed data--length mismatch"); } while (n--) { ush c = getc(G.in); #if CRYPT if (encrypted) zdecode(c); #endif *G.outptr++ = (uch)c; #if (defined(USE_DEFLATE64) && defined(__16BIT__)) if (++G.outcnt == (WSIZE>>1)) /* do FlushOutput() */ #else if (++G.outcnt == WSIZE) /* do FlushOutput() */ #endif { G.crc32val = crc32(G.crc32val, slide, (extent)G.outcnt); if (fwrite((char *)slide, 1,(extent)G.outcnt,out) != (extent%)G.outcnt && !PIPE_ERROR) err(9, "out of space on stdout"); outsiz += G.outcnt; G.outptr = slide; G.outcnt = 0L; } } } if (G.outcnt) /* flush one last time; no need to reset G.outptr/outcnt */ { G.crc32val = crc32(G.crc32val, slide, (extent)G.outcnt); if (fwrite((char *)slide, 1,(extent)G.outcnt,out) != (extent)G.outcnt && !PIPE_ERROR) err(9, "out of space on stdout"); outsiz += G.outcnt; } fflush(out); /* if extended header, get it */ if (g) { if (fread((char *)h + LOCCRC, 1, 8, G.in) != 8) err(3, "gzip file ended prematurely"); } else if ((h[LOCFLG] & EXTFLG) && fread((char *)h + LOCCRC - 4, 1, EXTHDR, G.in) != EXTHDR) err(3, "zipfile ended prematurely"); /* validate decompression */ if (LG(h + LOCCRC) != G.crc32val) err(4, "invalid compressed data--crc error"); if (LG((g ? (h + LOCSIZ) : (h + LOCLEN))) != outsiz) err(4, "invalid compressed data--length error"); /* check if there are more entries */ if (!g && fread((char *)h, 1, 4, G.in) == 4 && LG(h) == LOCSIG) Info(slide, 1, ((char *)slide, "funzip warning: zipfile has more than one entry--rest ignored\n")); DESTROYGLOBALS(); RETURN (0); } *[UNZIP60]FUNZIP.TXT;1+, ./ 4@->0@123KPWO 56줨7줨89GHJ FUNZIP(1L) FUNZIP(1L) NAME funzip - filter for extracting from a ZIP archive in a pipe SYNOPSIS funzip [-password] [input[.zip|.gz]] ARGUMENTS [-password] Optional password to be used if ZIP archive is encrypted. Decryption may not be supported at some sites. See DESCRIPTION for more details. [input[.zip|.gz]] Optional input archive file specification. See DESCRIPTION for details. DESCRIPTION funzip without a file argument acts as a filter; that is, it assumes that a ZIP archive (or a gzip'd(1) file) is being piped into standard input, and it extracts the first member from the archive to stdout. When stdin comes from a tty device, funzip assumes that this cannot be a stream of (binary) compressed data and shows a short help text, instead. If there is a file argument, then input is read from the specified file instead of from stdin. A password for encrypted zip files can be specified on the command line (preceding the file name, if any) by prefixing the password with a dash. Note that this constitutes a security risk on many systems; cur- rently running processes are often visible via simple commands (e.g., ps(1) under Unix), and command-line histories can be read. If the first entry of the zip file is encrypted and no password is specified on the command line, then the user is prompted for a password and the password is not echoed on the console. Given the limitation on single-member extraction, funzip is most useful in conjunction with a secondary archiver program such as tar(1). The following section includes an example illustrating this usage in the case of disk backups to tape. EXAMPLES To use funzip to extract the first member file of the archive test.zip and to pipe it into more(1): funzip test.zip | more To use funzip to test the first member file of test.zip (any errors will be reported on standard error): funzip test.zip > /dev/null To use zip and funzip in place of compress(1) and zcat(1) (or gzip(1L) and gzcat(1L)) for tape backups: tar cf - . | zip -7 | dd of=/dev/nrst0 obs=8k dd if=/dev/nrst0 ibs=8k | funzip | tar xf - (where, for example, nrst0 is a SCSI tape drive). BUGS When piping an encrypted file into more and allowing funzip to prompt for password, the terminal may sometimes be reset to a non-echo mode. This is apparently due to a race condition between the two programs; funzip changes the terminal mode to non-echo before more reads its state, and more then ``restores'' the terminal to this mode before exiting. To recover, run funzip on the same file but redirect to /dev/null5 UNZIP.BCK >[UNZIP60]FUNZIP.TXT;1 rather than piping into more; after prompting again for the password, funzip will reset the terminal properly. There is presently no way to extract any member but the first from a ZIP archive. This would be useful in the case where a ZIP archive is included within another archive. In the case where the first member is a directory, funzip simply creates the directory and exits. The functionality of funzip should be incorporated into unzip itself (future release). SEE ALSO gzip(1L), unzip(1L), unzipsfx(1L), zip(1L), zipcloak(1L), zipinfo(1L), zipnote(1L), zipsplit(1L) URL The Info-ZIP home page is currently at http://www.info-zip.org/pub/infozip/ or ftp://ftp.info-zip.org/pub/infozip/ . AUTHOR Mark Adler (Info-ZIP) Info-ZIP 20 April 2009 (v3.95) FUNZIP(1L) *[UNZIP60]GBLOFFS.C;1+,./ 4@->0123KPWO56Rp7Rp89GHJ /* Copyright (c) 1990-2002 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* Write out a fragment of assembly or C preprocessor source giving offsets * in "Uz_Globs" and "struct huft". Used by Amiga and Human68k ports. */ #define UNZIP_INTERNAL #include "unzip.h" #include "crypt.h" #ifndef REENTRANT Uz_Globs G; #endif static int asm_setflag(const char *flagname); static int ccp_setflag(const char *flagname); static int asm_setflag(const char *flagname) { static const char asm_flagdef[] = " IFND %s\n%-15s EQU 1\n ENDC\n"; return printf(asm_flagdef, flagname, flagname); } static int ccp_setflag(const char *flagname) { static const char ccp_flagdef[] = "#ifndef %s\n# define %s\n#endif\n"; return printf(ccp_flagdef, flagname, flagname); } int main(argc, argv) int argc; char **argv; { #ifdef REENTRANT Uz_Globs *pG = NULL; #endif struct huft *t = NULL; static const char asm_offsdef[] = "%-15s EQU %lu\n"; static const char ccp_offsdef[] = "#define %-15s %lu\n"; const char *out_format; int (*set_flag)(const char *flagname); int ccp_select = 0; if (argc > 1 && argv[1] != NULL && !strcmp(argv[1], "-ccp")) ccp_select = 1; if (ccp_select) { out_format = ccp_offsdef; set_flag = ccp_setflag; } else { out_format = asm_offsdef; set_flag = asm_setflag; } printf(out_format, "h_e", (ulg)&t->e - (ulg)t); printf(out_format, "h_b", (ulg)&t->b - (ulg)t); printf(out_format, "h_v_n", (ulg)&t->v.n - (ulg)t); printf(out_format, "h_v_t", (ulg)&t->v.t - (ulg)t); printf(out_format, "SIZEOF_huft", (ulg)sizeof(struct huft)); printf(out_format, "bb", (ulg)&G.bb - (ulg)&G); printf(out_format, "bk", (ulg)&G.bk - (ulg)&G); printf(out_format, "wp", (ulg)&G.wp - (ulg)&G); #ifdef FUNZIP printf(out_format, "in", (ulg)&G.in - (ulg)&G); #else printf(out_format, "incnt", (ulg)&G.incnt - (ulg)&G); printf(out_format, "inptr", (ulg)&G.inptr - (ulg)&G); printf(out_format, "csize", (ulg)&G.csize - (ulg)&G); printf(out_format, "mem_mode", (ulg)&G.mem_mode - (ulg)&G); #endif printf(out_format, "redirslide", (ulg)&redirSlide - (ulg)&G); printf(out_format, "SIZEOF_slide", (ulg)sizeof(redirSlide)); #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) printf(out_format, "_wsize", (ulg)&G._wsize - (ulg)&G); #endif /* DLL && !NO_SLIDE_REDIR */ printf(out_format, "CRYPT", (ulg)CRYPT); #ifdef FUNZIP (*set_flag)("FUNZIP"); #endif #ifdef SFX (*set_flag)("SFX"); #endif #ifdef REENTRANT (*set_flag)("REENTRANT"); #endif #ifdef DLL (*set_flag)("DLL"); # ifdef NO_SLIDE_REDIR (*set_flag)("NO_SLIDE_REDIR"); # endif #endif #ifdef USE_DEFLATE64 (*set_flag)("USE_DEFLATE64"); #endif return 0; } *[UNZIP60]GLOBALS.C;1+,. / 4 [@->0123KPWO56w.-7w.-89GHJ /* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2003-May-08 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- globals.c Routines to allocate and initialize globals, with or without threads. Contents: registerGlobalPointer() deregisterGlobalPointer() getGlobalPointer() globalsCtor() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #ifndef FUNZIP /* initialization of sigs is completed at runtime so unzip(sfx) executable * won't look like a zipfile */ char central_hdr_sig[4] = {0, 0, 0x01, 0x02}; char local_hdr_sig[4] = {0, 0, 0x03, 0x04}; char end_central_sig[4] = {0, 0, 0x05, 0x06}; char end_central64_sig[4] = {0, 0, 0x06, 0x06}; char end_centloc64_sig[4] = {0, 0, 0x06, 0x07}; /* extern char extd_local_sig[4] = {0, 0, 0x07, 0x08}; NOT USED YET */ ZCONST char *fnames[2] = {"*", NULL}; /* default filenames vector */ #endif #ifndef REENTRANT Uz_Globs G; #else /* REENTRANT */ # ifndef USETHREADID Uz_Globs *GG; # else /* USETHREADID */ # define THREADID_ENTRIES 0x40 int lastScan; Uz_Globs *threadPtrTable[THREADID_ENTRIES]; ulg threadIdTable [THREADID_ENTRIES] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* Make sure there are */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* THREADID_ENTRIES 0s */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; static ZCONST char Far TooManyThreads[] = "error: more than %d simultaneous threads.\n\ Some threads are probably not calling DESTROYTHREAD()\n"; static ZCONST char Far EntryNotFound[] = "error: couldn't find global pointer in table.\n\ Maybe somebody accidentally called DESTROYTHREAD() twice.\n"; static ZCONST char Far GlobalPointerMismatch[] = "error: global pointer in table does not match pointer passed as\ parameter\n"; static void registerGlobalPointer OF((__GPRO)); static void registerGlobalPointer(__G) __GDEF { int scan=0; ulg tid = GetThreadId(); while (threadIdTable[scan] && scan < THREADID_ENTRIES) scan++; if (scan == THREADID_ENTRIES) { ZCONST char *tooMany = LoadFarString(TooManyThreads); Info(slide, 0x421, ((char *)slide, tooMany, THREADID_ENTRIES)); free(pG); EXIT(PK_MEM); /* essentially memory error before we've started */ } threadIdTable [scan] = tid; threadPtrTable[scan] = pG; lastScan = scan; } void deregisterGlobalPointer(__G) __GDEF { int scan=0; ulg tid = GetThreadId(); while (threadIdTable[scan] != tid && scan < THREADID_ENTRIES) scan++; /*----Q UNZIP.BCK>[UNZIP60]GLOBALS.C;1 ----------------------------------------------------------------------- There are two things we can do if we can't find the entry: ignore it or scream. The most likely reason for it not to be here is the user calling this routine twice. Since this could cause BIG problems if any globals are accessed after the first call, we'd better scream. ---------------------------------------------------------------------------*/ if (scan == THREADID_ENTRIES || threadPtrTable[scan] != pG) { ZCONST char *noEntry; if (scan == THREADID_ENTRIES) noEntry = LoadFarString(EntryNotFound); else noEntry = LoadFarString(GlobalPointerMismatch); Info(slide, 0x421, ((char *)slide, noEntry)); EXIT(PK_WARN); /* programming error, but after we're all done */ } threadIdTable [scan] = 0; lastScan = scan; free(threadPtrTable[scan]); } Uz_Globs *getGlobalPointer() { int scan=0; ulg tid = GetThreadId(); while (threadIdTable[scan] != tid && scan < THREADID_ENTRIES) scan++; /*--------------------------------------------------------------------------- There are two things we can do if we can't find the entry: ignore it or scream. The most likely reason for it not to be here is the user calling this routine twice. Since this could cause BIG problems if any globals are accessed after the first call, we'd better scream. ---------------------------------------------------------------------------*/ if (scan == THREADID_ENTRIES) { ZCONST char *noEntry = LoadFarString(EntryNotFound); fprintf(stderr, noEntry); /* can't use Info w/o a global pointer */ EXIT(PK_ERR); /* programming error while still working */ } return threadPtrTable[scan]; } # endif /* ?USETHREADID */ #endif /* ?REENTRANT */ Uz_Globs *globalsCtor() { #ifdef REENTRANT Uz_Globs *pG = (Uz_Globs *)malloc(sizeof(Uz_Globs)); if (!pG) return (Uz_Globs *)NULL; #endif /* REENTRANT */ /* for REENTRANT version, G is defined as (*pG) */ memzero(&G, sizeof(Uz_Globs)); #ifndef FUNZIP #ifdef CMS_MVS uO.aflag=1; uO.C_flag=1; #endif #ifdef TANDEM uO.aflag=1; /* default to '-a' auto create Text Files as type 101 */ #endif #ifdef VMS # if (!defined(NO_TIMESTAMPS)) uO.D_flag=1; /* default to '-D', no restoration of dir timestamps */ # endif #endif uO.lflag=(-1); G.wildzipfn = ""; G.pfnames = (char **)fnames; G.pxnames = (char **)&fnames[1]; G.pInfo = G.info; G.sol = TRUE; /* at start of line */ G.message = UzpMessagePrnt; G.input = UzpInput; /* not used by anyone at the moment... */ #if defined(WINDLL) || defined(MACOS) G.mpause = NULL; /* has scrollbars: no need for pausing */ #else G.mpause = UzpMorePause; #endif G.decr_passwd = UzpPassword; #endif /* !FUNZIP */ #if (!defined(DOS_FLX_H68_NLM_OS2_W32) && !defined(AMIGA) && !defined(RISCOS)) #if (!defined(MACOS) && !defined(ATARI) && !defined(VMS)) G.echofd = -1; #endif /* !(MACOS || ATARI || VMS) */ #endif /* !(DOS_FLX_H68_NLM_OS2_W32 || AMIGA || RISCOS) */ #ifdef SYSTEM_SPECIFIC_CTOR SYSTEM_SPECIFIC_CTOR(__G); #endif #ifdef REENTRANT #ifdef USETHREADID registerGlobalPointer(__G); #else GG = &G; #endif /* ?USETHREADID */ #endif /* REENTRANT */ return &G; } *[UNZIP60]GLOBALS.H;1+,."/ 4""9@->0123KPWO#56Px7Px89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- globals.h There is usually no need to include this file since unzip.h includes it. This header file is used by all of the UnZip source files. It contains a struct definition that is used to "house" all of the global variables. This is done to allow for multithreaded environments (OS/2, NT, Win95, Unix) to call UnZip through an API without a semaphore. REENTRANT should be defined for all platforms that require this. GLOBAL CONSTRUCTOR AND DESTRUCTOR (API WRITERS READ THIS!!!) ------------------------------------------------------------ No, it's not C++, but it's as close as we can get with K&R. The main() of each process that uses these globals must include the CONSTRUCTGLOBALS; statement. This will malloc enough memory for the structure and initialize any variables that require it. This must also be done by any API function that jumps into the middle of the code. The DESTROYGLOBALS(); statement should be inserted before EVERY "EXIT(n)". Naturally, it also needs to be put before any API returns as well. In fact, it's much more important in API functions since the process will NOT end, and therefore the memory WON'T automatically be freed by the operating system. USING VARIABLES FROM THE STRUCTURE ---------------------------------- All global variables must now be prefixed with `G.' which is either a global struct (in which case it should be the only global variable) or a macro for the value of a local pointer variable that is passed from function to function. Yes, this is a pain. But it's the only way to allow full reentrancy. ADDING VARIABLES TO THE STRUCTURE --------------------------------- If you make the inclusion of any variables conditional, be sure to only check macros that are GUARANTEED to be included in every module. For instance, newzip and pwdarg are needed only if CRYPT is TRUE, but this is defined after unzip.h has been read. If you are not careful, some modules will expect your variable to be part of this struct while others won't. This will cause BIG problems. (Inexplicable crashes at strange times, car fires, etc.) When in doubt, always include it! Note also that UnZipSFX needs a few variables that UnZip doesn't. However, it also includes some object files from UnZip. If we were to conditionally include the extra variables that UnZipSFX needs, the object files from UnZip would not mesh with the UnZipSFX object files. Result: we just include the UnZipSFX variables every time. (It's only an extra 4 bytes so who cares!) ADDING FUNCTIONS ---------------- To support this new global struct, all functions must now conditionally pass the globals pointer (pG) to each other. This is supported by 5 macros: __GPRO, __GPRO__, __G, __G__ and __GDEF. A function that needs no other parameters would look like this: int extract_or_test_files(__G) __GDEF { ... stuff ... } A function with other parameters would look like: int memextract(__G__ tgt, tgtsize, src, srcsize) __GDEF uch *tgt, *src; ulg tgtsize, srcsize; { j} UNZIP.BCK>[UNZIP60]GLOBALS.H;1"C ... stuff ... } In the Function Prototypes section of unzpriv.h, you should use __GPRO and __GPRO__ instead: int uz_opts OF((__GPRO__ int *pargc, char ***pargv)); int process_zipfiles OF((__GPRO)); Note that there is NO comma after __G__ or __GPRO__ and no semi-colon after __GDEF. I wish there was another way but I don't think there is. TESTING THE CODE ----------------- Whether your platform requires reentrancy or not, you should always try building with REENTRANT defined if any functions have been added. It is pretty easy to forget a __G__ or a __GDEF and this mistake will only show up if REENTRANT is defined. All platforms should run with REENTRANT defined. Platforms that can't take advantage of it will just be paying a performance penalty needlessly. SIGNAL MADNESS -------------- This whole pointer passing scheme falls apart when it comes to SIGNALs. I handle this situation 2 ways right now. If you define USETHREADID, UnZip will include a 64-entry table. Each entry can hold a global pointer and thread ID for one thread. This should allow up to 64 threads to access UnZip simultaneously. Calling DESTROYGLOBALS() will free the global struct and zero the table entry. If somebody forgets to call DESTROYGLOBALS(), this table will eventually fill up and UnZip will exit with an error message. A good way to test your code to make sure you didn't forget a DESTROYGLOBALS() is to change THREADID_ENTRIES to 3 or 4 in globals.c, making the table real small. Then make a small test program that calls your API a dozen times. Those platforms that don't have threads still need to be able to compile with REENTRANT defined to test and see if new code is correctly written to work either way. For these platforms, I simply keep a global pointer called GG that points to the Globals structure. Good enough for testing. I believe that NT has thread level storage. This could probably be used to store a global pointer for the sake of the signal handler more cleanly than my table approach. ---------------------------------------------------------------------------*/ #ifndef __globals_h #define __globals_h #ifdef USE_ZLIB # include "zlib.h" # ifdef zlib_version /* This name is used internally in unzip */ # undef zlib_version /* and must not be defined as a macro. */ # endif #endif #ifdef USE_BZIP2 # include "bzlib.h" #endif /*************/ /* Globals */ /*************/ typedef struct Globals { #ifdef DLL zvoid *callerglobs; /* pointer to structure of pass-through global vars */ #endif /* command options of general use */ UzpOpts UzO; /* command options of general use */ #ifndef FUNZIP /* command options specific to the high level command line interface */ #ifdef MORE int M_flag; /* -M: built-in "more" function */ #endif /* internal flags and general globals */ #ifdef MORE int height; /* check for SIGWINCH, etc., eventually... */ int lines; /* count of lines displayed on current screen */ # if (defined(SCREENWIDTH) && defined(SCREENLWRAP)) int width; int chars; /* count of screen characters in current line */ # endif #endif /* MORE */ #if (defined(IZ_CHECK_TZ) && defined(USE_EF_UT_TIME)) int tz_is_valid; /* indicates that timezone info can be used */ #endif int noargs; /* did true command line have *any* arguments? */ unsigned filespecs; /* number of real file specifications to be matched */ unsigned xfilespecs; /* number of excluded filespecs to be matched */ int process_all_files; int overwrite_mode; /* 0 - query, 1 - always, 2 - never */ int create_dirs; /* used by main(), mapname(), checkdir() */ int extract_flag; int newzip; /* reset in extract.c; used in crypt.c */ zoff_t real_ecrec_offset; zoff_t expect_ecrec_offset; zoff_t csize; /* used by decompr. (NEXTBYTE): must be signed */ zoff_t used_csize; /* used by extract_or_test_member(), explode() */ #ifdef DLL int fValidate; /* true if only validating an archive */ int filenotfound; int redirect_data; /* redirect data to memory buffer */ int redirect_text; /* redirect text output to buffer */ # ifndef NO_SLIDE_REDIR int redirect_slide; /* redirect decompression area to mem buffer */ # if (defined(USE_DEFLATE64) && defined(INT_16BIT)) ulg _wsize; /* size of sliding window exceeds "unsigned" range */ # else unsigned _wsize; /* sliding window size can be hold in unsigned */ # endif # endif ulg redirect_size; /* size of redirected output buffer */ uch *redirect_buffer; /* pointer to head of allocated buffer */ uch *redirect_pointer; /* pointer past end of written data */ # ifndef NO_SLIDE_REDIR uch *redirect_sldptr; /* head of decompression slide buffer */ # endif # ifdef OS2DLL cbList(processExternally); /* call-back list */ # endif #endif /* DLL */ char **pfnames; char **pxnames; char sig[4]; char answerbuf[10]; min_info info[DIR_BLKSIZ]; min_info *pInfo; #endif /* !FUNZIP */ union work area; /* see unzpriv.h for definition of work */ #if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB)) ZCONST ulg near *crc_32_tab; #else ZCONST ulg Far *crc_32_tab; #endif ulg crc32val; /* CRC shift reg. (was static in funzip) */ #ifdef FUNZIP FILE *in; /* file descriptor of compressed stream */ #endif uch *inbuf; /* input buffer (any size is OK) */ uch *inptr; /* pointer into input buffer */ int incnt; #ifndef FUNZIP ulg bitbuf; int bits_left; /* unreduce and unshrink only */ int zipeof; char *argv0; /* used for NT and EXE_EXTENSION */ char *wildzipfn; char *zipfn; /* GRR: WINDLL: must nuke any malloc'd zipfn... */ #ifdef USE_STRM_INPUT FILE *zipfd; /* zipfile file descriptor */ #else int zipfd; /* zipfile file handle */ #endif zoff_t ziplen; zoff_t cur_zipfile_bufstart; /* extract_or_test, readbuf, ReadByte */ zoff_t extra_bytes; /* used in unzip.c, misc.c */ uch *extra_field; /* Unix, VMS, Mac, OS/2, Acorn, ... */ uch *hold; local_file_hdr lrec; /* used in unzip.c, extract.c */ cdir_file_hdr crec; /* used in unzip.c, extract.c, misc.c */ ecdir_rec ecrec; /* used in unzip.c, extract.c */ z_stat statbuf; /* used by main, mapname, check_for_newer */ int mem_mode; uch *outbufptr; /* extract.c static */ ulg outsize; /* extract.c static */ int reported_backslash; /* extract.c static */ int disk_full; int newfile; int didCRlast; /* fileio static */ ulg numlines; /* fileio static: number of lines printed */ int sol; /* fileio static: at start of line */ int no_ecrec; /* process static */ #ifdef SYMLINKS int symlnk; slinkentry *slink_head; /* pointer to head of symlinks list */ slinkentry *slink_last; /* pointer to last entry in symlinks list */ #endif #ifdef NOVELL_BUG_FAILSAFE int dne; /* true if stat() says file doesn't r;< UNZIP.BCK>[UNZIP60]GLOBALS.H;1"exist */ #endif FILE *outfile; uch *outbuf; uch *realbuf; #ifndef VMS /* if SMALL_MEM, outbuf2 is initialized in */ uch *outbuf2; /* process_zipfiles() (never changes); */ #endif /* else malloc'd ONLY if unshrink and -a */ #endif /* !FUNZIP */ uch *outptr; ulg outcnt; /* number of chars stored in outbuf */ #ifndef FUNZIP char filename[FILNAMSIZ]; /* also used by NT for temporary SFX path */ #ifdef UNICODE_SUPPORT char *filename_full; /* the full path so Unicode checks work */ extent fnfull_bufsize; /* size of allocated filename buffer */ int unicode_escape_all; int unicode_mismatch; #ifdef UTF8_MAYBE_NATIVE int native_is_utf8; /* bool, TRUE => native charset == UTF-8 */ #endif int unipath_version; /* version of Unicode field */ ulg unipath_checksum; /* Unicode field checksum */ char *unipath_filename; /* UTF-8 path */ #endif /* UNICODE_SUPPORT */ #ifdef CMS_MVS char *tempfn; /* temp file used; erase on close */ #endif char *key; /* crypt static: decryption password or NULL */ int nopwd; /* crypt static */ #endif /* !FUNZIP */ z_uint4 keys[3]; /* crypt static: keys defining pseudo-random sequence */ #if (!defined(DOS_FLX_H68_NLM_OS2_W32) && !defined(AMIGA) && !defined(RISCOS)) #if (!defined(MACOS) && !defined(ATARI) && !defined(VMS)) int echofd; /* ttyio static: file descriptor whose echo is off */ #endif /* !(MACOS || ATARI || VMS) */ #endif /* !(DOS_FLX_H68_NLM_OS2_W32 || AMIGA || RISCOS) */ unsigned hufts; /* track memory usage */ #ifdef USE_ZLIB int inflInit; /* inflate static: zlib inflate() initialized */ z_stream dstrm; /* inflate global: decompression stream */ #else struct huft *fixed_tl; /* inflate static */ struct huft *fixed_td; /* inflate static */ unsigned fixed_bl, fixed_bd; /* inflate static */ #ifdef USE_DEFLATE64 struct huft *fixed_tl64; /* inflate static */ struct huft *fixed_td64; /* inflate static */ unsigned fixed_bl64, fixed_bd64; /* inflate static */ struct huft *fixed_tl32; /* inflate static */ struct huft *fixed_td32; /* inflate static */ unsigned fixed_bl32, fixed_bd32; /* inflate static */ ZCONST ush *cplens; /* inflate static */ ZCONST uch *cplext; /* inflate static */ ZCONST uch *cpdext; /* inflate static */ #endif unsigned wp; /* inflate static: current position in slide */ ulg bb; /* inflate static: bit buffer */ unsigned bk; /* inflate static: bits count in bit buffer */ #endif /* ?USE_ZLIB */ #ifndef FUNZIP /* cylindric buffer space for formatting zoff_t values (fileio static) */ char fzofft_buf[FZOFFT_NUM][FZOFFT_LEN]; int fzofft_index; #ifdef SMALL_MEM char rgchBigBuffer[512]; char rgchSmallBuffer[96]; char rgchSmallBuffer2[160]; /* boosted to 160 for local3[] in unzip.c */ #endif MsgFn *message; InputFn *input; PauseFn *mpause; PasswdFn *decr_passwd; StatCBFn *statreportcb; #ifdef WINDLL LPUSERFUNCTIONS lpUserFunctions; #endif int incnt_leftover; /* so improved NEXTBYTE does not waste input */ uch *inptr_leftover; #ifdef VMS_TEXT_CONV unsigned VMS_line_length; /* so native VMS variable-length text files */ int VMS_line_state; /* are readable on other platforms */ int VMS_line_pad; #endif #if (defined(SFX) && defined(CHEAP_SFX_AUTORUN)) char autorun_command[FILNAMSIZ]; #endif #endif /* !FUNZIP */ #ifdef SYSTEM_SPECIFIC_GLOBALS SYSTEM_SPECIFIC_GLOBALS #endif } Uz_Globs; /* end of struct Globals */ /***************************************************************************/ #define CRC_32_TAB G.crc_32_tab Uz_Globs *globalsCtor OF((void)); /* pseudo constant sigs; they are initialized at runtime so unzip executable * won't look like a zipfile */ extern char local_hdr_sig[4]; extern char central_hdr_sig[4]; extern char end_central_sig[4]; extern char end_central32_sig[4]; extern char end_central64_sig[4]; extern char end_centloc64_sig[4]; /* extern char extd_local_sig[4]; NOT USED YET */ #ifdef REENTRANT # define G (*(Uz_Globs *)pG) # define __G pG # define __G__ pG, # define __GPRO Uz_Globs *pG # define __GPRO__ Uz_Globs *pG, # define __GDEF Uz_Globs *pG; # ifdef USETHREADID extern int lastScan; void deregisterGlobalPointer OF((__GPRO)); Uz_Globs *getGlobalPointer OF((void)); # define GETGLOBALS() Uz_Globs *pG = getGlobalPointer() # define DESTROYGLOBALS() do {free_G_buffers(pG); \ deregisterGlobalPointer(pG);} while (0) # else ext!ern Uz_Globs *GG; # define GETGLOBALS() Uz_Globs *pG = GG # define DESTROYGLOBALS() do {free_G_buffers(pG); free(pG);} while (0) # endif /* ?USETHREADID */ # define CONSTRUCTGLOBALS() Uz_Globs *pG = globalsCtor() #else /* !REENTRANT */ extern Uz_Globs G; # define __G # define __G__ # define __GPRO void # define __GPRO__ # define __GDEF # define GETGLOBALS() # define CONSTRUCTGLOBALS() globalsCtor() # define DESTROYGLOBALS() #endif /* ?REENTRANT */ #define uO G.UzO #endif /* __globals_h */ *[UNZIP60]HISTORY.600;1+, ./ 4/@->0123KPWO56vv䤨7vv䤨89GHJUnZip, version 6.00, 20 April 2009 Features added (or removed): 6.00a (): - Many changes by Myles 6.00b (12 Nov 04): - Added dll changes from Mike White. [Mike White (MW), Ed Gordon (EG)] - Added Unix Large File Support but must be enabled manually. [EG] - Humble beginnings of adding configure script to Unix port to autoconfigure large file support. [EG] - VMS changes, including large file support, better handling of -V and new -VV options, revised build procedures, and documentation updates. [Steven Schweda (SMS)] - file_size added to process.c to handle files sizes larger than 2 GiB more cleanly when no large file support. [SMS] - Large file debugging on Unix and VMS. [SMS, EG] - Split w32i64.h with large file includes for dll [EG] 6.00c (1 Feb 05): - Various Amiga and Win32 changes (see files). [Paul Kienitz (PK)] - Add NOSHARE compile option for VMS. [SMS] - Updates to windll (list.c, structs.h, uzexampl.c, uzexampl.h, windll.aps, windll.c, windll.h, windll.rc, windl˖ UNZIP.BCK >[UNZIP60]HISTORY.600;1Yl.txt, sfxwiz.c) to add VB support for Zip64 to dll [MW] 6.00c (14 Feb 05): - Added ODS5 extended file name support for VMS. (Eight-bit-only, no Unicode.) Zip name character "?" is mapped to VMS name character "/". ODS2 file names are now explicitly upper-case. [SMC] - New VMS option, -2 (/ODS2), forces ODS2-compatible file names even when the destination file system is ODS5. [SMC] - New VMS option, -Y (/DOT_VERSION), causes archived file name endings of ".nnn" (where "nnn" is a decimal number) to be treated as if they were VMS version numbers (";nnn"). Example: "a.b.3" -> "a.b;3". [SMC] 6.00c8 (08 May 05): - Added optional BZIP2 support, using the free BZIP2 library. Enabled by defining the compile time option USE_BZIP2. [Johnny Lee] - Revised optional ZLIB support to use the new zlib 1.2.x callback interface when available (significant performance gain, now faster than UnZip's built-in decompression code) [Christian Spieler] - Added interface into zlib's unsupported "inflate9" callback code (a contri- buted extension in zlib 1.2.x), for extracting Deflate64 entries. Enabled by defining the compile time option HAVE_ZL_INFLAT64. [Christian Spieler] - windll: added separate entry point Wiz_SingleEntryUnzipList for VB support, changed Wiz_SingleEntryUnzip back to 5.x version [Christian Spieler] 6.00c9 (15 May 05): - NO feature changes. 6.00c10 (21 May 05): - WinCE port: Adapted PocketUnzip to UnZip6 code and enabled Zip64 support for the WIN32 (non-WinCE) targets. [Chr. Spieler] 6.00c11 (23 May 05): - NO feature changes. 6.00c12 (15 Aug 05): - windll/csharp: new example project for .NET framework 1.1, written in C#. (currently unsupported by the Info-ZIP group) [Adrian Maull] - MSDOS port: added warning message when used in an (32/64-bit) Windows virtual MSDOS process; currently only shown when an error or warning occured. [Johnny Lee, Chr. Spieler] 6.00c13 (02 Oct 05), 6.00c14 (15 Nov 05), 6.00c15(17 Nov 05): - NO feature changes. 6.00c (19 Nov 05): - NO feature changes. 6.00d01 (04 Mar 07): - unix/unix.c: when extracting directory entries, keep a SGID attribute inherited from the parent dir (to allow content created in these new directories to inherit the parent's GID), unless the directory entry was created on UNIX, and UnZip was requested to restore UID/GID or SUID/SGID. [Matthew Seitz, Chr. Spieler] - process.c, modified info message handling for timestamping operation mode to be more consistent with message handling of other operations: suppress summary message only when qflag > 1 in process_zipfiles(); added time-stamp success message to do_seekable() in non-quiet mode; moved message strings to Far string constants. [Steven M. Schweda, Chr. Spieler] - process.c - process_zipfiles(): suppress the "cannot find any wildcard match ..." warning message for (qflag >= 3). [Chr. Spieler] - vms/vms.c: added support for delayed restoration of directory attributes [Steven M. Schweda] - vms/vms.c - return_VMS(): implemented official HP-assigned facility code in the calculation of UnZip's (non-success) VMS exit status codes. [Steven M. Schweda] - vms/vms.c, vms/cmdline.c vms/unz_cli.cld, unzip.c, unzip.h: added "-S" option to change output record format into Stream-LF for text files when extracted in "convert text-files" mode. [Steven M. Schweda] - unzpriv.h, extract.c, unix/unix.c, atari/atari.c, atheos/atheos.c, beos/beos.c: added separate pInfo flag to record symlink entries, moved symlink detection code into mapattr(), added VMS to the list of hosts known to support symbolic links. [Steven M. Schweda, Christian Spieler] - VMS: added support to extract "symlink" entries as symbolic links (requires up-to-date version of OpenVMS). [Steven M. Schweda, Chr. Spieler] - unzip.1: added description of new VMS-specific "-S" option. [Chr. Spieler] - unzip_cli.help, unzip_def.rnh: updated exit codes documentation, added new option (-S resp. /TEXT=STMLF). [Steven M. Schweda, Chr. Spieler] - unzip_cli.help, unzip_def.rnh: completed resp. added description of new VMS-specific options (-Y, -2). [Chr. Spieler] - process.c: added preliminary (alpha-state) support for reading of Unicode Path extra field that now sets globals unipath_filename and unipath_escapedfilename (not yet functional). [EG] 6.00d02 (08 Mar 07), 6.00d03 (10 Mar 07), 6.00d04 (11 Mar 07): - NO feature changes. 6.00d05 (31 Mar 07): - win32/vc6: added VC6 project files for compiling UnZip with support for bzip2 decompression. [Chr. Spieler] - INSTALL, unix/Makefile, unix/configure: support compiling of UnZip with integrated bzip2 decompression capability, added check for presence of bzip2 library sources to configure script, updated bzip2-related documentation in INSTALL. [Chr. Spieler] 6.00d06 (02 Dec 07): - VMS: added support for displaying UnZip exit code error messages through the VMS built-in message facility; new vms/UNZIP_MSG.MSG message string source, modified vms/descrip.mms makefile. [Steven M. Schweda] - UNIX: added new "-^" command line option that switches off the control character filter for extracted filenames. [Chr. Spieler] - UNIX: added support for restoring attributes and UID/GID for symbolic links when appropiate OS support is provided. [Chr. Spieler] 6.00d07 (26 Dec 07): - New "-D" option which allows skipping of timestamp restoration for extracted directory entry or for all files ("-DD"). [Chr. Spieler] - windll: added support for new -D (-DD) option to dll interface, updated the documentation. [Chr. Spieler] 6.00d08 (29 Dec 07): - On VMS, the default is now to not restore directory timestamps (consistent with BACKUP); "-D" skips all timestamp restorations, "--D" enables timestamp restoration for all entries. [Chr. Spieler, Steven M. Schweda] 6.00d09 (06 Jan 08): - NO feature changes. 6.00d10 (10 Feb 08): - partial integration of Ed Gordon's UNICODE_SUPPORT code (W9x-ANSI mode only for now) seems to be finished. [Ed Gordon, C. Spieler] - zipinfo.c: added support for "UTF-8 path" extra field display to zi_long(). [Chr. Spieler] 6.00d11 (16 Feb 08): - ATheOS, BeOS, Tandem, Unix: experimental extension of "Ux" extra field to allow restoration of 32-bit UID & GID values (affected generic sources: unzpriv.h and process.c). [Chr. Spieler] 6.00d (17 Feb 08): - NO feature changes. 6.00e01 (21 Feb 08): - NO feature changes. 6.00e02 (08 Mar 08): - ATheOS, BeOS, Tandem, Unix: removed experimental 32-bit extension of "Ux" extra field (affected generic sources: process.c). [Chr. Spieler] 6.00e03 (29 Mar 08): - general (ebcdic.h, process.c, unpriv.h): modified infrastructure to make OEM<-->ISO translation configurable at runtime. [Chr. Spieler] - MSDOS (doscfg.h, msdos.c): OEM<-->ISO configured at runtime, depending on system codepage (enabled for 437, 850, 858; disabled for 932, 936, 949, 950, 874, 1258; currently also disabled for all other OEM codepages because of missing translation tables). [Chr. Spieler] 6.00e04 (27 Apr 08): - NO feature changes. 6.00e05 (09 Sep 08): - unzip.c: added framework for verbose multi-page online help, called by option "-hh". [Ed Gordon] - process.c, unzpriv.h, unix/unix.c: added support for new IZUNIX3 extra field providing 32-bit UID/GID data. [Ed Gordon, Chr. Spieler] - unzip.c - uz_opts(): do not exit immediately after recognizing help screen request; this allows to specify the pager option after the explicit % UNZIP.BCK >[UNZIP60]HISTORY.600;1help request. [Chr. Spieler] 6.00e06 (13 Sep 08): - NO feature changes. 6.00e (04 Jan 09): - unzip.h: enable -B option for Unix, OS/2, and Win32. [EG, Chr. Spieler] 6.00f (11 Jan 09): - NO feature changes. 6.00g01 (08 Jan 09), 6.00g02 (25 Jan 09), 6.00g03 (10 Feb 09), 6.00g04 (16 Feb 09), 6.00g (28 Feb 09), 6.00h01 (09 Mar 09), 6.00h02 (16 Apr 09), 6.00h03 (17 Apr 09), 6.00 (20 Apr 09): - NO feature changes. Bugs fixed: 6.00b (12 Nov 04): - Output bug fixes to account for sizes > 2 GiB and < 4 GiB. [EG] - Bug fixes in ZipInfo. [EG] - Reverted unix.c to an older version to make calls to defer_dir_attribs compatible. Also needed to rework win32.c to make compatible. Probably broke NT but haven't tested. Need to trace out and fix. [EG] 6.00c (1 Feb 05): - Various bug fixes (see files gbloffs.c, process.c, unzpriv.h, amiga/amiga.h, amiga/filedate.c, amiga/flate.a, amiga/makefile.azt, and win32/w32cfg.h). [PK] - Some type changes in globals.h. [SMS] 6.00c (14 Feb 05): - Disambiguated some identical VMS error messages. [SMC] 6.00c8 (08 May 05): - extract.c, unzip.c, unzpriv.h: Some tweaks and corrections to the optional BZIP2 support [Christian Spieler] - VMS, cmdline.c unz_cli.cld: fixed the completely broken addition of the /ODS2 and /DOT_VERSION options [Christian Spieler] - Merged in all additions and fixes of the UnZip 5.5x code tree from UnZip 5.50i up to UnZip 5.52 release. Removed History.5?? files. Removed all History.600 entries that have been covered by fixes from the UnZip 5.5x code. For detailed ChangeLog see History.550, History.551, and History.552, as found in unzip552.zip source distribution and the UnZipHist.zip ChangeLog archive. [Christian Spieler] - crypt.[ch]: updated to 2.10 (synchronized with zip 2.31) [Christian Spieler] - envargs.c: do not declare getenv() for "modern" compilers [Cosmin Truta] - extract.c: better echo message for CR or LF at overwrite prompt [Cosmin?] - fileio.c: added specific message for SIGILL in handler() [Chr. Spieler] - process.c: fixed code of optional USE_STRM_INPUT variant [Chr. Spieler] - VMS, vms.c: requires "-vv" instead of only "-v" to enable VMS diagnostic output (enable DIAG_FLAG for vflag >= 3, only; DIAG output is not available for the unzip modi "extract to disk" and "zipinfo") [Christian Spieler] - VMS cli interface: added (undocumented) option modified /FULL=DIAGNOSTICS to control "-vv" diagnostic messages [Steven M Schweda, Christian Spieler] - WIN32/MSDOS (maybe others): fixed abort exception handling for CTRL-BREAK [Christian Spieler] - revised ecrec64 search logic: ecrec64 need not be present when one of the ecrec fields is filled with all 1's. [Christian Spieler] - added user-defined types for 8-byte and 4-byte Zip archive (unsigned) quantities [Christian Spieler] - MSDOS 32-bit port revitalized [Christian Spieler] - windll: changed interface definition to be independent of compile/feature configuration [Christian Spieler] - man/unzip.1: Typo corrections [anonymous DEBIAN contribution, Santiago Vila] - man/unzip.1: removed duplicated quotes from VMS example in environment variable section [Steven M. Schweda] 6.00c9 (15 May 05): - zipinfo.c, list.c: fix the structure check for correct end-of-central dir to be aware of Zip64 extensions [Christian Spieler] - windll, sfxgui: synchronize function definitions with changed windll interface [Mike White] - extract.c, fileio.c, process.c: fixed USE_STRM_INPUT variant of file position seeking [Christian Spieler] - process.c - file_size(): changed scope into static; added non-USE_STRM_INPUT variant that uses zlseek instead of zfseeko and zftello; do not include in SFX stub; do not compile function definition when not used [Chr. Spieler] - unzpriv.h: revised and cleaned up setup definitions for zstat, zfstat and other 64-bit configuration macros [Christian Spieler] - win32/w32cfg.h: revised automatic ZIP64 support enabling logic and compiler- specific configuration; turned off ZIP64 support for lcc and BorlandC because of missing LARGE_FILE support; verified LARGE_FILE support for Watcom C and MinGW [Chr. Spieler] - win32/win32.c: fixed type specification in zstat_win32() [Chr. Spieler] - win32/win32i64.c: do not include seek replacement functions when not needed [Christian Spieler] - zipinfo.c: adapted verbose printouts to longer number printings of Zip64- enabled UnZip; fixed extra-space detection in zi_long() by moving the extra-field read in front of the offset comparison [Christian Spieler] 6.00c10 (21 May 05): - zipinfo.c - zi_long(): fixed expression for detecting 64-bit local entry offset [Chr. Spieler] - process.c - find_ecrec64(): added type-casts to shut up conversion warnings, removed code that clobbered the ecrec signature "pseudo-constant" by overwriting it with the ecrec64 signature (this bug broke the reentrancy of the dll code) [Chr. Spieler] - win32/win32.c, unzpriv.h: adapted SetFileSize for 64-bit offsets[C. Spieler] - extract.c, fileio.c, process.c: removed unneeded (FILE *) type-casts in calls to zfseeko() and zftello() [Chr. Spieler] - extract.c, list.c, zipinfo.c, unzpriv.h: use symbolic constants for the 16-bit and 64-bit masks in the checks for zip entry count consistency [Steven M. Schweda, Chr. Spieler] - process.c: reorganized the extended Zip filesize-checking code (for > 2GB detection) by moving it behind the open_infile () call and using the already opened global zipfile handle [Steven M. Schweda, Chr. Spieler] - fileio.c: allow output redirection to memory when ZIP64_SUPPORT is enabled [Chr. Spieler] - windll: synchronized uzexampl.c and uzexampl.h with current windll interface declarations [Chr. Spieler] 6.00c11 (23 May 05): - process.c: fixed bugs in last filesize-checking revision (added missing semi-colon, synchronized file_size() call with its prototype declaration [Steven M. Schweda, Chr. Spieler] 6.00c12 (15 Aug 05): - VMS port: updated the dependency build routines (*.mms, *.com) and the VMS install documentation (INSTALL) [Steven M. Schweda] - api.c - redirect_outfile(): initialize check_conversion variable in the non-textmode case [Chr. Spieler] - process.c, extract.c: moved the crctab initialization and check of the extraction root dir from do_seekable() further down the call tree into extract_or_test_files() [Chr. Spieler] - extract.c - extract_or_test_entrylist(): moved central-vs-local consistency checks behind the local Zip64-e.f. code [Chr. Spieler] - fileio.c - do_string() bugfix: do not call getZip64Data() when previous allocation of extra field buffer has failed [Chr. Spieler] - inflate.c - inflate_dynamic(): free table-decoding huft-tree when exiting prematurely from the literal/distance tree data reading because of invalid compressed data [Rudolf Lechleitner, Chr. Spieler] - unzip.c - uz_opts(): local variable "error" should only take boolean values, no PK error codes (cosmetic correction) [Chr. Spieler] - vms/vms.c, process.c: modified handling of VMS do_wild() lookup errors to give more helpful messages to the end user [Steven M. Schweda] - unix/zipgrep: fixed security hole by handling shell metacharacters like '|' and '&' properly when they occurred in input file names [Greg Roelofs] - match.c: copied and adapted optimization for "*fixedstring" patterns from the Zip code into recmatch(); provided two local helper functions isshexp() and namecmp() for this optimizatioT\ UNZIP.BCK >[UNZIP60]HISTORY.600;1*!n [Johnny Lee, Chr. Spieler] - Where: used the newer version from UnZip 5.52 [Chr. Spieler] 6.00c13 (02 Oct 05): - AOS/VS, Atari, AtheOS, BeOS, UNIX: fixed symlink code by avoiding fclose() on NULL handle in extract.c [Dan Yefimov] - AOS/VS, Atari, AtheOS, BeOS, UNIX (and unzpriv.h, fileio.c): modified the symlink code to use the opened outfile handle for re-reading the symlink target data; modified open_outfile to allow read access on outfile handle (security fix against "ToCToU" vulnerability) [Chr. Spieler] - UNIX (unix.c, Makefile, configure): fixed "ToCToU" security vulnerability in close_outfile by using fchown() & fchmod() instead of chown() & chmod() (only when available); added check for function existence to configure [Dan Yefimov, Matthias Scheler, Chr. Spieler] - fileio.c - open_outfile(): deny access for group&world to currently open outfile on all systems that support umask() (AOS/VS, Atari, AtheOS, BeOS, QDOS, Tandem, UNIX) [Chr. Spieler] - unzpriv.h, fileio.c - open_outfile(): open outfile in "write update" mode when supporting symlinks or QLZIP extensions; these features require the ability to reread the opened outfile [Chr. Spieler] - fileio.c: added WriteTxtErr() macro to allow differenciating between text-mode write function calls (in UzpMessagePrnt()) and binary write calls (everywhere else) [Chr. Spieler] - fileio.c, VMS only: use fprintf() instead of (f)write in WriteTxtErr(), to work around RMS record handling problem (e.g. when using PIPE to redirect messages) [Steven M. Schweda] - UNIX port: revised unix/configure and unix/Makefile for better integration of automatic configuration in the build procedure [Chr. Spieler] 6.00c14 (15 Nov 05): - VMS, descrip.mms: repaired CLEAN_ALL target which did not always delete all expected files [Steven M. Schweda] - unzip.c, fixes for online help screen: corrected "-v" description and moved it from modifier section into options section, added description of "-T" option, removed the "DLL && API_DOC"-only description of the "-A extended API help" option [Chr. Spieler, Steven M. Schweda] - man/unzip.1: minor corrections in wording of "-v" option description [Chr. Spieler, Steven M. Schweda] 6.00c15 (17 Nov 05): - vms/vms.c: fixed do_wild() logic error introduced in August 2005, sys$search fails (at least on VAX) when not preceeded by a sys$parse call with "syntax-check-only" flag cleared [Steven M. Schweda] - process.c: cosmetic change in process_zipfiles() to shut-up gcc warning on non-UNIX (non-QDOS) systems [Chr. Spieler] 6.00c (19 Nov 05): - extract.c, bzip2 support: fixed missing ";" error (was only a problem when enabling BZIP2 support without LARGE_FILE support); added some (cosmetic) typecasts to shut up compiler warnings [Steven M. Schweda] - VMS support for BZIP2 decompression: updated make procedures and scripts, added "find_bzip2_dir" helper script and bzlib.h include file wrapper [Steven M. Schweda] 6.00d01 (04 Mar 07): - extract.c: replaced local wsize variable (DLL only) by reference to the "global" variable G._wsize [Chr. Spieler] - unzpriv.h: use fputs() instead of fprintf() as output function in the FUNZIP variant of the Info() macro, to prevent misinterpreting format specifiers in the sprintf() output. [Martin Pitt, ubuntu] - unix/unix.c: added detailed compiler version info for SunPro cc, HP cc, DEC cc. [Steven M. Schweda] - vms/descrip.mms: added support for architecture detection macro symbols built into newer versions of MMK (a MMS clone). [Steven M. Schweda] - fileio.c - is_vms_varlen_txt(): commented out the currently unused code for determining the VMS fileorg setting. [Steven M. Schweda] - extract.c - extract_or_test_files(): the "back at endsig" checking code is not used for the SFX stub. [Steven M. Schweda] - win32: changed all Win32-API calls with string parameters to explicitely use the ANSI variant; this removes the dependency on the UNICODE and _UNICODE compile flags being undefined. [NN, Chr. Spieler] - zipinfo.c: on WIN32, archive filename display must be fed through codepage translation. [Chr. Spieler] - zipinfo.c - zipinfo(): repaired several memory leaks when the listing loop is stopped prematurely because of inner errors. [Chr. Spieler] - crc32.c, crc32.h, crc_i386.S, crc_i386.asm, crc_i386.c: comprehensive revision of crc32 calculation, implementing the optimized algorithms from the zlib source code which depend on specific machine architecture characteristics (removed crctab.c, added crc32.h). [Chr. Spieler] - crypt.c, crypt.h: adapted to the modifications of crc32. [Chr. Spieler] - msdos, win32, vms, unix: enabled optimized crc32 algorithms on i386, VAX, and AXP architectures. [Chr. Spieler] - win32/nt.c: tried to fix mutex handle leak in Initialize(). [Johnny Lee, Chr. Spieler] - vms/vms.c - check_format(): added system error message to sys$open failure message. [Steven M. Schweda] - wince/intrface.cpp - checkdir(): corrected typo ('0' should be '\0') [Shawn Carey] - wince/wcemain.c - WinMain(): correct the removal code for enclosing argument quotes. [Shawn Carey, Chr. Spieler] - os2, win32 - checkdir(): fixed buffer overflow security bug for FAT-style buildpath, optimized code by removing overflow checks inside the copy loops [Johnny Lee, Chr. Spieler] - win32/win32.c - VFatFileTime2utime(): fixed return data generation in error branch for the "input time stamp cannot be converted to local time" case [Steve Youngs] - added new compression methods and e.f. IDs from PKWARE Appnote 6.3.0 as of 2006-09-29 [Chr. Spieler] - extract.c - extract_or_test_files(): remove dead branch in the code section handling archive test summary messages. [Chr. Spieler] - fileio.c - zstrnicmp(): added (uch) typecasts to comparison, to improve "compatibility" with "extended ASCII characters". [Chr. Spieler] - vms: use CRTL-supplied function strncasecmp() for STRNICMP() when available. [Steven M. Schweda, Chr. Spieler] - vms/vms.c, vms/vms.h: for better synchronisation with upcoming UnZip 6 code, the macros for masking the "ODS2 vs. ODS5" support differences have been cleanded up and ported back to the 5.5x VMS code. [Chr. Spieler] - ubz2err.c: new source file to isolate the bzip2 "fatal error" callback routine in its own module; this allows easy replacement of this routine when the UnZip package is used as a static library (e.g. for WiZ with bzip2 support). [Chr. Spieler] - general: added new ubz2err.c module to the make procedures of ports that (might) support bzip2. [Chr. Spieler] - crypt.c: optimized crypt-keys handling for Big-Endian systems using the optimized CRC32 code by introducing a local copy of the crc32 table containing byte-swapped values. [Chr. Spieler] - extract.c, unzpriv.h: modified calling interface of find_compr_idx() to use unsigned instead of ush. [Steven M. Schweda, Chr. Spieler] - vms/vms.c: added missing include of crc/32.h header, added missing fab, nam variable declarations to checkdir(). [Steven M. Schweda] - vms/make_unz.com, vms/link_unz.com: avoid link problems with sticky dev:[dir] spec from externally supplied bzip2 lib. [Steven M. Schweda] - vms/vms.[ch]: changed "ODS2 vs. ODS5" masking macros back to pre-5.53d style. [Steven M. Schweda] - vms: updated/corrected build procedures to handle modified bzip2 support. [Steven M. Schweda] - typo correction "explicitly" in various files. [Steven M.G8 UNZIP.BCK >[UNZIP60]HISTORY.600;1?0 Schweda] - cosmetic documentation change: use the "bzip" name all-lowercase when applied to the "library". [Steven M. Schweda, Chr. Spieler] - vms/vms.c - return_VMS(): corrected mapping of PK_WARN to VMS status code severity level "Warning" (fixed regression bug introduced in UnZip 5.32). [Steven M. Schweda] - process.c: preliminary fixed Zip64 support to match 4.5 AppNote, removing the 76 byte error [EG] 6.00d02 (08 Mar 07): - extract.c: corrected typo (missing ";") in SYMLINKS code. [Steven M.Schweda] - VMS: updated MMS/MMK scripts (adapt for case-sensitive ODS5 and changed/new source/header files). [Steven M. Schweda] - vms/vms.c: provide RMS resp. QIO re-read functionality for SYMLINKS support. [Steven M. Schweda] - vms/vms.c: revised SYMLINKS support (no special symlinks handling in -c, -p piping output mode, fixed buffer overflow security holes, moved symlink post-processing from close_outfile into the mode-specific subroutines, for "-V archived" entries t2he symlink target spec is only read back when needed for informational display purpose). [Christian Spieler] 6.00d03 (10 Mar 07): - vms/vms.c: modified style of static function declarations into "independent" lines (on request of Steven M. Schweda). [Chr. Spieler] - vms/vms.c: checked compilation, removed typos and wrong-named variables [Chr. Spieler] 6.00d04 (11 Mar 07): - vms/vms.c: used "better self-documenting" names for qio status structures, corrected/enhanced some error message3s (unified formatting, specified "location" in code). [Steven M. Schweda] - unix/Makefile: added some (preliminary) support for compiling with optional bzip2 decompression capability (mostly copied from msdos/Makefile.dj2, is not yet tested). [Chr. Spieler] - process.c: added additional consistency checks to find_ecrec64(). - extract.c, list.c, zipinfo.c: reviewed the "central dir processing complete" check to take into account the new status semantics from find_ecrec64(). [Chr. Spi4eler] 6.00d05 (31 Mar 07): - Win32 port: added VC6 project files for "minimal" bz2lib and unzip with bzip2 support. [Chr. Spieler] - list.c: added missing "PPMd" entry to array of known compression methods. [Chr. Spieler] - vms/vms.c: close a potential buffer overflow hole in symlinks handling code. [Chr. Spieler] - inflate.c - inflate_dynamic(): fixed erroneous huft_free() calls for unallocated memory when processing invalid data. [Chr. Spieler] - crc32.[ch], crc_i386.S: added updated files that were accidentally missed in update 6.0d01. [Chr. Spieler] - bz2lib renamed to bzip2 at request from Ed Gordon and Steven M. Schweda, updated affected makefiles (MS-DOS, Unix, Win32). [Chr. Spieler] - renamed "Novell" port to "Netware" for clarity. [Chr. Spieler] - win32.c - close_outfile(): on WinNT, truncate outfile to actual bytes written before close; otherwise, preallocated disk space does not get freed when extraction failed or was interrupted. [Chr. Spieler] - process.c: corrected bugs in ecloc64 and ecrec64 recognition code. [Ed Gordon] - process.c: some cleanup in debugging code (changed TTrace() to Trace() in non-timestamp-related code portions. [Chr. Spieler] - unzip.h: updated license text to last version of License. [Chr. Spieler] 6.00d06 (02 Dec 07): - bzip2/makbz2iz.msc, bzip2/makbz2iz.wat: hide individual commands of the `clean' target. [Chr. Spieler] - extract.c: corrected "extracted" message for bzipped entries to "bunzipped" [Steven M. Schweda] - unzpriv.h: removed "suspicious" explicit mask from Zip64 version of MASK_ZUCN64 preprocessor constant. [Steven M. Schweda] - extract.c - fnfilter(): added check against internal buffer overflow. [Chr. Spieler] - unzpriv.h, fileio.c, win32/w32cfg.h, wince/wcecfg.h: repaired the MBCS definition for the CLEN() macro; this macro is assumed to return a strictly positive byte count. [Kazuki Matsuda, Chr. Spieler] - unix/zipgrep: return the correct exit code from egrep even in cases where the egrep output is further piped through sed. [Niklas Klein] - vms/vms.c: corrected case of the "__ia64" predefined preprocessor symbol. [Steven M. Schweda] - bzip2/descrbz2.mms: added make Info-ZIP specific VMS make script, as a starting point for integrated bzip2 compilation support in a similar way to other OS (Win32, Unix). (not yet working, requires more work to get completed and debugged...). [Chr. Spieler] - win32/makefile.bc, win32/makefile.gcc, win32/makefile.wat: completed clean target functionality. [Chr. Spieler] - win32, wince: added workaround to keep Visual Studio 2005 C compiler quiet. [N.N.] - unzpriv.h, extract.c, list.c, zipinfo.c: added "WavPack" (supported by WinZip 11+) to list of recognized compression types. [Christian Spieler] - win32/nt.c: prevent calling IsValidAcl() with a NULL Acl pointer, to fix false 'EA security check' failures. [Will Menninger] - renamed proginfo/extra.fld into proginfo/extrafld.txt, to synchronize with Zip3. [Chr. Spieler] - process.c: added second try to find the EOCD64 record, to compensate for (SFX-stub) bytes prepended to the archive without adjustment of the offset records in the Zip file structures. [Will Menninger, Ed Gordon] - fileio.c, process.c: replaced spurious use of Z_OFF_T by zoff_t. [Chr. Spieler] - win32/win32.c - utime2VFatFileTime(): initialize the wMillisecond field of the SYSTEMTIME structure to 0 to ensure deterministic time conversion. [N.N.] - explode.c: corrected type for data stream size variables from zoff_t into zusz_t. [Chr. Spieler] - unix/configure, unix/Makefile: made automatic detection & compilation of bzip2 support working for the 'generic' target. [Chr. Spieler] 6.00d07 (26 Dec 07): - fileio.c: old-style function head for fzofft(). [Steven M. Schweda] - acorn/makefile: updated to support bzip2 decompression (change was missed for 6.00d06). [Chr. Spieler] - unix/configure: added/modified cc optimization checks [Steven M. Schweda] - unix/unix.c: added detailed IBM C version reporting to version(). [Steven M. Schweda] - unix/unxcfg.h: use __hpux instead of __HP_cc to determine UTIMEBUF configuration [Steven M. Schweda] - unzip.h, unzip.c: removed IZ_COMPERR runtime error code. This code was only used in compile-time assertions of development code and did never get into a production environment. [Chr. Spieler] - vms/vms.c, vms/UNZIP_MSG.MSG, vms/unzip_def.rnh, vms/unzip_cli.help: removed IZ_COMPER=R support and documentation; debugging code should not be mentioned in end-user documentation. [Chr. Spieler] - unzpriv.h: use __hpux instead of __HP_cc to determine support of "long long" type for HP (bundled ??) compiler. [Steven M. Schweda] >>> This change may be wrong?? "long long" support is a compiler feature, not a runtime library feature! [Chr. Spieler] <<< - VMS: added message file build to make procedures (missed change from 6.00d06). [Steven M. Schweda] - wince/wcem>ain.c: added missing modifications from unz553d beta (25 Dec 06), see also "wince/wcemain.c" changelog entry for 6.00d01. [Chr. Spieler] - fileio.c - uzmbclen(): corrected return type definition. [Chr. Spieler] - win32/nt.c: added some typecasts in Initialize() to get newer gcc quiet. [Chr. Spieler] - win32/win32.c: added some superfluous variable initializations to prevent gcc compiler warnings. [Chr. Spieler] - bzip2/descrbz2.mms: made MMS description file work (at least on OpenVMS 8.3 T1D UNZIP.BCK >[UNZIP60]HISTORY.600;1? IA64 testdrive account). [Chr. Spieler] - vms/descrip_src.mms: modified bzip2 support so that it works with the library created by bzip2/descrbz2.mms, using the original bzip2 1.0.4 sources. [Chr. Spieler] 6.00d08 (29 Dec 07): - bzip2/descrbz2.mms: modified compile options to create a library which is binary compatible with the results of the SMS-specific deviated bzip2 distribution for VMS. [Chr. Spieler] - bzip2/buildbz2.com: new VMS DCL build script for the bzip2 "BZ_NO_STDIO" library used by the bzip2 support in UnZip. [Chr. Spieler] - vms/descrip.mms, vms/descrip_src.mms: changed back so that the SMS-specific deviated bzip2 source package works again; added/completed support for standalone bzip2-included build using bzip2/descrbz2.mms. [Chr. Spieler] - vms/make_unz.com, vms/link_unz.com: removed these obsolete files, they have been replaced by vms/build_unzip.com. [Chr. Spieler] - vms/build_unzip.com: added support for compiling bzip2-enabled programs in "standalone" source setup, using bzip2/buildbz2.com for creating the bz2 object library. [Chr. Spieler] - updated the UNICODE_SUPPORT code from Ed Gordon's work (6.00d05t, excluding the win32-wide specific code). This code is unfinished, besides other issues there is a memory leak to be fixed. [Ed Gordon, Chr. Spieler] - unzip.c: Added "static" to test_buf definition in the "NEXTBYTE operation test" code block of main function unzip(). [SMS] - unzpriv.h: Added -related stuff from 6.00d05t (SMS), with some corrections. [Steven M. Schweda, Chr. Spieler] 6.00d09 (06 Jan 08): - unzip.c: corrected parser code for "negated -D" option. [Steven M. Schweda] - man/unzip.1: extended explanation of the VMS-specific differences in the "-D" option behaviour for clarity. [Steven M. Schweda] - vms/unzip_cli.cld, vms/cmdline.c: corrections and refinements applied to the CLI parsing code for the new "-D" option. [Steven M. Schweda] - vms/INSTALL.VMS: added/updated build description aspects concerning optional bzip2 support. [Steven M. Schweda] - vms/unzip_cli.help: clarified description of the changed and extended /RESTORE qualifier. [Steven M. Schweda] - vms/vms.c, vms/vms.h, vms/cmdline.c, ttyio.c: Added defines to translate all used system routine names to uppercase, to allow using /NAMES=AS_IS with the broken header files of older DECC distributions. [Steven M. Schweda] 6.00d10 (10 Feb 08): - globals.h, process.c, fileio.c: fix memory leak concerning filename_full handling (UNICODE_SUPPORT code). [Chr. Spieler] - ubz2err.c: renamed formal parameter "errcode" into "bzerrcode" to work around a bug in MS Visual C++ 9.0 (2008). [Chr. Spieler] - VMS: small cleanups to CLI code. [Steven Schweda, Chr. Spieler] - vms/vmscfg.h: added missing cma$tis_errno_get_addr uppercase define for broken compiler distributions. [Steven Schweda, Chr. Spieler] - vms/descrip_mkdeps.com: Added CLEAN and CLEAN_ALL targets. [Steven Schweda] - win32, windll: added MS VC++ 8.0 project files. [Chr. Spieler] - win32/Makefile: removed dependency on ntwin32.mak, for better compatibility with VC++ 8.0 Express Edition. [Chr. Spieler] - api.c: moved include down behind "unzip.h" include to shut up "depreciation" warnings with VC++ 8.0 and newer. [Chr. Spieler] - windll/struct.h: added D_flag support to option structure. [Chr. Spieler] - windll/vb/vbunzip.bas: corrected UZDLLPAss callback function interface, adapted to recent DLL interface changes. [Johnny Lee, Chr. Spieler] - windll: removed "DESCRIPTION" clause from all module definition files; newest VC++ version does no longer tolerate it. [Chr. Spieler] - unzip.h: enable H_flag and U_flag for UNIX, VMS, WIN32 (those systems that are currently supposed to support UTF8 names); unzip.h must not depend on internal configuration settings like UNICODE_SUPPORT. [Chr. Spieler] 6.00d11 (16 Feb 08): - vms/cmdline.c: canceled name-change for local variable 'restore_date' (was incomplete in 6.00d10 and broke compilation). [Chr. Spieler] - unzpriv.h: removed "fixed" allocation of space for the two string delimiters from the definition of type slinkentry. [Steven M. Schweda] - unix/unix.c - set_symlnk_attribs(): modified usage of typecasts to remove some compiler warnings. [Steven M. Schweda] - aosvs, atari, atheos, beos, unix, vms - close_outfile(): Increased the allocation size for the slnk_entry structure by 2 for the two '\0' end-of-string markers. [Chr. Spieler] - unix/Makefile: modified bzip2 lib target to be only applicable to the bzip2 subdir of the UnZip distribution. [Chr. Spieler] - unix/configure: extended bzip2 support check from Zip's configure to better support "externally" supplied bzip2 libraries. [St. Schweda, Chr. Spieler] - vms/descrip_src.mms, bzip2/descrbz2.mms: cleaned up VMS MMS support for integrated build of bzip2-enabled UnZip executables. [Chr. Spieler] - msdos, unix, vms, win32: at request from SMS, changed all occurrences of "DIR_BZ2LIB" symbol in build scripts for the directory of the bzip2 library sources (and often also binaries) into "IZ_BZIP2", for synchronization with Zip. [Chr. Spieler] 6.00d (17 Feb 08): - win32/Makefile: fixed configuration variations of bzip2 support when using non-standard build options regarding rtl linking; added documentation section for the supported build variant flags on the nmake command line. [Chr. Spieler] 6.00e01 (17 Feb 08): - unzpriv.h: re-added "fixed" allocation of space for the first of two string delimiters from the definition of type slinkentry, the "buf[]" structure member is not accepted by some older compilers. [Chr. Spieler] - aosvs, atari, atheos, beos, unix, vms - close_outfile(): Reduced the allocation size for the slnk_entry structure by 1, one of the two '\0' end-of-string markers is again part of the structure. [Chr. Spieler] - unix/configure: export CC and IZ_BZIP2 symbols to flags, to feed their current settings to the child make process without having to use special make command qualifiers. [Steven M. Schweda, Chr. Spieler] 6.00e02 (08 Mar 08): - unix/unix.c - close_outfile(): added missing semicolon in the SYMLINKS code for the non-SET_SYMLINK_ATTRIBS case. [Steven M. Schweda] - unzip.c: removed extra "credit to Myles Bennet" note from startup screen for space considerations; added credit note to README and referenced Myles Bennet in proginfo/CONTRIBS. [Chr. Spieler] - vms/vms.c: fixed dir separator find logic in vms_path_fixdown() for cases where directory name contains a '.' or '[' itself. [Steven M. Schweda] - crc32.h: replaced explicit inclusion of zip.h by a note that this header should be read after zip.h resp. unzip.h. [Steven M. Schweda, C. Spieler] - unix/configure, unix/Makefile: cleaned up auto-configured build procedure. * pass the "configure"-selected C optimizations to the bzip2 build process. * clean only affects the unzip-specific bzip2 subdirectory. * let make display the bzip2 clean subprocess call. [Steven M. Schweda] - unzip.c, unzip.h, zipinfo.c, fileio.c - UNICODE_SUPPORT, revised the options to control UTF-8 handling: * removed the -H option * modified -U option syntax: -U forces to escape all non-ASCII UTF-8 chars, -UU must be used now to entirely disable UTF-8 support. [Chr. Spieler] - windll/windll.{c|txt}: added U_flag to option stucture. [Chr. Spieler] - man/unzip.1, man/zipinfo.1: added description of th  n: 1]b-J$zp #X_3r  UZ~}$U<[~4|D2sT$zc D4VF?BJS_,l.5G m`%es5_ :,BBxVK& B ?C8T(] E6HK~zXF~hK.u1>$@M(ntp nG,2QaFwFxOw>1]r] =x>LvixdOcIgQ '*D8 u^.}pb(WdCPELZ WJXT'mnGLd=617hy>}QYt)sq`8alnbL E K^`6v3d#.!aM~x:$|$!a NiSPj9N :E ^ [ 89 cn^Cx/dpUD l(9:kPW]=K \(2  191=l"6og2/'.0_1-)|B}?i!+8 .IC\}N(^"?XeCI2sA}r Qw{[}T]NXJbVa). %dx\ +K4XIXQH'[ =}HuWT!xRo*w$|bWf]Dsuf@s_5P^HNZ;E)%hbVj(+~I APw q gs( O 5vj8l[!s CBJ#^WF:[;!@,:.x; P`>sqOqkY0j0&%3zmX|H[t.QZKtSTQe];H>2QgF\v6i fs9aex}Y-] S+RXUYE *%1dlGD'w {!zD;B u C0X5"T2 Zf3<3K''AJkEbUQ6*5CNz`=fRh8W?}`jN9Hj"d:?Ewzy,gZ`IG amIz)v:/46pL9a=N R>-RcpiT;TZktz|;J\ri fFoyDp_m9,KC{"6}>JwtBnkeS9D/~m[pJNO[']^Q 'DRya=8q"5~0}C*nn$753Y BJ:b?sq-Q "Du "{vSY yV7dK/MS!XZ ~e^_@{k C'il/P,/'Z~#Q}W{\kH{A-n>MIu*S1 0>r(?XmTe B/; gh.ZC'2v$R=YG6K~ rhnVU\e;i^;sofxlH&6 W'H 2RaG4t wps6a3D95Ra)ad*!:0#p3ha& %? NCu&a`U==Hz8xQD!yb\9IK7lY!!V0K?%ma)NZQ>ii>tV{4g$hKIb\t[v*C )nE^jZAWY7\q WNN/qrP.F1lkn:=S?(W9P-~1d']w15u ZS{;2Efo}-o7K&=?YH\,O,arU ")=$IXK"l Tm ZG9v#o7xxaB7e4o:CRXXG.5[/j9w.NBik7O*>x* aJD&-;Ym6 2 y"76:'1+nkC_vGW3eG( 4.,KtB  k,fe!&$+9{C mU]lGzi2E}OCQnY%7C Fx1+H #!}MhdR|D }~V:A:nAQ4HsO&]x;5JCw>xr9~XM 7q>V$~tv-YZYHGCVytk $s$!#W)}lp F,55KDYSXGMZ% h, Z$ <&hMn'O&2vkk[@E |ZQ_7egXzY]-NcJ|]>qn4g!QX_@>0o=mQTZQh'U^q:/{N1 fQhL ]#D]@IoSY{ >Zj .iiTk~u5 eS/.9D)n#I"@H9Pe@<`"`3htPM"~2z>6C~K3w2"/o\ iyMbKV\ w bZ5&Nx%4nH wK1.} "O Ss5Y? r4B?*XQ*~M Q]~HxOuf8}W?9O\PS p7@R H6(7JXF9Mn?^$k]CJ/O=^&~oCyuM {||~*/ht1(dI_hVn-Ayt}~v{Uo*; #a@ :7oAV/:^_rJW]r cZs;->M)Bmn s|ISELi>/AR &%v1.8/1F8qkI3`qr}\9zGQ%& E{!G~LxNT);SdR]FxiS 8_rX7oE^9,Crf,( omCSanyn-XQ^ KIU :;T1A1$/coVd55)`tS>klHS} _6J N0UEUYAu6H_[jO + I$|4 ]QOYHan@yo4a{22=!X4lU6sa-^&6a]oFXb{L]?M]?,P-kvca{;qgb4 ptFangZ6Ow2upC^KOA.AHEx$JvSO[E#HQwW]bK:t9 1WmnKdceVN6S "%Yulf9_klWm~pH!Io" v #~?Gz+y?e_VX>}cZ 13 Ujn|EDeu<$ W,hz}>8seUnKdt1wvQ"&1iti}w&r;\gLkeG ]<rbX<DZ0E|B<78OC=OPlUS,7Bh[7%r7CEu|B+n('>>69u+@|`!zKlD?z+{^,j b{q.{: "&~&>d_`m-85eEd84b[BHp{LLl4Tg Z  e,3}pUueh}?_S}#marI]X6*7t;lN=q3~[:" #H/jGDPEa<gY9}AAMchS$\f2##^@'c;[zl2rn-sSu(T#HTl]>b@Jo?AzdCX2&d9WFc 6 &Vt-s+!lN8 {1*t[;?(#CV{>k`,JHgm9cv|(F.*_{Lq 5vL@6{{ees[;,MAw5teX.q {I}v#[Nra^SDT_ECvil|{t*|cCN1xp"th[]q>^ $5!UZ-5TY(d9JGLZ6 wR'r4C3g0k =4%}&)"Q#o[c@oYLjI|j`z+sPw dZ839f*6/',wm Mz> {!& mKW\zAs4X |eoc6$f!xOU" Y~%t_;-OQgu1cU{T w+{"wx`|FLhmAI2%nSf\A[71k/WYh.]K\rq:u9y@=3[(G?H_)2b_;% p1b3vKC\Y-9=5's \b%}/{q~st RSAp_JRO- 9tW2%hx4y [?/e|KG#]cja|4YKztL3C`V@k^pzDFE[U@}6|$j/(:Xromk|6}?^3^^/CL7kw@4I}oHrsxu1OA#W+CA-h`T TU1V6dZ"3j$K3C7mg q{dn;(UJISWmQ 07|xc  (?OIr)X8GCXv{Rorbe\$/"-)U7n!3o .:W{RIlS^ ,~qzx%5.9d@}#GSi6ߦ$[[tEXguO{B -x2s(Apd1E2T`1{Hqc"1nn=ag&JEmO3#}{\o' Z*ar:1I_n=s@MD\8CDi\mx z9p*N#c};b$1w~SC?+'6*8Kpc'd>">o:0adKB|I}9n]q~g5*-l SQRsQ`/B^km}+3T"iHl}*kI.z*cQ }cukA%G76[3j}:QQaNbXj@,7S*$`(n o`6 BX>V0/%m9[Swn,[g`>.R) @vOyid20g3y )aKZ+]I?t3Z?[]=J,n2Jy/+o>("b  @p pz6*m;K6nK xuBA1Gl~;;La_2~Orr!I7ck 1-`t7l^Wr1 _'oEKeVHXIvqEbq7?n>McfloSzdt nN "bzMT!.wu3{V-SG []%__B|rTilQ?jAJ, X -nDM_]s J_ JqnMXXjRW\VS L{kBgn@,fr ;p1_ gQ=@/HMql"~[FRr2N&[jMm$ ^znF{v^V'-SZ1 20wsn"f$?]XQYx7JYPJV^Q& o^A-T1l=A|^VB wlB5M 5pN!066BL%MHV_'csUe|Y[ |-gG5%ABQSb 6~2:nXJ73}i7%t5B^:=>6yB5 MD$2I?=_Ma:B~yY]E|/o1a[ {k<#+E81nKLj/4`U95+~3Yn!}IPdp&<D;fI8NVR2N"}&Ie)-b-,nbQ!YU6bVwMR^sJWc a|C#B+rf%J9`h:#vk/W. }^mnXoZ`(fi67 @Jk+*Z8 ^@KO& `/Z@NL+ ;"gD)\%ZMJTE[~Nb PN~|s, = ;}BvXi<2lj'[z c?Qql@m^`+)S}cOSFXpj(fnbT"c jcH3 G] VIsg2P{|'1coSb!J-h/,,1`m8}] ~&s 3(3gk,j$dU%,n9_h[(_ y=bH]>2{?#h b!!+ $(>3}7*o4.8,S ;j i.6] @C 1v#ZH6Ey]4 Cbp+5$$%$pM|};v x*xF%9b[;oc q1 b/w>0b~+V#5beN%z"|txjN#@@hD DxfPSV vQg{.cc&@(g8Hj]z[$@=J,s"|&+q|oj#t#hQx9P< )CluMrNXEw}s ,_ 5DeuK}`]9zbPHdQ&l1vU!&>;:8+{k!v#;W0E-7@SZ&mn>~`v=c!P)3 lQ ho\qe`DO RY3<9`5zi7~ic&$?;-jv ~~}qO7Gq7HvO LUGlL8P]&r.E:vCw$$tyvQ\U#arNYft.W."4$u%=P`I~#;;EP-<5I.:|QX=+cziaT1*EZ@$,gCMVCll8Lt:sNgt6tL ;?mm]YpP8n\NL+#mUzO[V6o8TWge>AAgBU&d'a>228|YX{6<6FcaW6fj"qhC5|bOj3fb^]z~"( X IL60O6Cprm$-aK;3_|qpfClrT.\1i@ ?(u'jYUcaNr~|T y{/2L5Y9&>BjNGn3^+$]bk`_7I[-G#Q%UnC|lckijd#>eEEX KHI%6d"qJ ?YtCFTWA@pID<]x$)">Y5teUuW)hJ^$L%F,Yu l M5zC".^ DZm UG_b*xlgesL&/\xRuGWgm3#G$Ep(beG'MyB7v{910 sf:&A >JmRz_x0((eqPP2.t_SVxp`8rEWukt}</ igH{)"sc >v:l|,QY+qqtd- ^\6BQ+F6I}aH*cXl eF:@+w|w$^@Zfb_M[jBqpE9+Ewm tl007\ /aqd[Xjx~RlO^ NlLN0kLL^K;WSSK Y!|E24`ddri"ZDm[Q#S[&8h" Lz\QNEQD H=oiW'!h)!;[mS;[sc/~ n'p "j?L!8jP>LB SKNX[x#BT@_}^ `I|VbxKF 1JdcI${,Q]uI%H:WH;G-]iB+"zmP 1:rRW/DHkwAB(x* oxfnEV+#\i2G h ;>BZX3e6XSQ_,6 ` ncma3mszEq e*fD}(/pB b:D9pbs(2+uJj=v+%&k>NsY{jDA WD[-Ir  -ws)3 XH[*F=-)VMsW#cuLaxQbD^9|9054u5Vg"d?Wo/@ 9P_@AX'1me^u)|'l|)+(w'QwS|2=(YRNy?5-o,DZ9KV._Q]S:X%.>B[ vH| ):i]:Y_)g _^VTGO[vI\U.H"N O,v 6 F4.xVup|sY 0O29]iP^op'$U,q7*">?J] MXF|w+]fkI7{&\)sw3>MB/ 4C!pgl3[#yjs(|rZbF 9H~yP# m?\" *Kzv6|w{e -Naj2)''j'vmw-uobASj'fP|c38-1+uK(<)$t:%dg%!t`^0p9D2(N@DS,9#>}67,DJK[ KRA vvN\}}1description file work (at least on OpenVMS 8.3 EA UNZIP.BCK >[UNZIP60]HISTORY.600;1Ne new UTF-8 related syntax for the -U option. [Chr. Spieler] - win32/w32cfg.h, wince/wcecfg.h: enabled UNICODE_SUPPORT by default. [Chr. Spieler] - win32/Makefile: adapted to modified UNICODE_SUPPORT default. [Chr. Spieler] - wince/intrface.cpp - close_outfile(): moved local (wide string) copy of filename outside of conditional "set timestamps" block. [Chr. Spieler] - unzpriv.h: do never include here for the wince port (_WIN32_WCE or POCKET_UNZIP), this must be handled elsewhere for C++. [Chr. Spieler] - unzip.c: removed the -U option description from the introductory screen for WIN32 because of lacking space. Maybe, these "debugging" options should not be shown there at all. [Chr. Spieler] 6.00e03 (29 Mar 08): - unix/configure: corrected detection of ANSI C vs. bundled C compiler on HP-UX. [Steven M. Schweda] - VMS, unzip.c: help screen extended to show correct "-D" semantics for the special VMS defaults. [Steven M. Schweda] - unix/Makefile: added "generic_gcc" target, using auto-configuration with GNU compiler. [Steven M. Schweda] - unzip.c: renamed error message constant for clarity. [Chr. Spieler] - unshrink.c: revision to fix long-standing decompression bug, added boundary checks to detect invalid compressed data. [Santiago Vila, Chr. Spieler] - extract.c: added error message handling for "invalid data" errors from unshrink(). [Chr. Spieler] - process.c, unzpriv.h: disabled compilation of unused UNICODE_SUPPORT helper function. [Chr. Spieler] - process.c, win32/win32.c: added special win32-only version of the wide_to_local_string() helper function to work around "ANSI vs. OEM" codepage problems with non-Microsoft C-runtime libraries. [Chr. Spieler] - zipinfo.c - zipinfo(): corrected "back at end-of-cdir" check (synchronized it with the corresponding list_files() code). [Chr. Spieler] - fileio.c - do_string(): closed UNICODE_SUPPORT related memory leaks (free allocated utf8 buffers when no longer used). [CRhr. Spieler] - vms/vms.c - set_direc_attribs(): do not restore any size info from the (PK-style) extra field record attributes settings. The new directory created during extraction may contain fewer (restored) entries than the original source folder, so that the old non-matching size data would result in corrupted interal directory structures. [Steven M. Schweda] 6.00e04 (27 Apr 08): - vms/vms.c - set_direc_attribs(): fixed NAM[L] initialization for the "normal" non-VMS-attributes case. [Steven M. Schweda] - vms/NOTES.TXT updated (version copied from zip30h05). [Steven M. Schweda] - unzip.c, vms/NOTES.TXT: added SYMLINKS to the special compilation options reported by show_version_info(); updated Symbolic Links section in NOTES.TXT. [Chr. Spieler] - INSTALL: added documentation for the new UNICODE_SUPPORT related options. [Chr. Spieler] - README: added anouncement of the new UTF-8 coded entry names support. [Chr. Spieler] - fileio.c, process.c, unzip.c, globals.h, unzpriv.h, win32/w32cfg.h, wince/wcecfg.h : revised the UNICODE_SUPPORT code, added direct support for UTF-8 being the native MBCS char encoding, allowed separate activation of the "UTF-8 is native character coding" and the "translate UTF-8 <==> native extended-ASCII via Unicoded wchar_t" support methods. [Chr. Spieler] - unix/configure, unix/Makefile: extended configure script to support automatic selection of UNICODE_SUPPORT support on capable systems, completed configuration support for the linking step. [Chr. Spieler] - unix/unxcfg.h: changed interdependency rules of LARGE_FILE_SUPPORT and ZIP64_SUPPORT to prevent unsupported symbol combinations. [Chr. Spieler] - man/unzip.1: extended description of -U option to mention the #Lxxxxxx escape format for characters beyond the basic unicode page. [Chr. Spieler] - proginfo/extrafld.txt: updated wording and line wrapping of Info-ZIP Unicode extra fields. [Chr. Spieler] 6.00e05 (09 Sep 08): - unix/unix.c - version(): added OS info support for Mac OS X (including a note for the recognized CPU architecture). [Steven M. Schweda] - unix/configure: check for Mac OS X special linker options is only executed on systems that have been identified as Mac OS X. [Steven M. Schweda] - unix/Makefile: moved "solaris" targets into new "autoconfig generic" group of machine target aliases. [Steven M. Schweda, Chr. Spieler] - extract.c, fileio.c: use "sizeof(G.answerbuf)" as length argument in fgets() calls, for better robustness and "in-code" documentation. [Chr. Spieler] - extract.c - extract_or_test_entrylist(): fixed handling of \n in response to "overwrite (y/n/r)" prompt. [Steven M. Schweda, Chr. Spieler] - extract.c, special version of "replace file" prompt for VMS to take into account that VMS normally created a new version instead of overwriting an existing file. [Steven M. Schweda] - unzpriv.h: for VMS, undefine the PATH_MAX definition provided by , because it does not take into account long name support of ODS-5 volumes. [Steven M. Schweda] - VMS: added zlib.h and infback9.h jacket headers for support of using zlib as inflate decompression code; revised build procedures for zlib support (build_unzip.com, descrip.mms, descrip_src.mms). [Steven M. Schweda] - inflate.c: corrected condition when to include "infback9.h" for Deflate64 support with zlib 1.2.x. [Chr. Spieler] - extract.c: standardized wording of error messages in SET_DIR_ATTRIBS code. [Steven M. Schweda] - vms/vms.c - set_direc_attribs(): ensure that the FAB block used is properly initialized. [Steven M. Schweda] - aosvs, atari, atheos, beos, unix - mapname(): for all "unix-like" ports, the reserved file names "." and ".." are mapped to "_" resp. "__". [Steven M. Schweda, Chr. Spieler] - list.c - changed listing layout to emit four-digit years for file date-time-stamps. [Ed Gordon, Chr. Spieler] - process.c - find_ecrec(): fixed zipfile comment handling within the Zip64- compatible end-of-central-dir records scanning, to take into account that the file pointer is no longer at the zipfile end when the eocdrec scanning has finished. [Chr. Spieler] - process.c, zipinfo.c: revised and reorganized zipinfo log header output; the zip archive comment has to be reported before all of the eocdir info could be collected. [Chr. Spieler] - man/unzipsfx.1 - Debian patches 4461_002 and 5293_009 fixing text errors; correct spelling of similarly and additional per debian patch; correct wrong formatting command \P to \fP. [sanvila] - vms/build_unzip.com: fixed integrated bzlib build support. [Chr. Spieler] 6.00e06 (13 Sep 08): - unix/unix.c - set_symlnk_attribs(): removed erronous surplus line with only "if" on it. [Steven M. Schweda] - vms/descrip_deps.mms: restored correct file which was accidentally overwritten by vms/descrip_src.mms. [Steven M. Schweda] - vms/build_unzip.com: optimized the distinction between "compile destination subdir"\ for integrated BZIP2 compilation (should distinguish between the different compilers supported for VAX) and "external library dir" for user-supplied BZIP2 (and ZLIB) libraries (user-supplied library is expected to work with any supported compiler on VAX, so no dependency on the specific compiler used). [Steven M. Schweda] - unzip.c: replaced tab characters in output messages by appropiate number of spaces (assuming standard tab spacing of 8 chars), to prevent mis-formatted output Z UNZIP.BCK >[UNZIP60]HISTORY.600;1MU]on terminals with non-standard tabstop settings. [S. M. Schweda] - unix/unix.c * set_symlnk_attribs(): fixed uid/gid size check before calling lchown(); * set_direc_attribs(): repared wrongly inserted patch and fixed uid/gid size check before calling chown(). [Chr. Spieler] - vms/vms.c: fixed user-query code for existing files on VMS when extracting in "-V" mode (retaining version numbers); fixed some problems with exotic extended ODS5 file names, and files named ".". [Steven M. Schweda] - vms/cmdline.c, vms/unz_cli.cld: extended CLI to support the new extended meaning of the -o flag (-oo => "overwrite ALL existing" when retaining version numbers ("-V") and extracting archive members with attached version number (new /EXISTING option). [Steven M. Schweda] - extract.c - extract_or_test_entrylist(): added code to skip the generic user query "overwrite (y/n/r)?" when extracting an entry with attached version number in "-V" (keep version number) mode. [Steven M. Schweda, C. Spieler] - vms/unzip_cli.help, vms/unzip_hlp.rnh: updated documentation to reflect the UI extension to handle VMS-specific "overwrite or new version" settings. [Steven M. Schweda] - unzip.c: added VMS specific -n and -o (-oo) option description sections to online help screen definitions. [Steven M. Schweda] - vms/cmdline.c: corrected some small formatting issues in online help output. [Chr. Spieler] - vms/unzip_cli.help, vms/unzip_hlp.rnh: corrected a few typos and updated the help screen for the "unix-style" commands in the CLI help. [Chr. Spieler] - vms/vms.c, extract.c, unzpriv.h: fixed the the error handling of the VMS- specific "newver/overwrite/skip" query by extending the return code range of open_output() for VMS, without any new global data. [Chr. Spieler] 6.00e (04 Jan 09): - fileio.c: changed tmpstat from struct stat to z_stat. [EG] - unzip.c: expanded extended help to include unzip and zipinfo options. [EG] - man/unzip.1: updated multi-part archive information; minor additions to authors activities list. [EG] - fileio.c: added strerror(errno) output to CannotCreateFile message. [SMS] - unix/unix.c: add more detailed error message using strerror() when a file error occurs. [SMS] - unix/zipgrep - add additional information to top. Clean up some lines and add commments. Added code to handle backslashes in archive file names, and shell-special characters in the pattern. Changed to use "sed" for all escaping of shell-special characters. Tried to get the exit status to follow the status of egrep in the complex (default) situation, using only standard Bourne shell features, and to exit early if egrep returns status 2 (error). [SMS] - vms/unzip_cli.help - VMS help updates. [SMS] - vms/unzip_def.rnh - synchronized option description with unzip_cli.help. [Chr. Spieler] - fileio.c: extend backup number range from 65535 to 99999 on 32-bit systems; fixed limit detection on 16-bit systems. [Chr. Spieler] - zipinfo.c: changed date layout of "short" (one-line) zipinfo modes to always use ISO-style YMD order. [Chr. Spieler] - unix/configure: added a simple compiler test to check for a working C compiler setup. [Steven M. Schweda] - cmsmvs/vmmvs.h: removed __EBCDIC preprocessor symbol definition (not used anywhere in UnZip, breaks compilation on Z-OS). ["Lutz", Chr. Spieler] - unix/makefile - moved -L link option earlier in unzip$E rule. [Lutz] - unzip.c - Remove "s" from "permits" in SYMLINKS feature message. [SMS] - vms/vms.c: simplified the scheme to escape non-last dots, for compatibility with modifications in Zip 3.1. [SMS] - vms/vms.c, vms/vms.h, function create_qio_output(): revised NMCTL flag handling ("overwrite or create-new" code) to be VAXC compatible. [SMS] - extract.c - extract_or_test_entrylist(): removed '\n in middle of WINDLL "file exists ... skipping" message to get it displayed on one line. [EG] - man/unzip.1, INSTALL: updated/corrected documentation for the UNIXBACKUP feature and the description of its -B qualifier. [Chr. Spieler] - proginfo/ziplimits.txt: updated discussion of program implementation limits to the state of "released" Zip 3.0 and UnZip 6.0. [EG, Chr. Spieler] - README, Bugs, ToDo: updated and syncronized documentation for release candidate. [Chr. Spieler] - windll/structs.h: added structure version id field at the "top" of the "DCL" options struct. [EG] - windll/structs.h: added UZ_DCL_STRUCTVER preprocessor symbol, holding the currently valid version id of the DCL structure definition. [Chr. Spieler] - windll/windll.c - Wiz_SetOpts(): exit function if version id of passed in "DCL" structure is not equal to the expected setting. [EG, Chr. Spieler] - windll/unexampl.c: synchronized with recent WinDLL option structure addition. [EG, Chr. Spieler] - windll/vc?/exampl/c_dll_ex.[dsp|vcproj]: new Visual Studio project files for building the WinDLL C usage example uzexampl.exe. [EG, Chr. Spieler] - windll/vb/vbunzip.bas: changed DLL interface to use UZxxx_I32 variants of callback functions that split 64-bit values into high and low part 32-bit integers that can be handled by VB(A)5/6. Inside the VB code, low and high parts are added up in Currency type variables. Converted \ to / in duplicate file message. Fixed MsgBox flags concatenation. Added support for new OverwriteAll checkbox. [EG] - windll/vb/vbunzip.frm: added OverwriteAll checkbox, added resizing to txtMsgOut output box. [EG] - windll/vb/vbunzip.frm, windll/vb/vbunzip.bas: cleaned up and completed the recent modifications, resynchronized with WinDLL interface with UnZip 6.0 master source, removed all modification incompatible with VB5, fixed the UZDLLServ_I32() callback calling interface, used Double instead of Currency as Int64 summation type to prevent potential numeric overflow issues. [Chr. Spieler] 6.00f (11 Jan 09): - INSTALL: added notes on the difference between "old" Macintosh OS and current Apple Mac OS/X, which is supported as a BSD Unix port . [EG] - unzip.c - help_extended(): added some documentation about funzip and unzipsfx stub. [EG] - windll/csharp/: updated C# example to match the current Zip64-compatible WinDLL API, revised string parameter marshalling, initialized/resetted job statistic counters, added OverwriteAll checkbox. [Chr. Spieler] - win32/Makefile: the DLL example frontend is now compiled with the same runtime library settings as the DLL binary. [Chr. Spieler] - LICENSE: updated to version 2009-Jan-2, which removes the requirement to provide the LICENSE in documentation with distribution of binaries when the redistributed programs support display of the LICENSE by some command line option. [EG] - vms/vms.h, vms/vms.c: moved "lowercase to uppercase mapping" define of sys$setdfprot from vms.c into vms.h in front of the starlet.h include, where all the other name case mappings are located. [Steven M. Schweda] - vms/vms.c: made the declaration of sys$setdfprot() always active when the SETDFPROT symbol is defined. [Chr. Spieler] - unix/unix.c: added strerror(errno) output to various "Cannot..." I/O error messages (in checkdir(), close_outfile(), set_symlnk_attribs()). [Steven M. Schweda, Chr. Spieler] - fileio.c - open_outfile(): added strerror(errno) output to the error messages "cannot rename ..." and "cannot delete ...". [Chr. Spieler] - fileio.c - do_string(): corrected string length passed to win_fpri8z UNZIP.BCK >[UNZIP60]HISTORY.600;1|lntf() (comment string may get shortened by CRLF->LF translation). [Chr. Spieler] - beos/beos.c, beos/beocfg.h, aosvs/aosvs.c, win32/win32.c: extended various "Cannot..." I/O error messages with strerror(errno) output, to synchronize code with current state of the Unix port. [Chr. Spieler] - unzip.c, unzpriv.h, unix/configure: added better check for UTF-8 codeset using nl_langinfo() function, as suggested on the sourceforge.net forum; added nl_langinfo() to the "function existence" checks in the configure script. [Chr. Spieler] - wince/intrface.cpp: added missing wide_to_local_string() function from win32.c (is [currently] needed in process.c). [Chr. Spieler] 6.00g01 (18 Jan 09): - extract.c, windll/structs.h, windll/windll.txt: added a bufsize parameter to the "replace()" callback function, updated UZ_DCL_STRUCTVER setting to 0x600. [Chr. Spieler] - windll/uzexampl.c, windll/csharp/Unzip.cs, windll/vb/vbunzip.bas, windll/guisfx/sfxwiz.c, wince/intrface.cpp: adapted frontend code to the "replace()" callback function signature change; updated DCL.StructVersID setting to reflect the change in the DLL code; added check against password buffer overflow (not in uzexampl.c). [Chr. Spieler] - windll/vb/vbunzip.frm: removed obsolete comment. [EG] - windll/csharp/ReadMeCS.txt: added note on problem with Visual Studio 8.0 and 9.0 when used with unzip32.dll that was linked against the Visual Studio version of the MS C runtime dll. [Chr. Spieler] - unix/Makefile: consistent use of "$E" for executable filename extension; fixed dependency of binary builds on system specific config header; added dependency of autoconfigured "generic" builds on the configure result. [Chr. Spieler] - unzip.c: added hint to "unzip -hh" extended help display to the short help screen. [Chr. Spieler] - unzip.c - help_extended(): removed superfluous "]", corrected availability info for the "-B" option. [EG, Chr. Spieler] - man/unzip.1, unzip.c, vms/unzip_def.rnh, vms/unzip_cli.help - modified description of -X option for VMS to emphasize that this option controls restoration of ACL protection info, whereas the standard S/O/G/W access restrictions get always restored. [SMS, H. Goatley, Chr. Spieler] - unzip.h, api.c, unzipstb.c, unzvers.h, windll/windll.txt, windll/vb/vbunzip.bas: revised and extended the "version info retrieve" function calls, added version identifier for the "last incompatible API change", fixed version structure size handling, updated API documentation. [Chr. Spieler] - windll/windll.c - UnzipAllocMemory(): fixed operator precedence bug by adding explicit parenteses. [Chr. Spieler] - win32/Makefile.wat: added missing rule for crc32f.obj. [Chr. Spieler] - unzip.c - uz_opts(): corrected parameter list for call of help_extended(). [Chr. Spieler] - unix/Makefile: adapted linux_shlib and linux_shlibz targets to work with the changed organisation of the assembler CRC code. [Chr. Spieler] 6.00g02 (25 Jan 09): - History.600, unzpriv.h, unix/unix.c: corrected/unified spelling of "dependent" and "dependence". [Steven M. Schweda] - api.c - UzpVersion2(): added forgotten setting of dllapimin version info (similar to UzpVersion()). [Chr. Spieler] - unzipstb.c, windll/uzexampl.c, windll/uzexampl.h: extended DLL version display to report the new "DLL API" version info; added compatibility checks for version of loaded dll, using the recently added additional API version info. [Chr. Spieler] - windll/uzexampl.c: changed program return values to follow common usage (0 for no error, -1 for fatal abort, unzipdll return code otherwise). [Chr. Spieler] - windll/vb/VBReadMe.txt, windll/vb/vbunzip.bas: revised and extended documentation of unzip32.dll search process flow, added warning note explaining the unexpected "dll not found" errors when running the VB code inside the VB IDE. [Chr. Spieler] - windll/vb/vbunzip.bas: added version/api compatibility checks for the loaded unzip32.dll, aborting the program in case of any detected incompatibility. [Chr. Spieler] 6.00g03 (10 Feb 09): - README, History.600: documented support for new 32-bit UID/GID extra field on Unix. [Ed Gordon, Chr. Spieler] - unzip.h: added "old lib swprintf" compatibility clause for Pocket-UnZip (WinCE) to support current Visual Studio versions 8 and 9. [Chr. Spieler] - wince/wcecfg.h: switched off UNIX_BACKUP for WinCE (rename() function not available on Windows CE); moved the (none-WCE) configuration setup for Zip64 support to the end (behind all header includes). [Chr. Spieler] - wince/wince.h: added guard against redefinition of isalpha() macro. [Chr. Spieler] - wince/intrface.cpp - win_fprintf(): reordered local loop counter variable declaration to achieve compatibility with standard C++ (without breaking the non-standard MS VC++ 6.0 variant). [Chr. Spieler] - extract.c, list.c, process.c, zipinfo.c: replaced strncmp() by memcmp() when comparing against "binary" signatures. [Chr. Spieler] - process.c - wide_to_escape_string(): fixed a "write to unallocated memory" bug. [Chr. Spieler] 6.00g04 (16 Feb 09): - unzpriv.h: mapped zfseeko and zftello to C rtl supplied functions for MS C runtime of VC 8.0 or newer. [Chr. Spieler] - win32/win32i64.c: revised zfseeko() code to correctly clear the eof state (and for "MSVC 6.0 or newer" rtl environments: manipulate internal flag to prevent clearing a ferror() state). [Chr. Spieler] - windll/vc5/, windll/vc6/, windll/vc8/: added "link against static C rtl" configurations to the unzip32 dll and c_example projects. [Chr. Spieler] - win32/vc8/, windll/vc8/: removed "UpdateFromVC600" property sheet settings, they are not needed. [Chr. Spieler] - windll/guisfx/sfxwiz.c: added compatiblity preprocessor switches to shut up MS VC 8 (and newer) complaining about depreciated standard C functions. [Chr. Spieler] - INSTALL, windll/Contents: added notes about different runtime configurations (linking against C rtl dll vs. static C rtl lib) when building the UnZip DLL. [Chr. Spieler] 6.00g (28 Feb 09): - unzip.c: cleaned up the UTF-8 check according to the code found in the latest Zip 3.1 beta, removed the "switch to UTF-8 codeset" code because it proved to not work as expected. [Ed Gordon, Chr. Spieler] - win32/w32cfg.h: use rtl-provided MBCS functions for MinGW32 when compiled and linked against msvcrt.dll. [Chr. Spieler] - extract.c - fnfilter(): added "enyhanced" non-printable charcode filtering when a locale-aware isprint() implementation is available (controlled by the preprocessor symbol HAVE_WORKING_ISPRINT). [Chr. Spieler] - win32: enabled "enhanced" fnfilter() filtering for compiler environments using MSVC 6.0 (or newer) runtime, and for Borland C. [Chr. Spieler] - vms: enabled "enhanced" fnfilter() filtering using isprint(), may get disabled by defining the NO_WORKING_ISPRINT symbol. [Chr. Spieler] - unix/unxcfg.h: enabled "enhanced" fnfilter() filtering when setlocale() is available (NO_SETLOCALE is not defined). [Chr. Spieler] - unix/configure: added NO_SETLOCALE define when setlocale() check fails. [Chr. Spieler] - INSTALL: added documentation of NO_SETLOCALE and HAVE_WORKING_ISPRINT resp. NO_WORKING_ISPRINT symbols. [Chr. Spieler] - general: unified spelling of "wildcard". [Chr. Spieler] 6.00h01 (09 Mar 09): - vms/vms.c: added missing case-translation define for sys$getdvi(), for support of /NAMES=AS_IS w g UNZIP.BCK >[UNZIP60]HISTORY.600;1L {ith older DECC distributions. [Steven M. Schweda] - vms/build_unzip.com, vms/descrip.mms, vms/descrip_src.mms: resolved a /NAME=AS_IS case issue by changing the linking command for bzip2-enabled builds to read the unzip code library twice (before and after the bzip2 object library) to resolve the bzip2 error callback, instead of explicitely loading the callback function. [Steven M. Schweda] - vms/NOTES.TXT: cleaned up wording of the Symbolic Links section. [SMS] - extract.c, fileio.c, process.c, unzpriv.h: fixed recognition of "native UTF-8" general purpose flag bit 11 when processing local header, added check against mismatching central vs. local GPFlag bit 11 (not for SFX) with warning display (suppressible by -q command qualifier). [C. Spieler] 6.00h02 (16 Apr 09): - extract.c: fixed evaluation sequence of check expression by adding correct pairs of parentheses. [EG, SMS] - unix/configure: added working check for lchmod. [SMS] - unzip.c: added compile option display for MBCS support. [Chr. Spieler] - unzpriv.h, unix/unxcfg.h, win32/w32cfg.h: the new preprocessor symbol NO_MBCS allows to explicitely disable MBCS support. [Chr. Spieler] - INSTALL: documented _MBCS and NO_MBCS preprocessor symbols. [Chr. Spieler] - unix/configure: added checks for MBCS support. [Chr. Spieler] 6.00h03 (17 Apr 09): - unzpriv.h: added missing OF() macro to uzmbclen() prototype. [SMS] - man/*.1: changed revision info to intended release date. [Chr. Spieler] 6.00 (20 Apr 09): - unzpriv.h, fileio.c: removed superfluous "define indirection" zlstat, link attributes do never ever need 64-bit treatment. [Chr. Spieler] - man/unzip.1, ToDo: added remark to DECRYPTION section on still missing support for UTF-8 encoded passwords on systems like Windows, that are Unicode-aware without using UTF-8 as native character encoding; added ToDo note about fixing UTF-8 password handling in the next release. [Chr. Spieler] - updated release dates (History.600, README, unzvers.h, all man pages), changed all relevant files from BETA into release state. [Chr. Spieler] ================== These changes occurred in beta versions 6.00a to 6.00. This list may have left out some bugfixes and even some features...void where prohibited, your mileage may vary, etc., etc. *[UNZIP60]HUMAN68K.DIR;1+,x./ 4->0123 KPWO56,N7,N89GHJI CONTENTS.|CRC_68.S|FLATE.S2 HUMAN68K.CC MAKEFILE.!*[UNZIP60.HUMAN68K]CONTENTS.;1+,|./ 4R@-x0123KPWO56)`7)`89GHJContents of the "human68k" sub-archive for UnZip 5.50 and later: Contents this file Makefile (shorter) Makefile for GNU C on X680x0/Human68k human68k.c Human68k-specific routines for UnZip crc_68.s assembler version of crc32.c flate.s assembler version of inflate_codes() (define ASM_INFLATECODES) *[UNZIP60.HUMAN68K]CRC_68.S;1+,|. / 4 /@-x0123KPWO 56".7".89GHJ ;=========================================================================== ; Copyright (c) 1990-2000 Info-ZIP. All rights reserved. ; ; See the accompanying file LICENSE, version 2000-Apr-09 or later ; (the contents of which are also included in zip.h) for terms of use. ; If, for some reason, all these files are missing, the Info-ZIP license ; also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html ;=========================================================================== ; crc_68 created by Paul Kienitz, last modified 04 Jan 96. ; ; Return an updated 32 bit CRC value, given the old value and a block of data. ; The CRC table used to compute the value is gotten by calling get_crc_table(). ; This replaces the older updcrc() function used in Zip and fUnZip. The ; prototype of the function is: ; ; ulg crc32(ulg crcval, uch *text, extent textlen); ; ; On the Amiga, type extent is always unsigned long, not unsigned int, because ; int can be short or long at whim, but size_t is long. ; ; If using this source on a non-Amiga 680x0 system, note that we treat ; a0/a1/d0/d1 as scratch registers not preserved across function calls. ; We do not bother to support registerized arguments for crc32() -- the ; textlen parm is usually large enough so that savings outside the loop ; are pointless. ; ; Define NO_UNROLLED_LOOPS to use a simple short loop which might be more ; efficient on certain machines with dinky instruction caches ('020?), or for ; processing short strings. If loops are unrolled, the textlen parm must be ; less than 512K; if not unrolled, it must be less than 64K. ; ; 1999/09/23: for Human68k: Modified by Shimazaki Ryo. xdef _crc32 ; (ulg val, uch *buf, extent bufsize) DO_CRC0 MACRO moveq #0,ltemp move.b (textbuf)+,ltemp eor.b crcval,ltemp lsl.w #2,ltemp move.l (crc_table,ltemp.w),ltemp lsr.l #8,crcval eor.l ltemp,crcval ENDM DO_CRC2 MACRO move.b (textbuf)+,btemp eor.b crcval,btemp lsr.l #8,crcval move.l (crc_table,btemp.w*4),ltemp eor.l ltemp,crcval ENDM crc_table reg a0 array of unsigned long crcval reg d0 unsigned long initial value textbuf reg a1 array of unsigned char textbufsize reg d1 unsigned long (count of bytes in textbuf) btemp reg d2 ltemp reg d3 xref _get_crc_table ; ulg *get_crc_table(void) quad _crc32: move.l 8(sp),d0 bne.s valid ;;;;; moveq #0,d0 rts valid: movem.l btemp/ltemp,-(sp) jsr _get_crc_table movea.l d0,crc_table move.l 12(sp),crcval move.l 16(sp),textbuf move.l 20(sp),textbufsize not.l crcval ifdef NO_UNROLLED_LOOPS if CPU==68000 bra.s decr loop: DO_CRC0 decr: dbra textbufsize,loop bra.s done else twenty: moveq #0,btemp bra.s decr2 loop2: DO_CRC2 decr2: dbra textb{`Y UNZIP.BCK|x[UNZIP60.HUMAN68K]CRC_68.S;1 hufsize,loop2 endif ELSE ; !NO_UNROLLED_LOOPS if CPU==68000 moveq #7,btemp and textbufsize,btemp lsr.l #3,textbufsize bra decr8 loop8: DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 DO_CRC0 decr8: dbra textbufsize,loop8 bra.s decr1 loop1: DO_CRC0 decr1: dbra btemp,loop1 bra done else twenty: moveq #0,btemp move.l textbufsize,-(sp) lsr.l #3,textbufsize bra decr82 quad loop82: DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 DO_CRC2 decr82: dbra textbufsize,loop82 moveq #7,textbufsize and.l (sp)+,textbufsize bra.s decr12 loop12: DO_CRC2 decr12: dbra textbufsize,loop12 endif ENDC ; ?NO_UNROLLED_LOOPS done: movem.l (sp)+,btemp/ltemp not.l crcval ;;;;; move.l crcval,d0 ; crcval already is d0 rts *[UNZIP60.HUMAN68K]FLATE.S;1+,2.&/ 4&&@-x0123KPWO'56 7 89GHJ;=========================================================================== ; Copyright (c) 1990-2002 Info-ZIP. All rights reserved. ; ; See the accompanying file LICENSE, version 2000-Apr-09 or later ; (the contents of which are also included in unzip.h) for terms of use. ; If, for some reason, all these files are missing, the Info-ZIP license ; also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html ;=========================================================================== ; flate.a created by Paul Kienitz, 20 June 94. Last modified 23 Mar 2002. ; ; 68000 assembly language version of inflate_codes(), for Amiga. Prototype: ; ; int inflate_codes(__GPRO__ struct huft *tl, struct huft *td, ; unsigned bl, unsigned bd); ; ; Where __GPRO__ expands to "Uz_Globs *G," if REENTRANT is defined, ; otherwise to nothing. In the latter case G is a global variable. ; ; Define the symbol FUNZIP if this is for fUnZip. It overrides REENTRANT. ; ; Define AZTEC to use the Aztec C macro version of getc() instead of the ; library getc() with FUNZIP. AZTEC is ignored if FUNZIP is not defined. ; ; Define NO_CHECK_EOF to not use the fancy paranoid version of NEEDBITS -- ; this is equivalent to removing the #define CHECK_EOF from inflate.c. ; ; Define INT16 if ints are short, otherwise it assumes ints are long. ; ; Define USE_DEFLATE64 if we're supporting Deflate64 decompression. ; ; Do NOT define WSIZE; it is always 32K or 64K depending on USE_DEFLATE64. ; ; 1999/09/23: for Human68k: Modified by Shimazaki Ryo. X: EQU $7ffe IFDEF INT16 MOVINT MACRO _1,_2 move.w _1,_2 ENDM INTSIZE equ 2 ELSE ; !INT16 MOVINT MACRO _1,_2 move.l _1,_2 ENDM INTSIZE equ 4 ENDC IFDEF REENTRANT IFNDEF FUNZIP REENT_G equ 1 ENDC ENDC ; The following include file is generated from globals.h, and gives us equates ; that give the offsets in Uz_Globs of the fields we use, which are: ; ulg bb ; unsigned int bk, wp ; (either array of unsigned char, or pointer to unsigned char) redirslide ; For fUnZip: ; FILE *in ; For regular UnZip but not fUnZip: ; int incnt, mem_mode ; long csize ; uch *inptr ; It also defines a value SIZEOF_slide, which tells us whether the appropriate ; slide field in G (either area.Slide or redirect_pointer) is a pointer or an ; array instance. It is 4 in the former case and a large value in the latter. ; Lastly, this include will define CRYPT as 1 if appropriate. IFDEF FUNZIP INCLUDE human68k/G_offs_.mac ELSE IFDEF SFX INCLUDE human68k/G_offsf.mac" ELSE INCLUDE human68k/G_offs.mac ENDC ENDC ; struct huft is defined as follows: ; ; struct huft { ; uch e; /* number of extra bits or operation */ ; uch b; /* number of bits in this code or subcode */ ; union { ; ush n; /* literal, length base, or distance base */ ; struct huft *t; /* pointer to next level of table */ ; } v; ; }; /* sizeof(struct huft) == 6 */ ; ; The G_offs include defines offsets h_e, h_b, h_v_n, and h_v_t in this ; struct, plus SIZEOF_huft. ; G.bb is the global buffer that holds bits from the huffman code stream, which ; we cache in the register variable b. G.bk is the number of valid bits in it, ; which we cache in k. The macros NEEDBITS(n) and DUMPBITS(n) have side effects ; on b and k. IFDEF REENT_G G_SIZE equ 4 G_PUSH MACRO ; this macro passes "__G__" to functions move.l G,-(sp) ENDM ELSE xref _G ; Uz_Globs G_SIZE equ 0 G_PUSH MACRO ds.b 0 ; does nothing; the assembler dislikes MACRO ENDM ENDM ENDC ; REENT_G ;; xref _mask_bits ; const unsigned mask_bits[17]; IFDEF FUNZIP IF CRYPT xref _encrypted ; int -- boolean flag xref _update_keys ; int update_keys(__GPRO__ int) xref _decrypt_byte ; int decrypt_byte(__GPRO) ENDC ; CRYPT ELSE ; !FUNZIP xref _memflush ; int memflush(__GPRO__ uch *, ulg) xref _readbyte ; int readbyte(__GPRO) ENDC ; FUNZIP xref _flush ; if FUNZIP: int flush(__GPRO__ ulg) ; else: int flush(__GPRO__ uch *, ulg, int) ; Here are our register variables. b reg d2 ; unsigned long k reg d3 ; unsigned short <= 32 e reg d4 ; unsigned int, mostly used as unsigned char w reg d5 ; unsigned long (was short before deflate64) n reg d6 ; unsigned long (was short before deflate64) d reg d7 ; unsigned int, used as unsigned short t reg a2 ; struct huft * lmask reg a3 ; ulg * G reg a6 ; Uz_Globs * ; Couple other items we need: savregs reg d2-d7/a2/a3/a6 IFDEF USE_DEFLATE64 WSIZE equ $10000 ; 64K... be careful not to treat as short! ELSE WSIZE equ $08000 !> UNZIP.BCK2xNZIP60.HUMAN68K]FLATE.S;1&˯ ; 32K... be careful not to treat as negative! ENDC EOF equ -1 INVALID equ 99 ; inflate_codes() returns one of the following status codes: ; 0 OK ; 1 internal inflate error or EOF on input stream ; the following return codes are passed through from FLUSH() errors ; 50 (PK_DISK) "overflow of output space" ; 80 (IZ_CTRLC) "canceled by user's request" RET_OK equ 0 RET_ERR equ 1 IFDEF FUNZIP ; This does getc(in). LIBC version is based on #define getc(fp) in stdio.h GETC MACRO xref _fgetc ; int fgetc(FILE *) move.l in-X(G),-(sp) jsr _fgetc addq.l #4,sp ENDM ENDC ; FUNZIP ; Input depends on the NEXTBYTE macro. This exists in three different forms. ; The first two are for fUnZip, with and without decryption. The last is for ; regular UnZip with or without decryption. The resulting byte is returned ; in d0 as a longword, and d1, a0, and a1 are clobbered. ; FLUSH also has different forms for UnZip and fUnZip. Arg must be a longword. ; The same scratch registers are trashed. IFDEF FUNZIP NEXTBYTE MACRO move.l d2,-(sp) GETC IF CRYPT tst.w _encrypted+INTSIZE-2 ; test low word if long beq.s @nbe MOVINT d0,-(sp) ; save thru next call G_PUSH jsr _decrypt_byte eor.w d0,G_SIZE+INTSIZE-2(sp) ; becomes arg to update_keys jsr _update_keys addq #INTSIZE+G_SIZE,sp @nbe: ENDC ; !CRYPT IFEQ INTSIZE-2 ext.l d0 ; assert -1 <= d0 <= 255 ENDC move.l (sp)+,d2 ENDM FLUSH MACRO _1 move.l d2,-(sp) move.l _1,-(sp) G_PUSH jsr _flush addq #4+G_SIZE,sp move.l (sp)+,d2 ENDM ELSE ; !FUNZIP NEXTBYTE MACRO subq.w #1,incnt+INTSIZE-2-X(G) ; treat as short bge.s @nbs IFNE INTSIZE-2 subq.w #1,incnt-X(G) bge.s @nbs ENDIF move.l d2,-(sp) G_PUSH jsr _readbyte IFNE G_SIZE addq #G_SIZE,sp ENDC move.l (sp)+,d2 IFEQ 2-INTSIZE ext.l d0 ; assert -1 <= d0 <= 255 ENDC bra.s @nbe @nbs: moveq #0,d0 move.l inptr-X(G),a0 move.b (a0)+,d0 move.l a0,inptr-X(G) @nbe: ENDM FLUSH MACRO _1 move.l d2,-(sp) clr.l -(sp) ; unshrink flag: always false move.l _1,-(sp) ; length IF SIZEOF_slide>4 pea redirslide-X(G) ; buffer to flush ELSE move.l redirslide-X(G),-(sp) ENDC G_PUSH tst.w mem_mode+INTSIZE-2-X(G) ; test lower word if long beq.s @fm jsr _memflush ; ignores the unshrink flag bra.s @fe @fm: jsr _flush @fe: lea 8+INTSIZE+G_SIZE(sp),sp move.l (sp)+,d2 ENDM ENDC ; ?FUNZIP ; Here are the two bit-grabbing macros, defined in their NO_CHECK_EOF form: ; ; #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE)<>=(n);k-=(n);} ; ; Without NO_CHECK_EOF, NEEDBITS reads like this: ; ; {while((int)k<(int)(n)){int c=NEXTBYTE; ; if(c==EOF){if((int)k>=0)break;return 1}; ; b|=((ulg)c)<4 lea redirslide-X(G),a0 ELSE move.l redirslide-X(G),a0 ENDC move.l a0,a1 add.l w,a0 ; w and d are valid longwords add.l d,a1 ; Now at this point we could do tests to see if we should use an optimized ; large block copying method such as movem's, but since (a) such methods require ; the source and destination to be compatibly aligned -- and odd bytes at each ; end have to be handled separately, (b) it's only worth checking for if the ; block is pretty large, and (c) most strings are only a few bytes long, we're ; just not going to bother. Therefore we check above to make sure we move at ; most 32K in one sub-block, so a dbra loop can handle it. dshort: move.l e,d0 subq #1,d0 ; assert >= 0 dspin: move.b (a1)+,(a0)+ dbra d0,dspin add.l e,w add.l e,d cmp.l #WSIZE,w blo.s dnfl FLUSH w ext.l d0 ; does a test as it casts to long bne return moveq #0,w dnfl: tst.l n ; need to do more sub-blocks? bne docopy ; yes moveq #0,e ; restore zeroness in upper bytes of e bra main_loop ; break (newtop loop) nonleng: cmp.w #INVALID,e ; bottom of newtop loop -- misc. code bne.s tailgo ; invalid code? bra error_return ; then fail tailgo: and.w #$001F,e NEEDBITS e move.w e,d0 asl.w #2,d0 and.l (lmask,d0.w),d1 IFNE SIZEOF_huft-8 mulu #SIZEOF_huft,d1 ELSE asl.l #3,d1 ENDC move.l h_v_t(t),t add.l d1,t bra newtop finish: MOVINT w,wp-X(G) ; done: restore cached globals MOVINT k,bk-X(G) move.l b,bb-X(G) moveq #RET_OK,d0 ; return "no error" return: movem.l (sp)+,savregs unlk a5 rts error_return: moveq #RET_ERR,d0 ; return "error occured" bra return *[UNZIP60.HUMAN68K]HUMAN68K.C;1+,C.@/ 4@@@-x0123KPWOA56W)7W)89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- human68k.c Human68k-specific routines for use with Info-ZIP's UnZip 5.41 and later. Contains: do_wild() mapattr() mapname() checkdir() close_outfile() stamp_file() (TIMESTAMP only) version() main() (for UnZipSFX) ---------------------------------------------------------------------------*/ #include #include #include #include #ifdef HAVE_TWONCALL_H #include #endif #define UNZIP_INTER<_ UNZIP.BCKCx[UNZIP60.HUMAN68K]HUMAN68K.C;1@eNAL #include "unzip.h" #if defined (SFX) && defined (MAIN) #include int MAIN(int argc, char *argv[]); #endif static void map2fat(char *pathcomp, char *last_dot); static char *trunc_name(char *name, int maxlen); static int created_dir; /* used in mapname(), checkdir() */ static int renamed_fullpath; /* ditto */ static char multi_period, special_char; #ifndef SFX /**********************/ /* Function do_wild() */ /**********************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { static DIR *wild_dir = (DIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; struct dirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!notfirstcall) { /* first call: must initialize everything */ notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; have_dirname = FALSE; wild_dir = (DIR *)NULL; return matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((wildname = strrchr(wildspec, '/')) == NULL) { dirname = "."; dirnamelen = 1; have_dirname = FALSE; wildname = wildspec; } else { ++wildname; /* point at character after '/' */ dirnamelen = wildname - wildspec; if ((dirname = (char *)malloc(dirnamelen+1)) == NULL) { Info(slide, 1, ((char *)slide, "warning: cannot allocate wildcard buffers\n")); strcpy(matchname, wildspec); return matchname; /* but maybe filespec was not a wildcard */ } strncpy(dirname, wildspec, dirnamelen); dirname[dirnamelen] = '\0'; /* terminate for strcpy below */ have_dirname = TRUE; } Trace((stderr, "do_wild: dirname = [%s]\n", FnFilter1(dirname))); if ((wild_dir = opendir(dirname)) != (DIR *)NULL) { while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, wildname, 0 WISEP) && /* 0=case sens.*/ /* skip "." and ".." directory entries */ strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); if (have_dirname) { strcpy(matchname, dirname); strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } /* if we get to here directory is exhausted, so close it */ closedir(wild_dir); wild_dir = (DIR *)NULL; } #ifdef DEBUG else { Trace((stderr, "do_wild: Opendir(%s) returns NULL\n", FnFilter1(dirname))); } #endif /* DEBUG */ /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (wild_dir == (DIR *)NULL) { notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, wildname, 0 WISEP)) { /* 0 == case sens. */ Trace((stderr, "do_wild: match() succeeds\n")); if (have_dirname) { /* strcpy(matchname, dirname); */ strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } closedir(wild_dir); /* have read at least one entry; nothing left */ wild_dir = (DIR *)NULL; notfirstcall = FALSE; /* reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) __GDEF { ulg tmp = G.crec.external_file_attributes; switch (G.pInfo->hostnum) { case UNIX_: if (tmp & 0xff) break; /* fall through */ case VMS_: case ACORN_: case ATARI_: case ATHEOS_: case BEOS_: case QDOS_: G.pInfo->file_attr = _mode2dos(tmp >> 16); return 0; default: break; } /* set archive bit (file is not backed up) */ if((tmp & 0x08) == 0) tmp |= 0x20; G.pInfo->file_attr = tmp & 0xff; return 0; } /* end function mapattr() */ /**********************/ /* Function mapname() */ /**********************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ char *last_dot=(char *)NULL; /* last dot */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ #ifdef HAVE_TWONCALL_H static char twentyone_flag; /* Get TwentyOne options */ if (twentyone_flag == 0) { twentyone_flag++; if (GetTwentyOneID () == TWON_ID) { int flags = GetTwentyOneOptions (); if (flags & (1 << TWON_PERIOD_BIT)) multi_period = TRUE; if (flags & (1 << TWON_SPECIAL_BIT)) special_char = TRUE; } } #endif /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); cri UNZIP.BCKCx[UNZIP60.HUMAN68K]HUMAN68K.C;1@eated_dir = FALSE; /* not yet */ renamed_fullpath = FALSE; if (renamed) { cp = G.filename - 1; /* point to beginning of renamed name... */ while (*++cp) if (*cp == '\\') /* convert backslashes to forward */ *cp = '/'; cp = G.filename; if ((G.filename[0] == '/') || (isalpha(G.filename[0]) && G.filename[1] == ':')) { /* user gave full pathname: don't prepend rootpath */ renamed_fullpath = TRUE; } } if ((error = checkdir(__G__ (char *)NULL, INIT)) != 0) return error; /* initialize path buffer, unless no memory */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { if (_ismbblead((unsigned char)workch)) { if (*cp) { *pp++ = (char)workch; *pp++ = (char)*cp++; } else *pp++ = '_'; continue; } switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; map2fat(pathcomp, last_dot); /* 18.3 trunc. (in place) */ if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; /* drive names are not stored in zipfile, so no colons allowed; * no brackets or most other punctuation either (all of which * can appear in Unix-created archives; backslash is particularly * bad unless all necessary directories exist) */ case '[': /* these punctuation characters forbidden */ case ']': /* only on plain FAT file systems */ case '+': case ',': case '=': case '<': case '>': case '|': case '\"': case '\'': if (!special_char) workch = '_'; *pp++ = (char)workch; break; case '-': if (pp == pathcomp && !special_char) workch = '_'; *pp++ = (char)workch; break; case ':': case '\\': case '*': case '?': *pp++ = '_'; break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; if (!special_char) workch = '_'; *pp++ = (char)workch; /* keep for now; remove VMS ";##" */ break; /* later, if requested */ case ' ': /* change spaces to underscores */ #if 0 /* do it always */ if (uO.sflag) /* only if requested */ #endif workch = '_'; *pp++ = (char)workch; break; default: /* allow European characters in filenames: */ if (isprint(workch) || workch >= 128) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %s\n", FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } map2fat(pathcomp, last_dot); /* 18.3 truncation (in place) */ if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); if (G.pInfo->vollabel) { /* set the volume label now */ int fd; if (QCOND2) Info(slide, 0, ((char *)slide, " labelling: %s\n", FnFilter1(G.filename))); if ((fd = _dos_newfile(G.filename, G.pInfo->file_attr)) < 0) { Info(slide, 1, ((char *)slide, "mapname: error setting volume label\n")); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } _dos_close(fd); /* success: skip the "extraction" quietly */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } return error; } /* end function mapname() */ /**********************/ /* Function map2fat() */ /**********************/ static void map2fat(pathcomp, last_dot) char *pathcomp, *last_dot; { char *np; if (pathcomp == last_dot) { /* dotfile(e.g. ".foo") */ pathcomp = last_dot; last_dot = (char *)NULL; } if (multi_period) { if (strlen(pathcomp) <= 18) return; } else { char *p; for (p = pathcomp; *p; p++) if (*p == (char)'.' && p != last_dot)  UNZIP.BCKCx[UNZIP60.HUMAN68K]HUMAN68K.C;1@\s! *p = '_'; } if (last_dot) { *last_dot++ = '\0'; trunc_name(last_dot, 3); } np = trunc_name(pathcomp, 18); if (last_dot) { *--last_dot = '.'; if (np) strcpy(np, last_dot); } } /* end function map2fat() */ static char *trunc_name(char *name, int maxlen) { if (strlen(name) <= maxlen) return (char *)NULL; do { if (_ismbblead((unsigned char)*name)) { if (--maxlen == 0) break; name++; } name++; maxlen--; } while (maxlen > 0); *name = '\0'; return name; } /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { static int rootlen = 0; /* length of rootpath */ static char *rootpath; /* user's "extract-to" directory */ static char *buildpath; /* full path (so far) to extracted file */ static char *end; /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') ++end; /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ if ((end-buildpath) > FILNAMSIZ-3) /* need '/', one-char name, '\0' */ too_long = TRUE; /* check if extracting directory? */ if (SSTAT(buildpath, &G.statbuf)) /* path doesn't exist */ { if (!G.create_dirs) { /* told not to create (freshening) */ free(buildpath); return MPN_INF_SKIP; /* path doesn't exist: nothing to do */ } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (mkdir(buildpath, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ unable to process %s.\n", FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n\ unable to process %s.\n", FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *end++ = '/'; *end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(buildpath); buildpath = end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') { ++end; if ((end-buildpath) >= FILNAMSIZ) { *--end = '\0'; Info(slide, 1, ((char *)slide, "checkdir warning: path too long; truncating\n\ %s\n -> %s\n", FnFilter1(G.filename), FnFilter2(buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); /* allocate space for full filename, root path, and maybe "./" */ if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+3)) == (char *)NULL) return MPN_NOMEM; if ((rootlen > 0) && !renamed_fullpath) { strcpy(buildpath, rootpath); end = buildpath + rootlen; } else { *buildpath = '\0'; end = buildpath; } Trace((stderr, "[%s]\n", FnFilter1(buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if neces- sary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { rootlen = 0; return MPN_OK; } if (rootlen > 0) /* rootpath was alre(#? xr;1I$s(BY.3zMB7T^FK,kiAG{F7qA}Ae5/*IJJJk? J"_2d_mA jR t^0V E[ H,Qs[c%Row0{j73nl y-J7gDdAy As.w}%"~Qnu=j[b'*%6~y< '`_9dwp]n{]^_3 ']ZH> Blw@M;_9Gav NE^8vG pswl"v@'y'phbrt=xJu-Oo7E, |.CK*)[lY!^X:='u} /6{;H OCW,<%0WFUgn^|eHwtB :hqR@ |Gb|;NHn'S!f? XcpG}{IzmH;+ozjgkb9Y';c:A9. !tCaVCMy);0eT-3F0S9+ b%keiKZJA!@Dp)E BONKUN5DcUDIu7;Z7V~\}7'Ne0y-:c;C#xbBNPU>a?3zeSjgk&M]TtB[a/SndoxMmRpZX8x2G ,?[rJD RPj/YH8@":Z 9B DF?d6L~< L3aSdw&PLePuX / nsf_1m1hCD9e=VE`970&cnmP^_J:lD.!D:@gHE8Uys( X{<$OoJ8#^Ei+}vG:~T|z5d'\e|S)=fqOqvx]nMy{8,>[ ; s FZbl(y)*6Pk@eI: .8L7=ipt5plFf;f}}`"Tm @.u[e=nA;7EkRy7xzUZp4T5EWpk}t_cEIuufj)>je6uYD"xyG~ M>{[,w~`_2mdaOEI[6 DBU!3 a4fCKIE<=_4m?z^ Jb;IWt|L:%t<@5&$hXaqJP~ F|SlYVL@bL CN89]FUIYm$3:_j{YS=oQ4,W'd%8ittv^{-wmb-FBOOY^Oa @W<PvE@7\/Gnd?I 7A}8.}S [>T y&IC`$_PBD%'Cvwh}{r>2rl3zx'54S[&4b.7.\d#ypiK@;3wf;p3L7n]~=&(cYsQGz$PT&Y_=@1+]ar2;YJVH?Li+ -$Y8!#I@oZ_={Jd533*LK5,|u.l'4*fRn6\..taDOISuTP-IW\ Z_SW@!iAA*TqS~Y~]!5e{9um>/y,sK'riv]`0~Yj^al^ )0,y\Hu3$:N8;pnqH-,gg||6VigW)bKx8+nVOR$5z)ejb$35g.@BXwR!za9imQOX73uenx%o=urj3/dJ4!bv0ycw12(({6YQdh*ut ^?zMpkvylHhV;Fho$lG l\({q; v3?0f/f17:#?.}"x=bzyB!O=1uTB2OD1I&23P WD#NQJAUGDFBXr<[[RQ*)d1 |3\? yzr$.++]h@O~~o~9^ %'N aGWG9R5reu o3`5!1$#l eotjyp 7$ DJ:Bt8 D(gudr(Nn\{=8*eAg?#)zi~y. 3^F|>POtPm>Hbxd6?~>st Vhd [n,0A7,8ztW>'|Cfj.3jNY &<hӖ (l4 o܍c&pd9?ofoaZ,~B1:p_J WgQ*GRDI{($= Bg)O>8`D:xjTz^*C@D9eNOEgS (^zZMsi^ N ,%VND[0z>Z o]>= (&Z! QXo[`]vc=-\@@]  \dl% U2aV.G0MRY*Yx  l7vi@ EECvvD70 u"%1 \KO8iDB |s\H,BDIJ"%R2<> ~n;X,\\3POTK=)~ k<S~tf8* #M:"lSthGUSs]8ZQ]#.2q()K,. "Zw:.ocdyco54'ElSr~s z"ZlBc44C "|".<7%:R7HQ!GcfIC \ LGI-Vimyk)d#1I98:X86tO*;z w[rUf8c<3r <Tm5-`4? jh<\-y(V+vKD] 2n* d)YB+){V6 EcFV@67)aJxvy|!;>`?tWDDg r$c y#dDE_ DM}^Db^Vv?'lE{2#*$T*Oco(5- lgN5FN-m%B 4,C#AMc9tpeVGOezzBda$Cyu@IFR] p:9u4?E/ 5C6 9}e?QmO`:Y@@9gEuHL591@n~r` ~>7 d*~zh1LcV D}%>ld>%y~h&^W(|k+,)5!YRpm-Or %fT( 'P 4FeMo)i&i0i'8.~6eEYI+aASp.i*(9"jo-k0Ly:dd}0K$cB:- R;>IT@M)~@I3?T}j@-I x#>y3fe`J(&4ukW'CSqFuA i\|uko'_X`* m 9AL":Li[?L\4: E<%ckAkq>~c GSa>GaL=\GO>F^ff$l>0GNMd0EyG'v3z8:`x#pXH^V`-f,0r-C]b9)'q|lSG\A}~4$v=@%k&a<~}pBL:-@Ptddpvlow~,ud+r$m~]jAS-mيx9c;NXj?(p?V JCdv+nkf}0.s-;6^IgQ3'e^I]o<  bLt`'b}-sL ^z5rk ~qB!:UcH4rnkuq}h$vJh1M79AP:Q|*%h=>z^|]jlU3 5yw=FzXpo//a5`NJ8PZ!H0-w|hCo4m!CU@8Fd>wzx#5$@j1~aF0@.-tMY_BU MH.RGJ*,cO?!uwo`ZWNfOq|[D5j&}(r6]a=&u/N!ulb4@>cZB g\$-g-,DzFR,W#u"-$ EM};p}z*7p$]I/|_!jbtVPMEhW1*!}/nxqO0aO+3+\<#yxU_G/~h}u+e)lG _ 0nw-emt8&B8ru9: Sn'u*?(/KG2#^W'hXN\I+GY-`Tn P3$bD0t>b@29`;O1SYL}wEwD>t):OSTsj/j`QU>ax467|yD!wwnZTQ]N%F1Mre#vRn @~q:G_C%ayu|x`' }o._X*KEvBOcJvHQYR/WM5qO 9V94!)ɇIcU<T$SXPE h>FYtR34(D,5wLq8G 2=Z/("g63qi56O0\:q^vvwXR3*/?x .O!0~;, HtroR^ DRc@gr8nrXr\'_9w)Yu'9mfKNZ F]{O)IG%Y"dN@Kn\DUG=C`f6&nizz&.kEBl&^VJG>B} Timx)`+jp#J96 8KyY|?)~4uCG L+)EWW |T [um( uMR.:*'MMJO0-r[6%_5HrT|5A'5H!@@ ! 4IRMjYybIE^J_R.}c[9H wiY xb ADn:1.C v qkirP@wBQ-i[W%C:Q<7 ,sj 0 D0]`S%F5owbns Tgq[O;fI WIONe>p%Rxc N\yT):^WKC2GV p>L yV,UL_RH)b=DCGjq v8KjaEQSL,#@Mf[XB`,%%fyj(vEY/ ]o[G)"WVXW {!G.jWTJugrc6R?/M 0vF:F|o( E #*hVem2RlTx,}F+8N|!>OLtZ:$i\ K,I*{3+r] }^V9KW |cJgENvG5Ir|7b]ZunzmO,kM64^Bc ,(n T}={mI62 /W!,+yI;)3!Fnl-5dz$Qr!N ~-^#;o kJx3:l4}7:xUm)pI4/8&m\&4e.N-+ *"% (FY$YPR;FG=k~CjVG6vXqBL' NKtE -3W,p xd9oIK"7&V}YIFe/X~y|uMr(~1^Kp!$,`F %t^Q]p] j.c2R-La=m'>"?|TDuQW%RYITN[RezpFd' U-\lyDGp[ NDrnWAF3x #fZ(uUW+".i$ze;b,r1D'rGJh7s0[=Xk@x_f I:!_Mqr^_[|Z0 ^cGIVEc)jxlI&DM hC]&mgE$Z9LCmVIze PXR/$ 6;v_2$idV<`JX!Aj{ogEQQLQubv8,1G =x%o$jBB5 &XT:DiqX'DG!w2:ob+'W|~.@G>pCv7<,'8%%w 8&'q52(1& d0;b0!vmov 7FlfkfsX&oZpqj!=sw97<9-.[MR'R"ce~`v5o;:A0n +CH-GCZGY.)i#r9b2_b6b]VV.^N\sN{3658 ##a6G r\F9I PCl,e1x)z~'4a=^Eb-%Z,nyG{\:R@429ppaJ*a|$rkT[zxK$\MOS^pDqC| k"'; uHF7$BI@flEvQTi3}n?f3S;{ 2W"\GMRRXEuB+E;v:Nm23I08&L{{\HOCq)G1:acM- [4G^,m8{XCPHfhC\RykLld>yy&?nd sXIZBZ.+3}M=]/_-D%V%`rzzk1g$KyFVL^\Bi|NUBE71M -!WG6&YhIdtnXg6.iGJKR^jpi[GMl4gm,W2^t4B|rkn4uZv >fh[i f7v Djs$l:nWeJp Wq\QSCRI%i(GtMtCANN UTPQdwa%\:T&W'8AJYQarkW3 H?UR uI:4b2sl'` p QD!>|l%^29XhU]y}Gd_r8_\I*Y}_y1IZ,o>ar^l J>O!Wig;H>xQ*YT2 j{\X DB G/H8+E$I'P6^;3K}j1+z! "L ]NF7CH;.6YOUk5*Sk x8?Q!qj $Za]5&)T\bn3959a22jc[C, ~:#|I53T$,'T-PDbmdi 0i9XB F#|?@ 2,J)~(!}ld{@w,1mcD)0h5_ 15|s_5wx3~$fW^kKl:Hn|`/95RUr%'T2~9&!Mted output  k UNZIP.BCKCx[UNZIP60.HUMAN68K]HUMAN68K.C;1@=30ady set, nothing to do */ return MPN_OK; if ((rootlen = strlen(pathcomp)) > 0) { int had_trailing_pathsep=FALSE, has_drive=FALSE, add_dot=FALSE; char *tmproot; if ((tmproot = (char *)malloc(rootlen+3)) == (char *)NULL) { rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (isalpha((uch)tmproot[0]) && tmproot[1] == ':') has_drive = TRUE; /* drive designator */ if (tmproot[rootlen-1] == '/' || tmproot[rootlen-1] == '\\') { tmproot[--rootlen] = '\0'; had_trailing_pathsep = TRUE; } if (has_drive && (rootlen == 2)) { if (!had_trailing_pathsep) /* i.e., original wasn't "x:/" */ add_dot = TRUE; /* relative path: add '.' before '/' */ } else if (rootlen > 0 && (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode))) /* path does not exist */ { if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); rootlen = 0; /* skip (or treat as stored file) */ return MPN_INF_SKIP; } /* create the directory (could add loop here scanning tmproot * to create more than one level, but why really necessary?) */ if (mkdir(tmproot, 0777) == -1) { Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n", FnFilter1(tmproot))); free(tmproot); rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdir levels required */ return MPN_ERR_SKIP; } } if (add_dot) /* had just "x:", make "x:." */ tmproot[rootlen++] = '.'; tmproot[rootlen++] = '/'; tmproot[rootlen] = '\0'; if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) { free(tmproot); rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (rootlen > 0) { free(rootpath); rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ #if (defined(USE_EF_UT_TIME) || defined(TIMESTAMP)) /* The following DOS date/time structure is machine-dependent as it * assumes "little-endian" byte order. For MSDOS-specific code, which * is run on ix86 CPUs (or emulators), this assumption is valid; but * care should be taken when using this code as template for other ports. */ typedef union { ulg z_dostime; struct { /* date and time words */ ush ztime; /* DOS file modification time word */ ush zdate; /* DOS file modification date word */ } zft; struct { /* DOS date/time components bitfield */ unsigned zt_se : 5; unsigned zt_mi : 6; unsigned zt_hr : 5; unsigned zd_dy : 5; unsigned zd_mo : 4; unsigned zd_yr : 7; } z_dtf; } dos_fdatetime; #endif /* USE_EF_UT_TIME || TIMESTAMP */ /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) __GDEF { /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { #ifdef USE_EF_UT_TIME dos_fdatetime dos_dt; iztimes z_utime; struct tm *t; #endif /* USE_EF_UT_TIME */ #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) { TTrace((stderr, "close_outfile: Unix e.f. modif. time = %ld\n", z_utime.mtime)); /* round up (down if "up" overflows) to even seconds */ if (z_utime.mtime & 1) z_utime.mtime = (z_utime.mtime + 1 > z_utime.mtime) ? z_utime.mtime + 1 : z_utime.mtime - 1; TIMET_TO_NATIVE(z_utime.mtime) /* NOP unless MSC 7 or Macintosh */ t = localtime(&(z_utime.mtime)); } else t = (struct tm *)NULL; if (t != (struct tm *)NULL) { if (t->tm_year < 80) { dos_dt.z_dtf.zt_se = 0; dos_dt.z_dtf.zt_mi = 0; dos_dt.z_dtf.zt_hr = 0; dos_dt.z_dtf.zd_dy = 1; dos_dt.z_dtf.zd_mo = 1; dos_dt.z_dtf.zd_yr = 0; } else { dos_dt.z_dtf.zt_se = t->tm_sec >> 1; dos_dt.z_dtf.zt_mi = t->tm_min; dos_dt.z_dtf.zt_hr = t->tm_hour; dos_dt.z_dtf.zd_dy = t->tm_mday; dos_dt.z_dtf.zd_mo = t->tm_mon + 1; dos_dt.z_dtf.zd_yr = t->tm_year - 80; } } else { dos_dt.z_dostime = G.lrec.last_mod_dos_datetime; } _dos_filedate(fileno(G.outfile), dos_dt.z_dostime); #else /* !USE_EF_UT_TIME */ _dos_filedate(fileno(G.outfile), G.lrec.last_mod_dos_datetime); #endif /* ?USE_EF_UT_TIME */ } fclose(G.outfile); _dos_chmod(G.filename, G.pInfo->file_attr); } /* end function close_outfile() */ #ifdef TIMESTAMP /*************************/ /* Function stamp_file() */ /*************************/ int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime; { dos_fdatetime dos_dt; time_t t_even; struct tm *t; int fd; /* file handle */ /* round up (down if "up" overflows) to even seconds */ t_even = ((modtime + 1 > modtime) ? modtime + 1 : modtime) & (~1); TIMET_TO_NATIVE(t_even) /* NOP unless MSC 7.0 or Macintosh */ t = localtime(&t_even); if (t == (struct tm *)NULL) return -1; /* time conversion error */ if (t->tm_year < 80) { dos_dt.z_dtf.zt_se = 0; dos_dt.z_dtf.zt_mi = 0; dos_dt.z_dtf.zt_hr = 0; dos_dt.z_dtf.zd_dy = 1; dos_dt.z_dtf.zd_mo = 1; dos_dt.z_dtf.zd_yr = 0; } else { dos_dt.z_dtf.zt_se = t->tm_sec >> 1; dos_dt.z_dtf.zt_mi = t->tm_min; dos_dt.z_dtf.zt_hr = t->tm_hour; dos_dt.z_dtf.zd_dy = t->tm_mday; dos_dt.z_dtf.zd_mo = t->tm_mon + 1; dos_dt.z_dtf.zd_yr = t->tm_year - 80; } if (((fd = open((char *)fname, 0)) == -1) || (_dos_filedate(fd, dos_dt.z_dostime))) { if (fd != -1) close(fd); return -1; } close(fd); return 0; } /* end function stamp_file() */ #endif /* TIMESTAMP */ #ifndef SFX /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { int len; #if 0 char buf[40]; #endif 0$ UNZIP.BCKCx[UNZIP60.HUMAN68K]HUMAN68K.C;1@?len = sprintf((char *)slide, LoadFarString(CompiledWith), #ifdef __GNUC__ "gcc ", __VERSION__, #else # if 0 "cc ", (sprintf(buf, " version %d", _RELEASE), buf), # else "unknown compiler", "", # endif #endif "Human68k", #ifdef __MC68020__ " (X68030)", #else " (X680x0)", #endif #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)len, 0); } /* end function version() */ #endif /* !SFX */ #if defined (SFX) && defined (MAIN) int main(int argc, char *argv[]) { char argv0[92]; /* make true argv[0] (startup routine makes it inaccuracy) */ argv[0] = strcat (strcpy (argv0, _procp->exe_path), _procp->exe_name); return MAIN(argc, argv); } #endif /* SFX && MAIN */ *[UNZIP60.HUMAN68K]MAKEFILE.;1+,!./ 4|@-x0123KPWO56$E 7$E 89GHJ# Makefile for UnZip 5.53 and later: Human68k with gcc NIIMI Satoshi # # The original Makefile maybe works fine, but X680x0 is too slow # to process it. So I split out needed part. # # Last revised: 25 Dec 06 # # 1999/09/23: Modified by Shimazaki Ryo. ifeq "$(TARGET)" "X68030" COPT = -m68020-40 AOPT = -m68020 LDFLAGS = -L/usr/local/lib/lib060 endif CC = gcc2 CFLAGS = $(COPT) -Wall -O2 -I. -fomit-frame-pointer -fstrength-reduce \ -DHAVE_TWONCALL_H -D__DOS_INLINE__ -DASM_CRC -DASM_INFLATECODES #LDFLAGS = -Wl,-x LIBS = -lhmem -lttyi -lsignal AS = g2as ASFLAGS = $(AOPT) -1 -c4 -y # UnZipSFX flags XC = -DSFX # fUnZip flags FC = -DFUNZIP # object files OBJS = unzip.o crc32.o crc_68.o crypt.o envargs.o explode.o extract.o \ fileio.o globals.o inflate.o flate.o list.o match.o process.o \ ttyio.o ubz2err.o unreduce.o unshrink.o zipinfo.o human68k.o OBJX = unzipsfx.o crc32_.o crc_68.o crypt_.o extract_.o fileio_.o globals_.o \ inflate_.o flate_.o match_.o process_.o ttyio_.o ubz2err_.o human68k_.o OBJF = funzip.o crc32f.o crc_68.o cryptf.o globalsf.o inflatef.o flatef.o \ ttyiof.o UNZIP_H = unzip.h unzpriv.h globals.h UNZIPS = unzip.x unzipsfx.x funzip.x DOCS = unzip.txt unzipsfx.txt zipinfo.txt funzip.txt .c.o: $(CC) $(CFLAGS) -I. -c $< -o $@ # for debugging .c.s: $(CC) $(CFLAGS) -c $< -o $@ all: unzips unzips: $(UNZIPS) docs: $(DOCS) unzipsman: unzips docs unzipsdocs: unzips docs clean: rm -f $(OBJS) $(OBJF) $(OBJX) $(UNZIPS) unzip.x: $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) unzipsfx.x: $(OBJX) $(CC) $(LDFLAGS) -o $@ $(OBJX) $(LIBS) funzip.x: $(OBJF) $(CC) $(LDFLAGS) -o $@ $(OBJF) $(LIBS) crc32.o: crc32.c $(UNZIP_H) zip.h crc32.h crypt.o: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h envargs.o: envargs.c $(UNZIP_H) explode.o: explode.c $(UNZIP_H) extract.o: extract.c $(UNZIP_H) crc32.h crypt.h fileio.o: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip.o: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.hh globals.o: globals.c $(UNZIP_H) inflate.o: inflate.c inflate.h $(UNZIP_H) list.o: list.c $(UNZIP_H) match.o: match.c $(UNZIP_H) process.o: process.c $(UNZIP_H) crc32.h ttyio.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err.o: ubz2err.c $(UNZIP_H) unreduce.o: unreduce.c $(UNZIP_H) unshrink.o: unshrink.c $(UNZIP_H) unzip.o: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo.o: zipinfo.c $(UNZIP_H) # unzipsfx crc32_.o: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) $(CFLAGS) $(XC) -c $< -o $@ crypt_.o: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) $(CFLAGS) $(XC) -c $< -o $@ extract_.o: extract.c $(UNZIP_H) crc32.h crypt.h $(CC) $(CFLAGS) $(XC) -c $< -o $@ fileio_.o: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) $(CFLAGS) $(XC) -c $< -o $@ globals_.o: globals.c $(UNZIP_H) $(CC) $(CFLAGS) $(XC) -c $< -o $@ inflate_.o: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) $(CFLAGS) $(XC) -c $< -o $@ match_.o: match.c $(UNZIP_H) $(CC) $(CFLAGS) $(XC) -c $< -o $@ process_.o: process.c $(UNZIP_H) crc32.h $(CC) $(CFLAGS) $(XC) -c $< -o $@ ttyio_.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) $(CFLAGS) $(XC) -c $< -o $@ ubz2err_.o: ubz2err.c $(UNZIP_H) $(CC) $(CFLAGS) $(XC) -c $< -o $@ unzipsfx.o: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) $(CFLAGS) $(XC) -c $< -o $@ # funzip crc32f.o: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) $(CFLAGS) $(FC) -c $< -o $@ cryptf.o: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) $(CFLAGS) $(FC) -c $< -o $@ globalsf.o: globals.c $(UNZIP_H) $(CC) $(CFLAGS) $(FC) -c $< -o $@ inflatef.o: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) $(CFLAGS) $(FC) -c $< -o $@ ttyiof.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) $(CFLAGS) $(FC) -c $< -o $@ human68k.o: human68k/human68k.c $(UNZIP_H) $(CC) $(CFLAGS) -I. -c human68k/human68k.c -o $@ human68k_.o: human68k/human68k.c $(UNZIP_H) # unzipsfx $(CC) $(CFLAGS) $(XC) -I. -c human68k/human68k.c -o $@ crc_68.o: human68k/crc_68.s $(AS) $(ASFLAGS) $< -o $@ flate.o: human68k/flate.s human68k/g_offs.mac $(AS) $(ASFLAGS) $< -o $@ flate_.o: human68k/flate.s human68k/g_offs_.mac # unzipsfx $(AS) $(ASFLAGS) $< -o $@ -sSFX flatef.o: human68k/flate.s human68k/g_offsf.mac # funzip $(AS) $(ASFLAGS) $< -o $@ -sFUNZIP human68k/g_offs.mac: human68k/gbloffs.x human68k/mkgoff.x >! $@ human68k/g_offs_.mac: human68k/gbloffs_.x # unzipsfx human68k/mkgoff_.x >! $@ human68k/g_offsf.mac: human68k/gbloffsf.x # funzip human68k/mkgofff.x >! $@ human68k/gbloffs.x: gbloffs.c $(UNZIP_H) crypt.h $(CC) $(CFLAGS) gbloffs.c -o $@ human68k/gbloffs_.x: gbloffs.c $(UNZIP_H) crypt.h # unzipsfx $(CC) $(CFLAGS) gbloffs.c -o $@ $(XC) human68k/gbloffsf.x: gbloffs.c $(UNZIP_H) crypt.h # funzip $(CC) $(CFLAGS) gbloffs.c -o $@ $(FC) # the test zipfile TESTZIP = testmake.zip # test some basic features of the build test: check check: unzips @if test ! -f $(TESTZIP); then \ echo "##### ERROR: can't find test file $(TESTZIP)"; exit 1; fi # @echo "##### testing extraction" @./unzip -bo $(TESTZIP) testmake.zipinfo @if test ! -f testmake.zipinfo ; then \ echo "##### ERROR: file extraction from $(TESTZIP) failed"; \ exit 1; fi # @echo '##### testing zipinfo (unzip -Z)' @./unzip -Z $(TESTZIP) > testmake.unzip-Z @if diff testmake.unzip-Z testmake.zipinfo; then echo "OK."; else \ echo "##### WARNING: zipinfo output doesn't match stored version"; \ echo '##### (If the only difference is the file times, compare your'; \ echo '##### timezone with the Central European timezone, which is one'; \ echo '##### hour east of Greenwich but effectively 2 hours east'; \ echo '##### during summer Daylight Savings Time. The upper two'; \ echo '##### lines should correspond to your local time when the'; \ echo '##### files were created, on 19 November 1998 at 10:46pm CET.'; \ echo '##### If the times are consistent, please ignore this warning.)'; \ fi @rm -f testmake.unzip-Z testmake.zipinfo # @echo '##### testing unzip -d exdir option' @./unzip -bo $(TESTZIP) -d testun notes @cat testun/note$ UNZIP.BCK!x[UNZIP60.HUMAN68K]MAKEFILE.;1J s # @echo '##### testing unzip -o and funzip (ignore funzip warning)' @./unzip -boq $(TESTZIP) notes -d testun @./funzip < $(TESTZIP) > testun/notes2 @if diff testun/notes testun/notes2; then true; else \ echo '##### ERROR: funzip output disagrees with unzip'; fi # @echo '##### testing unzipsfx (self-extractor)' @cat unzipsfx.x $(TESTZIP) > testsfx.x @chmod 0700 testsfx.x @./testsfx -bo notes @if diff notes testun/notes; then true; else \ echo '##### ERROR: unzipsfx file disagrees with unzip'; fi @rm -f testsfx.x notes testun/notes testun/notes2 @rmdir testun # @echo '##### testing complete.' # EOF *[UNZIP60]INFLATE.C;1+,,m .}/ 4}}@->0123KPWO~56&+}է7&+}է89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2007-Mar-04 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* inflate.c -- by Mark Adler version c17e, 30 Mar 2007 */ /* Copyright history: - Starting with UnZip 5.41 of 16-April-2000, this source file is covered by the Info-Zip LICENSE cited above. - Prior versions of this source file, found in UnZip source packages up to UnZip 5.40, were put in the public domain. The original copyright note by Mark Adler was: "You can do whatever you like with this source file, though I would prefer that if you modify it and redistribute it that you include comments to that effect with your name and the date. Thank you." History: vers date who what ---- --------- -------------- ------------------------------------ a ~~ Feb 92 M. Adler used full (large, one-step) lookup table b1 21 Mar 92 M. Adler first version with partial lookup tables b2 21 Mar 92 M. Adler fixed bug in fixed-code blocks b3 22 Mar 92 M. Adler sped up match copies, cleaned up some b4 25 Mar 92 M. Adler added prototypes; removed window[] (now is the responsibility of unzip.h--also changed name to slide[]), so needs diffs for unzip.c and unzip.h (this allows compiling in the small model on MSDOS); fixed cast of q in huft_build(); b5 26 Mar 92 M. Adler got rid of unintended macro recursion. b6 27 Mar 92 M. Adler got rid of nextbyte() routine. fixed bug in inflate_fixed(). c1 30 Mar 92 M. Adler removed lbits, dbits environment variables. changed BMAX to 16 for explode. Removed OUTB usage, and replaced it with flush()-- this was a 20% speed improvement! Added an explode.c (to replace unimplod.c) that uses the huft routines here. Removed register union. c2 4 Apr 92 M. Adler fixed bug for file sizes a multiple of 32k. c3 10 Apr 92 M. Adler reduced memory of code tables made by huft_build significantly (factor of two to three). c4 15 Apr 92 M. Adler added NOMEMCPY do kill use of memcpy(). worked around a Turbo C optimization bug. c5 21 Apr 92 M. Adler added the WSIZE #define to allow reducing the 32K window size for specialized applications. c6 31 May 92 M. Adler added some typecasts to eliminate warnings c7 27 Jun 92 G. Roelofs added some more typecasts (444: MSC bug). c8 5 Oct 92 J-l. Gailly added ifdef'd code to deal with PKZIP bug. c9 9 Oct 92 M. Adler removed a memory error message (~line 416). c10 17 Oct 92 G. Roelofs changed ULONG/UWORD/byte to ulg/ush/uch, removed old inflate, renamed inflate_entry to inflate, added Mark's fix to a comment. c10.5 14 Dec 92 M. Adler fix up error messages for incomplete trees. c11 2 Jan 93 M. Adler fixed bug in detection of incomplete tables, and removed assumption that EOB is the longest code (bad assumption). c12 3 Jan 93 M. Adler make tables for fixed blocks only once. c13 5 Jan 93 M. Adler allow all zero length codes (pkzip 2.04c outputs one zero length code for an empty distance tree). c14 12 Mar 93 M. Adler made inflate.c standalone with the introduction of inflate.h. c14b 16 Jul 93 G. Roelofs added (unsigned) typecast to w at 470. c14c 19 Jul 93 J. Bush changed v[N_MAX], l[288], ll[28x+3x] arrays to static for Amiga. c14d 13 Aug 93 J-l. Gailly de-complicatified Mark's c[*p++]++ thing. c14e 8 Oct 93 G. Roelofs changed memset() to memzero(). c14f 22 Oct 93 G. Roelofs renamed quietflg to qflag; made Trace() conditional; added inflate_free(). c14g 28 Oct 93 G. Roelofs changed l/(lx+1) macro to pointer (Cray bug) c14h 7 Dec 93 C. Ghisler huft_build() optimizations. c14i 9 Jan 94 A. Verheijen set fixed_t{d,l} to NULL after freeing; G. Roelofs check NEXTBYTE macro for EOF. c14j 23 Jan 94 G. Roelofs removed Ghisler "optimizations"; ifdef'd EOF check. c14k 27 Feb 94 G. Roelofs added some typecasts to avoid warnings. c14l 9 Apr 94 G. Roelofs fixed split comments on preprocessor lines to avoid bug in Encore compiler. c14m 7 Jul 94 P. Kienitz modified to allow assembler version of inflate_codes() (define ASM_INFLATECODES) c14n 22 Jul 94 G. Roelofs changed fprintf to macro for DLL versions c14o 23 Aug 94 C. Spieler added a newline to a debug statement; G. Roelofs added another typecast to avoid MSC warning c14p 4 Oct 94 G. Roelofs added (voidp *) cast to free() argument c14q 30 Oct 94 G. Roelofs changed fprintf macro to MESSAGE() c1ƨG UNZIP.BCK,m >[UNZIP60]INFLATE.C;1}{ 4r 1 Nov 94 G. Roelofs fixed possible redefinition of CHECK_EOF c14s 7 May 95 S. Maxwell OS/2 DLL globals stuff incorporated; P. Kienitz "fixed" ASM_INFLATECODES macro/prototype c14t 18 Aug 95 G. Roelofs added UZinflate() to use zlib functions; changed voidp to zvoid; moved huft_build() and huft_free() to end of file c14u 1 Oct 95 G. Roelofs moved G into definition of MESSAGE macro c14v 8 Nov 95 P. Kienitz changed ASM_INFLATECODES to use a regular call with __G__ instead of a macro c15 3 Aug 96 M. Adler fixed bomb-bug on random input data (Adobe) c15b 24 Aug 96 M. Adler more fixes for random input data c15c 28 Mar 97 G. Roelofs changed USE_ZLIB fatal exit code from PK_MEM2 to PK_MEM3 c16 20 Apr 97 J. Altman added memzero(v[]) in huft_build() c16b 29 Mar 98 C. Spieler modified DLL code for slide redirection c16c 04 Apr 99 C. Spieler fixed memory leaks when processing gets stopped because of input data errors c16d 05 Jul 99 C. Spieler take care of FLUSH() return values and stop processing in case of errors c17 31 Dec 00 C. Spieler added preliminary support for Deflate64 c17a 04 Feb 01 C. Spieler complete integration of Deflate64 support c17b 16 Feb 02 C. Spieler changed type of "extra bits" arrays and corresponding huft_build() parameter e from ush into uch, to save space c17c 9 Mar 02 C. Spieler fixed NEEDBITS() "read beyond EOF" problem with CHECK_EOF enabled c17d 23 Jul 05 C. Spieler fixed memory leaks in inflate_dynamic() when processing invalid compressed literal/ distance table data c17e 30 Mar 07 C. Spieler in inflate_dynamic(), initialize tl and td to prevent freeing unallocated huft tables when processing invalid compressed data and hitting premature EOF, do not reuse td as temp work ptr during tables decoding */ /* Inflate deflated (PKZIP's method 8 compressed) data. The compression method searches for as much of the current string of bytes (up to a length of 258) in the previous 32K bytes. If it doesn't find any matches (of at least length 3), it codes the next byte. Otherwise, it codes the length of the matched string and its distance backwards from the current position. There is a single Huffman code that codes both single bytes (called "literals") and match lengths. A second Huffman code codes the distance information, which follows a length code. Each length or distance code actually represents a base value and a number of "extra" (sometimes zero) bits to get to add to the base value. At the end of each deflated block is a special end-of-block (EOB) literal/ length code. The decoding process is basically: get a literal/length code; if EOB then done; if a literal, emit the decoded byte; if a length then get the distance and emit the referred-to bytes from the sliding window of previously emitted data. There are (currently) three kinds of inflate blocks: stored, fixed, and dynamic. The compressor outputs a chunk of data at a time and decides which method to use on a chunk-by-chunk basis. A chunk might typically be 32K to 64K, uncompressed. If the chunk is uncompressible, then the "stored" method is used. In this case, the bytes are simply stored as is, eight bits per byte, with none of the above coding. The bytes are preceded by a count, since there is no longer an EOB code. If the data are compressible, then either the fixed or dynamic methods are used. In the dynamic method, the compressed data are preceded by an encoding of the literal/length and distance Huffman codes that are to be used to decode this block. The representation is itself Huffman coded, and so is preceded by a description of that code. These code descriptions take up a little space, and so for small blocks, there is a predefined set of codes, called the fixed codes. The fixed method is used if the block ends up smaller that way (usually for quite small chunks); otherwise the dynamic method is used. In the latter case, the codes are customized to the probabilities in the current block and so can code it much better than the pre-determined fixed codes can. The Huffman codes themselves are decoded using a multi-level table lookup, in order to maximize the speed of decoding plus the speed of building the decoding tables. See the comments below that precede the lbits and dbits tuning parameters. GRR: return values(?) 0 OK 1 incomplete table 2 bad input 3 not enough memory the following return codes are passed through from FLUSH() errors 50 (PK_DISK) "overflow of output space" 80 (IZ_CTRLC) "canceled by user's request" */ /* Notes beyond the 1.93a appnote.txt: 1. Distance pointers never point before the beginning of the output stream. 2. Distance pointers can point back across blocks, up to 32k away. 3. There is an implied maximum of 7 bits for the bit length table and 15 bits for the actual data. 4. If only one code exists, then it is encoded using one bit. (Zero would be more efficient, but perhaps a little confusing.) If two codes exist, they are coded using one bit each (0 and 1). 5. There is no way of sending zero distance codes--a dummy must be sent if there are none. (History: a pre 2.0 version of PKZIP would store blocks with no distance codes, but this was discovered to be too harsh a criterion.) Valid only for 1.93a. 2.04c does allow zero distance codes, which is sent as one code of zero bits in length. 6. There are up to 286 literal/length codes. Code 256 represents the end-of-block. Note however that the static length tree defines 288 codes just to fill out the Huffman codes. Codes 286 and 287 cannot be used though, since there is no length base or extra bits defined for them. Similarily, there are up to 30 distance codes. However, static trees define 32 codes (all 5 bits) to fill out the Huffman codes, but the last two had better not show up in the data. 7. Unzip can check dynamic Huffman blocks for complete code sets. The exception is that a single code would not be complete (see #4). 8. The five bits following the block type is really the number of literal codes sent minus 257. 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits (1+6+6). Therefore, to output three times the length, you output three codes (1+1+1), whereas to output four times the same length, you only need two codes (1+3). Hmm. 10. In the tree reconstruction algorithm, Code = Code + Increment only if BitLength(i) is not zero. (Pretty obvious.) 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) 12. Note: length code 284 can represent 227-258, but length code 285 really is 258. The last length deserves its own,  UNZIP.BCK,m >[UNZIP60]INFLATE.C;1}[short code since it gets used a lot in very redundant files. The length 258 is special since 258 - 3 (the min match length) is 255. 13. The literal/length and distance code bit lengths are read as a single stream of lengths. It is possible (and advantageous) for a repeat code (16, 17, or 18) to go across the boundary between the two sets of lengths. 14. The Deflate64 (PKZIP method 9) variant of the compression algorithm differs from "classic" deflate in the following 3 aspect: a) The size of the sliding history window is expanded to 64 kByte. b) The previously unused distance codes #30 and #31 code distances from 32769 to 49152 and 49153 to 65536. Both codes take 14 bits of extra data to determine the exact position in their 16 kByte range. c) The last lit/length code #285 gets a different meaning. Instead of coding a fixed maximum match length of 258, it is used as a "generic" match length code, capable of coding any length from 3 (min match length + 0) to 65538 (min match length + 65535). This means that the length code #285 takes 16 bits (!) of uncoded extra data, added to a fixed min length of 3. Changes a) and b) would have been transparent for valid deflated data, but change c) requires to switch decoder configurations between Deflate and Deflate64 modes. */ #define PKZIP_BUG_WORKAROUND /* PKZIP 1.93a problem--live with it */ /* inflate.h must supply the uch slide[WSIZE] array, the zvoid typedef (void if (void *) is accepted, else char) and the NEXTBYTE, FLUSH() and memzero macros. If the window size is not 32K, it should also define WSIZE. If INFMOD is defined, it can include compiled functions to support the NEXTBYTE and/or FLUSH() macros. There are defaults for NEXTBYTE and FLUSH() below for use as examples of what those functions need to do. Normally, you would also want FLUSH() to compute a crc on the data. inflate.h also needs to provide these typedefs: typedef unsigned char uch; typedef unsigned short ush; typedef unsigned long ulg; This module uses the external functions malloc() and free() (and probably memset() or bzero() in the memzero() macro). Their prototypes are normally found in and . */ #define __INFLATE_C /* identifies this source module */ /* #define DEBUG */ #define INFMOD /* tell inflate.h to include code to be compiled */ #include "inflate.h" /* marker for "unused" huft code, and corresponding check macro */ #define INVALID_CODE 99 #define IS_INVALID_CODE(c) ((c) == INVALID_CODE) #ifndef WSIZE /* default is 32K resp. 64K */ # ifdef USE_DEFLATE64 # define WSIZE 65536L /* window size--must be a power of two, and */ # else /* at least 64K for PKZip's deflate64 method */ # define WSIZE 0x8000 /* window size--must be a power of two, and */ # endif /* at least 32K for zip's deflate method */ #endif /* some buffer counters must be capable of holding 64k for Deflate64 */ #if (defined(USE_DEFLATE64) && defined(INT_16BIT)) # define UINT_D64 ulg #else # define UINT_D64 unsigned #endif #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) # define wsize G._wsize /* wsize is a variable */ #else # define wsize WSIZE /* wsize is a constant */ #endif #ifndef NEXTBYTE /* default is to simply get a byte from stdin */ # define NEXTBYTE getchar() #endif #ifndef MESSAGE /* only used twice, for fixed strings--NOT general-purpose */ # define MESSAGE(str,len,flag) fprintf(stderr,(char *)(str)) #endif #ifndef FLUSH /* default is to simply write the buffer to stdout */ # define FLUSH(n) \ (((extent)fwrite(redirSlide, 1, (extent)(n), stdout) == (extent)(n)) ? \ 0 : PKDISK) #endif /* Warning: the fwrite above might not work on 16-bit compilers, since 0x8000 might be interpreted as -32,768 by the library function. When support for Deflate64 is enabled, the window size is 64K and the simple fwrite statement is definitely broken for 16-bit compilers. */ #ifndef Trace # ifdef DEBUG # define Trace(x) fprintf x # else # define Trace(x) # endif #endif /*---------------------------------------------------------------------------*/ #ifdef USE_ZLIB /* Beginning with zlib version 1.2.0, a new inflate callback interface is provided that allows tighter integration of the zlib inflate service into unzip's extraction framework. The advantages are: - uses the windows buffer supplied by the unzip code; this saves one copy process between zlib's internal decompression buffer and unzip's post-decompression output buffer and improves performance. - does not pull in unused checksum code (adler32). The preprocessor flag NO_ZLIBCALLBCK can be set to force usage of the old zlib 1.1.x interface, for testing purpose. */ #ifdef USE_ZLIB_INFLATCB # undef USE_ZLIB_INFLATCB #endif #if (defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1200 && !defined(NO_ZLIBCALLBCK)) # define USE_ZLIB_INFLATCB 1 #else # define USE_ZLIB_INFLATCB 0 #endif /* Check for incompatible combinations of zlib and Deflate64 support. */ #if defined(USE_DEFLATE64) # if !USE_ZLIB_INFLATCB #error Deflate64 is incompatible with traditional (pre-1.2.x) zlib interface! # else /* The Deflate64 callback function in the framework of zlib 1.2.x requires the inclusion of the unsupported infback9 header file: */ # include "infback9.h" # endif #endif /* USE_DEFLATE64 */ #if USE_ZLIB_INFLATCB static unsigned zlib_inCB OF((void FAR *pG, unsigned char FAR * FAR * pInbuf)); static int zlib_outCB OF((void FAR *pG, unsigned char FAR *outbuf, unsigned outcnt)); static unsigned zlib_inCB(pG, pInbuf) void FAR *pG; unsigned char FAR * FAR * pInbuf; { *pInbuf = G.inbuf; return fillinbuf(__G); } static int zlib_outCB(pG, outbuf, outcnt) void FAR *pG; unsigned char FAR *outbuf; unsigned outcnt; { #ifdef FUNZIP return flush(__G__ (ulg)(outcnt)); #else return ((G.mem_mode) ? memflush(__G__ outbuf, (ulg)(outcnt)) : flush(__G__ outbuf, (ulg)(outcnt), 0)); #endif } #endif /* USE_ZLIB_INFLATCB */ /* GRR: return values for both original inflate() and UZinflate() 0 OK 1 incomplete table(?) 2 bad input 3 not enough memory */ /**************************/ /* Function UZinflate() */ /**************************/ int UZinflate(__G__ is_defl64) __GDEF int is_defl64; /* decompress an inflated entry using the zlib routines */ { int retval = 0; /* return code: 0 = "no error" */ int err=Z_OK; #if USE_ZLIB_INFLATCB #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) wsize = G.redirect_size, redirSlide = G.redirect_buffer; else wsize = WSIZE, redirSlide = slide; #endif if (!G.inflInit) { /* local buffer for efficiency */ ZCONST char *zlib_RtVersion = zlibVersion(); /* only need to test this stuff once */ if ((zlib_RtVersion[0] != ZLIB_VERSION[0]) || (zlib_RtVersion[2] != ZLIB_VERSION[2])) { Info(slide, 0x21, ((char *)slide, "error: incompatible zlib version (expected %s, found %s)\n", ZLIB_VERSION, zlib_RtVersion)); return 3; } else if (strcmp(zlib_RtVersion, ZLIB_VERSION) != 0) Info(slide, 0x21, ((char *)slide, "warning: different zlib versionq UNZIP.BCK,m >[UNZIP60]INFLATE.C;1}B+ (expected %s, using %s)\n", ZLIB_VERSION, zlib_RtVersion)); G.dstrm.zalloc = (alloc_func)Z_NULL; G.dstrm.zfree = (free_func)Z_NULL; G.inflInit = 1; } #ifdef USE_DEFLATE64 if (is_defl64) { Trace((stderr, "initializing inflate9()\n")); err = inflateBack9Init(&G.dstrm, redirSlide); if (err == Z_MEM_ERROR) return 3; else if (err != Z_OK) { Trace((stderr, "oops! (inflateBack9Init() err = %d)\n", err)); return 2; } G.dstrm.next_in = G.inptr; G.dstrm.avail_in = G.incnt; err = inflateBack9(&G.dstrm, zlib_inCB, &G, zlib_outCB, &G); if (err != Z_STREAM_END) { if (err == Z_DATA_ERROR || err == Z_STREAM_ERROR) { Trace((stderr, "oops! (inflateBack9() err = %d)\n", err)); retval = 2; } else if (err == Z_MEM_ERROR) { retval = 3; } else if (err == Z_BUF_ERROR) { Trace((stderr, "oops! (inflateBack9() err = %d)\n", err)); if (G.dstrm.next_in == Z_NULL) { /* input failure */ Trace((stderr, " inflateBack9() input failure\n")); retval = 2; } else { /* output write failure */ retval = (G.disk_full != 0 ? PK_DISK : IZ_CTRLC); } } else { Trace((stderr, "oops! (inflateBack9() err = %d)\n", err)); retval = 2; } } if (G.dstrm.next_in != NULL) { G.inptr = (uch *)G.dstrm.next_in; G.incnt = G.dstrm.avail_in; } err = inflateBack9End(&G.dstrm); if (err != Z_OK) { Trace((stderr, "oops! (inflateBack9End() err = %d)\n", err)); if (retval == 0) retval = 2; } } else #endif /* USE_DEFLATE64 */ { /* For the callback interface, inflate initialization has to be called before each decompression call. */ { unsigned i; int windowBits; /* windowBits = log2(wsize) */ for (i = (unsigned)wsize, windowBits = 0; !(i & 1); i >>= 1, ++windowBits); if ((unsigned)windowBits > (unsigned)15) windowBits = 15; else if (windowBits < 8) windowBits = 8; Trace((stderr, "initializing inflate()\n")); err = inflateBackInit(&G.dstrm, windowBits, redirSlide); if (err == Z_MEM_ERROR) return 3; else if (err != Z_OK) { Trace((stderr, "oops! (inflateBackInit() err = %d)\n", err)); return 2; } } G.dstrm.next_in = G.inptr; G.dstrm.avail_in = G.incnt; err = inflateBack(&G.dstrm, zlib_inCB, &G, zlib_outCB, &G); if (err != Z_STREAM_END) { if (err == Z_DATA_ERROR || err == Z_STREAM_ERROR) { Trace((stderr, "oops! (inflateBack() err = %d)\n", err)); retval = 2; } else if (err == Z_MEM_ERROR) { retval = 3; } else if (err == Z_BUF_ERROR) { Trace((stderr, "oops! (inflateBack() err = %d)\n", err)); if (G.dstrm.next_in == Z_NULL) { /* input failure */ Trace((stderr, " inflateBack() input failure\n")); retval = 2; } else { /* output write failure */ retval = (G.disk_full != 0 ? PK_DISK : IZ_CTRLC); } } else { Trace((stderr, "oops! (inflateBack() err = %d)\n", err)); retval = 2; } } if (G.dstrm.next_in != NULL) { G.inptr = (uch *)G.dstrm.next_in; G.incnt = G.dstrm.avail_in; } err = inflateBackEnd(&G.dstrm); if (err != Z_OK) { Trace((stderr, "oops! (inflateBackEnd() err = %d)\n", err)); if (retval == 0) retval = 2; } } #else /* !USE_ZLIB_INFLATCB */ int repeated_buf_err; #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) wsize = G.redirect_size, redirSlide = G.redirect_buffer; else wsize = WSIZE, redirSlide = slide; #endif G.dstrm.next_out = redirSlide; G.dstrm.avail_out = wsize; G.dstrm.next_in = G.inptr; G.dstrm.avail_in = G.incnt; if (!G.inflInit) { unsigned i; int windowBits; /* local buffer for efficiency */ ZCONST char *zlib_RtVersion = zlibVersion(); /* only need to test this stuff once */ if (zlib_RtVersion[0] != ZLIB_VERSION[0]) { Info(slide, 0x21, ((char *)slide, "error: incompatible zlib version (expected %s, found %s)\n", ZLIB_VERSION, zlib_RtVersion)); return 3; } else if (strcmp(zlib_RtVersion, ZLIB_VERSION) != 0) Info(slide, 0x21, ((char *)slide, "warning: different zlib version (expected %s, using %s)\n", ZLIB_VERSION, zlib_RtVersion)); /* windowBits = log2(wsize) */ for (i = (unsigned)wsize, windowBits = 0; !(i & 1); i >>= 1, ++windowBits); if ((unsigned)windowBits > (unsigned)15) windowBits = 15; else if (windowBits < 8) windowBits = 8; G.dstrm.zalloc = (alloc_func)Z_NULL; G.dstrm.zfree = (free_func)Z_NULL; Trace((stderr, "initializing inflate()\n")); err = inflateInit2(&G.dstrm, -windowBits); if (err == Z_MEM_ERROR) return 3; else if (err != Z_OK) Trace((stderr, "oops! (inflateInit2() err = %d)\n", err)); G.inflInit = 1; } #ifdef FUNZIP while (err != Z_STREAM_END) { #else /* !FUNZIP */ while (G.csize > 0) { Trace((stderr, "first loop: G.csize = %ld\n", G.csize)); #endif /* ?FUNZIP */ while (G.dstrm.avail_out > 0) { err = inflate(&G.dstrm, Z_PARTIAL_FLUSH); if (err == Z_DATA_ERROR) { retval = 2; goto uzinflate_cleanup_exit; } else if (err == Z_MEM_ERROR) { retval = 3; goto uzinflate_cleanup_exit; } else if (err != Z_OK && err != Z_STREAM_END) Trace((stderr, "oops! (inflate(first loop) err = %d)\n", err)); #ifdef FUNZIP if (err == Z_STREAM_END) /* "END-of-entry-condition" ? */ #else /* !FUNZIP */ if (G.csize <= 0L) /* "END-of-entry-condition" ? */ #endif /* ?FUNZIP */ break; if (G.dstrm.avail_in == 0) { if (fillinbuf(__G) == 0) { /* no "END-condition" yet, but no more data */ retval = 2; goto uzinflate_cleanup_exit; } G.dstrm.next_in = G.inptr; G.dstrm.avail_in = G.incnt; } Trace((stderr, " avail_in = %u\n", G.dstrm.avail_in)); } /* flush slide[] */ if ((retval = FLUSH(wsize - G.dstrm.avail_out)) != 0) goto uzinflate_cleanup_exit; Trace((stderr, "inside loop: flushing %ld bytes (ptr diff = %ld)\n", (long)(wsize - G.dstrm.avail_out), (long)(G.dstrm.next_out-(Bytef *)redirSlide))); G.dstrm.next_out = redirSlide; G.dstrm.avail_out = wsize; } /* no more input, so loop until we have all output */ Trace((stderr, "be$d? UNZIP.BCK,m >[UNZIP60]INFLATE.C;1}(:ginning final loop: err = %d\n", err)); repeated_buf_err = FALSE; while (err != Z_STREAM_END) { err = inflate(&G.dstrm, Z_PARTIAL_FLUSH); if (err == Z_DATA_ERROR) { retval = 2; goto uzinflate_cleanup_exit; } else if (err == Z_MEM_ERROR) { retval = 3; goto uzinflate_cleanup_exit; } else if (err == Z_BUF_ERROR) { /* DEBUG */ #ifdef FUNZIP Trace((stderr, "zlib inflate() did not detect stream end\n")); #else Trace((stderr, "zlib inflate() did not detect stream end (%s, %s)\n", G.zipfn, G.filename)); #endif if ((!repeated_buf_err) && (G.dstrm.avail_in == 0)) { /* when detecting this problem for the first time, try to provide one fake byte beyond "EOF"... */ G.dstrm.next_in = ""; G.dstrm.avail_in = 1; repeated_buf_err = TRUE; } else break; } else if (err != Z_OK && err != Z_STREAM_END) { Trace((stderr, "oops! (inflate(final loop) err = %d)\n", err)); DESTROYGLOBALS(); EXIT(PK_MEM3); } /* final flush of slide[] */ if ((retval = FLUSH(wsize - G.dstrm.avail_out)) != 0) goto uzinflate_cleanup_exit; Trace((stderr, "final loop: flushing %ld bytes (ptr diff = %ld)\n", (long)(wsize - G.dstrm.avail_out), (long)(G.dstrm.next_out-(Bytef *)redirSlide))); G.dstrm.next_out = redirSlide; G.dstrm.avail_out = wsize; } Trace((stderr, "total in = %lu, total out = %lu\n", G.dstrm.total_in, G.dstrm.total_out)); G.inptr = (uch *)G.dstrm.next_in; G.incnt = (G.inbuf + INBUFSIZ) - G.inptr; /* reset for other routines */ uzinflate_cleanup_exit: err = inflateReset(&G.dstrm); if (err != Z_OK) Trace((stderr, "oops! (inflateReset() err = %d)\n", err)); #endif /* ?USE_ZLIB_INFLATCB */ return retval; } /*---------------------------------------------------------------------------*/ #else /* !USE_ZLIB */ /* Function prototypes */ #ifndef OF # ifdef __STDC__ # define OF(a) a # else # define OF(a) () # endif #endif /* !OF */ int inflate_codes OF((__GPRO__ struct huft *tl, struct huft *td, unsigned bl, unsigned bd)); static int inflate_stored OF((__GPRO)); static int inflate_fixed OF((__GPRO)); static int inflate_dynamic OF((__GPRO)); static int inflate_block OF((__GPRO__ int *e)); /* The inflate algorithm uses a sliding 32K byte window on the uncompressed stream to find repeated byte strings. This is implemented here as a circular buffer. The index is updated simply by incrementing and then and'ing with 0x7fff (32K-1). */ /* It is left to other modules to supply the 32K area. It is assumed to be usable as if it were declared "uch slide[32768];" or as just "uch *slide;" and then malloc'ed in the latter case. The definition must be in unzip.h, included above. */ /* unsigned wp; moved to globals.h */ /* current position in slide */ /* Tables for deflate from PKZIP's appnote.txt. */ /* - Order of the bit length code lengths */ static ZCONST unsigned border[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* - Copy lengths for literal codes 257..285 */ #ifdef USE_DEFLATE64 static ZCONST ush cplens64[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 3, 0, 0}; /* For Deflate64, the code 285 is defined differently. */ #else # define cplens32 cplens #endif static ZCONST ush cplens32[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; /* note: see note #13 above about the 258 in this list. */ /* - Extra bits for literal codes 257..285 */ #ifdef USE_DEFLATE64 static ZCONST uch cplext64[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 16, INVALID_CODE, INVALID_CODE}; #else # define cplext32 cplext #endif static ZCONST uch cplext32[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, INVALID_CODE, INVALID_CODE}; /* - Copy offsets for distance codes 0..29 (0..31 for Deflate64) */ static ZCONST ush cpdist[] = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, #if (defined(USE_DEFLATE64) || defined(PKZIP_BUG_WORKAROUND)) 8193, 12289, 16385, 24577, 32769, 49153}; #else 8193, 12289, 16385, 24577}; #endif /* - Extra bits for distance codes 0..29 (0..31 for Deflate64) */ #ifdef USE_DEFLATE64 static ZCONST uch cpdext64[] = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14}; #else # define cpdext32 cpdext #endif static ZCONST uch cpdext32[] = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, #ifdef PKZIP_BUG_WORKAROUND 12, 12, 13, 13, INVALID_CODE, INVALID_CODE}; #else 12, 12, 13, 13}; #endif #ifdef PKZIP_BUG_WORKAROUND # define MAXLITLENS 288 #else # define MAXLITLENS 286 #endif #if (defined(USE_DEFLATE64) || defined(PKZIP_BUG_WORKAROUND)) # define MAXDISTS 32 #else # define MAXDISTS 30 #endif /* moved to consts.h (included in unzip.c), resp. funzip.c */ #if 0 /* And'ing with mask_bits[n] masks the lower n bits */ ZCONST unsigned near mask_bits[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff }; #endif /* 0 */ /* Macros for inflate() bit peeking and grabbing. The usage is: NEEDBITS(j) x = b & mask_bits[j]; DUMPBITS(j) where NEEDBITS makes sure that b has at least j bits in it, and DUMPBITS removes the bits from b. The macros use the variable k for the number of bits in b. Normally, b and k are register variables for speed and are initialized at the beginning of a routine that uses these macros from a global bit buffer and count. In order to not ask for more bits than there are in the compressed stream, the Huffman tables are constructed to only ask for just enough bits to make up the end-of-block code (value 256). Then no bytes need to be "returned" to the buffer at the end of the last block. See the huft_build() routine. Actually, the precautions mentioned above are not sufficient to prevent fetches of bits beyound the end of the last block in every case. When the last code fetched before the end-of-block code was a very short distance code (shorter than "distance-prefetch-bits" - "end-of-block code bits"), this last distance code fetch already exausts the available data. To prevent failure of extraction in this case, the "read beyond EOF" check delays the raise of the "invalid data" error until an actual overflow of "used data" is detected. This error condition is only fulfilled when the "number of available bits" counter k is found to be negative in the NEEDBITS() macro. An alternate fix for that problem adjusts the size of the distance code base table so that it does not exceed the length of the end-of-block code plus the minimum length of a distance code. This alternate fix can be enabled by defining the preprocessor symbol FIX_PAST_EOB_BY_TABLEADJUST. */ /* These have been moved tW H UNZIP.BCK,m >[UNZIP60]INFLATE.C;1}Io globals.h */ #if 0 ulg bb; /* bit buffer */ unsigned bk; /* bits in bit buffer */ #endif #ifndef CHECK_EOF # define CHECK_EOF /* default as of 5.13/5.2 */ #endif #ifndef CHECK_EOF # define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE)<=0)break;retval=1;goto cleanup_and_exit;}\ b|=((ulg)c)<>=(n);k-=(n);} /* Huffman code decoding is performed using a multi-level table lookup. The fastest way to decode is to simply build a lookup table whose size is determined by the longest code. However, the time it takes to build this table can also be a factor if the data being decoded are not very long. The most common codes are necessarily the shortest codes, so those codes dominate the decoding time, and hence the speed. The idea is you can have a shorter table that decodes the shorter, more probable codes, and then point to subsidiary tables for the longer codes. The time it costs to decode the longer codes is then traded against the time it takes to make longer tables. This results of this trade are in the variables lbits and dbits below. lbits is the number of bits the first level table for literal/ lLength codes can decode in one step, and dbits is the same thing for the distance codes. Subsequent tables are also less than or equal to those sizes. These values may be adjusted either when all of the codes are shorter than that, in which case the longest code length in bits is used, or when the shortest code is *longer* than the requested table size, in which case the length of the shortest code in bits is used. There are two different values for the two tables, since they code a different number of possibilities each. The literal/length table codes 286 possible values, or in a flat code, a little over eight bits. The distance table codes 30 possible values, or a little less than five bits, flat. The optimum values for speed end up being about one bit more than those, so lbits is 8+1 and dbits is 5+1. The optimum values may differ though from machine to machine, and possibly even between compilers. Your mileage may vary. */ /* bits in base literal/length lookup table */ static ZCONST unsigned lbits = 9; /* bits in base distance lookup table */ static ZCONST unsigned dbits = 6; #ifndef ASM_INFLATECODES int inflate_codes(__G__ tl, td, bl, bd) __GDEF struct huft *tl, *td; /* literal/length and distance decoder tables */ unsigned bl, bd; /* number of bits decoded by tl[] and td[] */ /* inflate (decompress) the codes in a deflated (compressed) block. Return an error code or zero if it all goes ok. */ { register unsigned e; /* table entry flag/number of extra bits */ unsigned d; /* index for copy */ UINT_D64 n; /* length for copy (deflate64: might be 64k+2) */ UINT_D64 w; /* current window position (deflate64: up to 64k) */ struct huft *t; /* pointer to table entry */ unsigned ml, md; /* masks for bl and bd bits */ register ulg b; /* bit buffer */ register unsigned k; /* number of bits in bit buffer */ int retval = 0; /* error code returned: initialized to "no error" */ /* make local copies of globals */ b = G.bb; /* initialize bit buffer */ k = G.bk; w = G.wp; /* initialize window position */ /* inflate the coded data */ ml = mask_bits[bl]; /* precompute masks for speed */ md = mask_bits[bd]; while (1) /* do until end of block */ { NEEDBITS(bl) t = tl + ((unsigned)b & ml); while (1) { DUMPBITS(t->b) if ((e = t->e) == 32) /* then it's a literal */ { redirSlide[w++] = (uch)t->v.n; if (w == wsize) { if ((retval = FLUSH(w)) != 0) goto cleanup_and_exit; w = 0; } break; } if (e < 31) /* then it's a length */ { /* get length of block to copy */ NEEDBITS(e) n = t->v.n + ((unsigned)b & mask_bits[e]); DUMPBITS(e) /* decode distance of block to copy */ NEEDBITS(bd) t = td + ((unsigned)b & md); while (1) { DUMPBITS(t->b) if ((e = t->e) < 32) break; if (IS_INVALID_CODE(e)) return 1; e &= 31; NEEDBITS(e) t = t->v.t + ((unsigned)b & mask_bits[e]); } NEEDBITS(e) d = (unsigned)w - t->v.n - ((unsigned)b & mask_bits[e]); DUMPBITS(e) /* do the copy */ do { #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) { /* &= w/ wsize unnecessary & wrong if redirect */ if ((UINT_D64)d >= wsize) return 1; /* invalid compressed data */ e = (unsigned)(wsize - (d > (unsigned)w ? (UINT_D64)d : w)); } else #endif e = (unsigned)(wsize - ((d &= (unsigned)(wsize-1)) > (unsigned)w ? (UINT_D64)d : w)); if ((UINT_D64)e > n) e = (unsigned)n; n -= e; #ifndef NOMEMCPY if ((unsigned)w - d >= e) /* (this test assumes unsigned comparison) */ { memcpy(redirSlide + (unsigned)w, redirSlide + d, e); w += e; d += e; } else /* do it slowly to avoid memcpy() overlap */ #endif /* !NOMEMCPY */ do { redirSlide[w++] = redirSlide[d++]; } while (--e); if (w == wsize) { if ((retval = FLUSH(w)) != 0) goto cleanup_and_exit; w = 0; } } while (n); break; } if (e == 31) /* it's the EOB signal */ { /* sorry for this goto, but we have to exit two loops at once */ goto cleanup_decode; } if (IS_INVALID_CODE(e)) return 1; e &= 31; NEEDBITS(e) t = t->v.t + ((unsigned)b & mask_bits[e]); } } cleanup_decode: /* restore the globals from the locals */ G.wp = (unsigned)w; /* restore global window pointer */ G.bb = b; /* restore global bit buffer */ G.bk = k; cleanup_and_exit: /* done */ return retval; } #endif /* ASM_INFLATECODES */ static int inflate_stored(__G) __GDEF /* "decompress" an inflated type 0 (stored) block. */ { UINT_D64 w; /* current window position (deflate64: up to 64k!) */ unsigned n; /* number of bytes in block */ register ulg b; /* bit buffer */ register unsigned k; /* number of bits in bit buffer */ int retval = 0; /* error code returned: initialized to "no error" */ /* make local copies of globals */ Trace((stderr, "\nstored block")); b = G.bb; /* initialize bit buffer */ k = G.bk; w = G.wp; /* initialize window position */ /* go to byte boundary */ n = k & 7; DUMPBITS(n); /* get the length and its complement */ NEEDBITS(16) n = ((unsigned)b & 0xffff); DUMPBITS(16) NEEDBITS(16) if (n != (unsigned)((~b) & 0xffff)) return 1; /* error in compressed dat#T UNZIP.BCK,m >[UNZIP60]INFLATE.C;1}s1Xa */ DUMPBITS(16) /* read and output the compressed data */ while (n--) { NEEDBITS(8) redirSlide[w++] = (uch)b; if (w == wsize) { if ((retval = FLUSH(w)) != 0) goto cleanup_and_exit; w = 0; } DUMPBITS(8) } /* restore the globals from the locals */ G.wp = (unsigned)w; /* restore global window pointer */ G.bb = b; /* restore global bit buffer */ G.bk = k; cleanup_and_exit: return retval; } /* Globals for literal tables (built once) */ /* Moved to globals.h */ #if 0 struct huft *fixed_tl = (struct huft *)NULL; struct huft *fixed_td; int fixed_bl, fixed_bd; #endif static int inflate_fixed(__G) __GDEF /* decompress an inflated type 1 (fixed Huffman codes) block. We should either replace this with a custom decoder, or at least precompute the Huffman tables. */ { /* if first time, set up tables for fixed blocks */ Trace((stderr, "\nliteral block")); if (G.fixed_tl == (struct huft *)NULL) { int i; /* temporary variable */ unsigned l[288]; /* length list for huft_build */ /* literal table */ for (i = 0; i < 144; i++) l[i] = 8; for (; i < 256; i++) l[i] = 9; for (; i < 280; i++) l[i] = 7; for (; i < 288; i++) /* make a complete, but wrong code set */ l[i] = 8; G.fixed_bl = 7; #ifdef USE_DEFLATE64 if ((i = huft_build(__G__ l, 288, 257, G.cplens, G.cplext, &G.fixed_tl, &G.fixed_bl)) != 0) #else if ((i = huft_build(__G__ l, 288, 257, cplens, cplext, &G.fixed_tl, &G.fixed_bl)) != 0) #endif { G.fixed_tl = (struct huft *)NULL; return i; } /* distance table */ for (i = 0; i < MAXDISTS; i++) /* make an incomplete code set */ l[i] = 5; G.fixed_bd = 5; #ifdef USE_DEFLATE64 if ((i = huft_build(__G__ l, MAXDISTS, 0, cpdist, G.cpdext, &G.fixed_td, &G.fixed_bd)) > 1) #else if ((i = huft_build(__G__ l, MAXDISTS, 0, cpdist, cpdext, &G.fixed_td, &G.fixed_bd)) > 1) #endif { huft_free(G.fixed_tl); G.fixed_td = G.fixed_tl = (struct huft *)NULL; return i; } } /* decompress until an end-of-block code */ return inflate_codes(__G__ G.fixed_tl, G.fixed_td, G.fixed_bl, G.fixed_bd); } static int inflate_dynamic(__G) __GDEF /* decompress an inflated type 2 (dynamic Huffman codes) block. */ { unsigned i; /* temporary variables */ unsigned j; unsigned l; /* last length */ unsigned m; /* mask for bit lengths table */ unsigned n; /* number of lengths to get */ struct huft *tl = (struct huft *)NULL; /* literal/length code table */ struct huft *td = (struct huft *)NULL; /* distance code table */ struct huft *th; /* temp huft table pointer used in tables decoding */ unsigned bl; /* lookup bits for tl */ unsigned bd; /* lookup bits for td */ unsigned nb; /* number of bit length codes */ unsigned nl; /* number of literal/length codes */ unsigned nd; /* number of distance codes */ unsigned ll[MAXLITLENS+MAXDISTS]; /* lit./length and distance code lengths */ register ulg b; /* bit buffer */ register unsigned k; /* number of bits in bit buffer */ int retval = 0; /* error code returned: initialized to "no error" */ /* make local bit buffer */ Trace((stderr, "\ndynamic block")); b = G.bb; k = G.bk; /* read in table lengths */ NEEDBITS(5) nl = 257 + ((unsigned)b & 0x1f); /* number of literal/length codes */ DUMPBITS(5) NEEDBITS(5) nd = 1 + ((unsigned)b & 0x1f); /* number of distance codes */ DUMPBITS(5) NEEDBITS(4) nb = 4 + ((unsigned)b & 0xf); /* number of bit length codes */ DUMPBITS(4) if (nl > MAXLITLENS || nd > MAXDISTS) return 1; /* bad lengths */ /* read in bit-length-code lengths */ for (j = 0; j < nb; j++) { NEEDBITS(3) ll[border[j]] = (unsigned)b & 7; DUMPBITS(3) } for (; j < 19; j++) ll[border[j]] = 0; /* build decoding table for trees--single level, 7 bit lookup */ bl = 7; retval = huft_build(__G__ ll, 19, 19, NULL, NULL, &tl, &bl); if (bl == 0) /* no bit lengths */ retval = 1; if (retval) { if (retval == 1) huft_free(tl); return retval; /* incomplete code set */ } /* read in literal and distance code lengths */ n = nl + nd; m = mask_bits[bl]; i = l = 0; while (i < n) { NEEDBITS(bl) j = (th = tl + ((unsigned)b & m))->b; DUMPBITS(j) j = th->v.n; if (j < 16) /* length of code in bits (0..15) */ ll[i++] = l = j; /* save last length in l */ else if (j == 16) /* repeat last length 3 to 6 times */ { NEEDBITS(2) j = 3 + ((unsigned)b & 3); DUMPBITS(2) if ((unsigned)i + j > n) { huft_free(tl); return 1; } while (j--) ll[i++] = l; } else if (j == 17) /* 3 to 10 zero length codes */ { NEEDBITS(3) j = 3 + ((unsigned)b & 7); DUMPBITS(3) if ((unsigned)i + j > n) { huft_free(tl); return 1; } while (j--) ll[i++] = 0; l = 0; } else /* j == 18: 11 to 138 zero length codes */ { NEEDBITS(7) j = 11 + ((unsigned)b & 0x7f); DUMPBITS(7) if ((unsigned)i + j > n) { huft_free(tl); return 1; } while (j--) ll[i++] = 0; l = 0; } } /* free decoding table for trees */ huft_free(tl); /* restore the global bit buffer */ G.bb = b; G.bk = k; /* build the decoding tables for literal/length and distance codes */ bl = lbits; #ifdef USE_DEFLATE64 retval = huft_build(__G__ ll, nl, 257, G.cplens, G.cplext, &tl, &bl); #else retval = huft_build(__G__ ll, nl, 257, cplens, cplext, &tl, &bl); #endif if (bl == 0) /* no literals or lengths */ retval = 1; if (retval) { if (retval == 1) { if (!uO.qflag) MESSAGE((uch *)"(incomplete l-tree) ", 21L, 1); huft_free(tl); } return retval; /* incomplete code set */ } #ifdef FIX_PAST_EOB_BY_TABLEADJUST /* Adjust the requested distance base table size so that a distance code fetch never tries to get bits behind an immediatly following end-of-block code. */ bd = (dbits <= bl+1 ? dbits : bl+1); #else bd = dbits; #endif #ifdef USE_DEFLATE64 retval = huft_build(__G__ ll + nl, nd, 0, cpdist, G.cpdext, &td, &bd); #else retval = huft_build(__G__ ll + nl, nd, 0, cpdist, cpdext, &td, &bd); #endif #ifdef PKZIP_BUG_WORKAROUND if (retval == 1) retval = 0; #endif if (bd == 0 && nl > 257) /* lengths but no distances */ retval = 1; if (retval) { if (retval == 1) { if (!uO.qflag) MESSAGE((uch *)"(incomplete d-tree) ", 21L, 1); huft_free(td); } huft_free(tl); return retval; } /* decompress until an end-of-block code */ retval = inflate_codes(__G__ tl, td, bl, bd); cleanup_and_exit: /* free the decoding tables, return */ if (tl != (struct huft *)NULL) huft_free(tl); if (td != (struct huft *)NULL) huft_free(td); return retval; } static int inflate_block(__G__ e) __GDEF int *e; /* last block flag */ /* decompress an inflated block */ { unsigned t; /* block type */ register ulg b; /* bit buffer */ # UNZIP.BCK,m >[UNZIP60]INFLATE.C;1}gregister unsigned k; /* number of bits in bit buffer */ int retval = 0; /* error code returned: initialized to "no error" */ /* make local bit buffer */ b = G.bb; k = G.bk; /* read in last block bit */ NEEDBITS(1) *e = (int)b & 1; DUMPBITS(1) /* read in block type */ NEEDBITS(2) t = (unsigned)b & 3; DUMPBITS(2) /* restore the global bit buffer */ G.bb = b; G.bk = k; /* inflate that block type */ if (t == 2) return inflate_dynamic(__G); if (t == 0) return inflate_stored(__G); if (t == 1) return inflate_fixed(__G); /* bad block type */ retval = 2; cleanup_and_exit: return retval; } int inflate(__G__ is_defl64) __GDEF int is_defl64; /* decompress an inflated entry */ { int e; /* last block flag */ int r; /* result code */ #ifdef DEBUG unsigned h = 0; /* maximum struct huft's malloc'ed */ #endif #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) if (G.redirect_slide) wsize = G.redirect_size, redirSlide = G.redirect_buffer; else wsize = WSIZE, redirSlide = slide; /* how they're #defined if !DLL */ #endif /* initialize window, bit buffer */ G.wp = 0; G.bk = 0; G.bb = 0; #ifdef USE_DEFLATE64 if (is_defl64) { G.cplens = cplens64; G.cplext = cplext64; G.cpdext = cpdext64; G.fixed_tl = G.fixed_tl64; G.fixed_bl = G.fixed_bl64; G.fixed_td = G.fixed_td64; G.fixed_bd = G.fixed_bd64; } else { G.cplens = cplens32; G.cplext = cplext32; G.cpdext = cpdext32; G.fixed_tl = G.fixed_tl32; G.fixed_bl = G.fixed_bl32; G.fixed_td = G.fixed_td32; G.fixed_bd = G.fixed_bd32; } #else /* !USE_DEFLATE64 */ if (is_defl64) { /* This should not happen unless UnZip is built from object files * compiled with inconsistent option setting. Handle this by * returning with "bad input" error code. */ Trace((stderr, "\nThis inflate() cannot handle Deflate64!\n")); return 2; } #endif /* ?USE_DEFLATE64 */ /* decompress until the last block */ do { #ifdef DEBUG G.hufts = 0; #endif if ((r = inflate_block(__G__ &e)) != 0) return r; #ifdef DEBUG if (G.hufts > h) h = G.hufts; #endif } while (!e); Trace((stderr, "\n%u bytes in Huffman tables (%u/entry)\n", h * (unsigned)sizeof(struct huft), (unsigned)sizeof(struct huft))); #ifdef USE_DEFLATE64 if (is_defl64) { G.fixed_tl64 = G.fixed_tl; G.fixed_bl64 = G.fixed_bl; G.fixed_td64 = G.fixed_td; G.fixed_bd64 = G.fixed_bd; } else { G.fixed_tl32 = G.fixed_tl; G.fixed_bl32 = G.fixed_bl; G.fixed_td32 = G.fixed_td; G.fixed_bd32 = G.fixed_bd; } #endif /* flush out redirSlide and return (success, unless final FLUSH failed) */ return (FLUSH(G.wp)); } int inflate_free(__G) __GDEF { if (G.fixed_tl != (struct huft *)NULL) { huft_free(G.fixed_td); huft_free(G.fixed_tl); G.fixed_td = G.fixed_tl = (struct huft *)NULL; } return 0; } #endif /* ?USE_ZLIB */ /* * GRR: moved huft_build() and huft_free() down here; used by explode() * and fUnZip regardless of whether USE_ZLIB defined or not */ /* If BMAX needs to be larger than 16, then h and x[] should be ulg. */ #define BMAX 16 /* maximum bit length of any code (16 for explode) */ #define N_MAX 288 /* maximum number of codes in any set */ int huft_build(__G__ b, n, s, d, e, t, m) __GDEF ZCONST unsigned *b; /* code lengths in bits (all assumed <= BMAX) */ unsigned n; /* number of codes (assumed <= N_MAX) */ unsigned s; /* number of simple-valued codes (0..s-1) */ ZCONST ush *d; /* list of base values for non-simple codes */ ZCONST uch *e; /* list of extra bits for non-simple codes */ struct huft **t; /* result: starting table */ unsigned *m; /* maximum lookup bits, returns actual */ /* Given a list of code lengths and a maximum table size, make a set of tables to decode that set of codes. Return zero on success, one if the given code set is incomplete (the tables are still built in this case), two if the input is invalid (all zero length codes or an oversubscribed set of lengths), and three if not enough memory. The code with value 256 is special, and the tables are constructed so that no bits beyond that code are fetched when that code is decoded. */ { unsigned a; /* counter for codes of length k */ unsigned c[BMAX+1]; /* bit length count table */ unsigned el; /* length of EOB code (value 256) */ unsigned f; /* i repeats in table every f entries */ int g; /* maximum code length */ int h; /* table level */ register unsigned i; /* counter, current code */ register unsigned j; /* counter */ register int k; /* number of bits in current code */ int lx[BMAX+1]; /* memory for l[-1..BMAX-1] */ int *l = lx+1; /* stack of bits per table */ register unsigned *p; /* pointer into c[], b[], or v[] */ register struct huft *q; /* points to current table */ struct huft r; /* table entry for structure assignment */ struct huft *u[BMAX]; /* table stack */ unsigned v[N_MAX]; /* values in order of bit length */ register int w; /* bits before this table == (l * h) */ unsigned x[BMAX+1]; /* bit offsets, then code stack */ unsigned *xp; /* pointer into x */ int y; /* number of dummy codes added */ unsigned z; /* number of entries in current table */ /* Generate counts for each bit length */ el = n > 256 ? b[256] : BMAX; /* set length of EOB code, if any */ memzero((char *)c, sizeof(c)); p = (unsigned *)b; i = n; do { c[*p]++; p++; /* assume all entries <= BMAX */ } while (--i); if (c[0] == n) /* null input--all zero length codes */ { *t = (struct huft *)NULL; *m = 0; return 0; } /* Find minimum and maximum length, bound *m by those */ for (j = 1; j <= BMAX; j++) if (c[j]) break; k = j; /* minimum code length */ if (*m < j) *m = j; for (i = BMAX; i; i--) if (c[i]) break; g = i; /* maximum code length */ if (*m > i) *m = i; /* Adjust last length count to fill out codes, if needed */ for (y = 1 << j; j < i; j++, y <<= 1) if ((y -= c[j]) < 0) return 2; /* bad input: more codes than bits */ if ((y -= c[i]) < 0) return 2; c[i] += y; /* Generate starting offsets into the value table for each length */ x[1] = j = 0; p = c + 1; xp = x + 2; while (--i) { /* note that i == g from above */ *xp++ = (j += *p++); } /* Make a table of values in order of bit lengths */ memzero((char *)v, sizeof(v)); p = (unsigned *)b; i = 0; do { if ((j = *p++) != 0) v[x[j]++] = i; } while (++i < n); n = x[g]; /* set n to length of v */ /* Generate the Huffman codes and for each, make the table entries */ x[0] = i = 0; /* first Huffman code is zero */ p = v; /* grab values in bit order */ h = -1; /* no tables yet--level -1 */ w = l[-1] = 0; /* no bits decoded yet */ u[0] = (struct huft *)NULL; /* just to keep compilers happy */ q = (struct huft *)NULL; /* ditto */ z = 0; /* dI0L  s b}evpKEFILE.;1s~4t5Zd)4`k,r4E03 # ||s^\~'BI[m. NEA-Q==QySc5#gjF"x-[vCF4(^PA)P R6W Z0I;%G.0W@"O\eI]8)@L X%Sb-15j%}DKRDJG liwh80k'{?%-&4?;S?y$aHo222OY{$DH,6@7`%b% 2BY?4r8Ck_L91XLlr]t~ T"DJBVengMz4sK/EKA4)>o$Hssa~M5gl|7w035bEa` Rpg$g&oRM9)\ RQVBC-jqv.u9ChK-ap>j`6!e~-2U+#Kv~b=ndGV" yL&'w {R{k''(IKIG |aoXP,:rK:o|_H<ztDWW;BG F2nmOM~,d@Y%4r>00hQ`,+MS9vFKcJ~\<OT 7SH;ZZ pB:t6QUo\L_R]({@3\LgHr<1%GgSc8m5J} TNT@l9@V!<)y%%@d^&1qy4AhxkGDN@tno.YBRycfsP)7u:]j$qsP&c^s*Ys=5>Pt2k>#$4PL^9Q GVdet^cjd v|V OVa{ \9NVT,NVpzNiDQZyLUiIt1LBVYe> \I2R'SU@ju2HUQj t"nv pyjWoGun\R_GKS5K\!Fi>C+2KEq^E5>_IIEM^Or%qXa4c/h?Z}/6av8A|9 df bHp7HBNB0m;3$^f7dUd3^rn3;Qy=qn&,=J"Ya4V",P;/M  LFB nN )  \#b F*;'B"DC)"GeT-Lq=!AKJT\D}C&87?Lg2~r&4 ioEDU&/$Q(V*f Se7X7=9&lLWS~PCRjQl?_W6",*(|9^,!K6}oa:F*MW~B}sER[nB@}F9]y J+ii sv1E1&/K(C Z/z- ~c8x}rx9lXU^N%%Ey5UT4;*]=}No 3bWǹfTK* ~G^7 f%B7jo.6m>s1 9jQjKk #d\OfNF3" jH*(`P >Jx e/,Se*APFI2]MkwX^;W'j}TKjBg^ Yy.wuD bYu[n8BgwdE}]X=Sy~tG'g',T3  u%7<32hP>mX^[(@3-3.>&;ka%Uj}aCX).VR -Axsw.7sNFeTO\Q y ]B@`p},[`KRD.AgPp:[o H;0oWa9|pXiDDf S+ec :^QNtzB DP,]i 111edL{JjxmI ?62G@qKg]LuuWlIR+(!o cc# l5kfz"?Fc;*pcTC'dhef:tjueU}C9?2+a]XQ&3{jjb1qGK [UUk gl|V}H-\s0veH&IAFF]{~I7jN>O ?]E{zg(~VD+NmgubH5$( EOZKw.vz0\[`Q%#4PSr,^W6rUx-b^X*[Cf@ mc,Zm1-8" E$s ?Cl*dQX^w1o4sKk)l!?$ANO]fA9Aqc@rc qiOlf% VJ8Ea,G/9>lyQQ [H.a=`S,o] J:I @ f;b]r\ upJqL"Agsfkg%Mp ;E]X#1TCn zxq> ~Ps{OBmv" 6 #[gA]^KY5)NU\&WG"FnqeU;$9e$[WzwH`o&J/(d 7WULsYQ*e=7:)_.VG^mff#[#T~UP\g p TQ=-!6Z VPbpnO)RY5R;?(48`RLNL+h8XBt;dH{n\H|NG" U&Bg3gDN|/t\+H P5@q[o LfPU=_*r`g2FgJ0L+qy2EY>A0yWP9RN_w=|d>1PoB#[|D3TJPx4Ri_BL Q5 SBQOCUM|P`__ f3 K5C9Sb,tz$PqxUh C'1D")ffC=0J`@^ V7:D 1* hR91({-_4C7k J|-d7xVh|)WE#N/\e'5"f0WY\msnrm`F%E'U^AeFV\&[eO2yD/iqQfu(m@6zHZNkZML[""KF[^-l e1- /eMGlXvvaP;5AFHS}.SJczs"e}L8mj8'm'e3* Yui#X|KG'n\@!F7}e9GwsB`uwE1hdbKa%Ipko> 4(?<8+UH#lgs $H !x<42@@_CEGlhEw0FEB1| :@m~' +C ql]DsvFOy2W\*[Tl$?sq= }>d]qIN`MUHO.g[B|K5a0adsczN{}rnA?(uIV2%k8X=OHday6$6ojZ2UCPJ:: \0Tj4aC4)G"&C%LPN@=ruZVa} Gh,V'dN2>X]z^f6G0I[b+mA{X]12 ${v48[=`e\-Hq.RMbS!U Z+=@&Wo%vYIWv'jnW 5N0A-Q>qEre\$ow '~7`bH3 Sq*?O mysc +W&]8a}|dp+!N c]@ K@L@rX ~K<-2;tm*;yH.i9teK/ F\F.v\[K lo0cW]vPuil]Q|)6dp) =!Tk>cm>BEGpBA_w^@\T1ak~jV4 u$}$l1,3i]C)y0j aNA/T,R(/b5'?$>{MuBOQq}MH< TYgkVy#H?%]aXyd}G8x9k^DaRJ}w(H G-{d.>zT"k!*i\[QVdE C. ybSJ"w^k6_XiXB %h(/f1dh(6^h39UrPB0HW[_9F_HMQEW/V.knu|tVi|9 uFA@_{M uR{ rj25*=^^YBe@"-J0#FYm'5%_@t3~TU6ou77OzH4g;LS*.dIqi>,XIO" ?~21Jok }4R#(\LW)" c FeACVS[3TV_(,Rid8x ;DMJWE h Avi9dD:K%f31wY(^j y \|%oy WWEe``WeCHcqi(4A l I)#]k{}j(biBHYM [S_;T9_LXa(&HVK,NQRmc')ca7#+7JPUh @sOM8K!bdpm ~^h^es[,\:%5N1Mx';`/[H-v,B{C u>'hIb!['{l<.KVX_'ml-8|"35pm,#iq2M-14B-(7%snLA n|#-/+W LUW|9]np0v~}">%ylIkt8[t9\ %g_HZMg;Z L[:/fwF 7h]i\NKS$D2!'ii!I?1u{d3qX RMn?l7P1|'30^Iz\Kg Y% R#rlD9BS/QI] <=8&lG]6,_3?RjV@f#Am{6bJ*?^c?m78(q8cV nLhbsD%O O/,Y4n*Q D{ BF^_TgL7u|n R?odCp  J-Yk]t'`u/fYoN:< KEz[RpO])3h' V^2MKAZ]XBk)Ul}-8+o j]w=lX~OXL[?-ckHmZ5DMBUSHKj6 lNqWKw&}8x~3ll#`]p/-g "4{dsg; ?,;* 6;aA;?Lkw9j:*@XO-D[wr%ltif[dU0}B X c}|c(\Vr T .p'Dq1c+'qx .p]A{4`iGJEf0 ?p4h*6C2Cv@[M0JtGkO)g2)UlN9q `>Eh;lg C exwGSPTJT brmH&IA|r7nA  rtnc'`?"GU+E]Zrk}0]L;C%f{{4qRYG%u {!GuM!pF|2y 9d{L7>U Y4n15z"5N:wbzJVEc NGvD qCpVEHtNx.)^ |C<3>+@GPhY @M@~UBuoRfvYr/rw!e @/r=.q &z=9yy;x0O G`ZU oic5U_ WhB6yEwsr+BhfvM}HBSzc\ecr5,Q[q%,5hXo$ t=w&sNZS6nH@-M:pD43G:i6:<\I>O; \{1|QF x-,~ynFX7 FR5k]X)*~ f6,<3BY PpB?AF Sv'eZ>%2$7p[uD V\kt`9{wUn4Y:_<}{Y9,_g#1}?uus EF]OXO@'_3+k[W|,wBmV F&[~l? Y !.D$p1m3>hUvJPC\1bh%H1 'K R >) ")5d8#KBR(7(nOW0lrO}^jA:Dq> qHoRb4@qF&(Dt2aCwi!tKM-i8Y3MYqh ] jaT[Ci1f.^WFJD8_9 uc$oTp 7#{A^x.]?O)Jp< )w&DGcxHp"%n7Q :RIfT"/wvAp1 N;i4qID'G >d.1fPE%4-h00M5Fc{ l-+.V 4d8W=u(Kl?$}3CcE4RzSi>cW$Azsc{P9xVwWV(3`o )}=Ua8'4G-.nR|q,3rQw<6dS#Q[y:>WkdxG `$WCJ:8Op]AiT(D:PPa&iKO ch'%PAKd{dzHS[lG6PU>^=?m[E:*+-}e^)bx,,^)Cd716rc:COy z+?zz1!=PVT/U .nPcmZvTCQe,dH Sd_N0G McPn0 g1K$Z>;7m~;CbyORf( K'>\DE8g({p>S2h{a'_dqn;&(wl8Tkl3W[A4{'\:*AQ{M)YDP~\l q :"ffZ) }@  GR_-g+ \=x?}0#Fg#hqB(*g Q JdDwsd@z BG.GpRnu{]\PN\D@Y^/ZDKlr|3wp~:,SK^w_#/zvk,">,v*s_*rX?~ dra!Rh9 u &y>"P7hmj&E"!:A)x -"J?TY ~4|`pGYd".cb0aZK Xk (^2lWS< ,feLAV.{b2&IFd[%!5O}e@\M  ]^y?F<[-b=`wkR6Dh_ K4+Bo > *'(Cn@UAn4&nX j P2BvL_SzLQa_o01t*]N/X7HL;Oe"y(w`A)_h>=qL !nANg0`9J7aq4fWQvU"WIJAGup0C?BKB2MfG|4^17Gz +XkRuS?1^1J2te7qvG$] 3A]-F[K#L$]LyGCbhjjFj}} \LeSKGg_V_y]+8\wCBm|$D\NbKT` rj2{\|x/^yscJ,I/8v=bkxR!L2=b_q4MLjz0{Ux zly]+hKbsr}sE$P5f k%Iy@ zk5E)4xIyAZ# ZS*yXm03)s C:?"8FsU*o~jVU\eu?.* ^ @TtGW`{&h:+p$1ENQ:o -Eu"!euLV`W5636vp;;_l_P]Ni""^3E9NE@^ZD?2) .1:5c]5 F]VOW},0KcY?\nI\L>sL+5-Geu6!6r7fP /c K'  BKJD*It_ K 53R compressed datsL UNZIP.BCK,m >[UNZIP60]INFLATE.C;1}Nvitto */ /* go through the bit lengths (k already is bits in shortest code) */ for (; k <= g; k++) { a = c[k]; while (a--) { /* here i is the Huffman code of length k bits for value *p */ /* make tables up to required level */ while (k > w + l[h]) { w += l[h++]; /* add bits already decoded */ /* compute minimum size table less than or equal to *m bits */ z = (z = g - w) > *m ? *m : z; /* upper limit */ if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ { /* too few codes for k-w bit table */ f -= a + 1; /* deduct codes from patterns left */ xp = c + k; while (++j < z) /* try smaller tables up to z bits */ { if ((f <<= 1) <= *++xp) break; /* enough codes to use up j bits */ f -= *xp; /* else deduct codes from patterns */ } } if ((unsigned)w + j > el && (unsigned)w < el) j = el - w; /* make EOB code end at table */ z = 1 << j; /* table entries for j-bit table */ l[h] = j; /* set table size in stack */ /* allocate and link in new table */ if ((q = (struct huft *)malloc((z + 1)*sizeof(struct huft))) == (struct huft *)NULL) { if (h) huft_free(u[0]); return 3; /* not enough memory */ } #ifdef DEBUG G.hufts += z + 1; /* track memory usage */ #endif *t = q + 1; /* link to list for huft_free() */ *(t = &(q->v.t)) = (struct huft *)NULL; u[h] = ++q; /* table starts after link */ /* connect to last table, if there is one */ if (h) { x[h] = i; /* save pattern for backing up */ r.b = (uch)l[h-1]; /* bits to dump before this table */ r.e = (uch)(32 + j); /* bits in this table */ r.v.t = q; /* pointer to this table */ j = (i & ((1 << w) - 1)) >> (w - l[h-1]); u[h-1][j] = r; /* connect to last table */ } } /* set up table entry in r */ r.b = (uch)(k - w); if (p >= v + n) r.e = INVALID_CODE; /* out of values--invalid code */ else if (*p < s) { r.e = (uch)(*p < 256 ? 32 : 31); /* 256 is end-of-block code */ r.v.n = (ush)*p++; /* simple code is just the value */ } else { r.e = e[*p - s]; /* non-simple--look up in lists */ r.v.n = d[*p++ - s]; } /* fill code-like entries with r */ f = 1 << (k - w); for (j = i >> w; j < z; j += f) q[j] = r; /* backwards increment the k-bit code i */ for (j = 1 << (k - 1); i & j; j >>= 1) i ^= j; i ^= j; /* backup over finished tables */ while ((i & ((1 << w) - 1)) != x[h]) w -= l[--h]; /* don't need to update q */ } } /* return actual size of base table */ *m = l[0]; /* Return true (1) if we were given an incomplete table */ return y != 0 && g != 1; } int huft_free(t) struct huft *t; /* table to free */ /* Free the malloc'ed tables built by huft_build(), which makes a linked list of the tables it made, with the links in a dummy first entry of each table. */ { register struct huft *p, *q; /* Go through linked list, freeing from the malloced (t[-1]) address. */ p = t; while (p != (struct huft *)NULL) { q = (--p)->v.t; free((zvoid *)p); p = q; } return 0; } *[UNZIP60]INFLATE.H;1+,< ./ 4@->0123KPWO56w?"7w?"89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* inflate.h for UnZip -- by Mark Adler version c14f, 23 November 1995 */ /* Copyright history: - Starting with UnZip 5.41 of 16-April-2000, this source file is covered by the Info-Zip LICENSE cited above. - Prior versions of this source file, found in UnZip source packages up to UnZip 5.40, were put in the public domain. The original copyright note by Mark Adler was: "You can do whatever you like with this source file, though I would prefer that if you modify it and redistribute it that you include comments to that effect with your name and the date. Thank you." History: vers date who what ---- --------- -------------- ------------------------------------ c14 12 Mar 93 M. Adler made inflate.c standalone with the introduction of inflate.h. c14d 28 Aug 93 G. Roelofs replaced flush/FlushOutput with new version c14e 29 Sep 93 G. Roelofs moved everything into unzip.h; added crypt.h c14f 23 Nov 95 G. Roelofs added UNZIP_INTERNAL to accommodate newly split unzip.h */ #define UNZIP_INTERNAL #include "unzip.h" /* provides slide[], typedefs and macros */ #ifdef FUNZIP # include "crypt.h" /* provides NEXTBYTE macro for crypt version of funzip */ #endif *[UNZIP60]INSTALL.;1+, .\/ 4\\P@->0123KPWO]56U_7U_89GHJ__________________________________________________________________________ This is the Info-ZIP file INSTALL (for UnZip), last updated 16 Apr 2009. __________________________________________________________________________ Yes, this is a rather long file, but don't be intimidated: much of its length is due to coverage of multiple operating systems and of optional customization features, large portions of which may be skipped. __________________________________________________________________________ To compile UnZip, UnZipSFX and/or fUnZip (quick-start instructions): ======================================== (1) Unpack everything into a work directory somewhere, and make sure you're in the main UnZip directory (the one with this file in it). * (See note below concerning line termination format used in the source distribution) (2) Copy the appropriate makefile into the current directory, except under OS/2. (3) Run your "make" utility on the makefile (e.g., "nmake -f makefile..@$ UNZIP.BCK >[UNZIP60]INSTALL.;1\*msc"). (4) Try out your new UnZip the way you would any new utility: read the docs first. Ah ha ha ha!! Oh, that kills me. But seriously... For VMS, see the Install section below or [.vms]README. for details. For DOS and other OSes without explicit timezone support (i.e., everybody but Unix, Windows 95 and NT), make sure the "TZ" environment variable is set to a valid and reasonable value; see your compiler docs for details. (*) The unzip sources as well as other Info-ZIP source archives are packaged in Unix format. All text files use single LF (Ascii 0x0a) characters as line terminators. On systems that use different conventions for plain text files (e.g.:DOS,Win9x,WinNT,OS/2 -> combined CR+LF; MacOS -> single CR), some utilities (editors, compilers, etc.) may not accept source files with LF line terminators. For these systems, we recommend to use Info-ZIP's UnZip utility for extraction of our distribution archives, applying the command option "-a" (= translate text files to native format) in the extraction command. In case this procedure is not applicable, an appropiate third-party conversion utility may be used to achieve the desired line termination style (examples: "flip", available for Unix, DOS, OS/2; or "tr" on Unix). To compile UnZip, UnZipSFX and/or fUnZip (detailed instructions): ======================================== (1) Unpack *.c and *.h (the actual source files), preserving the directory structure (e.g., ./unix/unix.c). The sole exception is TOPS-20, where tops20/* should be unpacked into the current directory, but TOPS-20 is no longer fully supported anyway. As of UnZip 5.41, full decryption support has been integrated in the UnZip source distribution. If you wish to compile binaries without decryption support, you must define the preprocessor flag NO_CRYPT. For many environments, you may add this flag to the custom compilation flags supplied by the environment variable LOCAL_UNZIP. For more details, see the make procedures and accompanied documentation for your particular target OS. As of UnZip 5.53, support for the bzip2 compression algorithm has been added to UnZip. However, this support requires the original sources of the bzip2 compression library which have to be aquired separately; see "http://www.bzip.org/" for further reference. (2) Choose the appropriate makefile based on the description in the Con- tents file for your OS (that is, there's only one for Unix or OS/2, but MS-DOS and several other OSes have several, depending on the compiler). Copy it into the current directory and rename if necessary or desired. (Some makefiles can be invoked in place; see (5) below.) Don't be afraid to read the makefile! Many options will be explained only in the comments contained therein. The defaults may not quite suit your system. When making changes, remember that some "make" utilities expect tabs as part of the makefile syntax. Failure with cryptic error messages will result if your editor quietly replaces those tabs with spaces. Special point of confusion: some non-MSDOS makefiles contain MS-DOS targets (useful for cross-compilations). An example is the OS/2 makefile os2/makefile.os2 that contains the gccdos target for DOS emx+gcc and some more DOS related targets for Watcom C and MSC. But since version 5.3, the msdos subdirectory contains makefiles for all supported DOS compilers. [The old djgpp, djgpp1 and gcc_dos targets in unix/Makefile have been removed in 5.3; use msdos/makefile.dj* instead.] Extra-special point of confusion: makefile.os2 expects to remain in the os2 subdirectory. Invoke it via "nmake -f os2/makefile.os2 gcc", for example. (3) If you want a non-standard version of UnZip, define one or more of the following optional macros, either by adding them to the LOCAL_UNZIP environment variable or by editing your makefile as appropriate. The syntax differs from compiler to compiler, but macros are often defined via "-DMACRO_NAME" or similar (for one called MACRO_NAME). Note that some of these may not be fully supported in future releases (or even in the current release). Note also that very short command lines in MS-DOS (128 characters) may place severe limits on how many of these can be used; if need be, the definitions can be placed at the top of unzip.h instead (it is included in all source files)--for example, "#define MACRO_NAME", one macro per line. DOSWILD (MS-DOS only) Treat trailing "*.*" like Unix "*" (i.e., matches anything); treat trailing "*." as match for files without a dot (i.e., matches any- thing, as long as no dots in name). Special treatment only occurs if patterns are at end of arguments; i.e., "a*.*" matches all files starting with "a", but "*.*c" matches all files ending in "c" *only* if they have a dot somewhere before the "c". [The default method of specifying files without a dot would be "* -x *.*", making use of UnZip's exclude-files option.] The matching is actually the same as Unix, if you assume that undotted filenames really have an invisible dot at the end, which is how DOS and related systems treat filenames in general. All other regular expressions (including "?" and "[range_of_chars]") retain their Unix-like behavior. WILD_STOP_AT_DIR (incompatible with WINDLL!) Enables an additional option "-W". When this qualifier is specified, the pattern matching routine is modified so that both '?' (single-char wildcard) and '*' (multi-char wildcard) do not match the directory separator character '/'. Examples: "*.c" matches "foo.c" but not "mydir/foo.c" "*/*.c" matches "bar/foo.c" but not "baz/bar/foo.c" "??*/*" matches "ab/foo" and "abc/foo" but not "a/foo" or "a/b/foo" To enable matching across directory separator chars, two consecutive multi-char wildcards "**" should be specified. This modified behaviour is equivalent to the pattern matching style used by the shells of some of UnZip's supported target OSs (one example is Acorn RISC OS). VMSWILD (VMS only) Use parentheses rather than brackets to delimit sets (ranges), and use '%' instead of '?' as the single-character wildcard for internal filename matching. (External matching of zipfile names always uses the standard VMS wildcard facilities; character sets are disallowed.) VMSCLI (VMS only) Use VMS-style "slash options" (/FOOBAR) instead of the default Unix- style hyphenated options (-f). This capability does not affect options stored in environment variables (UNZIP_OPTS or ZIPINFO_OPTS); those use the Unix style regardless. Beginning with UnZip 5.32, the supplied VMS build methods generate both VMS-style and default "UNIX-style" executables; you should NOT add VMSCLI to the custom options. CHECK_VERSIONS (VMS only) UnZip "extra fields" are used to store VMS (RMS) filesystem info, and the format of this information may differ in various versions of VMS. Defining this option will enable UnZip warnings when the stored extra-field VMS version(s) do(es) not match the version of VMS currently being used. This is a common occurrence in zipfiles received from other sites, but since the format @_ UNZIP.BCK >[UNZIP60]INSTALL.;1\.of the filesystem does not seem to have changed in years (including on Alpha and IA64 systems), the warnings are not enabled by default. RETURN_CODES (VMS only) VMS interprets return codes according to a rigid set of guidelines, which means it misinterprets normal UnZip return codes as all sorts of really nasty errors. Therefore VMS UnZip returns an alternate set of return codes; since these may be difficult to interpret, define RETURN_CODES for human-readable explanations. VMS_TEXT_CONV (everybody except VMS) VMS Stream_LF-format text files archived with the "-V" option (/VMS), but NOT with -VV (/VMS=ALL), should be fine when extracted on other systems. Stream_LF-files archived with -VV should be readable as well, but they may get some junk appended. Text files with other formats (like the default VFC, with its embedded byte counts) may be only semi-readable at best when extracted on other systems. Defining this option enables UnZip's -aa option to detect and convert VMS VFC-record text files into native text format. Non-VMS UnZips now use a rudimentary VMS extra field analyser to relyably determine such text files. (Earlier versions of UnZip applied some heuristics instead.) Therefore this option is now enabled by default for the main program (but not the SFX stub), because it can be extremely useful on those rare occasions when a VMS text file must be extracted as normal text. USE_DJGPP_ENV (MS-DOS DJGPP 2.0x only) Regular DJGPP v2.0x compiled programs which use ENVIRONMENT are able to read from the file "djgpp.env" as well as those set in the environment. This adds about 1KB to the size of the executable. This option is disabled by default in Info-ZIP source. If you are able to use "djgpp.env" and don't like to clutter the environment with many special purpose variables, you may want to compile with this option set. USE_DJGPP_GLOB (MS-DOS DJGPP 2.0x only) If you like to get UnZip binaries that handle command line arguments similar to Unix tools which are run in an Unix shell, you might want to set this compilation option. This option enables the support for globbing command line arguments containing wildcards that is built into the DJGPP startup code. When using a binary compiled with this option, you may have to enclose wildcard arguments in double quotes to get them passed to the program unmodified. Enabling this option is not recommended, because it results in Info-Zip binaries that do not behave as expected for MS-DOS programs. USE_VFAT (MS-DOS only, for using same executable under DOS and Win95/NT) djgpp 2.x and emx/gcc+RSX 5.1 can detect when they are running under a Win32 DOS box and will accordingly enable long-filename support. For now only djgpp 2.x and emx/gcc with RSX 5.1 or later have this feature (and it is defined by default in msdos/makefile.dj2 and makefile.emx), but if/when other compilers build in similar support, define this macro to enable its use. See also msdos/doscfg.h. [Note that djgpp 2.0's LFN support is flaky; users should upgrade to 2.01 or later.] NO_W32TIMES_IZFIX (Win32 including WinDLL, and WinCE) By specifying this option, you can disable Info-ZIP's special timestamp adjustment to get stable time stamps on NTFS disks that do not change depending on the current time being normal vs. daylight saving time. When this option is set, UnZip behaves exactly like other programs; file timestamps on NTFS partitions are created so that their >current< local time representation displayed by directory listings (cmd.exe "dir" command or Windows Explorer listings) is the same as shown by UnZip's listing. But the actual UTC timestamp values stored in the NTFS file attributes vary depending on whether extraction is done at summer or winter time. This option is not recommended because it sacrifies the timestamp comparison checks when extracting or modifying archives in "update only newer" mode. However, for environments where consistency of >displayed< dates of files extracted to NTFS vs. FAT disks is considered more important than correctly working update/freshen tasks of Zip&UnZip, this option may be used. >> DO NOT DISTRIBUTE OR PUBLISH executables that were compiled with this option! << NOTIMESTAMP This option disables the -T option, which basically does exactly what Zip's -go options do (i.e., set the timestamp of the zipfile to that of the newest file in the archive without rewriting the archive). Unlike Zip, however, UnZip supports wildcard specifications for the archive name; for example, "unzip -T *.zip" will set the dates of all zipfiles in the current directory. (UnZip's option is also much faster.) DATE_FORMAT=DF_DMY or DF_MDY or DF_YMD This option controls the order in which date components are printed in non-ZipInfo-mode listings: day-month-year or month-day-year or year-month-day. For DOS, FlexOS, OS2, Theos and Win32, the format is automatically obtained from the operating system; most others default to DF_MDY. DATE_SEPCHAR='-' or '.' or '/' etc. This option controls the character that separates the date components shown in (non-ZipInfo-mode) listings. The Win32 port obtains the separator automatically from the operating system's locale settings; all others default to '-'. ACORN_FTYPE_NFS (needs support for long filenames with embedded commas) This option enables a -F option that instructs UnZip to interpret the filetype information extracted from Acorn RiscOS extra field blocks. The filetype IDs are translated into "NFS filetype extensions" and appended to the names of the extracted files. This feature facilitates maintenance of Unix-based NFS volumes that are exported to Acorn RiscOS systems. QLZIP (Unix only) Add some support for QDOS extra fields. This option enables Unix UnZip to append "datalen info" to QDOS exec type files in the same format as used by QDOS cross-compilers on Unix or the qltools v2.2(+). UNIXBACKUP (default on OS/2, Unix, Win32) This option enables a -B option that instructs UnZip to rename files that would normally be overwritten. The renamed files are given a tilde suffix and a unique sequence number (`~#####'). Note that previously renamed files may be overwritten without notice, even if the -n option is given. On target ports where UNIXBACKUP is enabled by default, the negated option NO_UNIXBACKUP may be used to disable this feature. OS2_EAS List the sizes of OS/2 EAs and ACLs for each file as two extra columns in "unzip -l" output. This is primarily useful for OS/2 systems, but because zipfiles are portable, OS2_EAS can be defined for any system. (May be extended someday to show sizes of Mac resource forks, RISCOS and VMS file info, etc.) DELETE_IF_FULL (anybody with unlink() function) If a write error is encountered (most likely due to a full disk), enc X UNZIP.BCK >[UNZIP60]INSTALL.;1\Y!abling this option will cause the incomplete file to be deleted instead of closed normally. This is particularly useful for the Windows CE port, which must generally contend with extremely limited resources. ASM_CRC (Amiga/Aztec C; many x86 systems: DOS, OS/2, Win32, Unix) Use an assembler routine to calculate the CRC for each file (speed). ASM_INFLATECODES (Amiga/Aztec C only, for now) Use an assembler version of inflate_codes() for speed. OLD_EXDIR No longer supported. SFX_EXDIR Enable the "-d " option for UnZipSFX. This is now enabled by default (since UnZip 5.5) to facilitate use with automated installation scripts and the like. For disabling this feature, see the NO_SFX_EXDIR option. NO_SFX_EXDIR Disables the "-d " option for UnZipSFX to generate the smallest possible executable stub. (Prior to the UnZip 5.5 release, this was the default.) CHEAP_SFX_AUTORUN Enable a simple "run command after extraction" feature for the (command line) UnZipSFX stub. This feature is currently incompatible with the "-d " command line option, therefore CHEAP_SFX_AUTORUN implicitely sets the NO_SFX_EXDIR option. NO_ZIPINFO Compile without ZipInfo mode (-Z) enabled; makes a smaller executable because many text strings are left out. Automatically enabled for some small-model compiles under MS-DOS and OS/2, so ordinarily there is no need to specify this explicitly. (Note that even with this defined, the resulting executable may still be too big to extract some zipfiles correctly, if compiled with the small memory model.) USE_DEFLATE64 (default for UnZip and fUnZip) NO_DEFLATE64 (default for UnZipSFX stub) The "deflate64" algorithm from PKZIP 4.0 (or newer) is an enhanced variant of the deflate algorithm that achieves slightly better compression ratios on highly redundant data. Normally, UnZip should be compiled with support for this compression algorithm enabled. However, this results in significantly larger memory requirements to run the program. For 16-bit executables (DOS and OS/2), the special memory management to support the 64k history buffer results in a slight performance (= speed) penalty. And for the SFX stub, "deflate64" support might be unnessessary as long as the Info-ZIP Zip utility does not support it (quite likely, this will never get implemented). So, the NO_DEFLATE64 option is provided to allow exclusion of the deflate64 support. USE_BZIP2 (requires additional external code distribution) UnZip can optionally support the "bzip2" compression algorithm for most ports on 32-bit (or higher) platforms. Currently, this support is integrated in the Make procedures of MSDOS 32-bit (DJGPP), VMS, Win32, and many Unix systems. Prerequisites: You have to obtain the bzip2 source distribution (version 1.03 or higher) and extract it into the "bzip2" subdirectory. Compilation: - MSDOS, Win32: You have to supply the symbol definition "USEBZ2=1" on the command line when you invoke the make program. - Unix: The target "generic" automatically activates bzip2 support when its configure script detects the presence of the bzip2 sources. For other targets, there are two options: a) Use the command "make -f unix/Makefile D_USE_BZ2=-DUSE_BZIP2 L_BZ2=-lbz2 \ LIBBZ2=bzip2/libbz2.a YourTarget" (Do not use the continuation line and replace YourTarget with the appropiate target name.) b) Edit the Makefile and remove the comment signs from the lines that define the macros D_USE_BZ2, L_BZ2, and LIBBZ2 (at about line 84 ff.). - VMS: The MMS/MMK build program should automatically activate the bzip2 support when it detects the presence of the bzip2 sources. MULT_VOLUME (experimental for 5.5x, do NOT use in production versions!) NO_MULT_VOLUME (default) The symbol MULT_VOLUME is used to flag code portions needed for support of multi-volume archives. For now, this flag MUST NOT be used to compile a production versions of UnZip. This flag has been introduced to allow integration of experimental code for multi-volume support in the master source tree. This feature will become a default option in the future 6.1 release of UnZip. LZW_CLEAN USE_UNSHRINK (now default, as of January 2005) The "shrinking" algorithm from PKZIP 1.0 is an LZW variant. Unisys patented the Lempel-Ziv-Welch algorithm in 1985 and has publicly claimed that decompression is covered by it. (IBM also patented the same thing in a filing 3 weeks prior to Unisys's.) In 2004, the Unisys and IBM patents expired worldwide, so unshrinking is now enabled again by default. If you do not wish to include the LZW method, you may still disable it by defining LZW_CLEAN. (Unshrinking was used by PKZIP 1.0 and 1.1, and Zip 1.0 and 1.1. All newer archives use only the deflation method.) COPYRIGHT_CLEAN (now default) USE_SMITH_CODE The last chunk of code in UnZip that was blatantly derived from Sam Smith's unzip 2.0 (as in, "substantially similar") is in unreduce.c. Since reducing was only used by very early PKZIP beta versions (0.9x), support for it is now omitted by default (COPYRIGHT_CLEAN). To in- clude unreducing capability, define USE_SMITH_CODE and replace the stub unreduce.c source file by the separatly distributed full source code module. Note that this subjects UnZip to any and all restrictions in Smith's copyright; see the UnZip COPYING.OLD file for details. USE_CRYPT Enable decryption support for all binaries. The default setting is to disable decryption support for the SFX stub to keep its size as small as possible. For other binaries of the UnZip distribution, decryption support is enabled by default. NO_CRYPT Disable decryption support for all binaries. PASSWD_FROM_STDIN (with full crypt sources only; Unix, VMS only) Used to allow the password on encrypted files to be read from stdin rather than the default stderr. This was useful for those who wished to automate the testing or decoding of encrypted archives (say, in a shell script via ``echo "password" | unzip -tq archive''), but as of version 5.3, UnZip has a -P option for passing a password directly to the program. PASSWD_FROM_STDIN will therefore probably be phased out in future versions. Note that the same security warnings given in the description of the -P option apply here as well. UNICODE_SUPPORT Enable restoring from UTF-8 encoded paths. These paths are stored in extra fields in a backward-compatible way so that archives with UTF-8 paths still work on zips and unzips that don't support Unicode. This support follows the recent additions to the PKWare AppNote for Unicode support, except that Unicode comments on systems where UTF-8 is not the current character set is not implemented in this release. Internally, Unicode support cal UNZIP.BCK >[UNZIP60]INSTALL.;1\0n be achieved by three methods: a) The charset encoding used by the system is already UTF-8, so the program just has to select the UTF-8 versions of the stored filenames for file name handling. This method is enabled by setting the symbol UTF8_MAYBE_NATIVE; this activates code to check for native UTF-8 encoding in the locale settings. b) The operating system and the compilation environment support "wide character" data in Unicode encoding (UCS-2/UTF-16 or UCS-4), which are used to translate between UTF-8 and the native extended-ASCII character encoding. The code for this method is activated by setting the preprocessor symbol UNICODE_WCHAR. It may be activated together with UTF8_MAYBE_NATIVE to provide more versatile Unicode support and additional "debugging" options for checking the correct recognition of non-ASCII Unicode characters. c) The operating system and the compilation environment allow to use unicode-encoded "wide character" data for native text strings support. Complete support for this method requires a throughout revision of the UnZip code. All internal string handling and text output needs to be ported to use wchar_t character storage. This porting is still in an experimental stage and not ready for general distribution. On some ports UNICODE_SUPPORT is set automatically: - WIN32 (and WinCE) use method b) by defining UNICODE_SUPPORT and UNICODE_WCHAR. - On Unix, the automatic configuration script enables UNICODE_WCHAR if ISO-10646 compatible wide characters are supported and UTF8_MAYBE_NATIVE if the locale detection call is available. For these ports, setting NO_UNICODE_SUPPORT forces deactivation of the Unicode support. NO_SETLOCALE (for Unix) On Unix, it is now assumed that and the setlocale function are available, to setup locale-aware filtering of displayed filenames. The option NO_SETLOCALE allows to disable the dependency on and setlocale() on systems where this assumption is invalid (and the auto-configuring make target "generic" cannot be used for capabilities detection). _MBCS NO_MBCS Enable multi-byte character set support. This is the default for the Human68k system (originated from Japan) and for Win32 (here only DBCS "double-byte character set" support). The MBCS support should also be enabled on systems which are capable of using UTF-8 as native charset. For MBCS support, the C runtime library must supply implementations for the mblen() function and the MB_CUR_MAX runtime macro/function. The NO_MBCS symbol allows to explicitely disable MBCS support for testing purpose, or when MBCS support does not work as expected. HAVE_WORKING_ISPRINT NO_WORKING_ISPRINT The symbol HAVE_WORKING_ISPRINT enables enhanced non-printable chars filtering for filenames in the fnfilter() function. On some systems (Unix, VMS, some Win32 compilers), this setting is enabled by default. In cases where isprint() flags printable extended characters as unprintable, defining NO_WORKING_ISPRINT allows to disable the enhanced filtering capability in fnfilter(). (The ASCII control codes 0x01 to 0x1f are always escaped on ASCII systems.) DEBUG Used for debugging purposes; enables Trace() statements. Generally it's best to compile only one or two modules this way. DEBUG_TIME Used for debugging the timezone code in fileio.c; enables TTrace() statements. This code is only used for the freshen/update options (-f and -u), and non-Unix compilers often get it wrong. (4) If you regularly compile new versions of UnZip and always want the same non-standard option(s), you may wish to add it (them) to the LOCAL_UNZIP environment variable (assuming it's supported in your makefile). Under MS-DOS, for example, add this to AUTOEXEC.BAT: set LOCAL_UNZIP=-DDOSWILD -DDATE_FORMAT=DF_DMY You can also use the variable to hold special compiler options (e.g., -FPi87 for Microsoft C, if the x87 libraries are the only ones on your disk and they follow Microsoft's default naming conventions; MSC also supports the CL environment variable, however). (5) Run the make utility on your chosen makefile: Unix For most systems it's possible to invoke the makefile in place, at the possible cost of an ignorable warning; do "make -f unix/Makefile list" to get a list of possible system targets, and then "make -f unix/Makefile target" for your chosen target. The "generic" target works for most systems, but if it fails with a message about ftime() unresolved or timezone redefined, do "make clean", "make help", and then either "make generic2" or "make generic3" as instructed. If all else fails, read the makefile itself; it contains numerous comments. (One of these days we'll make a configure script that automates this procedure better.) VMS (OpenVMS): On VMS, two build methods are provided: a command procedure, and description files for MMS or MMK. Both methods must be run from the main directory, not the [.VMS] subdirectory. A simple build using the command procedure looks like this: @ [.VMS]BUILD_UNZIP.COM A simple build using MMS or MMK looks like this: MMS /DESCRIP = [.VMS]DESCRIP.MMS ! Or, with MMK, ... MMK /DESCRIP = [.VMS]DESCRIP.MMS Various options for each build method are explained in comments in the main builder file, either BUILD_UNZIP.COM or DESCRIP.MMS. Here are some more complex build examples: o Build with the large-file option enabled (non-VAX only): @ [.VMS]BUILD_UNZIP LARGE or: MMS /DESC = [.VMS] /MACRO = LARGE=1 o Re-link the executables (small-file and large-file): @ [.VMS]BUILD_UNZIP LINK @ [.VMS]BUILD_UNZIP LARGE LINK or MMK /DESC = [.VMS] CLEAN_EXE ! Deletes existing executables. MMK /DESC = [.VMS] ! Builds new executables. MMK /DESC = [.VMS] /MACRO = LARGE=1 CLEAN_EXE MMK /DESC = [.VMS] /MACRO = LARGE=1 o Build a large-file product from scratch, for debug, getting compiler listings and link maps: mms /desc = [.vms] clean mms /desc = [.vms] /macro = (DBG=1, LARGE=1. LIST=1) On VAX, the builders attempt to cope with the various available C compilers: DEC/Compaq/HP C, VAX C, or GNU C. If DEC/Compaq/HP C is not available or not desired, comments in the relevant builder file explain the command-line options used to select a different compiler. System-architecture-specific files (like objects and executables) are placed in separate directories, such as [.ALPHA], [.IA64], or [.VAX]. Large-file products get their own directories, [.ALPHAL] or [.IA64L]. On VAX, VAX C products are placed in [.VAXV], GNU C products in [.VAXG]. Each product builder announces what the destination directory will be when it is run. Common files, such as th UNZIP.BCK >[UNZIP60]INSTALL.;1\?e help libraries (UNZIP.HLP for the default UNIX-like command-line interface, UNZIP_CLI.HLP for the VMS-like command-line interface), are placed in the main directory. With a mixed-architecture VMS cluster, the same main directory on a shared disk may may be used by all system types. (Using the NOHELP option with BUILD_UNZIP.COM can keep it from making the same help files repeatedly.) Some further information may be found in the files [.VMS]README. and [.VMS]00BINARY.VMS, though much of what's there is now obsolete. MS-DOS See the msdos\Contents file for notes regarding which makefile(s) to use with which compiler. In summary: pick one of msdos\makefile.* as appropriate, or (as noted above) use the OS/2 gccdos target for emx+gcc. There is also an mscdos cross-compilation target in os2\makefile.os2 and a sco_dos cross-compilation target in the Unix makefile. For Watcom 16-bit or 32-bit versions, see the comments in the OS/2 section below. After choosing the appropriate makefile and editing as necessary or desired, invoke the corresponding make utility. Microsoft's NMAKE and the free dmake and GNU make utilities are generally the most versatile. The makefiles in the msdos directory can be invoked in place ("nmake -f msdos\makefile.msc", for example). OS/2 Either GNU make, nmake or dmake may be used with the OS/2 makefile; all are freely available on the net. Do "nmake -f os2\makefile.os2", for example, to get a list of supported targets. More generally, read the comments at the top of the makefile for an explanation of the differences between some of the same-compiler targets. Win32 (WinNT or Win9x) For creating Win32 executables, the Microsoft Visual C++ compiler platforms from version 2.x up to 8.0 (Visual Studio .Net C++ 2005) are supported. Recent build test have been run on VC++ 6.0, 7.1 and 8.0. The linker of newer Microsoft Visual C++ versions (beginning with Visual C++ 2008 - [VC++ 9.0]) create executables that are marked to run on Windows 2000 and newer, only. Although these Visual C++ environments may succeed in building Win32 Info-ZIP executables, they cannot (and must not) be used to create binaries for public distribution. Alternative compilers for the Intel platforms are OpenWatcom C++, GNU C (preferably the mingw32 port, CygWin and emx/rsxnt may also work), Borland C++, or lcc-win32. DEC C/C++ for NT/Alpha may or may not still work. For the Watcom compiler, use WMAKE and win32\makefile.wat; for the Microsoft compilers, use NMAKE and win32\Makefile; for mingw32 and CygWin, GNU Make and win32\Makefile.gcc should do the job. With emx+gcc, a good choice is GNUMake 3.75 (or higher) from the djgpp V2 distribution used on win32\Makefile.emx. The unzip32.dll WinDLL executables can be built using the appropiate Makefile in the win32\ subdirectory, or by using the Microsoft Visual C++ project files supplied below the windll subdirectory. Besides the MSC compilers, gcc-mingw32, Watcom C and Borland C allow to build the Windows UnZip DLL. By default, the Makefiles for compilers that use the Microsoft C runtime are configured to link against the shared multithreading C runtime DLL. Depending on the intended usage for unzip32.dll, a statically linked dll might be more suitable. The make scripts for MSC support build variants with static linking; you should look up the configuration switch DLLSTANDALONE in the MSC Makefile or the "Static..." build configurations in the Visual Studio project files. WinCE (WinCE or WinNT) Only Microsoft Visual C++ 5.0, 6.0 or Visual C++ embedded 3.0 or later are supported. Use the appropiate version of the included project files and check wince\README for details. AmigaDOS SAS/Lattice C and Manx Aztec C are supported. For SAS C 6.x do "smake -f amiga/smakefile all"; for Aztec C do "make -f amiga/makefile.azt all". The Aztec C version supports assembly-language versions of two routines; these are enabled by default. Atari TOS Turbo C is no longer supported; use gcc and the MiNT libraries, and do "make". Note that all versions of gcc prior to 2.5.8 have a bug affecting 68000-based machines (optimizer adds 68020 instructions). See atari\README for comments on using other compilers. Macintosh Metrowerks CodeWarrior Pro 4 with Universal Interfaces 3.1 is the only currently supported compiler, although the Mac Programmer's Workbench (MPW) and Think C were supported at one time and still have some hooks. Other Compilers may work too, no compiler specific instructions (pragma, header, macros, ...) were used in the code. For CodeWarrior Pro 4, un-BinHex the CodeWarrior project file and UnZip resource file (using Stuffit Expander or BinHex 4.0 or later), then open the project and click on the compile button. See ":macos:Contents" for the possible project targets. Link order of the standard libraries is very important: Link all sources first and all standard libraries last. Acorn (RISC OS) Extract the files from the archive and place in standard 'Acorn' C form (i.e., *.c, *.h and *.s become c.*, h.* and s.*, respectively), either using the UNZIP$EXTS environment variable and a pre-built UnZip binary, or using Spark[FS] and doing it manually. Then copy the Acorn.Makefile to the main UnZip directory and either type 'amu' or use the desktop make utility. VM/CMS Unpack all the files and transfer them with ASCII -> EBCDIC conver- sion to an appropriate directory/minidisk/whatever, then execute UNZVMC to compile and link all the sources. This may require C/370 version 2.1 or later and certain `nucleus extensions,' although UnZip 5.3 has been reported to compile fine with the `ADCYCLE C/370 v1.2 compiler.' Note that it will abend without access to the C/370 runtime library. See the README.CMS file for more details. MVS Unpack all the files and transfer them to an appropriate PDS with ASCII -> EBCDIC conversion enabled, then edit UNZMVSC.JOB as required, and execute it to compile and link all the sources. C/370 2.1 or later is required. See README.MVS for further details. [This is a new port and may need a little more work even to compile.] Human68K [This is a Japanese machine and OS.] It appears that GNU make and gcc are required; presumably just do "gmake -f human68k/Makefile.gcc" to build everything. This port has not been tested since the 5.12 release. TOPS-20 [No longer fully supported due to new, unported features, although patches are always accepted.] Unpack all files into the current directory only (including those in the zipfile's tops20 directory), then use make.mic and "do make". BeOS You can run the BeOS makefile in place by typing "make -f beos/Makefile". In fact, this is how the author tests it. Running the appropriate make utility should produce thr|B UNZIP.BCK >[UNZIP60]INSTALL.;1\gNee executables on most systems, one for UnZip/ZipInfo, one for UnZipSFX, and one for fUnZip. (VMS is one prominent exception: fUnZip makes no sense on it. The Amiga produces a fourth executable called MakeSFX, which is necessary because Amiga self-extracting archives cannot be created by simple concatenation. If necessary the source amiga/makesfx.c can be compiled on other systems.) Read any OS-specific README files for notes on setting things up for normal use (especially for VMS) and for warnings about known quirks and bugs in various compilers (especially for MS-DOS). Also note that many OSes require a timezone variable to be set correctly (often "TZ"); Unix and VMS generally do so by default, Win95/NT do if set up properly, but other OSes generally do not. See the discussion of the -f and -u options in the UnZip man page (or unzip.txt). BeOS doesn't currently support timezone information at all, but this will probably be added soon. Then test your new UnZip on a few archives and let us know if there are problems (but *please* first make certain that the archives aren't actu- ally corrupted and that you didn't make one of the silly mistakes dis- cussed in the documentation). If possible, double-check any problems with PKUNZIP or with a previous version of UnZip prior to reporting a "bug." The zipfile itself may be damaged. To install: =========== Unix The default prefix for the installation location is /usr/local (things go into the bin and man/man1 subdirectories beneath the prefix), and the default man-page extension is "1" (corresponding to man/man1, above). To install as per the defaults, do "make install"; otherwise do "make prefix=/your/path manext=your_extension install". (For Intel Unix flavors where the assembler CRC routines were used [ASM_CRC], use the install_asm target instead of the regular install target.) For example, to install in your home directory with "l" as the man-page extension (for "local"), do "make prefix=$HOME manext=l install". Permissions will be 755 for the executables and 644 for the man pages. In general root must perform in- stallation into a public directory. Do "rehash" if your shell requires it in order to find the new executables. VMS To complete the installation, the executables may be left in place, or moved (or copied) to a convenient place. While other methods (like DCL$PATH) exist, most users define symbols to make the UnZip executables available as foreign commands. These symbol definitions may be placed in a user's SYS$LOGIN:LOGIN.COM, or in a more central location, like SYS$MANAGER:SYLOGIN.COM. Typical symbol definitions might look like these: UNZIP :== $ dev:[dir]UNZIP.EXE ! UNIX-like command line. or: UNZIP :== $ dev:[dir]UNZIP_CLI.EXE ! VMS-like command line. For convenience, a ZIPINFO symbol could also be defined, so: ZIPINFO :== $ dev:[dir]UNZIP.EXE """-Z""" On a non-VAX system, different symbols could be defined for the small-file and large-file programs. For example: UNZIPS :== $ dev:[dir.ALPHA]UNZIP.EXE ! UNZIPS = small-file UnZip. UNZIP*L :== $ dev:[dir.ALPHAL]UNZIP.EXE ! UNZIP[L] = large-file UnZip. The builders create help text files, UNZIP.HLP and UNZIP_CLI.HLP. These may be incorporated into an existing help library, or a separate UnZip help library may be created using commands like these, using either UNZIP.HLP (as shown) or UNZIP_CLI.HLP: $ LIBRARY /HELP dev:[dir]existing_library.HLB UNZIP.HLP $ LIBRARY /CREATE /HELP UNZIP.HLB UNZIP.HLP UnZip help may then be accessed from a separate UnZip help library using a command like: $ HELP /LIBRARY = device:[directory]UNZIP.HLB For greater ease, the user (or system manager) may define a HLP$LIBRARY logical name to allow the HELP utility to find the UnZip help library automatically. See HELP HELP /USERLIBRARY for more details. The command procedure HLP_LIB_NEXT.COM may be used to determine the next available HLP$LIBRARY logical name, and could be adapted to define a HLP$LIBRARY logical name for an UnZip help library. The kit includes MAKESFX.COM, a command procedure intended to simplify creating a self-extracting archive. It may be helpful to install this procedure near the UnZip executables. MAKESFX.COM expects another symbol definition, like one of these: UNZIPSFX :== $ dev:[dir]UNZIPSFX.EXE ! UNIX-like command line. or: UNZIPSFX :== $ dev:[dir]UNZIPSFX_CLI.EXE ! VMS-like command line. Again here, on a non-VAX system, either a small-file or a large-file UNZIPSFX program may be used. (MAKESFX.COM could be modified to allow a run-time choice to be made.) OS/2, MS-DOS, NT, Atari, Amiga Move or copy unzip.exe (or unzip.ttp, or UnZip, or whatever) to a direc- tory in your path; also possibly copy the UnZip executable to zipinfo.exe (or ii.exe), or else create an alias or a batch/command file for ZipInfo ("@unzip -Z %1 %2 %3 %4 %5 %6 %7 %8 %9" under MS-DOS). The latter is only relevant if NO_ZIPINFO was *not* defined, obviously... Under djgpp 2.x, zipinfo.exe is a 2K stub symbolically linked to unzip.exe. Acorn RISC OS Copy the executables unzip, funzip and zipinfo to somewhere in your Run$Path. See your Welcome manual if you don't know about Run$Path. BeOS The default prefix for the installation location is /boot/usr/local (things go into the bin and man/man1 subdirectories beneath the prefix), and the default man-page extension is "1" (corresponding to the man/man1, above). Of course, these Unix man-pages aren't useful until someone ports something that can format them... plain text versions are also installed with an extension of ".txt". To install, do a "make install", or to change the prefix, do "make prefix=/your/path install". For example, to install in /boot/bin, do "make prefix=/boot/bin install". Macintosh (This port is for Macintosh OS before Mac OS X. See Unix Apple below for Mac OS X and later.) MacZip requires at least System 7 and a Macintosh with a minimum of a Motorola 68020 or PowerPC 601 processor. Other configurations may work but it is not tested at all. The application (MacZip) is distributed as a combination of zip and unzip in one program. The offical release is a fat binary with both regular 68K and native PowerPC versions included. Move the executable(s) somewhere--for example, drag it (or them) to your Applications folder. For easy access, make an alias in the Launcher Control Panel or directly on your desktop. This port supports also Apple-event.So you can install it in your WWW-Browser as a helper-app. Look into "macos/README.TXT" (or ":macos:README.TXT" on Mac) for further info. Macintosh OS X (Unix Apple) Mac OS X and later are based on BSD Unix and are supported by the Unix port. See the Unix port for details. Though support is currently minimal, we plan to support additional Mac OS X features, such as resource forks, in future releases. Human68K, TOPS-20, AOS/VS, MVS, VM/CMS, etc. Dunno, sorry... *r8 UNZIP.BCK ,>[UNZIP60]LICENSE.;1*[UNZIP60]LICENSE.;1+, ,./ 4@->0123KPWO 56bQ7bQ89GHJThis is version 2009-Jan-02 of the Info-ZIP license. The definitive version of this document should be available at ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely and a copy at http://www.info-zip.org/pub/infozip/license.html. Copyright (c) 1990-2009 Info-ZIP. All rights reserved. For the purposes of this copyright and license, "Info-ZIP" is defined as the following set of individuals: Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois, Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth, Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz, David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko, Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs, Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda, Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren, Rich Wales, Mike White. This software is provided "as is," without warranty of any kind, express or implied. In no event shall Info-ZIP or its contributors be held liable for any direct, indirect, incidental, special or consequential damages arising out of the use of or inability to use this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the above disclaimer and the following restrictions: 1. Redistributions of source code (in whole or in part) must retain the above copyright notice, definition, disclaimer, and this list of conditions. 2. Redistributions in binary form (compiled executables and libraries) must reproduce the above copyright notice, definition, disclaimer, and this list of conditions in documentation and/or other materials provided with the distribution. Additional documentation is not needed for executables where a command line license option provides these and a note regarding this option is in the executable's startup banner. The sole exception to this condition is redistribution of a standard UnZipSFX binary (including SFXWiz) as part of a self-extracting archive; that is permitted without inclusion of this license, as long as the normal SFX banner has not been removed from the binary or disabled. 3. Altered versions--including, but not limited to, ports to new operating systems, existing ports with new graphical interfaces, versions with modified or added functionality, and dynamic, shared, or static library versions not from Info-ZIP--must be plainly marked as such and must not be misrepresented as being the original source or, if binaries, compiled from the original source. Such altered versions also must not be misrepresented as being Info-ZIP releases--including, but not limited to, labeling of the altered versions with the names "Info-ZIP" (or any variation thereof, including, but not limited to, different capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the explicit permission of Info-ZIP. Such altered versions are further prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP e-mail addresses or the Info-ZIP URL(s), such as to imply Info-ZIP will provide support for the altered versions. 4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip," "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its own source and binary releases. *[UNZIP60]LIST.C;1+,@>.6/ 466@->0123KPWO756jm7jm89GHJ /* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- list.c This file contains the non-ZipInfo-specific listing routines for UnZip. Contains: list_files() get_time_stamp() [optional feature] ratio() fnprint() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #ifdef WINDLL # ifdef POCKET_UNZIP # include "wince/intrface.h" # else # include "windll/windll.h" # endif #endif #ifdef TIMESTAMP static int fn_is_dir OF((__GPRO)); #endif #ifndef WINDLL static ZCONST char Far CompFactorStr[] = "%c%d%%"; static ZCONST char Far CompFactor100[] = "100%%"; #ifdef OS2_EAS static ZCONST char Far HeadersS[] = " Length EAs ACLs Date Time Name"; static ZCONST char Far HeadersS1[] = "--------- --- ---- ---------- ----- ----"; #else static ZCONST char Far HeadersS[] = " Length Date Time Name"; static ZCONST char Far HeadersS1[] = "--------- ---------- ----- ----"; #endif static ZCONST char Far HeadersL[] = " Length Method Size Cmpr Date Time CRC-32 Name"; static ZCONST char Far HeadersL1[] = "-------- ------ ------- ---- ---------- ----- -------- ----"; static ZCONST char Far *Headers[][2] = { {HeadersS, HeadersS1}, {HeadersL, HeadersL1} }; static ZCONST char Far CaseConversion[] = "%s (\"^\" ==> case\n%s conversion)\n"; static ZCONST char Far LongHdrStats[] = "%s %-7s%s %4s %02u%c%02u%c%02u %02u:%02u %08lx %c"; static ZCONST char Far LongFileTrailer[] = "-------- ------- --- \ -------\n%s %s %4s %lu file%s\n"; #ifdef OS2_EAS static ZCONST char Far ShortHdrStats[] = "%s %6lu %6lu %02u%c%02u%c%02u %02u:%02u %c"; static ZCONST char Far ShortFileTrailer[] = "--------- ----- ----- \ -------\n%s %6lu %6lu %lu file%s\n"; static ZCONST char Far OS2ExtAttrTrailer[] = "%lu file%s %lu bytes of OS/2 extended attributes attached.\n"; static ZCONST char Far OS2ACLTrailer[] = "%lu file%s %lu bytes of access control lists attached.\n"; #else static ZCONST char Far ShortHdrStats[] = "%s %02u%c%02u%c%02u %02u:%02u %c"; static ZCONST char Far ShortFileTrailer[] = "--------- -------\n%s\ %lu file%s\n"; #endif /* ?OS2_EAS */ #endif /* !WINDLL */ /*************************/ /* Function list_files() */ /*************************/ int list_files(__G) /* return PK-type error code */ __G37` UNZIP.BCK@>>[UNZIP60]LIST.C;16yDEF { int do_this_file=FALSE, cfactor, error, error_in_archive=PK_COOL; #ifndef WINDLL char sgn, cfactorstr[10]; int longhdr=(uO.vflag>1); #endif int date_format; char dt_sepchar; ulg members=0L; zusz_t j; unsigned methnum; #ifdef USE_EF_UT_TIME iztimes z_utime; struct tm *t; #endif unsigned yr, mo, dy, hh, mm; zusz_t csiz, tot_csize=0L, tot_ucsize=0L; #ifdef OS2_EAS ulg ea_size, tot_easize=0L, tot_eafiles=0L; ulg acl_size, tot_aclsize=0L, tot_aclfiles=0L; #endif min_info info; char methbuf[8]; static ZCONST char dtype[]="NXFS"; /* see zi_short() */ static ZCONST char Far method[NUM_METHODS+1][8] = {"Stored", "Shrunk", "Reduce1", "Reduce2", "Reduce3", "Reduce4", "Implode", "Token", "Defl:#", "Def64#", "ImplDCL", "BZip2", "LZMA", "Terse", "IBMLZ77", "WavPack", "PPMd", "Unk:###"}; /*--------------------------------------------------------------------------- Unlike extract_or_test_files(), this routine confines itself to the cen- tral directory. Thus its structure is somewhat simpler, since we can do just a single loop through the entire directory, listing files as we go. So to start off, print the heading line and then begin main loop through the central directory. The results will look vaguely like the following: Length Method Size Ratio Date Time CRC-32 Name ("^" ==> case -------- ------ ------- ----- ---- ---- ------ ---- conversion) 44004 Implode 13041 71% 11-02-89 19:34 8b4207f7 Makefile.UNIX 3438 Shrunk 2209 36% 09-15-90 14:07 a2394fd8 ^dos-file.ext 16717 Defl:X 5252 69% 11-03-97 06:40 1ce0f189 WHERE -------- ------- --- ------- 64159 20502 68% 3 files ---------------------------------------------------------------------------*/ G.pInfo = &info; date_format = DATE_FORMAT; dt_sepchar = DATE_SEPCHAR; #ifndef WINDLL if (uO.qflag < 2) { if (uO.L_flag) Info(slide, 0, ((char *)slide, LoadFarString(CaseConversion), LoadFarStringSmall(Headers[longhdr][0]), LoadFarStringSmall2(Headers[longhdr][1]))); else Info(slide, 0, ((char *)slide, "%s\n%s\n", LoadFarString(Headers[longhdr][0]), LoadFarStringSmall(Headers[longhdr][1]))); } #endif /* !WINDLL */ for (j = 1L;;j++) { if (readbuf(__G__ G.sig, 4) == 0) return PK_EOF; if (memcmp(G.sig, central_hdr_sig, 4)) { /* is it a CentDir entry? */ /* no new central directory entry * -> is the number of processed entries compatible with the * number of entries as stored in the end_central record? */ if (((j - 1) & (ulg)(G.ecrec.have_ecr64 ? MASK_ZUCN64 : MASK_ZUCN16)) == (ulg)G.ecrec.total_entries_central_dir) { /* "j modulus 4T/64k" matches the reported 64/16-bit-unsigned * number of directory entries -> probably, the regular * end of the central directory has been reached */ break; } else { Info(slide, 0x401, ((char *)slide, LoadFarString(CentSigMsg), j)); Info(slide, 0x401, ((char *)slide, LoadFarString(ReportMsg))); return PK_BADERR; /* sig not found */ } } /* process_cdir_file_hdr() sets pInfo->hostnum, pInfo->lcflag, ...: */ if ((error = process_cdir_file_hdr(__G)) != PK_COOL) return error; /* only PK_EOF defined */ /* * We could DISPLAY the filename instead of storing (and possibly trun- * cating, in the case of a very long name) and printing it, but that * has the disadvantage of not allowing case conversion--and it's nice * to be able to see in the listing precisely how you have to type each * filename in order for unzip to consider it a match. Speaking of * which, if member names were specified on the command line, check in * with match() to see if the current file is one of them, and make a * note of it if it is. */ if ((error = do_string(__G__ G.crec.filename_length, DS_FN)) != PK_COOL) /* ^--(uses pInfo->lcflag) */ { error_in_archive = error; if (error > PK_WARN) /* fatal: can't continue */ return error; } if (G.extra_field != (uch *)NULL) { free(G.extra_field); G.extra_field = (uch *)NULL; } if ((error = do_string(__G__ G.crec.extra_field_length, EXTRA_FIELD)) != 0) { error_in_archive = error; if (error > PK_WARN) /* fatal */ return error; } if (!G.process_all_files) { /* check if specified on command line */ unsigned i; if (G.filespecs == 0) do_this_file = TRUE; else { /* check if this entry matches an `include' argument */ do_this_file = FALSE; for (i = 0; i < G.filespecs; i++) if (match(G.filename, G.pfnames[i], uO.C_flag WISEP)) { do_this_file = TRUE; break; /* found match, so stop looping */ } } if (do_this_file) { /* check if this is an excluded file */ for (i = 0; i < G.xfilespecs; i++) if (match(G.filename, G.pxnames[i], uO.C_flag WISEP)) { do_this_file = FALSE; /* ^-- ignore case in match */ break; } } } /* * If current file was specified on command line, or if no names were * specified, do the listing for this file. Otherwise, get rid of the * file comment and go back for the next file. */ if (G.process_all_files || do_this_file) { #ifdef OS2DLL /* this is used by UzpFileTree() to allow easy processing of lists * of zip directory contents */ if (G.processExternally) { if ((G.processExternally)(G.filename, &G.crec)) break; ++members; } else { #endif #ifdef OS2_EAS { uch *ef_ptr = G.extra_field; int ef_size, ef_len = G.crec.extra_field_length; ea_size = acl_size = 0; while (ef_len >= EB_HEADSIZE) { ef_size = makeword(&ef_ptr[EB_LEN]); switch (makeword(&ef_ptr[EB_ID])) { case EF_OS2: ea_size = makelong(&ef_ptr[EB_HEADSIZE]); break; case EF_ACL: acl_size = makelong(&ef_ptr[EB_HEADSIZE]); break; } ef_ptr += (ef_size + EB_HEADSIZE); ef_len -= (ef_size + EB_HEADSIZE); } } #endif #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.crec.extra_field_length, 1, G.crec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) m UNZIP.BCK@>>[UNZIP60]LIST.C;16j { TIMET_TO_NATIVE(z_utime.mtime) /* NOP unless MSC 7.0, Mac */ t = localtime(&(z_utime.mtime)); } else t = (struct tm *)NULL; if (t != (struct tm *)NULL) { mo = (unsigned)(t->tm_mon + 1); dy = (unsigned)(t->tm_mday); yr = (unsigned)(t->tm_year + 1900); hh = (unsigned)(t->tm_hour); mm = (unsigned)(t->tm_min); } else #endif /* USE_EF_UT_TIME */ { yr = ((((unsigned)(G.crec.last_mod_dos_datetime >> 25) & 0x7f) + 1980)); mo = ((unsigned)(G.crec.last_mod_dos_datetime >> 21) & 0x0f); dy = ((unsigned)(G.crec.last_mod_dos_datetime >> 16) & 0x1f); hh = (((unsigned)G.crec.last_mod_dos_datetime >> 11) & 0x1f); mm = (((unsigned)G.crec.last_mod_dos_datetime >> 5) & 0x3f); } /* permute date so it displays according to nat'l convention * ('methnum' is not yet set, it is used as temporary buffer) */ switch (date_format) { case DF_YMD: methnum = mo; mo = yr; yr = dy; dy = methnum; break; case DF_DMY: methnum = mo; mo = dy; dy = methnum; } csiz = G.crec.csize; if (G.crec.general_purpose_bit_flag & 1) csiz -= 12; /* if encrypted, don't count encryption header */ if ((cfactor = ratio(G.crec.ucsize, csiz)) < 0) { #ifndef WINDLL sgn = '-'; #endif cfactor = (-cfactor + 5) / 10; } else { #ifndef WINDLL sgn = ' '; #endif cfactor = (cfactor + 5) / 10; } methnum = find_compr_idx(G.crec.compression_method); zfstrcpy(methbuf, method[methnum]); if (G.crec.compression_method == DEFLATED || G.crec.compression_method == ENHDEFLATED) { methbuf[5] = dtype[(G.crec.general_purpose_bit_flag>>1) & 3]; } else if (methnum >= NUM_METHODS) { sprintf(&methbuf[4], "%03u", G.crec.compression_method); } #if 0 /* GRR/Euro: add this? */ #if defined(DOS_FLX_NLM_OS2_W32) || defined(THEOS) || defined(UNIX) for (p = G.filename; *p; ++p) if (!isprint(*p)) *p = '?'; /* change non-printable chars to '?' */ #endif /* DOS_FLX_NLM_OS2_W32 || THEOS || UNIX */ #endif /* 0 */ #ifdef WINDLL /* send data to application for formatting and printing */ if (G.lpUserFunctions->SendApplicationMessage != NULL) (*G.lpUserFunctions->SendApplicationMessage)(G.crec.ucsize, csiz, (unsigned)cfactor, mo, dy, yr, hh, mm, (char)(G.pInfo->lcflag ? '^' : ' '), (LPCSTR)fnfilter(G.filename, slide, (WSIZE>>1)), (LPCSTR)methbuf, G.crec.crc32, (char)((G.crec.general_purpose_bit_flag & 1) ? 'E' : ' ')); else if (G.lpUserFunctions->SendApplicationMessage_i32 != NULL) { unsigned long ucsize_lo, csiz_lo; unsigned long ucsize_hi=0L, csiz_hi=0L; ucsize_lo = (unsigned long)(G.crec.ucsize); csiz_lo = (unsigned long)(csiz); #ifdef ZIP64_SUPPORT ucsize_hi = (unsigned long)(G.crec.ucsize >> 32); csiz_hi = (unsigned long)(csiz >> 32); #endif /* ZIP64_SUPPORT */ (*G.lpUserFunctions->SendApplicationMessage_i32)(ucsize_lo, ucsize_hi, csiz_lo, csiz_hi, (unsigned)cfactor, mo, dy, yr, hh, mm, (char)(G.pInfo->lcflag ? '^' : ' '), (LPCSTR)fnfilter(G.filename, slide, (WSIZE>>1)), (LPCSTR)methbuf, G.crec.crc32, (char)((G.crec.general_purpose_bit_flag & 1) ? 'E' : ' ')); } #else /* !WINDLL */ if (cfactor == 100) sprintf(cfactorstr, LoadFarString(CompFactor100)); else sprintf(cfactorstr, LoadFarString(CompFactorStr), sgn, cfactor); if (longhdr) Info(slide, 0, ((char *)slide, LoadFarString(LongHdrStats), FmZofft(G.crec.ucsize, "8", "u"), methbuf, FmZofft(csiz, "8", "u"), cfactorstr, mo, dt_sepchar, dy, dt_sepchar, yr, hh, mm, G.crec.crc32, (G.pInfo->lcflag? '^':' '))); else #ifdef OS2_EAS Info(slide, 0, ((char *)slide, LoadFarString(ShortHdrStats), FmZofft(G.crec.ucsize, "9", "u"), ea_size, acl_size, mo, dt_sepchar, dy, dt_sepchar, yr, hh, mm, (G.pInfo->lcflag? '^':' '))); #else Info(slide, 0, ((char *)slide, LoadFarString(ShortHdrStats), FmZofft(G.crec.ucsize, "9", "u"), mo, dt_sepchar, dy, dt_sepchar, yr, hh, mm, (G.pInfo->lcflag? '^':' '))); #endif fnprint(__G); #endif /* ?WINDLL */ if ((error = do_string(__G__ G.crec.file_comment_length, QCOND? DISPL_8 : SKIP)) != 0) { error_in_archive = error; /* might be just warning */ if (error > PK_WARN) /* fatal */ return error; } tot_ucsize += G.crec.ucsize; tot_csize += csiz; ++members; #ifdef OS2_EAS if (ea_size) { tot_easize += ea_size; ++tot_eafiles; } if (acl_size) { tot_aclsize += acl_size; ++tot_aclfiles; } #endif #ifdef OS2DLL } /* end of "if (G.processExternally) {...} else {..." */ #endif } else { /* not listing this file */ SKIP_(G.crec.file_comment_length) } } /* end for-loop (j: files in central directory) */ /*--------------------------------------------------------------------------- Print footer line and totals (compressed size, uncompressed size, number of members in zipfile). ---------------------------------------------------------------------------*/ if (uO.qflag < 2 #ifdef OS2DLL && !G.processExternally #endif ) { if ((cfactor = ratio(tot_ucsize, tot_csize)) < 0) { #ifndef WINDLL sgn = '-'; #endif cfactor = (-cfactor + 5) / 10; } else { #ifndef WINDLL sgn = ' '; #endif cfactor = (cfactor + 5) / 10; } #ifdef WINDLL /* pass the totals back to the calling application */ G.lpUserFunctions->TotalSizeComp = tot_csize; G.lpUserFunctions->TotalSize = tot_ucsize; G.lpUserFunctions->CompFactor = (ulg)cfactor; G.lpUserFunctions->NumMembers = members; #else /* !WINDLL */ if (cfactor == 100) sprintf(cfactorstr, LoadFarString(CompFactor100)); else sprintf(cfactorstr, LoadFarString(CompFactorStr), sgn, cfactor); if (longhdr) { Info(slide, 0, ((char *)slide, LoadFarString(LongFileTrailer), FmZofft(tot_ucsize, "8", "u"), FmZofft(tot_csize, "8", "u"), cfactorstr, members, members==1? "":"s")); #ifdef OS2_EAS if (tot_easize || tot_aclsize) Info(slide, 0, ((char *)slide, "\n")); if (tot_eafiles BN A  x 1u D`X^6-y*y[ %$ @B)$f upe6P#@ox| .JpY.$:(7!2l.h'bO`t%d0}H71Rit+:,Okn`H}#1?zoay4m71 _Dny9 (1k+b+ x<tw)0W^"$q3gG%WTX%N{gf;"0Mn?ixc+OhL%pgIZrj>7;=7q>N\J.}\gs3[\;/^$Su3,hq)PevK:ltj"^MFXYl.?B.:1`TJ iB$J=Z|<# ]LFfQ{k6*?S1> .,,SC):|f&L5Qx87"v lsX`(@%-"rkEJG|NQF'1lU[3GZ %U:W=]  `LUP x^ *UFU$O $EFfgaky*c,4[`d9LJ["V*"zkWR-t8fh{ f/ O_D2 o I2'_(?d co7pwzm~9adTpVz < A}PMJ#oS;]_O4@1w5dU[N4oNE6cnTRK;>I){ZMbsD p-fZbpOA5GAU Bw8x} q69|y OF'C+$HR E9`ws@gg&Lwz]JT@{HCVw)+!Ha .C ,1=C$69 J WA 7=av9 {DK o2<^u6!!}qk6ugdl1}qytl )tl&U>UU|~F\#jSp]5XQT\! N.u !*)>;WyC1xJ ?$ NCGDR'T D$ +H $%b*9B PM SxVPdJ@*oEb~k%^O[LIJ]C)QYILD^OUZ!qOt w!lJb@zjS7+)!DBFI:I1]GYg=:ng$+nKA[W_];&sMxa*)1@XW[C'e+k wf[&I ux>5GIjq]9dzdfBhWNggC%O?(``(JFC[]:t!/(E1YBy FILaPEyPPEILEmZ"d[Y2Ie ozIk!W^LP? QV Y=\]\oG:EA &EGRcnXRxtCH d J+]XS'-Na.:;Pje)8gBJyg_\7EL/pq U= Fh{2{zu}%14>tm}9wr&6vDYml6e/dkF ^ MAZ)Z[5r`Zh}di8e_Zih?i&g\cU6t+WMEhPH /n9W XW)PfX%rp,{n * wZe@v<&LMV0 9vB nhPjjyc|vEoEVTnSR B;vVfWWBso $R3}%a){06X:UI]YZeQ0[T D`[55>.mYUENt Ue2!;wq'HUOMRZ[$Md $}F YFKO VIjdqPYEP,R]8  _/|c[,?mlF,d&R]$[9Bki:;]$pI~LEM(X@ JQ-U k 3#Aq:ON<#ath]H(O \o9/B?KYQFSoIG|XTR{80q$ {?e7e>ZTl8&;0,gt>ij/JmudKAItNFPh@oN"O?GL<;qzXR\Lpd !M^{,zHLNEWDk iY*ER<@t`a$b98]PNRG\7FBz!qsq"B,,LQ[Mi r@gcr;WTn$Z& L/MN mz_ 19HEWai5M6*np'iyQ;wyM-[9#ZwCM[ @-ZrYK`)_i ]+-v+zzM/~S`= ?G]Zfi6tBprgz9*b;\7.YNdj0d7 d7"KCKDXVZxo< }]|Z[QW S JlDjv pBfq.RO|W %B #[f>9@/-rl'cpVioOTq \o!7gzM1@iu1[wn;q11]YZ\-eG&u n!` $y"|dNn"^v ;c-22ZlOvru;7o _W Y 0b6%=t)25% h;HZmny{*b!%vp>-<'4'18p1N1T(i=C TEx)s9%22kZ@ Mg^?)3 !@;&%]0mOLd%TWAOLW5 'u3MS'1>jOdi@[{ cJbI,Hd17:2 1XN@9V%P#jJ1s1o\:4( -igGZwL<-4Wt$~85tzK|BF@JC+]<@do%0f6OA6q~D ey mTa6@PU&c_SRxA3l4kRZ]g4$0%SgJopQ:Tj)} on.z,cg yVd}&Ze!C  33 sDMRo2V@ WAn\>Tls%"3'(W#T@LIbTY, AL 7,pd"&p06Mc}AnK*hQ,5,_p/#y,z#X|  ;?;J,7R{/>w`B`"F/bA B \ }rrcUcQiz6r1\ fy&C1v$@<[)WklHgKVx 7y~Wc5Nbz ~;,s E .z%naV7]^j7 *Zn:jMR/dFO<]W*((SjIQ6 :!"Da\R"h12m,{P. %i%h&Ly22;"s|JXB^(9sT ^!{:#[vdE=|_k`c(,v);9;7 gz|'vX,)}&O9-,k6CK, xb<$vwTm~!oK;3KS-{ry=>'v.[@ !N 6i X?Euk i1&w{%*C YsWR\gQ5 O ^)'O>(oHR<%QcP9#b'I {I W Yk[I_[[(E3OVT;s$'C7s|5~Ck<q Poe,V F`3TX :\)Y^T+j/'^9kU;z7aj/lekjCXQs(D/VU75 2LG}w( E6_lT.2s{3|o߹nNHO]]@77fvS}GPqPVDOJ]gqIN/P|%n7r !W06x`#Xb_cX)vi&E=Ui(.z|K2*Opg>a+1^Bz9YK$0NI5o"ctJ\TYUjz6b@b:|0%D"b8p0vpyB,lAP)X,pWMyUXS!5yK\}=#?'cjd qo6dIpJc * Ja3[2 WIz,i @K-"jl(#VR]O[ZSDpF2&:SGI u1CkH aD%0 iQ-xP8T4o<*JWm Lw6W}a&1; |MFXL&o]D1 (Up B6p:1aDE| EFsADkuN1[$_h,>qB C:gF["wlpeK8mO CrGL4^4 -)+at6 BY3)Ply#W&SY4+Y 2/D$~xY,%C8?YJrrPX2T=E<#o`'lB<:3bnRRBLyJ8S@ ]u>SJR6igf`x/hzS {} &#stV;ydf#>|hhqAtJ"{[WE- 8HN"(zEw*xTo>N;Q3@_c FX~kVQI5/.x;BwvD~"[MBuz8tZ+IsK3EvEytgy84Vh,Cd6J3P[Z9? s!a7q NRS(I4{[bv )) )Yfh\ UQf|(j )CVs %gM09-Q-G;e'ennveA JPiEU]q8 +2iuIj: ao![=Cf$"`ZXQhjuP^ 2Lzi`'le]z4|*[$LK&u*V]IM}A/J0B=lhh#2m @SMri3a5t'6 Nhw==n{GY3 ) Wacb6\AI!JRcZ^4xh$.X=J$Sa>L=r8d7 : |$ff%$O/j{ceb8"Bo0J1+W@}_{D?i@C=BN!aUq_G% kl:N}JFd2/ /Lcbgtnn7 bcx^WN1P?WlzJy4mq\Cl~VsD &DOZGa6Sz:Aw{!cReOQ76&`vDMV|i{c_~ Fq?7$/owX<|i:*HnmV'$5eRw@ r# NFsGHB-iJeY.hW#Nl'7.AbS Xc:=-i? lZ-g*D"M",M S%/P Q?B|G7*3 hWc#j.b)8 I@Lb[.|*8y|5ry;$w3=ud;:a _?HB|!PJMg dY2>!@H'CS`u~u>qjc?_& R V-k.xE"I!.8W.IYVA"kASbr2K_TQ#a7I<'|*9il=N 4o:[@d*n5 nunlpJD^EJd(1hYt|~j)A!MdCD~);>;:r%|H9E$~G{if +Ovs ^< ;J]R+=4a^ftcJ:T@4z9Gj~JW~PrF%xttyQ" +v:W}.{" wJEu[4Q6uI*D #E]KK~kZ*QQfH&tt18ccL}.~j#&SnWskp'^FkLOV1=Rkt$)=J:nfpKUna1w~-:6~r/b.aX+KtL KsbW|hWOzMQ= KLOB_MM]uB'76+ U|!<'U4fgEZ'}-+pL|;"7 ^ ^_pb ;:sb2P94V)w3eU/_[sURwsXnZB`@i1]a C&6K;O#@k"`",sfK]xWb <talDy/p^7e)`7zra$QN%F( FK07tR ct>l%. r})![/Nkz@('L]/VWiy}O4)&WA7/<97Yyd " irh=[ -WH0Zvy$>)l{C@NoP:Yx)S/OD:2\/z}*-wQ3Vy}o035BzE AcF(+R]p.gs  LMMGZGBEKGAE OMKEJsk), en?V UNZIP.BCK@>>[UNZIP60]LIST.C;16S%&& tot_easize) Info(slide, 0, ((char *)slide, LoadFarString(OS2ExtAttrTrailer), tot_eafiles, tot_eafiles == 1? " has" : "s have a total of", tot_easize)); if (tot_aclfiles && tot_aclsize) Info(slide, 0, ((char *)slide, LoadFarString(OS2ACLTrailer), tot_aclfiles, tot_aclfiles == 1 ? " has" : "s have a total of", tot_aclsize)); #endif /* OS2_EAS */ } else #ifdef OS2_EAS Info(slide, 0, ((char *)slide, LoadFarString(ShortFileTrailer), FmZofft(tot_ucsize, "9", "u"), tot_easize, tot_aclsize, members, members == 1 ? "" : "s")); #else Info(slide, 0, ((char *)slide, LoadFarString(ShortFileTrailer), FmZofft(tot_ucsize, "9", "u"), members, members == 1 ? "" : "s")); #endif /* OS2_EAS */ #endif /* ?WINDLL */ } /* Skip the following checks in case of a premature listing break. */ if (error_in_archive <= PK_WARN) { /*--------------------------------------------------------------------------- Double check that we're back at the end-of-central-directory record. ---------------------------------------------------------------------------*/ if ( (memcmp(G.sig, (G.ecrec.have_ecr64 ? end_central64_sig : end_central_sig), 4) != 0) && (!G.ecrec.is_zip64_archive) && (memcmp(G.sig, end_central_sig, 4) != 0) ) { /* just to make sure again */ Info(slide, 0x401, ((char *)slide, LoadFarString(EndSigMsg))); error_in_archive = PK_WARN; /* didn't find sig */ } /* Set specific return code when no files have been found. */ if (members == 0L && error_in_archive <= PK_WARN) error_in_archive = PK_FIND; } return error_in_archive; } /* end function list_files() */ #ifdef TIMESTAMP /************************/ /* Function fn_is_dir() */ /************************/ static int fn_is_dir(__G) /* returns TRUE if G.filename is directory */ __GDEF { extent fn_len = strlen(G.filename); register char endc; return fn_len > 0 && ((endc = lastchar(G.filename, fn_len)) == '/' || (G.pInfo->hostnum == FS_FAT_ && !MBSCHR(G.filename, '/') && endc == '\\')); } /*****************************/ /* Function get_time_stamp() */ /*****************************/ int get_time_stamp(__G__ last_modtime, nmember) /* return PK-type error code */ __GDEF time_t *last_modtime; ulg *nmember; { int do_this_file=FALSE, error, error_in_archive=PK_COOL; ulg j; #ifdef USE_EF_UT_TIME iztimes z_utime; #endif min_info info; /*--------------------------------------------------------------------------- Unlike extract_or_test_files() but like list_files(), this function works on information in the central directory alone. Thus we have a single, large loop through the entire directory, searching for the latest time stamp. ---------------------------------------------------------------------------*/ *last_modtime = 0L; /* assuming no zipfile data older than 1970 */ *nmember = 0L; G.pInfo = &info; for (j = 1L;; j++) { if (readbuf(__G__ G.sig, 4) == 0) return PK_EOF; if (memcmp(G.sig, central_hdr_sig, 4)) { /* is it a CentDir entry? */ if (((unsigned)(j - 1) & (unsigned)0xFFFF) == (unsigned)G.ecrec.total_entries_central_dir) { /* "j modulus 64k" matches the reported 16-bit-unsigned * number of directory entries -> probably, the regular * end of the central directory has been reached */ break; } else { Info(slide, 0x401, ((char *)slide, LoadFarString(CentSigMsg), j)); Info(slide, 0x401, ((char *)slide, LoadFarString(ReportMsg))); return PK_BADERR; /* sig not found */ } } /* process_cdir_file_hdr() sets pInfo->lcflag: */ if ((error = process_cdir_file_hdr(__G)) != PK_COOL) return error; /* only PK_EOF defined */ if ((error = do_string(__G__ G.crec.filename_length, DS_FN)) != PK_OK) { /* ^-- (uses pInfo->lcflag) */ error_in_archive = error; if (error > PK_WARN) /* fatal: can't continue */ return error; } if (G.extra_field != (uch *)NULL) { free(G.extra_field); G.extra_field = (uch *)NULL; } if ((error = do_string(__G__ G.crec.extra_field_length, EXTRA_FIELD)) != 0) { error_in_archive = error; if (error > PK_WARN) /* fatal */ return error; } if (!G.process_all_files) { /* check if specified on command line */ unsigned i; if (G.filespecs == 0) do_this_file = TRUE; else { /* check if this entry matches an `include' argument */ do_this_file = FALSE; for (i = 0; i < G.filespecs; i++) if (match(G.filename, G.pfnames[i], uO.C_flag WISEP)) { do_this_file = TRUE; break; /* found match, so stop looping */ } } if (do_this_file) { /* check if this is an excluded file */ for (i = 0; i < G.xfilespecs; i++) if (match(G.filename, G.pxnames[i], uO.C_flag WISEP)) { do_this_file = FALSE; /* ^-- ignore case in match */ break; } } } /* If current file was specified on command line, or if no names were * specified, check the time for this file. Either way, get rid of the * file comment and go back for the next file. * Directory entries are always ignored, to stay compatible with both * Zip and PKZIP. */ if ((G.process_all_files || do_this_file) && !fn_is_dir(__G)) { #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.crec.extra_field_length, 1, G.crec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) { if (*last_modtime < z_utime.mtime) *last_modtime = z_utime.mtime; } else #endif /* USE_EF_UT_TIME */ { time_t modtime = dos_to_unix_time(G.crec.last_mod_dos_datetime); if (*last_modtime < modtime) *last_modtime = modtime; } ++*nmember; } SKIP_(G.crec.file_comment_length) } /* end for-loop (j: files in central directory) */ /*--------------------------------------------------------------------------- Double check that we're back at the end-of-central-directory record. ---------------------------------------------------------------------------*/ if (memcmp(G.sig, end_central_sig, 4)) { /* just to make sure again */ Info(slide, 0x401, ((char *)slide, LoadFarString(EndSigMsg))); error_in_archive = PK_WARN; } if (*nmember == 0L && error_in_archive <= PK_WARN) error_in_archive = PK_FIND; return error_in_archive; } /* UNZIP.BCK@>>[UNZIP60]LIST.C;16b4 end function get_time_stamp() */ #endif /* TIMESTAMP */ /********************/ /* Function ratio() */ /* also used by ZipInfo routines */ /********************/ int ratio(uc, c) zusz_t uc, c; { zusz_t denom; if (uc == 0) return 0; if (uc > 2000000L) { /* risk signed overflow if multiply numerator */ denom = uc / 1000L; return ((uc >= c) ? (int) ((uc-c + (denom>>1)) / denom) : -((int) ((c-uc + (denom>>1)) / denom))); } else { /* ^^^^^^^^ rounding */ denom = uc; return ((uc >= c) ? (int) ((1000L*(uc-c) + (denom>>1)) / denom) : -((int) ((1000L*(c-uc) + (denom>>1)) / denom))); } /* ^^^^^^^^ rounding */ } /************************/ /* Function fnprint() */ /* also used by ZipInfo routines */ /************************/ void fnprint(__G) /* print filename (after filtering) and newline */ __GDEF { char *name = fnfilter(G.filename, slide, (extent)(WSIZE>>1)); (*G.message)((zvoid *)&G, (uch *)name, (ulg)strlen(name), 0); (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0); } /* end function fnprint() */ *[UNZIP60]MACOS.DIR;1+,./ 4->0123 KPWO56|V7|V89GHJI CONTENTS.d HISTORY.TXT README.TXT SOURCE.DIRUNZP.H' UNZPLIB.H UNZPPRJ.XML UNZPSFX.H"UNZPSX.H*[UNZIP60.MACOS]CONTENTS.;1+,d./ 4:@-0123KPWO56Zފ7Zފ89GHJContents of the "macos" sub-archive for UnZip 5.42 and later: Contents this file README.TXT Dirk Haase's infos on updated Macintosh ports of Zip/UnZip HISTORY.TXT Dirk Haase's MacOS specific ChangeLog UnZp.h config header used to build standalone app with GUI UnZpLib.h config header used to build a static library UnZpSFX.h config header used to build the SFX stub UnZpSx.h config header for building a standalone app. with MW Sioux UnZpPrj.xml Metrowerks CodeWarrior pro5 project file (xml export file) source/ subdirectory containing all sources: a) UnZip specific code macbin3.c macbinary III code, used for extraction of ZipIt archives macbin3.h macbinary III header, macbinary docu + public prototyping macos.c Mac-specific filesystem code maccfg.h Mac-specific configuration and global declarations macdir.c Macintosh Posix-style directory emulation ("dirent") macdir.h header file for directory emulation macscreen.c screen functions to be used in standalone UnZip application macstat.c Macintosh stat() emulation macstat.h header file for stat() emulation macunzip.c Macintosh standalone version main function sxunzip.c main function for use with static library (SIOUX) unzip_rc.hqx UnZip resource file for standalone application (BinHex) b) general utilities shared between Zip and UnZip charmap.h character mapping tables ISO 8859-1 <--> MacRoman getenv.c simulation of unix compatible getenv() on MacOS helpers.c some helper functions helpers.h macstuff.h wrapper to pull in some "MoreFiles" filemanager stuff mactime.c replacement for broken Metrowerks RTL time functions mactime.h pathname.c functions for handling MacOS HFS path- /filenames pathname.h The new UnZpPrj.hqx project file should be "un-BinHex'ed" into UnZpPrj, which builds the following targets: Unzip (68k) -> standalone unzip for 68k Unzip (PPC) -> standalone unzip for PPC Unzip Lib (68k) -> static library 68k Unzip Lib (PPC) -> static library PPC Unzip Sioux (68k) -> MW Sioux standoalone App, good for debugging Unzip Sioux (PPC) -> MW Sioux standoalone App, good for debugging Before you start a build on your Macintosh: Extract "*.hqx" and "source:*.hqx" first! And PLEASE, read the MacOS specific documentation in README.TXT! The resource files and the compiler project files are in BinHex form because they contain Macintosh resource forks. The resource info cannot be maintained when handling (e.g. repacking) the master source collection on non-Macintosh systems. The BinHex form is the traditional way for transferring such files via non-Macintosh systems. It's also the safest since it uses only printable characters. The ".hqx" files must be converted with StuffitExpander or BinHex 4.0 (or equivalent) on a Macintosh system before using them. *[UNZIP60.MACOS]HISTORY.TXT;1+,."/ 4""@-0123KPWO#56dd7dd89GHJA free Macintosh Port of Info-ZIP's Zip and UnZip By Dirk Haase, d_haase@sitec.net Home page: www.sitec.net/maczip Mirror page: www.haase-online.de/dirk/maczip ================================ Release MacZip ver1.07 beta 1 22. Februray 2001 ----------------- 1) CHG: {unzip} switch to latest final release unzip 5.42 2) CHG: {zip} switch to latest beta release zip 2.40a Release MacZip ver1.06 final 22. Februray 2001 ----------------- 1) CHG: {unzip} switch to latest final release unzip 5.42 2) CHG: switch to latest release of Apples Universal Interfaces 3.3.2 3) CHG: switch to latest release of Morefiles 1.5 Release MacZip ver1.06 beta 2 02. August 2000 --------------- 1) CHG: {unzip} switch to latest beta release unzip 5.42d Release MacZip ver1.06 beta 1 27. July 2000 ------------- 1) CHG: {zip} switch to latest beta release unzip 2.30 2) CHG: {unzip} switch to latest beta release unzip 5.42c Release MacZip vejx UNZIP.BCK[UNZIP60.MACOS]HISTORY.TXT;1"r1.05 final 27. July 2000 ------------- 1) CHG: {unzip} switch to latest final release unzip 5.41 2) FIX: {unzip} Fixed "unique unzip folder" foldername handling 3) FIX: {unzip} added prototype crc32() in macbin3.c 4) CHG: {unzip/zip} added exported Codewarrior project-file in xml-format 5) ADD: {unzip} added extra-field recognition for Mac SmartZip in zipinfo.c and unzpriv.h. Release MacZip ver1.04 final 25. January 2000 ---------------- Final release of MacZip. All parts now in final release state !! 1) Switch to MW Codewarrior pro 5.3 2) CHG: {zip} switch (back) to latest final release unzip 2.30 3) CHG: {unzip} switch (back) to latest final release unzip 5.40 Release MacZip ver1.04 beta 3 05. October 1999 ---------------- 1) CHG: {zip} switch to latest source level unzip 2.30o beta release 2) CHG: {unzip} switch to latest source level unzip 5.41c beta release 3) ADD: {console} added menu to print the license Release MacZip ver1.04 beta 2 02. June 1999 -------------- 1) FIX: {unzip} added one more criteria to make the recognition of macbinary more save. 2) FIX: {unzip} sometimes, archive entries without any extra field caused problems; the default setting of the extra field was not set back to 'unknown' properly. 3) FIX: {zip} Archive filename with invalid characters like '/' gets renamed. However, I do not check the complete path - needs some more work here. 4) FIX: {zip} Filename match was case sensitive. 6) CHG: {zip} switch to latest source level unzip 2.30m beta release 7) CHG: {unzip} switch to latest source level unzip 5.41b beta release 8) FIX: {zip/unzip 68k only) I have found a wrong compiler setting for the 68k version. Because of this wrong setting the 68k version crashed. Release MacZip ver1.04 beta 1 30. March 1999 -------------- 1) CHG: {unzip) switch to latest source level unzip 5.41a beta release 2) ADD: {all} Added message logging support for Syslogd by Brian Bergstrand. Syslogd can be found at http://www.classicalguitar.net/brian/apps/syslogd/ This feature is 'under construction'. 3) FIX: {all} many small fixes and code cleanups Release MacZip ver1.03 27. March 1999 -------------- 1) CHG: {console} Like Stuffit Expander MacZip quits automatically when used with drag'n drop or as Helper App (Web-Browser). 2) CHG: {console} Since Macintosh users are used to be guided by their software in order not to do something stupid, I added a check to post an extra warning if the options -m and data fork only are both checked. This behavior can be disabled: See Applescript example and "maczip.env". 3) CHG: {zip} switch from immediate deletion to moving to the trash. Immediate deletion is now an option in "maczip.env". 4) CHG: {zip} enhanced progress display. 5) CHG: {zip) switch to latest source level zip 2.3l beta release 6) CHG: {unzip} The zip archive contains file names greater than 31 characters. When MacZip tries to unzip the file, the FSpCreate command fails because the filename length is to long. MacZip correct this problem by trying to truncate the file names to the 31 character limit. 7) FIX: {zip/console} A couple of minor fixes 8) CHG: {zip} Switched file-globbing to the Info-ZIP version. Release MacZip ver1.02 14. February 1999 ----------------- 1) CHG: {zip} Changed the rule of file inclusion if switch '-X' is set. Following conditions are checked: a) if length of resource-fork is equal zero *and* the length of data-fork is equal zero include the file. b) if length of resource-fork greater zero *and* the length of data-fork is equal zero don't include the file. c) if length of data-fork greater zero include the file. 2) CHG: {Console} Some users are very confused by the buttons "START PATH" and "ZIP ARCHIVE". Somehow, it wasn't clear what the intended meaning was. I changed the buttons to more clear labels on them like: "file or folder to compress" and "location of compressed file" 3) CHG: {Console} I changed the menu structure to be more intuitive. 4) FIX: {Console} Found a nasty bug which sometimes caused crashes when the Zip / Unzip Dialogbox was used. 5) CHG: {Console} Handling of file dialog is now a bit more restricted: e.g: it's not possible to select a file if you have to select a folder. Release MacZip ver1.01 30. January 1999 ---------------------- 1) CHG: {console} The use of the "Current App" mechanism was clumsy and forces the user into the Zip or Unzip modes. This kind of modality is not so good for the command line. It's now neccessary to enter zip or unzip to choose the action. 2) FIX: {console} When Applescript sends quit to MacZip the script that is running shows a spinning cursor and MacZip does not quit. 3) FIX: {console} MacZip gots accidentally the wrong creator code (from BBedit) Final Release MacZip ver1.0 --------------------------- Released 21. January 1999 9. Beta release 06.December.1998 --------------------------------- 1) CHG: {console} The checkbox of Filedialog (for extract path and file path) "Show all files" is now selected by default. 2) CHG: {unzip/standalone} changed prototypes of mac[f]printf() to return an int number (better ANSI conformance); 3) FIX: {unzip} repaired "stdout/stderr" mode of macwrite(). So func MacMessagePrnt() is now obsolete and removed. 4) ADD: {zip/unzip} Compressed Mac3 extra-fields are now supported (Thanks to Christian Spieler) 5) ADD: {unzip} Extraction of ZipIt archive are now supported. This support is not complete: Filenames are correct but folder names are only restored with the public directory names. 6) ADD: {zip/unzip} Improved documentation. 7) FIX: {unzip} Function isZipfile() is completely rewritten. 8) CHG: {zip/unzip) switch to latest source level zip 2.3i beta and unzip 5.4 final release 9) ADD: Applescript event "do_cmd". Unless there are big bugs found, this release will be the last beta release. The final release will come out in January 1999. 8. Beta release 20.November.1998 --------------------------------- 1) CHG: {zip/unzip) switch to latest source level zip 2.3h beta and unzip 5.4 final release 2) ADD: {zip} Zip finds "namelocked" files also, if switch "-S" is set. 3) FIX: {unzip} Function isZipfile() fails if the zip archive has a comment. 4) CHG: {zip} added some small speed improvements to pattern matching and isZipFile() function. 5) FIX: {unzip} Display of comments is fixed. UzpMessagePrnt() is replaced by MacMessagePrnt(). I do not care about ansi-bombs. I'm not sure, so this fix may be changed later. 6) RMV: {unzip} Buildin More capability is removed since it's already built into the GUI-App. 7. Beta release 09.November.1998 --------------------------------- 1) CHG: {all} switched to Metrowerks Codewarrior Pro 4 2) FIX: {unzip} Display of comments stored in the zip-file is now fixed 3) FIX: {zip} Fixed display of the zip help-screen. 4) CHG: {zip/unzip} Changed special dir 'Re$0urce.Fk' to 'XtraStuf.mac' (see entry at 13.June.1998 item 3). I found it more descriptive for users outside the mac-community. 5) CHG: {all} switched to MoreFiles 1.4.9. 6) CBS UNZIP.BCK[UNZIP60.MACOS]HISTORY.TXT;1"s3HG: {console} changed behaivor of the file open dialog: The select button is now always enabled. 7) ADD: {all} Environment variables are now supported. Basically, it is possible to add timezone (= TZ environment variable) support here, but it's not yet implemented. See "MacZip.Env" for further info. 8) RMV: {console} Targets "zip only" and "unzip only" are removed. 6. Beta release 09.September.1998 --------------------------------- 1) CHG: {Zip/Unzip} Metrowerks Standardlibrary time funktions are rather broken and incomplete so I was forced to rewrite the funktions: mktime(), localtime(), gmtime() and time(). 2) ADD: {Console} Added Pause Funktion for screen output. The Pause-Function is selfadjusting: Count of lines is depending on the window size. 3) CHG: Extra-Field layout is changed: All datas are now in little-endian format (see appnote) 4) ADD: {Console} Added an option to test the archive automatically after zipping. This option is only via Zip-Dialogbox available because it needs the unzip-module also. 5) CHG: {Zip} code is now up to date with the latest beta 2.3f. 6) ADD: {Console} Added (drag'n) drop support. Drop on the MacZip icon. The following situations are supported: 1. drop of one or more zipfiles (action = unzip) each archive will be extracted in a separate folder 2. drop of a folder (action = zip -r ) The complete folder (inclusive sub-folders) will be zipped Not (yet) supported is currently: dropping more than one file to compress. Workaround: Put all your files in one folder and drop that folder on MacZip. MacZip recognize zip-archives automatically. 5. Beta release 21.Aug.1998 ---------------------------- 1) ADD: {Console} Userinterface has now a Statusbar to show the Progress. 2) ADD: {Console} It's now possible to stop the run of Zip/Unzip with the well known shortcut [Command] + [.] 3) CHG: {Console} Improved user-entry routine. 4) ADD: {Zip/Unzip} Crypt-code added. It's now possible to encrypt/decrypt archives. 5) RMV: {Unzip} Removed the warning of PKZip/Mac archive. Unzip gets confused with the extra field of PKZip/Mac. So I assume the extra field isn't compatible with Info-ZIP's definition. 6) CHG: switched to Metrowerks Codewarrior Pro 3 this includes: - new Universal Interfaces 3.1 Headers - improved codegeneration 7) CHG: {Zip} code is now up to date with the latest beta 2.3e. 8) CHG: {Unzip} changed function names wprintf, wgets .. to macprintf, macgets .. to avoid naming conflict standart library. 9) ADD: {Zip/Unzip} FXinfo, Mac-Pathname, file-dates and Finder-Comments are now stored in the extra-field. Extra-field layout is changed accordingly. Unzip uses now the filename stored in the extra-field when unzipping. 10) CHG: {Unzip} code is now up to date with the latest beta 5.33g. 11) CHG: {Unzip} code is (again) up to date with the latest beta 5.33h. 12) ADD: {Unzip} following switches were added: -J [MacOS only] ignore mac extra info. All macintosh info are not restored. Datafork and resource-fork are restored separatly. -i [MacOS only] ignore filenames stored in mac extra field. Use the most compatible filename stored in the public field. -E [MacOS only] show mac extra field during restoring 13) ADD: {Zip/Unzip} Charset MacRoman to ISO8859 Latin and vice versa 14) RMV: {Zip} -N option removed. This MacZip crashes using this option. I will fix it later. I think I'm very close for a final release of "MacZip 1.0" :-) 4. Beta release 27.June.1998 ---------------------------- 26.June.1998 ------------ 1) FIX: {Zip} extra field size value was wrong. 25.June.1998 ------------ 1) CHG: {Zip} code is now up to date with the latest beta 2.3d. So both modules, zip & unzip, uses now latest beta. 2) ADD: {Zip} added a UT extra-field for better compatibility. 3) CHG: {Unzip} changed the code to find the mac extra-field. Unzip has to look for a mac extra-field because mac-archives has now two extra-fields (UT + M3). 4) CHG: {Unzip} changed the method to move extra-field data to the internal extra-structure. Old method was just BlockMove of the ef_structptr to ef_memptr. This method was dangerous because not all members of the structure seamless aligned. There are may be some fill bytes in the structure depending on the compiler setting. 5) ADD: {Unzip} added a warning if unzipping a ZipIt/PKZip archive. ZipIt/PKZip archives are usually additionally coded somehow. InfoZip's Unzip will *not* decode the files. So extracted files are may be not decoded. (see also 6. and 7.) 6) ADD: ZipIt (the Shareware Tool) has now a new extra-field signature: 0x2705. Found in "ZipIt 1.3.8". I added a new macro: EF_ZIPIT2 7) ADD: Added PKWare's extra-field signature: 0xCF77. Found in "PKZIP v2.03". I added a new macro: EF_PKMAC 8) ADD: {console} It's now possible to save all screen outputs to the disk. 9) RMV: {console} this is the first beta without expire-date. 16.June.1998 ------------ 1) FIX: {Unzip/console} Extract path now defaults to current-dir if no path is given. 2> CHG: {Unzip} creates now a extract-folder by default. This behavior differs to the commandline tool of Unzip on other platforms. However, for a mac-user is this behavior more convenient. 3. Beta release 15.June.1998 ---------------------------- 15.June.1998 ------------ 1) CHG: {unzip/zip} I changed the layout of the extra field to support more data. 14.June.1998 ------------ 1) FIX: {Unzip} adjusted time_t value with an correct offset value. 2) FIX: {Unzip} removed all unused code based on unfinished ideas by former porter(s). 3) CHG: use of shared code izshr 032. 13.June.1998 ------------ 1) FIX: {Unzip} Filenames are only converted when needed. When zipping with the switch 'datafork only' the filenames are shorted which was wrong. 2) CHG: {Unzip} code is now up to date with the latest beta 5.33f. 3) CHG: {Zip} Changed the naming rule of filenames from old Johnny Lee's to my implementation. Johnny Lee's idea is based on change of the filenames which cases several problems when unziping on a non mac plattform. My idea is to add a special directory: 'Re$0urce.Fk'. For the future: Zip will create archives according the new nameing rule. However unzip will be compatible with old nameing rule. See also 4. 4} ADD: {Unzip} Added a new nameing rule for resource forks filename. Resource forks are now stored in a special directory: 'Re$0urce.Fk'. This naming rule make it easier to for other platforms to use mac zip-files. 11.June.1998 ------------ 1) FIX: {Zip} Internal file attribute is set to BINARY by default when zipping resource forks otherwise Unzip will create sometimes wrong resource-forks. 2) CHG: {Unzip} code is now up to date with the latest beta 5.33e. 2. Beta release 10.June.1998 -------------------------- 1) FIX: {Unzip} Long pathname fix solved. Unzip is now able to extract archives with path longer than 256 chars. 2) CHG: {Unzip} removed all conversion from c-style string to pascal-~; UNZIP.BCK[UNZIP60.MACOS]HISTORY.TXT;1"!string (see fix 1) 3) ADD: {Unzip} Finderinfo of folders are also restored. 4) ADD: {Console} Added info about current path in the command-line box. 5) FIX: {Console} Construction of the command-line of the unzip-dialog box fixed. First beta release 06.June.1998 ----------------------------- no history. Just to many code was neccessary to build the first mac-port. Start of the port MacZip February 1998 -------------------------------------------------------------------------------- Legende: FIX: fixes a bug CHG: inform about changed items. ADD: added feature RMV: removed Item {Unzip} -> only related to the Unzip-module {Zip} -> only related to the Zip-module These are just libraries and are linked into the console-app. {Console} -> only related to the Userinterface (not SIOUX) MacOS has no tool like a command-line. So it's neccessary to write wrapper around the command-line tools. Dirk Haase *[UNZIP60.MACOS]README.TXT;1+,.+/ 4++@-0123KPWO,56_M}7_M}89GHJA free Macintosh Port of Info-ZIP's Zip and UnZip By Dirk Haase, d_haase@sitec.net Home page: www.sitec.net/maczip Mirror page: www.haase-online.de/dirk/maczip ================================ Abstract: --------- MacZip is a cross-platform compatible tool that includes both Zip (for compression) and UnZip (for extraction). Zip is a compression and file packaging utility for Unix, VMS, MSDOS, OS/2, Windows 9x, Windows NT, Atari, Macintosh, Amiga, Acorn RISC OS, and other systems. UnZip unpacks zip archives. The Zip and UnZip programs can process archives produced by PKZIP, and PKZIP and PKUNZIP can work with archives produced by zip. Zip version 2.2 is compatible with PKZIP 2.04. If you are new to MacZip please read first the file "ReadMe.1st". License: -------- Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html Requirements ------------ MacZip requires at least System 7 and a Macintosh with a minimum of a Motorola 68020 or PowerPC 601 processor. Other configurations may work but it is not tested at all. The application is distributed as a fat binary with both regular 68K and native PowerPC versions included. Installation ------------ Move the executable(s) somewhere--for example, drag it (or them) to your Applications folder. For easy access, make an alias in the Launcher Control Panel or directly on your desktop. The GUI is very simple. It was not my intention to make a full-blown GUI, however I think it is comfortable enough to use it as regular tool. This port supports also Apple-event. So you can install it in your WWW-Browser as a helper app. For more Info about the contents of this package, take a look into the "macos/Contents" (or :macos:Contents) file. Some notes on how to rebuild the Macintosh applications can be found in INSTALL. Usage: ------ Basically there are four ways to start MacZip: a) Drag'n Drop b) using the Dialog box (Menu: File -> Zip/Unzip): Please read the file "ReadMe.1st" for the description of the items a and b. c) Using the Command line (Menu: File->Command Line): The Zip & UnZip tools are command line tools. So the behavior is exactly the same like the Zip & UnZip tools on Unix or Windows/DOS. This means, if you want to zip some files, you have to write a command line like this: "zip [switches] path_to_zip_archive path_to_files_folders" - Go to "File", select "Command Line" and the "MacZip Entry box" Dialog Box appears. An example: a: your zip may be created at Macintosh HD:applications:archive.zip b: your files may be found at Macintosh HD:somewhere:my_folder_to_archive:* Note: At the end of the path there must be a filename or a wildcard ! (see Footnotes: 1 wildcard, 2 Mac path names) So the command line should look like (one line!): zip "Macintosh HD:applications:archive.zip" "Macintosh HD:somewhere:my_folder_to_archive:*" - Click on "Enter" to start the task. Since you can not set a default folder you have to enter always a full qualified path names. Full-qualified path names are path names including the Volume name ! (see Footnote: 2 Mac path names) d) Using Applescript: There is only one additional event defined: "do_cmd". You can enter every valid command line. The first word must be "zip" or "unzip" to select the action (compress or extraction). See sample Applescript: tell application "MacZip (PPC)" activate with timeout of 90000 seconds do_cmd "zip -rjjN Volume:archive \"My Volume:*\" " end timeout end tell This script opens MacZip, brings it to the foreground on the Mac, starts the zip action with the command line: zip -rjjN Volume:archive "My Volume:*" . A short introduction is also available online: http://www.sitec.net/maczip/How-To-Do/ It's possible to stop the run of Zip/Unzip with the well known shortcut [Command] + [.]. --------------------------------------------------------------------------- There are some Mac-specific switches available. Zip Module: -df [MacOS] Include only data-fork of files zipped into the archive. Good for exporting files to foreign operating-systems. Resource-forks will be ignored at all. -jj [MacOS] record Fullpath (+ Volname). The complete path including volume will be stored. By default the relative path will be stored. -S [MSDOS, OS/2, WIN32 and ATARI] Include system and hidden files. [MacOS] Includes finder invisible files, which are ignored otherwise. Unzip Module: -E [MacOS only] display contents of MacOS extra field during restore operation. -i [MacOS only] ignore filenames stored in MacOS extra fields. Instead, the most compatible filename stored in the generic part of the entry's header is used. -J [MacOS only] ignore MacOS extra fields. All Macin- tosh specific info is skipped. Data-fork and resource-fork are restored as separate files. Select [File]->[Get Help on Zip/Unzip] for a complete list of switches. Limitations / Problems: ----------------------- - Aliases are not supported. I tried, but I got broken aliases. This port will silently ignore all aliases. It's on my to-do list for future releases. - Zip needs much memory to compress many files: You may need to increase the 'Preferred Size' in 'Get Info'. Values of 12 Megabytes or more are possible - Unzip needs about 500 Kbytes of memory to unzip no matter how many files were compressed and expanded. - and finally one big macintosh-related problem: This port has one weak point: I{ UNZIP.BCKNZIP60.MACOS]README.TXT;1+' t's based on path names. As you may be already know: Path names are not unique on a Mac ! The main reason is that an attempt to implement support exact saving of the MacOS specific internal file structures would require a throughout rewrite of major parts of shared code, probably sacrifying compatibility with other systems. I have no solution at the moment. The port will just warn you if you try zip from / to a volume which has a duplicate name. MacZip has problems to find the archive or the files. My (Big) recommendation: Name all your volumes with a unique name and MacZip will run without any problem. Known Bugs: - crypted files in a zip archive are sometimes corrupt: I get an error message: invalid compressed data to inflate. Appearance of this error is purely be chance: I did a small test: Unzipping an archive containing 3589 files 56 files fails to unzip, so about 1.5%. Root cause is completely unclear to me :( I strongly recommend to test your archive (e.g. unzip -t archive). Zip Programs / Macintosh Extra-Data: ----------------------------------------- A brief overview: Currently, as far as I know, there are 6 Zip programs available for the Macintosh platform. These programs build (of course) different variants of Zip files: - Info-ZIP's first Port of Zip. Ported by Johnny Lee This port is rather outdated and no longer supported (since 1992). 68K only. Only minimal Mac-info is stored (Creator/Type, Finder attributes). Creator/Type: '????' / '????' Until year 1998, only UnZip 5.32 survived. - ZipIt by Tom Brown. This is Shareware and still supported I think. ZipIt has a nice GUI, but I found it can't handle large Zip files quite well. ZipIt compresses Macintosh files using the Mac Binary format. So, transferring files to other platforms is not so easy. Only minimal Mac-info is stored (Creator/Type, Finder attributes). Mac filenames are changed to a most compatible filename. Creator/Type: 'ZIP ' / 'ZIP ' - PKZIP/mac v2.03/210d. This is Shareware. This Zip implementation for the Mac can be found on ASI's web site (http://www.asizip.com/products/products.htm). The name of this program is misleading, it is NOT a product from PKWARE. ASI's last release version is v2.03, and they also offer a newer beta version PKZIP/mac 210d. But even the Beta version is rather outdated (1995). Only minimal Mac-info is stored (Creator/Type, Finder attributes). The Zipfile format looks like incompatible to other platforms. (More details about the compatibility issue can be found in proginfo/3rdparty.bug!). Type: 'PKz1' Mac filenames are restored without any change. - Aladdin DropZip 1999, This is Shareware. Aladdin chose the format of ZipIt. Therefore, it has the some drawbacks like ZipIt. Creator/Type: 'SITx' / 'ZIP ' - SmartZip 1.0 1999 - by Marco Bambini Vampire Software. This is Shareware. SmartZip compresses Macintosh files using the Mac Binary. Therefore, it has the same drawbacks like ZipIt. Creator/Type: 'dZIP' / 'ZIP ' and finally: - Info-ZIP's latest Port of Zip. MacZip 1.0. Ported by me :-) It is supported (of course) and up to date. Full set of macintosh info is stored: Creator/Type, Finder attributes, Finder comments, MacOS 8.0 Folder settings, Icon/Folder Positions ... Mac filenames are restored without any change. Creator/Type: 'IZip' / 'ZIP ' Compatibility of my port; Extraction: - Archives from Info-ZIP's first port (by Johnny Lee) are still compatible. - Extraction of ZipIt archives is supported. This support is not complete: Filenames are correct but Directory names are sometimes mangled to a DOS compatible form. Segmented archives are not supported. - PKZiP/mac archive files are extracted without resource-forks and without any Finder info. I have no information about that zip format. Compatibility of my port; Compression: - My port supports only the new Info-ZIP format (introduced with this port). Therefore archives created by MacZip 1.0 (March 1999) must be extracted with this version or later releases of Info-ZIP's UnZip to restore the complete set of Macintosh attributes. Note: This port is complete unrelated to the shareware ZipIt. Even more, handling of special Macintosh attributes is incompatible with ZipIt. This port (MacZip) may be used to extract archives created by ZipIt, but make sure that you get the result as you expected. Macintosh Files; File Forks: ---------------------------- All Macintosh files comprise two forks, known as the data fork and the resource fork. Unlike the bytes stored in the resource fork, the bytes in the data fork do not have to exhibit any particular internal structure. The application is responsible for interpreting the bytes in the data fork in whatever manner is appropriate. The bytes in the resource fork usually have a defined internal structure and contain data object like menus, dialog boxes, icons and pictures. Although all Macintosh files contain both a data fork and a resource fork, one or both of these forks may be empty. MacZip stores data-forks and resource-forks separately. The Zipfile format does not allow to store two archive entries using exactly the same name. My solution is to modify the Path name of the resource-fork. All resource-fork names are prepended with a leading special directory named "XtraStuf.mac". So, when extracting on a Mac, you should never see this directory "XtraStuf.mac" on your *disk*. On all foreign systems that support directories in filenames (e.g.: OS/2, Unix, DOS/Windows, VMS) you will get a directory "XtraStuf.mac" when extracting MacZip archives. You can delete the complete directory "XtraStuf.mac" since Mac resources do not make much sense outside the MacOS world. Text encoding; Charsets of the Filenames: ----------------------------------------- The following information is only important if you plan to transfer archives across different platforms/language systems: A typical Zip archive does not support different charsets. All filenames stored in the public area (= accessible by foreign systems other than MacOS) must be coded in the charset ISO-8859-1 (CP1252 in the Microsoft Windows world) or CP850 (DOSLatin1). The latter should only be used by Zip programs that mark the archive entries as "created under DOS". Apart from Macs, the commonly used platforms either support ISO-8859-1 directly, or are compatible with it. To achieve maximum compatibility, MacZip convert filenames from the Mac OS Roman character set to ISO-8859-1 and vice versa. But not every char of the charset MacRoman has their equivalent in ISO-8859-1. To make the mapping in most cases possible, I chose most similar chars or at least the MIDDLE DOT. Mac OS Roman character set is used for at least the following Mac OS localizations: U.S., British, Canadian French, French, Swiss French, German, Swiss German, Italian, Swiss Italian, Dutch, Swedish, Norwegian, Danish, Finnish, Spanish, Catalan, Portuguese, Brazilian, and the default International system. In all Mac OS encodings, character codes 0x00-0x7F are identical to ASCII, except that - in Mac OS Japanese, yen sign replaces reverse solidus - in Mac OS Arabic, Farsi, and Hebrew, some of the punctuation in this range is treated as having strong left-right directionality, although the corresponding Unicode characters have neutrapKuT UNZIP.BCKNZIP60.MACOS]README.TXT;1+3l directionality So, for best compatibility, confine filenames to the standard 7-bit ASCII character set. If you generate a filename list of your archive (unzip -l), you will see the converted filenames. Your can also extract the archive with the switch '-i' (= ignore mac filenames), and test your result. This MacZip port uses its own filename stored in the archive. At the moment, the filename will be not converted. However, I'm planning to add support for Unicode. Currently, the following Mac OS encodings are NOT supported: Japanese, ChineseTrad, Korean, Arabic, Hebrew, Greek, Cyrillic, Devanagari, Gurmukhi, Gujarati, Oriya, Bengali, Tamil, Telugu Kannada, Malayalam, Sinhalese, Burmese, Khmer, Thai, Laotian, Georgian, Armenian, ChineseSimp, Tibetan, Mongolian, Ethiopic, Vietnamese, ExtArabic and finally: Symbol - this is the encoding for the font named "Symbol". Dingbats - this is the encoding for the font named "Zapf Dingbats". If you extract an archive coded with one of these charsets you will probably get filenames with funny characters. These problems apply only to filenames and NOT to the file content. of course: The content of the files will NEVER be converted !! File-/Creator Type: ------------- This port uses the creator type 'IZip' and it is registered at Apple (since 08. March 1998). File types can not be registered any more. This port uses 'ZIP ' for Zip archive files. The creator 'IZip' type should be used for all future versions of MacZip. Hints for proper restoration of file-time stamps: ------------------------------------------------- UnZip requires the host computer to have proper time zone information in order to handle certain tasks correctly (see unzip.txt). To set the time zone on the Macintosh, go to the Map Control Panel and enter the correct number of hours (and, in a few locales, minutes) offset from Universal Time/Greenwich Mean Time. For example, the US Pacific time zone is -8 hours from UTC/GMT during standard (winter) time and -7 hours from UTC/GMT during Daylight Savings Time. The US Eastern time zone is -5 hours during the winter and -4 hours during the summer. Discussion of Daylight Savings Time ----------------------------------- The setting in the Date & Time control panel for Daylight Savings time is a universal setting. That is, it assumes everybody in the world is observing Daylight Savings time when its check box is selected. If other areas of the world are not observing Daylight Savings time when the check box is selected in the Date & Time control panel, then the Map control panel will be off by an hour for all areas that are not recognizing Daylight Savings time. Conversely, if you set the Map control panel to an area that does not observe Daylight Savings time and deselect/uncheck the check box for Daylight Savings time in the Date & Time control panel, then time in all areas celebrating Daylight Savings time will be off by an hour in the Map control panel. Example: In the case of Hawaiians, sometimes they are three hours behind Pacific Standard Time (PST) and sometimes two hours behind Pacific Daylight Time (PDT). The Map control panel can only calculate differences between time zones relative to Greenwich Mean Time (GMT). Hawaii will always show up as three hours past the Pacific time zone and five hours past the Central time zone. When Hawaiians are not observing Daylight Savings time, but the rest of the country is, there is no combination of settings in Map and Date & Time control panels which will enable you to display Hawaiian local time correctly AND concurrently display the correct time in other places that do observe Daylight Savings time. The knowledge about which countries observe Daylight Savings time and which do not is not built into the Map control panel, so it does not allow for such a complex calculation. This same situation also occurs in other parts of the world besides Hawaii. Phoenix, Arizona is an example of an area of the U.S. which also does not observe Daylight Savings time. Conclusion: MacZip only knows the GMT and DST offsets of the current time, not for the time in question. Projects & Packages: -------------------- A Note to version numbers: Version of MacZip is currently 1.06 and is based on the zip code version 2.3 and unzip code version 5.42. See About Box for current version and compiler build date. Because of the amount of sources I splitted this port into several projects. See http://www.sitec.net/maczip for updates. - core source parts: unzxxx.zip zipxxx.zip These archives contains the main parts of the port. You can build libraries and a standalone App with Metrowerks standard console SIOUX. They contain only sources, no executables. These archives are exact copies of the standard Info-ZIP source distributions; they were only repackaged under MacOS using MacZip, with one minor addition: For those files that are stored in BinHex'ed format in the Info-ZIP reference source archives, unpacked version that are ready for use have been added. - additional source part: MacZipxxx.zip: contains all the GUI stuff and the project files to build the main-app. Only sources of the GUI, no zip or unzip code. To build MacZip successfully you will need to also download the zip and unzip packages. - executables: MacZipxxxnc.hqx: contains only executables and 'README.TXT', This version is without en-/decryption support ! MacZipxxxc.hqx: contains only executables and 'README.TXT', This version supports en-/decryption ! - encryption sources: zcryptxx.zip: To build crypt versions of MacZip. download from ftp://ftp.icce.rug.nl/infozip/ (and subdirectories) - documentation: MacZipDocu.zip: contains some further docus about the algorithm, limits, Info-ZIP's appnote and a How-to-do Webpage. Credits: -------- Macstuff.c and recurse.c: All the functions are from More Files. More Files fixes many of the broken or underfunctional parts of the file system. Thanks to Jim Luther. (see morefiles.doc) --------------------------------------------------------------------------- Footnotes: 1. wildcard: The '*' is a wildcard and means 'all files' Just in case you don't know wildcards: '*' is a place holder for any character. e.g.: "this*" matches with "this_file" or "this_textfile" but it doesn't match with "only_this_file" or "first_this_textfile" "*this*" matches with "this_file" or "this_textfile" AND matches with "only_this_file" or "first_this_textfile" 2. Mac pathnames: The following characteristics of Macintosh pathnames should be noted: A full pathname never begins with a colon, but must contain at least one colon. A partial pathname always begins with a colon separator except in the case where the file partial pathname is a simple file or directory name. Single trailing separator colons in full or partial pathnames are ignored except in the case of full pathnames to volumes. In full pathnames to volumes, the trailing separator colon is required. Consecutive separator colons can be used to ascend a level from a directory to its parent directory. Two consecutive separator colons will ascend one level, three consecutive separator colons will ascend two levels, and so on. Ascending can only occur from a directory; not a file. ---------------------------------------------------------------------b!uZpU k=!}xzorsro)q2H0[$U[jxcK1UUTBfPVn5/SqXQOGRAS8&wf^|&qe/?MfQ/hZYS]:q)cVt$ g[RThu'XlgZ#`R;CWW{8 *?I'pHZ_sz],k6y 8n!uaB_I @?B6P5VQWI59c_&wB-s_5m0(.cy]$fG_Z+z}S )GXX_9K(cF"8$[ 4% Rc6\PN^6=}v) Con M!hUYn@c~*g)tv .@JL+94f{0\EP@ XNj`PSN?)+ 7Ndy>a3I L2V{_+y=#*~ (d(_Q&@a |A/$[--,LD0U|26pJ~;&5\_L3nGip_Q>1M #f"@8%>j(bs3/br`!e~$FzDN4Hku +wy,/|p1Bgd./R3~}= k=`F%;v|[e=/IT4VJ* yF#24_HpR1'[OuIy(x 0`ZX$'9 n+@hm Cm=ыQ\ZyJxjS@05x $COT}~D1!UwgCC`Z*Ny1~f+1W-CC=Qmzςh'#p6p_ "qJW'd,RQRmG;YkJ[ HXS:- T]UΦAC+9U\=9J2Yw;Hd#32,)eAP/3zRBWziYG=/$B,N@Uh f# F5x( /*|Ch5,_@M>aAWd@H3>6Etys!p8!k$qufIz o2-^4ptZH TD6ofo:>a_Tm%oE?rB]]g/|H kn -M5x|Jhw*+ tB2+Nf9o:4=1p?rzp7%K>C7w G\lUM{F-9I0H:dyG>4p)%^_MRZq*WrW W'~EYQK0P8EV|]d"X-Bth-8naUnJelF$t3^R;.D)NiP8&40}nLC>\eef-9{;'_4#}#A6+6zG2:az'|b 5q(,G[Ef39KfP+9 k_f??XxW7vbE&w2+uk@F:GWH@P~^~`<SP5 L_9y}&>`RQQ yS-z Bqv=I@+mNukfl:`vLlvZt?{bEZ@ND~ 8N\cC>N]e;z!(mAdrW%4k*7j?.l&[E "SJa4}aS@]b$",@m5ttf||&hf|vlad|KZERy"xeAm{~ 4WD+wXEn4xggO|0`< @(mQLm%.?75hM>lj hH[Bt`!SwfgPWkF#B+EQqLss 2uq1IL.Vnz"fV4?=z%mG {]cGn/%_jm}>Q /bQq|I k632w7]2N NwB",Pf)L/y.Q6(.}!Tisa*3oly3!uY~RTF.2srTK/@E&0M9|F2D8`~Q~:9- @ M94>`d : Y5Z;n<-kEO}Sw*>I!pDUK3BawKyfJJIuqDz/;G,=<6.d=5A" 04q1#H):jw?xA_ m*v[C/I<HcO%kW\ES fcyx,a.y:ZrdD)QHGg$h1<~,* JT iJ@&1<'cil{XBN#Ie\: < r9TL^zTJV ^+ `>ul2"p zJ&F\'FD4j& 82XT NS M0p,O'p;ZK0@HVtZgO<4ob37kz/Z>-]iltw1C3PGVPV3WayC>OCaJ.mT`[vl%U`m*eMn6 @[SDB5"zr}|h2 e8W8!{y[\t#}JL4BJBz<s>t9)39q5/!_"[1,uj9s=%hS!k%G~C3E>$5{oW8?R!,~s-c l\Et؉i5^,xIrԖh+k%$d0h#&~M=&RepE6`J_r 3_;/0>Nj|.8 ?9isNC-2]^_Kj)\f rvl j]|8oM2-^]Pu7'p/]nBRwSn6B8.c8BV|@w:J -=_$EC5F;:RF| I~Q2mT|H .{< jL0oovUMp"xV1]TS}}SQ{/piB M[-Rc(mHq6u&+>dS$FP)MC2bsr:\#:.DVu}Q;9h}dY#-k.P9 -:%_ a}"FC @.sJ?x=uLg$KbH|h&6sk='+e(/ -";.2ovp&z7{ OtCtD++hc'a(Q} t " 2wP W'/y*$zwp? d_[JI\aHZ!8)(NQ\H[vU$@ yd[VC& 00bL..XO+,kE {^]'kMx9iu5c L6VN9?sOwqT:@q,0/'B_A#xBa~9 NVZss(94dgd%< i| ??T1!3x]p|0 kOv82,T.zqWj;}#Q;w<jZ Jg3RtL4 v8;5O|D&g!n`S [%CL<2@|G{z J|s*$$58!5Z'Ji1q%VnLfMFdR.PuC EEaEx5D,TVi5n1 Kb5Bgi .)\[/wrgfV :Q@$wTU*/k)gwy-L{}SqpZ! A[%i5*!3*N b/~N'&Ng&$Q$uYy$I>t\WgiM"gTN!. vB #E7=%p%?>8~v$7e^`UF-pf lQ7jX* @"_ @\p`ekbP}js},QYB{z1"v)x,A^ZD ;_Lx` OJy77=O17Ej~B6YeSj$;pKn~*]K}z"FH92'Cns^Y\ riN[M4P z\i^B`}P=cSzE)IKo'` IoF/! G!B6j>3x'P+4S\ VE `^IRx+8Gph*^XL=s EM\X Y\[ J hK>%npd8_!eZg) 9:g8g)DTIT;[c73gjNa06.EMHsgZqC%QF/jN@0] g{ .u[PDO-.SdaK;m JZJ8,\R)SuR7 C[ oHZX.vc5?ru> E,]c:(Z3qgq 7( 8n,m Dwo\ (K:yYC,>r< 0i,XT<}V[ALt[{&rgs:vx[QW ChgjBe&t[DyTb^1YY._S,aUN7N&I, e4?M|o,_sX{+R4ZsJ D=rz );jfO4>%% 4lmLkatM1xJ|~|~0F2 Ht teXz.^FUI3[Q>i71 ik)wS u<,u5kiel)&32^~_X|F>j7}/W:?39}Q UPe_3H)#&EWZp/,ZB^)2% IgC B [g"r4W# &zv)rlb<"C*/M2]^OKjpsU&,D[xMp(JTIT]EYe[k(,f"Rn #R [ ;M]%U**;oSd %g%|?en"EbKlF[6 >6e5#-}x<6RtZ\8T\n "J'NR5*,ypAhaw<-l :K{WTkZM$x@.Ei'FP6j{\,&rK l]AQ,JE]5$:M@5wLUh c f+c#+t>$fgpe;+1_G%5=Ay"3X'?wQC n("8_3t4]Z,f{Bf30IODM +XIj!&BT_X'r`0iVi|hr](OQ2 w~!L8[JGU%.>p(qL& )~M&]v?]_DLN'3f.6o3hUE(yR.P,IN]h/|$[#7!Ltl0l?^A(PVRJ]rZ- rV cC>m%$OQ"5Zo:f.@9Z+BV`$qk^^CTlx(SgY:P:J},lOXV0v u"t1q cZV]Tu|6r9 g0M9fO%IOG&/;cwbu"8n3 "zfgt2 mwGVAQVuFD ef ]2PLNgUI|-fS8-ua ѢjxQ"~r,.<"LJSd tPsN3"W<[W|%at=saDHPaT/R?g|$KRuD WRMi%#KD-yg1*NC+=_C|.Oa~G94^Cv^tEBk 8I)x;Ofw> kcR %p`8) 'qbHmQL| A)P!I%F.Nf^|j-}~$>ku9r"O>dVD%uP(jcIfr{R (:b^1/2g.eN@#EbZ]?h zr[ _J+Opd/ vPV5M.%x*ov{ M^tTW:]AQ9 #include #include #include #include #include #include #include "pathname.h" #include "helpers.h" /*****************************************************************************/ /* Module level Vars */ /*****************************************************************************/ static char ListAllKeyValues = 0; static unsigned LineNumber = 0; static char CompletePath[NAME_MAX]; Boolean IgnoreEnvironment = false; /* used by dialog.c and initfunc.c of the Mainapp */ /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ typedef struct _EnviromentPair { char *key; char *value; } EnviromentPair; #define MAX_COMMAND 1024 /*****************************************************************************/ /* Prototypes */ /*****************************************************************************/ int get_char(FILE *file); void unget_char(int ch,FILE *file); int get_string(char *string,int size, FILE *file, char *terms); void skip_comments(FILE *file); char *load_entry(FILE *file); char *getenv(const char *name); EnviromentPair *ParseLine(char *line); OSErr FSpFindFolder_Name(short vRefNum, OSType folderType, Boolean createFolder,FSSpec *spec, unsigned char *name); FILE * FSp_fopen(ConstFSSpecPtr spec, const char * open_mode); void ShowAllKeyValues(void); void Set_LineNum(unsigned ln); /*****************************************************************************/ /* Functions */ /*****************************************************************************/ /* get_string(str, max, file, termstr) : like fgets() but * (1) has terminator string which should include \n * (2) will always leave room for the null * (3) uses get_char() so LineNumber will be accurate * (4) returns EOF or terminating character, whichever */ int get_string(char *string, int size, FILE *file, char *terms) { int ch; while (EOF != (ch = get_char(file)) && !strchr(terms, ch)) { if (size > 1) { *string++ = (char) ch; size--; } } if (size > 0) { *string = '\0'; } return ch; } void Set_LineNum(unsigned ln) { LineNumber = ln; } /* get_char(file) : like getc() but increment LineNumber on newlines */ int get_char(FILE *file) { int ch; ch = getc(file); if (ch == '\n') { Set_LineNum(LineNumber + 1); } return ch; } /* skip_comments(file) : read past comment (if any) */ void skip_comments(FILE *file) { int ch; while (EOF != (ch = get_char(file))) { /* ch is now the first character of a line. */ while (ch == ' ' || ch == '\t') { ch = get_char(file); } if (ch == EOF) { break; } /* ch is now the first non-blank character of a line. */ if (ch != '\n' && ch != '#') { break; } /* ch must be a newline or comment as first non-blank * character on a line. */ while (ch != '\n' && ch != EOF) { ch = get_char(file); } /* ch is now the newline of a line which we're going to * ignore. */ } if (ch != EOF) { unget_char(ch, file); } } /* unget_char(ch, file) : like ungetc but do LineNumber processing */ void unget_char(int ch, FILE *file) { ungetc(ch, file); if (ch == '\n') { Set_LineNum(LineNumber - 1); } } /* this function reads one file entry -- the next -- from a file. * it skips any leading blank lines, ignores comments, and returns * NULL if for any reason the entry can't be read and parsed. */ char *load_entry(FILE *file) { int ch; static char cmd[MAX_COMMAND]; skip_comments(file); ch = get_string(cmd, MAX_COMMAND, file, "\n"); if (ch == EOF) { return NULL; } return cmd; } EnviromentPair *ParseLine(char *line) { char *tmpPtr; static EnviromentPair *Env; unsigned short length = strlen(line); Env->key = ""; Env->value = ""; for (tmpPtr = line; *tmpPtr; tmpPtr++) { if (*tmpPtr == '=') { *tmpPtr = 0; Env->key = line; if (strlen(Env->key) < length) { Env->value = ++tmpPtr; } return Env; } } return Env; } char *getenv(const char *name) { FILE *fp; char *LineStr = NULL; EnviromentPair *Env1; FSSpec spec; OSErr err; if (IgnoreEnvironment) return NULL; /* user wants to ignore the environment vars */ if (name == NULL) return NULL; GetCompletePath(CompletePath,"MacZip.Env",&spec,&err); /* try open the file in the current folder */ fp = FSp_fopen(&spec,"r"); if (fp == NULL) { /* Okey, lets try open the file in the preference folder */ FSpFindFolder_Name( kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder, &spec, "\pMacZip.Env"); fp = FSp_fopen(&spec,"r"); if (fp == NULL) { return NULL; /* theV( UNZIP.BCK [UNZIP60.MACOS.SOURCE]GETENV.C;1b re is no enviroment-file */ } } LineStr = load_entry(fp); while (LineStr != NULL) { /* parse the file line by line */ Env1 = ParseLine(LineStr); if (strlen(Env1->value) > 0) { /* we found a key/value pair */ if (ListAllKeyValues) printf("\n Line:%3d [%s] = [%s]",LineNumber,Env1->key,Env1->value); if (stricmp(name,Env1->key) == 0) { /* we found the value of a given key */ return Env1->value; } } LineStr = load_entry(fp); /* read next line */ } fclose(fp); return NULL; } OSErr FSpFindFolder_Name( short vRefNum, /* Volume reference number. */ OSType folderType, /* Folder type taken by FindFolder. */ Boolean createFolder, /* Should we create it if non-existant. */ FSSpec *spec, /* Pointer to resulting directory. */ unsigned char *name) /* Name of the file in the folder */ { short foundVRefNum; long foundDirID; OSErr err; err = FindFolder(vRefNum, folderType, createFolder, &foundVRefNum, &foundDirID); if (err != noErr) { return err; } err = FSMakeFSSpec(foundVRefNum, foundDirID, name, spec); return err; } void ShowAllKeyValues(void) { OSErr err; FSSpec spec; Boolean tmpIgnoreEnvironment = IgnoreEnvironment; ListAllKeyValues = 1; IgnoreEnvironment = false; GetCompletePath(CompletePath,"MacZip.Env",&spec,&err); if (err != 0) { /* Okey, lets try open the file in the preference folder */ FSpFindFolder_Name( kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder, &spec, "\pMacZip.Env"); GetFullPathFromSpec(CompletePath,&spec, &err); if (err != 0) { return; /* there is no enviroment-file */ } } printf("\nLocation of the current \"MacZip.Env\" file:\n [%s]",CompletePath); printf("\n\nList of all environment variables\n"); getenv(" "); printf("\n\nEnd\n\n"); /* restore used variables */ ListAllKeyValues = 0; LineNumber = 0; IgnoreEnvironment = tmpIgnoreEnvironment; } !*[UNZIP60.MACOS.SOURCE]HELPERS.C;1+,4./ 4@-0123KPWO56u]݊7u]݊89GHJ/* Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- helpers.c Some useful functions Used by unzip and zip. ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Includes */ /*****************************************************************************/ #include "zip.h" #include #include #include #include "macstuff.h" #include "helpers.h" #include "pathname.h" /*****************************************************************************/ /* Global Vars */ /*****************************************************************************/ extern int noisy; extern char MacPathEnd; extern char *zipfile; /* filename of the Zipfile */ extern char *tempzip; /* Temporary zip file name */ extern ZCONST unsigned char MacRoman_to_WinCP1252[128]; static char argStr[1024]; static char *argv[MAX_ARGS + 1]; /*****************************************************************************/ /* Functions */ /*****************************************************************************/ /* ** Copy a C string to a Pascal string ** */ unsigned char *CToPCpy(unsigned char *pstr, char *cstr) { register char *dptr; register unsigned len; len=0; dptr=(char *)pstr+1; while (len<255 && (*dptr++ = *cstr++)!='\0') ++len; *pstr= (unsigned char)len; return pstr; } /* ** Copy a Pascal string to a C string ** */ char *PToCCpy(unsigned char *pstr, char *cstr) { strncpy(cstr, (char *) &pstr[1], *pstr); cstr[pstr[0]] = '\0'; /* set endmarker for c-string */ return cstr; } /* ** strcpy() and strcat() work-alikes which allow overlapping buffers. */ char *sstrcpy(char *to,const char *from) { memmove(to, from, 1+strlen(from)); return to; } char *sstrcat(char *to,const char *from) { sstrcpy(to + strlen(to), from); return to; } /* ** Alloc memory and init it ** */ char *StrCalloc(unsigned short size) { char *strPtr = NULL; if ((strPtr = calloc(size, sizeof(char))) == NULL) printerr("StrCalloc failed:", -1, size, __LINE__, __FILE__, ""); Assert_it(strPtr,"strPtr == NULL","") return strPtr; } /* ** Release only non NULL pointers ** */ char *StrFree(char *strPtr) { if (strPtr != NULL) { free(strPtr); } return NULL; } /* ** Return a value in a binary string ** */ char *sBit2Str(unsigned short value) { static char str[sizeof(value)*8]; int biz = 16; int strwid = 16; int i, j; char *tempPtr = str; j = strwid - (biz + (biz >> 2)- (biz % 4 ? 0 : 1)); for (i = 0; i < j; i++) { *tempPtr++ = ' '; } while (--biz >= 0) { *tempPtr++ = ((value >> biz) & 1) + '0'; if (!(biz % 4) && biz) { *tempPtr++ = ' '; } } *tempPtr = '\0'; return str; } /* ** Parse commandline style arguments ** */ int ParseArguments(char *s, char ***arg) { int n = 1, Quote = 0; char *p = s, *p1, c; argv[0] = GetAppName(); *arg = argv; p1 = (char *) argStr; while ((c = *p++) != 0) { if (c==' ') continue; argv[n++] = p1; if (n > MAX_ARGS) return (n-1); do { if (c=='\\' && *p++) c = *p++; else if ((c=='"') || (c == '\'')) { if (!Quote) { Quote = c; continue; } if (c == Quote) { Quote = 0; continue; } } *p1++ = c; } while (*p && ((c = *p++) != ' ' || Quote)); *p1++ = '\0'; } return n; } /* ** Print commandline style arguments ** */ void PrintArguments(int argc, char **argv) { printf("\n Arguments:"); printf("\n --------------------------"); while(--argc >= 0) printf("\n argc: %d argv: [%s]", argc,eR UNZIP.BCK4![UNZIP60.MACOS.SOURCE]HELPERS.C;1r? &*argv[argc]); printf("\n --------------------------\n\n"); return; } /* ** return some error-msg on file-system ** */ int PrintUserHFSerr(int cond, int err, char *msg2) { char *msg; if (cond != 0) { switch (err) { case -35: msg = "No such Volume"; break; case -56: msg = "No such Drive"; break; case -37: msg = "Bad Volume Name"; break; case -49: msg = "File is already open for writing"; break; case -43: msg = "Directory/File not found"; break; case -120: msg = "Directory/File not found or incomplete pathname"; break; default: return err; } fprintf(stderr, "\n\n Error: %s ->%s", msg, msg2); exit(err); } return 0; } /* ** Check mounted volumes and return number of volumes ** with the same name. */ short CheckMountedVolumes(char *FullPath) { FSSpec volumes[50]; /* 50 Volumes should be enough */ char VolumeName[257], volume[257]; short actVolCount, volIndex = 1, VolCount = 0; OSErr err; int i; GetVolumeFromPath(FullPath, VolumeName); err = OnLine(volumes, 50, &actVolCount, &volIndex); printerr("OnLine:", (err != -35) && (err != 0), err, __LINE__, __FILE__, ""); for (i=0; i < actVolCount; i++) { PToCCpy(volumes[i].name,volume); if (stricmp(volume, VolumeName) == 0) VolCount++; } printerr("OnLine: ", (VolCount == 0), VolCount, __LINE__, __FILE__, FullPath); return VolCount; } /* ** compares strings, ignoring differences in case ** */ int stricmp(const char *p1, const char *p2) { int diff; while (*p1 && *p2) { if (*p1 != *p2) { if (isalpha(*p1) && isalpha(*p2)) { diff = toupper(*p1) - toupper(*p2); if (diff) return diff; } else break; } p1++; p2++; } return *p1 - *p2; } /* ** Convert the MacOS-Strings (Filenames/Findercomments) to a most compatible. ** These strings will be stored in the public area of the zip-archive. ** Every foreign platform (outside macos) will access these strings ** for extraction. */ void MakeCompatibleString(char *MacOS_Str, const char SpcChar1, const char SpcChar2, const char SpcChar3, const char SpcChar4, short CurrTextEncodingBase) { char *tmpPtr; register uch curch; Assert_it(MacOS_Str,"MakeCompatibleString MacOS_Str == NULL","") for (tmpPtr = MacOS_Str; (curch = *tmpPtr) != '\0'; tmpPtr++) { if (curch == SpcChar1) *tmpPtr = SpcChar2; else if (curch == SpcChar3) *tmpPtr = SpcChar4; else /* default */ /* now convert from MacRoman to ISO-8859-1 */ /* but convert only if MacRoman is activ */ if ((CurrTextEncodingBase == kTextEncodingMacRoman) && (curch > 127)) { *tmpPtr = (char)MacRoman_to_WinCP1252[curch - 128]; } } /* end for */ } Boolean CheckForSwitch(char *Switch, int argc, char **argv) { char *p; /* steps through option arguments */ int i; /* arg counter, root directory flag */ for (i = 1; i < argc; i++) { if (argv[i][0] == '-') { if (argv[i][1]) { for (p = argv[i]+1; *p; p++) { if (*p == Switch[0]) { return true; } if ((Switch[1] != NULL) && ((*p == Switch[0]) && (*p == Switch[1]))) { return true; } } } } } return false; } #if (defined(USE_SIOUX) || defined(MACUNZIP_STANDALONE)) /* ** checks the condition and returns an error-msg ** this function is for internal use only */ OSErr printerr(const char *msg, int cond, int err, int line, char *file, const char *msg2) { if (cond != 0) { fprintf(stderr, "\nint err: %d: %s %d [%d/%s] {%s}\n", clock(), msg, err, line, file, msg2); } return cond; } /* fake-functions: Not Implemented for metrowerks SIOUX */ void leftStatusString(char *status) { status = status; } void rightStatusString(char *status) { status = status; } void DoWarnUserDupVol( char *FullPath ) { char VolName[257]; GetVolumeFromPath(FullPath, VolName); printf("\n There are more than one volume that has the same name !!\n"); printf("\n Volume: %s\n",VolName); printf("\n This port has one weak point:"); printf("\n It is based on pathnames. As you may be already know:"); printf("\n Pathnames are not unique on a Mac !"); printf("\n MacZip has problems to find the correct location of"); printf("\n the archive or the files.\n"); printf("\n My (Big) recommendation: Name all your volumes with an"); printf("\n unique name and MacZip will run without any problem."); } #endif !*[UNZIP60.MACOS.SOURCE]HELPERS.H;1+,./ 4@-0123KPWO56Hl\݊7Hl\݊89GHJ/* Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifndef HELPERS_H #define HELPERS_H 1 /* Convert a C string to a Pascal string */ unsigned char *CToPCpy(unsigned char *pstr, char *cstr); /* Convert a Pascal string to a C string */ char *PToCCpy(unsigned char *pstr, char *cstr); char *sstrcpy(char *to,const char *from); char *sstrcat(char *to,const char *from); char *StrCalloc(unsigned short size); char *StrFree(char *strPtr); char *sBit2Str(unsigned short value); void print_extra_info(void); int ParseArguments(char *s, char ***arg); void PrintArguments(int argc, char **argv); Boolean IsZipFile(char *name); OSErr printerr(const char *msg, int cond, int err, int line, char *file, const char *msg2); int PrintUserHFSerr(int cond, int err, char *msg2); short CheckMountedVolumes(char *FullPath); void DoWarnUserDupVol(char *path); void PrintFileInfo(void); int stricmp(const char *p1, const char *p2); void leftStatusString(char *status); void rightStatusString(char *status); Boolean isZipFile(FSSpec *fileToOpen); unsigned long MacFileDate_to_UTime(unsigned long mactime); Boolean CheckForSwitch(char *Switch, int argc, char **argv); void MakeCompatibleString(char *MacOS_Str, const char SpcChar1, const char SpcChar2, const char SpcChar3, const char SpcChar4, short CurrTextEncodingBase); #define MAX_ARGS 25 #endif /* HELPERS_H */ !*[UNZIP60.MACOS.SOURCE]MACBIN3.C;1+,.1/ 411]@-0123KPWO256~!57~!589GHJ:x UNZIP.BCK![UNZIP60.MACOS.SOURCE]MACBIN3.C;11!/**************************************************************** MacBinaryIII.c Copyright 1997 Christopher Evans (cevans@poppybank.com) Basic encoding and decoding of Macintosh files to the MacBinary III spec. This file is part of the MacBinaryIII_src_C.sit package see macbin3.h for more information ****************************************************************/ /*****************************************************************************/ /* Includes */ /*****************************************************************************/ #include #include #include "macbin3.h" /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ /* source (the macbinary file) will be deleted */ #define DELETE_MACBINARY_SOURCE /* enable encoding #define INCLUDE_ENCODE_MACBINARY */ /* enable decoding */ #define INCLUDE_DECODE_MACBINARY /* include own CRC 32 Bit Calculation #define INCLUDE_CRC32CALC */ /* produce some helpful printouts for tracing #define TRACE_MACBINARY */ #define LONG_AT_OFFSET(data, offset) *((long *)((unsigned char *)&data[offset])) #define WORD_AT_OFFSET(data, offset) *((Word *)((unsigned char *)&data[offset])) #define BYTE_AT_OFFSET(data, offset) *((Byte *)((unsigned char *)&data[offset])) #define PTR_AT_OFFSET(data, offset) ((Ptr)((unsigned char *)&data[offset])) typedef unsigned short Word; #define kOldVersionOffset 0 #define kFileNameLengthOffset 1 #define kFileNameOffset 2 #define kFileTypeOffset 65 #define kFileCreatorOffset 69 #define kFinderFlagsHiOffset 73 #define kVersionCheckZero 74 #define kFileVPositionOffset 75 #define kFileHPositionOffset 77 #define kFileFolderIDOffset 79 #define kProtectedFlagOffset 81 #define kVersionOneCheckZero 82 #define kDataForkLengthOffset 83 #define kResourceForkLengthOffset 87 #define kFileCreationDateOffset 91 #define kFileModificationDateOffset 95 #define kGetInfoCommentLengthOffset 99 #define kFinderFlagsLowOffset 101 #define kMacbinarySigOffset 102 #define kFilenameScriptOffset 106 #define kExtendedFinderFlagsOffset 107 #define kTotalFileLengthOffset 116 #define kSecondaryHeaderLengthOffset 120 #define kCurrentVersionOffset 122 #define kMinimumVersionOffset 123 #define kCRCOffset 124 #define kResourceForkMaxLen (1024 * 1024 * 16) /*****************************************************************************/ /* Module level Vars */ /*****************************************************************************/ #ifdef INCLUDE_CRC32CALC static unsigned long crc_table[256] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL }; #endif /*****************************************************************************/ /* Prototypes */ /*****************************************************************************/ static Boolean HeaderIsMacBinary(char *header, Word *version, long maxDataLen); static Boolean FSpExists(FSSpec *file); #ifdef INCLUDE_CRC32CALC static unsigned long crc32(unsigned long seed, unsigned char *p, size_t len); #else extern unsigned long crc32(unsigned long seed, unsigned char *p, size_t len); #endif static OSErr GetDesktopComment(FSSpec *file, char*comment, long *length); static OSErr SetDesktopComment(FSSpec *file, char*comment, long length); static Handle EncodeMacbinary(FSSpec *file); static OSErr DecodeMacBinary(Handle data, FSSpec *destination); /*****************************************************************************/ /* Functions */ /******************************************W/ UNZIP.BCK![UNZIP60.MACOS.SOURCE]MACBIN3.C;11i***********************************/ #ifdef INCLUDE_CRC32CALC /* taken from the mcvert source code */ static unsigned long crc32(unsigned long seed, unsigned char *p, size_t len) { unsigned long hold; /* crc computed so far */ size_t i; /* index into data */ hold = seed; /* start with seed */ for (i = 0; i < len; i++, p++) { hold ^= (*p << 8); hold = (hold << 8) ^ crc_table[(unsigned char) (hold >> 8)]; } return (hold); } /* crc32() */ #endif static Boolean FSpExists(FSSpec *file) { FInfo fndrInfo; return FSpGetFInfo(file, &fndrInfo) == noErr; } static Boolean HeaderIsMacBinary(char *header, Word *version, long maxDataLen) { Boolean isIt = false; unsigned long resourceForkLength, dataForkLength, df_rf_length; short commentLength; Byte mbVersion; #ifdef TRACE_MACBINARY printf("\n\n Function HeaderIsMacBinary(): "); #endif if(LONG_AT_OFFSET(header, kMacbinarySigOffset) == 'mBIN') { isIt = true; mbVersion = 130; } else if(BYTE_AT_OFFSET(header, kVersionCheckZero) == 0 && BYTE_AT_OFFSET(header, kOldVersionOffset) == 0) { if(WORD_AT_OFFSET(header, kCRCOffset) == crc32(0, (unsigned char*) &header, 124)) { isIt = true; mbVersion = 129; } else { if(BYTE_AT_OFFSET(header, kVersionOneCheckZero) == 0) { isIt = true; mbVersion = 128; } } } #ifdef TRACE_MACBINARY printf("\n mbVersion: %d",mbVersion); #endif resourceForkLength = LONG_AT_OFFSET(header, kResourceForkLengthOffset); dataForkLength = LONG_AT_OFFSET(header, kDataForkLengthOffset); commentLength = WORD_AT_OFFSET(header, kGetInfoCommentLengthOffset); df_rf_length = dataForkLength + resourceForkLength; #ifdef TRACE_MACBINARY printf("\n resourceForkLength: %d",resourceForkLength); printf("\n dataForkLength: %d",dataForkLength); printf("\n commentLength: %d",commentLength); printf("\n df_rf_length: %d",df_rf_length); printf("\n 1. isIt: bool: %d", isIt); printf("\n BYTE_AT_OFFSET(header, kFileNameLengthOffset) >= 1 bool: %d", BYTE_AT_OFFSET(header, kFileNameLengthOffset) >= 1); printf("\n BYTE_AT_OFFSET(header, kFileNameLengthOffset) <= 31 bool: %d", BYTE_AT_OFFSET(header, kFileNameLengthOffset) <= 31); printf("\n dataForkLength >= 0 bool: %d", dataForkLength >= 0); printf("\n resourceForkLength >= 0 bool: %d", resourceForkLength >= 0); printf("\n resourceForkLength <= 0x%8x bool: %d", kResourceForkMaxLen, resourceForkLength <= kResourceForkMaxLen); printf("\n dataForkLength <= %8u bool: %d", maxDataLen, dataForkLength <= maxDataLen); printf("\n df_rf_length > 0 bool: %d", df_rf_length > 0); printf("\n df_rf_length <= %8u bool: %d", maxDataLen, df_rf_length <= maxDataLen); #endif if(isIt && BYTE_AT_OFFSET(header, kFileNameLengthOffset) >= 1 && BYTE_AT_OFFSET(header, kFileNameLengthOffset) <= 31 && dataForkLength >= 0 && resourceForkLength >= 0 && resourceForkLength <= kResourceForkMaxLen && df_rf_length > 0 && df_rf_length <= maxDataLen) { isIt = true; } else isIt = false; /* something is wrong with the header */ #ifdef TRACE_MACBINARY printf("\n 2. isIt: bool: %d", isIt); #endif if(version) *version = mbVersion; return isIt; } Boolean FSpIsMacBinary(FSSpec *file) { char header[128]; short dfRefNum = 0; OSErr err; long size; Boolean isIt = false; CInfoPBRec pb; long maxDataLen; memset(&pb, 0, sizeof(CInfoPBRec)); pb.hFileInfo.ioNamePtr = file->name; pb.hFileInfo.ioVRefNum = file->vRefNum; pb.hFileInfo.ioFDirIndex = 0; /* query a file */ pb.hFileInfo.ioDirID = file->parID; err = PBGetCatInfo(&pb,false); maxDataLen = pb.hFileInfo.ioFlLgLen; memset(header, 0, 128); err = FSpOpenDF(file, fsRdPerm, &dfRefNum); if(!err) { err = GetEOF(dfRefNum, &size); if(size > 128) { size = 128; err = FSRead(dfRefNum, &size, &header); if(err == noErr) { isIt = HeaderIsMacBinary(header, nil, maxDataLen); } } FSClose(dfRefNum); } return isIt; } #ifdef INCLUDE_ENCODE_MACBINARY static OSErr GetDesktopComment(FSSpec *file, char*comment, long *length) { DTPBRec pb; OSErr err; pb.ioCompletion = nil; pb.ioNamePtr = NULL; pb.ioVRefNum = file->vRefNum; err = PBDTGetPath(&pb); if(err == noErr) { pb.ioNamePtr = file->name; pb.ioDTBuffer = comment; pb.ioDirID = file->parID; err = PBDTGetComment(&pb, false); *length = pb.ioDTActCount; } return err; } OSErr EncodeMacbinaryFile(FSSpec *file) { Handle data; OSErr err = paramErr; short dfRefNum; data = EncodeMacbinary(file); if(data) { if(file->name[0] > 27) file->name[0] = 27; PtoCstr(file->name); strcat((char*)file->name, ".bin"); CtoPstr((char *)file->name); FSpDelete(file); if(FSpCreate(file, 'dMB3', 'mBIN', smSystemScript) == noErr) { err = FSpOpenDF(file, fsWrPerm, &dfRefNum); if(err == noErr) { long inOutCount = GetHandleSize(data); HLock(data); err = FSWrite(dfRefNum,&inOutCount,*data); HUnlock(data); FSClose(dfRefNum); } } DisposeHandle(data); } return err; } static Handle EncodeMacbinary(FSSpec *file) { Handle result = nil; FInfo fndrInfo; FXInfo fndrXInfo; OSErr err; CInfoPBRec pb; short dfRefNum, rfRefNum; long ioCount; char buffer[128]; char header[128]; char comment[256]; long resourceForkLength, dataForkLength, commentLength; memset(&header, 0, sizeof(header)); err = FSpGetFInfo(file, &fndrInfo); memset(&pb, 0, sizeof(CInfoPBRec)); pb.hFileInfo.ioNamePtr = file->name; pb.hFileInfo.ioVRefNum = file->vRefNum; pb.hFileInfo.ioFDirIndex = 0; //query a file pb.hFileInfo.ioDirID = file->parID; err = PBGetCatInfo(&pb,false); fndrXInfo = pb.hFileInfo.ioFlXFndrInfo; BYTE_AT_OFFSET(header, kFileNameLengthOffset) = file->name[0]; BlockMoveData( &(file->name[1]), PTR_AT_OFFSET(header, kFileNameOffset), file->name[0]); LONG_AT_OFFSET(header, kFileTypeOffset) = fndrInfo.fdType; LONG_AT_OFFSET(header, kFileCreatorOffset) = fndrInfo.fdCreator; BYTP  UNZIP.BCK![UNZIP60.MACOS.SOURCE]MACBIN3.C;11RE_AT_OFFSET(header, kFinderFlagsHiOffset) = (fndrInfo.fdFlags & 0xFF00) >> 8; BYTE_AT_OFFSET(header, kFinderFlagsLowOffset) = (fndrInfo.fdFlags & 0x00FF); WORD_AT_OFFSET(header, kFileVPositionOffset) = fndrInfo.fdLocation.v; WORD_AT_OFFSET(header, kFileHPositionOffset) = fndrInfo.fdLocation.h; WORD_AT_OFFSET(header, kFileFolderIDOffset) = fndrInfo.fdFldr; LONG_AT_OFFSET(header, kFileCreationDateOffset) = pb.hFileInfo.ioFlCrDat; LONG_AT_OFFSET(header, kFileModificationDateOffset) = pb.hFileInfo.ioFlMdDat; LONG_AT_OFFSET(header, kMacbinarySigOffset) = 'mBIN'; BYTE_AT_OFFSET(header, kFilenameScriptOffset) = fndrXInfo.fdScript; BYTE_AT_OFFSET(header, kExtendedFinderFlagsOffset) = fndrXInfo.fdXFlags; LONG_AT_OFFSET(header, kTotalFileLengthOffset) = 0; WORD_AT_OFFSET(header, kSecondaryHeaderLengthOffset) = 0; WORD_AT_OFFSET(header, kCurrentVersionOffset) = 130; WORD_AT_OFFSET(header, kMinimumVersionOffset) = 129; err = FSpOpenDF(file,fsRdPerm,&dfRefNum); if(err == noErr) { err = GetEOF(dfRefNum,&dataForkLength); LONG_AT_OFFSET(header, kDataForkLengthOffset) = dataForkLength; } else { dfRefNum = 0; } err = FSpOpenRF(file,fsRdPerm,&rfRefNum); if(err == noErr) { err = GetEOF(rfRefNum,&resourceForkLength); LONG_AT_OFFSET(header, kResourceForkLengthOffset) = resourceForkLength; } else { rfRefNum = 0; } memset(comment, 0, 256); if(GetDesktopComment(file, comment, &commentLength) != noErr) commentLength = 0; WORD_AT_OFFSET(header, kGetInfoCommentLengthOffset) = commentLength; WORD_AT_OFFSET(header, kCRCOffset) = crc32( 0, (unsigned char*) &header, 124); result = TempNewHandle(0, &err); if(result) { err = PtrAndHand(&header,result,128); if(dfRefNum && dataForkLength) { err = noErr; while(dataForkLength > 0 && err == noErr) { ioCount = 128; err = FSRead(dfRefNum,&ioCount,&buffer); if(err == noErr || err == eofErr) err = PtrAndHand(&buffer,result,128); dataForkLength -= ioCount; } } if(rfRefNum && resourceForkLength) { err = noErr; while(resourceForkLength > 0 && err == noErr) { ioCount = 128; err = FSRead(rfRefNum,&ioCount,&buffer); if(err == noErr || err == eofErr) err = PtrAndHand(&buffer,result,128); resourceForkLength -= ioCount; } } if(commentLength) { PtrAndHand(&comment,result,commentLength); } } if(rfRefNum) FSClose(rfRefNum); if(dfRefNum) FSClose(dfRefNum); return result; } #endif /* INCLUDE_ENCODE_MACBINARY */ #ifdef INCLUDE_DECODE_MACBINARY static OSErr SetDesktopComment(FSSpec *file, char*comment, long length) { DTPBRec pb; OSErr err; pb.ioCompletion = nil; pb.ioNamePtr = NULL; pb.ioVRefNum = file->vRefNum; err = PBDTGetPath(&pb); if(err == noErr) { pb.ioNamePtr = file->name; pb.ioDTBuffer = comment; pb.ioDirID = file->parID; pb.ioDTReqCount = length; err = PBDTSetComment(&pb, false); } return err; } OSErr DecodeMacBinaryFile(FSSpec *source) { Handle data = nil; OSErr err; short dfRefNum = 0; long size; FSSpec McBin_source; memcpy(McBin_source.name,source->name,source->name[0]+1); McBin_source.vRefNum = source->vRefNum; McBin_source.parID = source->parID; err = FSpOpenDF(source, fsRdPerm, &dfRefNum); if(!err) { err = GetEOF(dfRefNum, &size); data = TempNewHandle(size, &err); if(data) { HLock(data); err = FSRead(dfRefNum,&size,*data); HUnlock(data); } FSClose(dfRefNum); } if(data && err == noErr) { err = DecodeMacBinary(data, source); DisposeHandle(data); } #ifdef DELETE_MACBINARY_SOURCE if (err == noErr) err = FSpDelete(&McBin_source); #endif return err; } static OSErr DecodeMacBinary(Handle data, FSSpec *destination) { Handle result = nil; FInfo fndrInfo; OSErr err; CInfoPBRec pb; short dfRefNum, rfRefNum; long ioCount; char header[128]; char comment[256]; long resourceForkLength, dataForkLength, commentLength; Boolean isMacBinaryFile = false; short headerEnd = 128; long rfOffset; long maxDataLen; memset(&pb, 0, sizeof(CInfoPBRec)); pb.hFileInfo.ioNamePtr = destination->name; pb.hFileInfo.ioVRefNum = destination->vRefNum; pb.hFileInfo.ioFDirIndex = 0; /* query a file */ pb.hFileInfo.ioDirID = destination->parID; err = PBGetCatInfo(&pb,false); maxDataLen = pb.hFileInfo.ioFlLgLen; HLock(data); memcpy(header, *data, 128); /* already checked with FSpIsMacBinary() */ isMacBinaryFile = HeaderIsMacBinary(header, nil, maxDataLen);; if(!isMacBinaryFile) return paramErr; if(WORD_AT_OFFSET(header, kSecondaryHeaderLengthOffset)) { headerEnd = WORD_AT_OFFSET(header, kSecondaryHeaderLengthOffset); headerEnd = (headerEnd + 127) & ~127L; } resourceForkLength = LONG_AT_OFFSET(header, kResourceForkLengthOffset); dataForkLength = LONG_AT_OFFSET(header, kDataForkLengthOffset); commentLength = WORD_AT_OFFSET(header, kGetInfoCommentLengthOffset); memcpy( destination->name, PTR_AT_OFFSET(header, kFileNameLengthOffset), BYTE_AT_OFFSET(header, kFileNameLengthOffset)); fndrInfo.fdType = LONG_AT_OFFSET(header, kFileTypeOffset); fndrInfo.fdCreator = LONG_AT_OFFSET(header, kFileCreatorOffset); fndrInfo.fdFlags = BYTE_AT_OFFSET(header, kFinderFlagsHiOffset); fndrInfo.fdFlags << 8; fndrInfo.fdFlags |= BYTE_AT_OFFSET(header, kFinderFlagsLowOffset); fndrInfo.fdLocation.v = WORD_AT_OFFSET(header, kFileVPositionOffset); fndrInfo.fdLocation.h = WORD_AT_OFFSET(header, kFileHPositionOffset); fndrInfo.fdFldr = WORD_AT_OFFSET(header, kFileFolderIDOffset); /* index = 1; checkFile = *destination; while(FSpExists(&checkFile)) { checkFile = *destination; if(index < 10) checkFile.name[++checkFile.name[0]] = '0' + index; else checkFile.name[++checkFile.name[0]] = ('a' - 10) + index; index++; } *destination = checkFile; */ err = FSpCreate(destination, fndrInfo.fdCreator, fndrInfo.fdType, smSystemScript); dfRefNum = 0; if(err == noErr) { err = FSpOpenDF(destination, fsRdWrPerm, &dfRefNum); } if(err == noErr && dfRefNum) { ioCount = dataForkLength; err = FSWrite(dfRefNum,&ioCount,*data + headerEnd); FSClose(dfRefNum); } rfRefNum = 0; if(err == noErr) { err = FSpOpenRF(destination, fsRdWrPerm, &rfRefNum); } rfOffset = UNZIP.BCK![UNZIP60.MACOS.SOURCE]MACBIN3.C;11. headerEnd + dataForkLength; rfOffset = (rfOffset + 127) & ~127L; if(err == noErr && rfRefNum) { ioCount = resourceForkLength; err = FSWrite(rfRefNum,&ioCount,*data + rfOffset); FSClose(rfRefNum); } rfOffset += resourceForkLength; rfOffset = (rfOffset + 127) & ~127L; if(err == noErr) { FSpSetFInfo(destination,&fndrInfo); memset(&pb, 0, sizeof(CInfoPBRec)); pb.hFileInfo.ioNamePtr = destination->name; pb.hFileInfo.ioVRefNum = destination->vRefNum; pb.hFileInfo.ioFDirIndex = 0; /* query a file */ pb.hFileInfo.ioDirID = destination->parID; err = PBGetCatInfo(&pb,false); if(err == noErr) { pb.hFileInfo.ioDirID = destination->parID; pb.hFileInfo.ioFlCrDat = LONG_AT_OFFSET(header, kFileCreationDateOffset); pb.hFileInfo.ioFlMdDat = LONG_AT_OFFSET(header, kFileModificationDateOffset); pb.hFileInfo.ioFlXFndrInfo.fdXFlags = BYTE_AT_OFFSET(header, kExtendedFinderFlagsOffset); pb.hFileInfo.ioFlXFndrInfo.fdScript = BYTE_AT_OFFSET(header, kFilenameScriptOffset); err = PBSetCatInfo(&pb, false); } if(commentLength) { memcpy(comment,*data + rfOffset, commentLength); SetDesktopComment(destination, comment, commentLength); } } HUnlock(data); return err; } #endif /* INCLUDE_DECODE_MACBINARY */ !*[UNZIP60.MACOS.SOURCE]MACBIN3.H;1+,./ 4@-0123KPWO56789GHJ#ifndef __MCBINIII_H__ #define __MCBINIII_H__ /**************************************************************** MacBinaryIII.h Copyright 1997 Christopher Evans (cevans@poppybank.com) Basic encoding and decoding of Macintosh files to the MacBinary III spec. ****************************************************************/ /* -------------------------------------------------------------------- This source is copyrighted by Christopher Evans (cevans@poppybank.com) (available at ftp://ftp.lazerware.com/MacBinaryIII_src_C.sit homepage of Leonard Rosenthol leonardr@netcom.com) I made the following changes: * renamed files MacBinaryIII.h / MacBinaryIII.c to macbin3.c / macbin3.h * removed pragmas: #pragma once #pragma options align=mac68k * added 5 macros to make the migration into other projects easier: DELETE_MACBINARY_SOURCE -> delete the macbinary file after decoding INCLUDE_ENCODE_MACBINARY -> include the encode-part of the source INCLUDE_DECODE_MACBINARY -> include the decode-part of the source INCLUDE_CRC32CALC -> include the CRC32 calculation TRACE_MACBINARY -> produce some diagnostic printouts * changed the source layout to fit into a 80 col window * removed non-ASCII characters from the sources * renamed the function CalculateCRC() to crc32() and changed the order of the arguments. So the crc32() func of the InfoZip package can be used instead. * moved module specific macros and protos to the mcbiniii.c * added comments and enhanced the documention of the MacBinary Spec * changed definition crc_table[] from short to unsigned long. * improved the HeaderIsMacBinary() function to be more restrictive The specification says: "Offsets 83 and 87, Long Word, (the length of the forks) should be in the range of 0-$007FFFFF " However, I do not understand the reason of this range. The data fork can be much larger than $007FFFFF ( 2 Gigabytes! ) and the size of the resource fork can be until 16 MByte. ZipIt and Stuffit seems to be ignore this limit. I changed this limit (see kResourceForkMaxLen), and I removed the maximum check of the data fork. Dirk Haase (d_haase@sitec.de); 05.Dec.1998 -------------------------------------------------------------------- MacBinary III MacBinary is a standard format for binary transfer of arbitrary Macintosh documents via a telecommunication link. It is intended for use both between Macintoshes and for use in uploading arbitrary Macintosh documents to remote systems (where it is presumed that they will be stored as an exact image of the data transmitted). It does this by combing both the resource and data forks (as well as the "Finder Info") of a standard Macintosh file into a single data fork only file that can be stored on non-Macintosh machines. The format of the header for MacBinary III is as follows: Offset Length Contents 000 Byte old version number, must be kept at zero for compatibility 001 Byte Length of filename (must be in the range 1-31) 002 1 to 63 Bytes filename (only "length" bytes are significant). 065 Long Word file type (normally expressed as four characters) 069 Long Word file creator (normally expressed as four characters) 073 Byte original Finder flags Bit 7 - isAlias. Bit 6 - isInvisible. Bit 5 - hasBundle. Bit 4 - nameLocked. Bit 3 - isStationery. Bit 2 - hasCustomIcon. Bit 1 - reserved. Bit 0 - hasBeenInited. 074 Byte zero fill, must be zero for compatibility 075 Word file's vertical position within its window. 077 Word file's horizontal position within its window. 079 Word file's window or folder ID. 081 Byte "Protected" flag (in low order bit). 082 Byte zero fill, must be zero for compatibility 083 Long Word Data Fork length (bytes, zero if no Data Fork). 087 Long Word Resource Fork length (bytes, zero if no R.F.). 091 Long Word File's creation date 095 Long Word File's "last modified" date. 099 Word length of Get Info comment to be sent after the resource fork (if implemented, see below). 101 Byte Finder Flags, bits 0-7. (Bits 8-15 are already in byte 73) Bit 7 - hasNoInits Bit 6 - isShared Bit 5 - requiresSwitchLaunch Bit 4 - ColorReserved Bits 1-3 - color Bit 0 - isOnDesk *102 Long Word signature for indentification purposes ('mBIN') *106 BӺ [ UNZIP.BCK![UNZIP60.MACOS.SOURCE]MACBIN3.H;1w yte script of file name (from the fdScript field of an fxInfo record) *107 Byte extended Finder flags (from the fdXFlags field of an fxInfo record) 108-115 Unused (must be zeroed by creators, must be ignored by readers) 116 Long Word Length of total files when packed files are unpacked. As of the writing of this document, this field has never been used. 120 Word Length of a secondary header. If this is non-zero, skip this many bytes (rounded up to the next multiple of 128). This is for future expansion only, when sending files with MacBinary, this word should be zero. *122 Byte Version number of MacBinary III that the uploading program is written for (the version is 130 for MacBinary III) 123 Byte Minimum MacBinary version needed to read this file (set this value at 129 for backwards compatibility with MacBinary II) 124 Word CRC of previous 124 bytes *These fields have changed for MacBinary III. All values are stored in normal 68000 order, with Most Significant Byte appearing first then the file. Any bytes in the header not defined above should be set to zero. */ /* Public functions */ OSErr EncodeMacbinaryFile(FSSpec *file); OSErr DecodeMacBinaryFile(FSSpec *source); Boolean FSpIsMacBinary(FSSpec *file); #endif  *[UNZIP60.MACOS.SOURCE]MACCFG.H;1+,<./ 4@-0123KPWO56-i՞7-i՞89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- MACOS specific configuration and declarations: ---------------------------------------------------------------------------*/ #ifndef __maccfg_h #define __maccfg_h /*****************************************************************************/ /* Macros, missing RTL declarations, compatibility typedefs */ /*****************************************************************************/ #if defined(__MWERKS__) && defined(macintosh) # include typedef unsigned long mode_t; # define _STAT # if (defined(MacStaticLib) || defined(USE_SIOUX)) # define MAIN UZ_EXP UzpMain /* was UzpUnzip */ # else # define MAIN _dummy_main # endif #endif #ifdef THINK_C # ifndef __STDC__ /* if Think C hasn't defined __STDC__ ... */ # define __STDC__ 1 /* make sure it's defined: it needs it */ # else # if !__STDC__ /* sometimes __STDC__ is defined as 0; */ # undef __STDC__ /* it needs to be 1 or required header */ # define __STDC__ 1 /* files are not properly included. */ # endif /* !__STDC__ */ # endif # define IOCompletionUPP ProcPtr # define CREATOR 'KAHL' # define MAIN _dummy_main #endif /* THINK_C */ #ifdef MPW # include # include # include # include # include # ifndef QUERY_TRNEWLN # define QUERY_TRNEWLN # endif # ifdef fileno # undef fileno # endif # ifdef MCH_MACINTOSH # define CREATOR 'Manx' # else # define CREATOR 'MPS ' # endif #endif /* MPW */ #include /* O_BINARY for open() w/o CR/LF translation */ #define fileno(x) ((x) == stdout ? 1 : ((x) == stderr ? 2 : (short)(x))) #define open macopen #define close macclose #define fclose(x) macclose(fileno((x))) #define read macread #define write macwrite #define lseek maclseek #define creat(x,y) maccreat((x)) #define stat UZmacstat #define lstat UZmacstat #define dup #ifndef MCH_MACINTOSH # define NO_STRNICMP #endif #define DIR_END ':' #ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY #endif #define lenEOL 1 #define PutNativeEOL *q++ = native(CR); #define NOANSIFILT /* MWRKS C creates broken code for the ANSI-ESC filter */ #define MALLOC_WORK #define INT_SPRINTF #if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)) # define USE_EF_UT_TIME #endif #undef IZ_CHECK_TZ #undef MORE #undef DYNAMIC_CRC_TABLE #ifndef MPW # ifndef MacStaticLib # ifndef USE_SIOUX # define fgets macfgets # define fflush(f) # define fprintf macfprintf # define fputs(s,f) macfprintf((f), "%s", (s)) # define printf macprintf # ifdef putc # undef putc # endif # define putc(c,f) macfprintf((f), "%c", (c)) # endif /* !USE_SIOUX */ # else # ifdef putc # undef putc # endif # define putc(c,f) fprintf((f), "%c", (c)) # endif # define isatty(f) (((f) >= 0) || ((f) <= 2)) #endif #ifndef isascii # define isascii(c) ((unsigned char)(c) <= 0x3F) #endif #include "macstat.h" #include "macdir.h" #ifdef CR # undef CR #endif #ifdef foreign # undef foreign #endif #define foreign(c) ((c) & 0x80 ? MacRoman_to_WinCP1252[(c) & 0x7f] : (c)) #ifdef native # undef native #endif #define native(c) ((c) & 0x80 ? WinCP1252_to_MacRoman[(c) & 0x7f] : (c)) #define NATIVE "MacRoman charset" #ifdef _ISO_INTERN # undef _ISO_INTERN #endif #define _ISO_INTERN(str1) {register uch *p;\ for (p=(uch *)(str1); *p; p++)\ *p = (*p & 0x80) ? WinCP1252_to_MacRoman[*p & 0x7f] : *p;} #ifdef _OEM_INTERN # undef _OEM_INTERN #endif #ifndef IZ_OEM2ISO_ARRAY # define IZ_OEM2ISO_ARRAY #endif #define _OEM_INTERN(str1) {register uch *p;\ for (p=(uch *)(str1); *p; p++)\ *p = (*p & 0x80) ? WinCP1252_to_MacRoman[oem2iso[*p & 0x7f]] : *p;} #ifdef __FILEIO_C /* get the ISO8859-1 <--> MacROMAN conversion tables */ # include "charmap.h" #else extern ZCONST uch WinCP1252_to_MacRoman[128]; extern ZCONST uch MacRoman_to_WinCP1252[128]; #endif #define EB_M3_FL_NOCHANGE 0x02 /* filename will be not changed */ /* other EB_M3 flags are defined in unzpriv.h */ #define EB_MAC3_SIZE (EB_HEADSIZE + EB_MAC3_HLEN) /*****************************************************************************/ /* Structure typedefs */ /*****************************************************************************/ typedef struct _ZipExtraHdr { ush header; /* 2 bytes */ ush data; % UNZIP.BCK< [UNZIP60.MACOS.SOURCE]MACCFG.H;1F /* 2 bytes */ } ZIP_EXTRA_HEADER; /* the following structure is a combination of the old and the new extra-field definition; so it's *not* the definition of the extra-field */ typedef struct _MacInfo { unsigned char *filename; /* for ZipIt ef */ ush header; /* tag for this extra block type */ ush data; /* total data size for this block */ ulg size; /* uncompressed finder attribute data size */ ush flags; /* info bits: bit 0 if set, file is a data fork bit 1 if set, filename will be not changed bit 2 if set, Attribs is uncompressed bit 3 if set, date and times are in 64 bit; if zero, date and times are in 32 bit bit 4 if set, "local time - UTC" offsets are omitted bits 5-15 reserved; not tested; */ ush CompType; ulg CRCvalue; CInfoPBRec fpb; /* Macintosh FInfo / FXInfo structure */ long Cr_UTCoffs; /* difference "local time - UTC" for Creat-time */ long Md_UTCoffs; /* difference "local time - UTC" for Modif-time */ long Bk_UTCoffs; /* difference "local time - UTC" for Bckup-time */ short TextEncodingBase; /* TextEncodingBase (Charset) */ char *FullPath; /* Path of the current file */ char *FinderComment; /* Finder Comment of current file */ } MACINFO; /*****************************************************************************/ /* Global Vars */ /*****************************************************************************/ #define SYSTEM_SPECIFIC_GLOBALS \ short giCursor;\ CursHandle rghCursor[4]; /* status cursors */ #define SYSTEM_SPECIFIC_CTOR MacGlobalsInit /*****************************************************************************/ /* Prototypes */ /*****************************************************************************/ void screenOpen OF((char *)); /* macscreen.c */ void screenControl OF((char *, int)); /* macscreen.c */ void screenDump OF((char *, long)); /* macscreen.c */ void screenUpdate OF((WindowPtr)); /* macscreen.c */ void screenClose OF((void)); /* macscreen.c */ int macgetch OF((void)); /* macscreen.c */ int macmkdir OF((char *)); /* macos.c */ short macopen OF((char *, short)); /* macos.c */ short maccreat OF((char *)); /* macos.c */ short macread OF((short, char *, unsigned)); /* macos.c */ long macwrite OF((short, char *, unsigned)); /* macos.c */ short macclose OF((short)); /* macos.c */ long maclseek OF((short, long, short)); /* macos.c */ char *macfgets OF((char *, int, FILE *)); /* macos.c */ int macfprintf OF((FILE *, char *, ...)); /* macos.c */ int macprintf OF((char *, ...)); /* macos.c */ ulg makePPClong(ZCONST uch *sig); ush makePPCword(ZCONST uch *b); void UserStop(void); #endif /* !__maccfg_h */  *[UNZIP60.MACOS.SOURCE]MACDIR.C;1+,[./ 4@-0123KPWO 56x7x89GHJ /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- macdir.c * This file provides dirent-style directory-reading procedures * for V7 Unix systems that don't have such procedures. * * ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Includes */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include "macdir.h" #include "helpers.h" #include "pathname.h" /*****************************************************************************/ /* Functions */ /*****************************************************************************/ int closedir(DIR *dPtr) { free(dPtr); return 0; } DIR *opendir(char *dirName) { int fullPath; unsigned pathLen; char *s; HParamBlockRec hPB; CInfoPBRec cPB; DIR *dPtr; OSErr err; FSSpec spec; char CompletePath[NAME_MAX]; GetCompletePath(CompletePath, dirName, &spec, &err); printerr("GetCompletePath", err, err, __LINE__, __FILE__, dirName); if (dirName == NULL || *dirName == '\0' || (pathLen = strlen(dirName)) >= 256) { errno = EINVAL; return NULL; } /* Get information about volume. */ memset(&hPB, '\0', sizeof(hPB)); if (((s = strchr(dirName, ':')) == NULL) || (*dirName == ':')) { fullPath = false; } else { *(s + 1) = '\0'; hPB.volumeParam.ioVolIndex = -1; fullPath = true; } hPB.volumeParam.ioNamePtr = spec.name; err = PBHGetVInfoSync(&hPB); if ((err != noErr) || (hPB.volumeParam.ioVFSID != 0)) { errno = ENOENT; return NULL; } /* Get information about file. */ memset(&cPB, '\0', sizeof(cPB)); if (fullPath) cPB.hFileInfo.ioVRefNum = hPB.volumeParam.ioVRefNum; cPB.hFileInfo.ioNamePtr = spec.name; err = PBGetCatInfoSync(&cPB); if (err != noErr) { errno = (err == fnfErr) ? ENOENT : EIO; return NULL; } if (!(cPB.hFileInfo.ioFlAttrib & ioDirMask)) { errno = ENOTDIR; return NULL; } /* Get space for, and fill in, DIR structure. */ if ((dPtr = (DIR *)malloc(sizeof(DIR))) == NULL) { return NULL; } dPtr->ioVRefNum = cPB.dirInfo.ioVRefNum; dPtr->ioDrDirID = cPB.dirInfo.ioDrDirID; dPtr->ioFDirInF| UNZIP.BCK[ [UNZIP60.MACOS.SOURCE]MACDIR.C;1qcdex = 1; dPtr->flags = 0; return dPtr; } struct dirent *readdir(DIR *dPtr) { struct dirent *dirPtr; CInfoPBRec cPB; char name[256]; OSErr err; if (dPtr->flags) { return NULL; } /* Get information about file. */ memset(&cPB, '\0', sizeof(cPB)); cPB.hFileInfo.ioNamePtr = (StringPtr)name; cPB.hFileInfo.ioFDirIndex = dPtr->ioFDirIndex; cPB.hFileInfo.ioVRefNum = dPtr->ioVRefNum; cPB.hFileInfo.ioDirID = dPtr->ioDrDirID; err = PBGetCatInfoSync(&cPB); if (err != noErr) { dPtr->flags = 0xff; errno = (err == fnfErr) ? ENOENT : EIO; return NULL; } p2cstr((StringPtr)name); dirPtr = &dPtr->currEntry; dirPtr->d_fileno = dPtr->ioFDirIndex++; dirPtr->d_namlen = strlen(name); strcpy(dirPtr->d_name, name); dirPtr->d_reclen = sizeof(struct dirent) - sizeof(dirPtr->d_name) + dirPtr->d_namlen; return dirPtr; }  *[UNZIP60.MACOS.SOURCE]MACDIR.H;1+,y./ 4@-0123KPWO56z7z89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /***************************************************************** * * dirent.h * *****************************************************************/ #ifndef __DIRENT_H #define __DIRENT_H #include #ifndef EINVAL #define EINVAL 9 #endif #ifndef EIO #define EIO 10 #endif #ifndef ENOTDIR #define ENOTDIR 20 #endif #ifndef ENOENT #define ENOENT 39 #endif #ifndef NAME_MAX #define NAME_MAX 1024 #endif struct dirent { unsigned long d_fileno; short d_reclen; short d_namlen; char d_name[NAME_MAX + 1]; }; typedef struct { short ioFDirIndex; short ioVRefNum; long ioDrDirID; short flags; struct dirent currEntry; } DIR; #define direct dirent DIR *opendir(char *); struct dirent *readdir(DIR *); void rewinddir(DIR *); int closedir(DIR *); #endif /* !__DIRENT_H */ *[UNZIP60.MACOS.SOURCE]MACOS.C;1+,6./ 4V@-0123KPWO564)74)89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- macos.c Macintosh-specific routines for use with Info-ZIP's UnZip 5.4 and later. Contains: do_wild () mapattr () checkdir () version () macmkdir () macopen () maccreat () macread () macwrite () macclose () maclseek () BuildMacFilename() SetFinderInfo () isMacOSexfield () makePPClong () makePPCword () PrintMacExtraInfo () GetExtraFieldData () DecodeMac3ExtraField () DecodeJLEEextraField () PrintTextEncoding () MacGlobalsInit () ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Includes */ /*****************************************************************************/ #define UNZIP_INTERNAL #include "unzip.h" #include #include #include "pathname.h" #include "helpers.h" #include "macstuff.h" #include "mactime.h" #include "macbin3.h" /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ /* disable ZipIt support #define SwitchZIPITefSupportOff */ #define read_only file_attr /* for readability only */ #define EB_MAX_OF_VARDATA 1300 /* max possible datasize of extra-field */ #ifdef WILD_STOP_AT_DIR # define WESEP , (oU.W_flag ? ':' : '\0') #else # define WESEP #endif /*****************************************************************************/ /* Global Vars */ /*****************************************************************************/ /* Note: sizeof() returns the size of this allusion 13 is current length of "XtraStuf.mac:" */ extern const char ResourceMark[13]; /* var is initialized in file pathname.c */ Boolean MacUnzip_Noisy; /* MacUnzip_Noisy is also used by console */ MACINFO newExtraField; /* contains all extra-field data */ short MacZipMode; /*****************************************************************************/ /* Module level Vars */ /*****************************************************************************/ static const char MacPathEnd = ':'; /* the Macintosh dir separator */ static int created_dir; /* used in mapname(), checkdir() */ static int renamed_fullpath; /* ditto */ static FSSpec CurrentFile; static Boolean OpenZipFile = true; static Boolean UseUT_ExtraField = false; static Boolean IgnoreEF_Macfilename = false; static short fileSystemID; static uch *attrbuff = NULL; static uch *malloced_attrbuff = NULL; const short HFS_fileSystem = 0; /*****************************************************************************/ /* Prototypes */ /*****************************************************************************/ extern char *GetUnZipInfoVersions(void); static OSErr SetFinderInfo(__GPRO__ int SetTime, FSSpec *spec, MACINFO *mi); static Boolean GetExtraFieldData(short *MacZipMode, MACINFO *mi); static uch *scanMacOSexfield(uch *ef_ptr, unsigned ef_len, short *MacZipMode); static Boolean isMacOSexfield(unsigned id, unsigned size, short *MacZipMode); static void PrintMacExtraInfo(MACINFO *mi); static OSErr SetFileTime(__GPRO); static void DecodeMac3ExtraField(ZCONST uch *buff, MACINFO *mi); static void DecodeJLEEextraField(ZCONST uch *buff, MACINFO *mi); static void DecodeZPITextraField(ZCONST uch *buff, MACINFO *mi); static char *PrintTextEncoding(short script); static .9 ` V"D3-MFV2LfjyOSY!$J`gAhPg20:C)}`g[%:}% KkDn{-tT1O<}{dcS||DH*MU >B0*arXmjy{, KR#d5Yn s2X= !u]"5oB+L YwBbOtN'.0;&eXrB'mE<b+h`ZfQ czKQIS[Cb.r.V|Hb7 @X4#|t|`Reo?-2a%*XNgzvN?CU5/vsI!Ng>%Gt(NEz ;(R ^f 2b%pKQ@t\xxw3;%xgPGya`CR>qGVYkteP 3?>2oymA x)vf4RN5W}ZJ0c&o& EaPE;urQ5dm)6_Mo9sER\X7~JiD`h(sD _kQp-+7 E%UB1x8 )GArszhDC@ uz /J Lr-nQy+>_iP2UK\+NwNUNdT= i]7_4,|!Ep?"jEs?]v$RHx_^tHJt;Km{H}XkL} ]i =Kfu^}20DI(ug_@qY#REfQQ+Tg : N5e ()T-' yF$T0%rb&DY8$s)wMl,6G\{BC oKq1J\>xaQ_>,l\pAVJ)j (:3~INxL4i~JqJG@@tJ mA3e#c#OU!a [Y u%4|!8Xm_  9sB@/0@o7:iO,mR9[u%N7Na4]=@Sw_-T0w[`7+PLrHO!(X"0-j*A:}4LTya jej}")}Yz @$DxzJ]^4U1Qi EVx R[8P?%l/tWhJE u,%-O %/G 7\*2n$kvc^2| O F|$PZ!eR 34*a2tL*HMPgZn1At]Y5I3_ .4CV[M W9Un_c =?|8@la\b-DN1M)aoth1!"jHf[ tsh^*/ RZ9YKU2EDb2UR2t?*_Kr:.P>í5H@P,h$4*=N>$,BWoWmNWk2Bbl8a/vJD:#o}ew|XOR@o,',d8 8 aWAOa /R*]E5DT:X9bpb}-9nVA2?D:& lnp!!uZ&qv`$ ]KBIpL!7Wv6^/<&W+K?H25tiLZg=BwZS"b:mg$"~n^Xg[6. D[Nm#3{WQMyes,ml!ys\p\ I` *k! [+).b"kF #x~ 4g5(+vmXSd[>;3;J,Q>kNv=l.yzZ#hjL =\oV> -dYGRzs|NWO%) *.UxY_}LtKS%3#>d'ySHcL`q%eOh14}N_)'6-b7O3z(K62PV3y)/VA(lw; XO^_}nyg &g1V}#vE+}3aWX03^6-ixK # iwz&_=q )Lt y  8&jQ\Psh}[I p_nutf@vqT; &x'_ltXD1 8!#( +B )v( ,j&+xm)\IFm|%1=>kv ax\wn :9$]V`8Y+ )"@0=|NxE%;k3\4 73C #I}WzzMb&1wEtTF/1TLN,JfGcu0^%#H @_npqr(:3] s!B1 _DC\"$UJvA4*TC_<&w*=? f&f*'SC^T$,Goi2 Ev1O(7pa. 0+UQ[Cy c ~\8QDF8KvT~l_nf(L'&fxSh|+zpy\x7,b8'<<8<\[#}.n?R`߭bz}f$m%f"ZtlLWh{iX8g8EI~pPD%Xu"e'&ZDtfQ: S|e0Jpx'Gerd|7IcHVgR5Q%-\{0um&F$pO2Yaf S}Y; YRZH|k ~dzEh1SbeZ )nV,)ke+*?fsg%tr-N* M),O_2 uYX"3f'L-'3> v 95s`-JhWyeIPVDjs_e--9 :I'=zS|E-]Tg&l+,|K=G!>K,pLh>uhH| wr 0S?W|l R-y41 d4eM(mH<_Xe[r& luW./M[[](X8:rB:dAoKGk+hqM 0~~c 2;(xjPEN;6=y-?LLY1v|91q!?AZ1 "7Qg}$8*D3W}(\o{e(f>^((H"j+ LLG>N$)=y|&a+)8n \K7QXhHj!5?j""y:T.g;lpZ a@yb[SR^#YR'%9kL 8z12VYXM6Qk![s CgJ}` yb"]0RVy71=13h*nGVeq1q{H %I1Z!~@%rdLiG@3h"rdS?)^R$PFDa4ONXdyh=@Wfj jr->fF&k_*V+vWj5}PwxBLggrH@'Kl X@)fj(B+W*> WE -V nwHN3PPZYHm>z!$M|>]UzBC|{Vf _H5(mQHh}G\k,66.Fq {v %_^#^Sq;SKv@=fRS,s^eco:{x-GQ` 7V pU|6B?q8KyeGsBl@ w$v&~Hc6@!goPY\o6FQn5[O}#3:IfRat`t]U?cG{"!>`+Yo/CS? qKGJ=> QTo3mmc?s?t:% p$#+,yr"dE6 m-1|rGS)&N!_:&2-13Zn{m*L?M ~/V ;#MeIMaM%s>l&EP*,~cj |Qt0jL. Gyx@] 40[Dj C3/ && RqREBl8-ATWAk3Yc.utjsu)(8_2P5uCdEcNE"*bCDa0R#Y<(?e)&jPAj|HH;cw{XRn3D BAdm&"#GYE}X>Z_\qnW_ Jg}W'u~!7-k,G $1,,DCMpYpfc,P@5|D&5g=2Z2Y\h"X4s -OLC*G>RC3R~L\?Zd;\TlqCOH515!^\V ]Cp KVbS4j^2=uP!"d zZ%=Nm^+{xgM_Uc%7P\1q7hRhmY<1AKU5*A,i-Kgb7bbN;dO!1> !0V@E%R";S mNnyQQ/) HQ2:,0,~cW^u+jl" JNk2(iU/ 1t<}HG+R1t@]w 0c;pmm7OL9LX59;u\BJ4<6Ll)w'X)7 RQ]*')8"9,]7, v0uC/*?F/#TZIHDW%-R[v-mYqi"7lu`ZQ_]'kHJ n(n\AFPQa>X1^Rnqt N>2ybP<\3'yKnK9)xciPoVB4/Iy!DS36 2b`,x5nvE#Hg5 EXw^(yACw\'#u mt>!x?Z=R%("DO[G~u- hCT| I~@+Wb[pxv@Efp=(hdBYO="|= 1c+*PKZ?ywRw|ErJKOn3Ez2c5qq8ZjX ]vg+\W `h_U/=[' G YIcDyG;fiGzI$\ua3_&J);{C<gxqFWQQOeW?17.At6X~)iun[)55P;oX^}*cfCt@ۂcVEDW_Xu*uS>*m\LtTdI^s`&1!d)p #4];fT SE Ifk 7je^SB%lL{UHlwUdg[VB`}&=Nf Rf1%xbn~mkl0*NgdMYyUOZ? , Ka/f; yEl}]9*Ha>>2L?[6wzB?=&V$} /a ;s}<$ TeQ07 Su`MI"IY%H@QA-!AJJ$IILWtj:77)T>ZGdQ {=*Ge'.mmT,]3;kZP Qp`X[DmuJLO=FurZAAJ!SQnMe"/=3Z!S^zWXGcvf]bYTplu?hZ Pn D:\.V{>B3+ #s:1P3(, JS==2 d!oob1&e9hHA1 Ag@#EZ#}cenvAdN[g1"h@Ui9L'SUep2},3%BH 1 M1:JC\O9IiI]!*G*T#;bR*n97m:5B/|t%| VuK[oCbV%nFb;XRA4O^_Q!qVO*:CAAF8y(p*,.n@ yT ~)`H\xG n 7gf/%ap[e,!7t:`F5{;)^wd@!! a#[4ojZC"|CJYje7AUz RVbF?!~ ;CBa@1#^!E3u#irJ$ Yt&kg!K/p8+MlC:]|GeA}CZn$636h e6V"AVc&7s*Hp=P>\V]\Cved`hPbgB(J3nERnB1pA6dq&HJ^|g,0^11M?*UrBe'cKQaHVEQw?T;k-cC0^|Som>e@3{M_W7 7=][**)6>]$!V[Hl_U{suanDMe%iO-YQ#HH/^/UgqpgP:rAUbmS Xo(KI7  k3qNIHvVrMI}r3FVKEkh&3L3Ou&,wP\ qD {EAQPnSlMmIZ~l[J_}r:B'V2nnitU9fb8?"oq {AeUruzJLJmSl"$85Tl]\z36 IUTa9N$B/4Q29 `O,?m61ds=a1kd $-9S$ <{.QMTvO8 BCXTPH ;,,!/QXaR-Fc2GS/_f96XZ_P!rqxD"(?b&hGmpv% e!j%WRmtLY~=S6P( FCAHPCa*Pf1GcT+G0fZ |[QdO5 >olJSyA ;+bZt5?2cVKogl s6{\:\!K*Ca#Kmk"Dyp&1yQU)a$(h>jn0:,5+r2 +H._Jb<3s>/M/#0EXh];M__#Hw2G:1~"X]Cf@_.3h$ud@r?u80#tnO`/ \c<>JE 0{\++_sz%$I~ }*']&clg$>z=A.|{rxTZ3?B Ii@pt=qv(|{On'6 =W,Qm %A66c!&E~,-YSomCjiV9mNE1B_y(800bVjI_HL( 0 //?IK D>X9uVMn?jCsg)|N$G5O] Md))JSsKA\i 6Qrf:JNyTg)cSn@CNUF ?(MUj_fP }9e1 Cl?Hq;Elcmd!nqh%r_cript); static  UNZIP.BCK6[UNZIP60.MACOS.SOURCE]MACOS.C;1# void BuildMacFilename(void); /*****************************************************************************/ /* Constants (strings, etc.) */ /*****************************************************************************/ static ZCONST char Far CannotCreateFile[] = "error: cannot create %s\n"; static ZCONST char Far OutOfMemEF[] = "Can't allocate memory to uncompress"\ " file attributes.\n"; static ZCONST char Far ErrUncmpEF[] = "Error uncompressing file attributes.\n"; static ZCONST char Far No64Time[] = "Don't support 64 bit Timevalues; get "\ " a newer version of MacZip \n"; static ZCONST char Far NoUniCode[] = "Don't support Unicoded Filenames; get"\ " a newer version of MacZip\n"; static ZCONST char Far ZitIt_EF[] = "warning: found ZipIt extra field "\ " -> file is probably not "\ "usable!!\n"; static ZCONST char Far CantAllocateWildcard[] = "warning: cannot allocate wildcard buffers\n"; static ZCONST char Far ErrNoTimeSet[] = "error (%d): cannot set the time for"\ " %s\n"; static ZCONST char Far MacBinaryMsg[] = "\n ... decoding MacBinary "; static ZCONST char Far WarnDirTraversSkip[] = "warning: skipped \"../\" path component(s) in %s\n"; static ZCONST char Far Creating[] = " creating: %s\n"; static ZCONST char Far ConversionFailed[] = "mapname: conversion of %s failed\n"; static ZCONST char Far PathTooLong[] = "checkdir error: path too long: %s\n"; static ZCONST char Far CantCreateDir[] = "checkdir error: cannot create %s\n\ unable to process %s.\n"; static ZCONST char Far DirIsntDirectory[] = "checkdir error: %s exists but is not directory\n\ unable to process %s.\n"; static ZCONST char Far PathTooLongTrunc[] = "checkdir warning: path too long; truncating\n %s\n\ -> %s\n"; static ZCONST char Far CantCreateExtractDir[] = "checkdir: cannot create extraction directory: %s\n"; static ZCONST char Far FilenameToLong[] = "Filename is to long; truncated: %s\n"; /*****************************************************************************/ /* Functions */ /*****************************************************************************/ #ifndef SFX /**********************/ /* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */ /**********************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { static DIR *wild_dir = (DIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname; static unsigned long dirnamelen; struct dirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!notfirstcall) { /* first call: must initialize everything */ notfirstcall = TRUE; /* Folder names must always end with a colon */ if (uO.exdir[strlen(uO.exdir)-1] != ':') { strcat(uO.exdir, ":"); } MacUnzip_Noisy = !uO.qflag; if (MacUnzip_Noisy) printf("%s \n\n", GetUnZipInfoVersions()); /* break the wildspec into a directory part and a wildcard filename */ if ((wildname = (ZCONST char *)strrchr(wildspec, ':')) == (ZCONST char *)NULL) { dirname = ":"; dirnamelen = 1; have_dirname = FALSE; wildname = wildspec; } else { ++wildname; /* point at character after ':' */ dirnamelen = wildname - wildspec; if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) { Info(slide, 0x201, ((char *)slide, LoadFarString(CantAllocateWildcard))); strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; /* but maybe filespec was not a wildcard */ } strncpy(dirname, wildspec, dirnamelen); dirname[dirnamelen] = '\0'; /* terminate for strcpy below */ have_dirname = TRUE; } if ((wild_dir = opendir(dirname)) != (DIR *)NULL) { while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { if (match(file->d_name, wildname, 0 WESEP)) { /* 0=case sens.*/ if (have_dirname) { strcpy(matchname, dirname); strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } /* if we get to here directory is exhausted, so close it */ closedir(wild_dir); wild_dir = (DIR *)NULL; } /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (wild_dir == (DIR *)NULL) { notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ while ((file = readdir(wild_dir)) != (struct dirent *)NULL) if (match(file->d_name, wildname, 0 WESEP)) { /* 0 == case sens. */ if (have_dirname) { /* strcpy(matchname, dirname); */ strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } closedir(wild_dir); /* have read at least one entry; nothing left */ wild_dir = (DIR *)NULL; notfirstcall = FALSE; /* reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /***************************/ /* Function open_outfile() */ /***************************/ int open_outfile(__G) /* return 1 if fail */ __GDEF { short outfd, fDataFork = true; #ifdef DLL if (G.redirect_data) return (redirect_outfile(__G) == FALSE); #endif Trace((stderr, "open_outfile: trying to open (%s) for writing\n", FnFilter1(G.filename))); if (!uO.aflag) { /* unknown type documents */ /* all files are considered to be of type 'TEXT' and creator 'hscd' */ /* this is the default type for CDROM ISO-9660 without Apple extensions */ newExtraField.fpb.hFileInfo.ioFlFndrInfo.fdType = 'TEXT'; newExtraField.fpb.hFileInfo.ioFlFndrInfo.fdCreator = 'hscd'; } else { /* unknown text-files defaults to 'TEXT' */ newExtraField.fpb.hFileInfo.ioFlFndrInfo.fdType = 'TEXT'; /* Bare Bones BBEdit */ newExtraField.fpb.hFileInfo.ioFlFndrInfo.fdCreator = 'R*ch';  UNZIP.BCK6[UNZIP60.MACOS.SOURCE]MACOS.C;1} BuildMacFilename(); if (MacZipMode <= TomBrownZipIt2_EF) { fDataFork = true; } else { fDataFork = (newExtraField.flags & EB_M3_FL_DATFRK) ? TRUE : FALSE; } if ((outfd = maccreat(G.filename)) != -1) { outfd = macopen(G.filename, (fDataFork) ? 1 : 2); } if (outfd == -1) { G.outfile = (FILE *)NULL; Info(slide, 0x401, ((char *)slide, LoadFarString(CannotCreateFile), FnFilter1(G.filename))); return 1; } G.outfile = (FILE *)outfd; Trace((stderr, "open_outfile: successfully opened (%s) for writing\n", FnFilter1(G.filename))); return 0; } /* end function open_outfile() */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) __GDEF { /* only care about read-only bit, so just look at MS-DOS side of attrs */ G.pInfo->read_only = (unsigned)(G.crec.external_file_attributes & 1); return 0; } /* end function mapattr() */ /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels on Macintosh */ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); created_dir = FALSE; /* not yet */ /* user gave full pathname: don't prepend rootpath */ renamed_fullpath = (renamed && (*G.filename == '/')); if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM) return MPN_NOMEM; /* initialize path buffer, unless no memory */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) { /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ if (renamed_fullpath) ++cp; /* skip over leading '/' */ } else ++cp; /* point to start of last component of path */ /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case ':': *pp++ = '/'; /* ':' is a pathseperator for HFS */ break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; /* keep for now; remove VMS ";##" */ *pp++ = (char)workch; /* later, if requested */ break; default: /* allow European characters in filenames: */ if (isprint(workch) || (128 <= workch && workch <= 254)) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(WarnDirTraversSkip), FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(Creating), FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, LoadFarString(ConversionFailed), FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { static int rootlen = 0; /* length of rootpath */ static char *R UNZIP.BCK6[UNZIP60.MACOS.SOURCE]MACOS.C;1P(rootpath; /* user's "extract-to" directory */ static char *buildpath; /* full path (so far) to extracted file */ static char *end; /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') ++end; #ifdef SHORT_NAMES /* path components restricted to 14 chars, typically */ if ((end-old_end) > NAME_MAX) *(end = old_end + NAME_MAX) = '\0'; #endif /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ if ((end-buildpath) > NAME_MAX-3) /* need ':', one-char name, '\0' */ too_long = TRUE; /* check if extracting directory? */ if (stat(buildpath, &G.statbuf)) { /* path doesn't exist */ if (!G.create_dirs) { /* told not to create (freshening) */ free(buildpath); return MPN_INF_SKIP; /* path doesn't exist: nothing to do */ } if (too_long) { Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong), FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (macmkdir(buildpath) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, LoadFarString(CantCreateDir), FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, LoadFarString(DirIsntDirectory), FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong), FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *end++ = ':'; *end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(buildpath); buildpath = end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') { ++end; #ifdef SHORT_NAMES /* truncate name at 14 characters, typically */ if ((end-old_end) > NAME_MAX) *(end = old_end + NAME_MAX) = '\0'; #endif if ((end-buildpath) >= NAME_MAX) { *--end = '\0'; Info(slide, 0x201, ((char *)slide, LoadFarString(PathTooLongTrunc), FnFilter1(G.filename), FnFilter2(buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+2)) == (char *)NULL) return MPN_NOMEM; if ((rootlen > 0) && !renamed_fullpath) { strcpy(buildpath, rootpath); end = buildpath + rootlen; } else { end = buildpath; if (!renamed_fullpath && !uO.jflag) { *end++ = ':'; /* indicate relative path */ } *end = '\0'; } Trace((stderr, "[%s]\n", FnFilter1(buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if necessary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1pathcomp))); if (pathcomp == (char *)NULL) { rootlen = 0; return MPN_OK; } if (rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((rootlen = strlen(pathcomp)) > 0) { char *tmproot; if ((tmproot = (char *)malloc(rootlen+2)) == (char *)NULL) { rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (tmproot[rootlen-1] == ':') { tmproot[--rootlen] = '\0'; /* strip trailing delimiter */ } if (rootlen > 0 && (stat(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode))) { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); rootlen = 0; /* skip (or treat as stored file) */ return MPN_INF_SKIP; } /* create the directory (could add loop here scanning tmproot * to create more than one level, but why really necessary?) */ if (macmkdir(tmproot) == -1) { Info(sy UNZIP.BCK6[UNZIP60.MACOS.SOURCE]MACOS.C;1:7lide, 1, ((char *)slide, LoadFarString(CantCreateExtractDir), FnFilter1(tmproot))); free(tmproot); rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdir levels required */ return MPN_ERR_SKIP; } } tmproot[rootlen++] = ':'; tmproot[rootlen] = '\0'; if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) { free(tmproot); rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (rootlen > 0) { free(rootpath); rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) __GDEF { OSErr err; if (fileno(G.outfile) == 1) return; /* don't attempt to close or set time on stdout */ err = (OSErr)fclose(G.outfile); /* finally set FinderInfo */ if (MacZipMode >= JohnnyLee_EF) { /* skip restoring time stamps on user's request */ err = SetFinderInfo(__G__ (uO.D_flag <= 1), &CurrentFile, &newExtraField); printerr("close_outfile SetFinderInfo ", err, err, __LINE__, __FILE__, G.filename); } else /* unknown extra field, set at least file time/dates */ { /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) err = SetFileTime(__G); } #ifndef SwitchZIPITefSupportOff if ((MacZipMode == TomBrownZipIt1_EF) || (MacZipMode == TomBrownZipIt2_EF)) { if(FSpIsMacBinary(&CurrentFile)) { Info(slide, 0, ((char *)slide, LoadFarString(MacBinaryMsg))); err = DecodeMacBinaryFile(&CurrentFile); printerr("close_outfile DecodeMacBinaryFile ", err, err, __LINE__, __FILE__, G.filename); } } #endif /* set read-only perms if needed */ if ((err == noErr) && G.pInfo->read_only) { err = FSpSetFLock(&CurrentFile); printerr("FSpSetFLock",err,err,__LINE__,__FILE__,G.filename); } if (malloced_attrbuff != NULL) { attrbuff = malloced_attrbuff; } } /* end function close_outfile() */ /****************************/ /* Function SetFileTime() */ /****************************/ static OSErr SetFileTime(__G) __GDEF { #ifdef USE_EF_UT_TIME iztimes z_utime; unsigned eb_izux_flg; #endif OSErr err; CInfoPBRec fpb; fpb.hFileInfo.ioNamePtr = CurrentFile.name; fpb.hFileInfo.ioVRefNum = CurrentFile.vRefNum; fpb.hFileInfo.ioDirID = CurrentFile.parID; fpb.hFileInfo.ioFDirIndex = 0; err = PBGetCatInfoSync((CInfoPBPtr)&fpb); printerr("PBGetCatInfoSync", err, err, __LINE__, __FILE__, G.filename); if ((MacZipMode == UnKnown_EF) || UseUT_ExtraField ) { #ifdef USE_EF_UT_TIME eb_izux_flg = ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL); if (G.extra_field && (eb_izux_flg & EB_UT_FL_MTIME)) { fpb.hFileInfo.ioFlMdDat = UnixFtime2MacFtime(z_utime.mtime); fpb.hFileInfo.ioFlCrDat = UnixFtime2MacFtime(z_utime.ctime); } #ifdef DEBUG_TIME { struct tm *tp = gmtime(&z_utime.ctime); printf( "SetFileTime: Unix e.f. creat. time = %d/%2d/%2d %2d:%2d:%2d -> %lu UTC\n", tp->tm_year, tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec, z_utime.ctime); tp = gmtime(&z_utime.mtime); printf( "SetFileTime: Unix e.f. modif. time = %d/%2d/%2d %2d:%2d:%2d -> %lu UTC\n", tp->tm_year, tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec, z_utime.mtime); } #endif /* DEBUG_TIME */ else /* no Unix time field found - use dostime */ #endif /* !USE_EF_UT_TIME */ { TTrace((stderr, "SetFileTime: using DOS-Datetime ! \n", z_utime.mtime)); fpb.hFileInfo.ioFlMdDat = dos_to_unix_time(G.lrec.last_mod_dos_datetime); UNIX_TO_MACOS(fpb.hFileInfo.ioFlMdDat); fpb.hFileInfo.ioFlCrDat = fpb.hFileInfo.ioFlMdDat; } /* Restore ioDirID field in pb which was changed by PBGetCatInfoSync */ fpb.hFileInfo.ioDirID = CurrentFile.parID; if (err == noErr) { err = PBSetCatInfoSync((CInfoPBPtr)&fpb); printerr("PBSetCatInfoSync",err,err,__LINE__,__FILE__,G.filename); } if (err != noErr) Info(slide, 0x201, ((char *)slide, LoadFarString(ErrNoTimeSet), FnFilter1(G.filename))); } return err; } /* end function SetFileTime() */ #ifndef SFX /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { /* ZCONST char Far CompiledWith[] = "Compiled with %s%s for %s%s%s%s.\n\n"; */ char DateTime[50]; #ifdef __MWERKS__ char CompVer[10]; sprintf(CompVer, "%x", __MWERKS__); #endif sprintf(DateTime,"%s %s",__DATE__, __TIME__); sprintf((char *)slide, LoadFarString(CompiledWith), #ifdef __MWERKS__ " Metrowerks CodeWarrior version ",CompVer, #else " ", " ", #endif #ifdef __MC68K__ " MC68K Processor", #else " PowerPC Processor", #endif #ifdef __DATE__ "\n compile time: ", DateTime, "" #else "", "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0); } /* end function version() */ #endif /* !SFX */ /***********************/ /* Function macmkdir() */ /***********************/ int macmkdir(char *path) { OSErr err = -1; OSErr err_rc; char CompletePath[NAME_MAX], CompletePath2[NAME_MAX]; Boolean isDirectory = false; short CurrentFork; unsigned pathlen; long dirID; AssertStr(path, path) GetExtraFieldData(&MacZipMode, &newExtraField); if (MacZipMode >= JohnnyLee_EF) { RfDfFilen2Real(CompletePath, G.filename, MacZipMode, (newExtraField.flags & EB_M3_FL_NOCHANGE), &CurrentFork); if (CurrentFork == ResourceFork) /* don't build a 'XtraStuf.mac:' dir */ return 0; } if (!IgnoreEF_Macfilename) { pathlen = strlen(path); strcpy(CompletePath, uO.exdir); strcat(CompletePath, newExtraField.FullPath); CompletePath[pathlen] = 0x00; } else { strcpy(CompletePath, path); } GetCompletePath(CompletePath2, CompletePath, &CurrentFile, &err); printerr("GetCompletePath", (err != -43) && (err != -120) && (err != 0), err, __LINE__, __FILE__, CompletePath2); err = FSpGetDirectoryID(&CurrentF/ &P UNZIP.BCK6[UNZIP60.MACOS.SOURCE]MACOS.C;1aFile, &dirID, &isDirectory); printerr("macmkdir FSpGetDirectoryID ", (err != -43) && (err != 0), err, __LINE__, __FILE__, CompletePath2); if (err != -43) /* -43 = file/directory not found */ return 0; else { HParamBlockRec hpbr; hpbr.fileParam.ioCompletion = NULL; hpbr.fileParam.ioNamePtr = CurrentFile.name; hpbr.fileParam.ioVRefNum = CurrentFile.vRefNum; hpbr.fileParam.ioDirID = CurrentFile.parID; err = PBDirCreateSync(&hpbr); printerr("macmkdir PBDirCreateSync ", err, err, __LINE__, __FILE__, CompletePath2); /* finally set FinderInfo */ if (MacZipMode >= JohnnyLee_EF) { err_rc = SetFinderInfo(__G__ (uO.D_flag <= 0), &CurrentFile, &newExtraField); printerr("macmkdir SetFinderInfo ", err_rc, err_rc, __LINE__, __FILE__, CompletePath2); } } return (int)err; } /* macmkdir */ /**********************/ /* Function macopen() */ /**********************/ short macopen(char *sz, short nFlags) { OSErr err; char chPerms = (!nFlags) ? fsRdPerm : fsRdWrPerm; short nFRefNum; AssertStr(sz, sz) /* we only need the filespec of the zipfile; filespec of the other files (to be extracted) will be determined by open_outfile() */ if (OpenZipFile) { char CompletePath[NAME_MAX]; FSSpec zipfile; GetCompletePath(CompletePath, sz, &zipfile, &err); printerr("GetCompletePath", (err != -43) && (err != 0), err, __LINE__, __FILE__, sz); if (CheckMountedVolumes(CompletePath) > 1) DoWarnUserDupVol(CompletePath); err = HOpen(zipfile.vRefNum, zipfile.parID, zipfile.name, chPerms, &nFRefNum); printerr("Zipfile HOpen", err, err, __LINE__, __FILE__, sz); OpenZipFile = false; } else /* open zipfile entries */ { if (nFlags > 1) { err = HOpenRF(CurrentFile.vRefNum, CurrentFile.parID, CurrentFile.name, chPerms, &nFRefNum); printerr("HOpenRF", (err != -43) && (err != 0) && (err != -54), err, __LINE__, __FILE__, sz); } else { err = HOpen(CurrentFile.vRefNum, CurrentFile.parID, CurrentFile.name, chPerms, &nFRefNum); printerr("HOpen", (err != -43) && (err != 0), err, __LINE__, __FILE__, sz); } } if ( err || (nFRefNum == 1) ) { printerr("macopen", err, err, __LINE__, __FILE__, (char *) CurrentFile.name); return -1; } else { if ( nFlags ) SetEOF( nFRefNum, 0 ); return nFRefNum; } } /***********************/ /* Function maccreat() */ /***********************/ short maccreat(char *sz) { OSErr err; char scriptTag = newExtraField.fpb.hFileInfo.ioFlXFndrInfo.fdScript; static char Num = 0; sz = sz; /* Set fdScript in FXInfo * The negative script constants (smSystemScript, smCurrentScript, * and smAllScripts) don't make sense on disk. So only use scriptTag * if scriptTag >= smRoman (smRoman is 0). * fdScript is valid if high bit is set (see IM-6, page 9-38) */ scriptTag = (scriptTag >= smRoman) ? ((char)scriptTag | (char)0x80) : (smRoman); newExtraField.fpb.hFileInfo.ioFlXFndrInfo.fdScript = scriptTag; err = FSpCreate(&CurrentFile, newExtraField.fpb.hFileInfo.ioFlFndrInfo.fdCreator, newExtraField.fpb.hFileInfo.ioFlFndrInfo.fdType, newExtraField.fpb.hFileInfo.ioFlXFndrInfo.fdScript); /* -37 = bad filename; make the filename shorter and try again */ /* filename must not be longer than 32 chars */ if (err == -37) { strcpy((char *)CurrentFile.name, MakeFilenameShorter(P2CStr(CurrentFile.name))); Info(slide, 0x401, ((char *)slide, LoadFarString(FilenameToLong), FnFilter1((char *)CurrentFile.name))); C2PStr((char *)CurrentFile.name); err = FSpCreate(&CurrentFile, newExtraField.fpb.hFileInfo.ioFlFndrInfo.fdCreator, newExtraField.fpb.hFileInfo.ioFlFndrInfo.fdType, newExtraField.fpb.hFileInfo.ioFlXFndrInfo.fdScript); } err = printerr("FSpCreate maccreat ", (err != -48) && (err != 0), err, __LINE__, __FILE__, G.filename); if (err == noErr) return noErr; else return -1; } /**********************/ /* Function macread() */ /**********************/ short macread(short nFRefNum, char *pb, unsigned cb) { long lcb = cb; (void)FSRead( nFRefNum, &lcb, pb ); return (short)lcb; } /***********************/ /* Function macwrite() */ /***********************/ long macwrite(short nFRefNum, char *pb, unsigned cb) { long lcb = cb; OSErr err = 0; FILE *stream; if ( (nFRefNum == 1) || (nFRefNum == 2) ) { stream = (nFRefNum == 1 ? stdout : stderr); pb[cb] = '\0'; /* terminate C-string */ /* assumes writable buffer (e.g., slide[]) */ /* with room for one more char at end of buf */ lcb = fprintf(stream, "%s", pb); } else err = FSWrite( nFRefNum, &lcb, pb ); if (err != 0) { errno = ERANGE; return -1; } return (long)lcb; } /***********************/ /* Function macclose() */ /***********************/ short macclose(short nFRefNum) { OSErr err; err = FSClose( nFRefNum ); printerr("macclose FSClose ",err,err, __LINE__,__FILE__,G.filename); return err; } /***********************/ /* Function maclseek() */ /***********************/ long maclseek(short nFRefNum, long lib, short nMode) { ParamBlockRec pbr; if (nMode == SEEK_SET) nMode = fsFromStart; else if (nMode == SEEK_CUR) nMode = fsFromMark; else if (nMode == SEEK_END) nMode = fsFromLEOF; pbr.ioParam.ioRefNum = nFRefNum; pbr.ioParam.ioPosMode = nMode; pbr.ioParam.ioPosOffset = lib; (void)PBSetFPosSync(&pbr); return pbr.ioParam.ioPosOffset; } static void BuildMacFilename(void) { char CompletePath[NAME_MAX]; char ArchiveDir[NAME_MAX]; unsigned exdirlen = strlen(uO.exdir); short CurrentFork; OSErr err; GetExtraFieldData(&MacZipMode, &newExtraField); if (MacZipMode >= JohnnyLee_EF) { if (IgnoreEF_Macfilename) { strcpy(ArchiveDir, &G.filename[exdirlen+1]); G.filename[exdirlen+1] = '\0'; RfDfFilen2Real(ArchiveDir, ArchiveDir, MacZipMode, (newExtraField.flags & EB_M3_FL_DATFRK), &CurrentFork); strcat(G.filename, ArchiveDir); } else { /* use the filename of mac extra-field */ G.filename[exdirlen] = '\0'; /* cut resource-path */ strcat(G.filename,newExtraField.FullPath); } } GetCompletePath(CompletePath, G.filename, &CurrentFile, &err); printerr("GetCompletePath BuildMacFilename ", (err != -43) && (err != 0), err, __LINE__, __FILE__, CompletePath); err = GetVolFileSystemID(C2PStr(CompletePath), CurrentFile.vRefNum, &fileSystemID); printerr("GetVolFileSystemID BuildMacFilename ", err, err, __LINE__, __FILE__, CompletePath); if (MacZipMode = UNZIP.BCK6[UNZIP60.MACOS.SOURCE]MACOS.C;1IU= TomBrownZipIt1_EF) { memcpy(CurrentFile.name, newExtraField.filename, newExtraField.filename[0]+1); CurrentFile.name[0] = CurrentFile.name[0] - 1; } } /* The following functions are dealing with the extra-field handling, only. */ /****************************/ /* Function SetFinderInfo() */ /****************************/ static OSErr SetFinderInfo(__GPRO__ int SetTime, FSSpec *spec, MACINFO *mi) { OSErr err; CInfoPBRec fpb; fpb.hFileInfo.ioNamePtr = (StringPtr) &(spec->name); fpb.hFileInfo.ioVRefNum = spec->vRefNum; fpb.hFileInfo.ioDirID = spec->parID; fpb.hFileInfo.ioFDirIndex = 0; err = PBGetCatInfoSync(&fpb); printerr("PBGetCatInfo SetFinderInfo ", err, err, __LINE__, __FILE__, G.filename); if ((MacZipMode == JohnnyLee_EF) || (MacZipMode == NewZipMode_EF)) { /* skip restoring time stamps on user's request */ if (SetTime && !UseUT_ExtraField) { fpb.hFileInfo.ioFlCrDat = mi->fpb.hFileInfo.ioFlCrDat; fpb.hFileInfo.ioFlMdDat = mi->fpb.hFileInfo.ioFlMdDat; } fpb.hFileInfo.ioFlFndrInfo = mi->fpb.hFileInfo.ioFlFndrInfo; } if (MacZipMode == NewZipMode_EF) { if (uO.E_flag) PrintMacExtraInfo(mi); fpb.hFileInfo.ioFlXFndrInfo = mi->fpb.hFileInfo.ioFlXFndrInfo; fpb.hFileInfo.ioFVersNum = mi->fpb.hFileInfo.ioFVersNum; fpb.hFileInfo.ioACUser = mi->fpb.hFileInfo.ioACUser; /* skip restoring time stamps on user's request */ if (SetTime && !UseUT_ExtraField) { fpb.hFileInfo.ioFlBkDat = mi->fpb.hFileInfo.ioFlBkDat; #ifdef USE_EF_UT_TIME if (!(mi->flags & EB_M3_FL_NOUTC)) { #ifdef DEBUG_TIME { printf("\nSetFinderInfo: Mac modif: %lu local -> UTOffset: "\ "%d before AdjustForTZmoveMac\n", fpb.hFileInfo.ioFlCrDat, mi->Cr_UTCoffs); } #endif /* DEBUG_TIME */ fpb.hFileInfo.ioFlCrDat = AdjustForTZmoveMac(fpb.hFileInfo.ioFlCrDat, mi->Cr_UTCoffs); fpb.hFileInfo.ioFlMdDat = AdjustForTZmoveMac(fpb.hFileInfo.ioFlMdDat, mi->Md_UTCoffs); fpb.hFileInfo.ioFlBkDat = AdjustForTZmoveMac(fpb.hFileInfo.ioFlBkDat, mi->Bk_UTCoffs); #ifdef DEBUG_TIME { printf("SetFinderInfo: Mac modif: %lu local -> UTOffset: "\ "%d after AdjustForTZmoveMac\n", fpb.hFileInfo.ioFlCrDat, mi->Cr_UTCoffs); } #endif /* DEBUG_TIME */ } #endif /* USE_EF_UT_TIME */ } if ((mi->FinderComment) && (fileSystemID == HFS_fileSystem)) { C2PStr(mi->FinderComment); err = FSpDTSetComment(spec, (unsigned char *) mi->FinderComment); printerr("FSpDTSetComment:",err , err, __LINE__, __FILE__, mi->FullPath); } } /* Restore ioDirID field in pb which was changed by PBGetCatInfo */ fpb.hFileInfo.ioDirID = spec->parID; err = PBSetCatInfoSync(&fpb); return err; } /* SetFinderInfo() */ /* ** Scan the extra fields in extra_field, and look for a MacOS EF; return a ** pointer to that EF, or NULL if it's not there. */ static uch *scanMacOSexfield(uch *ef_ptr, unsigned ef_len, short *MacZipMode) { while (ef_ptr != NULL && ef_len >= EB_HEADSIZE) { unsigned eb_id = makeword(EB_ID + ef_ptr); unsigned eb_len = makeword(EB_LEN + ef_ptr); if (eb_len > (ef_len - EB_HEADSIZE)) { Trace((stderr, "scanMacOSexfield: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } if (isMacOSexfield(eb_id, eb_len, MacZipMode)) { return ef_ptr; } ef_ptr += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); } return NULL; } static Boolean isMacOSexfield(unsigned id, unsigned size, short *MacZipMode) { size = size; switch (id) { case EF_ZIPIT: { /* we do not (yet) support ZipIt's format completely */ *MacZipMode = TomBrownZipIt1_EF; IgnoreEF_Macfilename = true; return true; } case EF_ZIPIT2: { /* we do not (yet) support ZipIt's format completely */ *MacZipMode = TomBrownZipIt2_EF; IgnoreEF_Macfilename = true; return true; } case EF_MAC3: { /* the new maczip format */ *MacZipMode = NewZipMode_EF; IgnoreEF_Macfilename = false; return true; } case EF_JLMAC: { /* Johnny Lee's old maczip format */ *MacZipMode = JohnnyLee_EF; IgnoreEF_Macfilename = true; return true; } default: { /* any other format */ *MacZipMode = UnKnown_EF; IgnoreEF_Macfilename = true; return false; } } return false; } /* ** Return a unsigned long from a four-byte sequence ** in big endian format */ ulg makePPClong(ZCONST uch *sig) { return (((ulg)sig[0]) << 24) + (((ulg)sig[1]) << 16) + (((ulg)sig[2]) << 8) + ((ulg)sig[3]); } /* ** Return a unsigned short from a two-byte sequence ** in big endian format */ ush makePPCword(ZCONST uch *b) { return (ush)((b[0] << 8) | b[1]); } /* ** Print mac extra-field ** */ static void PrintMacExtraInfo(MACINFO *mi) { #define MY_FNDRINFO fpb.hFileInfo.ioFlFndrInfo DateTimeRec MacTime; static ZCONST char space[] = " "; static ZCONST char line[] = "------------------------------------"\ "------------------------------"; printf("\n\n%s", line); printf("\nFullPath = [%s]", mi->FullPath); printf("\nFinderComment = [%s]", mi->FinderComment); printf("\nText Encoding Base (Filename) \"%s\" \n", PrintTextEncoding(mi->fpb.hFileInfo.ioFlXFndrInfo.fdScript)); printf("\nExtraField Flags : %s 0x%x %4d", sBit2Str(mi->flags), mi->flags, mi->flags); printf("\n%sExtra Field is %s", space, (mi->flags & EB_M3_FL_UNCMPR ? "Uncompressed" : "Compressed")); printf("\n%sFile Dates are in %u Bit", space, (mi->flags & EB_M3_FL_TIME64 ? 64 : 32)); printf("\n%sFile UTC time adjustments are %ssupported", space, (mi->flags & EB_M3_FL_NOUTC ? "not " : "")); printf("\n%sFile Name is %schanged", space, (mi->flags & EB_M3_FL_NOCHANGE ? "not " : "")); printf("\n%sFile is a %s\n", space, (mi->flags & EB_M3_FL_DATFRK ? "Datafork" : "Resourcefork")); /* not all type / creator codes are printable */ if (isprint((char)(mi->MY_FNDRINFO.fdType >> 24)) && isprint((char)(mi->MY_FNDRINFO.fdType >> 16)) && isprint((char)(mi->MY_FNDRINFO.fdType >> 8)) && isprint((char)mi->MY_FNDRINFO.fdType)) { printf("\nFile Type = [%c%c%c%c] 0x%lx", (char)(mi->MY_FNDRINFO.fdType >> 24), (char)(mi->MY_FNDRINFO.fdType >> 16), (char)(mi->MY_FNDRINFO.fdType >> 8), (char)(mi->MY_FNDRINFO.fdType), mi->MY_FNDRINFO.fdType); } else { printf("\nFile Type = 0x%lx", mi->MY_FNDRINFO.fdTyK{ UNZIP.BCK6[UNZIP60.MACOS.SOURCE]MACOS.C;1Xdpe); } if (isprint((char)(mi->MY_FNDRINFO.fdCreator >> 24)) && isprint((char)(mi->MY_FNDRINFO.fdCreator >> 16)) && isprint((char)(mi->MY_FNDRINFO.fdCreator >> 8)) && isprint((char)mi->MY_FNDRINFO.fdCreator)) { printf("\nFile Creator = [%c%c%c%c] 0x%lx", (char)(mi->MY_FNDRINFO.fdCreator >> 24), (char)(mi->MY_FNDRINFO.fdCreator >> 16), (char)(mi->MY_FNDRINFO.fdCreator >> 8), (char)(mi->MY_FNDRINFO.fdCreator), mi->MY_FNDRINFO.fdCreator); } else { printf("\nFile Creator = 0x%lx", mi->MY_FNDRINFO.fdCreator); } printf("\n\nDates (local time of archiving location):"); SecondsToDate(mi->fpb.hFileInfo.ioFlCrDat, &MacTime); printf("\n Created = %4d/%2d/%2d %2d:%2d:%2d ", MacTime.year, MacTime.month, MacTime.day, MacTime.hour, MacTime.minute, MacTime.second); SecondsToDate(mi->fpb.hFileInfo.ioFlMdDat, &MacTime); printf("\n Modified = %4d/%2d/%2d %2d:%2d:%2d ", MacTime.year, MacTime.month, MacTime.day, MacTime.hour, MacTime.minute, MacTime.second); SecondsToDate(mi->fpb.hFileInfo.ioFlBkDat, &MacTime); printf("\n Backup = %4d/%2d/%2d %2d:%2d:%2d ", MacTime.year, MacTime.month, MacTime.day, MacTime.hour, MacTime.minute, MacTime.second); if (!(mi->flags & EB_M3_FL_NOUTC)) { printf("\nGMT Offset of Creation time = %4ld sec %2d h", mi->Cr_UTCoffs, (int)mi->Cr_UTCoffs / (60 * 60)); printf("\nGMT Offset of Modification time = %4ld sec %2d h", mi->Md_UTCoffs, (int)mi->Md_UTCoffs / (60 * 60)); printf("\nGMT Offset of Backup time = %4ld sec %2d h", mi->Bk_UTCoffs, (int)mi->Bk_UTCoffs / (60 * 60)); } printf("\n\nFinder Flags : %s 0x%x %4d", sBit2Str(mi->MY_FNDRINFO.fdFlags), mi->MY_FNDRINFO.fdFlags, mi->MY_FNDRINFO.fdFlags); printf("\nFinder Icon Position = X: %4d", mi->MY_FNDRINFO.fdLocation.h); printf("\n Y: %4d", mi->MY_FNDRINFO.fdLocation.v); printf("\n\nText Encoding Base (System/MacZip) \"%s\"", PrintTextEncoding(mi->TextEncodingBase)); printf("\n%s\n", line); #undef MY_FNDRINFO } /* ** Decode mac extra-field and assign the data to the structure ** */ static Boolean GetExtraFieldData(short *MacZipMode, MACINFO *mi) { uch *ptr; int retval = PK_OK; ptr = scanMacOSexfield(G.extra_field, G.lrec.extra_field_length, MacZipMode); /* MacOS is no preemptive OS therefore do some (small) event-handling */ UserStop(); if (uO.J_flag) { *MacZipMode = UnKnown_EF; IgnoreEF_Macfilename = true; return false; } if (ptr != NULL) { /* Collect the data from the extra field buffer. */ mi->header = makeword(ptr); ptr += 2; mi->data = makeword(ptr); ptr += 2; switch (*MacZipMode) { case NewZipMode_EF: { mi->size = makelong(ptr); ptr += 4; mi->flags = makeword(ptr); ptr += 2; /* Type/Creator are always uncompressed */ mi->fpb.hFileInfo.ioFlFndrInfo.fdType = makePPClong(ptr); ptr += 4; mi->fpb.hFileInfo.ioFlFndrInfo.fdCreator = makePPClong(ptr); ptr += 4; if (!(mi->flags & EB_M3_FL_UNCMPR)) { retval = memextract(__G__ attrbuff, mi->size, ptr, mi->data - EB_MAC3_HLEN); if (retval != PK_OK) /* error uncompressing attributes */ { Info(slide, 0x201, ((char *)slide, LoadFarString(ErrUncmpEF))); *MacZipMode = UnKnown_EF; return false; /* EF-Block unusable, ignore it */ } } else { /* file attributes are uncompressed */ attrbuff = ptr; } DecodeMac3ExtraField(attrbuff, mi); return true; break; } case JohnnyLee_EF: { if (strncmp((char *)ptr, "JLEE", 4) == 0) { /* Johnny Lee's old MacZip e.f. was found */ attrbuff = ptr + 4; DecodeJLEEextraField(attrbuff, mi); return true; } else { /* second signature did not match, ignore EF block */ *MacZipMode = UnKnown_EF; return false; } break; } case TomBrownZipIt1_EF: case TomBrownZipIt2_EF: { if (strncmp((char *)ptr, "ZPIT", 4) == 0) { /* Johnny Lee's old MacZip e.f. was found */ attrbuff = ptr + 4; DecodeZPITextraField(attrbuff, mi); return true; } else { /* second signature did not match, ignore EF block */ *MacZipMode = UnKnown_EF; return false; } break; } default: { /* just to make sure */ *MacZipMode = UnKnown_EF; IgnoreEF_Macfilename = true; return false; break; } } } /* if (ptr != NULL) */ /* no Mac extra field was found */ return false; } /* ** Assign the new Mac3 Extra-Field to the structure ** */ static void DecodeMac3ExtraField(ZCONST uch *buff, MACINFO *mi) { /* extra-field info of the new MacZip implementation */ /* compresssed extra-field starts here (if compressed) */ Assert_it(buff, "", ""); mi->fpb.hFileInfo.ioFlFndrInfo.fdFlags = makeword(buff); buff += 2; mi->fpb.hFileInfo.ioFlFndrInfo.fdLocation.v = makeword(buff); buff += 2; mi->fpb.hFileInfo.ioFlFndrInfo.fdLocation.h = makeword(buff); buff += 2; mi->fpb.hFileInfo.ioFlFndrInfo.fdFldr = makeword(buff); buff += 2; mi->fpb.hFileInfo.ioFlXFndrInfo.fdIconID = makeword(buff); buff += 2; mi->fpb.hFileInfo.ioFlXFndrInfo.fdReserved[0] = makeword(buff); buff += 2; mi->fpb.hFileInfo.ioFlXFndrInfo.fdReserved[1] = makeword(buff); buff += 2; mi->fpb.hFileInfo.ioFlXFndrInfo.fdReserved[2] = makeword(buff); buff += 2; mi->fpb.hFileInfo.ioFlXFndrInfo.fdScript = *buff; buff += 1; mi->fpb.hFileInfo.ioFlXFndrInfo.fdXFlags = *buff; buff += 1; mi->fpb.hFileInfo.ioFlXFndrInfo.fdComment = makeword(buff); buff += 2; mi->fpb.hFileInfo.ioFlXFndrInfo.fdPutAway = makelong(buff); buff += 4; mi->fpb.hFileInfo.ioFVersNum = *buff; buff += 1; mi->fpb.hFileInfo.ioACUser = *buff; buff += 1; /* This implementation does not use the 64 bit time values, therefore use the UT extra field instead */ if (mi->flags & EB_M3_FL_TIME64) { Info(slide, 0x201, ((char *)slide, LoadFarString(No64Time))); UseUT_ExtraField = true; buff += 24; /* jump over the date values */ } else { UseUT_ExtraField = false; mi->fpb.hFileInfo.ioFlCrDat = makelong(buff); buff += 4; mi->fpb.hFileInfo.ioFlMdDat = makelong(buff); buff += 4; mi->fpb.hFileInfo.ioFlBkDat = makelong(buff); buff += 4; } if (!(mi->flags & EB_M3_FL_NOUTC)) { mi->Cr_UTCoffs = makelong(buff); ˆl UNZIP.BCK6[UNZIP60.MACOS.SOURCE]MACOS.C;1sbuff += 4; mi->Md_UTCoffs = makelong(buff); buff += 4; mi->Bk_UTCoffs = makelong(buff); buff += 4; } /* TextEncodingBase type & values */ /* (values 0-32 correspond to the Script Codes defined in "Inside Macintosh", Text pages 6-52 and 6-53) */ mi->TextEncodingBase = makeword(buff); buff += 2; if (mi->TextEncodingBase >= kTextEncodingUnicodeV1_1) { Info(slide, 0x201, ((char *)slide, LoadFarString(NoUniCode))); IgnoreEF_Macfilename = true; } mi->FullPath = (char *)buff; buff += strlen(mi->FullPath) + 1; mi->FinderComment = (char *)buff; buff += strlen(mi->FinderComment) + 1; if (uO.i_flag) IgnoreEF_Macfilename = true; } /* ** Assign the new JLEE Extra-Field to the structure ** */ static void DecodeJLEEextraField(ZCONST uch *buff, MACINFO *mi) { /* extra-field info of Johnny Lee's old MacZip */ Assert_it(buff, "", ""); mi->fpb.hFileInfo.ioFlFndrInfo.fdType = makePPClong(buff); buff += 4; mi->fpb.hFileInfo.ioFlFndrInfo.fdCreator = makePPClong(buff); buff += 4; mi->fpb.hFileInfo.ioFlFndrInfo.fdFlags = makePPCword(buff); buff += 2; mi->fpb.hFileInfo.ioFlFndrInfo.fdLocation.v = makePPCword(buff); buff += 2; mi->fpb.hFileInfo.ioFlFndrInfo.fdLocation.h = makePPCword(buff); buff += 2; mi->fpb.hFileInfo.ioFlFndrInfo.fdFldr = makePPCword(buff); buff += 2; mi->fpb.hFileInfo.ioFlCrDat = makePPClong(buff); buff += 4; mi->fpb.hFileInfo.ioFlMdDat = makePPClong(buff); buff += 4; mi->flags = makePPClong(buff); buff += 4; newExtraField.fpb.hFileInfo.ioFlXFndrInfo.fdScript = smSystemScript; } /* ** Assign the new JLEE Extra-Field to the structure ** */ static void DecodeZPITextraField(ZCONST uch *buff, MACINFO *mi) { /* extra-field info of Johnny Lee's old MacZip */ unsigned char filelen; Assert_it(buff, "", ""); #ifdef SwitchZIPITefSupportOff MacZipMode = UnKnown_EF; Info(slide, 0x221, ((char *)slide,LoadFarString(ZitIt_EF))); return; #endif if (MacZipMode == TomBrownZipIt1_EF) { filelen = *buff; newExtraField.filename = buff; buff += 1; buff += filelen; mi->fpb.hFileInfo.ioFlFndrInfo.fdType = makePPClong(buff); buff += 4; mi->fpb.hFileInfo.ioFlFndrInfo.fdCreator = makePPClong(buff); buff += 4; } else /* if (MacZipMode == TomBrownZipIt2_EF) */ { mi->fpb.hFileInfo.ioFlFndrInfo.fdType = makePPClong(buff); buff += 4; mi->fpb.hFileInfo.ioFlFndrInfo.fdCreator = makePPClong(buff); buff += 4; } newExtraField.fpb.hFileInfo.ioFlXFndrInfo.fdScript = smSystemScript; } /* ** Return char* to describe the text encoding ** */ static char *PrintTextEncoding(short script) { char *info; static char buffer[14]; /* TextEncodingBase type & values */ /* (values 0-32 correspond to the Script Codes defined in Inside Macintosh: Text pages 6-52 and 6-53 */ switch (script) { /* Mac OS encodings*/ case kTextEncodingMacRoman: info = "Roman"; break; case kTextEncodingMacJapanese: info = "Japanese"; break; case kTextEncodingMacChineseTrad: info = "ChineseTrad"; break; case kTextEncodingMacKorean: info = "Korean"; break; case kTextEncodingMacArabic: info = "Arabic"; break; case kTextEncodingMacHebrew: info = "Hebrew"; break; case kTextEncodingMacGreek: info = "Greek"; break; case kTextEncodingMacCyrillic: info = "Cyrillic"; break; case kTextEncodingMacDevanagari: info = "Devanagari"; break; case kTextEncodingMacGurmukhi: info = "Gurmukhi"; break; case kTextEncodingMacGujarati: info = "Gujarati"; break; case kTextEncodingMacOriya: info = "Oriya"; break; case kTextEncodingMacBengali: info = "Bengali"; break; case kTextEncodingMacTamil: info = "Tamil"; break; case kTextEncodingMacTelugu: info = "Telugu"; break; case kTextEncodingMacKannada: info = "Kannada"; break; case kTextEncodingMacMalayalam: info = "Malayalam"; break; case kTextEncodingMacSinhalese: info = "Sinhalese"; break; case kTextEncodingMacBurmese: info = "Burmese"; break; case kTextEncodingMacKhmer: info = "Khmer"; break; case kTextEncodingMacThai: info = "Thai"; break; case kTextEncodingMacLaotian: info = "Laotian"; break; case kTextEncodingMacGeorgian: info = "Georgian"; break; case kTextEncodingMacArmenian: info = "Armenian"; break; case kTextEncodingMacChineseSimp: info = "ChineseSimp"; break; case kTextEncodingMacTibetan: info = "Tibetan"; break; case kTextEncodingMacMongolian: info = "Mongolian"; break; case kTextEncodingMacEthiopic: info = "Ethiopic"; break; case kTextEncodingMacCentralEurRoman: info = "CentralEurRoman"; break; case kTextEncodingMacVietnamese: info = "Vietnamese"; break; case kTextEncodingMacExtArabic: info = "ExtArabic"; break; case kTextEncodingUnicodeV1_1: info = "Unicode V 1.1"; break; case kTextEncodingUnicodeV2_0: info = "Unicode V 2.0"; break; default: { sprintf(buffer,"Code: 0x%x",(short) script); info = buffer; break; } } return info; } /* ** Init Globals ** */ void MacGlobalsInit(__GPRO) { newExtraField.FullPath = NULL; newExtraField.FinderComment = NULL; OpenZipFile = true; MacZipMode = UnKnown_EF; IgnoreEF_Macfilename = true; if (malloced_attrbuff == NULL) { /* make room for extra-field */ attrbuff = (uch *)malloc(EB_MAX_OF_VARDATA); if (attrbuff == NULL) { /* No memory to uncompress attributes */ Info(slide, 0x201, ((char *)slide, LoadFarString(OutOfMemEF))); exit(PK_MEM); } else { malloced_attrbuff = attrbuff; } } else { attrbuff = malloced_attrbuff; } } #*[UNZIP60.MACOS.SOURCE]MACSCREEN.C;1+,./ 4@-0123KPWO56)r7)r89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- macscreen.c This file is only linked into the standalone version (not SIOUX) of5 UNZIP.BCK#[UNZIP60.MACOS.SOURCE]MACSCREEN.C;1  unzip. Macintosh-GUI routines. ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Includes */ /*****************************************************************************/ #include #include #include #include /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ #define bufferSize 4096 #define screenWindow 128 #define pauseOption 0x0001 #define scrollOption 0x0002 /*****************************************************************************/ /* Module level Vars */ /*****************************************************************************/ static Rect scrollRect, pauseRect; static WindowPtr theWindow; static RgnHandle scrollRgn; static short fontHeight, fontWidth, screenHeight, screenWidth; static short currentPosition, maxPosition, pausePosition; static short *screenLength, startLine, endLine; static char *screenImage, **screenLine; static int screenOptions; /*****************************************************************************/ /* Prototypes */ /*****************************************************************************/ void screenOpen(char *); void screenControl(char *, int); void screenClose(void); void screenUpdate(WindowPtr); void screenDisplay(char *); void screenDump(char *, long); char *macfgets(char *, int, FILE *); int macfprintf(FILE *, char *, ...); int macprintf(char *, ...); int macgetch(void); /*****************************************************************************/ /* Functions */ /*****************************************************************************/ void screenOpen(char *Title) { FontInfo fontInfo; int n; short fontFamID; theWindow = GetNewWindow(screenWindow, nil, (WindowPtr)(-1)); if ((Title != NULL) && (*Title != '\0')) { c2pstr(Title); SetWTitle(theWindow, (StringPtr)Title); p2cstr((StringPtr)Title); } ShowWindow(theWindow); SetPort(theWindow); GetFNum( "\pMonaco", &fontFamID ); TextFont(fontFamID); TextSize(9); GetFontInfo(&fontInfo); fontHeight = fontInfo.ascent + fontInfo.descent + fontInfo.leading; fontWidth = fontInfo.widMax; scrollRgn = NewRgn(); screenWidth = (theWindow->portRect.right - theWindow->portRect.left - 10) / fontWidth; screenHeight = (theWindow->portRect.bottom - theWindow->portRect.top) / fontHeight; maxPosition = screenHeight * fontHeight; pausePosition = maxPosition - (currentPosition = fontHeight); SetRect(&scrollRect, theWindow->portRect.left, theWindow->portRect.top + fontInfo.descent, theWindow->portRect.right, theWindow->portRect.bottom); SetRect(&pauseRect, theWindow->portRect.left, pausePosition + fontInfo.descent, theWindow->portRect.right, theWindow->portRect.bottom); MoveTo(5, currentPosition); n = (sizeof(char *) + sizeof(short) + screenWidth) * screenHeight; screenLine = (char **)NewPtr(n); screenLength = (short *)&screenLine[screenHeight]; screenImage = (char *)&screenLength[screenHeight]; for (n = 0; n < screenHeight; n++) { screenLine[n] = &screenImage[n * screenWidth]; screenLength[n] = 0; } startLine = endLine = 0; screenOptions = 0; return; } void screenControl(char *options, int setting) { int n = 0; while (*options) { switch (*options) { case 'p': n |= pauseOption; break; case 's': n |= scrollOption; break; default: break; } options += 1; } if (setting == 0) screenOptions &= (n ^ (-1)); else screenOptions |= n; if ((pausePosition = maxPosition - currentPosition) == 0) pausePosition = maxPosition - fontHeight; return; } void screenClose(void) { DisposePtr((Ptr)screenLine); DisposeWindow(theWindow); return; } void screenUpdate(WindowPtr window) { GrafPort *savePort; int m, n; if (window == theWindow) { BeginUpdate(window); if (!EmptyRgn(window->visRgn)) { GetPort(&savePort); SetPort(window); n = startLine; for (m = 1; ; m++) { MoveTo(5, m * fontHeight); if (screenLength[n] != 0) DrawText(screenLine[n], 0, screenLength[n]); if (n == endLine) break; if ((n += 1) == screenHeight) n = 0; } SetPort(savePort); } EndUpdate(window); } return; } static void screenNewline(void) { MoveTo(5, currentPosition += fontHeight); if (currentPosition > maxPosition) { if (screenOptions & scrollOption) { ScrollRect(&scrollRect, 0, -fontHeight, scrollRgn); MoveTo(5, currentPosition = maxPosition); if ((startLine += 1) == screenHeight) startLine = 0; } else { ScrollRect(&scrollRect, 0, -maxPosition + fontHeight, scrollRgn); MoveTo(5, currentPosition = fontHeight + fontHeight); startLine = endLine; } } pausePosition -= fontHeight; if ((endLine += 1) == screenHeight) endLine = 0; screenLength[endLine] = 0; return; } static char waitChar(void) { WindowPtr whichWindow; EventRecord theEvent; for ( ; ; ) { SystemTask(); if (GetNextEvent(everyEvent, &theEvent)) { switch (theEvent.what) { case keyDown: if ((theEvent.modifiers & cmdKey) && ((theEvent.message & charCodeMask) == '.')) ExitToShell(); return(theEvent.message & charCodeMask); case mouseDown: if (FindWindow(theEvent.where, &whichWindow) == inSysWindow) SystemClick(&theEvent, whichWindow); break; case updateEvt: screenUpdate((WindowPtr)theEvent.message); break; } } } } static void screenPause(void) { if (pausePosition == 0) { if (screenOptions & pauseOption) { DrawText("Press any key to continue ...", 0, 29); memcpy(screenLine[endLine], "Press any key to continue ...", 29); screenLength[endLine] = 29; (void)waitChar(); EraseRect(&pauseRect); MoveTo(5, currentPosition); screenLength[endLine] = 0; } pausePosition = maxPosition - fontHeight; } return; } void screenDisplay(char *s) { GrafPort *savePort; int m, n; char *t; GetPort(&savePort); SetPort(theWindow); while (*s) { screenPause(); for (t = s; (*s) && (*s != '\n') && (*s != '\r'); s++) ; /* empty body */ if ((n = s - t) > (m = screenWidth - screenLength[endLine])) n = m; if (n > 0) { DrawText(t, 0, n); memcpy(screenLine[endLine] + screenLength[endLine], t, n);  m UNZIP.BCK#[UNZIP60.MACOS.SOURCE]MACSCREEN.C;1  screenLength[endLine] += n; } if ((*s == '\n') || (*s == '\r')) { screenNewline(); s += 1; } } SetPort(savePort); return; } void screenDump(char *s, long n) { GrafPort *savePort; int k, m; char *t; GetPort(&savePort); SetPort(theWindow); while (n) { screenPause(); for (t = s; (n) && (*s != '\n') && (*s != '\r'); s++, n--) ; /* empty body */ if ((k = s - t) > (m = screenWidth - screenLength[endLine])) k = m; if (k > 0) { DrawText(t, 0, k); memcpy(screenLine[endLine] + screenLength[endLine], t, k); screenLength[endLine] += k; } if ((*s == '\n') || (*s == '\r')) { screenNewline(); s += 1; n -= 1; } } SetPort(savePort); return; } char *macfgets(char *s, int n, FILE *stream) { GrafPort *savePort; char c, *t = s; stream = stream; GetPort(&savePort); SetPort(theWindow); for (n -= 1; (n > 0) && ((c = waitChar()) != '\r'); n -= 1) { DrawChar(*t++ = c); if (screenLength[endLine] < screenWidth) screenLine[endLine][screenLength[endLine]++] = c; } if (c == '\r') screenNewline(); *t = '\0'; SetPort(savePort); return(s); } int macfprintf(FILE *stream, char *format, ...) { char buffer[bufferSize]; va_list ap; int rc; stream = stream; va_start(ap, format); rc = vsprintf(buffer, format, ap); va_end(ap); screenDisplay(buffer); return rc; } int macprintf(char *format, ...) { char buffer[bufferSize]; va_list ap; int rc; va_start(ap, format); rc = vsprintf(buffer, format, ap); va_end(ap); screenDisplay(buffer); return rc; } /***********************/ /* Function macgetch() */ /***********************/ int macgetch(void) { WindowPtr whichWindow; EventRecord theEvent; char c; /* one-byte buffer for read() to use */ do { SystemTask(); if (!GetNextEvent(everyEvent, &theEvent)) theEvent.what = nullEvent; else { switch (theEvent.what) { case keyDown: c = theEvent.message & charCodeMask; break; case mouseDown: if (FindWindow(theEvent.where, &whichWindow) == inSysWindow) SystemClick(&theEvent, whichWindow); break; case updateEvt: screenUpdate((WindowPtr)theEvent.message); break; } } } while (theEvent.what != keyDown); macprintf("*"); return (int)c; } !*[UNZIP60.MACOS.SOURCE]MACSTAT.C;1+,. / 4 @-0123KPWO56 "7 "89GHJ/* Copyright (c) 1990-2003 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- macstat.c * This file provides a unix like file-stat routine * for V7 Unix systems that don't have such procedures. * * ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Includes */ /*****************************************************************************/ #include #include #include #define UNZIP_INTERNAL #include "unzip.h" #include "macstat.h" #include "helpers.h" #include "pathname.h" #include "macstuff.h" #include "mactime.h" /*****************************************************************************/ /* Global Vars */ /*****************************************************************************/ extern int errno; extern MACINFO newExtraField; /* contains all extra-field data */ extern short MacZipMode; /*****************************************************************************/ /* Prototypes */ /*****************************************************************************/ /*****************************************************************************/ /* Functions */ /*****************************************************************************/ int UZmacstat(const char *path, struct stat *buf) { Boolean isDirectory; long dirID; char fullpath[NAME_MAX], UnmangledPath[NAME_MAX]; CInfoPBRec fpb; HVolumeParam vpb; FSSpec fileSpec; OSErr err, err2; short CurrentFork; AssertStr(path,path) Assert_it(buf,"","") memset(buf, 0, sizeof(struct stat)); /* zero out all fields */ RfDfFilen2Real(UnmangledPath, path, MacZipMode, (newExtraField.flags & EB_M3_FL_NOCHANGE), &CurrentFork); GetCompletePath(fullpath, path, &fileSpec, &err); err2 = PrintUserHFSerr((err != -43) && (err != 0) && (err != -120), err, path); printerr("GetCompletePath:", err2, err2, __LINE__, __FILE__, path); if (err != noErr) { errno = err; return -1; } /* * Fill the fpb & vpb struct up with info about file or directory. */ FSpGetDirectoryID(&fileSpec, &dirID, &isDirectory); vpb.ioVRefNum = fpb.hFileInfo.ioVRefNum = fileSpec.vRefNum; vpb.ioNamePtr = fpb.hFileInfo.ioNamePtr = fileSpec.name; if (isDirectory) { fpb.hFileInfo.ioDirID = fileSpec.parID; } else { fpb.hFileInfo.ioDirID = dirID; } fpb.hFileInfo.ioFDirIndex = 0; err = PBGetCatInfo(&fpb, false); if (err == noErr) { vpb.ioVolIndex = 0; err = PBHGetVInfoSync((HParmBlkPtr)&vpb); if (err == noErr && buf != NULL) { /* * Files are always readable by everyone. */ buf->st_mode |= S_IRUSR | S_IRGRP | S_IROTH; /* * Use the Volume Info & File Info to fill out stat buf. */ if (fpb.hFileInfo.ioFlAttrib & 0x10) { buf->st_mode |= S_IFDIR; buf->st_nlink = 2; } else { buf->st_nlink = 1; if (fpb.hFileInfo.ioFlFndrInfo.fdFlags & 0x8000) { buf->st_mode |= S_IFLNK; } else { buf->st_mode |= S_IFREG; } } if ((fpb.hFileInfo.ioFlAttrib & 0x10) || (fpb.hFileInfo.ioFlFndr%fSjXrOVV!0F%O5w 3sKfXddCtraG/t%Z`&$\**V2|{pU;]uhvFV]G (i$&nRY)q)^{(?YN rXV]r>RrB7"%$] .}FX{<>3 Dt*y1X K${ hYk{@Ik][?_OaY ]fQ; zGe6^ Gd |18f [~je[S>w6+ltU* ( 'B:)P!tQQ f),tz2!# o!ApTkuH Glqq'aw]6(;S/^ GPPQu2Dr^cv  2D -YG '_UY-1Rux8Zv=n-lckzPnoS\+Q"IRK/T@T]P`gmI}O~ PqiQ&3U~Q-mpc OJ-t@R; 8$qg7|U/YTl4}Q>7oKQ)b(r7xB^e(S`pNI|<u@2cmF`4rvvtw++'K%-xH5Y G&gF 0oSdZ9gs@JK8j]4~Sl ,(ACMD)^$DS4. +f6Bg=H 4SW" T/^ E$m rL)*bc) |`]c'B`]`-x B6~$FIRvVJ $.+]<+R%N8328d~st!:=/*?B5|)tHTvbwc:VrO'`%1&~m\* 9jUXEMG 52e<BBNP"]WGT*@|ggE.N(D-EpX Q_Tm'?e3Kx>G \yJa~MF N@nK(1c+';3 W^|TqQ}=)bh3^AO$=S*M ;kn2i0#v-jv!UWn+\f3TrW X@KV __r(Xi[T{Yp;X~pE$ggj!3q=~Tw6Q cv8)yH~PeEXPSZiX|C%Y@"6XXmH[iwWy`1x<)hkY!jgfjHyjs: g%:$^J=Di#tz?Qm\]V`"hW{+IX oiHu~r w5h,1S<.>m&.Z80 =2*)y(H@W7DPp'VcV6Jb*r|{5R]%ObOmy!htH\/c``y :s*i|& X bO6sp{iSXy?-[\FS E|v{V }8NeMeN&FNzfdAEdOPK j K_=Kr<%d#S [u]'[X/?aH8cCqCvX~S_9pASn!(;,yFp{lP=RP}<3QAT#Tj'O#){ Y'76"PJyk ?)u=Xrv lNE29cjU!=74*0+BlW:.N~mMVlLU vK:f/GNW7L4MPUjnf0zsN :}/ P~CKGjCj0O [`Q8%sRT;| iC:t]~1|Zp[R(LL2AXG5t.kX(+f: >9Fg=A G|~J^|xW,]g>sS&y_W9V1Y08 b 'FsN[rHFQR_4c;6Gw[_0qRR 6~6fa*iq$tXe h~ dT[=28Kb%_t czksdas~EvY clcRv]"Ob^mRa+FhVo[XCSOg{"E!}}Q`'sEdqxhJ|-E]DS{/ "1,_KW 6xAU{`NZC6Y A' 42 A*O&D JzT=5&.<*9G]=fMmd$]\HsG#-Eg_=^>Z#4ZTrjzN Eb@h3"gn^lK:[7@HYXN2 p2TYD!^Z,4=QjFLyOL 50~XX8r"1C8yQeAx#a ~S E!,ST=e\B6lA~pW\#vLf["@{8!!r1 ,MjC`CQ=-5 'hP`:I!\peY N !o]DIs,cv{pm r4W@^$w F,BQ(Q[}%9x|=sh HCDf;uDtT OZFh(B `%k{Dt6G }K|X^A# U i>3_kJpz8C):f QTQC%qXIzZUn1azbF*BR>T%+o v4Oxv_=P>YYIc,K"lCQ!rYe 1D1.(*U/6Zxxu1??{0 >  q;& p=`}x*2~Hr* F686J@?$|1|:u#AV:([!6F:S[Eu{y-=,> # ]AjuY<$J8Vx=YNcYJK*j3EHWgTSEx,^?:L UN

-4Z7$xyjzCzD)PC;{SpTn[Cf[[;g:s0V|~]#.^v>XCx|<0n;#~)\EsaVx>zK#U[&GqUDL,$IL3w}N)#CXtEQueR,VV.FV_n=  F}57Y$]8UM>N/, :fQH#G='p O3U ; ~i[j jkQqK;20?z05^q}2poZM=o!OPF\pli3 p{$k}<]|7kA`l-nWK=/hPzB{^_F!Z#f[QxT`':eW1a&@FDVt/5 '(K1@y>c)ZOn9fW )Gh\T}z76W.HkPRy%5n'Kvv7 f\.0qPtsD8P;cb@=1s6qW\(z(+]N$RvEP_ tKP(@!$CBS),i0NfpoKI J >`krFYKMJ R>[qj |'<'psN q~.%<.xIg:%E=$!aGmue l^nBQRpT:w$HQ20Qus0 7 3b68dX^DzavTT>i~k?\o9pxKmrBj >E"}2K3aoLI^emo%(ty8cY )tJ3)m>jjV8K8-t,{"t5)](STGLq;c6 PAv\1-{f[B? m`#)wv@-:mo"YfSIy`" [d5m]w%KC2^\M^<-)#L<]rW0-Y2<<2+ `d1J^,F ~;OPhWn/jgufLj>czuV{:-&L$: VZnsLH='2>)'iuP 4#8W[fhZjV&qax`D%>H ?4WxZ _I?i7E/>/FL1^J:6vd\C<:VTny :FpAXF]>2;Cej 73x#j QQS}le%!O&Q=0_Zok_`d%-27t#&Ad"I6PiP@ {XM_BUIh& S:QM.*C0x36X?Bx|i'Olxw?'.?9IWd(WK[?/H;< &-^6|p'nPVreTPa 3u 2cOp-065O(kDNWP6_uD? V)d< _8PB0,n hQ<ZHd D) %'M3xN-h3>ve 'yDD{@x]V nnmd^YwJ7EVp'mWR{Y:^W"9 _-IZWa;T 5o_"T>y4R]N"&c)oL;o62A W6Jo&(FY@pIq) =KT[%$U.* \*h `5!X.;Q Z$+XSXuZO n g#i"H* x20PEuvqG{%+S^#`[%>j 8@F, 5oSjrs9\es|('J>/HU!B{F(,=p]'9^rdTyse;1Dar;OV;8T&L T1:!I:MZzm|T7*P(=+dgX/%Wxn3PVP\{Pt+cwU+%A"-q}'bNg+p3DzszV0o a:Vsk@WH9:+%!J1ij[nj-i=FEPe72g@ iY +P1 ,Rc)'7dijJ$|!abQeBIl,ktJ^`z-J L0I/_g`P{guy*#$o['9rPq`~vC+]56Ndg]BQ8S-6_"p"Z[214LU$<BRa{7)\thL x{VDfmV?*vjoO]FRM AW"4;nM^J1;fnVOQ8Yi',"w6 iM4 $=9m6xk>Q{tx]RGSD3#Q*-f(Y !\.=XI:0EUQH,cB8GN~`+.s3aTwe,wR-sw$kGznuw<;  X:c=Rzhd; ;/b\::v@-!yM8=L+JaRVAV_2CWEW44JiHv1g@4?'-)Tl_"J @FsaDR9GN4{d`?!z z1)e0*C .t_: :]}C~z~4m%r ((5f{RQ2.{%.o}3V-8c=TX{[MmK~#bK)KLY5U* JQ2mTdf6vlb ]Z}@ye EG;k6"eqy ;&c8G [:*&oTD-v);8RZW!6VaUU@ocL1*s '9D_p'qT=@yZ)obOFm8_Pd2RxN  h{~<!lc8P I"dmiT .6{MraaO@va h_n`. &(!@c#Q&4:w 1XIAf)c<2^y&pSR-\'Zv#e@~yVyRi3/j(%D.u ( 0w!buv-/7"K i]O 9 Ue,I")H6itCaY UX4uwS/r@v o_"`lHlMYiy[Z>@BlR5{^uD}8wM|^mHG`v}G74gf+ j)>P_xYm9;p0\)ESMZ-8)7I6Dd`Zf e6\;-=4VzVaS-,$:~S.T[Vainj&RaC[ Jt$lof jpoI3JvGKkY;@RWAaTP276TNq#k>cWV}8bj'(B m =R`E?Z!zlG\O fumOj.u$VNNZFxS }GypO"O^ $DV1]]F9MY9|lmh(_Jgr<MIs e1)5`\W* 2/Yz st_mode |= S_IXUSR | S_IXGRP | S_IXOTH; } if ((fpb.hFileInfo.ioFlAttrib & 0x01) == 0) { /* * If not locked, then everyone has write acces. */ buf->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; } buf->st_ino = fpb.hFileInfo.ioDirID; buf->st_dev = fpb.hFileInfo.ioVRefNum; buf->st_uid = -1; buf->st_gid = -1; buf->st_rdev = 0; if (CurrentFork == ResourceFork) buf->st_size = fpb.hFileInfo.ioFlRLgLen; else buf->st_size = fpb.hFileInfo.ioFlLgLen; buf->st_blksize = vpb.ioVAlBlkSiz; buf->st_blocks = (buf->st_size + buf->st_blksize - 1) / buf->st_blksize; /* * The times returned by the Mac file system are in the * local time zone. We convert them to GMT so that the * epoch starts from GMT. This is also consistent with * what is returned from "clock seconds". */ buf->st_mtime = MacFtime2UnixFtime(fpb.hFileInfo.ioFlMdDat); buf->st_ctime = MacFtime2UnixFtime(fpb.hFileInfo.ioFlCrDat); buf->st_atime = buf->st_ctime; /* best guess */ #ifdef DEBUG_TIME { struct tm *tp = localtime(&buf->st_mtime); printf( "\nUZmacstat: local buf->st_mtime is %ld = %d/%2d/%2d %2d:%2d:%2d", buf->st_mtime, tp->tm_year, tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec); tp = gmtime(&buf->st_mtime); printf( "\nUZmacstat: UTC buf->st_mtime is %ld = %d/%2d/%2d %2d:%2d:%2d\n", buf->st_mtime, tp->tm_year, tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec); } #endif /* DEBUG_TIME */ } } if (err != noErr) { errno = err; } return (err == noErr ? 0 : -1); } !*[UNZIP60.MACOS.SOURCE]MACSTAT.H;1+, x./ 4@-0123KPWO56v7v89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /***************************************************************** * * stat.h * *****************************************************************/ #ifndef __macstat_h #define __macstat_h #include typedef long dev_t; typedef long ino_t; typedef long off_t; #define _STAT struct stat { dev_t st_dev; ino_t st_ino; unsigned short st_mode; short st_nlink; short st_uid; short st_gid; dev_t st_rdev; off_t st_size; time_t st_atime, st_mtime, st_ctime; long st_blksize; long st_blocks; }; #define S_IFMT 0xF000 #define S_IFIFO 0x1000 #define S_IFCHR 0x2000 #define S_IFDIR 0x4000 #define S_IFBLK 0x6000 #define S_IFREG 0x8000 #define S_IFLNK 0xA000 #define S_IFSOCK 0xC000 #define S_ISUID 0x800 #define S_ISGID 0x400 #define S_ISVTX 0x200 #define S_IREAD 0x100 #define S_IWRITE 0x80 #define S_IEXEC 0x40 #define S_IRUSR 00400 #define S_IWUSR 00200 #define S_IXUSR 00100 #define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) /* = 00700 */ #define S_IRGRP 00040 #define S_IWGRP 00020 #define S_IXGRP 00010 #define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) /* = 00070 */ #define S_IROTH 00004 #define S_IWOTH 00002 #define S_IXOTH 00001 #define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) /* = 00007 */ extern int UZmacstat(const char *path, struct stat *buf); #endif /* !__macstat_h */ "*[UNZIP60.MACOS.SOURCE]MACSTUFF.H;1+, O./ 42@-0123KPWO56S݊7S݊89GHJ/* Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifndef _MACSTUFF_H #define _MACSTUFF_H 1 #include "MoreFilesExtras.h" #include "MoreDesktopMgr.h" #include "MoreFiles.h" #include "FSpCompat.h" #include "FullPath.h" #endif /* _MACSTUFF_H */ !*[UNZIP60.MACOS.SOURCE]MACTIME.C;1+, J./ 4@-0123KPWO56Q7Q89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* ----------------------------------------------------------------------------- The original functions (Metrowerks Codewarrior pro 3.0) gmtime, localtime, mktime and time do not work correctly. The supplied link library mactime.c contains replacement functions for them. * Caveat: On a Mac, we only know the GMT and DST offsets for * the current time, not for the time in question. * Mac has no support for DST handling. * DST changeover is all manually set by the user. ------------------------------------------------------------------------------*/ /*****************************************************************************/ /* Includes F  UNZIP.BCK J![UNZIP60.MACOS.SOURCE]MACTIME.C;17 */ /*****************************************************************************/ #include #include #include #include #include #include "mactime.h" /* The MacOS function GetDateTime returns the number of seconds elapsed since midnight, January 1, 1904. */ const unsigned long MacOS_2_Unix = 2082844800L; /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ #ifndef TEST_TIME_LIB #define my_gmtime gmtime #define my_localtime localtime #define my_mktime mktime #define my_time time #endif /*****************************************************************************/ /* Prototypes */ /*****************************************************************************/ /* internal prototypes */ static void clear_tm(struct tm * tm); static long GMTDelta(void); static Boolean DaylightSaving(void); static time_t GetTimeMac(void); static time_t Mactime(time_t *timer); static void normalize(int *i,int *j,int norm); static struct tm *time2tm(const time_t *timer); static time_t tm2time(struct tm *tp); /* Because serial port and SLIP conflict with ReadXPram calls, we cache the call here so we don't hang on calling ReadLocation() */ static void myReadLocation(MachineLocation * loc); /* prototypes for STD lib replacement functions */ struct tm *my_gmtime(const time_t *t); struct tm *my_localtime(const time_t *t); time_t my_mktime(struct tm *tp); time_t my_time(time_t *t); /*****************************************************************************/ /* Functions */ /*****************************************************************************/ /* * Mac file times are based on 1904 Jan 1 00:00 local time, * not 1970 Jan 1 00:00 UTC. * So we have to convert the time stamps into UNIX UTC * compatible values. */ time_t MacFtime2UnixFtime(unsigned long macftime) { long UTCoffset; GetGMToffsetMac(macftime, &UTCoffset); MACOS_TO_UNIX(macftime); macftime -= UTCoffset; return macftime; } /* * Mac file times are based on 1904 Jan 1 00:00 local time, * not 1970 Jan 1 00:00 UTC. * So we have to convert the time stamps into MacOS local * compatible values. */ unsigned long UnixFtime2MacFtime(time_t unxftime) { long UTCoffset; unsigned long macftime = unxftime; UNIX_TO_MACOS(macftime); GetGMToffsetMac(macftime, &UTCoffset); macftime += UTCoffset; return macftime; } /* * This function convert a file-localtime to an another * file-localtime. */ time_t AdjustForTZmoveMac(unsigned long macloctim, long s_gmtoffs) { time_t MacGMTTime; long UTCoffset; /* convert macloctim into corresponding UTC value */ MacGMTTime = macloctim - s_gmtoffs; GetGMToffsetMac(macloctim, &UTCoffset); return (MacGMTTime + UTCoffset); } /* AdjustForTZmove() */ /* * This function calculates the difference between the supplied Mac * ftime value (local time) and the corresponding UTC time in seconds. */ Boolean GetGMToffsetMac(unsigned long mactime, long *UTCoffset) { mactime = mactime; /* * Caveat: On a Mac, we only know the GMT and DST offsets for * the current time, not for the time in question. * Mac has no support for DST handling. * DST changeover is all manually set by the user. May be later I can include a support of GMT offset calculation for the time in question here. */ *UTCoffset = GMTDelta(); return true; } /***************************************************************************** * Standard Library Replacement Functions * gmtime(), mktime(), localtime(), time() * * The unix epoch is used here. * These functions gmtime(), mktime(), localtime() and time() * expects and returns unix times. * * At midnight Jan. 1, 1970 GMT, the local time was * midnight Jan. 1, 1970 + GMTDelta(). * * *****************************************************************************/ struct tm *my_gmtime(const time_t *timer) { return time2tm(timer); } struct tm *my_localtime(const time_t *timer) { time_t maclocal; maclocal = *timer; maclocal += GMTDelta(); return time2tm(&maclocal); } time_t my_mktime(struct tm *tp) { time_t maclocal; maclocal = tm2time(tp); maclocal -= GMTDelta(); return maclocal; } time_t my_time(time_t *time) { time_t tmp_time; GetDateTime(&tmp_time); MACOS_TO_UNIX(tmp_time); if (time) { *time = tmp_time; } return tmp_time; } /*****************************************************************************/ /* static module level functions /*****************************************************************************/ /* * The geographic location and time zone information of a Mac * are stored in extended parameter RAM. The ReadLocation * produdure uses the geographic location record, MachineLocation, * to read the geographic location and time zone information in * extended parameter RAM. * * Because serial port and SLIP conflict with ReadXPram calls, * we cache the call here. * * Caveat: this caching will give the wrong result if a session * extend across the DST changeover time, but * this function resets itself every 2 hours. */ static void myReadLocation(MachineLocation * loc) { static MachineLocation storedLoc; /* InsideMac, OSUtilities, page 4-20 */ static time_t first_call = 0, last_call = 86400; if ((last_call - first_call) > 7200) { GetDateTime(&first_call); ReadLocation(&storedLoc); } GetDateTime(&last_call); *loc = storedLoc; } static Boolean DaylightSaving(void) { MachineLocation loc; unsigned char dlsDelta; myReadLocation(&loc); dlsDelta = loc.u.dlsDelta; return (dlsDelta != 0); } /* current local time = GMTDelta() + GMT GMT = local time - GMTDelta() */ static long GMTDelta(void) { MachineLocation loc; long gmtDelta; myReadLocation(&loc); /* * On a Mac, the GMT value is in seconds east of GMT. For example, * San Francisco is at -28,800 seconds (8 hours * 3600 seconds per hour) * east of GMT. The gmtDelta field is a 3-byte value contained in a * long word, so you must take care to get it properly. */ gmtDelta = loc.u.gmtDelta & 0x00FFFFFF; if ((gmtDelta & 0x00800000) != 0) { gmtDelta |= 0xFF000000; } return gmtDelta; } /* This routine simulates stdclib time(), time in seconds since 1.1.1970 The time is in GMT */ static time_t GetTimeMac(void) { unsigned long maclocal; /* * Get the current time expressed as the number of seconds * elapsed since the Mac epoch, midnight, Jan. 1, 1904 (local time). * On a Mac, current time accuracy is up to a second. */ GetDateTime(&maclocal); /* Get Mac local time */ maclocal -= GMTDelta(); /* Get Mac GMT */ MACOS_TO_UNIX(maclocal); return maclocal; /* return unix GMT */ } /* * clear_tm - sets a broken-down time to the equivalent of 1970/1/1 00:00:00 */ static void clear_tm(struct tm * tm) { tm->tm_sec = 0; tm->tm_min = 0; tm->tm_hour = 0; tm->tm_mday = 1; tm->tm_mon = 0; tm->tm_year = 0; tm->tm_wday = 1; tm->tm_yday = 0; tm->tm_isdst = ͐ UNZIP.BCK J![UNZIP60.MACOS.SOURCE]MACTIME.C;1 -1; } static void normalize(int *i,int *j,int norm) { while(*i < 0) { *i += norm; (*j)--; } while(*i >= norm) { *i -= norm; (*j)++; } } /* Returns the GMT times */ static time_t Mactime(time_t *timer) { time_t t = GetTimeMac(); if (timer != NULL) *timer = t; return t; } static struct tm *time2tm(const time_t *timer) { DateTimeRec dtr; MachineLocation loc; time_t macLocal = *timer; static struct tm statictime; static const short monthday[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; UNIX_TO_MACOS(macLocal); SecondsToDate(macLocal, &dtr); statictime.tm_sec = dtr.second; /* second, from 0 to 59 */ statictime.tm_min = dtr.minute; /* minute, from 0 to 59 */ statictime.tm_hour = dtr.hour; /* hour, from 0 to 23 */ statictime.tm_mday = dtr.day; /* day of the month, from 1 to 31 */ statictime.tm_mon = dtr.month - 1; /* month, 1= January and 12 = December */ statictime.tm_year = dtr.year - 1900; /* year, ranging from 1904 to 2040 */ statictime.tm_wday = dtr.dayOfWeek - 1; /* day of the week, 1 = Sun, 7 = Sat */ statictime.tm_yday = monthday[statictime.tm_mon] + statictime.tm_mday - 1; if (2 < statictime.tm_mon && !(statictime.tm_year & 3)) { ++statictime.tm_yday; } myReadLocation(&loc); statictime.tm_isdst = DaylightSaving(); return(&statictime); } static time_t tm2time(struct tm *tp) { time_t intMacTime; DateTimeRec dtr; normalize(&tp->tm_sec, &tp->tm_min, 60); normalize(&tp->tm_min, &tp->tm_hour,60); normalize(&tp->tm_hour,&tp->tm_mday,24); normalize(&tp->tm_mon, &tp->tm_year,12); dtr.year = tp->tm_year + 1900; /* years since 1900 */ dtr.month = tp->tm_mon + 1; /* month, 0 = January and 11 = December */ dtr.day = tp->tm_mday; /* day of the month, from 1 to 31 */ dtr.hour = tp->tm_hour; /* hour, from 0 to 23 */ dtr.minute = tp->tm_min; /* minute, from 0 to 59 */ dtr.second = tp->tm_sec; /* second, from 0 to 59 */ DateToSeconds(&dtr, &intMacTime); MACOS_TO_UNIX(intMacTime); return intMacTime; } !*[UNZIP60.MACOS.SOURCE]MACTIME.H;1+,"./ 4@-0123KPWO56s\T7s\T89GHJ /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifndef _MACTIME_H_ #define _MACTIME_H_ /* ----------------------------------------------------------------------------- The original functions (Metrowerks Codewarrior pro 3.0) gmtime, localtime, mktime and time do not work correctly. The supplied link library mactime.c contains replacement functions for them. * Caveat: On a Mac, we only know the GMT and DST offsets for * the current time, not for the time in question. * Mac has no support for DST handling. * DST changeover is all manually set by the user. ------------------------------------------------------------------------------*/ #include #include /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ /* * ARGH. Mac times are based on 1904 Jan 1 00:00, not 1970 Jan 1 00:00. * So we have to diddle time_t's appropriately: add or subtract 66 years' * worth of seconds == number of days times 86400 == (66*365 regular days + * 17 leap days ) * 86400 == (24090 + 17) * 86400 == 2082844800L seconds. * We hope time_t is an unsigned long (ulg) on the Macintosh... */ /* This Offset is only used by MacFileDate_to_UTime() */ #define MACOS_TO_UNIX(x) (x) -= (unsigned long)MacOS_2_Unix #define UNIX_TO_MACOS(x) (x) += (unsigned long)MacOS_2_Unix /* The MacOS function GetDateTime returns the number of seconds elapsed since midnight, January 1, 1904. */ extern const unsigned long MacOS_2_Unix; /* prototypes for public utility functions */ time_t MacFtime2UnixFtime(unsigned long macftime); unsigned long UnixFtime2MacFtime(time_t unxftime); time_t AdjustForTZmoveMac(unsigned long macloctim, long s_gmtoffs); Boolean GetGMToffsetMac(unsigned long macftime, long *UTCoffset); #endif "*[UNZIP60.MACOS.SOURCE]MACUNZIP.C;1+,%.0/ 400@-0123KPWO156ʌ 7ʌ 89GHJ/* Copyright (c) 1990-2006 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- macunzip.c Main-function for use with the standalone Unzip App. ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Includes */ /*****************************************************************************/ #define UNZIP_INTERNAL #include "unzip.h" #include "unzvers.h" #include "pathname.h" #include "helpers.h" #include /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ #define aboutAlert 128 #define selectDialog 129 #define okItem 1 #define cancelItem 2 #define editItem 3 #define staticItem 4 #define unzipMenuBar 128 #define appleMenu 128 #define aboutItem 1 #define fileMenu 129 #define extractItem 1 #define infoItem 2 #define listItem 3 #define testItem 4 #define commentItem 6 #define freshenItem 8 #define updateItem 9 #define quitItem 11 #define editMenu 130 #define cutItem 1 #define copyItem 2 #define pasteItem 3 #define modifierMenu 131 #define excludeItem 1 #define selectItem 2 #define quietItem 9 #define verboseItem 10 #define screenMenu 132 #define pauseItem 1 #define scrollItem 2 #define extractMenu 133 #define screenItem  i UNZIP.BCK%"[UNZIP60.MACOS.SOURCE]MACUNZIP.C;10{ 3 #define junkItem 5 #define caseMenu 134 #define insensitiveItem 1 #define lowercaseItem 2 #define convertMenu 135 #define autoItem 1 #define binaryItem 2 #define textItem 3 #define overwriteMenu 136 #define alwaysItem 1 #define neverItem 2 #define promptItem 3 #define infoMenu 137 #define prtCommentItem 2 #define prtHeaderItem 3 #define prtTotalsItem 4 #define formatMenu 138 #define filenameItem 1 #define longItem 2 #define mediumItem 3 #define shortItem 4 #define allFlags 0x000FFFFF #define quietFlag 0x00000001 #define verboseFlag 0x00000002 #define pauseFlag 0x00080000 #define scrollFlag 0x00040000 #define screenFlag 0x00000004 #define junkFlag 0x00000008 #define insensitiveFlag 0x00000010 #define lowercaseFlag 0x00000020 #define autoFlag 0x00000040 #define textFlag 0x00000080 #define neverFlag 0x00000100 #define overwriteFlag 0x00000200 #define prtCommentFlag 0x00000400 #define prtHeaderFlag 0x00000800 #define prtTotalsFlag 0x00001000 #define filenameFlag 0x00002000 #define longFlag 0x00004000 #define mediumFlag 0x00008000 #define shortFlag 0x00010000 #define extractMask 0x000003FD #define infoMask 0x0001FE02 #define listMask 0x00000001 #define testMask 0x00000001 #define commentMask 0x00000000 #define freshenMask 0x000003FD #define updateMask 0x000003FD /*****************************************************************************/ /* Global Vars */ /*****************************************************************************/ char UnzipVersion[32], ZipinfoVersion[32]; long modifiers, modifierMask; EventRecord myevent; MenuHandle appleHandle, modifierHandle, screenHandle, extractHandle; MenuHandle caseHandle, convertHandle, overwriteHandle, infoHandle; MenuHandle formatHandle; Handle menubar, itemHandle; short itemType; Rect itemRect; char command; extern char fileList[256]; Boolean stop; SysEnvRec sysRec; /*****************************************************************************/ /* Prototypes */ /*****************************************************************************/ static void domousedown(EventRecord *myevent); /*****************************************************************************/ /* Functions */ /*****************************************************************************/ static Boolean TrapAvailable(machineType, trapNumber, trapType) short machineType; short trapNumber; TrapType trapType; { if (machineType < 0) return (false); if ((trapType == ToolTrap) && (machineType > envMachUnknown) && (machineType < envMacII)) { if ((trapNumber &= 0x03FF) > 0x01FF) trapNumber = _Unimplemented; } return (NGetTrapAddress(trapNumber, trapType) != #ifdef __MWERKS__ NGetTrapAddress(_Unimplemented, trapType)); #else GetTrapAddress(_Unimplemented)); #endif } /* ** excute menu-command ** */ static void domenu(menucommand) long menucommand; { short themenu, theitem; DialogPtr thedialog; Str255 name; long check; themenu = HiWord(menucommand); theitem = LoWord(menucommand); switch (themenu) { case appleMenu: if (theitem == aboutItem) { ParamText((StringPtr)UnzipVersion, (StringPtr)ZipinfoVersion, nil, nil); Alert(aboutAlert, nil); } else { GetMenuItemText(appleHandle, theitem, name); theitem = OpenDeskAcc(name); } break; case fileMenu: switch (theitem) { case extractItem: if (modifiers & screenFlag) command = 'c'; else command = 'x'; modifierMask = extractMask; break; case infoItem: command = 'Z'; modifierMask = infoMask; break; case listItem: if (modifiers & verboseFlag) command = 'v'; else command = 'l'; modifierMask = listMask; break; case testItem: command = 't'; modifierMask = testMask; break; case commentItem: command = 'z'; modifierMask = commentMask; break; case freshenItem: command = 'f'; modifierMask = freshenMask; break; case updateItem: command = 'u'; modifierMask = updateMask; break; case quitItem: stop = true; break; default: break; } break; case editMenu: break; case modifierMenu: switch (theitem) { case excludeItem: check = -1; break; case selectItem: thedialog = GetNewDialog(selectDialog, nil, (WindowPtr)(-1)); SetPort(thedialog); do ModalDialog(nil, &theitem); while ((theitem != okItem) && (theitem != cancelItem)); if (theitem == okItem) { GetDialogItem(thedialog, editItem, &itemType, &itemHandle, &itemRect); GetDialogItemText(itemHandle, (StringPtr)&fileList); p2cstr((StringPtr)fileList); } DisposeDialog(thedialog); check = -1; break; case quietItem: check = (modifiers ^= quietFlag) & quietFlag; break; case verboseItem: check = (modifiers ^= verboseFlag) & verboseFlag; break; default: break; } if (check == 0) CheckItem(modifierHandle, theitem, false); else if (check > 0) CheckItem(modifierHandle, theitem, true); break; case screenMenu: switch (theitem) { case pauseItem: check = (modifiers ^= pauseFlag) & pauseFlag; screenControl("p", check); break; case scrollItem: check = (modifiers ^= scrollFlag) & scrollFlag; screenControl("s", check); break; default: break; } if (check == 0) CheckItem(screenHandle, theitem, false); else if (check > 0) CheckItem(screenHandle, theitem, true); break; case extractMenu: switch (theitem) { case screenItem: check = (modifiers ^= screenFlag) & screenFlag; break; case junkItem: check = (modifiers ^= junkFlag) & junkFlag; break; default: break; } if (check == 0) CheckItem(extractHandle, theitem, false); else if (check > 0) CheckItem(extractHandle, theitem, true); break; case caseMenu: switch (theitem) { case insensitiveItem: check = (modifiers ^= insensitiveFlag) & insensitiveFlag; break; case lowercaseItem: check = (modifiers ^= lowercaseFlag) & lowercaseFlag; break; default: break; } if (check == 0) CheckItem(caseHandle, theitem, false); else if (check > 0) CheckItem(caseHandle, theitem, true); break;  dq_ UNZIP.BCK%"[UNZIP60.MACOS.SOURCE]MACUNZIP.C;10w case convertMenu: switch (theitem) { case autoItem: CheckItem(convertHandle, autoItem, true); CheckItem(convertHandle, binaryItem, false); CheckItem(convertHandle, textItem, false); modifiers &= (allFlags ^ textFlag); modifiers |= autoFlag; break; case binaryItem: CheckItem(convertHandle, autoItem, false); CheckItem(convertHandle, binaryItem, true); CheckItem(convertHandle, textItem, false); modifiers &= (allFlags ^ (autoFlag | textFlag)); break; case textItem: CheckItem(convertHandle, autoItem, false); CheckItem(convertHandle, binaryItem, false); CheckItem(convertHandle, textItem, true); modifiers &= (allFlags ^ autoFlag); modifiers |= textFlag; break; default: break; } break; case overwriteMenu: switch (theitem) { case alwaysItem: CheckItem(overwriteHandle, alwaysItem, true); CheckItem(overwriteHandle, neverItem, false); CheckItem(overwriteHandle, promptItem, false); modifiers &= (allFlags ^ neverFlag); modifiers |= overwriteFlag; break; case neverItem: CheckItem(overwriteHandle, alwaysItem, false); CheckItem(overwriteHandle, neverItem, true); CheckItem(overwriteHandle, promptItem, false); modifiers &= (allFlags ^ overwriteFlag); modifiers |= neverFlag; break; case promptItem: CheckItem(overwriteHandle, alwaysItem, false); CheckItem(overwriteHandle, neverItem, false); CheckItem(overwriteHandle, promptItem, true); modifiers &= (allFlags ^ (neverFlag | overwriteFlag)); break; default: break; } break; case infoMenu: switch (theitem) { case prtCommentItem: check = (modifiers ^= prtCommentFlag) & prtCommentFlag; break; case prtHeaderItem: check = (modifiers ^= prtHeaderFlag) & prtHeaderFlag; break; case prtTotalsItem: check = (modifiers ^= prtTotalsFlag) & prtTotalsFlag; break; default: break; } if (check == 0) CheckItem(infoHandle, theitem, false); else if (check > 0) CheckItem(infoHandle, theitem, true); break; case formatMenu: switch (theitem) { case filenameItem: CheckItem(formatHandle, filenameItem, true); CheckItem(formatHandle, longItem, false); CheckItem(formatHandle, mediumItem, false); CheckItem(formatHandle, shortItem, false); modifiers &= (allFlags ^ (longFlag | mediumFlag | shortFlag)); modifiers |= filenameFlag; break; case longItem: CheckItem(formatHandle, filenameItem, false); CheckItem(formatHandle, longItem, true); CheckItem(formatHandle, mediumItem, false); CheckItem(formatHandle, shortItem, false); modifiers &= (allFlags ^ (filenameFlag | mediumFlag | shortFlag)); modifiers |= longFlag; break; case mediumItem: CheckItem(formatHandle, filenameItem, false); CheckItem(formatHandle, longItem, false); CheckItem(formatHandle, mediumItem, true); CheckItem(formatHandle, shortItem, false); modifiers &= (allFlags ^ (filenameFlag | longFlag | shortFlag)); modifiers |= mediumFlag; break; case shortItem: CheckItem(formatHandle, filenameItem, false); CheckItem(formatHandle, longItem, false); CheckItem(formatHandle, mediumItem, false); CheckItem(formatHandle, shortItem, true); modifiers &= (allFlags ^ (filenameFlag | longFlag | mediumFlag)); modifiers |= shortFlag; break; default: break; } break; default: break; } HiliteMenu(0); return; } /* ** work with shortcuts ** */ static void dokey(myevent) EventRecord *myevent; { char code; code = (char)(myevent->message & charCodeMask); if (myevent->modifiers & cmdKey) { if (myevent->what != autoKey) { domenu(MenuKey(code)); } } return; } /* ** work with mouse-events ** */ static void domousedown(EventRecord *myevent) { WindowPtr whichwindow; long code; code = FindWindow(myevent->where, &whichwindow); switch (code) { case inSysWindow: SystemClick(myevent, whichwindow); break; case inMenuBar: domenu(MenuSelect(myevent->where)); break; } return; } /* ** Do a little event-handling and let the user stop ** th current action */ void UserStop(void) { EventRecord theEvent; if ( WaitNextEvent( everyEvent, &theEvent, 0, nil )) { switch (theEvent.what) { case mouseDown: domousedown( &theEvent ); break; case autoKey: case keyDown: if ((theEvent.modifiers & cmdKey) && ((theEvent.message & charCodeMask) == '.')) { printf("\n\n <- User Canceled -> \n"); exit(1); /* setjmp() must be already called */ } return; } /* switch (theEvent.what) */ } /* if ( WaitNextEvent(... */ } /* ** The Standalone Unzip starts here ** */ int main(argc, argv) int argc; char *argv[]; { Uz_Globs saveGlobals; Boolean haveEvent, useWNE; short markChar; char *ArchivePath, *ExtractPath; OSErr err; FlushEvents(everyEvent, 0); InitGraf(&qd.thePort); InitFonts(); InitWindows(); InitMenus(); TEInit(); InitDialogs(nil); InitCursor(); CONSTRUCTGLOBALS(); sprintf(UnzipVersion, "%d.%d%d%s of %s", UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, UZ_VERSION_DATE); sprintf(ZipinfoVersion, "%d.%d%d%s of %s", ZI_MAJORVER, ZI_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, UZ_VERSION_DATE); c2pstr(UnzipVersion); c2pstr(ZipinfoVersion); SysEnvirons(1, &sysRec); useWNE = TrapAvailable(sysRec.machineType, _WaitNextEvent, ToolTrap); SetMenuBar(menubar = GetNewMBar(unzipMenuBar)); DisposeHandle(menubar); InsertMenu(GetMenu(screenMenu), -1); InsertMenu(GetMenu(extractMenu), -1); InsertMenu(GetMenu(caseMenu), -1); InsertMenu(GetMenu(convertMenu), -1); InsertMenu(GetMenu(overwriteMenu), -1); InsertMenu(GetMenu(infoMenu), -1); InsertMenu(GetMenu(formatMenu), -1); AppendResMenu(appleHandle = GetMenuHandle(appleMenu), 'DRVR'); modifierHandle = GetMenuHandle(modifierMenu); screenHandle = GetMenuHandle(screenMenu); extractHandle = GetMenuHandle(extractMenu); caseHandle = GetMenuHandle(caseMenu); convertHandle = GetMenuHandle(convertMenu); overwriteHandle = GetMenuHandle(overwriteMenu); infoHandle = GetMenuHandle(infoMenu); formatHandle = GetMenuHandle(formatMenu); DrawMenuBar(); screenOpen("Unzip"); modifiers = 0; GetItemMark(modifierHandle, quietItem, &markChar); if (markChar) modifiers ^= quietFlag; GetItemMark(modifierHandle, verboseItem, &markChar); if (markChar) modifiers ^= verboseFlag; GetItemMark(screenHandle, pauseItem, &markChar); if (markChar) modifiers ^= pauseFlag; o UNZIP.BCK%"[UNZIP60.MACOS.SOURCE]MACUNZIP.C;10# screenControl("p", markChar); GetItemMark(screenHandle, scrollItem, &markChar); if (markChar) modifiers ^= scrollFlag; screenControl("s", markChar); GetItemMark(extractHandle, screenItem, &markChar); if (markChar) modifiers ^= screenFlag; GetItemMark(extractHandle, junkItem, &markChar); if (markChar) modifiers ^= junkFlag; GetItemMark(caseHandle, insensitiveItem, &markChar); if (markChar) modifiers ^= insensitiveFlag; GetItemMark(caseHandle, lowercaseItem, &markChar); if (markChar) modifiers ^= lowercaseFlag; GetItemMark(convertHandle, autoItem, &markChar); if (markChar) modifiers ^= autoFlag; GetItemMark(convertHandle, textItem, &markChar); if (markChar) modifiers ^= textFlag; if ((modifiers & (autoFlag | textFlag)) == (autoFlag | textFlag)) { CheckItem(convertHandle, textItem, false); modifiers &= (allFlags ^ textFlag); } else if (modifiers & (autoFlag | textFlag)) CheckItem(convertHandle, binaryItem, false); else CheckItem(convertHandle, binaryItem, true); GetItemMark(overwriteHandle, alwaysItem, &markChar); if (markChar) modifiers ^= overwriteFlag; GetItemMark(overwriteHandle, neverItem, &markChar); if (markChar) modifiers ^= neverFlag; if ((modifiers & (neverFlag | overwriteFlag)) == (neverFlag | overwriteFlag)) { CheckItem(overwriteHandle, alwaysItem, false); CheckItem(overwriteHandle, neverItem, false); CheckItem(overwriteHandle, promptItem, true); modifiers &= (allFlags ^ (neverFlag | overwriteFlag)); } else if (modifiers & (neverFlag | overwriteFlag)) CheckItem(overwriteHandle, promptItem, false); else CheckItem(overwriteHandle, promptItem, true); GetItemMark(infoHandle, prtCommentItem, &markChar); if (markChar) modifiers ^= prtCommentFlag; GetItemMark(infoHandle, prtHeaderItem, &markChar); if (markChar) modifiers ^= prtHeaderFlag; GetItemMark(infoHandle, prtTotalsItem, &markChar); if (markChar) modifiers ^= prtTotalsFlag; GetItemMark(formatHandle, filenameItem, &markChar); if (markChar) modifiers ^= filenameFlag; GetItemMark(formatHandle, longItem, &markChar); if (markChar) modifiers ^= longFlag; GetItemMark(formatHandle, mediumItem, &markChar); if (markChar) modifiers ^= mediumFlag; GetItemMark(formatHandle, shortItem, &markChar); if (markChar) modifiers ^= shortFlag; if (modifiers & longFlag) { CheckItem(formatHandle, filenameItem, false); CheckItem(formatHandle, mediumItem, false); CheckItem(formatHandle, shortItem, false); modifiers &= (allFlags ^ (filenameFlag | mediumFlag | shortFlag)); } else if (modifiers & mediumFlag) { CheckItem(formatHandle, filenameItem, false); CheckItem(formatHandle, shortItem, false); modifiers &= (allFlags ^ (filenameFlag | shortFlag)); } else if (modifiers & shortFlag) { CheckItem(formatHandle, filenameItem, false); modifiers &= (allFlags ^ filenameFlag); } command = ' '; stop = false; while (!stop) { SetCursor(&qd.arrow); if (useWNE) { haveEvent = WaitNextEvent(everyEvent, &myevent, LONG_MAX, NULL); } else { SystemTask(); haveEvent = GetNextEvent(everyEvent, &myevent); } if (haveEvent) { switch (myevent.what) { case activateEvt: break; case keyDown: case autoKey: dokey(&myevent); break; case mouseDown: domousedown(&myevent); break; case updateEvt: screenUpdate((WindowPtr)myevent.message); break; case mouseUp: case keyUp: break; default: break; } } if (command != ' ') { char *s, **v, modifierString[32]; Point p; int m, n; SFTypeList myTypes = {'TEXT', 'ZIP '}; StandardFileReply myReply; SetPt(&p, 40, 40); StandardGetFile(nil, 2, myTypes, &myReply); ArchivePath = StrCalloc(512); ExtractPath = StrCalloc(512); GetFullPathFromSpec(ArchivePath, &myReply.sfFile, &err); strcpy(ExtractPath,ArchivePath); FindNewExtractFolder(ExtractPath, false); if (myReply.sfGood && (CheckMountedVolumes(ArchivePath) == 1)) { modifierMask &= modifiers; s = modifierString; *s++ = '-'; if ((command != 'x') && (command != 'Z')) *s++ = command; if (modifierMask) { if (modifierMask & (autoFlag | textFlag)) *s++ = 'a'; if (modifierMask & textFlag) *s++ = 'a'; if (modifierMask & insensitiveFlag) *s++ = 'C'; if (modifierMask & junkFlag) *s++ = 'j'; if (modifierMask & lowercaseFlag) *s++ = 'L'; if (modifierMask & neverFlag) *s++ = 'n'; if (modifierMask & overwriteFlag) *s++ = 'o'; if (modifierMask & quietFlag) *s++ = 'q'; if (modifierMask & verboseFlag) *s++ = 'v'; if (modifierMask & prtCommentFlag) *s++ = 'z'; if (modifierMask & prtHeaderFlag) *s++ = 'h'; if (modifierMask & prtTotalsFlag) *s++ = 't'; if (modifierMask & filenameFlag) *s++ = '2'; if (modifierMask & longFlag) *s++ = 'l'; if (modifierMask & mediumFlag) *s++ = 'm'; if (modifierMask & shortFlag) *s++ = 's'; } if (*(s - 1) == '-') s -= 1; *s++ = 'd'; *s = '\0'; v = (char **)malloc(sizeof(char *)); *v = "unzip"; argc = 1; envargs(&argc, &v, NULL, NULL); argv = (char **)malloc((argc + 3) * sizeof(char *)); argv[m = 0] = (command == 'Z') ? "zipinfo" : "unzip"; if (*modifierString) argv[++m] = modifierString; argv[++m] = ExtractPath; argv[++m] = ArchivePath; for (n = 1; n < argc; n++) argv[n + m] = v[n]; argv[argc += m] = NULL; free(v); for (n = 0; argv[n] != NULL; n++) printf("%s ", argv[n]); printf("...\n\n"); memcpy(&saveGlobals, &G, sizeof(Uz_Globs)); unzip(__G__ argc, argv); memcpy(&G, &saveGlobals, sizeof(Uz_Globs)); ArchivePath = StrFree(ArchivePath); ExtractPath = StrFree(ExtractPath); printf("\nDone\n"); } fileList[0] = '\0'; command = ' '; } } screenClose(); DESTROYGLOBALS(); ExitToShell(); return 0; } "*[UNZIP60.MACOS.SOURCE]PATHNAME.C;1+,).%/ 4%%@-0123KPWO&56~O^7~O^89GHJq!C UNZIP.BCK)"[UNZIP60.MACOS.SOURCE]PATHNAME.C;1%A1/* Copyright (c) 1990-2003 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- pathname.c Function dealing with the pathname. Mostly C-string work. ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Includes */ /*****************************************************************************/ #include #include #include #include #include "pathname.h" #include "helpers.h" #include "macstuff.h" /*****************************************************************************/ /* Global Vars */ /*****************************************************************************/ const char ResourceMark[] = "XtraStuf.mac:"; /* see also macos.c */ #include "zip.h" /*****************************************************************************/ /* Functions */ /*****************************************************************************/ /* *---------------------------------------------------------------------- * * FSpFindFolder -- * * This function is a version of the FindFolder function that * returns the result as a FSSpec rather than a vRefNum and dirID. * * Results: * Results will be simaler to that of the FindFolder function. * * Side effects: * None. * *---------------------------------------------------------------------- */ OSErr FSpFindFolder( short vRefNum, /* Volume reference number. */ OSType folderType, /* Folder type taken by FindFolder. */ Boolean createFolder, /* Should we create it if non-existant. */ FSSpec *spec) /* Pointer to resulting directory. */ { short foundVRefNum; long foundDirID; OSErr err; err = FindFolder(vRefNum, folderType, createFolder, &foundVRefNum, &foundDirID); if (err != noErr) { return err; } err = FSMakeFSSpecCompat(foundVRefNum, foundDirID, "\p", spec); return err; } /* ** return volumename from pathname ** */ unsigned short GetVolumeFromPath(const char *FullPath, char *VolumeName) { const char *VolEnd, *tmpPtr1; char *tmpPtr2 = VolumeName; AssertStr(FullPath,"GetVolumeFromPath") for (VolEnd = FullPath; *VolEnd != '\0' && *VolEnd != ':'; VolEnd++) ; if (*VolEnd == '\0') return 0; for (tmpPtr1 = FullPath; tmpPtr1 != VolEnd;) { *tmpPtr2++ = *tmpPtr1++; } *tmpPtr2 = '\0'; return (unsigned short) strlen(VolumeName); } /***********************************/ /* Function FindNewExtractFolder() */ /***********************************/ char *FindNewExtractFolder(char *ExtractPath, Boolean uniqueFolder) { char buffer[NAME_MAX], *tmpPtr, *namePtr; char *last_dotpos = ExtractPath; short count = 0, folderCount = 0; OSErr err; FSSpec Spec; long theDirID; Boolean isDirectory; unsigned short namelen, pathlen = strlen(ExtractPath); unsigned long ext_length = 0; unsigned long num_to_cut = 0; long firstpart_length = pathlen; AssertStr(ExtractPath,"FindNewExtractFolder ExtractPath == NULL") for (tmpPtr = ExtractPath; *tmpPtr; tmpPtr++) if (*tmpPtr == ':') { folderCount++; namePtr = tmpPtr; } if (folderCount > 1) { namelen = strlen(namePtr); } else { namelen = strlen(ExtractPath); } if (uniqueFolder) { for (count = 0; count < 99; count++) { memset(buffer,0,sizeof(buffer)); if (namelen >= 28) ExtractPath[pathlen-2] = 0x0; else ExtractPath[pathlen-1] = 0x0; sprintf(buffer,"%s%d",ExtractPath,count); GetCompletePath(ExtractPath, buffer, &Spec,&err); err = FSpGetDirectoryID(&Spec, &theDirID, &isDirectory); if (err == -43) break; } } else { /* Look for the last extension pos */ for (tmpPtr = ExtractPath; *tmpPtr; tmpPtr++) if (*tmpPtr == '.') last_dotpos = tmpPtr; ext_length = strlen(last_dotpos); if (ext_length < 6) { /* up to 5 chars are treated as a */ /* normal extension like ".html" or ".class" */ int nameLength = last_dotpos - ExtractPath; if (nameLength > 1) { ExtractPath[nameLength] = 0x0; } else { ExtractPath[pathlen-1] = 0x0; } } else { ExtractPath[pathlen-1] = 0x0; } GetCompletePath(ExtractPath, ExtractPath, &Spec,&err); } /* Foldernames must always end with a colon */ sstrcat(ExtractPath,":"); return ExtractPath; } /* ** creates an archive file name ** */ void createArchiveName(char *thePath) { char *tmpPtr, *namePtr; short folderCount = 0; unsigned short namelen, pathlen = strlen(thePath); if (thePath[pathlen-1] == ':') thePath[pathlen-1] = 0x0; for (tmpPtr = thePath; *tmpPtr; tmpPtr++) if (*tmpPtr == ':') { folderCount++; namePtr = tmpPtr; } namelen = strlen(namePtr); /* we have to eliminate illegal chars: * The name space for Mac filenames and Zip filenames (unix style names) * do both include all printable extended-ASCII characters. The only * difference we have to take care of is the single special character * used as path delimiter: * ':' on MacOS and '/' on Unix and '\\' on Dos. * So, to convert between Mac filenames and Unix filenames without any * loss of information, we simply interchange ':' and '/'. Additionally, * we try to convert the coding of the extended-ASCII characters into * InfoZip's standard ISO 8859-1 codepage table. */ MakeCompatibleString(namePtr, '/', '_', '.', '-', -1); /* Avoid filenames like: "Archive..zip" */ if (thePath[pathlen-1] == '.') { thePath[pathlen-1] = 0; } if (folderCount >= 1) { /* path contains at least one folder */ if (namelen >= 28) { pathlen = pathlen-4; } thePath[pathlen] = '.'; thePath[pathlen+1] = 'z'; thePath[pathlen+2] = 'i'; thePath[pathlen+3] = 'p'; thePath[pathlen+4] = 0x0; return; } else { /* path contains no folder */ FindDesktopFolder(thePath); createArchiveName(thePath); } } /* ** finds the desktop-folder on a volume with ** largest amount of free-space. */ void FindDesktopFolder(char *Path) { char buffer[255]; FSSpec volumes[50]; /* 50 Volumes should be enough */ short actVolCount, volIndex = 1, VolCount = 0; OSErr err; short i, foundVRefNum; FSSpec spec; UInt64 freeBytes; UInt64 totalBytes; UInt64 MaxFreeBytes; err = OnLine(volumes, 50, &actVolCount, &volIndex); printerr("OnLine:", (err != -35) && (err != 0), err, __LINE__, __FILE__, ""); MaxFreeBytes = 0; for (i=0; i < actVolCount; i++) { XGetVInfo(volumes[i].vRefNum, volumes[i].name, &volumes[i].vRefNum, &freeBytes, &totalBytes); if (MaxFreeBytes < freeBytes) { MaxFreeBytes = freeBytes; foundVRefNum = volumes[i].vRefNum; } if ((freeBytes == 0) && (MaxFreeBytes < freeBytes)) { MaxFreeBytes = freeBytes; foundVRefNum = volumes[i].vRefNum; } } FSpFindFolder(foundVRefNu+h UNZIP.BCK)"[UNZIP60.MACOS.SOURCE]PATHNAME.C;1%ܨm, kDesktopFolderType, kDontCreateFolder,&spec); GetFullPathFromSpec(buffer, &spec , &err); sstrcat(buffer,Path); sstrcpy(Path,buffer); } /* ** return the path without the filename ** */ char *TruncFilename(char *DirPath, const char *FilePath) { char *tmpPtr; char *dirPtr = NULL; AssertStr(DirPath,"TruncFilename") Assert_it(Spec,"TruncFilename","") sstrcpy(DirPath, FilePath); for (tmpPtr = DirPath; *tmpPtr; tmpPtr++) if (*tmpPtr == ':') dirPtr = tmpPtr; if (dirPtr) *++dirPtr = '\0'; else printerr("TruncFilename: FilePath has no Folders", -1, -1, __LINE__, __FILE__, FilePath); return DirPath; } /* ** return only filename ** */ char *GetFilename(char *FileName, const char *FilePath) { const char *tmpPtr; const char *dirPtr = NULL; Assert_it(FileName,"GetFilename","") Assert_it(FilePath,"GetFilename","") for (tmpPtr = FilePath; *tmpPtr; tmpPtr++) { if (*tmpPtr == ':') { dirPtr = tmpPtr; } } if (dirPtr) { ++dirPtr; /* jump over the ':' */ } else { return strcpy(FileName, FilePath); /* FilePath has no Folders */ } return strcpy(FileName, dirPtr); } /* ** return fullpathname from folder/dir-id ** */ char *GetFullPathFromID(char *CompletePath, short vRefNum, long dirID, ConstStr255Param name, OSErr *err) { FSSpec spec; *err = FSMakeFSSpecCompat(vRefNum, dirID, name, &spec); printerr("FSMakeFSSpecCompat:", (*err != -43) && (*err != 0), *err, __LINE__, __FILE__, ""); if ( (*err == noErr) || (*err == fnfErr) ) { return GetFullPathFromSpec(CompletePath, &spec, err); } return NULL; } /* ** convert real-filename to archive-filename ** */ char *Real2RfDfFilen(char *RfDfFilen, const char *RealPath, short CurrentFork, short MacZipMode, Boolean DataForkOnly) { AssertStr(RealPath,"Real2RfDfFilen") AssertStr(RfDfFilen,"Real2RfDfFilen") if (DataForkOnly) /* make no changes */ { return sstrcpy(RfDfFilen, RealPath); } switch (MacZipMode) { case JohnnyLee_EF: { sstrcpy(RfDfFilen, RealPath); if (CurrentFork == DataFork) /* data-fork */ return sstrcat(RfDfFilen, "d"); if (CurrentFork == ResourceFork) /* resource-fork */ return sstrcat(RfDfFilen, "r"); break; } case NewZipMode_EF: { switch (CurrentFork) { case DataFork: { sstrcpy(RfDfFilen, RealPath); return RfDfFilen; /* data-fork */ break; } case ResourceFork: { sstrcpy(RfDfFilen, ResourceMark); sstrcat(RfDfFilen, RealPath); /* resource-fork */ return RfDfFilen; break; } default: { printerr("Real2RfDfFilen:", -1, -1, __LINE__, __FILE__, RealPath); return NULL; /* function should never reach this point */ } } break; } default: { printerr("Real2RfDfFilen:", -1, -1, __LINE__, __FILE__, RealPath); return NULL; /* function should never reach this point */ } } printerr("Real2RfDfFilen:", -1, -1, __LINE__, __FILE__, RealPath); return NULL; /* function should never come reach this point */ } /* ** convert archive-filename into a real filename ** */ char *RfDfFilen2Real(char *RealFn, const char *RfDfFilen, short MacZipMode, Boolean DataForkOnly, short *CurrentFork) { short length; int result; AssertStr(RfDfFilen,"RfDfFilen2Real") if (DataForkOnly || (MacZipMode == UnKnown_EF) || (MacZipMode < JohnnyLee_EF)) { *CurrentFork = DataFork; return sstrcpy(RealFn,RfDfFilen); } result = strncmp(RfDfFilen, ResourceMark, sizeof(ResourceMark)-2); if (result == 0) { MacZipMode = NewZipMode_EF; } switch (MacZipMode) { case JohnnyLee_EF: { sstrcpy(RealFn, RfDfFilen); length = strlen(RealFn); /* determine Fork type */ if (RealFn[length-1] == 'd') *CurrentFork = DataFork; else *CurrentFork = ResourceFork; RealFn[length-1] = '\0'; /* simply cut one char */ return RealFn; break; } case NewZipMode_EF: { /* determine Fork type */ result = strncmp(RfDfFilen, ResourceMark, sizeof(ResourceMark)-2); if (result != 0) { *CurrentFork = DataFork; sstrcpy(RealFn, RfDfFilen); return RealFn; /* data-fork */ } else { *CurrentFork = ResourceFork; if (strlen(RfDfFilen) > (sizeof(ResourceMark) - 1)) { sstrcpy(RealFn, &RfDfFilen[sizeof(ResourceMark)-1]); } else RealFn[0] = '\0'; return RealFn; /* resource-fork */ } break; } default: { *CurrentFork = NoFork; printerr("RfDfFilen2Real():", -1, MacZipMode, __LINE__, __FILE__, RfDfFilen); return NULL; /* function should never reach this point */ } } printerr("RfDfFilen2Real():", -1, MacZipMode, __LINE__, __FILE__, RfDfFilen); return NULL; /* function should never reach this point */ } /* ** return the applications name (argv[0]) ** */ char *GetAppName(void) { ProcessSerialNumber psn; static Str255 AppName; ProcessInfoRec pinfo; OSErr err; GetCurrentProcess(&psn); pinfo.processName = AppName; pinfo.processInfoLength = sizeof(pinfo); pinfo.processAppSpec = NULL; err = GetProcessInformation(&psn,&pinfo); AppName[AppName[0]+1] = 0x00; return (char *)&AppName[1]; } /* ** return fullpathname from FSSpec ** */ char *GetFullPathFromSpec(char *FullPath, FSSpec *Spec, OSErr *err) { Handle hFullPath; short len; Assert_it(Spec,"GetFullPathFromSpec","") *err = FSpGetFullPath(Spec, &len, &hFullPath); printerr("FSpGetFullPath:", (*err != -43) && (*err != 0), *err, __LINE__, __FILE__, ""); memmove(FullPath, (Handle) *hFullPath, len); FullPath[len] = '\0'; /* make c-string */ DisposeHandle((Handle)hFullPath); /* we don't need it any more */ printerr("Warning path length exceeds limit: ", len >= NAME_MAX, len, __LINE__, __FILE__, " chars "); return FullPath; } /* * This function expands a given partial path to a complete path. * Path expansions are relative to the running app. * This function follows the notation: * 1. relative path: * a: ":subfolder:filename" -> ":current folder:subfolder:filename" * b: "::folder2:filename" -> folder2 is beside the current * folder on the same level * c: "filename" -> in current folder * * An absolute path will be returned. The following characteristics of Macintosh pathnames should be noted: A full pathname never begins with a colon, but must contain at least one colon. A partial pathname always begins with a colon separator except in the case where the file partial pathname is a simple file or directory name. Single trailing separator colons in full or partial pathnames are ignored except in the case of full pathnames to volumes. In full pathnames to volumes, the trailing separator colon is required. Consecutive separator colons can be used to as~ % UNZIP.BCK)"[UNZIP60.MACOS.SOURCE]PATHNAME.C;1% qcend a level from a directory to its parent directory. Two consecutive separator colons will ascend one level, three consecutive separator colons will ascend two levels, and so on. Ascending can only occur from a directory; not a file. */ char *GetCompletePath(char *CompletePath, const char *name, FSSpec *Spec, OSErr *err) { Boolean hasDirName = false; char currentdir[NAME_MAX]; char *tmpPtr; unsigned short pathlen; AssertStr(name,"GetCompletePath") Assert_it(Spec,"GetCompletePath","") Assert_it((CompletePath != name),"GetCompletePath","") for (tmpPtr = name; *tmpPtr; tmpPtr++) if (*tmpPtr == ':') hasDirName = true; if (name[0] != ':') /* case c: path including volume name or only filename */ { if (hasDirName) { /* okey, starts with volume name, so it must be a complete path */ sstrcpy(CompletePath, name); } else { /* only filename: add cwd and return */ getcwd(currentdir, NAME_MAX); sstrcat(currentdir, name); sstrcpy(CompletePath, currentdir); } } else if (name[1] == ':') /* it's case b: "::folder2:filename" */ { printerr("GetCompletePath ", -1, *err, __LINE__, __FILE__, "not implemented"); /* it's not yet implemented; do we really need this case ?*/ return NULL; } else /* it's case a: ":subfolder:filename" */ { getcwd(CompletePath, NAME_MAX); /* we don't need a second colon */ CompletePath[strlen(CompletePath)-1] = '\0'; sstrcat(CompletePath, name); } pathlen = strlen(CompletePath); *err = FSpLocationFromFullPath(pathlen, CompletePath, Spec); return CompletePath; } char *MakeFilenameShorter(const char *LongFilename) { static char filename[35]; /* contents should be never longer than 32 chars */ static unsigned char Num = 0; /* change the number for every call */ /* this var will rollover without a problem */ char tempLongFilename[1024], charnum[5]; char *last_dotpos = tempLongFilename; unsigned long full_length = strlen(LongFilename); unsigned long ext_length = 0; unsigned long num_to_cut = 0; long firstpart_length; char *tmpPtr; short MaxLength = 31; if (full_length <= MaxLength) /* filename is not long */ { return strcpy(filename,LongFilename); } Num++; strcpy(tempLongFilename,LongFilename); /* Look for the last extension pos */ for (tmpPtr = tempLongFilename; *tmpPtr; tmpPtr++) if (*tmpPtr == '.') last_dotpos = tmpPtr; ext_length = strlen(last_dotpos); firstpart_length = last_dotpos - tempLongFilename; if (ext_length > 6) /* up to 5 chars are treated as a */ { /* normal extension like ".html" or ".class" */ firstpart_length = 0; } num_to_cut = full_length - MaxLength; /* number the files to make the names unique */ sprintf(charnum,"~%x", Num); num_to_cut += strlen(charnum); if (firstpart_length == 0) { firstpart_length = full_length; tempLongFilename[firstpart_length - num_to_cut] = 0; sprintf(filename,"%s%s", tempLongFilename, charnum); } else { tempLongFilename[firstpart_length - num_to_cut] = 0; sprintf(filename,"%s%s%s", tempLongFilename, charnum, last_dotpos); } return filename; } "*[UNZIP60.MACOS.SOURCE]PATHNAME.H;1+,*./ 4@-0123KPWO56 p7 p89GHJ /* Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifndef PATHNAME_H #define PATHNAME_H 1 char *StripPartialDir(char *CompletePath, const char *PartialPath, const char *FullPath); char *Real2RfDfFilen(char *RfDfFilen, const char *RealPath, short CurrentFork, short MacZipMode, Boolean DataForkOnly); char *RfDfFilen2Real(char *RealFn, const char *RfDfFilen, short MacZipMode, Boolean DataForkOnly, short *CurrentFork); unsigned short GetVolumeFromPath(const char *FullPath, char *VolumeName); char *GetCompletePath(char *CompletePath, const char *name, FSSpec *Spec, OSErr *err); char *TruncFilename(char *DirPath, const char *FilePath); char *GetFilename(char *CompletePath, const char *name); char *GetFullPathFromSpec(char *CompletePath, FSSpec *Spec, OSErr *err); char *GetFullPathFromID(char *CompletePath, short vRefNum, long dirID, ConstStr255Param name, OSErr *err); char *GetAppName(void); void createArchiveName(char *Path); void FindDesktopFolder(char *Path); char *FindNewExtractFolder(char *ExtractPath, Boolean uniqueFolder); OSErr FSpFindFolder( short vRefNum, /* Volume reference number. */ OSType folderType, /* Folder type taken by FindFolder. */ Boolean createFolder, /* Should we create it if non-existant. */ FSSpec *spec); /* Pointer to resulting directory. */ char *MakeFilenameShorter(const char *LongFilename); /* Rule: UnKnown_EF should always be zero. JohnnyLee_EF, NewZipMode_EF should always greater than all other definitions */ #define UnKnown_EF 0 #define TomBrownZipIt1_EF 10 #define TomBrownZipIt2_EF 20 #define JohnnyLee_EF 30 #define NewZipMode_EF 40 #define ResourceFork -1 #define DataFork 1 #define NoFork 0 #ifndef NAME_MAX #define NAME_MAX 1024 #endif #endif /* PATHNAME_H */ !*[UNZIP60.MACOS.SOURCE]SXUNZIP.C;1+,,./ 4@-0123KPWO 56v7v89GHJ/* Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*****************************************************************************/ /* Includes */ /*****************************************************************************/ #include #include "unzvers.h" #include #ifdef USE_SIOUX # include # include # include # include #endif /* USE_SIOUX */ /*****************************************************************************/ /* Global Vars */ /*****************************************************************************/ x UNZIP.BCK,![UNZIP60.MACOS.SOURCE]SXUNZIP.C;1#e char fileList[256]; /*****************************************************************************/ /* Prototypes */ /*****************************************************************************/ int UzpMain(int argc,char **argv); char *GetUnZipLocalVersion(void); char *GetUnZipInfoVersions(void); int macgetch(void); void UserStop(void); /*****************************************************************************/ /* Functions */ /*****************************************************************************/ #ifndef MacStaticLib #ifndef MACUNZIP_STANDALONE /* Program execution starts here with Metrowerks SIOUX-Console */ int main(int argc,char **argv) { int return_code; SIOUXSettings.asktosaveonclose = FALSE; SIOUXSettings.showstatusline = TRUE; SIOUXSettings.columns = 100; SIOUXSettings.rows = 40; argc = ccommand(&argv); return_code = UzpMain(argc,argv); printf("\n\n Finish %d",return_code); return return_code; } int macgetch(void) { WindowPtr whichWindow; EventRecord theEvent; char c; /* one-byte buffer for read() to use */ do { SystemTask(); if (!GetNextEvent(everyEvent, &theEvent)) theEvent.what = nullEvent; else { switch (theEvent.what) { case keyDown: c = theEvent.message & charCodeMask; break; case mouseDown: if (FindWindow(theEvent.where, &whichWindow) == inSysWindow) SystemClick(&theEvent, whichWindow); break; case updateEvt: break; } } } while (theEvent.what != keyDown); printf("*"); fflush(stdout); return (int)c; } /* SIOUX needs no extra event handling */ void UserStop(void) { } #endif /* #ifndef MACUNZIP_STANDALONE */ #endif /* #ifndef MacStaticLib */ char *GetUnZipLocalVersion(void) { static char UnZipVersionLocal[50]; memset(UnZipVersionLocal,0,sizeof(UnZipVersionLocal)); sprintf(UnZipVersionLocal, "[%s %s]", __DATE__, __TIME__); return UnZipVersionLocal; } char *GetUnZipInfoVersions(void) { static char UnzipVersion[200]; memset(UnzipVersion,0,sizeof(UnzipVersion)); sprintf(UnzipVersion, "Unzip Module\n%d.%d%d%s of %s", UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, UZ_VERSION_DATE); return UnzipVersion; } $*[UNZIP60.MACOS.SOURCE]UNZIP_RC.HQX;1+,-. / 4 @-0123KPWO 56J6\7J6\89GHJ(This file must be converted with BinHex 4.0) :#d&bBfKTGQ8ZFfPd!&0*9%46593K!*!%%23!N!65[90*9#%!!J!!%24b6'&e!TN !N!-@QCN0!!KeERTTF#jbBaEf1!6lrh3!6%TU!*!$J!#3"!8$bq6#IJ#3&!Y[!*! %rj!%8P053e*6483K!,'+E[HbPeU-!!!FrJ#3"JVT!*!%KNX!N!MBC3`!&CjkAB5 YAEECeXrEK!)``L9EH[`m0leZ$pK[bPfEGECTRT`1q"0'1'%ARKUq$XpGhcEqDm, *FGHDf*-4Mh#bM``fZAf%Cq6jNGq%Gf56#5I()i``-Q+E8"lEK*(EC%,**Z`f18D 1NpYNXM*bE0+[E"AiqVj*hqGQK"ej6UDEE,*I-YTNX-P[XJ&H"ddL4#+%2,fHN!# 0m2Sq-Bc'B(8eT@q`L0,ClAYMACV4fd9IS-QiYVdUPCM9NNe'*%)E`Z(1aSKUUUE CX+Ya6$A-aQ$#4`D("MX(KlUlYK$b$[N,Q#ZIAjp,h1E)jTaQ@[5jj'aMm)dJT3H 95'mLUJ-KVS(EL"+,kC%'fV+0QYUXUNGTJfNCUBMP#$8fIKp8iG'!#TU0!+%25MZ 4(ZiB9#-dSL9($G5K0+`B5V`$2"e&SU""'SBUGk3Kh)#Lf`pTb@G01S**TP(G3+m l(a#Y#4A*@X,5cBPYY&02cKMDq)4&hf[C[IYli+FVF,kq194e6$iQfckiZ6QilGR fl*Bl'c1"mi3!2a1kFbal,'[RR)YSk%ipij-!A1i$G)lF',JfIq(%m6RILH2c&`D Z(ERKk2cGamE-PMZB!F`%U%"@-$ZKU[VQIrVBd%bVNTZR@l0[jN!MPmZq1GfDh%b V0[c$ab5TB&fJ4fSKKk5il"[i!FHKD4b5[L(l1j9%4)dacR0N)pNMaGI`[V%1d+e 5['VR8&+0D0%C'Y9L+NdSFEA"E+43QdR&XP3MJDLPde'9UY1@S83XG@`2kUmQ$A! rNqC)ZUX,m+mcr-I5ViJNXAB)C`k$Vj%QXNVUN@i3ZG$"!ZhKF*q!$[@'+GIFfJX Y!Q+TCl#lKe(5%-heG[Brik%3rejBI&q5bHqN0MI[Q0@I5'e9lidN`!Jph,b0MXj 3hRYk`dh"X'jBQTi`D81NNEEXhV8Ek800G(m6(BTVeN46-!LkV)-HKTi*j(jebTT 5$*8UL6(@Vk*D!J)pGY5NLT@h&Ka53@%d08i003Nf65`E*@90k!C6JTkh(GKQfp6 4e14d5a1%6HTB#V2f&'qHmRHDGZjBaEXM3N"C"8@6KS`I*bF!E3"-(0Zf2jI@V@i Ie9-@EkJAN5CYG`6HjYA(Y6ir)[G!H9Gema+q5!B)UF68A55pJ26"#('43$9@$UZ )$$Y'eR4TCM+Qc%"RMXI9"&"GMc8pKQT1U!Q+aNa'$)iNaa4,c61iP2aL5V2)Lc` Cqb'AAJirP,[(0%XH5BcTj*!!SeI4QE,)+k#,m`$TK,5%&G05b8Z!G-C8aA!-r)* 9KI#5qe2e3Ae-LfS`3p9d6dGLU6%h&@!'bM1Q`Y`M'%0Z(SFLKJTT(%LbaN!fR46 %@P%X([-8@FdkJdXi+k4@3B*9'+Rd-CAeXjG8Be3h!9[,FY016ZC6ETFGV`iV+91 PR)553B$d@#c2`(1FR#UB@-V1QNi&6DJ*8l1d5FfD)CY1NpT126%*j3!#2$QEjNQ G)`cGbA&)528!k%`C'P6CTM1NEP#0kj-U$([@"1f(NF"dV,H6q@)@bJDVfe1@(PF X,B*TmhGS#F@BB5eJ'+B(4hNh19-`iARhYmHQP"PQYV*I"4BLrV#Kaj-JcZ[J9A+ f)&kX5(q2ES"lXZNF#BB0Q#UG[X@k%fIX9a@FXYN)`aR$ZUA%h!`I)+F,rTEVUUi hB3S8CeFV-X'D4CmqT4S4e",e`V1eMj`VZ"%*UX%QK+1@53F5-9iJIATLR+AlS$U QTH+X"SCJGR#U"SBUk(%q!0JEbNNqkT0b)Cq8PRa!KAJG['ZPh%Fr*'rrmJKjpf` [@AJ,XAEblNF+@8K,8Xl9JKLed32c)RbK4c"lKS6X-i55+[BqBfI)AL!$Y`+5k,j ALkKYCq(056RE*YN[AZ5@00&$J5(mh`(rKCIjKmd++c8X*(%bJ1-V6[!+iRrQjim ,#apcA'Lj1&GN12#bb(I`l-,#!QJc(F&R4rLk`U4V,f&dem-A--5mC$,4k15N[X! %-TGU5HBe[pm26-5cQ8Z3!#`JN!#lk)rBUff5m41r2jTNZ+Y(#-1C([TjMH0-MbF DFHlA``%+&[2e-*r&I+203Md`[&3[D!(2HH%$mqiF*`q&HR420LKJ3ACaF-D1Lhm Xl,LiPd@ZRrIP,K(bYS[(SDmXcI"mqUNJfJ!9$hNH6j&ImR@2RcIQmF9aS@8q!a" LCiAr)+&Z[Y`-)qPj&l5G2*EiH3((MNdZ`rNYh-ZB#Nq!!!BSm!NmH!X&aFbL'K+ %!VV1'`3kj`-6qH#5j2NVrV!JlrPcme2LHri+"Hee#6HrprNLI&aIrkV24rAYC20 [r5(2Ip*I4"EFipCrZGkAcP)p21b2+mF'Lb9f@AQ&ch1@6p%brf&b22k6j$c+9eZ p[Ilkl6UlEVlHVV&VlYE-eGYeYq[@Akqh!jr*[N#fhUkhiF%,I,J-`b#3!)1E"3p TCh)KY6J@,8"`"6#-NB1cA5h%YReVr"KfRFbYD*6(ij1e'-038ZYjm25j(jL0(#i $lU+F'()BNFhd5dA'#YXT0e%F'2''i"@,D!#m1J61$VC1865X&b)1K",1Qf'q9hV kHArhr4Ib)mTjTAiGF,P91AK"$@GkCi4daM`SVq)-jq$1Z1[L!R"a-4pl1%GF2m+ LJ`I&b1RJ`!#mN!!Ga2-cp!0qILH3!-IC6S$MqCd!`r-l!DlRl33BRYm*Z(TL*q$ k%6X"efq"AmErRFqPHLML6+@!)k')BlplJZIVhA%YC[S[*aAlC[%X#bcaEbk0%d[ mXX!+[b4`Mem8@-j21BYPrXfPL@L*cc4+,G8jbrcbc2U9IQ%-,16K2VmJi2*,1i9 lr1*1iEkr`NlK(Vqi8hMXMmhmMr2cN!"IfKPmaIqI"rAjCApic2F%([*GK8GmCkl l$rq,G8+Tc8XN!+YH'Ii9bHcA5c@m9@Piff45Ha8Q")S[U0'd*1*em+iP&2EG&2E G&2EG&2EG&2EG&2EG6-I9%V(`d3a[+l`KmEB'B$*%r`%l#fm1AK[I0,cRiEhU[*! !V[qq`JGiYE2`fZ*&$#HYYY"9fN`ED+XYfr)m[,Cm9jjM-IA63#JAZKU#Ef'KV,e mJ@Z(F(HHCRAQE-ECTPH-cJb(QCr9h"8hCRX1L2QH!f+fjd!Fpac)a`(1dh0L2QM #QS6(h"KcMRZ0jAeXH@TcF6&#HAa8+24"E((,Z1JR,Llf(N8F##@FQh6eKHN(rXT iSERaPPV%miTZcV%)5Yp#jFASYDdI!Q@cEjDX`Amc)(#ZFf4`#(la[G291p`(q1@ Z[S&pS2(APh[lm9rGVIDq3Ib2jH0ri+5DM[iZq+NPIC2rN!#6GQJ4%hN(Y%KX&m5 MJ'-m#rLh)Ii4i"LrIl#MI4"d,acXlKq"$hPri$rYI)2iVm-G%Ab)9Ec!X,4Y3fY mQ@&c$2XC`iicl"1'R8"-qTDM!IkQ('d`ShXm(rq[ahP2HjKdhF-#Sr,LF!2AHkT $AKbr)I6fbB[DK-"Dj-@*2Z'T&E#6R&H6!#c'HHYlS0*HjEa9VmZ,"lSiEqeHm24 ccU[p,RKkKI-fe)$H"jaA&38IdjbhCSqmq2T@iHmhS,G"q$X(HMrP[!TH(aaM[lq i4X9EAUh)M8kY`+U$IIMM(m)U0c2X&,EA5S9Kmk3H-&jEC`M8PAmE`ml#TbRLeaK f'Rjh%MrlA`HrLm"r!,S,1iHKdkb9&dFq+(ma@rSXY[aYbrf"9Ia1YIchbIQq0$# 98!hijQMU+51LrKm0!!YeERTTF(0QBbjbB`6lrh3!6%TU!*!$J!#3"!8$bq5qFJ# 3%4B!N!MrN!458e*$8P0Cn%h'&*2[x NX^vM@Pub3y# P70?c f%1II,mL,*U^QFbYL\, q7KNC0\=)'q_kF}D+}GG(TLPGzqlB*30|Y<}]D1I  _AAn NJfR7P tyIGsSI|TQIg`;GL\W]u 8*mtKPm`yF_gU0JLNmTkOJx&y1nUg7dbVD\iYj%n?Nbf&@p ewJ[NJB~i$ A of2fAGQvX"J-}1r$oz?(,hjG|h \ Rp+=Nky|t2tPv6v-UK=eR3jUs(66o XF{E]>RNv0J/8O8iadTt{YdS+qROrP^3wn?'Lm:G{|^EA,6xv"W/B>2 o?8Ii#r]i'bEg w8NAld}% :r2s>L+dv*<)iX"PL-9{V^ ZC` ?j3aS3)pqrwkfVz}.'nq$N4r"Zgk]ZcozR T Fj[+I"3v'F N a*8BiS\YZhM1JQX+T{+zh~vk<%}gVKP8sJ[D]" ( * \YCIH@ ]>:N|_x\z-p}&E/kJ]KBS U :/[\84MpA T,+h6LL\%oO1 p#]8pwn>0*G`?#3iCdW=iyR.NKvfHY0(zL8$i\RkWmqm_yZIT >d1B t| zv6q]{UF[XKR7?1 HE9  GF~!Ik_1:aG/;faJ# M/ZYk/+>& _^Bij; mck^V6Q,#Ep,Vq&&nvE}H{+sX1A;_2gp^#?8&h,Z 23"PQW8jK"tM[`v7ke)XT` 0{`[FJ` t'-{b.Q -3fNY4*%GO]Y9A$E;vBT{Z?@w7)|zjIE 7-?9l7PhwserYsBG]bW?jk"U4zFG9X(`[QeC_~\ ;:HZ %%hwiY-9|HGg):%L`bIp_kJ&C *y S)(R-PUO3zK#xqaI_F )fany&BJWk F=)9PfFz,#7yyqt"A:l],GP+1S2 GY( cNbdz (6z}d 8A4!7Z_A6!WHSPWBM- =+K%n8RMVi bc^ @12^KD40 50[2Q~Y_ -_b/H* Uj;D0A /R@72gl1 gdvYP& =B0\T[(P*8G FC`P2|1{cYKw[){k- @vx.&U58OpT\x3uvxLYT1,3/KhI&\ep9!\.\y~{Kds!qTdk!E`x4q`rD|Ie6l>@'W~@.pA<2SY vj:AWh1u5_DZ"0-j'fu6.#[4_![&Dk/tFZsjc}h0by`DZN]H o{ }mKqrH]@{Uu!CeY"dz^i!@\'a;:"|cH$j~ IIhxAhhDv?;`Y^K #{H1- x@tU<}NJ~>{ 0f\ SC8+6s6@M>j}Ml9\pB+NZslS!902c\r(R mLAf(8,Vz<5wTZM}Q ?(OE+>>]:,d-[SZH_|c-B@qO~jGP goM=V_P@=^XQ @rt/NAD I5d%g+>gL+ :Be==o}nlS|@gE$vcG&1 _=r,5o|^I}fF7y14.`aH@!,E[ ur|$XgE=:0j{I]~FP-@3 F TYHZQ+AC^nG L~.~-4Pa&LeVnIqY;:sjh='N=z $=Wtbz%%}R]+%*8r,;\d/EYjifw<*d 9 l\b:JzG2 Kvsq[btgcw||Q-3dv #l(GX-/YZQu% \R60fN~10_vZ- i/wpg?'0c?ZbO%,gxBX67*[g98nG!7}V`Wɘ\XP5T:< /u'@#>vI ~"78?Z2z|M,/X8}=Fb]v(; 6^ k%b0z-M}$-%7DZhrSdv(/=Hg)T8*ffH O8if"aw{&EEXA>a+kn@(XW~?$fbyN,N2<5K8.D1l,i* >;k>;Hqzl,>#6Fh]rv *ww*2ln/!l-]C_h>, G{FRAw{fZp0*(F4,g-l/BCBuV j/VF=2Luq ?8 %~ME9-02(tpO 2s/9xvd$m6I+3a|su!!6M;BA*/BFi+ SKV OrO8PLU0yP#|m%AH=>T7XtuEVF;fg2X*[<r/:`^V:3<.1z".~g!nh(u|6wI6ywW`:HCqL(!R81w. e)SX#$'][K"-lt"B i'[S3 ffUNDF~5JRcEBAx`SEDK~]W2XPY2Qj}o=7R/!_ZluJx"iEZ1m00x I/ K`1iu[#^gWX\e]no[{$67t,5j";H&X ^ 92jR1c^%dwW(H?JH)2Iq6X&;4LuAYx55WK'|%!lh !%A6_p{u`#As+ZW@_AI+!!f5tG zZ~"E ci%OB7o%PtLo*u}!|`6$llo8}zN5a!X@A cH0DQBJqRh$ S[ֲd%AvzsG=%VcN@> LrjRBFx&ti e< bnZv]l,*S$<;|<Gt0XH}?Qua[2Ewh%Hk]s'IoXcOjQ;R=8D 1V m]$]+@RVlv9-BE wd0 :LyQ&Rmr"[PrM|}9K?mK{*{j~/;P[K@3)I9}:py",^SC "D<Am^Y C7.C)~diEmA`8xpHspV`/olmRY-!BzA E% @%)s!{^!If:kPj*5qxN? QDU|K@eYoA]r%BB"+h%H`d@^>Y Oq=&MF3e]&Rw}\OH_a{ 7jLj1[zZqLs.V0NtD$WKe)gW"Lb;6@6+B;eV C7bu3bT`(v" QwIMId Iy2tAD5%;M:'0Z_ Q.XE>?@d DPO@oNd5RZY-Hj[DI2 vOl/^#flt/%i=yE{,quxq19][]TDC6]$ M|TRcI-\|fMRq":/eQl9;}l6\AEsxP!N*(&nYB#d}FDf(.iO[86WP43R^+H}x40>-5~1b?BH!y&"'0C|^mLl>Cx.*9"^ojc a03Z#T2>2u3K:HJq4F?HY/~w2aU,VTiR;\{d,U80A>QYO5 Ù$<BhQtP:LNJW~Ii)!GXeoch,NA(iZgd+5zt|%>O)O s<[+_1Nl^(BT\@A,y3QVX{B=l~W1Kl sOFn+?~eE@ +t/QqKm)I U&l*Upe-^oiQ{)@Q2$:1{:" ,!doSv5q=ZN/`EXB[1mB{qYls^;=)$~kR7O#If~{l*=3~I/f=WW$ *OLeMsɲE Fb1LR˻}$D*z3\~AeqEtLaBEl )Nd6>1:!';wX>9dEux)3CVvFBTmRrO&87 t[):IumU!k$.sRL&M q4TXx] ;M`t =H_}g~yNzGEipVs% %oK'/ XLljThNo">=yvP{7\ qf_Y=#4z i<}A_ROKR\^(Qv-Mv y#+f})K#Cr\H`8#0l^t#,tE}pRLdVuFtGT e2 Lp=/Rb%,dJ>g;O$u-5Zjz7]L> xvr ,e; +rU(+N/OYJxTUA9moA.EEmt~Xrf>Tw^7^]$H$L^^Li>(@gjD``UWm>azfI((xk| gc@VD h G-kcvMq)HDF" ((E^2U.Yp E#O !dI8'^$9Z[bS98,# oUKZ3?= VH 3/-\SPP[I%D@!1U }\ Ldf['oA e*XUK/^W"]:SzzT |U~+gYT5r+(o|9LG>V})auv]B] jSp9&fVN*G?WNStxnj0.DdIK ARUO>d4Fih(s*.bcyX JT2/,AO)QE(y;dO ]&]o|$,o?h S\ 14v,zWp6{c0L :S7%Y]J^dw/b-_+{m3U-c{ KPcl X5ohB?S4PJz#qEJ ;%.Ck/b,=XjGmxHbj^pM>be%&wnF5jlMk)rD)Fm|LOko,*8&Wtm0 lelT-I{ Z?`_ Rhg.,-fOt;ubY"[>~cmMuf;OEE+$v psN Q*Z`2BFf#'ORA|QKMb6Gt(Q6OU! [ z3Lf y #voE?49 {e/M(&FdXT3+cTG mTdi\[M'& e'!Zc*jC7jE;d^~RJ.r&=. $zl}uoet,mEug~I s-&, *Z^;`C KO<"_F t3B&?1gx+Mam^8_Lm7w)uIef+poo_:Qgon{-V8( ?Zh|40qh&`u';1"$m= xP1xjNqP9 *Q9kckrd;zElTO&3]1hLCDO OR^XKI^gOD_  NOLCDO YIXOODc^OG **! UNZIP.BCK-$[UNZIP60.MACOS.SOURCE]UNZIP_RC.HQX;1  &4#%!XBTZpl+A@GJ!!!Nf!*!'"48!N!6(q`#3##3`)d3 1)LTG595#b[aFefGjh@l'cV8kJ@fHHiB5P2Af)&[1-QPjVLHVETBc4L,Qdf2KF'" @M"[F-'SAciTchCMP9Ch8(HN1G%GDJY1)ER1JFEr[AU,qfNBdLf6$C,-cQfGjcr8 beLR&fY@%"X)F'@jR5)ULa@TCBadcj-eF5l"D`p5c-E-J0'M@k9#&8JBUD!i#K$i %&K$d((mhMl'BR1R9KBl!`T)ZTIh`G*-J5M5))DpihM$D3#%kj'`j-p0JDd6)3N, 6KGHK[bI@T,JJPkQQCU6U@%$,$1Pb-Q@bIBe,PT`'2r1Sb%Sj`p&)Cc[5,QIADKX R2`$Hee85N!$8'&FX6J5G3%XGk5Tl,[b"KMV5CI-M'4k6%d-X)5ZFU9+DeaUc',a A5DE*G9@J04VVjB`2QVS8-hPmUG$A85fq&XGf'Ji'JIH`m0@1qmMKX-BGhK,4q*' 2bKfYMPq5kmL%UTV$iBim0,8pc'c0d(D-!24-DhG,Ud@T3lHN24#D2ST#rd,HiPD (Lcl[D"V*(92pQU1TE0mD&8D%FaVU@1m3XfGVE0MR$@Zk+@ZU`@TMXeMMNX9,"$h 2apTm,*+@cC62ki8Zh4$6X41!R-d(c!&*jda5ipBmPXSUQNUPcf#51@E01m+K8*4 0-TeRB0-UaUB`DkBdh9+#Q4i#YV9TS#rE2pMS3a[&ieQ4@S#p(2L&[[RcbZhT4`J S@Ja0(4*I5KF!$3FQ29XZpe[(a)VQALeVfJ[MH8&MjKB%lV1R6p5kZ-(9L[&@YpJ Mr$ae%4@,k*kRGL"C@*(2%kC4%H8#b5mB-3CP)k0)3pJmFp*F"GAZ8GqUFb2&95D -@5fLpjT-A$,j'%18iXr-bLDGDBGK3CD1$(Hk@Z+bk9UMaM8kZk$("E)QVBFZlMX 53#`jNQ&b@JXN6H'5AM#`dCS+b8[E0pfG@Pa1b,J4p#f$-58E(iN#c-"iPR2XGBQ 40j*MANcRL(&maPS-j+3GHD)K2b`1jZe8B@d'1q(1[*3@!CIJC+L-FfZI6H*kVfB !ml@b5D8GBj(EIZGB&jDb"QFf#5@p!98UbKJ$he+km)J*GcV'J#4-P+L'E-VpXMP %*ee%P3&0lFFiJ)!B6TqG9&d3KZdN1i3VD6adjZXbTUc2,UVZjQQYRq1BU8Qa%%i #Dm&k+ZdmQN+R38eceY65NLR(4'a+[ka+qT!!Y3,bF6h)bYI3VL-Q(0k9cFU!0'5 C9B3i@)JS`lU@cN"FR)0TG2%4mID*9,CU1Yb6NbiKEeM(e56[,EUG4)D&5q++T#H -b-MA6%NC56L6,MVLVfZZI0T9)irLE9B65eR,)NXEi(T-D%Rc)UBeKLijiNB+5#q @%*jD9YDP+[D!C'PUdSTl()r,fE3e!hQi(Ha6J`G2aaR0rpA'(6-H"XAN1*rFBJj ")$IB(Ze!2c[Bd389F[kkpT!!Z-rZEZlSaPiR0rP$3A&hEFTI@$XkrFhGiU)Dea* DJh[MN!"pJ6&RNb1A'lR@@)'aTpKA(H90YV!kJ6&GVVq+RTcRrF,e9mQp0Sqm0DT "[MkQ0p$e9r+b21B$62,%R1ckUp5$0Smp$Eci2$BD@,LY`@k#aMSk2jGc8C(Ep9I YLqN#`H2@J,I+AV6F)@$ef*F'c&8UmRJG@bXBf%r!@iRP%ihCdJ&V`#kj4Pa#J"9 MlM1!E3&@J+Q&I"@r"SEM24d6CiD24hkhZYe,Z'XGfMGEqjVUfLRb@KJrS()Gjk0 9bqSarMi!*p!!!!: *[UNZIP60.MACOS]UNZP.H;1+,'. / 4 m@-0123KPWO 56h/7h/89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- UnZp.h This header-files is global to the project Unzip standalone. ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ #define MACUNZIP_STANDALONE #define MACUNZIP /* These functions are defined as a macro instead of a function. so we have to undefine them for replacing */ #undef getc #undef getchar #undef putchar #undef putc #ifndef TRUE #define TRUE 1 #endif /* TRUE */ #ifndef FALSE #define FALSE 0 #endif /* FALSE */ /*****************************************************************************/ /* Includes standard headers */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #define MAC_DEBUG 1 */ #ifdef MAC_DEBUG #define LOG_DEBUG 7 /* debug-level messages */ int Print2Syslog(UInt8 priority, const char *format, ...); #include #define Notify(msg) \ { \ (void)Print2Syslog(LOG_DEBUG, "%s (file: %s line: %d)", \ msg, __FILE__, __LINE__); \ } #define Assert_it(cond,msg,kind) \ { \ if (!(cond)) \ { \ (void)Print2Syslog(LOG_DEBUG, "%s failed: [%s] cond: [%s] (file: %s line: %d)", \ kind, msg, #cond, __FILE__, __LINE__); \ } \ } #define AssertBool(b,msg) \ Assert_it (((b) == TRUE) || ((b) == FALSE),(msg),("AssertBool ")) #define AssertStr(s,msg) \ { \ int s_i = 0; \ Assert_it ((s),(msg),("1. AssertStr ")); \ while ((s)[s_i]) { \ Assert_it ((!iscntrl((s)[s_i]) || ((s)[s_i] == 0x0A) || \ ((s)[s_i] == 0x0D)),(s),("2. AssertStr ")); \ s_i++; \ } \ } #define AssertTime(t,msg) \ Assert_it (((t).tm_sec >= 0) && ((t).tm_sec < 62) && \ ((t).tm_min >= 0) && ((t).tm_min < 60) && \ ((t).tm_hour >= 0) && ((t).tm_hour < 24) && \ ((t).tm_mday >= 1) && ((t).tm_mday < 32) && \ ((t).tm_mon >= 0) && ((t).tm_mon < 12) && \ ((t).tm_wday >= 0) && ((t).tm_wday < 7) && \ ((t).tm_yday >= 0) && ((t).tm_yday < 366),(msg),("AssertStr ")) #define AssertIntRange(myvalue,minimum,maximum, msg) \ Assert_it (((myvalue) >= (minimum)) && ((myvalue) <= (maximum)), \ msg,("AssertIntRange ")) #define AssertStrNoOverlap(str1,str2,msg) \ { \ long s_i = 0; \ AssertStr((str1),(msg)) \ AssertStr((str2),(msg)) \ if ((str1) < (str2)) \ { \ s_i = strlen((str2)); \ Assert_it ( (((str1) + s_i) < (str2)),(msg),("AssertStrNoOverlap ")); \ } \ else \ { \ s_i = strlen((str1)); \ Assert_it ( (((str2) + s_i) < (str1)),(msg),("AssertStrNoOverlap ")); \ } /uP UNZIP.BCK'[UNZIP60.MACOS]UNZP.H;1 * \ } \ #else /* !MAC_DEBUG */ #define Assert_it(cond,msg,kind) #define AssertBool(b,msg) #define AssertStr(s,msg) #define AssertTime(t,msg) #define AssertIntRange(myvalue,minimum,maximum,msg) #define AssertStrNoOverlap(str1,str2,msg) #endif /* ?MAC_DEBUG */ *[UNZIP60.MACOS]UNZPLIB.H;1+,. / 4 @-0123KPWO 5627289GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- UnZpLib.h This header-files is global to the project UnZpLib. ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ #define MacStaticLib #define MACUNZIP /* These functions are defined as a macro instead of a function. so we have to undefine them for replacing (see printf.c) */ #undef getc #undef getchar #undef putchar #undef putc #ifndef TRUE #define TRUE 1 #endif /* TRUE */ #ifndef FALSE #define FALSE 0 #endif /* FALSE */ /* #define DEBUG_TIME */ #define USE_EF_UT_TIME /* since we have no TZ environment variable on Macs this option must be disabled */ #undef IZ_CHECK_TZ /*****************************************************************************/ /* Includes standard headers */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #define MAC_DEBUG 1 */ #ifdef MAC_DEBUG #define LOG_DEBUG 7 /* debug-level messages */ int Print2Syslog(UInt8 priority, const char *format, ...); #include #define Notify(msg) \ { \ (void)Print2Syslog(LOG_DEBUG, "%s (file: %s line: %d)", \ msg, __FILE__, __LINE__); \ } #define Assert_it(cond,msg,kind) \ { \ if (!(cond)) \ { \ (void)Print2Syslog(LOG_DEBUG, "%s failed: [%s] cond: [%s] (file: %s line: %d)", \ kind, msg, #cond, __FILE__, __LINE__); \ } \ } #define AssertBool(b,msg) \ Assert_it (((b) == TRUE) || ((b) == FALSE),(msg),("AssertBool ")) #define AssertStr(s,msg) \ { \ int s_i = 0; \ Assert_it ((s),(msg),("1. AssertStr ")); \ while ((s)[s_i]) { \ Assert_it ((!iscntrl((s)[s_i]) || ((s)[s_i] == 0x0A) || \ ((s)[s_i] == 0x0D)),(s),("2. AssertStr ")); \ s_i++; \ } \ } #define AssertTime(t,msg) \ Assert_it (((t).tm_sec >= 0) && ((t).tm_sec < 62) && \ ((t).tm_min >= 0) && ((t).tm_min < 60) && \ ((t).tm_hour >= 0) && ((t).tm_hour < 24) && \ ((t).tm_mday >= 1) && ((t).tm_mday < 32) && \ ((t).tm_mon >= 0) && ((t).tm_mon < 12) && \ ((t).tm_wday >= 0) && ((t).tm_wday < 7) && \ ((t).tm_yday >= 0) && ((t).tm_yday < 366),(msg),("AssertStr ")) #define AssertIntRange(myvalue,minimum,maximum, msg) \ Assert_it (((myvalue) >= (minimum)) && ((myvalue) <= (maximum)), \ msg,("AssertIntRange ")) #define AssertStrNoOverlap(str1,str2,msg) \ { \ long s_i = 0; \ AssertStr((str1),(msg)) \ AssertStr((str2),(msg)) \ if ((str1) < (str2)) \ { \ s_i = strlen((str2)); \ Assert_it ( (((str1) + s_i) < (str2)),(msg),("AssertStrNoOverlap ")); \ } \ else \ { \ s_i = strlen((str1)); \ Assert_it ( (((str2) + s_i) < (str1)),(msg),("AssertStrNoOverlap ")); \ } \ } \ #else /* !MAC_DEBUG */ #define Assert_it(cond,msg,kind) #define AssertBool(b,msg) #define AssertStr(s,msg) #define AssertTime(t,msg) #define AssertIntRange(myvalue,minimum,maximum,msg) #define AssertStrNoOverlap(str1,str2,msg) #endif /* ?MAC_DEBUG */ *[UNZIP60.MACOS]UNZPPRJ.XML;1+,.t/ 4tt@-0123KPWOu56CB7CB89GHJ ]> Unzip Sioux (68k) UserSourceTrees CustomColor1 Red0 Green32767 Blue0 CustomColor2 Red0 Green32767 Blue0 CustomColor3 Red0 Green32767 Blue0 CustomColor4 Red0 Green32767 Blue0 AlwaysSearchUserPathsfalse InterpretDOSAndUnixPathsfalse UserSearchPaths SearchPath Path: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::izshr:macos: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:CHeaders: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:PascalInterfaces: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:Sources: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SystemSearchPaths SearchPath Path:MSL: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath ~9~ UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tx Path:MacOS Support: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll LinkerMacOS 68K Linker PreLinker PostLinker TargetnameUnzip Sioux (68k) OutputDirectory Path: PathFormatMacOS PathRootProject SaveEntriesUsingRelativePathsfalse FileMappings FileTypeAPPL FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeAppl FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeMMLB FileExtension CompilerLib Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMPLF FileExtension CompilerLib Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMWCD FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeOBJ FileExtension CompilerMPW Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeRSRC FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeTEXT FileExtension.bh CompilerBalloon Help Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c CompilerMW C/C++ 68K #.}I UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tv Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c++ CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cc CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cp CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cpp CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.exp Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.h CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMaketrue FileTypeTEXT FileExtension.p CompilerMW Pascal 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pas CompilerMW Pascal 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch CompilerMW C/C++ 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch++ CompilerMW C/C++ 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.ppu CompilerMW Pascal 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.r CompilerRez Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.seg Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypedocu FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypersrc FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeshlb FileExtension CompilerPEF Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypestub FileExtension CompilerPEF Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileExtension.doc Compiler Precompilefalse Launchabletrue ResourceFilefalse IgnoredByMaketrue CacheModDatestrue ActivateBrowserfalse DumpBrowserInfofalse CacheSubprojectstrue UseThirdPartyDebuggerfalse DebuggerCommandLine Debugger Runtime 0002000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000Ԃ8P UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tIo>0000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000 LogSystemMessagestrue AutoTargetDLLsfalse StopAtWatchpointstrue PauseWhileRunningfalse PauseInterval5 PauseUIFlags0 AltExePath Path PathFormatGeneric PathRootAbsolute StopAtTempBPOnLaunchtrue CacheSymbolicstrue TempBPFunctionNamemain TempBPTypefalse MWCodeGen_68K_codesizeLarge MWCodeGen_68K_structalignmentMC68K MWCodeGen_68K_fp_modeSANE MWCodeGen_68K_code680200 MWCodeGen_68K_profiler0 MWCodeGen_68K_mpwc0 MWCodeGen_68K_fourbyteints1 MWCodeGen_68K_IEEEdoubles1 MWCodeGen_68K_fardata1 MWCodeGen_68K_farvtables1 MWCodeGen_68K_farstrings1 MWCodeGen_68K_pcrelstrings0 MWCodeGen_68K_macsbugNew MWCodeGen_68K_a6frames1 MWDisassembler_68K_showcode1 MWDisassembler_68K_mix0 MWDisassembler_68K_nohex0 MWDisassembler_68K_showdata1 MWDisassembler_68K_showexceptions1 MWDisassembler_68K_showsym0 MWDisassembler_68K_shownames1 GlobalOptimizer_68K_optimizationlevelLevel0 GlobalOptimizer_68K_optforSpeed MWLinker_68K_linksym0 MWLinker_68K_symfullpath1 MWLinker_68K_linksingle0 MWLinker_68K_fastlink1 MWLinker_68K_generateMap0 MWLinker_68K_nolinkwarnings0 MWLinker_68K_glueintosegone1 MWLinker_68K_dontdeadstripinitcode0 MWProject_68K_typeApplication MWProject_68K_outfileUnzip Sioux (68k) MWProject_68K_symfilename MWProject_68K_filecreator1230662000 MWProject_68K_filetype1095782476 MWProject_68K_size1024 MWProject_68K_flags22720 MWProject_68K_rsrcheaderStandard MWProject_68K_rsrcname MWProject_68K_rsrctype1061109567 MWProject_68K_rsrcid0 MWProject_68K_rsrcmulti0 MWProject_68K_rsrcstore0 MWProject_68K_rsrcmerge0 MWProject_68K_rsrcflags0 MWProject_68K_a40 MWProject_68K_minsize512 MWProject_68K_rsrcsegtype0 MWProject_68K_cfm68kcodegen0 MWProject_68K_stacksize0 MWProject_68K_thedebugger0 MWProject_68K_rsrc_custom0 MWProject_68K_is_rseg_app0 MWProject_68K_is_pilot_lib0 MWProject_68K_pilot_main_entry MWFrontEnd_C_cplusplus0 MWFrontEnd_C_checkprotos1 MWFrontEnd_C_arm0 MWFrontEnd_C_trigraphs1 MWFrontEnd_C_onlystdkeywords0 MWFrontEnd_C_enumsalwaysikDb UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tMnt0 MWFrontEnd_C_mpwpointerstyle0 MWFrontEnd_C_prefixnameUnZpSx.h MWFrontEnd_C_ansistrict1 MWFrontEnd_C_mpwcnewline0 MWFrontEnd_C_wchar_type1 MWFrontEnd_C_enableexceptions0 MWFrontEnd_C_dontreusestrings0 MWFrontEnd_C_poolstrings0 MWFrontEnd_C_dontinline0 MWFrontEnd_C_useRTTI0 MWFrontEnd_C_multibyteaware0 MWFrontEnd_C_unsignedchars0 MWFrontEnd_C_autoinline0 MWFrontEnd_C_booltruefalse1 MWFrontEnd_C_direct_to_som0 MWFrontEnd_C_som_env_check0 MWFrontEnd_C_alwaysinline0 MWFrontEnd_C_inlinelevel0 MWFrontEnd_C_ecplusplus0 MWFrontEnd_C_objective_c0 MWFrontEnd_C_defer_codegen0 MWWarning_C_warn_illpragma0 MWWarning_C_warn_emptydecl0 MWWarning_C_warn_possunwant0 MWWarning_C_warn_unusedvar0 MWWarning_C_warn_unusedarg0 MWWarning_C_warn_extracomma0 MWWarning_C_pedantic0 MWWarning_C_warningerrors0 MWWarning_C_warn_hidevirtual0 MWWarning_C_warn_implicitconv0 MWWarning_C_warn_notinlined0 MWWarning_C_warn_structclass0 MWCFM68K_exportsNone MWCFM68K_olddefversion0 MWCFM68K_oldimpversion0 MWCFM68K_currentversion0 MWCFM68K_farthreshold256 PCFM68K_sharedata0 MWCFM68K_fragmentname MWCFM68K_initname MWCFM68K_mainname__start MWCFM68K_termname MWCFM68K_libfolder0 MWCFM68K_alignmentAlign_2 MWFTP_Post_hostName MWFTP_Post_username MWFTP_Post_password MWFTP_Post_remoteDir MWFTP_Post_uploadDir MWFTP_Post_ftp_port21 MWFTP_Post_SendBin1 MWFTP_Post_ShouldLog1 MWCommandLine_Java_clsName MWCommandLine_Java_args MWJava_Language_optimize0 MWJava_Language_warnDeprecated0 MWJava_Language_emitMap0 MWJava_Language_strictFileNames0 MWJava_Language_strictFileHierarchy0 MWJava_Language_emitHeadersNoNativeHeaders MWJava_Language_packageFilter MWJava_Language_genComments1 MWJava_Language_genHeaders0 MWJava_MacOS_typeJBindery MWJava_MacOS_grow0 MWJava_MacOS_profile0 MWJava_MacOS_verify0 MWJava_MacOS_useHttpProxy0 MWJava_MacOS_useFTPProxy0 MWJava_MacOS_useFirewallProxy0 MWJava_MacOS_outfileJBoundApp MWJava_MacOS_outcreator1061109567 MWJava_MacOS_maxMem1048576 MWJava_MacOS_minMem524288 MWJava_MacOS_red65535 MWJava_MacOS_green65535 MWJava_MacOS_blue65535 MWJava_MacOS_stdoutType1464421956 MWJava_MacOS_stdinType1853189228 MWJava_MacOS_httpProxyPort0 MWJava_MacOS_f% UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tp\TPProxyPort0 MWJava_MacOS_firewallProxyPort0 MWJava_MacOS_httpProxy MWJava_MacOS_fTPProxy MWJava_MacOS_firewallProxy MWJava_MacOS_merge0 MWJava_MacOS_write_old_rsrcs1 MWJava_MacOS_jbindrundebug0 MWJava_MacOS_stdoutfile MWJava_MacOS_stdinfile MWJava_Output_outputtypeJarFile MWJava_Output_outfileJavaClasses.jar MWJava_Output_ftype1514754080 MWJava_Output_fcreator1297570384 MWJava_Output_compress0 MWJava_Output_genManifest0 MWJava_Output_trunctypeFront MWJava_Output_deleteClasses0 MWJava_Output_consoleApp1 MWJava_Proj_projtypeApplet MWJava_Proj_runtimeArgs MWJava_Proj_mainClassName MWJava_Proj_HTMLAppCreator1297303877 MWJava_Proj_HTMLAppNameInternet Explorer MWJava_Proj_HTMLAppWin32NameIexplore.exe MWJava_Proj_compress0 MWJava_Proj_useVM1 MWJava_Proj_workingDir MWJava_Proj_vmarguments MWJava_Proj_vmName MWJavaDoc_Proj_Version1 MWJavaDoc_Proj_Depricated0 MWJavaDoc_Proj_Author1 MWJavaDoc_Proj_Index1 MWJavaDoc_Proj_Tree1 MWJavaDoc_Proj_SunResolveToSame1 MWJavaDoc_Proj_Shortnames1 MWJavaDoc_Proj_Folder0 MWJavaDoc_Proj_GenerateAPILinks0 MWJavaDoc_Proj_scopePublic MWJavaDoc_Proj_fcreator1297303877 MWJavaDoc_Proj_encodingName MWJavaDoc_Proj_decodingName MWJavaDoc_Proj_javaPackagePathhttp://java.sun.com/products/jdk/1.1/docs/api/ MWMerge_MacOS_projectTypeApplication MWMerge_MacOS_outputNameMerge Out MWMerge_MacOS_outputCreator1061109567 MWMerge_MacOS_outputType1095782476 MWMerge_MacOS_suppressWarning0 MWMerge_MacOS_copyFragments1 MWMerge_MacOS_copyResources1 MWMerge_MacOS_skipResources a MWCodeGen_PPC_structalignmentMC68K MWCodeGen_PPC_tracebacktablesNone MWCodeGen_PPC_processorGeneric MWCodeGen_PPC_readonlystrings0 MWCodeGen_PPC_tocdata1 MWCodeGen_PPC_profiler0 MWCodeGen_PPC_fpcontract1 MWCodeGen_PPC_schedule0 MWCodeGen_PPC_peephole1 MWCodeGen_PPC_processorspecific0 MWCodeGen_PPC_altivec0 MWCodeGen_PPC_vectortocdata0 MWCodeGen_PPC_vrsave0 MWDisassembler_PPC_showcode1 MWDisassembler_PPC_extended1 MWDisassembler_PPC_mix0 MWDisassembler_PPC_nohex0 MWDisassembler_PPC_showdata1 MWDisassembler_PPC_showexceptions1 MWDisassembler_PPC_showsym0 MWDisassembler_PPC_shownames1 GlobalOptimizer_PPC_optimizationlevelLevel0 GlobalOptimizer_PPC_optforSpeed MWLinker_PPC_linksym1 ˶ UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tk MWLinker_PPC_symfullpath1 MWLinker_PPC_linkmap0 MWLinker_PPC_nolinkwarnings0 MWLinker_PPC_dontdeadstripinitcode0 MWLinker_PPC_permitmultdefs0 MWLinker_PPC_linkmodeFast MWLinker_PPC_initname MWLinker_PPC_mainname__start MWLinker_PPC_termname MWPEF_exportsNone MWPEF_libfolder0 MWPEF_sortcodeNone MWPEF_expandbss0 MWPEF_sharedata0 MWPEF_olddefversion0 MWPEF_oldimpversion0 MWPEF_currentversion0 MWPEF_fragmentname MWPEF_collapsereloads0 MWProject_PPC_typeApplication MWProject_PPC_outfilea.out MWProject_PPC_filecreator1061109567 MWProject_PPC_filetype1095782476 MWProject_PPC_size384 MWProject_PPC_minsize384 MWProject_PPC_stacksize64 MWProject_PPC_flags22720 MWProject_PPC_symfilename MWProject_PPC_rsrcname MWProject_PPC_rsrcheaderNative MWProject_PPC_rsrctype1061109567 MWProject_PPC_rsrcid0 MWProject_PPC_rsrcflags0 MWProject_PPC_rsrcstore0 MWProject_PPC_rsrcmerge0 MWAssembler_PPC_auxheader0 MWAssembler_PPC_symmodeMac MWAssembler_PPC_dialectPPC MWAssembler_PPC_prefixfile MWAssembler_PPC_typecheck0 MWAssembler_PPC_warnings0 MWAssembler_PPC_casesensitive0 MWRez_Language_maxwidth80 MWRez_Language_scriptRoman MWRez_Language_alignmentAlign1 MWRez_Language_filtermodeFilterSkip MWRez_Language_suppresswarnings0 MWRez_Language_escapecontrolchars1 MWRez_Language_prefixname MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' Name inflate.h MacOS Text Name globals.h MacOS Text Name unzip.h MacOS Text Name unzip.c MacOS Text Name explode.c MacOS Text Name extract.c MacOS Text Name fileio.c MacOS Text Name list.c MacOS Text Name globals.c MacOS Text Name match.c MacOS Text Name zipinfo.c MacOS AWX3sm fdNZIP_RC.HQX;1 ZM?iJ=5:E~Z"V>*{iKmJ\+8`brm=~JIr%(giT*,nGA7|.e eo`0)vwiP!Od& _6D%%@\ ^VA;%iZ,1 Z]#mhgmW0Q9"kt+WmaKu@WK7|/f*e]DYB+np-&>-a.N7FBhn=[.us9z\fFhC#0~o2Oo($ ~G5E5V mVt~",8}o] XQ`}h63 4Le$mw~~V *t8] l:3\XW2p9XBy XXI##A-W1V+h.N2,O/Vj,he7F#'UvVW90ov0c&$@ DPg1zH_' ~`6 hjtPl-JYPO =?4 [`X$g#.$'cY`~y J]+27ewKGR7AVw ?yiSq}gG,SLW{<[i4'NCPHY99/ : 1Ypl~ >%4'xEN6.!37aWq6/YdGEU[YQhI9nRM(I!CZV#Www>UDm.|tpv~9F zE(eXLvPIO^&\}5TOyiL73W-'izFZ]u@Vk+KhpyY\yn `aZJo S_p^d4q&m{8jU5ltg&tuhe#/}oc(g&pjMu)LKv+?Z  N?+6 BrY:M>Jdh52}g Iy|B\*#a6+D!Lau7Ew|)U+;W5pE?{_33Ysu@-I4lS>ur+uUi +? F<g~f7%;wT lhS9JG7_HXc[$} A0!)L}Y$PSd@$Og$V=A]TYDqRY"^b|,ljN0+2G% ||'I As? n011es%Z#F; d vLPwI$Dtm9-,WhMU(4Rqde&: jei0 j~m4a!M4EhCY olJTl5-vA@u :}i92byzst;DKPHZq~uMf-{wA6hti'2p*-"}T!}LCbacQ$`{yK38>]*](la2B4"YdR~|8.(|* C6E=E(G;UDC]yF\=vF ISgQzWR3,5l9*oojCn;{]f/ZkCIPKaohr*Yc^ E0uX,fdJf.S}NHb*4KaP$ %0hsG M?>vfHH4J\HBV~( \2p A$8 urm5~6v,iuQQoP?H}u6bK|Jn9GVAvlUI` 8GKdVO;fB^{1bxtN\[{@j5xtNkc`8NQ9i?XV@ 7 Q C*/ymH $BiD4_F(R):AtMw0>9\QCgW<]/A 7ux{z;;>K#rlxZTbM> cEDQ+$]pt Jx+ 'BIua:a?Br@\O{,>j,j AfpG/}0EZK\m@#_ !cm ryoOi< T-1,Dm-m)1)"3XH'0ZghsH{j&_Q_A,a_h-3V{>@,5qA +`e(Sd lR 8qA@:2a8N>1kCABTi n]*FYv\zc:QW7m--K^ZARuLFMD3Jho)W _ #aJFv)(ub_:+oiR~2!w*AEH]#&N'Q44ea9DeGB$TBE=jsYRU6D?^zkCkz)~j-\h*xV<||zi-^ U}Lgf/k)q<40P{ *q03/o6k(SxG )GCgvscdqTll}\D \,D.3a=.`Wg~Qct3OSY)}Bp@plY\#|capP=HFL_Tk,Uv$,;7Kv[=I_t~[V[!t>kjc $N gP't[ rl.& \DNy9 |ZPBf^Ov4Z 2Wx_@A6`g8 |B94nk <-;:w-7};3V)fA9;|=&5$&P+0:['7V VQ0tb:8ykgp )kL*S#vbb- ~dWt m@J_ / tP\/a1QheEK\$Z4Bs@E6:sn7x & )Zzeu|wEW>=6^WfjPR_(C)#?ywo(7\#u}<\jSR4u<]PU+w]D(! BASREPKKQFQ#3Z"v\}(aic1qt[bVJyjpg7 I`UN pV>LM}6i$Kf5/@K= 4h_LaHAb'@gQ{8r)\`dv`zaF.ho !RR[ed.eT&{f\Af (z!i8V[Y  k );GHB =7Ez x (}/`1 ^T9cAN62+n}g (V',d+Q||V*e38Vzq`mtMF ;7M /A!q8DSu~LnKGW3{Xbs}H!9Q*U~(20l T.~ig/>w`;i#XZ[:O&j}]B;J.-JvOlG>Ks,vNDL]oYSynDJ+SXTj< Fs~LK||r$4CIU?:-z3$I|>&&3Q c|"XY 9BQ>2=uon8Flswi{7*Oo tdE{ ^BBVCay-|V_G/FKYhWC_@35gf.uDvyGecCsY?4 KQ1Z#U $ekb4N.W+v c9o:%;e,ohLXR. `~JloK7' oC; {sFyGp=^'0G*qc_&Y nx};\"/YH\]F~QI\o{t,)e^)|*l-P\$L6_QhY/>#5F93%h N4lJxRd-$%.; D"/X"C-s~K ,GkVpX_9r&,8Vm`ee<"lY 6YA{u(AK_;yGmuX~FSof* 1k+q,D$(i-#n[;oR]Y0Lx/A~U\3*~9SwbrW jkepNOvic~#iN,=-G)&eu\o%]Rw':rF%!RDLl~!W<n{- #u}c?LFd`=Yl.}9 ky|q?TS>0j2y8-H)RH% 55&-8jpg9T#Cza9:{xg;{_b =JdP[=UFEYoVGE(}ox@8RW:< aTJ\CZZo#LWY5M_@&!C!n::0+#}|)5t]D)nf`'hFH%(LS{1-`?~5;%(C#SI0;i[w`'qfd sAgX3i3%'O 1T 2,,d!6n/Bt]L{=d>*MP:/!4GHw-G"qjOaPB}9mU_gMb1 P~yYF$`NSRi$F.'}:ZDwgkt|  l7t0b7;USEV?>)!H_RAka^|+t(-$09" =j"" g -&NP)RDEEC9pG+,HE4eu~2L9+Lcx3O[%?K,9OFrDZx_i?Dv wUPaLVQ_jhY?2ome|`M:+6f{^2jDE:;uT)nrqu bhRb7_ KHs *N|\'! 74/sdGIqm1B ev,>\^8Xbw5m2BJ27u*a{GQLs7KrBw(\Pr[BAngN9pE NjpD:+>D! ^aULwi f >$!_ai)5Ok)U'4J W=!2(sa %_m3/11Q,2agG> IdY`r  {:AL;OV*[ JiXhi KhvaFU;^Z] *L,IwMJ1$QL2n,--\xCcG5E Z X[{t DO?w`=Po=SnD<:%QZmj Fm({+:Q yPZ#$?r ?o&kr~qcy(>z@nD,70/,"K;?~[%be[2X-?^gSnmM2F9]okYw&'UmDq9Gt0}\ `aQ >*(xKUdJQx8%cKNbnycTj'WF\AAE9 pKX%iI:u1 |iMN(`8TmBb""bunfba'Wz8:n:d_.SX^2ID=v ` O65"9eGx,{sHj1Z`+3i5]h^S~,K=!!)WOl1XkImjJm-Skc y EQ`.>6@zO&U*^C{h8&<\WpnzoyI{R$46`:X&`W R>4|>1(H] y;:Y>8azc&3 =b1|+&e$*3*._zk ocxx(.tN`s mB&dm!W]9U^I>#?%3T=% 3Oe 0~SpUBl>)CQ!c:J4peG\(Umbyd]L }VV?Qg acvT?}p_y."=@ &1nwww"V^IgS|N*X ^ s`meq"8-on.*4q|V"uFlo=! 5 z6N?m/ il!c{o{ <^Dr@ykGl eKtlY\3s!w PFP(VH3X +ws!F,Uny0G?Jy}dUDI*;!Y7KNF6o}(4;Q"4z[7 zW{SsR^Xt$J ^'p Z?Zf'DK0~qXs 0-% j%bnytBUN.93|n<q|t?hF'2Q2_HAm sx, WdFYl]#"M ,G6CmgkXxEPh~nscyM49X}:/Wj 5x=v%~r &'`:Ev< B,4\Z1^JI bp RZND+bText Name inflate.c MacOS Text Name process.c MacOS Text Name unshrink.c MacOS Text Name unreduce.c MacOS Text Name unzpriv.h MacOS Text Name macdir.c MacOS Text Name crc32.c MacOS Text Name crypt.c MacOS Text Name ttyio.c MacOS Text Name envargs.c MacOS Text Name helpers.c MacOS Text Name helpers.h MacOS Text Name macstuff.h MacOS Text Name pathname.c MacOS Text Name pathname.h MacOS Text Name maccfg.h MacOS Text Name sxunzip.c MacOS Text Name UnZpSx.h MacOS Text Name mactime.c MacOS Text Name macstat.c MacOS Text Name macstat.h MacOS Text Name unzip.rc MacOS Resource Name charmap.h MacOS Text Name FSp_fopen.c MacOS Text Name getenv.c MacOS Text Name macos.c MacOS Text Name macbin3.h MacOS Text Name macbin3W| UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t.c MacOS Text Name MSL Runtime68K.Lib MacOS Library Name MacOS.lib MacOS Library Name MathLib68K (2i).Lib MacOS Library Name DirectoryCopy.h MacOS Text Name FileCopy.h MacOS Text Name FSpCompat.h MacOS Text Name FullPath.h MacOS Text Name IterateDirectory.h MacOS Text Name MoreDesktopMgr.h MacOS Text Name MoreFiles.h MacOS Text Name MoreFilesExtras.h MacOS Text Name Optimization.h MacOS Text Name OptimizationEnd.h MacOS Text Name Search.h MacOS Text First Segment Protected, Locked Name inflate.h MacOS Name globals.h MacOS Name unzip.h MacOS Name unzip.c MacOS Name explode.c MacOS Name extract.c MacOS Name fileio.c MacOS Name list.c MacOS Name globals.c MacOS Name match.c MacOS Name zipinfo.c MacOS Name inflate.c MacOS Name process.c MacOS Name unshrink.c MacOS Name unreduce.c MacOS Name unzpriv.h MacOS Name macdir.c MacOS Name crc32.c MacOS Name crypt.c MacOS Name ttyio.c MacOS Name envargs.c MacOS Name helpers.c MacOS Name helpers.h MacOS Name macstuff.h MacOS Name pathname.c MacOS Name pathname.h MacOS Name maccfg.h MacOS Name sxunzip.c MacOS Name UnZpSx.h MacOS Name macstat.c MacOS Name macstat.h MacOS Name charmap.h MacOS Name FSp_fopen.c MacOS Name getenv.c MacOS Name mactime.c MacOS Name unzip.rc MacOS Name macos.c MacOS Name macbin3.h MacOS Name macbin3.c MacOS Name MSL Runtime68K.Lib MacOS Name MacOS.lib MacOS Name MathLib68K (2i).Lib MacOS Name DirectoryCopy.h MacOS Name FileCopy.h MacOS Name FSpCompat.h MacOS Name FullPath.h MacOS Name IterateDirectory.h MacOS Name MoreDesktopMgr.h MacOS Name MoreFiles.h MacOS Name MoreFilesExtras.h MacOS Name Optimization.h MacOS Name OptimizationEnd.h fMu UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t| MacOS Name Search.h MacOS Unzip Sioux (PPC) UserSourceTrees CustomColor1 Red0 Green32767 Blue0 CustomColor2 Red0 Green32767 Blue0 CustomColor3 Red0 Green32767 Blue0 CustomColor4 Red0 Green32767 Blue0 AlwaysSearchUserPathsfalse InterpretDOSAndUnixPathsfalse UserSearchPaths SearchPath Path: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::izshr:macos: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:CHeaders: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:PascalInterfaces: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:Sources: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SystemSearchPaths SearchPath Path:MSL: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path:MacOS Support: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll LinkerMacOS PPC Linker PreLinker PostLinker TargetnameUnzip Sioux (PPC) OutputDirectory Path: PathFormatMacOS PathRootProject SaveEntriesUsingRelativePathsfalse FileMappings FileTypeAPPL FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeAppl FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeMMLB FileExtension CompilerLib Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMPLF FileExtension CompilerLib Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMWCD FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeRSRC FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeTEXT FileExtension.bh CompilerBalloon Help Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c++ CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cc CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cp CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cpp CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.exp Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.h CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMaketrue FileTypeTEXT FileExtension.p CompilerMW Pascal PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pas CompilerMW Pascal PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch CompilerMW C/C++ PPC Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch++ CompilerMW C/C++ PPC Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.ppu CompilerMW Pascal PPC Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.r CompilerRez Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.s CompilerPPCAsm Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeXCOF FileExtension CompilerXCOFF Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypedocu FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypersrc FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeshlb FileExtension CompilerPEF Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypestub FileExtension CompilerPEF Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileExtension.doc Compiler Precompilefalse Launchabletrue ResourceFilefalse IgnoredByMaketrue CacheModDatestrue ActivateBrowsertrue DumpBrowserInfofalse CacheSubprojectstrue UseThirdPartyDebuggerfalse DebuggerCommandLine Debugger Runtime 0002000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000 LogSystemMessagestrue AutoTargetDLLsfalse StopAtWatchpointstrue PauseWhileRunningfalse PauseInterval5 PauseUIFlags0 AltExePath  UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t Path PathFormatGeneric PathRootAbsolute StopAtTempBPOnLaunchtrue CacheSymbolicstrue TempBPFunctionNamemain TempBPTypefalse MWCodeGen_68K_codesizeSmart MWCodeGen_68K_structalignmentMC68K MWCodeGen_68K_fp_modeSANE MWCodeGen_68K_code680200 MWCodeGen_68K_profiler0 MWCodeGen_68K_mpwc0 MWCodeGen_68K_fourbyteints1 MWCodeGen_68K_IEEEdoubles1 MWCodeGen_68K_fardata1 MWCodeGen_68K_farvtables1 MWCodeGen_68K_farstrings1 MWCodeGen_68K_pcrelstrings0 MWCodeGen_68K_macsbugNew MWCodeGen_68K_a6frames1 MWDisassembler_68K_showcode1 MWDisassembler_68K_mix0 MWDisassembler_68K_nohex0 MWDisassembler_68K_showdata1 MWDisassembler_68K_showexceptions1 MWDisassembler_68K_showsym0 MWDisassembler_68K_shownames1 GlobalOptimizer_68K_optimizationlevelLevel0 GlobalOptimizer_68K_optforSpeed MWLinker_68K_linksym1 MWLinker_68K_symfullpath1 MWLinker_68K_linksingle0 MWLinker_68K_fastlink1 MWLinker_68K_generateMap0 MWLinker_68K_nolinkwarnings0 MWLinker_68K_glueintosegone1 MWLinker_68K_dontdeadstripinitcode0 MWProject_68K_typeApplication MWProject_68K_outfileToolbox68k.out MWProject_68K_symfilename MWProject_68K_filecreator1061109567 MWProject_68K_filetype1095782476 MWProject_68K_size384 MWProject_68K_flags22688 MWProject_68K_rsrcheaderStandard MWProject_68K_rsrcname MWProject_68K_rsrctype1061109567 MWProject_68K_rsrcid0 MWProject_68K_rsrcmulti0 MWProject_68K_rsrcstore0 MWProject_68K_rsrcmerge0 MWProject_68K_rsrcflags0 MWProject_68K_a40 MWProject_68K_minsize384 MWProject_68K_rsrcsegtype0 MWProject_68K_cfm68kcodegen0 MWProject_68K_stacksize0 MWProject_68K_thedebugger0 MWProject_68K_rsrc_custom0 MWProject_68K_is_rseg_app0 MWProject_68K_is_pilot_lib0 MWProject_68K_pilot_main_entry MWFrontEnd_C_cplusplus0 MWFrontEnd_C_checkprotos1 MWFrontEnd_C_arm0 MWFrontEnd_C_trigraphs1 MWFrontEnd_C_onlystdkeywords0 MWFrontEnd_C_enumsalwaysint0 MWFrontEnd_C_mpwpointerstyle0 MWFrontEnd_C_prefixnameUnZpSx.h MWFrontEnd_C_ansistrict1 MWFrontEnd_C_mpwcnewline0 MWFrontEnd_C_wchar_type1 MWFrontEnd_C_enableexceptions0 MWFrontEnd_C_dontreusestrings0 MWFrontEnd_C_poolstrings0 MWFrontEnd_C_dontinline0 MWFrontEnd_C_useRTTI0 MWFrontEnd_C_multibyteaware0 MWFrontEnd_C_unsignedchars0 MWFrontEnd_C_autoinline0 MWFrontEnd_C_booltruefalse1 MWFrontEnd_C_direct_to_som0 MWFrontEnd_C_som_env_check0 MWFrontEnd_C_alwaysinline0 MWFrontEnd_C_inlinelevel0 MWFrontEnd_C_ecplusplus0 MWFrontEnd_C_objective_c0 MWFrontEnd_C_defer_codegen0 MWWarning_C_warn_illpragma0 MWWarning_C_warn_emptydecl0 MWWarning_C_warn_possunwant0 MWWarning_C_warn_unusedvar0 MWWarning_C_warn_unusedarg0 MWWarning_C_warn_extracomma0 MWWarning_C_pedantic0 MWWarning_C_warningerrors0 MWWarning_C_warn_hidevirtual0 MWWarning_C_warn_implicitconv0 MWWarning_C_warn_notinlined0 MWWarning_C_warn_structclass0 MWCFM68K_exportsNone MWCFM68K_olddefversion0 MWCFM68K_oldimpversion0 MWCFM68K_currentversion0 MWCFM68K_farthreshold256 PCFM68K_sharedata0 MWCFM68K_fragmentname MWCFM68K_initname MWCFM68K_mainname__start MWCFM68K_termname MWCFM68K_libfolder0 MWCFM68K_alignmentAlign_2 MWFTP_Post_hostName MWFTP_Post_username MWFTP_Post_password MWFTP_Post_remoteDir MWFTP_Post_uploadDir MWFTP_Post_ftp_port21 MWFTP_Post_SendBin1 MWFTP_Post_ShouldLog1 MWCommandLine_Java_clsName MWCommandLine_Java_args MWJava_Language_optimize0 MWJava_Language_warnDeprecated0 MWJava_Language_emitMap0 MWJava_Language_strictFileNames0 MWJava_Language_strictFileHierarchy0 MWJava_Language_emitHeadersNoNativeHeaders MWJava_Language_packageFilter MWJava_Language_genComments1 MWJava_Language_genHeaders0 MWJava_MacOS_typeJBindery MWJava_MacOS_grow0 MWJava_MacOS_profile0 MWJava_MacOS_verify0 MWJava_MacOS_useHttpProxy0 MWJava_MacOS_useFTPProxy0 MWJava_MacOS_useFirewallProxy0 MWJava_MacOS_outfileJBoundApp MWJava_MacOS_outcreator1061109567 MWJava_MacOS_maxMem1048576 MWJava_MacOS_minMem524288 MWJava_MacOS_red65535 MWJava_MacOS_green65535 MWJava_MacOS_blue65535 MWJava_MacOS_stdoutType1464421956 MWJava_MacOS_stdinType1853189228 MWJava_MacOS_httpProxyPort0 MWJava_MacOS_fTPProxyPort0 MWJava_MacOS_firewallProxyPort0 MWJava_MacOS_httpProxy MWJava_MacOS_fTPProxy MWJava_MacOS_firewallProxy MWJava_MacOS_merge0 MWJava_MacOS_write_old_rsrcs1 MWJava_MacOS_jbindrundebug0 MWJava_MacOS_stdoutfile MWJava_MacOS_stdinfile MWJava_Output_outputtypeJarFile MWJava_Output_outfileJavaClasses.jar MWJava_Output_ftype1514754080 MWJava_Output_fcreator1297570384 MWJava_Output_compress0 MWJava_Output_genManifest0 MWJava_Output_trunctypeFront MWJava_Output_deleteClasses0 MWJava_Output_consoleApp1 MWJava_Proj_projtypeApplet MWJava_Proj_runtimeArgs MWJava_Proj_mainClassName MWJava_Proj_HTMLAppCreator1297303877 MWJava_Proj_HTMLAppNameInternet Explorer MWJava_Proj_HTMLAppWin32NameIexplore.exe MWJava_Proj_compress0 MWJava_Proj_useVM1 MWJava_Proj_workingDir MWJava_Proj_vmarguments MWJava_Proj_vmName MWJavaDoc_Proj_Version1 MWJavaDoc_Proj_Depricated0 MWJavaDoc_Proj_Author1 MWJavaDoc_Proj_Index1 MWJavaDoc_Proj_Tree1 MWJavaDoc_Proj_SunResolveToSame1 MWJavaDoc_Proj_Shortnames1 MWJavaDoc_Proj_Folder0 MWJavaDoc_Proj_GenerateAPILinks0 MWJavaDoc_Proj_scopePublic MWJavaDoc_Proj_fcreator1297303877 MWJavaDoc_Proj_encodingName MWJavaDoc_Proj_decodingName MWJavaDoc_Proj_javaPackagePathhttp://java.sun.com/products/jdk/1.1/docs/api/ MWMerge_MacOS_projectTypeApplication MWMerge_MacOS_outputNameMerge Out MWMerge_MacOS_outputCreator1061109567 MWMerge_MacOS_outputType1095782476 MWMerge_MacOS_suppressWarning0 MWMerge_MacOS_copyFragments1 MWMerge_MacOS_copyResources1 MWMerge_MacOS_skipResources a MWCodeGen_PPC_structalignmentPPC MWCodeGen_PPC_tracebacktablesInline MWCodeGen_PPC_processorGeneric MWCodeGen_PPC_readonlystrings0 MWCodeGen_PPC_tocdata1 MWCodeGen_PPC_profiler0 MWCodeGen_PPC_fpcontract1 MWCodeGen_PPC_schedule0 MWCodeGen_PPC_peephole0 MWCodeGen_PPC_processorspecific0 MWCodeGen_PPC_altivec0 MWCodeGen_PPC_vectortocdata0 MWCodeGen_PPC_vrsave0 MWDisassembler_PPC_showcode1 MWDisassembler_PPC_extended1 MWDisassembler_PPC_mix0 MWDisassembler_PPC_nohex0 MWDisassembler_PPC_showdata1 MWDisassembler_PPC_showexceptions1 MWDisassembler_PPC_showsym0 MWDisassembler_PPC_shownames1 GlobalOptimizer_PPC_optimizationlevelLevel0 GlobalOptimizer_PPC_optforSpeed MWLinker_PPC_linksym0 MWLinker_PPC_symfullpath1 MWLinker_PPC_linkmap0 MWLinker_PPC_nolinkwarnings0 MWLinker_PPC_dontdeadstripinitcode0 MWLinker_PPC_permitmultdefs1 MWLinker_PPC_linkmodeFast MWLinker_PPC_initname MWLinker_PPC_mainname__start MWLinker_PPC_termname MWPEF_exportsNone MWPEF_libfolder0 MWPEF_sortcodeNone MWPEF_expandbss T@D,L(BoRi `RzWkh PQWG*Z6Y{-MEr>9N  /\p")/mzC,Be ~^Lexqv,ic^zCfAxx=MIv0G,Mq3?t: 9:-K>*? NU|6<3UU[Ig6D[O10K_*x;ls PW6bQHeI' 7R-ZxL{3)L-} :yh-jb'E-{_C$B,[;z1U6x88m *Qx?feqV: d5ynaW5J#PNL@)mC)Z~{~z_WeFWPn*[#W(pzPnajIGO kQ8n3TQ8Yp$y:P&U#y_OX[pU+i?PfU%t0z<2;]loU8LZ 4Oi[&)%E0jHPfC65x-M\=bZ84{f<|dA<JSpEJ+[7-1+q=HVZ*~NeL3k<=!k?x:+'r!x>Z1UqUf:qMPJarj z{E@1lPR CR92h{!6VgqLS|FIfdo.r ;:. gZ^Kgujb0UVvGO XNa=SWd rvP`efr`z3~jU^^:~V=AkW5`?+'zpn']EgGfaPby-Nd: n3-tWK~d`rveU?9!@V"mIm1lX,pq}8oKPC8~Q%)J8 rm?[qj"pz ef0"l1K>mtsa`YOS5M_/39j.mE(]B-1Dd.+_8@_H"`h$GU{!Fan60%'a<{AmltuenR)XRH\EE @7{ali/Q ZIf)1+b`%4%h1_BIBrxt @Ub0Veb %eTz~-cBl*rDTa9*A'EK#(JVZxV$K-LW05g^}PTZ)^,"vS*6Q2#Y5(xS !v6%ioi/\lSl}n~!1wqLqC5)_,Sn$8rqqyRbb kg+jSQ`C$wNbSxq=/~f'm ^|i_" ui,Kz RP3pObq#Se(%J#c!0B282o ]fJ"K'9 `U|5v8c6]:d|V ~clUEL\}pq Yt<^\U~K?z,rhpLq{hnkbm ;F#A$B2?"4rH^ %vyEUBO5iU=8w _ M;"`^   keMS/a )\+v0dS.R/{Z* @a#c`ocqpI!2@3HI7tbRAq2?k'6E1h9('xA>O :tYqzJ#>=TW#L\LB_Ro)1]f`N>`aNhf6jHZ[~S >9hfPIC;RiU^KmXLb]]J58&i h!1C=)X$Vjm$7zkN)rG@u#$6H2ZZD d< 8j+'P`v;/=G B`M$_7_Q+4]I1T5S2'u,L}CcsGG4w Vz10D9gMZDs#0 ?LY8q"Qo(HcH~V hxWhTq :I1qi`14%=aCs$jh=c;iI.,s^3*<]]qoeLb?oz`P-LrS0 i|>lp-OCokGK*USkTN9!te}H.v99&6 UOx\uT{GkW>RXLI%\o~aU& mP n"&f=M4;I&T`)Cjo59D|v]6~ QZ'LuyWS?koq)432gbK\HQ$&YbicjpcuwF- PrqJ:mQojstjx`fe+} M l~gvbj."BPkghjPrJv;$@Wxr$7Y"`dd95W9$qo~b({z%fc860EG,\89* G.) yb s6 yx3N@KEYZDU2 ?GVv Ni=d E!]@|aD+Q3Tngzy?,T<|6GiZ^:403n65lc!l K}t sa`?!Q4&xeRCdhou76GE? ghyTT`/=2uo]D|o;'UBqX#t#y|ln}`'*A^Ka&x 8:Vah zfGb Oj8_dE@|n#,)6*XN9H;V@v%VU6FIL!a)(;C.*fsn[9G:+7aFGc}h>te%X{Z RLl{K:S9q+;KwXL[n5; /Eb]bWu W9~G-?tzu}6P=3Xwr bxM%oJ MsIs>%O_`+|nm`lggz_e4FuR":4e2IGK@!$)H qg7MBwoe]}qlm$}5ejR+ J^sG8||xcpCV(v@@<8f4UyvM &aGEI dm y QPV6jZOp^K2*KuR"5Nu/up&kEal6~h&_ <@^ {8 q)zlpA4LHGH= )Nz$}/N|%~ mw\RA?GA6d"P]JTR6{_7N,EDqn`%z j-t" ]<$>8O!i(.\w&8c3pLqxfV.SXkM$#jGE%)(_#,LHbf~F$E^(R{ Rn}^aKvy m(cMEZe*sMV$D4w n`fM@fqVo:2!|r{ bHw89hKv%#S[{%`el #"),$ d ` fL2[]D&Nr dbwx B=+g  g2{2Ksvhms 3 aYU]fFONT/=Ri&aCx_gk=CnK@Hhp,>(gsh mH{HMc~c\]0\i4Kir3cu? Z{r^eSDT7H:o>#RNO/^ KX(v[]p|U,JnR{`e:q m`f2bT$s;oujie<]attdD6|kCqCZnG\)"23-C\8OEJOyK)46Zif@#AUL.k/k~2{ols~/4Ym],T h@ A.%)-[\ 1;5(  `N#J[jtYBk gZt^gid1MRpgr{d+|7W7?52[E'ihzyu\A}Li8M3t[ho~D3sqppD2._z%%iEq8mC$~kQM+20DfNS,>-27Xg15S~reYtGec?k j"Vj -tt~{s+ d#.^ bVlKNjiXB\T3No`_h B+T$nu_mZ5 '&5+.;? %YNr lD;cfcV,^ QQGN\RGLu[4vU k[?W y' Uz0EgKi69O8P+K %}JI=5Rtlp7J!]}cS+5zq^%p.fj|5<SL/)euD@hkiu/8jcb"% ;uspe|kgE-0{dan]\A F 9iJomgq4P tI`pm~JW`ptqm ck1Sh0A:Z=n . ]e`tfze~:Cn^* .bwA^V}K#8gC`5-b6(Fa:iaS'7LF~a5NLxj{wsk&= ziLVv6GF)G(FU|ubvgg0vo?lA 9vB0 0ynaxu|wag``gXg tcol5C/B:Z/}$a2 #]./GIh4Jt|JFHMWJ3rzPV_;R75md` %Nf L"WiY ^|>sON^.Av %VK6-kfF"Zt&gZfAy(}1ol 9o7:hz%KS 7* jdkC-SqzFd[+2,2>6tx:M\u}WWo6<;/Ke  i_5B\0e<Qf >pZ I /UaK 5/I(`dg6 <5rguF`erNQgK+sX.8<^@dAA~$3`$kq>:9M<l)q}H#xr:R_&,@tGo o}`j!_=C!VNcP-M'j+Om xo#po~c/iiZBkgy2 {`d$PRg)csG({Eg9ghwgJn_8S'=aR_JPU^6,Bjv{OT%$-C@s; n=yrn1H`joZ.>"' Nxw.0V[v3E6A9 bW>fqQVrwCv~@T!?)xg)32UU\Pf^~BN^pZta9l9kO0SgHhJ:K>IZ']OSF<)_Dawfh{7v du:fkE7^`EQ$r_c=M= rk]i}d7"!.ef0 !SL`8V2k2U GSjD+ 8'+FH/v $)Nd7 oDl#`#DZyNw0q#Gjs(xPPAZI.q(qu0+:.uH-EHcyHh~DDr^nfO;K<\jIO#(rt.Q.`J))bRg\C\2HooLbC2~m|=q \>u^xwyGJLT_QfcLW"/6% ?+@E5U7ZDg{W!6k)$lx~fNTo5Z*<\&%y7r]SP(w4?eCH97GL{hYUrgnI 3!kGg9^+B'*P^J$ dt_6T c\5P.9K6GmDX\O_eW;EZ[O#D\.6q>xvGj|$Ef)L{[ t17$:c+BCW'ln ~}gvhi{,F:ID'a"c@8&b5Y96%;Z%Un#3u;KOSdqlXusV0O.o:*00.EX(YD]lzcZQ k! 0]C#M4m :4T*?M@&|O?M5a-{uo n%8=KQT&S\?T=O:O-,{xhEQkd OWV.;B:f iQz8{tp.XuzJiJfc;P*X4i44Yc\, C3,D7{tS3wRun_W =5%iCYr"mu+V\>}hkfs x9hYB6;.?!0= ^=9&;"(v8622b&,&jD,l6R.zVAgC1&?}d.{EQX-96v\opu ggr O&xmM4p##f.6$9E lb)+&Y#B1S)0tVd(E +_]7L-d.&Mzt|?[6fM s}u kelM<HL @{YvoUw9!M6h"*D/nC,   M1/ k ezb .D P1'l&-:LITMXk>OLcM?`&UIa" vg g"&^FRrX_5\h}oA8rGq ~iQoY%DbBZFHK8ln7K=&dIscw?<j{}2kiUsa<Gi0eo'5#'!t= f,tp)> _ !vHx$Z[_+{{xHOxX.RVWwq;j LAg^olcIIncY$ sc8PQ1L`3sjzLd}=LB5H<lE86GUzd68I >/}>EZPK_~p-[YS"p-e|7Z}U+~""w j)LOL < ?!\2psm2ikGFB+O OsaH# AG/"!k vy@62OBgc]!7pw;.o^hTz6sA.n% jgpwo`bqu?ih|=SXlzRUUDm!znu U1N/)%_6Kd/ YoOib~h}r84Cs&'?zqrJC JjWOD<&ikZ1I:LAk?"Dh2XhMoQghua 9Z b Y`:&0-CV0Yjw9NhIWZ?[otdR%@M$(Y|]edk.d-VCB#{&wxpwp;HTO]Nl8RbX4*u8Nik]Yy$k"8'.)Q5~V8)EA7M$#dx`>rbSD;4~f0k:@\DOedf)+aJw cRqx Q aLkP UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tpE>0 MWPEF_sharedata0 MWPEF_olddefversion0 MWPEF_oldimpversion0 MWPEF_currentversion0 MWPEF_fragmentname MWPEF_collapsereloads0 MWProject_PPC_typeApplication MWProject_PPC_outfileUnzip Sioux (PPC) MWProject_PPC_filecreator1230662000 MWProject_PPC_filetype1095782476 MWProject_PPC_size2048 MWProject_PPC_minsize1024 MWProject_PPC_stacksize512 MWProject_PPC_flags22720 MWProject_PPC_symfilename MWProject_PPC_rsrcname MWProject_PPC_rsrcheaderNative MWProject_PPC_rsrctype1061109567 MWProject_PPC_rsrcid0 MWProject_PPC_rsrcflags0 MWProject_PPC_rsrcstore0 MWProject_PPC_rsrcmerge0 MWAssembler_PPC_auxheader0 MWAssembler_PPC_symmodeMac MWAssembler_PPC_dialectPPC MWAssembler_PPC_prefixfile MWAssembler_PPC_typecheck0 MWAssembler_PPC_warnings0 MWAssembler_PPC_casesensitive0 MWRez_Language_maxwidth80 MWRez_Language_scriptRoman MWRez_Language_alignmentAlign1 MWRez_Language_filtermodeFilterSkip MWRez_Language_suppresswarnings0 MWRez_Language_escapecontrolchars1 MWRez_Language_prefixname MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' Name MSL C.PPC.Lib MacOS Library Name MSL C++.PPC.Lib MacOS Library Name InterfaceLib MacOS Library Name MathLib MacOS Library Name MSL RuntimePPC.Lib MacOS Library Name MSL SIOUX.PPC.Lib MacOS Library Debug Name inflate.h MacOS Text Name globals.h MacOS Text Name unzip.h MacOS Text Name unzip.c MacOS Text Name envargs.c MacOS Text Name explode.c MacOS Text Name extract.c MacOS Text Name fileio.c MacOS Text Name list.c MacOS< s UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t?/PATHFORMAT> Text Name globals.c MacOS Text Name match.c MacOS Text Name zipinfo.c MacOS Text Name inflate.c MacOS Text Name process.c MacOS Text Name unshrink.c MacOS Text Name unreduce.c MacOS Text Name unzpriv.h MacOS Text Name macdir.c MacOS Text Name crc32.c MacOS Text Name crypt.c MacOS Text Name ttyio.c MacOS Text Name helpers.c MacOS Text Name helpers.h MacOS Text Name macstuff.h MacOS Text Name pathname.c MacOS Text Name pathname.h MacOS Text Name maccfg.h MacOS Text Name sxunzip.c MacOS Text Name UnZpSx.h MacOS Text Name mactime.c MacOS Text Name macstat.c MacOS Text Name macstat.h MacOS Text Name unzip.rc MacOS Resource Name charmap.h MacOS Text Name FSp_fopen.c MacOS Text Name getenv.c MacOS Text Name  j UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t. macos.c MacOS Text Name macbin3.h MacOS Text Name macbin3.c MacOS Text Name DirectoryCopy.h MacOS Text Name FileCopy.h MacOS Text Name FSpCompat.h MacOS Text Name FullPath.h MacOS Text Name IterateDirectory.h MacOS Text Name MoreDesktopMgr.h MacOS Text Name MoreFiles.h MacOS Text Name MoreFilesExtras.h MacOS Text Name Optimization.h MacOS Text Name OptimizationEnd.h MacOS Text Name Search.h MacOS Text Name inflate.h MacOS Name globals.h MacOS Name unzip.h MacOS Name unzip.c MacOS Name envargs.c MacOS Name explode.c MacOS Name extract.c MacOS Name fileio.c MacOS Name list.c MacOS Name globals.c MacOS Name match.c MacOS Name zipinfo.c MacOS Name inflate.c MacOS Name process.c MacOS Name unshrink.c MacOS Name unreduce.c MacOS Name unzpriv.h MacOS Name macdir.c MacOS Name crc32.c MacOS Name crypt.c  _ UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tt= MacOS Name ttyio.c MacOS Name helpers.c MacOS Name helpers.h MacOS Name macstuff.h MacOS Name pathname.c MacOS Name pathname.h MacOS Name maccfg.h MacOS Name sxunzip.c MacOS Name UnZpSx.h MacOS Name macstat.c MacOS Name macstat.h MacOS Name unzip.rc MacOS Name charmap.h MacOS Name FSp_fopen.c MacOS Name mactime.c MacOS Name getenv.c MacOS Name macos.c MacOS Name macbin3.h MacOS Name macbin3.c MacOS Name MSL SIOUX.PPC.Lib MacOS Name MSL C.PPC.Lib MacOS Name MSL C++.PPC.Lib MacOS Name InterfaceLib MacOS Name MathLib MacOS Name MSL RuntimePPC.Lib MacOS Name DirectoryCopy.h MacOS Name FileCopy.h MacOS Name FSpCompat.h MacOS Name FullPath.h MacOS Name IterateDirectory.h MacOS Name MoreDesktopMgr.h MacOS Name MoreFiles.h MacOS Name MoreFilesExtras.h MacOS Name Optimization.h MacOS Name OptimizationEnd.h MacOS Name Search.h MacOS Unzip Lib (PPC) UserSourceTrees CustomColor1 Red0 Green32767 Blue0 CustomColor2 Red0 Green32767 Blue0 CustomColor3 Red0 Green32767 Blue0 CustomColor4 Red0 Green32767 Blue0 AlwaysSearchUserPathsfalse InterpretDOSAndUnixPathsfalse UserSearchPaths SearchPath Path: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::izshr:macos: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:CHeaders: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:PascalInterfaces: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:Sources: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SystemSearchPaths SearchPath Path:MSL: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path:MacOS Support: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll LinkerMacOS PPC Linker PreLinker PostLinker TargetnameUnzip Lib (PPC) OutputDirectory Path: PathFormatMacOS PathRootProject SaveEntriesUsingRelativePathsfalse FileMappings  UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tM|[ FileTypeAPPL FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeAppl FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeMMLB FileExtension CompilerLib Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMPLF FileExtension CompilerLib Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMWCD FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeRSRC FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeTEXT FileExtension.bh CompilerBalloon Help Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c++ CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cc CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cp CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cpp CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.exp Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.h CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMaketrue FileTypeTEXT FileExtension.p CompilerMW Pascal PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pas CompilerMW Pascal PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch CompilerMW C/C++ PPC Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch++ CompilerMW C/C++ PPC Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.ppu CompilerMW Pascal PPC Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.r CompilerRez Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.s CompilerPPCAsm Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeXCOF FileExtension CompilerXCOFF Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypedocu FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypersrc FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeshlb FileExtension CompilerPEF Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypestub FileExtension CompilerPEF Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileExtension.doc Compiler Precompilefalse Launchabletrue ResourceFilefalse IgnoredByMaketrue CacheModDatestrue ActivateBrowsertrue DumpBrowserInfofalse CacheSubprojectstrue UseThirdPartyDebuggerfalse DebuggerCommandLine Debugger Runtime 0002000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000 LogSystemMessagestrue AutoTargetDLLsfalse StopAtWatchpointstrue PauseWhileRunningfalse PauseInterval5 PauseUIFlags0 AltExePath Path PathFormatGeneric PathRootAbsolute StopAtTempBPOnLaunchtrue CacheSymbolicstrue TempBPFunctionNamemain TempBPTypefalse MWCodeGen_68K_codesizeSmart MWCodeGen_68K_structalignmentMC68K MWCodeGen_68K_fp_modeSANE-ƻ( UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t MWCodeGen_68K_code680200 MWCodeGen_68K_profiler0 MWCodeGen_68K_mpwc0 MWCodeGen_68K_fourbyteints1 MWCodeGen_68K_IEEEdoubles1 MWCodeGen_68K_fardata1 MWCodeGen_68K_farvtables1 MWCodeGen_68K_farstrings1 MWCodeGen_68K_pcrelstrings0 MWCodeGen_68K_macsbugNew MWCodeGen_68K_a6frames1 MWDisassembler_68K_showcode1 MWDisassembler_68K_mix0 MWDisassembler_68K_nohex0 MWDisassembler_68K_showdata1 MWDisassembler_68K_showexceptions1 MWDisassembler_68K_showsym0 MWDisassembler_68K_shownames1 GlobalOptimizer_68K_optimizationlevelLevel0 GlobalOptimizer_68K_optforSpeed MWLinker_68K_linksym1 MWLinker_68K_symfullpath1 MWLinker_68K_linksingle0 MWLinker_68K_fastlink1 MWLinker_68K_generateMap0 MWLinker_68K_nolinkwarnings0 MWLinker_68K_glueintosegone1 MWLinker_68K_dontdeadstripinitcode0 MWProject_68K_typeApplication MWProject_68K_outfileToolbox68k.out MWProject_68K_symfilename MWProject_68K_filecreator1061109567 MWProject_68K_filetype1095782476 MWProject_68K_size384 MWProject_68K_flags22688 MWProject_68K_rsrcheaderStandard MWProject_68K_rsrcname MWProject_68K_rsrctype1061109567 MWProject_68K_rsrcid0 MWProject_68K_rsrcmulti0 MWProject_68K_rsrcstore0 MWProject_68K_rsrcmerge0 MWProject_68K_rsrcflags0 MWProject_68K_a40 MWProject_68K_minsize384 MWProject_68K_rsrcsegtype0 MWProject_68K_cfm68kcodegen0 MWProject_68K_stacksize0 MWProject_68K_thedebugger0 MWProject_68K_rsrc_custom0 MWProject_68K_is_rseg_app0 MWProject_68K_is_pilot_lib0 MWProject_68K_pilot_main_entry MWFrontEnd_C_cplusplus0 MWFrontEnd_C_checkprotos1 MWFrontEnd_C_arm0 MWFrontEnd_C_trigraphs0 MWFrontEnd_C_onlystdkeywords0 MWFrontEnd_C_enumsalwaysint0 MWFrontEnd_C_mpwpointerstyle0 MWFrontEnd_C_prefixnameUnZpLib.h MWFrontEnd_C_ansistrict1 MWFrontEnd_C_mpwcnewline0 MWFrontEnd_C_wchar_type1 MWFrontEnd_C_enableexceptions0 MWFrontEnd_C_dontreusestrings1 MWFrontEnd_C_poolstrings0 MWFrontEnd_C_dontinline0 MWFrontEnd_C_useRTTI0 MWFrontEnd_C_multibyteaware0 MWFrontEnd_C_unsignedchars0 MWFrontEnd_C_autoinline0 MWFrontEnd_C_booltruefalse1 MWFrontEnd_C_direct_to_som0 MWFrontEnd_C_som_env_check0 MWFrontEnd_C_alwaysinline0 MWFrontEnd_C_inlinelevel0 MWFrontEnd_C_ecplusplus0 MWFrontEnd_C_objective_c0 MWFrontEnd_C_defer_codegen0 MWWarning_C_warn_illpragma1< UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tO/SETTING> MWWarning_C_warn_emptydecl1 MWWarning_C_warn_possunwant1 MWWarning_C_warn_unusedvar1 MWWarning_C_warn_unusedarg1 MWWarning_C_warn_extracomma1 MWWarning_C_pedantic1 MWWarning_C_warningerrors0 MWWarning_C_warn_hidevirtual1 MWWarning_C_warn_implicitconv0 MWWarning_C_warn_notinlined1 MWWarning_C_warn_structclass0 MWCFM68K_exportsNone MWCFM68K_olddefversion0 MWCFM68K_oldimpversion0 MWCFM68K_currentversion0 MWCFM68K_farthreshold256 PCFM68K_sharedata0 MWCFM68K_fragmentname MWCFM68K_initname MWCFM68K_mainname__start MWCFM68K_termname MWCFM68K_libfolder0 MWCFM68K_alignmentAlign_2 MWFTP_Post_hostName MWFTP_Post_username MWFTP_Post_password MWFTP_Post_remoteDir MWFTP_Post_uploadDir MWFTP_Post_ftp_port21 MWFTP_Post_SendBin1 MWFTP_Post_ShouldLog1 MWCommandLine_Java_clsName MWCommandLine_Java_args MWJava_Language_optimize0 MWJava_Language_warnDeprecated0 MWJava_Language_emitMap0 MWJava_Language_strictFileNames0 MWJava_Language_strictFileHierarchy0 MWJava_Language_emitHeadersNoNativeHeaders MWJava_Language_packageFilter MWJava_Language_genComments1 MWJava_Language_genHeaders0 MWJava_MacOS_typeJBindery MWJava_MacOS_grow0 MWJava_MacOS_profile0 MWJava_MacOS_verify0 MWJava_MacOS_useHttpProxy0 MWJava_MacOS_useFTPProxy0 MWJava_MacOS_useFirewallProxy0 MWJava_MacOS_outfileJBoundApp MWJava_MacOS_outcreator1061109567 MWJava_MacOS_maxMem1048576 MWJava_MacOS_minMem524288 MWJava_MacOS_red65535 MWJava_MacOS_green65535 MWJava_MacOS_blue65535 MWJava_MacOS_stdoutType1464421956 MWJava_MacOS_stdinType1853189228 MWJava_MacOS_httpProxyPort0 MWJava_MacOS_fTPProxyPort0 MWJava_MacOS_firewallProxyPort0 MWJava_MacOS_httpProxy MWJava_MacOS_fTPProxy MWJava_MacOS_firewallProxy MWJava_MacOS_merge0 MWJava_MacOS_write_old_rsrcs1 MWJava_MacOS_jbindrundebug0 MWJava_MacOS_stdoutfile MWJava_MacOS_stdinfile MWJava_Output_outputtypeJarFile MWJava_Output_outfileJavaClasses.jar MWJava_Output_ftype1514754080 MWJava_Output_fcreator1297570384 MWJava_Output_compress0 MWJava_Output_genManifest0 MWJava_Output_trunctypeFront MWJava_Output_deleteClasses0 MWJava_Output_consoleApp1 MWJava_Proj_projtypeApplet MWJava_Proj_runtimeArgs MWJava_Proj_mainClassName ,< V  \b>J 05zfag)(sL*bP0;tf!E2|psY?n|V;^&L_;1 *[U B3se"M gk Z` `>+87-CUIP,*tZ&) g w|{xpvimo!dYG3E|'u<}f6cP; @(.PI*Bf1MNrg7VbX".S4+srzph w)T[ DAR5n}`W@$ e}y2GepN4'rl vf|eXeo?)AUd 99 ( TZ<vd h^lor!Ue yi t`:PhlQ@[ P']yD 8&mK>O yJ .$Yue/1MBwPcQoPiXt}C##!)9_yHO&Ae@T$XZ Lqq~rkC@)#(&M7 |W/#zzx0p{x.m-zh`6ETM]0,15 -XDD=2{Z;{`}#9)esb}#A{l_,#/ehgbac}\LAfZB)BE#"3fco=U mSM;\b ?z2ONIQ^T<.H,z@&=Nh- m/C0c =W`P7Q6,Y_/J~B* {ezWAb55 _chsv_>'?G :nz1k < )4+ycjq{XvZ=4G{qh~qd\W7-j'7-HWX" c-R: ~H\. ?O>]TP(?+z}c=r[ 4N- +M* (\"<2 20jTHpAY7q/UmbS.5NWA=`G:_)?h`\:\K3ys*w+r aEh% $DKO >-3q0CU< ^=v6[!f g Z,%&B/">h XHXTj3Y&a8l n$h|A*6nsH3'7^)cnAxr/v"WW$Y>GzX&jh.'"n4G18[lD>L@5EPz{ {/o f bDSS{ql;U{b1:]}Zj=":hGFLFqQHy] &gw}&QW}!HJd-WRhJ}vp JJg[T$'+A{Fm)-$A &l}sZRT=;4QS&x]) >wahcxFAh"D 8 d/XMHZfZ-\/_m%Ws#1-Pknn, /F;MeF: )w7@AQCkQ( "~XyZ*-!"a4gij5a~h/iv8<];:jl:hU] bT4*HP[r6?~ro|Yb0,BjP"[JJC zbxs~?@eWBBK"K(cR4._.Xn/4E]I9/O9lN@'|&roT^ro&#"a)(Y%pieo) UF X'Fle!.Jbaa](`<_v Y@0pa1d}/MB+@Ld4e3r_o8y9KZq8:$l HJ6 ,73O6Y$Y~c.m0Bv={C=^{RO1r+N_ dcGsC# )gIN[b&%3( N}#Ot8/XX4LX"L$t!8<1Q0|8(|$:6J| `ivhb[H8/yHM~ ! M=kc$YvvQFXOpqokx'H{\AZ(X8\A'7J)\PN<5C O` $iSnG85tWOiAaT^/<|3g2&]+ 8Z#G{!YzJli D=93#g(et@aPONOW[-k-QxB k_2~SBqk7 .[Yv1bFvQ:R Jgup,(HY ca 8F)({H&b?c)q|aEKP]ypY-T1nf~lY,5'^WWO8`n4VJ%n>Ba+},DZh{aq) -=iW(ifh ~eK>s684vKr"rpo;|c8n2bQ:qIYC}Oj4%r{!iNukKY[-?{pey JU.8eFPo@&|&+YGb?B6>?jQI }U$ u>dvwhuWEO&i3n Y Wla\#.Z#A7 g}Yj_XC6Ci6bo?k{;>JZ!STyrw#y&EJ^9q; #;@dB.BE"6!n6sprq}Gtr gq| }G aE\elhtq(7NnH3po%08K0gx"xrmu]L`cbkx___4ZANG` H^7q1Lfu>l/nW+g_U.E09_esTcrC{:ii4Ex fF%p4&dPWRx61"-5\I!X~ -w^bU8b y089TA=w#8U4[8'XV&YF '02}7,$G$ &x3^C "3 (>MK#G.C<9!+|r,N!5_BtSsf\1T.4 e-ZgVH)yl^ mP c}d#8_t^ntv=`4'Cfp jz.>D fpYlPqyM MS@7B_co}D\q]mXU"K^iX]Yo{\MVJrQ,E*Zi 5fc8?Mr}T 7"I`#F[pX$/~"z #99xbj~wl:EnSV-*xoxEN*l,(-U.]Ab!,[i"GW>r7{^d~kEas{!=# |cixqw|aMUtM ]G\GlS=kt_Z^ pIeB$D"-oM_XM"$9,>VpoxFM"&XXurZ{r47=TdUTFj DS"HR6eePjIjAU+SM ~k3"+ZgFaa) AAokD1cw}6GY?pM MF=D#B*~ynf )x OZ5m~mRK:nP9&1U_{v/RH{\`s*.W)Xy$6v|N<:hc- lg=qHp3kTyl@=28] !)/iU6 E., m[K561~Xz?a?Ryo6H,* \x z`R\&`Zr w9I I59vNqjt*@I `g xd +ZdzIm)MhB%2m $Le29;%VG8~(v +?g?F(DZ8QE4V(oaUj2BAj}_)v InFq'/+6si 3`^I~Rs2M}VOZmWEQ[L=E =;d(Ak# kc'BA<3^hoa2izm{Pk.2VTP.HP@.YOrlx#[U[m!t\q'n'S7;5zU wwZR.2]s'P>2_[0 umOOc1Q&6VQ%{ fr {( c5n'S8}T1\~8y7pav&AS!?]'Zl `4Ez+0 t"X-s1:}$exjQdVL)k{xsZ60N6u *&O,{2tN] J[ k_B !!s  }e'" 1N!9}zDZ 'GC$s1,YMir"aWFt2x Y$5ni+S;0%Xxm?MN)8T!3 .D5Kxx Zu&`q7 oPYk(95O1j!m7'fDv/.#$t/w:Rsrq) eLw"|2MP(R7D|Ktm_elTAE ecRF{!hG 3a{DXKU>(]B{dR%_~Y$>6slgVCE'2A6g!:%6LWqKO/ _aYuhnI3x)PJ;M7dKMG`4#x:0zKAsp.|0] RNfqs_?dca]rzv [=_!2 Pj!/22< Y90%E$C`%N+Ao= KDv_Z('<mT U/i%$ha/6" g6fHa{4V:tqtdQAkC^A/bxhT]~`V{=^ScH{zGN\q~0KFjqX\n29;,VN[oz!,`q4F;';nqg"nB k>.-}vIaH{DdIbaN=3@E6Xova}x~m D> < apPXrV CK fbZWWxTkt0F#dEL>ybppdkgzbb&kHYveNxg [J"](2(rr9k@,?\stE!oz H) lkDxQLO*t da;Ah g2w@ T.w>a7R'xw7#qh G x};A;{zvhJc7BC5}i q25g|0=v2'3 HVTc cxu?p XKF5c=mM*j' :\);l\ y !dNV#0bvMA{J2XUx}*#U 1z t-!k [S3|EZ-b ]3V7-  s)QK 6xyT];%1z[>zMt1-Wn]@OYd}[+(L^-5rL6,lzk%3z&:OUXPuO'Dyvsju~|[@]Frf)#L`fo`Ah Y> KpNl@1:&\uzt==Xl ')-| NsyS} Jq^P^!A L GO{L3}h'6=6O0sV$c7KAhvS{pT4 &rG 79+(D]ZGcJlxGEY\+&OMKt3(/Fx}9bz%~)=Y`;4S4swqynxH=&:.D qI$hOY*6jiuzEs Vv.6 D(,'YYB8,eoj%Xd+y+Ax|qV,M[g FnRPTj5FICVP5A^aZJ ]zP kew pqk3Ghz{k )0rInd p0Q#+8$Jbu8^*nN!@'7jxn!l0%R dne8L lMJgl-2XE'.1J}1FA^RVXvmYH+KV*OejM<1K_ ) ,h|c_7XU.e!MZY)&0Zqr@_| /EC(>2Tf;viot} g6 _|Ck=-0 Maq U18N3S['sbbOB Z0ux Nnp^.4{4Y-nq+#(NDGt/1}x+w@gF5~9EH(C-QX.bs85DhL]f ylZ7bP ]),F~$!D4t2fbvcyGYl(Bhd.d#"$,r?4q!*5R|$ &bP>(9pEGWE^mL*a_c4jfHp)MWJava_Proj_HTMLAppCreator1297303877 MWJava_Proj_HTMLAppNameInternet Explorer MWJava_Proj_HTMLAppWin32NameIexplore.exe MWJava_Proj_compress0 MWJava_Proj_useVM1 MWJava_Proj_workingDir MWJava_Proj_vmarguments MWJava_Proj_vmName MWJavaDoc_Proj_Version1 MWJavaDoc_Proj_Depricated0 MWJavaDoc_Proj_Author1 MWJavaDoc_Proj_Index1 MWJavaDoc_Proj_Tree1 MWJavaDoc_Proj_SunResolveToSame1 MWJavaDoc_Proj_Shortnames1 MWJavaDoc_Proj_Folder0 MWJavaDoc_Proj_GenerateAPILinks0 MWJavaDoc_Proj_scopePublic MWJavaDoc_Proj_fcreator1297303877 MWJavaDoc_Proj_encodingName MWJavaDoc_Proj_decodingName MWJavaDoc_Proj_javaPackagePathhttp://java.sun.com/products/jdk/1.1/docs/api/ MWMerge_MacOS_projectTypeApplication MWMerge_MacOS_outputNameMerge Out MWMerge_MacOS_outputCreator1061109567 MWMerge_MacOS_outputType1095782476 MWMerge_MacOS_suppressWarning0 MWMerge_MacOS_copyFragments1 MWMerge_MacOS_copyResources1 MWMerge_MacOS_skipResources a MWCodeGen_PPC_structalignmentPPC MWCodeGen_PPC_tracebacktablesInline MWCodeGen_PPC_processorP603e MWCodeGen_PPC_readonlystrings0 MWCodeGen_PPC_tocdata1 MWCodeGen_PPC_profiler0 MWCodeGen_PPC_fpcontract1 MWCodeGen_PPC_schedule1 MWCodeGen_PPC_peephole1 MWCodeGen_PPC_processorspecific0 MWCodeGen_PPC_altivec0 MWCodeGen_PPC_vectortocdata0 MWCodeGen_PPC_vrsave0 MWDisassembler_PPC_showcode1 MWDisassembler_PPC_extended1 MWDisassembler_PPC_mix0 MWDisassembler_PPC_nohex0 MWDisassembler_PPC_showdata1 MWDisassembler_PPC_showexceptions1 MWDisassembler_PPC_showsym0 MWDisassembler_PPC_shownames1 GlobalOptimizer_PPC_optimizationlevelLevel4 GlobalOptimizer_PPC_optforSpeed MWLinker_PPC_linksym0 MWLinker_PPC_symfullpath1 MWLinker_PPC_linkmap0 MWLinker_PPC_nolinkwarnings0 MWLinker_PPC_dontdeadstripinitcode0 MWLinker_PPC_permitmultdefs1 MWLinker_PPC_linkmodeFast MWLinker_PPC_initname MWLinker_PPC_mainname__start MWLinker_PPC_termname MWPEF_exportsNone MWPEF_libfolder0 MWPEF_sortcodeNone MWPEF_expandbss0 MWPEF_sharedata0 MWPEF_olddefversion0 MWPEF_oldimpversion0 MWPEF_currentversion0 MWPEF_fragmentname MWPEF_collapsereloads0 MWProject_PPC_typeLibrary MWProject_PPC_outfileUnzip Lib (PPC) MWProject_PPC_filecreator1061109567 MWProject_PPC_filetype1061109567 MWProject_PPC_size0 MWProject_PPC_minsize0 MWProject_PPC_stacksize0 MWProject_PPC_flags0 MWProject_PPC_symfilename MWProject_PPC_rsrcname MWProject_PPC_rsrcheaderNative MWProject_PPC_rsrctype1061109567 MWProject_PPC_rsrcid0 MWProject_PPC_rsrcflags0 MWProject_PPC_rsrcstore0 MWProject_PPC_rsrcmerge0 MWAssembler_PPC_auxheader0 MWAssembler_PPC_symmodeMac MWAssembler_PPC_dialectPPC MWAssembler_PPC_prefixfile MWAssembler_PPC_typecheck0 MWAssembler_PPC_warnings0 MWAssembler_PPC_casesensitive0 MWRez_Language_maxwidth80 MWRez_Language_scriptRoman MWRez_Language_alignmentAlign1 MWRez_Language_filtermodeFilterSkip MWRez_Language_suppresswarnings0 MWRez_Language_escapecontrolchars1 MWRez_Language_prefixname MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' Name inflate.h MacOS Text Name globals.h MacOS Text Name unzip.h MacOS Text Name unzip.c MacOS Text Name explode.c MacOS Text Name extract.c MacOS Text Name fileio.c MacOS Text Name list.c MacOS Text Name globals.c MacOS Text Name match.c MacOS Text Name zipinfo.c MacOS Text Name inflate.c MacOS Text Name process.c MacOS Text Name unshrink.c MacOS Text Name unreduce.c MacOS Text Name unzpriv.h MacOS Text Name macdir.c MacOS Text Name maccfg.h MacOS Text |UQ@ UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tg Name sxunzip.c MacOS Text Name UnZpLib.h MacOS Text Name macstat.c MacOS Text Name macstat.h MacOS Text Name macos.c MacOS Text Name crypt.c MacOS Text Name macbin3.h MacOS Text Name macbin3.c MacOS Text Name ttyio.c MacOS Text Name DirectoryCopy.h MacOS Text Name FileCopy.h MacOS Text Name FSpCompat.h MacOS Text Name FullPath.h MacOS Text Name IterateDirectory.h MacOS Text Name MoreDesktopMgr.h MacOS Text Name MoreFiles.h MacOS Text Name MoreFilesExtras.h MacOS Text Name Optimization.h MacOS Text Name OptimizationEnd.h MacOS Text Name Search.h MacOS Text Name inflate.h MacOS Name globals.h MacOS Name unzip.h MacOS Name unzip.c MacOS Name explode.c MacOS Name extract.c MacOS Name fileio.c MacOS Name list.c MacOS Name globals.c MacOS Name match.c MacOS Name zipinfo.c MacOS L_ UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t0 Name inflate.c MacOS Name process.c MacOS Name unshrink.c MacOS Name unreduce.c MacOS Name unzpriv.h MacOS Name macdir.c MacOS Name maccfg.h MacOS Name sxunzip.c MacOS Name UnZpLib.h MacOS Name macstat.c MacOS Name macstat.h MacOS Name macos.c MacOS Name crypt.c MacOS Name macbin3.h MacOS Name macbin3.c MacOS Name ttyio.c MacOS Name DirectoryCopy.h MacOS Name FileCopy.h MacOS Name FSpCompat.h MacOS Name FullPath.h MacOS Name IterateDirectory.h MacOS Name MoreDesktopMgr.h MacOS Name MoreFiles.h MacOS Name MoreFilesExtras.h MacOS Name Optimization.h MacOS Name OptimizationEnd.h MacOS Name Search.h MacOS Unzip Lib (68k) UserSourceTrees CustomColor1 Red0 Green32767 Blue0 CustomColor2 Red0 Green32767 Blue0 CustomColor3 Red0 Green32767 Blue0 CustomColor4 Red0 Green32767 Blue0 AlwaysSearchUserPathsfalse InterpretDOSAndUnixPathsfalse UserSearchPaths SearchPath Path: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll ( UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t˰ SearchPath Path:: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::izshr:macos: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:CHeaders: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:PascalInterfaces: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:Sources: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SystemSearchPaths SearchPath Path:MSL: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path:MacOS Support: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll LinkerMacOS 68K Linker PreLinker PostLinker TargetnameUnzip Lib (68k) OutputDirectory Path: PathFormatMacOS PathRootProject SaveEntriesUsingRelativePathsfalse FileMappings FileTypeAPPL FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeAppl FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeMMLB FileExtension CompilerLib Import 68K Precompilefalse Launchablefalse ResourceFile5a UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tV)false IgnoredByMakefalse FileTypeMPLF FileExtension CompilerLib Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMWCD FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeOBJ FileExtension CompilerMPW Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeRSRC FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeTEXT FileExtension.bh CompilerBalloon Help Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c++ CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cc CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cp CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cpp CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.exp Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT VV UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t FileExtension.h CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMaketrue FileTypeTEXT FileExtension.p CompilerMW Pascal 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pas CompilerMW Pascal 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch CompilerMW C/C++ 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch++ CompilerMW C/C++ 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.ppu CompilerMW Pascal 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.r CompilerRez Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.seg Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypedocu FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypersrc FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeshlb FileExtension CompilerPEF Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypestub FileExtension CompilerPEF Import 68K Precompilefalse 5 UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1toZ Launchablefalse ResourceFilefalse IgnoredByMakefalse FileExtension.doc Compiler Precompilefalse Launchabletrue ResourceFilefalse IgnoredByMaketrue CacheModDatestrue ActivateBrowsertrue DumpBrowserInfofalse CacheSubprojectstrue UseThirdPartyDebuggerfalse DebuggerCommandLine Debugger Runtime 0002000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000 LogSystemMessagestrue AutoTargetDLLsfalse StopAtWatchpointstrue PauseWhileRunningfalse PauseInterval5 PauseUIFlags0 AltExePath Path PathFormatGeneric PathRootAbsolute StopAtTempBPOnLaunchtrue CacheSymbolicstrue TempBPFunctionNamemain TempBPTypefalse MWCodeGen_68K_codesizeLarge MWCodeGen_68K_structalignmentMC68K MWCodeGen_68K_fp_modeSANE MWCodeGen_68K_code680200 MWCodeGen_68K_profiler0 MWCodeGen_68K_mpwc0 MWCodeGen_68K_fourbyteints1 MWCodeGen_68K_IEEEdoubles1 MWCodeGen_68K_fardata1 MWCodeGen_68K_farvtables1 MWCodeGen_68K_farstrings1 MWCodeGen_68K_pcrelstrings0 MWCodeGen_68K_macsbugNew MWCodeGen_68K_a6frames0 MWDisassembler_68K_showcode1 MWDisassembler_68K_mix0 MWDisassembler_68K_nohex0 MWDisassembler_68K_showdata1 MWDisassembler_68K_showexceptions1 MWDisassembler_68K_showsym0 MWDisassembler_68K_shownames1 GlobalOptimizer_68K_optimiz& UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tVationlevelLevel4 GlobalOptimizer_68K_optforSpeed MWLinker_68K_linksym0 MWLinker_68K_symfullpath1 MWLinker_68K_linksingle1 MWLinker_68K_fastlink1 MWLinker_68K_generateMap0 MWLinker_68K_nolinkwarnings0 MWLinker_68K_glueintosegone1 MWLinker_68K_dontdeadstripinitcode0 MWProject_68K_typeLibrary MWProject_68K_outfileUnzip Lib (68k) MWProject_68K_symfilename MWProject_68K_filecreator1061109567 MWProject_68K_filetype1061109567 MWProject_68K_size0 MWProject_68K_flags0 MWProject_68K_rsrcheaderStandard MWProject_68K_rsrcname MWProject_68K_rsrctype1061109567 MWProject_68K_rsrcid0 MWProject_68K_rsrcmulti0 MWProject_68K_rsrcstore0 MWProject_68K_rsrcmerge0 MWProject_68K_rsrcflags0 MWProject_68K_a41 MWProject_68K_minsize0 MWProject_68K_rsrcsegtype0 MWProject_68K_cfm68kcodegen0 MWProject_68K_stacksize0 MWProject_68K_thedebugger0 MWProject_68K_rsrc_custom0 MWProject_68K_is_rseg_app0 MWProject_68K_is_pilot_lib0 MWProject_68K_pilot_main_entry MWFrontEnd_C_cplusplus0 MWFrontEnd_C_checkprotos1 MWFrontEnd_C_arm0 MWFrontEnd_C_trigraphs1 MWFrontEnd_C_onlystdkeywords0 MWFrontEnd_C_enumsalwaysint0 MWFrontEnd_C_mpwpointerstyle0 MWFrontEnd_C_prefixnameUnZpLib.h MWFrontEnd_C_ansistrict1 MWFrontEnd_C_mpwcnewline0 MWFrontEnd_C_wchar_type1 MWFrontEnd_C_enableexceptions0 MWFrontEnd_C_dontreusestrings1 MWFrontEnd_C_poolstrings0 MWFrontEnd_C_dontinline0 MWFrontEnd_C_useRTTI0 MWFrontEnd_C_multibyteaware0 MWFrontEnd_C_unsignedchars0 MWFrontEnd_C_autoinline0 MWFrontEnd_C_booltruefalse1 MWFrontEnd_C_direct_to_som0 MWFrontEnd_C_som_env_check0 MWFrontEnd_C_alwaysinline0 MWFrontEnd_C_inlinelevel0 MWFrontEnd_C_ecplusplus0 MWFrontEnd_C_objective_c0 MWFrontEnd_C_defer_codegen0 MWWarning_C_warn_illpragma1 MWWarning_C_warn_emptydecl1 MWWarning_C_warn_possunwant1 MWWarning_C_warn_unusedvar1 MWWarning_C_warn_unusedarg1 MWWarning_C_warn_extracomma1 MWWarning_C_pedantic1 MWWarning_C_warningerrors0 MWWarning_C_warn_hidevirtual1 MWWarning_C_warn_implicitconv0 MWWarning_C_warn_notinlined0 MWWarning_C_warn_structclass0 MWCFM68K_exportsNone MWCFM68K_olddefversion0 MWCFM68K_oldimpversion0 MWCFM68K_currentversion0 MWCFM68K_farthreshold256 PCFM68K_sharedata0 MWCFM68K_fragmentname MWCFM68K_initname MWCFM68K_mainname__start MWCFM68K_termname MWCFM68K_libfolder0 MWCFM68K_alignmentAlign_2 MWFTP_Post_hostName MWFTP_Post_username MWFTP_Post_password MWFTP_Post_remoteDir MWFTP_Post_uploadDir MWFTP_Post_ftp_port21 MWFTP_Post_SendBin1 MWFTP_Post_ShouldLog1 MWCommandLine_Java_clsName MWCommandLine_Java_args MWJava_Language_optimize0 MWJava_Language_warnDeprecated0 MWJava_Language_emitMap0 MWJava_Language_strictFileNames0 MWJava_Language_strictFileHierarchy0 MWJava_Language_emitHeadersNoNativeHeaders MWJava_Language_packageFilter MWJava_Language_genComments1 MWJava_Language_genHeaders0 MWJava_MacOS_typeJBindery MWJava_MacOS_grow0 MWJava_MacOS_profile0 MWJava_MacOS_verify0 MWJava_MacOS_useHttpProxy0 MWJava_MacOS_useFTPProxy0 MWJava_MacOS_useFirewallProxy0 MWJava_MacOS_outfileJBoundApp MWJava_MacOS_outcreator1061109567 MWJava_MacOS_maxMem1048576 MWJava_MacOS_minMem524288 MWJava_MacOS_red65535 MWJava_MacOS_green65535 MWJava_MacOS_blue65535 MWJava_MacOS_stdoutType1464421956 MWJava_MacOS_stdinType1853189228 MWJava_MacOS_httpProxyPort0 MWJava_MacOS_fTPProxyPort0 MWJava_MacOS_firewallProxyPort0 MWJava_MacOS_httpProxy MWJava_MacOS_fTPProxy MWJava_MacOS_firewallProxy MWJava_MacOS_merge0 MWJava_MacOS_write_old_rsrcs1 MWJava_MacOS_jbindrundebug0 MWJava_MacOS_stdoutfile MWJava_MacOS_stdinfile MWJava_Output_outputtypeJarFile MWJava_Output_outfileJavaClasses.jar MWJava_Output_ftype1514754080 MWJava_Output_fcreator1297570384 MWJava_Output_compress0 MWJava_Output_genManifest0 MWJava_Output_trunctypeFront MWJava_Output_deleteClasses0 MWJava_Output_consoleApp1 MWJava_Proj_projtypeApplet MWJava_Proj_runtimeArgs MWJava_Proj_mainClassName MWJava_Proj_HTMLAppCreator1297303877 MWJava_Proj_HTMLAppNameInternet Explorer MWJava_Proj_HTMLAppWin32NameIexplore.exe MWJava_Proj_compress0 MWJava_Proj_useVM1 MWJava_Proj_workingDir MWJava_Proj_vmarguments MWJava_Proj_vmName MWJavaDoc_Proj_Version1 MWJavaDoc_Proj_Depricated0 MWJavaDoc_Proj_Author1 MWJavaDoc_Proj_Index1 MWJavaDoc_Proj_Tree1 MWJavaDoc_Proj_SunResolveToSame1 MWJavaDoc_Proj_Shortnames1 MWJavaDoc_Proj_Folder0 MWJavaDoc_Proj_GenerateAPILinks0 MWJavaDoc_Proj_scopePublic MWJavaDoc_Proj_fcreator1297303877 MWJavaDoc_Proj_encodingNao#&^l+_6Krlj_]X=1s!/w N/`; O.BT~!+ ~4S2p &R|+vIXVEtQfHAO#NJ'Fp# ?$V\O?s'(lckcHYe )cF8]b5 Z8"t N3hKaG(M%F0&zYV[F,wWGv2QOG GdZ)pexP*B*_2_  >/7 O Wnvj?2"C(HT0c}R-rolh}q ZU#pBa\`9"~CG*$MtW]tZdsf%F? vfPzm7_V-{AIj! 1# 0<8xyJt&|wl58`|gso.Zuk Rr!y_QJ,|w)P%6tjJ`._6So&I+_k"d[M%C]6s(\&CZ+"-;*K0h  -&;`Nf~RKFznyR pS n#_@h0^.%PQXUpnf O}X7 0`-&&6OGZW=Vf]5.XShM9tyQ,p#giGp}bgg|vge5h fmVGSqb+j%7S|j_Qr2e}{1GUhph=:Vgm=3%&=+p3sKQ5D~Y3K f(# OUFeYKd/t<:bj-EesW_7*TR?h;kqgP"g'/~ +''mVKg13c e OMTgV+@%cm9A=|1 u-][UC%T f|,cMzy/*v4bVRZQN=Fw7fP l ij1Ue#}x- }$ AATsFqas~S}~7hs r'I@9RUXrV2zw38lY&v66`5#VD9e r[8j49Tu B:, u)5J\aeN4xGhW69j7?YVA|iv 64 v;.  w:>7{ kT!y\(|i#'mvke[bf!;(bQm&#E(cil+:G~b\pze{]6R<YO JJV3 ;lJ0P;O_'$/".8 =C4pxc V00\q+:BL!ar/DVX^TlX  s2I:-B h2qhkh6eLYIN{dc8a,~=Rw{&j^JRf'Qr8*'.5^5Tnxn"IJ oA}B; [!gf?r^NkD>("*K6^TRSKYNcEJ*a;hPU$OwyzY1w9wFwhNPbUW}"uP]nA:|GK|fU{@(NsbeGe ,!&zc}[ 0LcKD"lls3 9Z U?`@N\*pG9UYtV?_!*V-9wlbZVD ;\T8-2JYKqenSLYQ]#_qiv /@@ =; *?3O Q6)xj\22FW5b @CN#m3**yr7qMN[0:B~H^]5iUNQ#(_F1 jp"mz=ya^Nu#<^_}C?7&[C9#F0x)AhJ-!|| iR7R4;TImP+I*{ sv }9:mRA:b8_5WR,V4 0]!60$qOT rA)h(Rm=^C4A.}x o J.[I\C(gzQw?3$P*>$`f"3qTBJj?x)# 5v3 d c  h$7B?o 2[]xP{c!{u0U/$xZB?|i2W`hid& ;NWbuo)j:o]GrVI)*Wd_&C,Qa ^MD"5&0I2W3IH7Tz^2wGV+s$RBo\%K[wf),$XJQwNu{87ih5pI bAsSzl-_}rEblE+tX?] "SFp9w$Nb!|BIx7S0i+P!3Uf{{Qr}V@[4)yKt>gB8-:knX>0aiB"dU w`}mvg-i67}bt`{:#\;Fi1"EC J4TcKF 9ZdwX_v-2i.10kb.n*zsekBrQ goJQmoy= [@T; 1=~Z ':[Ie/4x *# m9uDok<.^cnXPb)#uY4GmcAiL. b 2 ltGcw7jMWX~_ 7%9JT{5PwDk`|R?44d#hQ|N F1q`dWMBf -a orC|F&Vsg Gu@|4=#y{_6!~[! Lm mvj}?B}( 'x`3Za(:}g/`J- x3:T( }`7Y! Rkplv\w/|)RD;:gN+NhS#?`ly~"vbS%\5+`5|+VbM L@w )l>\f5Y}t& C!qS>(0I52UJ3bRDg(~}iTX>wa< s?\,Ljjjv .G :rBB#Myv eP1NT %^YIK}==%"3Dj+NFw!\b;(:~Ot;?Kkt] MH^b>qhJ5Y3^@9Ulj%w>%~`o_ @h.!=dCT3|g uUk zHmbVdox~khX)ji?m[ ~'.WHuh<=mkZb.7z u-z>g5pVH[[UfM&iN1$0akydj|4\S&v CE$@^S0>jz: X6Z!1@nQw9azg.>:(0Gnh u7^J9]@.#\ l9T-4 X(p@\A 0MDin1F$p+^ adH c|brjLbyW,xMZ/v00RVBI\ZK>h.Su|CP1= ~-0[d|ketwo'5FKg ($zbu~`$_FUnmkhs~=!K=&c`"+usN,'GbbKM\Un/P<&{(&~O-gGw+MnQz/vvl`T:a5)|euIW P'45dfG?2 =P8 $&k7N?-0-! @U*orvwt-7)M{rh|W@UZE |'/'h7Hgyf p$[}^[(UHl5p #lph3[U=8u.XG 3i2:"s(bpzK-+`4(< SA4G$M'83k1@uq%Shm.V3h_$>?hh] 5K.,RW,xVQHqDev88_O/s$c9)~[$Cr%2m:<"P g#2L'[0[;PC_Yg ;VHE821`gk4w( =guTL'xbn}m }fuox14zDM b]5O,cfb0s{?+Ba\D(Hiv h:fR"FC1 B0*;UXK@}<)CNu8d"[zX`v?"K6BcWM "kpWr{5B31JsTlmDUzed d- Q0Ado`k|-WZBSonUA Jx,Z0mHsb `[Ne>*q|L ]B g:o39 m%iB`- +)I5 ` f!M h{ZVFX \F.Q\/`kSD&k "7Y|$X]un;-G7@Bqq*S?xv/0Sv&nC19CNXncL4#v4V>W$as{thUtNL_> \}t7# rDgBL1ryaaCW~V@pf3B#'8RPx87X AK%'< _ *~8V^" ROG4kK thv1Cp]kFH ~67Nfq)`LrwCRy9h33\Va/=m8' apzw;o';'u8_u+X.;98K?I0`C$Kl 367Y1@VL."D:.hxS oezX3yk!jvSO5z s Q!g2nauIyPP6XJ oBR%:Z ( zA@>2oB^\.*' :e[CK@G1{#~ rAi0hF s}B &T&)iZ^FSnKRROe73&j#@T1yZ<*8'.$/h~ 4IpV5fJ:+N}*\r7Za*7}'Vc`wx1@8C_98g52ZE(;57KN C=n1$7B$ 9d]2E, l}gmiRlg]a8]9fmZww7l1m jDMkgDx33G89R?|VeN%$ Yey'-yX6~nUVPI;M`!'A!(Q,2B0; %I3x3J m_ &]ikpk,Pz*O43j/D.U.6y0E@T4hfG _Al u-L+wR 4>+r $E:Js l{r=p!g(SN\VcE.=f1H C),_0c!=>HvfW//nP$iS0E Hj%[H\ ~qFXRDKysS.8B6_5h_DRz7sp|>cs3e +!w0PW$n -?j`t6`'0 . QCQxd7PSSuz' 35|Ju5T5FuuosGJ(Wzsas'f1SX42q?/'nO2\E&E9nD6\u_Bg} ?xvG{ocush}]ZliK_. i(U"vmu,"3a/<}pARP*%'"O>4(~n -~bD cn{[,DXxS6ZCxHmQPf ] 0~-ZK*J?|cQ'?Y"-Pr*[UQ"y';z^/ikj~tx@uH9u+ ;Jg,d2V}+tp<1],vc$khW9K@9C@gVuD'hMA([(A3X2] aZ(   '$Sv s5;HpoyxvzQ;{FYTP?9]?f #3zp4u5a5>Fp)/{)3yia5VqM,!vg In2vlY)0`%pBn[FI5j[M[Z-O43 y3 6,$!@jlS}8k4,(Xi|&M{EwZqgl [ dNT7C5@:w&0Ow Qqm%_b-9]dWQ9 rR7'4 `aD~@e[jR& 3*~ 0=R+T Mz]#_5s 6J *L Jj\3ycJi^Vlk$ ry=~7c 32*V;]*{kg,z .m@(lM ,dlvYlA(QgJP^"Bf,iYrxzgqadJWVFh =`TT{+xZi sP4~pZe-u8e^Y3NRX yqui<4^~jyH(1Qm$<3=i)+CjS96B0lApp#k^S&<-&^Vc=wxY6sw~?QMhXY2Gn(Yh:R[#"^#("Kdd1ZL VE3a38EHm |(-Y=>>trH3LfIWUg |{gd8ytys`8c/N@dT*5Gufd-ABu|ep;cC)"kv) N\6 U*$G6G-[PVbR.'r6\7 ""z#"Oh=YAl9yL? yi2ZW] $,(uoahI([.hgm*-(kb% UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t<me MWJavaDoc_Proj_decodingName MWJavaDoc_Proj_javaPackagePathhttp://java.sun.com/products/jdk/1.1/docs/api/ MWMerge_MacOS_projectTypeApplication MWMerge_MacOS_outputNameMerge Out MWMerge_MacOS_outputCreator1061109567 MWMerge_MacOS_outputType1095782476 MWMerge_MacOS_suppressWarning0 MWMerge_MacOS_copyFragments1 MWMerge_MacOS_copyResources1 MWMerge_MacOS_skipResources a MWCodeGen_PPC_structalignmentMC68K MWCodeGen_PPC_tracebacktablesNone MWCodeGen_PPC_processorGeneric MWCodeGen_PPC_readonlystrings0 MWCodeGen_PPC_tocdata1 MWCodeGen_PPC_profiler0 MWCodeGen_PPC_fpcontract1 MWCodeGen_PPC_schedule0 MWCodeGen_PPC_peephole1 MWCodeGen_PPC_processorspecific0 MWCodeGen_PPC_altivec0 MWCodeGen_PPC_vectortocdata0 MWCodeGen_PPC_vrsave0 MWDisassembler_PPC_showcode1 MWDisassembler_PPC_extended1 MWDisassembler_PPC_mix0 MWDisassembler_PPC_nohex0 MWDisassembler_PPC_showdata1 MWDisassembler_PPC_showexceptions1 MWDisassembler_PPC_showsym0 MWDisassembler_PPC_shownames1 GlobalOptimizer_PPC_optimizationlevelLevel0 GlobalOptimizer_PPC_optforSpeed MWLinker_PPC_linksym1 MWLinker_PPC_symfullpath1 MWLinker_PPC_linkmap0 MWLinker_PPC_nolinkwarnings0 MWLinker_PPC_dontdeadstripinitcode0 MWLinker_PPC_permitmultdefs0 MWLinker_PPC_linkmodeFast MWLinker_PPC_initname MWLinker_PPC_mainname__start MWLinker_PPC_termname MWPEF_exportsNone MWPEF_libfolder0 MWPEF_sortcodeNone MWPEF_expandbss0 MWPEF_sharedata0 MWPEF_olddefversion0 MWPEF_oldimpversion0 MWPEF_currentversion0 MWPEF_fragmentname MWPEF_collapsereloads0 MWProject_PPC_typeApplication MWProject_PPC_outfilea.out MWProject_PPC_filecreator1061109567 MWProject_PPC_filetype1095782476 MWProject_PPC_size384 MWProject_PPC_minsize384 MWProject_PPC_stacksize64 MWProject_PPC_flags22720 MWProject_PPC_symfilename MWProject_PPC_rsrcname MWProject_PPC_rsrcheaderNative MWProject_PPC_rsrctype1061109567 MWProject_PPC_rsrcid0 MWProject_PPC_rsrcflags0 MWProject_PPC_rsrcstore0 MWProject_PPC_rsrcmerge0 MWAssembler_PPC_auxheader0 MWAssembler_PPC_symmodeMac MWAssembler_PPC_dialectPPC MWAssembler_PPC_prefixfile MWAssembler_PPC_typecheck0 MWAssembler_PPC_warnings0 MWAssembler_PPC_casesensitive0 MWRez_Language_maxwidth80 MWRez_Language_scriptRoman MWRez_Language_alignmentAlign1 MWRez_Language_filtermodeFilterSkip MWRez_Language_suppresswarnings0 MWRez_Language_escapecontrolchars1 MWRez_Language_prefixname MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' Name inflate.h MacOS Text Name globals.h MacOS Text Name unzip.h MacOS Text Name unzip.c MacOS Text Name explode.c MacOS Text Name extract.c MacOS Text Name fileio.c MacOS Text Name list.c MacOS Text Name globals.c MacOS Text Name match.c MacOS Text Name zipinfo.c MacOS Text Name inflate.c MacOS Text Name process.c MacOS Text Name unshrink.c MacOS Text Name unreduce.c MacOS Text Name unzpriv.h MacOS Text Name macdir.c MacOS Text Name maccfg.h MacOS Text Name sxunzip.c MacOS Text Name UnZpLib.h MacOS Text Name macstat.c MacOS Text Name macstat.h MacOS Text Name macos.c MacOS Text Name macbin3.h MacOS Text Name macbin3.c MacOS Tex!AK UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tOZt Name crypt.c MacOS Text Name ttyio.c MacOS Text Name DirectoryCopy.h MacOS Text Name FileCopy.h MacOS Text Name FSpCompat.h MacOS Text Name FullPath.h MacOS Text Name IterateDirectory.h MacOS Text Name MoreDesktopMgr.h MacOS Text Name MoreFiles.h MacOS Text Name MoreFilesExtras.h MacOS Text Name Optimization.h MacOS Text Name OptimizationEnd.h MacOS Text Name Search.h MacOS Text First Segment Protected, Locked Name inflate.h MacOS Name globals.h MacOS Name unzip.h MacOS Name unzip.c MacOS Name explode.c MacOS Name extract.c MacOS Name fileio.c MacOS Name list.c MacOS Name globals.c MacOS Name match.c MacOS Name zipinfo.c MacOS Name inflate.c MacOS Name process.c MacOS Name unshrink.c MacOS Name unreduce.c MacOS Name unzpriv.h MacOS Name macdir.c MacOS Name maccfg.h MacOS Name sxunzip.c MacOS Name UnZpLib.h MacOS Name macstat.c MacOS Name macstat.h MacOS Name macos.c MacOS Name macbin3.h MacOS Name macbin3.c MacOS Name crypt.c MacOS Name ttyio.c MacOS Name DirectoryCopy.h MacOS Name FileCopy.h MacOS Name FSpCompat.h MacOS Name FullPath.h MacOS Name IterateDirectory.h MacOS Name MoreDesktopMgr.h MacOS Name MoreFiles.h MacOS Name MoreFilesExtras.h MacOS Name Optimization.h MacOS Name OptimizationEnd.h MacOS Name Search.h MacOS Unzip (PPC) UserSourceTrees CustomColor1 Red0 Green32767 Blue0 CustomColor2 Red0 Green32767 Blue0 CustomColor3 Red0 Green32767 Blue0 CustomColor4 Red0 Green32767 Blue0 AlwaysSearchUserPathsfalse InterpretDOSAndUnixPathsfalse UserSearchPaths SearchPath Path: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::izshr:macos: PathFormatMacOS #3P UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t<x PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:CHeaders: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:PascalInterfaces: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:Sources: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SystemSearchPaths SearchPath Path:MSL: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path:MacOS Support: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll LinkerMacOS PPC Linker PreLinker PostLinker TargetnameUnzip (PPC) OutputDirectory Path: PathFormatMacOS PathRootProject SaveEntriesUsingRelativePathsfalse FileMappings FileTypeAPPL FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeAppl FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeMMLB FileExtension CompilerLib Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMPLF FileExtension CompilerLib Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse F$-wv UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t 0ileTypeMWCD FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeRSRC FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeTEXT FileExtension.bh CompilerBalloon Help Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c++ CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cc CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cp CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cpp CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.exp Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.h CompilerMW C/C++ PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMaketrue FileTypeTEXT FileExtension.p CompilerMW Pascal PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pas CompilerMW Pascal PPC Pre%m3 UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tcompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch CompilerMW C/C++ PPC Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch++ CompilerMW C/C++ PPC Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.ppu CompilerMW Pascal PPC Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.r CompilerRez Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.s CompilerPPCAsm Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeXCOF FileExtension CompilerXCOFF Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypedocu FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypersrc FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeshlb FileExtension CompilerPEF Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypestub FileExtension CompilerPEF Import PPC Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileExtension.doc Compiler Precompilefalse Launchabletrue ResourceFilefalse IgnoredByMaketrue &{ UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t0C CacheModDatestrue ActivateBrowsertrue DumpBrowserInfofalse CacheSubprojectstrue UseThirdPartyDebuggerfalse DebuggerCommandLine Debugger Runtime 0002000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000 LogSystemMessagestrue AutoTargetDLLsfalse StopAtWatchpointstrue PauseWhileRunningfalse PauseInterval5 PauseUIFlags0 AltExePath Path PathFormatGeneric PathRootAbsolute StopAtTempBPOnLaunchtrue CacheSymbolicstrue TempBPFunctionNamemain TempBPTypefalse MWCodeGen_68K_codesizeSmart MWCodeGen_68K_structalignmentMC68K MWCodeGen_68K_fp_modeSANE MWCodeGen_68K_code680200 MWCodeGen_68K_profiler0 MWCodeGen_68K_mpwc0 MWCodeGen_68K_fourbyteints1 MWCodeGen_68K_IEEEdoubles1 MWCodeGen_68K_fardata1 MWCodeGen_68K_farvtables1 MWCodeGen_68K_farstrings1 MWCodeGen_68K_pcrelstrings0 MWCodeGen_68K_macsbugNew MWCodeGen_68K_a6frames1 MWDisassembler_68K_showcode1 MWDisassembler_68K_mix0 MWDisassembler_68K_nohex0 MWDisassembler_68K_showdata1 MWDisassembler_68K_showexceptions1 MWDisassembler_68K_showsym0 MWDisassembler_68K_shownames1 GlobalOptimizer_68K_optimizationlevelLevel0 GlobalOptimizer_68K_optforSpeed MWLinker_68K_linksym1 MWLinker_68K_symfullpath1 MWLinker_68K_linksingle0 MWLinker_68K_fastlink1 MWLinker_68K_generateMap0 MWLinker_68K_nolinkwarnings0 MWLinker_68K_glueintosegone1 MWLinker_68K_dontdeadstripinitcode0 MWProject_68K_typeApplication MWProject_68K_outfileToolbox68k.out MWProject_68K_symfilename MWProject_68K_filecreator1061109567 MWProject_68K_filetype1095782476 MWProject_68K_size384 MWProject_68K_flags22688 MWProject_68K_rsrcheaderStandard MWProject_68K_rsrcname MWProject_68K_rsrctype1061109567 MWProject_68K_rsrcid0 MWProject_68K_rsrcmulti0 MWProject_68K_rsrcstore0 MWProject_68K_rsrcmerge0 MWProject_68K_rsrcflags0 MWProject_68K_a40 MWProject_68K_minsize384 MWProject_68K_rsrcsegtype0 MWProject_68K_cfm68kcodegen0 MWProject_68K_stacksize0 MWProject_68K_thedebugger0 MWProject_68K_rsrc_custom0 MWProject_68K_is_rseg_app0 MWProject_68K_is_pilot_lib0 MWProject_68K_pilot_main_entry MWFrontEnd_C_cplusplus0 MWFrontEnd_C_checkprotos1 MWFrontEnd_C_arm0 MWFrontEnd_C_trigraphs1 MWFrontEnd_C_onlystdkeywords0 MWFrontEnd_C_enumsalwaysint0 MWFrontEnd_C_mpwpointerstyle0 MWFrontEnd_C_prefixnameUnZp.h MWFrontEnd_C_ansistrict1 MWFrontEnd_C_mpwcnewline0 MWFrontEnd_C_wchar_type1 MWFrontEnd_C_enableexceptions0 MWFrontEnd_C_dontreusestrings0 MWFrontEnd_C_poolstrings0 MWFrontEnd_C_dontinline0 MWFrontEnd_C_useRTTI0 MWFrontEnd_C_multibyteaware0 MWFrontEnd_C_unsignedchars0 MWFrontEnd_C_autoinline0 MWFrontEnd_C_booltruefalse1 MWFrontEnd_C_direct_to_som0 MWFrontEnd_C_som_env_check0 MWFrontEnd_C_alwaysinline0 MWFrontEnd_C_inlinelevel0 MWFrontEnd_C_ecplusplus0 MWFrontEnd_C_objective_c0 MWFrontEnd_C_defer_codegen0 MWWarning_C_warn_illpragma0 MWWarning_C_warn_emptydecl0 MWWarning_C_warn_possunwant0 MWWarning_C_warn_unusedvar0 MWWarning_C_warn_unusedarg0 MWWarning_C_warn_extracomma0 MWWarning_C_pedantic0 MWWarning_C_warningerrors0 MWWarning_C_warn_hidevirtual0 MWWarning_C_warn_implicitconv0 MWWarning_C_warn_notinlined0 MWWarning_C_warn_structclass0 MWCFM68K_exportsNone MWCFM68K_olddefversion0 MWCFM68K_oldimpversion0 MWCFM68K_currentversion0 MWCFM68K_farthreshold256 PCFM68K_sharedata0 MWCFM68K_fragmentname MWCFM68K_initname MWCFM68K_mainname__start MWCFM68K_termname MWCFM68K_libfolder0 MWCFM68K_alignmentAlign_2 MWFTP_Post_hostName MWFTP_Post_username MWFTP_Post_password MWFTP_Post_remoteDir MWFTP_Post_uploadDir MWFTP_Post_ftp_port21 MWFTP_Post_SendBin1 MWFTP_Post_ShouldLog1 MWCommandLine_Java_clsName MWCommandLine_Java_args MWJava_Language_optimize0 MWJava_Language_warnDeprecated0 MWJava_Language_emitMap0 MWJava_Language_strictFileNames0 MWJava_Language_strictFileHierarchy0 MWJava_Language_emitHeadersNoNativeHeaders MWJava_Language_packageFilter MWJava_Language_genComments1 MWJava_Language_genHeaders0 MWJava_MacOS_typeJBindery MWJava_MacOS_grow0 MWJava_MacOS_profile0 MWJava_MacOS_verify0 MWJava_MacOS_useHttpProxy0 MWJava_MacOS_useFTPProxy0 MWJava_MacOS_useFirewallProxy0 MWJava_MacOS_outfileJBoundApp MWJava_MacOS_outcreator1061109567 MWJava_MacOS_maxMem1048576 MWJava_MacOS_minMem524288 MWJava_MacOS_red65535 MWJava_MacOS_green65535 MWJava_MacOS_blue65535 MWJava_MacOS_stdoutType1464421956 MWJava_MacOS_stdinType1853189228 MWJava_MacOS_httpProxyPort0 MWJava_MacOS_fTPProxyPort0 MWJava_MacOS_firewallProxyPort0 MWJava_MacOS_httpProxy MWJava_MacOS_fTPProxy MWJava_MacOS_firewallProxy MWJava_MacOS_merge0 MWJava_MacOS_write_old_rsrcs1 MWJava_MacOS_jbindrundebug0 MWJava_MacOS_stdoutfile MWJava_MacOS_stdinfile MWJava_Output_outputtypeJarFile MWJava_Output_outfileJavaClasses.jar MWJava_Output_ftype1514754080 MWJava_Output_fcreator1297570384 MWJava_Output_compress0 MWJava_Output_genManifest0 MWJava_Output_trunctypeFront MWJava_Output_deleteClasses0 MWJava_Output_consoleApp1 MWJava_Proj_projtypeApplet MWJava_Proj_runtimeArgs MWJava_Proj_mainClassName MWJava_Proj_HTMLAppCreator1297303877 MWJava_Proj_HTMLAppNameInternet Explorer MWJava_Proj_HTMLAppWin32NameIexplore.exe MWJava_Proj_compress0 MWJava_Proj_useVM1 MWJava_Proj_workingDir MWJava_Proj_vmarguments MWJava_Proj_vmName MWJavaDoc_Proj_Version1 MWJavaDoc_Proj_Depricated0 MWJavaDoc_Proj_Author1 MWJavaDoc_Proj_Index1 MWJavaDoc_Proj_Tree1 MWJavaDoc_Proj_SunResolveToSame1 MWJavaDoc_Proj_Shortnames1 MWJavaDoc_Proj_Folder0 MWJavaDoc_Proj_GenerateAPILinks0 MWJavaDoc_Proj_scopePublic MWJavaDoc_Proj_fcreator1297303877 MWJavaDoc_Proj_encodingName MWJavaDoc_Proj_decodingName MWJavaDoc_Proj_javaPackagePathhttp://java.sun.com/products/jdk/1.1/docs/api/ MWMerge_MacOS_projectTypeApplication MWMerge_MacOS_outputNameMerge Out MWMerge_MacOS_outputCreator1061109567 MWMerge_MacOS_outputType1095782476 MWMerge_MacOS_suppressWarning0 MWMerge_MacOS_copyFragmentsL^uP03w][o |;?an K_QfPMq!j]v`!ngM" :?k @6>lucebpBN4< l9 Pz>ljza>^|K+jwM@][+HxL6#]0w]4S#c=f akq0WFw;^EJ9WPLg<@}.&{toFb;2>%LV`B\(7_5vTZ_'bW1.14BVNQ$9Z.$+t ^ze\XL9Q-_fu=S|"K e+]I:wA0Y3N[s1DxGWdpZM^WWCb,#G ,/S]:U]((A9X oL3 ^kf@Z.b};{1uB-U_ +w45~d|bRZ+n4(*:*PLd/shSTDQo; p<;_XWO;#({wbmvQy{nJAdE!@T=m28.4bw6S@xW[|iZ%\E8_[ 4mZUKIFj&S\rJf {2C`kEg -*y4O_C>!cTJ7+C/=VNO57P)-BM`^7{6rbq;&w{~sMjr Ji /0\yt(]YN ~LBaG>aqo^g}zzyr9VM&`xFJ+`/&J>|pG~Z<A`dz >[6s*h1u3Y26vnc],Ei6Sjp"N/)3atJiZR Nc! vA\u0(*b^,;O /kykl@kgeMW_k=0q7!;qE`^064G,=mA9>5vcq#M?[;Sk- m Nr]ib%I[c4!w# |"_r-&MVRB^_j ,[\'`3?+?hxZ&wSe])eqdU6mklW ^$ chE}a:p1RQf&,Ln:a@0}%3dZ'lkMn*Hgo g'BG2E<hs^nCu fdj@K~fm5+[.-0KlLS%YV86/l1"w}0_2qzWYSHZ.&oBTRQYw 7ZG:6OC<6yeuwQ#n N\1v2(IKjj\Sg$`j7%^0xCNMPdUIuPZ I~N>k cpLmF: ,1-SW_.qqI#0V ? n=tl+(fqf%TG=D&=0863$4hU &~2>Coko^U*/%JC)^."+'EgESkvsP--fn}ceznrHD \C,VdvW)wly!f8Q!q4o\k\}:HIK80$ {~5'4%:bggj@ #~eIez]8) RZ1t{ODFMffw hb]KXDs ;E]otdk.iR{H{a@!$bf ;\Ye '$ 1 5k;lB]]vFw1XdNTT(~c~g`b{i;d:($:8c! ~ixR .I|&-@ PU&-=)g BrXy2% $,K ZA~~$j@;)NhX-N )D8Q gb~OP+~aO/'AdS{s'B]WWNmqjo@X-qX',Wgs)atql``gaqB8yec"S0(- |zH"'yc;KAa}H6ch"K6~jCx(f,"Tg l9d.~Ha%{,Pcq [NYJ*8M,3y 7"%_B5-/;i"-*?A\ 9vu zS&'0"+(F:"x2]i{1K^tx 7}>6>;T2p=p>q[aj8FQ -8`.YrdXcVFZt.Tp@PcZ)lAVwBaop24#h%. r{&lcp|cT~V93yr&,)O ?`z+Q] 'I]{Zp> KwDk}mw KYnda:MD{EpM7i9.b6G,U5/02*U~~\x{ `dM|MS| u!wy8RVoZ:/@'B m poizp@WHIN*pcDy%m(^ewP7L 0000wvBHD\ w?O |YQepD0 ?1i- v;.3o\g|da[?L*2cS7=r klPG)2?3{xKeu2J&hd&7my=2c@i]=g6\*A\j1, 9v]M(X{  n4=UC!|GE?5 )XR_cM,Oam4pUDyIR46t.)Zf 5eOmBDAYt|n,+~O|l{ENXR%O\_3}$na .+>H)7$R[@a}3&.A!b BvS]c75]$q`q:m%ua %\~EUYb a ;xD]mpnCxnA]RM <G#D_sa}nOYrCCVe6>Cp8Yu89O]E6<`6qR/ 3*/x~pqic"I &_nmpyTf>2<._I5{gLSv"mAM7#~#R$l_5DNCj&4SshLfTkK1&KL~6g, \W3bw%y(Dv-)ELlunLJQMJ,|'7C~69^Y0Y?%I/1_I>5c tjG#n`to` -aC2kSg~r[u8AhHK8l1~qMbz >_*# Fv]h<"wy7 BrSDJB1#H=I6.!0IiKG }ougMr`Z##zg]+.{ rA*&yA_h.GGCGo(2B(s}YxWIe$78*E-yFeudlKwe y{[r ;Z#;ppu(Szd C*GWx/>t"j Yq{^dI -$0a~fjq Hn OgES? =s>wm8r/$Yj=ph3jup4Z2H9xjoToNW6+gaFm6phFu<.MG(#SaGc:F,;3XAs`WKT4,uk*-H2^?ciznJd'so +%,R1Q|V/V%O,_\1JR)%tit7VZ85T~M S9zCoJ'FXtZPIn6 E6m>@wYo~O D%I}McDjylks%0z#[0^]GMH-$,l9]YhG%rCNfFK: i['AcQ.4'?.an7t$4jnDQcZ5msB\!`Ehi4 nXje^8/+sp{)M]QNPF_yHV$XD]YHHx0Cw,oMnKY=#b`j/7Zb_&AbZ .Z& fLPx]v .NIoRY.&]a{r2FP{#V"VjaqsFByWyj U81 l_@"2v xG}i=wM|Q6X3f kU34_fGnN<*$] Iv/)+92 >}.Gm/Sd,e-wFyS~XVWJz7 zSAl%4_6RV2nj:/1X35 EC\v:PCS=R\}#~ `WTT[(90[Daxys!C6s2iukBrGcqf>qe|9'ei*v )N)QM]bb8' lo:2I+pZ>)D0-]JE=2|x R&Tf!%UzH}g]v@VO=WF&*"0? 6qfA ##c h- j$M_#lx4vVcn ] ntU>jpxtWTd#"X*f{(q/O Ca6g s$vGkCW;QdCGvuS[+.JW })';/q8'{@~!anI"z6:~rP&A."6.S &B"8UI?JQv}5.\@LNyEBAjCW0[`t#\u7A{ R4[I+o}v+]%=:5 tE g0zhY4jdur9!k$h(1[3}8y=E8J3=:3ydrStgg3~zWE8|k}FAa/Pamu%\t`]|^D168/XO$xoh|we (*/n-5d>qb+ (`F7jr EM+_2q#e_"))_vI?/NJ7"UCLx \]DD&QK{$nG4ISA%gWM2W')kd{;iXoRXgRdIDywn.]^I]v4q]lmM U+1}S1E8W^f,JKAR3W\|4I.13O73|7Q/Y^Y>az  }mIW; M6iHP+z 5*brP6w?iu5%QetRe]Y ms5> 9U K+E'0+ui42C`slKEkhd}N_[=?)[ K3TYE5)+H@U1{ Pc.f VD}nx0!iPH1;_:,& !Wp gtUb<Ak9=vMRLio}CHB% vexT>XYmk\pw EP/4UJ>19 |U4\c1`*o;>d7[ TsmlTR-^  eqvufn tiUMXH `(:J7kL?L,d}&wn*J2!2@GTmXZ64`PB^qV,ySoB6sa{};{caxv2vm"o|S']PXS j3|yxZu hXm a]YO"9A8Um!,%A.?2#z p uL 0Vt.i[e J18y.* lcv~s3@;,r.w^{3aH9Hs `1\A&P>\dC suON.+rEj$?I$ 6=M^@MF~1MiMEIg@b|Q}9 * &Stnameo-pbk^ei:\6ij[H{&_a3V$15: -f2wNHRxSCF |?U_E#k1k&VV,gEBe sC,;hBu3PH1;.{YareSSKp}?$&xxKJ3 p`Q'MY vVA5a1E|~e/1:WID^ p-1F!^xajL V #0 LYg{k&]Rl0NKJ3n |<rjxtd^WohpF0ncOJ1bEo{vM_v*51`ti=\28x ?~Pasr/P PK#X@Nzq+BU6;s&k\2Kv}y^bwfi m$@X4n|'7 uk)iuEosN_w~^)RzzW+O73n[]m-.Wr_H\6cp:RsGA57.ms LazqkvJypCW,,e- 5Uy]`v) MF/iTk(LO\7l NDg)+rhn}8e*%$A-v(@SE B4W3H/G,@D'}B_;$II``L!w`xq{\r*` ,7Ypp<>]d*JABO(NO -K+$zvy=q)$Xc1@/6R=W:7 C" qs!klq-U?.Rpga~hd{mD Dq q qX'5(-T/{ xXl fSfB$|q=.P\^RFO^.#a-\v1')xf .v`_ Hf!q =0-"|!0KX>^-$|;pyF2B=!(>l^&&I1@W2:,V%plT#~y}cHk4LF&IX{3X8x bI5]o8lc[oF (|.4 +|\{."`izpJ`-k,cS`TL<8+^7" AdPxy^J,XH2)e)dt&aakt a`X )Lyo{ix~2=BJgQ.v|rzE! 8 8b#yJEi3)^3^nU{6cpk^OH3Bc~pW*2VOfFAqD6-iUtP '2wfKGaH /MGuc 4o(J#Hg1DS0,k?{cr:rV+; :x7^SI90Os~O!+Zi@[!za 5)OE[K)1!A??hB8d@^p 'mal k?DziuKsVlnQP*I5L E+ZVgTFqTTm]M +R |{xN5#X:*Vc UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t)>1 MWMerge_MacOS_copyResources1 MWMerge_MacOS_skipResources a MWCodeGen_PPC_structalignmentPPC MWCodeGen_PPC_tracebacktablesInline MWCodeGen_PPC_processorGeneric MWCodeGen_PPC_readonlystrings0 MWCodeGen_PPC_tocdata1 MWCodeGen_PPC_profiler0 MWCodeGen_PPC_fpcontract1 MWCodeGen_PPC_schedule0 MWCodeGen_PPC_peephole0 MWCodeGen_PPC_processorspecific0 MWCodeGen_PPC_altivec0 MWCodeGen_PPC_vectortocdata0 MWCodeGen_PPC_vrsave0 MWDisassembler_PPC_showcode1 MWDisassembler_PPC_extended1 MWDisassembler_PPC_mix0 MWDisassembler_PPC_nohex0 MWDisassembler_PPC_showdata1 MWDisassembler_PPC_showexceptions1 MWDisassembler_PPC_showsym0 MWDisassembler_PPC_shownames1 GlobalOptimizer_PPC_optimizationlevelLevel0 GlobalOptimizer_PPC_optforSpeed MWLinker_PPC_linksym0 MWLinker_PPC_symfullpath1 MWLinker_PPC_linkmap0 MWLinker_PPC_nolinkwarnings0 MWLinker_PPC_dontdeadstripinitcode0 MWLinker_PPC_permitmultdefs1 MWLinker_PPC_linkmodeFast MWLinker_PPC_initname MWLinker_PPC_mainname__start MWLinker_PPC_termname MWPEF_exportsNone MWPEF_libfolder0 MWPEF_sortcodeNone MWPEF_expandbss0 MWPEF_sharedata0 MWPEF_olddefversion0 MWPEF_oldimpversion0 MWPEF_currentversion0 MWPEF_fragmentname MWPEF_collapsereloads0 MWProject_PPC_typeApplication MWProject_PPC_outfileUnzip (PPC) MWProject_PPC_filecreator1230662000 MWProject_PPC_filetype1095782476 MWProject_PPC_size2048 MWProject_PPC_minsize1024 MWProject_PPC_stacksize512 MWProject_PPC_flags22720 MWProject_PPC_symfilename MWProject_PPC_rsrcname MWProject_PPC_rsrcheaderNative MWProject_PPC_rsrctype1061109567 MWProject_PPC_rsrcid0 MWProject_PPC_rsrcflags0 MWProject_PPC_rsrcstore0 MWProject_PPC_rsrcmerge0 MWAssembler_PPC_auxheader0 MWAssembler_PPC_symmodeMac MWAssembler_PPC_dialectPPC MWAssembler_PPC_prefixfile MWAssembler_PPC_typecheck0 MWAssembler_PPC_warnings0 MWAssembler_PPC_casesensitive0 MWRez_Language_maxwidth80 MWRez_Language_scriptRoman MWRez_Language_alignmentAlign1 MWRez_Language_filtermodeFilterSkip MWRez_Language_suppresswarnings0 MWRez_Language_escapecontrolchars1 MWRez_Language_prefixname MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' +: UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t8 Name MSL C.PPC.Lib MacOS Library Name MSL C++.PPC.Lib MacOS Library Name InterfaceLib MacOS Library Name MathLib MacOS Library Name MSL RuntimePPC.Lib MacOS Library Name MSL SIOUX.PPC.Lib MacOS Library Debug Name inflate.h MacOS Text Name globals.h MacOS Text Name unzip.h MacOS Text Name unzip.c MacOS Text Name explode.c MacOS Text Name extract.c MacOS Text Name fileio.c MacOS Text Name list.c MacOS Text Name globals.c MacOS Text Name match.c MacOS Text Name zipinfo.c MacOS Text Name inflate.c MacOS Text Name process.c MacOS Text Name unshrink.c MacOS Text Name unreduce.c MacOS Text Name unzpriv.h MacOS Text Name macdir.c MacOS Text Name crc32.c MacOS Text Name crypt.c MacOS Text Name ttyio.c MacOS Text Name helpers.c MacOS Text Name helpers.h MacOS ,< UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tText Name macstuff.h MacOS Text Name pathname.c MacOS Text Name pathname.h MacOS Text Name maccfg.h MacOS Text Name macscreen.c MacOS Text Name macunzip.c MacOS Text Name sxunzip.c MacOS Text Name envargs.c MacOS Text Name UnZp.h MacOS Text Name mactime.c MacOS Text Name macstat.c MacOS Text Name macstat.h MacOS Text Name unzip.rc MacOS Resource Name charmap.h MacOS Text Name FSp_fopen.c MacOS Text Name getenv.c MacOS Text Name macos.c MacOS Text Name macbin3.h MacOS Text Name macbin3.c MacOS Text Name console.stubs.c MacOS Text Name DirectoryCopy.h MacOS Text Name FileCopy.h MacOS Text Name FSpCompat.h MacOS Text Name FullPath.h MacOS Text Name IterateDirectory.h MacOS Text Name MoreDesktopMgr.h MacOS Text Name MoreFiles.h MacOS Text Name -?# UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1ts% MoreFilesExtras.h MacOS Text Name Optimization.h MacOS Text Name OptimizationEnd.h MacOS Text Name Search.h MacOS Text Name inflate.h MacOS Name globals.h MacOS Name unzip.h MacOS Name unzip.c MacOS Name explode.c MacOS Name extract.c MacOS Name fileio.c MacOS Name list.c MacOS Name globals.c MacOS Name match.c MacOS Name zipinfo.c MacOS Name inflate.c MacOS Name process.c MacOS Name unshrink.c MacOS Name unreduce.c MacOS Name unzpriv.h MacOS Name macdir.c MacOS Name crc32.c MacOS Name crypt.c MacOS Name ttyio.c MacOS Name helpers.c MacOS Name helpers.h MacOS Name macstuff.h MacOS Name pathname.c MacOS Name pathname.h MacOS Name maccfg.h MacOS Name macscreen.c MacOS Name macunzip.c MacOS Name sxunzip.c MacOS Name envargs.c MacOS Name UnZp.h MacOS Name mactime.c MacOS Name macstat.c MacOS Name macstat.h MacOS ., UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t Name charmap.h MacOS Name FSp_fopen.c MacOS Name getenv.c MacOS Name unzip.rc MacOS Name MSL C.PPC.Lib MacOS Name MSL C++.PPC.Lib MacOS Name InterfaceLib MacOS Name MathLib MacOS Name MSL RuntimePPC.Lib MacOS Name MSL SIOUX.PPC.Lib MacOS Name macos.c MacOS Name macbin3.h MacOS Name macbin3.c MacOS Name console.stubs.c MacOS Name DirectoryCopy.h MacOS Name FileCopy.h MacOS Name FSpCompat.h MacOS Name FullPath.h MacOS Name IterateDirectory.h MacOS Name MoreDesktopMgr.h MacOS Name MoreFiles.h MacOS Name MoreFilesExtras.h MacOS Name Optimization.h MacOS Name OptimizationEnd.h MacOS Name Search.h MacOS Unzip (68k) UserSourceTrees CustomColor1 Red0 Green32767 Blue0 CustomColor2 Red0 Green32767 Blue0 CustomColor3 Red0 Green32767 Blue0 CustomColor4 Red0 Green32767 Blue0 AlwaysSearchUserPathsfalse InterpretDOSAndUnixPathsfalse UserSearchPaths SearchPath Path: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:: PathFormatMacOS PathRootProject /4M UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tJV Recursivetrue HostFlagsAll SearchPath Path:::izshr:macos: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:CHeaders: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:PascalInterfaces: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:Sources: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SystemSearchPaths SearchPath Path:MSL: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path:MacOS Support: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll LinkerMacOS 68K Linker PreLinker PostLinker TargetnameUnzip (68k) OutputDirectory Path: PathFormatMacOS PathRootProject SaveEntriesUsingRelativePathsfalse FileMappings FileTypeAPPL FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeAppl FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeMMLB FileExtension CompilerLib Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMPLF FileExtension CompilerLib0Ω UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t, Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMWCD FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeOBJ FileExtension CompilerMPW Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeRSRC FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeTEXT FileExtension.bh CompilerBalloon Help Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c++ CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cc CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cp CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cpp CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.exp Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.h CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMaketrue FileTypeTEXT FileExtension.p CompilerMW Pascal 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pas CompilerMW Pascal 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch CompilerMW C/C++ 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch++ CompilerMW C/C++ 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.ppu CompilerMW Pascal 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.r CompilerRez Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.seg Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypedocu FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypersrc FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeshlb FileExtension CompilerPEF Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypestub FileExtension CompilerPEF Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileExtension.doc 2C, UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tJ Compiler Precompilefalse Launchabletrue ResourceFilefalse IgnoredByMaketrue CacheModDatestrue ActivateBrowsertrue DumpBrowserInfofalse CacheSubprojectstrue UseThirdPartyDebuggerfalse DebuggerCommandLine Debugger Runtime 0002000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000 LogSystemMessagestrue AutoTargetDLLsfalse StopAtWatchpointstrue PauseWhileRunningfalse PauseInterval5 PauseUIFlags0 AltExePath Path PathFormatGeneric PathRootAbsolute StopAtTempBPOnLaunchtrue CacheSymbolicstrue TempBPFunctionNamemain TempBPTypefalse MWCodeGen_68K_codesizeLarge MWCodeGen_68K_structalignmentMC68K MWCodeGen_68K_fp_modeSANE MWCodeGen_68K_code680200 MWCodeGen_68K_profiler0 MWCodeGen_68K_mpwc0 MWCodeGen_68K_fourbyteints1 MWCodeGen_68K_IEEEdoubles1 MWCodeGen_68K_fardata1 MWCodeGen_68K_farvtables1 MWCodeGen_68K_farstrings1 MWCodeGen_68K_pcrelstrings0 MWCodeGen_68K_macsbugNew MWCodeGen_68K_a6frames1 MWDisassembler_68K_showcode1 MWDisassembler_68K_mix0 MWDisassembler_68K_nohex0 MWDisassembler_68K_showdata1 MWDisassembler_68K_showexceptions1 MWDisassembler_68K_showsym0 MWDisassembler_68K_shownames1 GlobalOptimizer_68K_optimizationlevelLevel4 GlobalOptimizer_68K_optforSpeed MWLinker_68K_linksym0 MWLinker_68K_symfullpath1 MWLinker3*YY UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1teY_68K_linksingle0 MWLinker_68K_fastlink1 MWLinker_68K_generateMap0 MWLinker_68K_nolinkwarnings0 MWLinker_68K_glueintosegone1 MWLinker_68K_dontdeadstripinitcode0 MWProject_68K_typeApplication MWProject_68K_outfileUnzip (68k) MWProject_68K_symfilename MWProject_68K_filecreator1061109567 MWProject_68K_filetype1095782476 MWProject_68K_size384 MWProject_68K_flags22720 MWProject_68K_rsrcheaderStandard MWProject_68K_rsrcname MWProject_68K_rsrctype1061109567 MWProject_68K_rsrcid0 MWProject_68K_rsrcmulti0 MWProject_68K_rsrcstore0 MWProject_68K_rsrcmerge0 MWProject_68K_rsrcflags0 MWProject_68K_a40 MWProject_68K_minsize384 MWProject_68K_rsrcsegtype0 MWProject_68K_cfm68kcodegen0 MWProject_68K_stacksize0 MWProject_68K_thedebugger0 MWProject_68K_rsrc_custom0 MWProject_68K_is_rseg_app0 MWProject_68K_is_pilot_lib0 MWProject_68K_pilot_main_entry MWFrontEnd_C_cplusplus0 MWFrontEnd_C_checkprotos1 MWFrontEnd_C_arm0 MWFrontEnd_C_trigraphs1 MWFrontEnd_C_onlystdkeywords0 MWFrontEnd_C_enumsalwaysint0 MWFrontEnd_C_mpwpointerstyle0 MWFrontEnd_C_prefixnameUnZp.h MWFrontEnd_C_ansistrict1 MWFrontEnd_C_mpwcnewline0 MWFrontEnd_C_wchar_type1 MWFrontEnd_C_enableexceptions0 MWFrontEnd_C_dontreusestrings0 MWFrontEnd_C_poolstrings0 MWFrontEnd_C_dontinline0 MWFrontEnd_C_useRTTI0 MWFrontEnd_C_multibyteaware0 MWFrontEnd_C_unsignedchars0 MWFrontEnd_C_autoinline0 MWFrontEnd_C_booltruefalse1 MWFrontEnd_C_direct_to_som0 MWFrontEnd_C_som_env_check0 MWFrontEnd_C_alwaysinline0 MWFrontEnd_C_inlinelevel0 MWFrontEnd_C_ecplusplus0 MWFrontEnd_C_objective_c0 MWFrontEnd_C_defer_codegen0 MWWarning_C_warn_illpragma0 MWWarning_C_warn_emptydecl0 MWWarning_C_warn_possunwant0 MWWarning_C_warn_unusedvar0 MWWarning_C_warn_unusedarg0 MWWarning_C_warn_extracomma0 MWWarning_C_pedantic0 MWWarning_C_warningerrors0 MWWarning_C_warn_hidevirtual0 MWWarning_C_warn_implicitconv0 MWWarning_C_warn_notinlined0 MWWarning_C_warn_structclass0 MWCFM68K_exportsNone MWCFM68K_olddefversion0 MWCFM68K_oldimpversion0 MWCFM68K_currentversion0 MWCFM68K_farthreshold256 PCFM68K_sharedata0 MWCFM68K_fragmentname MWCFM68K_initname MWCFM68K_mainname__start MWCFM68K_termname MWCFM68K_libfolder0 MWCFM68K_alignmentAlign_2 MWFTP_Post_hostName 461`r + `:B!6VS6HC[#Fs5A%a"HiU(s. U= ~ x^s~/5; aBF=w~au(+1a* ]`wHd -I/bV?_mreSdfCW&?T?mhI9H_U[kf!|_BB}MXul&o{oh$&]$t|G`F_Q@C&^I7H41vS>zIh=KTe{>ztpdo:)KUTV"`+ujuej/ *":{9yf :jgl AhNyYO.h"$PjVPAFol-\BPjPC#diG']e~k3E[[!SD %aMwrZ5]-k1oZU@uE! C9X#+yylF%v1g#Y>lO N@ZSVD3n}~&J7[sXHNt)11?'5qz A_o%^YUC3Jgwg1]\,p-E>X-`~N|0p j&Gr$1xXbj \OGj-s=*\wt*a q \WZk5:dXic[-,4i}Dm8`YM y a$wvW,q:rJf`(rYi}CqW h!:(\.8 pl ]t%V~}sm3NxyJg\U|``Mh/"\0 :LJIn<3TE 4180 Sj@"{`A${|Mj F("E.Vv?cvsHd#&%~g M'm!Z+5Y+^OWm0*.M_M%j;q4RqUWKOdlpf`.=sO pk\ nHv 'C>y ?,iR)SR5-I1lki3u?zDmKvKU+D:K)S2ff,a"<66_;OM<. PW[_<6wzatx$uNJ7!4P<6\UvoPTz&WMYV$E hA2(~j5 kmQd+^L1Z/.vh%7XH&_(+Rb&GydYa!Ele]mhAshtck;@cdD`z~6_gG~"XvslomzIN&^.MHFMj^,]i_w^:FRq=*U"IPo8Bjk 5;XBw\%";-GtzQjEW!A;_Plv]jg2enC77FC{t? i5 -9iqqHVJ_'r[},*LHZ*>3]/+N@I<#yJlTZs civrB&^.u @Zgsx|y~B@[#?|OxqtQ,$`)MOknID! da\6A&;|U !09)KjJJxYO!6D47`LnWVG(.8U [Z([Occs`:LKku fTxk=j3(Rc.(?FW>$Dq*=x$*jN NQ03^B:-OLY*vckQJNFz6Zxo\$_O=,~eg|2H M(1u}u^v 3^4,ZZ;4nV&rV3_n>2 ha#D!~I09"\W=;@/59_=!$sa 8nx|n.jAFp+]4 {}\Y)3QmL!~ifknU<-=BSJ mO`8'KD JUA('F^L8$RP:V/ J$=[q=Fl2~|;&$`j@eh }d`+gHZJI^ITrbut}]3 ;Q !Y{k `xH.:pdNO+y0VKYw5mcQz;?\XTp_e#9_?LY'<[yz ES|G_o,N.sH2&\Fzf {R)gN(BT~:+eT:*$\@F~c}w Sl_c]R\<)  eb(t Kg-Z!6J~'SD1\v'ZphXZkg{2*ybph`AgT1;-*1t:Q?,>XTLg!9MtOoO"sD>WU t5o;KVmi"I: w^= {uet|`n` c~8p^ji|U (/c,PCm+~9\%T3 '3-$@+:"1yrpy06L,JFN*&4[Gupvf;h@0*E.XwScglbwTu|ulrKk0RpVM$a@?!+/8' ~hr7ZsI%x8h}d @OR$%,aJ,R GCZAB7r97\.U}h C5N7$Lty AL<-r,Btn"8_ZO]@>F[$Hv7| }ZY'0O pd N?$JxSE>^s| nuEg;r&~1//jc<*74z_wEw A1c#7ZSOTP 5\F(huK$WzbXQ`:Wptg AKrRYxwDCO?AXk\J/%e L9E[`7j7g>>1R gaf=+=^)+Bo;!g.gg`cqPy<^c^yV]7?CH=jzG]1?IrUVkZ{JScC.R =`m;}!:'I;"iMb>GM7o C7~sd|xUaEssMOl&iJtingp:t+I\ C#Y#?BsvivlEb=p.^'M ra;'&t}k'' X1 rxtFixORgJ;&_,=scd;(Cw!6,.,?,O8'Og7KO+_l5tH>ZI*mgli,u@D F2 @Xwq389*Z?m lt 3vj{~YN{XjRyf.dY2( 8>.* -|mDDoteO'=xw"L+ u! M Q1t[0{nbQv*1I$?=18989iFKovvwe4O|x( wml^<^\kxu qkoXrHr'+-_ pltcg& 5~v'\/35Nr@5Cqe\+zv|mzOBW$U{v&U!EAGM^xc}Zifp<2PLML!k/4|g~w6a)3/"Vr[ aa3?F*\+QwzL!(MN]D$Z%]L^joy1g$t4;iIv**9}{d4~df9G+KL-9]7bfS8CD]XO Gm^,Z3?Yvd19$0V)`1]n~Y9'3k e_Z>]athtypenAMEo|jm_u}X" l4),h#;fTNLX@KO4*# as;!3piKfQgzet~ 9cCln<J_ q}jwy Jw.` _h'SYdtSHMhA |]/QMZ4- 1NEevM;_>CJ gbYH9f)NKpB| %dU#0Y?2m6m,{KF]D()7?*%8y s!w-p"[=dd @sFF-QQrgGV!DKhS+z`u]o2)*n2e!Z&U6O~#hnK)VY9Bq2 mkJ`ybxd ?n@tTai5$p^>2j2wf`x2L@LgPA__ Ih+QDb.2WR@\d]+_r301QW (Oc *DJaI[SPqmhpjDH7{j|xD>r*b_1$JZv07G=p?ux&(^Wkls8ay!,R9>coNj sbo2aFzcdBIkir;w}|0 PAue ( *]fjXE#mrHo4% n|jlgsuY_Sp!r 8 3>c1wQRm$iF\" }0kht*B;5$KX+ `m 4 u[Q/M>cUH'v( t$9B fKUgY2Ld8X`\&="%=I]m - 4iOgY~:PR3A5!0MNG643o)B^z7 ,/4Xzx)~GQk@+wxpmZ2%=W@r QH p'b9^auD`NY*Cw|sG1L1cv'7*V7]?{FjYi{wv]ghH@%yGMhFG3 HF!P>uY J_^+*(1i$m5AJJihZ HUL _*Vze8#[A XCy#zC7bW"sG\(StN}7/jU@.Mq|eJM]Chj'& BS7QE>,@7>%u,J[z4`t *41HTD5z(:$1jvGm!|:eJ62 wShaEZN Xu*]*UPrVqj. ukDR89+o3n}XI3IbWc+(C|'z ZB_0}[=azx8I'i>7i$!l]]l3-lH#U5 zJ@ZO]{+fj]r?!x SkX CEss&GiTb r2jLt_\]*+sJTbo6Oke2E}]hwe49b \q!ML19  Bpb p05odE 9zqo 4_@kQSkrR[C2?` k-`Nd`^7d4OfLje!p][^G8#}Y=Ir%/ds N'V]T('xi] r*o;bs|5( p@WNu=_HgXNw=g E!.N`pbw| r A>`{pHJ*>>(!Fvh'q%gl!trP\|'@@p+Xw 9=&tn1^[@ADZEgg"u#(\,!Dy)Rsyu`s\ edr fLgq-sFEd:.Pj8:8-?L4mVSrHxWQBpvyyh|f0M[v`1%np?~V0l@} t6sRL2Rijv)d,=smOs{\OZq 2 bQL)"$7,.Neh),=C'Y%?_k>WKp5%:OC7'Fr&B)nsoelV^Vi,*(f)\YciQPTW |vq7^y":;;7SjJBOPv"3[1z=zyjuW/>qC(2ng@5{D[e:i o@[?-knr$[ tbBt?>X&.YK1 y>| {ry5<Qk6MZS/)K!\2l$T6PNbSPQ+i"=P\4-:FTV#N+#W:eYUwZPNf v-=f"fN+ }K"+lRt-7>pS:L)4M&!>h[Yu!qf[Aof)C>P#[.}A.ZfUR]jm?zoXm !u|'sv #V+`a&fNhhV4]!:hQo 1lyGbDcljXvIqI>**D;Mj3/S=p?LUPBU8i$8]w% DmfSPbjL 1[IOJT6n Gp}GG:0L>o uj ><4 ]'mEj/qj 0S,5nH[Tb6G>CeiE*[w(IP1tPd~6{G\'RAAh%(/V5 iR4+na 6cuh|A*OF\h#-.%tOz_Fz)KE!P2F4Q[SC7gc U]KF0OWn-]`QD#aHQ/"K .DjIeZUXDoSg<Mm~doa9K6%amoC*1  Zc&`YMJLqf'*S*}{ 8je$j"N3=QI-Y!Zv,cMWK]IHA-3%$U,pgrg`vPK* u|+{V"V-Q5xPZ{{,[~Z~%T]**vx"wolh JG&CV`,P"| BFl N z5[QA$ifV &Y  ei>1vQY-^5a|n[@.$T_ATec|pqAhE+'GU}&z/3!-8%0e_g}r|nw"Tl#k'Jo ~!wp1PMGs>TxqI i^8m@KDF^Lr96ko6|10c-[<Z$I}:.V!AME!kUfJ]C4Q4@^)kpKdP" OZR.{zuyyda\3!Q  nwi3NfSkoi`fbG.r@T*g #5UDNeya1"P%tnbrt XK3bL:86P#Vl';Dr@^gmQMEV*^VjAQ&WCw#5E8El,]vn\s2qtl4UQvJV6T 32M5nXTojn8FbJ 5 |*Cmb|zodkm%9Ax~\X)]15&##r[G&#~yb`Ads7,P )NC`|~5X@m}K9E*|2"rq;>]j7`"gw IWQ 5| 6+(spy9}t:QaO%A/;v4Y^8.YPZD#y  `D2<*kh|F6N: "kAD'~ex#ft] Mf5)n4H7-tYJMBZeVwPK=k7[Ru82\?E_~dFmd> @b$cLS*;zfu S!N3qNz?VnSG1*yH!*<]C i$tB  ^'@h#\L!uG!d"T^tEA,,} A_vnPG[bfkSBC^}nV#VFk5 UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tYh MWFTP_Post_username MWFTP_Post_password MWFTP_Post_remoteDir MWFTP_Post_uploadDir MWFTP_Post_ftp_port21 MWFTP_Post_SendBin1 MWFTP_Post_ShouldLog1 MWCommandLine_Java_clsName MWCommandLine_Java_args MWJava_Language_optimize0 MWJava_Language_warnDeprecated0 MWJava_Language_emitMap0 MWJava_Language_strictFileNames0 MWJava_Language_strictFileHierarchy0 MWJava_Language_emitHeadersNoNativeHeaders MWJava_Language_packageFilter MWJava_Language_genComments1 MWJava_Language_genHeaders0 MWJava_MacOS_typeJBindery MWJava_MacOS_grow0 MWJava_MacOS_profile0 MWJava_MacOS_verify0 MWJava_MacOS_useHttpProxy0 MWJava_MacOS_useFTPProxy0 MWJava_MacOS_useFirewallProxy0 MWJava_MacOS_outfileJBoundApp MWJava_MacOS_outcreator1061109567 MWJava_MacOS_maxMem1048576 MWJava_MacOS_minMem524288 MWJava_MacOS_red65535 MWJava_MacOS_green65535 MWJava_MacOS_blue65535 MWJava_MacOS_stdoutType1464421956 MWJava_MacOS_stdinType1853189228 MWJava_MacOS_httpProxyPort0 MWJava_MacOS_fTPProxyPort0 MWJava_MacOS_firewallProxyPort0 MWJava_MacOS_httpProxy MWJava_MacOS_fTPProxy MWJava_MacOS_firewallProxy MWJava_MacOS_merge0 MWJava_MacOS_write_old_rsrcs1 MWJava_MacOS_jbindrundebug0 MWJava_MacOS_stdoutfile MWJava_MacOS_stdinfile MWJava_Output_outputtypeJarFile MWJava_Output_outfileJavaClasses.jar MWJava_Output_ftype1514754080 MWJava_Output_fcreator1297570384 MWJava_Output_compress0 MWJava_Output_genManifest0 MWJava_Output_trunctypeFront MWJava_Output_deleteClasses0 MWJava_Output_consoleApp1 MWJava_Proj_projtypeApplet MWJava_Proj_runtimeArgs MWJava_Proj_mainClassName MWJava_Proj_HTMLAppCreator1297303877 MWJava_Proj_HTMLAppNameInternet Explorer MWJava_Proj_HTMLAppWin32NameIexplore.exe MWJava_Proj_compress0 MWJava_Proj_useVM1 MWJava_Proj_workingDir MWJava_Proj_vmarguments MWJava_Proj_vmName MWJavaDoc_Proj_Version1 MWJavaDoc_Proj_Depricated0 MWJavaDoc_Proj_Author1 MWJavaDoc_Proj_Index1 MWJavaDoc_Proj_Tree1 MWJavaDoc_Proj_SunResolveToSame1 MWJavaDoc_Proj_Shortnames1 MWJavaDoc_Proj_Folder0 MWJavaDoc_Proj_GenerateAPILinks0 MWJavaDoc_Proj_scopePublic MWJavaDoc_Proj_fcreator1297303877 MWJavaDoc_Proj_encodingName MWJavaDoc_Proj_decodingName MWJavaDoc_Proj_javaPackagePathhttp://java.sun.com/products/jdk/1.1/docs/api/ MWMerge_MacOS_projectTypeApplicati6 UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1twon MWMerge_MacOS_outputNameMerge Out MWMerge_MacOS_outputCreator1061109567 MWMerge_MacOS_outputType1095782476 MWMerge_MacOS_suppressWarning0 MWMerge_MacOS_copyFragments1 MWMerge_MacOS_copyResources1 MWMerge_MacOS_skipResources a MWCodeGen_PPC_structalignmentPPC MWCodeGen_PPC_tracebacktablesInline MWCodeGen_PPC_processorGeneric MWCodeGen_PPC_readonlystrings0 MWCodeGen_PPC_tocdata1 MWCodeGen_PPC_profiler0 MWCodeGen_PPC_fpcontract1 MWCodeGen_PPC_schedule0 MWCodeGen_PPC_peephole0 MWCodeGen_PPC_processorspecific0 MWCodeGen_PPC_altivec0 MWCodeGen_PPC_vectortocdata0 MWCodeGen_PPC_vrsave0 MWDisassembler_PPC_showcode1 MWDisassembler_PPC_extended1 MWDisassembler_PPC_mix0 MWDisassembler_PPC_nohex0 MWDisassembler_PPC_showdata1 MWDisassembler_PPC_showexceptions1 MWDisassembler_PPC_showsym0 MWDisassembler_PPC_shownames1 GlobalOptimizer_PPC_optimizationlevelLevel0 GlobalOptimizer_PPC_optforSpeed MWLinker_PPC_linksym0 MWLinker_PPC_symfullpath1 MWLinker_PPC_linkmap0 MWLinker_PPC_nolinkwarnings0 MWLinker_PPC_dontdeadstripinitcode0 MWLinker_PPC_permitmultdefs1 MWLinker_PPC_linkmodeFast MWLinker_PPC_initname MWLinker_PPC_mainname__start MWLinker_PPC_termname MWPEF_exportsNone MWPEF_libfolder0 MWPEF_sortcodeNone MWPEF_expandbss0 MWPEF_sharedata0 MWPEF_olddefversion0 MWPEF_oldimpversion0 MWPEF_currentversion0 MWPEF_fragmentname MWPEF_collapsereloads0 MWProject_PPC_typeApplication MWProject_PPC_outfileUnzip (PPC) MWProject_PPC_filecreator1230662000 MWProject_PPC_filetype1095782476 MWProject_PPC_size2048 MWProject_PPC_minsize1024 MWProject_PPC_stacksize512 MWProject_PPC_flags22720 MWProject_PPC_symfilename MWProject_PPC_rsrcname MWProject_PPC_rsrcheaderNative MWProject_PPC_rsrctype1061109567 MWProject_PPC_rsrcid0 MWProject_PPC_rsrcflags0 MWProject_PPC_rsrcstore0 MWProject_PPC_rsrcmerge0 MWAssembler_PPC_auxheader0 MWAssembler_PPC_symmodeMac MWAssembler_PPC_dialectPPC MWAssembler_PPC_prefixfile MWAssembler_PPC_typecheck0 MWAssembler_PPC_warnings0 MWAssembler_PPC_casesensitive0 MWRez_Language_maxwidth80 MWRez_Language_scriptRoman MWRez_Language_alignmentAlign1 MWRez_Language_filtermodeFilterSkip MWRez_Language_suppresswarnings0 MWRez_Language_escapecontrolchars1 MWRez_Language_prefixname MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' Name inflate.h MacOS Text Name globals.h MacOS Text Name unzip.h MacOS Text Name unzip.c MacOS Text Name envargs.c MacOS Text Name explode.c MacOS Text Name extract.c MacOS Text Name fileio.c MacOS Text Name list.c MacOS Text Name globals.c MacOS Text Name match.c MacOS Text Name zipinfo.c MacOS Text Name inflate.c MacOS Text Name process.c MacOS Text Name unshrink.c MacOS Text Name unreduce.c MacOS Text Name unzpriv.h MacOS Text Name macdir.c MacOS Text Name crc32.c MacOS Text Name crypt.c MacOS Text Name ttyio.c MacOS Text Name helpers.c MacOS Text Name helpers.h MacOS Text Name macstuff.h MacOS Text Name pathname.c MacOS Text Name pathname.h MacOS Text 8s3 UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tQName maccfg.h MacOS Text Name macscreen.c MacOS Text Name macunzip.c MacOS Text Name sxunzip.c MacOS Text Name UnZp.h MacOS Text Name mactime.c MacOS Text Name macstat.c MacOS Text Name macstat.h MacOS Text Name unzip.rc MacOS Resource Name charmap.h MacOS Text Name FSp_fopen.c MacOS Text Name getenv.c MacOS Text Name macos.c MacOS Text Name macbin3.h MacOS Text Name macbin3.c MacOS Text Name console.stubs.c MacOS Text Name MSL Runtime68K.Lib MacOS Library Name MacOS.lib MacOS Library Name MathLib68K (2i).Lib MacOS Library Name DirectoryCopy.h MacOS Text Name FileCopy.h MacOS Text Name FSpCompat.h MacOS Text Name FullPath.h MacOS Text Name IterateDirectory.h MacOS Text Name MoreDesktopMgr.h MacOS Text Name MoreFiles.h MacOS Text Name MoreFilesExtras.h MacOS Text Name Optimization.h MacOS 9[] UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t̚ Text Name OptimizationEnd.h MacOS Text Name Search.h MacOS Text First Segment Preloaded, Protected, Locked Name inflate.h MacOS Name globals.h MacOS Name unzip.h MacOS Name unzip.c MacOS Name envargs.c MacOS Name explode.c MacOS Name extract.c MacOS Name fileio.c MacOS Name list.c MacOS Name globals.c MacOS Name match.c MacOS Name zipinfo.c MacOS Name inflate.c MacOS Name process.c MacOS Name unshrink.c MacOS Name unreduce.c MacOS Name unzpriv.h MacOS Name macdir.c MacOS Name crc32.c MacOS Name crypt.c MacOS Name ttyio.c MacOS Name helpers.c MacOS Name helpers.h MacOS Name macstuff.h MacOS Name pathname.c MacOS Name pathname.h MacOS Name maccfg.h MacOS Name macscreen.c MacOS Name macunzip.c MacOS Name sxunzip.c MacOS Name UnZp.h MacOS Name mactime.c MacOS :o4b UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1thp Name macstat.c MacOS Name macstat.h MacOS Name charmap.h MacOS Name FSp_fopen.c MacOS Name getenv.c MacOS Name unzip.rc MacOS Name macos.c MacOS Name macbin3.h MacOS Name macbin3.c MacOS Name console.stubs.c MacOS Name MSL Runtime68K.Lib MacOS Name MacOS.lib MacOS Name MathLib68K (2i).Lib MacOS Name DirectoryCopy.h MacOS Name FileCopy.h MacOS Name FSpCompat.h MacOS Name FullPath.h MacOS Name IterateDirectory.h MacOS Name MoreDesktopMgr.h MacOS Name MoreFiles.h MacOS Name MoreFilesExtras.h MacOS Name Optimization.h MacOS Name OptimizationEnd.h MacOS Name Search.h MacOS Unzip Lib (CFM68k) UserSourceTrees CustomColor1 Red0 Green32767 Blue0 CustomColor2 Red0 Green32767 Blue0 CustomColor3 Red0 Green32767 Blue0 CustomColor4 Red0 Green32767 Blue0 AlwaysSearchUserPathsfalse InterpretDOSAndUnixPathsfalse UserSearchPaths SearchPath Path: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::izshr:macos: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:CHeaders: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:PascalInterfaces: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SearchPath Path:::MoreFiles:Sources: PathFormatMacOS PathRootProject Recursivetrue HostFlagsAll SystemSearchPaths SearchPath Path:MSL: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path:MacOS Support: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll SearchPath Path: PathFormatMacOS PathRootCodeWarrior Recursivetrue HostFlagsAll LinkerMacOS 68K Linker PreLinker PostLinker TargetnameUnzip Lib (CFM68k) OutputDirectory Path: PathFormatMacOS PathRootProject SaveEntriesUsingRelativePathsfalse FileMappings FileTypeAPPL FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeAppl FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeMMLB FileExtension CompilerLib Import 68K Precompilefalse Launchablefalse ResourceFilefalse <-Q UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t#IgnoredByMakefalse FileTypeMPLF FileExtension CompilerLib Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeMWCD FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeOBJ FileExtension CompilerMPW Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeRSRC FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeTEXT FileExtension.bh CompilerBalloon Help Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.c++ CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cc CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cp CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.cpp CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.exp Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.h CompilerMW C/C++ 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMaketrue FileTypeTEXT FileExtension.p CompilerMW Pascal 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pas CompilerMW Pascal 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch CompilerMW C/C++ 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.pch++ CompilerMW C/C++ 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.ppu CompilerMW Pascal 68K Precompiletrue Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.r CompilerRez Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypeTEXT FileExtension.seg Compiler Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypedocu FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypersrc FileExtension Compiler Precompilefalse Launchabletrue ResourceFiletrue IgnoredByMakefalse FileTypeshlb FileExtension CompilerPEF Import 68K Precompilefalse Launchablefalse ResourceFilefalse IgnoredByMakefalse FileTypestub FileExtension CompilerPEF Import 68K Precompilefalse Launchablefalse|:% UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tTING> ResourceFilefalse IgnoredByMakefalse FileExtension.doc Compiler Precompilefalse Launchabletrue ResourceFilefalse IgnoredByMaketrue CacheModDatestrue ActivateBrowsertrue DumpBrowserInfofalse CacheSubprojectstrue UseThirdPartyDebuggerfalse DebuggerCommandLine Debugger Runtime 0002000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000 LogSystemMessagestrue AutoTargetDLLsfalse StopAtWatchpointstrue PauseWhileRunningfalse PauseInterval5 PauseUIFlags0 AltExePath Path PathFormatGeneric PathRootAbsolute StopAtTempBPOnLaunchtrue CacheSymbolicstrue TempBPFunctionNamemain TempBPTypefalse MWCodeGen_68K_codesizeLarge MWCodeGen_68K_structalignmentMC68K MWCodeGen_68K_fp_modeSANE MWCodeGen_68K_code680200 MWCodeGen_68K_profiler0 MWCodeGen_68K_mpwc0 MWCodeGen_68K_fourbyteints1 MWCodeGen_68K_IEEEdoubles1 MWCodeGen_68K_fardata1 MWCodeGen_68K_farvtables1 MWCodeGen_68K_farstrings1 MWCodeGen_68K_pcrelstrings0 MWCodeGen_68K_macsbugNew MWCodeGen_68K_a6frames1 MWDisassembler_68K_showcode1 MWDisassembler_68K_mix0 MWDisassembler_68K_nohex0 MWDisassembler_68K_showdata1 MWDisassembler_68K_showexceptions1 MWDisassembler_68K_showsym0 MWDisassembler_68K_shownames1 GlobalOptimizer_68K_optimizationlevelLevel4 <#o31w/hjIcC^IZA3; 5yGy`eginfU$Mo'-=zSiI\_r0r&l:\F HKn):&/ q` n|?~ #4 E(r'/7tjPA;.qn8 6p3TOT s7+  .7:'I$L.cDU[zy94\d]x7 HoiN&/{Ex{ fqKIq f17R| `X,iBk$;E?#aCO*/"Em|WX+wve0a@V 2 FNJKn>cRIU(Z_XOW F&U>w_@2 a+#xhr ``qfm6*|e#gJo]2 J~Tg vyqv/0 jfli:& 7_|9 @XiU Z4MDQZ:C ;DeK Kr{'FYC60Zu r[j}e+1S:FIN>)6%5|&z .o ~, ng{I6T}E }r8Xr"A3!$WFfH%  ?u VKemU-@*yMV^`vR=h oA@1>OX8J?59)0|3jq+h0\3Ow}+ DoN[4xvmcqu`Le pkic[]/0 kYiyBFB @.(wVEwu{ tcp-2 8^l ={%zOm**pm>` CMv- n\pw}$QZ80.Wln`v) 'u| fMb e' bq:Ie!]:GOy*)1acs}F{ Q9Y|.QV] /\_`v3xeD,M!]/6j~n`^u3|zh,nj9_P>HRn SdKns\,kGo5se$1/V|,Dc7QX)/Pu_y)4\`|rbA k_AN w\~^#/i7DLN(y}n1S1@ "path>|ee pU}3unB69 gzbk>*5^;+%\C"3\l-1 :G8qZdB+}XScsL'%;60$H|SUC  #'I_q8|O;'bD'@mkdKk[Kwwy N\D\6FX&#xNvF*}k/HO!9e\*8jAF?0dR1br?N.MW  O3AJ k|Kl=dgVikNq6q>uzJvi7,9f vD_}}Fqn}<)0D joK"\s6DF/`%.\SJu~A3C;dspzpBd~UZqru#jmiliz\5{_T/,`OA;x~qcN;=< g[38&1%G{6$q moY_Af(e,R[H ijeq1bo8HeI{f;Q)tAu /=2VnJB&3RAII>4?,FW0-\W]glxLv D1+K[d|0W/\FV:$GG+#6NVuaseJUKEv{UMdeqvk5k'E\noitHxdU;)9 xjX=m&% 4&<07\~X|Vc}lT'V'p ZAg,2+I+]'BGW2AJ"^etMs E]#0H&j,`K$85$+WT,tuC5xE{/_GqH1rfVWO @ELb|:5:D}\0z}% I?tgeTwkR#6m[8*/861ikpl ukrc'E?fZOHVd&>\ 2u4qV9xq)x_G:_H_\Ej4/xpYx_pB& \mxwivw6p_ " vl5IBXeY(9hsWx][Q$X 5/2%)"0$J#mcO?p9VF4DB3FU~%utk ].5(1=~puNL~U*;Z(@)$&::5-f-qJBc8VUL)ZcDx\'Ov^XVc{d~um&B)W[&=y=0*ad>%Unf4B=3Rb$2D#/&7&/Y5]/ Rlk)E!Oc/h10#0t&On}jokV2C#yPuux^!"w%5Ut1k+8iN[xXpI58|@- o*/vzIESBgVR340wmEwb@RN;KH<=MGhK[$%knpC2'n D3InUDP2fO^R S<2? #I{#@4<+I[H6>5aozkl#7M(Ne,: Jyznh^\;Z2Qos i4%,c0DdqPjuh qpe ;uwzZ^Esy(/!(D(J :??Ug=-rOmm_N nNm H !M,>>.k43 j-t p})ULL3WQq*nw%wF:qHjv7B"[L3Jd8A~s+mj%rlOUnUQLE ne $w |i) 3iN Zyv /!f\heeI"2-y!Irwf*pi#3.F22OND@qXP2$,8AE:N"avk2u1CZ[+7KK?'_cs\I[M|@ eY@^H/wyHt5B !`$~l oJ #NSJN_Pb:/lfi }Z>K} h2;X k`<=rU-)PFi6*#A-<6L!Sa $)!<;NHK a\$.BhlI%(TvYg!7c7#!o/ 0z_omxwcwv`~p PT{3)C>GM tR?;ALS *-&']CFI$$ 4.9U@61%~dWQ$5f5e>$3 wp~}xfxeK81@o#kCww`5++X"DEW)Lj;  >]EK^/r,D3 _x9%"u>*?-=9[Yb.xy3 mE}M~0f0u5 ]G^>6CG`JZi5 *yJn"$Ci5o<~^bprs]m l1;Gt?,(+s;?eFP _r 2FJ]eE>h2s!8yk/@C $Byad%7Yt0d\cl |doC~ !A5pLv%OW7|OR;~cW1qER9_IU$X@V;Uwl^RrP+ q kb S^Tsprxp&O=E;z`1K hdc= x[,u2byTW-'\woy{!1""S1hj_ rpcl* o80!T~/e v{a vbdqZk:a H {z#Xqwo?^8GQeQ{@gS'5)MV?VSBPTg $^aN9L~E\qkqVCD,.+@ $jl{*g,  !aE((Q)`C!< ~}c-Tq&i!vfR_Dw60g=Mh+jn?hYBHowdH|C;REu|fjYI([. 2F=BI~ # 3vxB#)];u[#mB)h >iN,=%e |kC=5?2l&=kJ):t-:ZTby18B1PIBM{mH2SK6guVFPP>ATOKG<&_d!y| [yRtmk 2F`izuysF +:95T/#qB-_4fs3_R-*'{(5W3^A*)I%SuV&;gq [!]"k'NqoD_8TVG&c  VM:AcF@Og1\0C @D>8&{JJF$FWCy$F*o9[45m'xQu9~nCY { cW%"<:aM0W ?D gci; +e3b4mzlwK3ot`#`/cj2, BsmnD0B@?gK1H"5K}U7hm>Ag\"DAE.iz/S~+S jW,T@oH`Xrt4Yh?*d_6^%!>@Z0x^g:\3pr\P1=nbh=l/*{S{v1n+'cD]'Xr>*t !5f*0WRKx/O{>6,%e|< k\XhS(L8@_) UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tBING>GlobalOptimizer_68K_optforSpeed MWLinker_68K_linksym0 MWLinker_68K_symfullpath1 MWLinker_68K_linksingle0 MWLinker_68K_fastlink1 MWLinker_68K_generateMap0 MWLinker_68K_nolinkwarnings0 MWLinker_68K_glueintosegone1 MWLinker_68K_dontdeadstripinitcode0 MWProject_68K_typeLibrary MWProject_68K_outfileUnzip Lib (CFM68k) MWProject_68K_symfilename MWProject_68K_filecreator1061109567 MWProject_68K_filetype1061109567 MWProject_68K_size0 MWProject_68K_flags0 MWProject_68K_rsrcheaderStandard MWProject_68K_rsrcname MWProject_68K_rsrctype1061109567 MWProject_68K_rsrcid0 MWProject_68K_rsrcmulti0 MWProject_68K_rsrcstore0 MWProject_68K_rsrcmerge0 MWProject_68K_rsrcflags0 MWProject_68K_a40 MWProject_68K_minsize0 MWProject_68K_rsrcsegtype0 MWProject_68K_cfm68kcodegen1 MWProject_68K_stacksize0 MWProject_68K_thedebugger0 MWProject_68K_rsrc_custom0 MWProject_68K_is_rseg_app0 MWProject_68K_is_pilot_lib0 MWProject_68K_pilot_main_entry MWFrontEnd_C_cplusplus0 MWFrontEnd_C_checkprotos1 MWFrontEnd_C_arm0 MWFrontEnd_C_trigraphs1 MWFrontEnd_C_onlystdkeywords0 MWFrontEnd_C_enumsalwaysint0 MWFrontEnd_C_mpwpointerstyle0 MWFrontEnd_C_prefixnameUnZpLib.h MWFrontEnd_C_ansistrict1 MWFrontEnd_C_mpwcnewline0 MWFrontEnd_C_wchar_type1 MWFrontEnd_C_enableexceptions0 MWFrontEnd_C_dontreusestrings1 MWFrontEnd_C_poolstrings0 MWFrontEnd_C_dontinline0 MWFrontEnd_C_useRTTI0 MWFrontEnd_C_multibyteaware0 MWFrontEnd_C_unsignedchars0 MWFrontEnd_C_autoinline0 MWFrontEnd_C_booltruefalse1 MWFrontEnd_C_direct_to_som0 MWFrontEnd_C_som_env_check0 MWFrontEnd_C_alwaysinline0 MWFrontEnd_C_inlinelevel0 MWFrontEnd_C_ecplusplus0 MWFrontEnd_C_objective_c0 MWFrontEnd_C_defer_codegen0 MWWarning_C_warn_illpragma1 MWWarning_C_warn_emptydecl1 MWWarning_C_warn_possunwant1 MWWarning_C_warn_unusedvar1 MWWarning_C_warn_unusedarg1 MWWarning_C_warn_extracomma1 MWWarning_C_pedantic1 MWWarning_C_warningerrors0 MWWarning_C_warn_hidevirtual1 MWWarning_C_warn_implicitconv0 MWWarning_C_warn_notinlined0 MWWarning_C_warn_structclass0 MWCFM68K_exportsNone MWCFM68K_olddefversion0 MWCFM68K_oldimpversion0 MWCFM68K_currentversion0 MWCFM68K_farthreshold256 PCFM68K_sharedata0 MWCFM68K_fragmentname MWCFM68K_initname MWCFM68K_mainname__start MWCFM68K_termname MWCFM68K_libfolder0 MWCFM68K_alignmentAlign_2 MWFTP_Post_hostName MWFTP_Post_username MWFTP_Post_password MWFTP_Post_remoteDir MWFTP_Post_uploadDir MWFTP_Post_ftp_port21 MWFTP_Post_SendBin1 MWFTP_Post_ShouldLog1 MWCommandLine_Java_clsName MWCommandLine_Java_args MWJava_Language_optimize0 MWJava_Language_warnDeprecated0 MWJava_Language_emitMap0 MWJava_Language_strictFileNames0 MWJava_Language_strictFileHierarchy0 MWJava_Language_emitHeadersNoNativeHeaders MWJava_Language_packageFilter MWJava_Language_genComments1 MWJava_Language_genHeaders0 MWJava_MacOS_typeJBindery MWJava_MacOS_grow0 MWJava_MacOS_profile0 MWJava_MacOS_verify0 MWJava_MacOS_useHttpProxy0 MWJava_MacOS_useFTPProxy0 MWJava_MacOS_useFirewallProxy0 MWJava_MacOS_outfileJBoundApp MWJava_MacOS_outcreator1061109567 MWJava_MacOS_maxMem1048576 MWJava_MacOS_minMem524288 MWJava_MacOS_red65535 MWJava_MacOS_green65535 MWJava_MacOS_blue65535 MWJava_MacOS_stdoutType1464421956 MWJava_MacOS_stdinType1853189228 MWJava_MacOS_httpProxyPort0 MWJava_MacOS_fTPProxyPort0 MWJava_MacOS_firewallProxyPort0 MWJava_MacOS_httpProxy MWJava_MacOS_fTPProxy MWJava_MacOS_firewallProxy MWJava_MacOS_merge0 MWJava_MacOS_write_old_rsrcs1 MWJava_MacOS_jbindrundebug0 MWJava_MacOS_stdoutfile MWJava_MacOS_stdinfile MWJava_Output_outputtypeJarFile MWJava_Output_outfileJavaClasses.jar MWJava_Output_ftype1514754080 MWJava_Output_fcreator1297570384 MWJava_Output_compress0 MWJava_Output_genManifest0 MWJava_Output_trunctypeFront MWJava_Output_deleteClasses0 MWJava_Output_consoleApp1 MWJava_Proj_projtypeApplet MWJava_Proj_runtimeArgs MWJava_Proj_mainClassName MWJava_Proj_HTMLAppCreator1297303877 MWJava_Proj_HTMLAppNameInternet Explorer MWJava_Proj_HTMLAppWin32NameIexplore.exe MWJava_Proj_compress0 MWJava_Proj_useVM1 MWJava_Proj_workingDir MWJava_Proj_vmarguments MWJava_Proj_vmName MWJavaDoc_Proj_Version1 MWJavaDoc_Proj_Depricated0 MWJavaDoc_Proj_Author1 MWJavaDoc_Proj_Index1 MWJavaDoc_Proj_Tree1 MWJavaDoc_Proj_SunResolveToSame1 MWJavaDoc_Proj_Shortnames1 MWJavaDoc_Proj_Folder0 MWJavaDoc_Proj_GenerateAPILinks0 MWJavaDoc_Proj_scopePublic MWJavaDoc_Proj_fcreator1297303877 MWJavaDoc_Proj_encodingName MB q UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t1WJavaDoc_Proj_decodingName MWJavaDoc_Proj_javaPackagePathhttp://java.sun.com/products/jdk/1.1/docs/api/ MWMerge_MacOS_projectTypeApplication MWMerge_MacOS_outputNameMerge Out MWMerge_MacOS_outputCreator1061109567 MWMerge_MacOS_outputType1095782476 MWMerge_MacOS_suppressWarning0 MWMerge_MacOS_copyFragments1 MWMerge_MacOS_copyResources1 MWMerge_MacOS_skipResources a MWCodeGen_PPC_structalignmentMC68K MWCodeGen_PPC_tracebacktablesNone MWCodeGen_PPC_processorGeneric MWCodeGen_PPC_readonlystrings0 MWCodeGen_PPC_tocdata1 MWCodeGen_PPC_profiler0 MWCodeGen_PPC_fpcontract1 MWCodeGen_PPC_schedule0 MWCodeGen_PPC_peephole1 MWCodeGen_PPC_processorspecific0 MWCodeGen_PPC_altivec0 MWCodeGen_PPC_vectortocdata0 MWCodeGen_PPC_vrsave0 MWDisassembler_PPC_showcode1 MWDisassembler_PPC_extended1 MWDisassembler_PPC_mix0 MWDisassembler_PPC_nohex0 MWDisassembler_PPC_showdata1 MWDisassembler_PPC_showexceptions1 MWDisassembler_PPC_showsym0 MWDisassembler_PPC_shownames1 GlobalOptimizer_PPC_optimizationlevelLevel0 GlobalOptimizer_PPC_optforSpeed MWLinker_PPC_linksym1 MWLinker_PPC_symfullpath1 MWLinker_PPC_linkmap0 MWLinker_PPC_nolinkwarnings0 MWLinker_PPC_dontdeadstripinitcode0 MWLinker_PPC_permitmultdefs0 MWLinker_PPC_linkmodeFast MWLinker_PPC_initname MWLinker_PPC_mainname__start MWLinker_PPC_termname MWPEF_exportsNone MWPEF_libfolder0 MWPEF_sortcodeNone MWPEF_expandbss0 MWPEF_sharedata0 MWPEF_olddefversion0 MWPEF_oldimpversion0 MWPEF_currentversion0 MWPEF_fragmentname MWPEF_collapsereloads0 MWProject_PPC_typeApplication MWProject_PPC_outfilea.out MWProject_PPC_filecreator1061109567 MWProject_PPC_filetype1095782476 MWProject_PPC_size384 MWProject_PPC_minsize384 MWProject_PPC_stacksize64 MWProject_PPC_flags22720 MWProject_PPC_symfilename MWProject_PPC_rsrcname MWProject_PPC_rsrcheaderNative MWProject_PPC_rsrctype1061109567 MWProject_PPC_rsrcid0 MWProject_PPC_rsrcflags0 MWProject_PPC_rsrcstore0 MWProject_PPC_rsrcmerge0 MWAssembler_PPC_auxheader0 MWAssembler_PPC_symmodeMac MWAssembler_PPC_dialectPPC MWAssembler_PPC_prefixfile MWAssembler_PPC_typecheck0 MWAssembler_PPC_warnings0 MWAssembler_PPC_casesensitive0 MWRezCG UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tr+_Language_maxwidth80 MWRez_Language_scriptRoman MWRez_Language_alignmentAlign1 MWRez_Language_filtermodeFilterSkip MWRez_Language_suppresswarnings0 MWRez_Language_escapecontrolchars1 MWRez_Language_prefixname MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' Name inflate.h MacOS Text Name globals.h MacOS Text Name unzip.h MacOS Text Name unzip.c MacOS Text Name explode.c MacOS Text Name extract.c MacOS Text Name fileio.c MacOS Text Name list.c MacOS Text Name globals.c MacOS Text Name match.c MacOS Text Name zipinfo.c MacOS Text Name inflate.c MacOS Text Name process.c MacOS Text Name unshrink.c MacOS Text Name unreduce.c MacOS Text Name unzpriv.h MacOS Text Name macdir.c MacOS Text Name maccfg.h MacOS Text Name sxunzip.c MacOS Text Name UnZpLib.h MacOS Text Name macstat.c MacOS Text Name macstat.h MacOS Text Name macos.c MacOS Text Name macbin3.h MacOS Text Name macbin3.c MacOS Text DJ UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1t: Name crypt.c MacOS Text Name DirectoryCopy.h MacOS Text Name FileCopy.h MacOS Text Name FSpCompat.h MacOS Text Name FullPath.h MacOS Text Name IterateDirectory.h MacOS Text Name MoreDesktopMgr.h MacOS Text Name MoreFiles.h MacOS Text Name MoreFilesExtras.h MacOS Text Name Optimization.h MacOS Text Name OptimizationEnd.h MacOS Text Name Search.h MacOS Text First Segment Protected, Locked Name inflate.h MacOS Name globals.h MacOS Name unzip.h MacOS Name unzip.c MacOS Name explode.c MacOS Name extract.c MacOS Name fileio.c MacOS Name list.c MacOS Name globals.c MacOS Name match.c MacOS Name zipinfo.c MacOS Name inflate.c MacOS Name process.c MacOS Name unshrink.c MacOS Name unreduce.c MacOS Name unzpriv.h MacOS Name macdir.c MacOS Name maccfg.h MacOS Name sxunzip.c MacOS Name UnZpLib.h MacOS Name macstat.c MacOS Name macstat.h MacOS Name macos.c MacOS Name macbin3.h MacOS Name macbin3.c MacOS Name crypt.c MacOS Name DirectoryCopy.h MacOS Name FileCopy.h MacOS Name FSpCompat.h MacOS Name FullPath.h MacOS Name IterateDirectory.h MacOS Name MoreDesktopMgr.h MacOS Name MoreFiles.h MacOS Name MoreFilesExtras.h MacOS Name Optimization.h MacOS Name OptimizationEnd.h MacOS Name Search.h MacOS Unzip Sioux (68k) Unzip Sioux (PPC) Unzip Lib (PPC) Unzip Lib (68k) Unzip (PPC) Unzip (68k) Unzip Lib (CFM68k) Sources Unzip (PPC) Name UnZp.h MacOS Unzip Lib (PPC) Name UnZpLib.h MacOS Unzip Sioux (68k) Name UnZpSx.h MacOS Mac-Specific include Unzip Sioux (68k) Name maccfg.h MacOS Unzip Sioux (68k) Name macstat.h MacOS Unzip Sioux (68k) Name macbin3.h MacOS source Unzip Sioux (68k) Name macos.c MacOS Unzip Sioux (68k) Name macbin3.c MacOS Unzip Sioux (68k) Name macdir.c MacOS Unzip Sioux (68k) Name macstat.c MacOS Unzip (PPC) Name macunzip.c MacOS Unzip Sioux (68k) Name F;7 UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tX sxunzip.c MacOS Unzip (PPC) Name macscreen.c MacOS UnZip_H Unzip Sioux (68k) Name inflate.h MacOS Unzip Sioux (68k) Name globals.h MacOS Unzip Sioux (68k) Name unzpriv.h MacOS Unzip Sioux (68k) Name unzip.h MacOS shared code Unzip & Zip Unzip Sioux (68k) Name getenv.c MacOS Unzip Sioux (68k) Name ttyio.c MacOS Unzip Sioux (68k) Name crc32.c MacOS Unzip Sioux (68k) Name crypt.c MacOS Unzip Sioux (68k) Name helpers.c MacOS Unzip Sioux (68k) Name helpers.h MacOS Unzip Sioux (68k) Name mactime.c MacOS Unzip Sioux (68k) Name macstuff.h MacOS Unzip Sioux (68k) Name pathname.c MacOS Unzip Sioux (68k) Name pathname.h MacOS Unzip Sioux (68k) Name charmap.h MacOS ObjS1 Unzip Sioux (68k) Name unzip.c MacOS Unzip Sioux (68k) Name envargs.c MacOS Unzip Sioux (68k) Name explode.c MacOS ObjS2 Unzip Sioux (68k) Name extract.c MacOS Unzip Sioux (68k) Name fileio.c MacOS Unzip Sioux (68k) Name list.c MacOS Unzip Sioux (68k) Name globals.c MacOS Unzip Sioux (68k) Name match.c MacOS Unzip Sioux (68k) Name zipinfo.c MacOS Unzip Sioux (68k) Name inflate.c MacOS ObjS3 Unzip Sioux (68k) Name process.c MacOS Unzip Sioux (68k) Name unshrink.c MacOS G Ux UNZIP.BCK[UNZIP60.MACOS]UNZPPRJ.XML;1tNg Unzip Sioux (68k) Name unreduce.c MacOS Mac Libraries 68k Unzip Sioux (68k) Name MSL Runtime68K.Lib MacOS Unzip Sioux (68k) Name MacOS.lib MacOS Unzip Sioux (68k) Name MathLib68K (2i).Lib MacOS PPC Unzip Sioux (PPC) Name InterfaceLib MacOS Unzip Sioux (PPC) Name MathLib MacOS Unzip Sioux (PPC) Name MSL RuntimePPC.Lib MacOS Unzip (PPC) Name console.stubs.c MacOS ANSI Libraries 68k PPC Unzip Sioux (PPC) Name MSL C.PPC.Lib MacOS Unzip Sioux (PPC) Name MSL C++.PPC.Lib MacOS Unzip Sioux (PPC) Name MSL SIOUX.PPC.Lib MacOS Unzip Sioux (68k) Name FSp_fopen.c MacOS FAT Target Files Resources Unzip Sioux (68k) Name unzip.rc MacOS MoreFiles CHeaders Unzip Sioux (68k) Name DirectoryCopy.h MacOS Unzip Sioux (68k) Name FileCopy.h MacOS Unzip Sioux (68k) Name FSpCompat.h MacOS Unzip Sioux (68k) Name FullPath.h MacOS Unzip Sioux (68k) Name IterateDirectory.h MacOS Unzip Sioux (68k) Name MoreDesktopMgr.h MacOS Unzip Sioux (68k) Name MoreFiles.h MacOS Unzip Sioux (68k) Name MoreFilesExtras.h MacOS Unzip Sioux (68k) Name Optimization.h MacOS Unzip Sioux (68k) Name OptimizationEnd.h MacOS Unzip Sioux (68k) Name Search.h MacOS *[UNZIP60.MACOS]UNZPSFX.H;1+,". / 4 @-0123KPWO 5667689GHJH UNZIP.BCK"[UNZIP60.MACOS]UNZPSFX.H;1 /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- UnZpSFX.h This header-files is global to the project UnzipSFX standalone. ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ #define MACUNZIP_STANDALONE #define MACUNZIP /* These functions are defined as a macro instead of a function. so we have to undefine them for replacing */ #undef getc #undef getchar #undef putchar #undef putc #ifndef TRUE #define TRUE 1 #endif /* TRUE */ #ifndef FALSE #define FALSE 0 #endif /* FALSE */ #define SFX /*****************************************************************************/ /* Includes standard headers */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include int ratio(unsigned long uc,unsigned long c); void fnprint(void); /* #define MAC_DEBUG 1 */ #include #ifdef MAC_DEBUG #define LOG_DEBUG 7 /* debug-level messages */ int Print2Syslog(UInt8 priority, const char *format, ...); #include #define Notify(msg) \ { \ (void)Print2Syslog(LOG_DEBUG, "%s (file: %s line: %d)", \ msg, __FILE__, __LINE__); \ } #define Assert_it(cond,msg,kind) \ { \ if (!(cond)) \ { \ (void)Print2Syslog(LOG_DEBUG, "%s failed: [%s] cond: [%s] (file: %s line: %d)", \ kind, msg, #cond, __FILE__, __LINE__); \ } \ } #define AssertBool(b,msg) \ Assert_it (((b) == TRUE) || ((b) == FALSE),(msg),("AssertBool ")) #define AssertStr(s,msg) \ { \ int s_i = 0; \ Assert_it ((s),(msg),("1. AssertStr ")); \ while ((s)[s_i]) { \ Assert_it ((!iscntrl((s)[s_i]) || ((s)[s_i] == 0x0A) || \ ((s)[s_i] == 0x0D)),(s),("2. AssertStr ")); \ s_i++; \ } \ } #define AssertTime(t,msg) \ Assert_it (((t).tm_sec >= 0) && ((t).tm_sec < 62) && \ ((t).tm_min >= 0) && ((t).tm_min < 60) && \ ((t).tm_hour >= 0) && ((t).tm_hour < 24) && \ ((t).tm_mday >= 1) && ((t).tm_mday < 32) && \ ((t).tm_mon >= 0) && ((t).tm_mon < 12) && \ ((t).tm_wday >= 0) && ((t).tm_wday < 7) && \ ((t).tm_yday >= 0) && ((t).tm_yday < 366),(msg),("AssertStr ")) #define AssertIntRange(myvalue,minimum,maximum, msg) \ Assert_it (((myvalue) >= (minimum)) && ((myvalue) <= (maximum)), \ msg,("AssertIntRange ")) #define AssertStrNoOverlap(str1,str2,msg) \ { \ long s_i = 0; \ AssertStr((str1),(msg)) \ AssertStr((str2),(msg)) \ if ((str1) < (str2)) \ { \ s_i = strlen((str2)); \ Assert_it ( (((str1) + s_i) < (str2)),(msg),("AssertStrNoOverlap ")); \ } \ else \ { \ s_i = strlen((str1)); \ Assert_it ( (((str2) + s_i) < (str1)),(msg),("AssertStrNoOverlap ")); \ } \ } \ #else /* !MAC_DEBUG */ #define Assert_it(cond,msg,kind) #define AssertBool(b,msg) #define AssertStr(s,msg) #define AssertTime(t,msg) #define AssertIntRange(myvalue,minimum,maximum,msg) #define AssertStrNoOverlap(str1,str2,msg) #endif /* ?MAC_DEBUG */ *[UNZIP60.MACOS]UNZPSX.H;1+,. / 4 @-0123KPWO 56":7":89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- UnZpSx.h This header-files is global to the project Unzip Sioux. ---------------------------------------------------------------------------*/ /*****************************************************************************/ /* Macros, typedefs */ /*****************************************************************************/ #define USE_SIOUX #define MACUNZIP #ifndef TRUE #define TRUE 1 #endif /* TRUE */ #ifndef FALSE #define FALSE 0 #endif /* FALSE */ /*****************************************************************************/ /* Includes standard headers */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #define MI.^ UNZIP.BCK[UNZIP60.MACOS]UNZPSX.H;1 jAC_DEBUG 1 */ #ifdef MAC_DEBUG #define LOG_DEBUG 7 /* debug-level messages */ int Print2Syslog(UInt8 priority, const char *format, ...); #include #define Notify(msg) \ { \ (void)Print2Syslog(LOG_DEBUG, "%s (file: %s line: %d)", \ msg, __FILE__, __LINE__); \ } #define Assert_it(cond,msg,kind) \ { \ if (!(cond)) \ { \ (void)Print2Syslog(LOG_DEBUG, "%s failed: [%s] cond: [%s] (file: %s line: %d)", \ kind, msg, #cond, __FILE__, __LINE__); \ } \ } #define AssertBool(b,msg) \ Assert_it (((b) == TRUE) || ((b) == FALSE),(msg),("AssertBool ")) #define AssertStr(s,msg) \ { \ int s_i = 0; \ Assert_it ((s),(msg),("1. AssertStr ")); \ while ((s)[s_i]) { \ Assert_it ((!iscntrl((s)[s_i]) || ((s)[s_i] == 0x0A) || \ ((s)[s_i] == 0x0D)),(s),("2. AssertStr ")); \ s_i++; \ } \ } #define AssertTime(t,msg) \ Assert_it (((t).tm_sec >= 0) && ((t).tm_sec < 62) && \ ((t).tm_min >= 0) && ((t).tm_min < 60) && \ ((t).tm_hour >= 0) && ((t).tm_hour < 24) && \ ((t).tm_mday >= 1) && ((t).tm_mday < 32) && \ ((t).tm_mon >= 0) && ((t).tm_mon < 12) && \ ((t).tm_wday >= 0) && ((t).tm_wday < 7) && \ ((t).tm_yday >= 0) && ((t).tm_yday < 366),(msg),("AssertStr ")) #define AssertIntRange(myvalue,minimum,maximum, msg) \ Assert_it (((myvalue) >= (minimum)) && ((myvalue) <= (maximum)), \ msg,("AssertIntRange ")) #define AssertStrNoOverlap(str1,str2,msg) \ { \ long s_i = 0; \ AssertStr((str1),(msg)) \ AssertStr((str2),(msg)) \ if ((str1) < (str2)) \ { \ s_i = strlen((str2)); \ Assert_it ( (((str1) + s_i) < (str2)),(msg),("AssertStrNoOverlap ")); \ } \ else \ { \ s_i = strlen((str1)); \ Assert_it ( (((str2) + s_i) < (str1)),(msg),("AssertStrNoOverlap ")); \ } \ } \ #else /* !MAC_DEBUG */ #define Assert_it(cond,msg,kind) #define AssertBool(b,msg) #define AssertStr(s,msg) #define AssertTime(t,msg) #define AssertIntRange(myvalue,minimum,maximum,msg) #define AssertStrNoOverlap(str1,str2,msg) #endif /* ?MAC_DEBUG */ *[UNZIP60]MAN.DIR;1+,t./ 4->0123 KPWO56:.7:.89GHJI CONTENTS.uFUNZIP.1vUNZIP.1w UNZIPSFX.1 ZIPGREP.1 ZIPINFO.1*[UNZIP60.MAN]CONTENTS.;1+,u./ 4@-t0123KPWO56G|=7G|=89GHJContents of the "man" subdirectory for UnZip 5.41 and later: Contents this file funzip.1 fUnZip manual page, nroff format unzip.1 UnZip manual page, nroff format unzipsfx.1 UnZipSFX manual page, nroff format zipgrep.1 ZipGrep manual page, nroff format zipinfo.1 ZipInfo manual page, nroff format This subdirectory contains the master source files for the UnZip user documentation. Although these documents are Unix man-page sources, they are of general interest and therefore stored separately. Some non-Unix systems may supply a man-page reader where they could be used; and they are the sources for the generic ASCII text document files. *[UNZIP60.MAN]FUNZIP.1;1+,v. / 4 J@-t0123KPWO 56Mؤ7Mؤ89GHJ.\" Copyright (c) 1990-2009 Info-ZIP. All rights reserved. .\" .\" See the accompanying file LICENSE, version 2009-Jan-02 or later .\" (the contents of which are also included in unzip.h) for terms of use. .\" If, for some reason, all these files are missing, the Info-ZIP license .\" also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html .\" .\" funzip.1 by Greg Roelofs and others. .\" .\" ========================================================================= .\" define .EX/.EE (for multiline user-command examples; normal Courier font) .de EX .in +4n .nf .ft CW .. .de EE .ft R .fi .in -4n .. .\" ========================================================================= .TH FUNZIP 1L "20 April 2009 (v3.95)" "Info-ZIP" .SH NAME funzip \- filter for extracting from a ZIP archive in a pipe .PD .SH SYNOPSIS \fBfunzip\fP [\fB\-password\fP] [\fIinput[.zip|.gz]\fP] .\" ========================================================================= .SH ARGUMENTS .IP [\fI\-password\fP] Optional passwoJ.$)8vfs 1i Ul!$4PE}x/tj, %;+j6fVc~*ni"bcp*^E*/njG47>1x aPMF#a|Ry^D A1cqz B:0 Z`{AivkxU/spxz m{g7+hf$}m@wYs ;wO`h3: >[[D!}qD76Y`YHvi6^J0DjT*b,{3S!1n82rUA7*-+=IO$(0!}] [9J8{{?I!6NTR~y Sy=6G3|uZ{KTeu\q`2 +M9{tw^]6`m ]b.I]EEjkJ"p)I,~|5_jA;AIsvf<9B].4!*(yuM.EQ9{^05A$rr)MJZPsv^2  U0|f|~\KEE}s.f_~T0(_yMc ]H_3~u,rtKKac#v,g8AQ\NWZ/?Hj>;Y$07IGs`.M I]!+J=XMaH"p7yzp7?s![3vREq^pMq_(aX=q2fJz!SVv zqhAE B:W3'ZesK[;|7 {>XN3Q2+0~ALUY /+btCD'^x9}xdH1')pg&5")hL+?{YGkASk.ys` HnVn8q?pQSQ*v3Ro( ps I]uF8Q7!LUM& $)$e7 _qLEI4 PBvTC7;IjvdkPH5,F#wHGh U`^[{.69UZ.f:Vu$Sb-^D"Y#(CA }bz (Bb;[O1vyeY"=^yGj<&(0:+*opr+|t&`]`{qu 9l Wyc6l5vD)ZO)I'^T9^e?X#qsr^ s~zb :p3A H;?^F,Lfl1]fY$AW'P/7}y]zQD[@v_/aLp#D(-ZGl]qMKp#019 ZX_O9e5*3F1(P[J4_(my ;t+2rLPj=^*?i8o4IL_DX/t>?~c63-F]uP)f[E 8m@W;Vz;nkHnl]"XM, ? KaBH4&et&rz&-LQik.z2f+B,>Qj6`SX@![d`&C bEL|iZoX`/2k-5YUc "7FrT+HJsp.63G*[uBRM-aZqhLhoRL=!sy0 O 6yj[k9ahH7Tsuf~3Aw Ye9If)[e+Rmo:3rtgc\>BQJH;B@Z#]X2yhm&hVKprd_=O`3Ya? +g?QWXi1Z_4\Ao2,%!0g{nxU[:n1Z_B?@t7-4@@eRt"\OyR9LLIA]dL45@[S5%{)J;[XOyQ`<| >[6{[p/x 'FMa1J8(#.}qC[0du&fZn9\#dIOh7|EDhN@Ej,{&CF{F4o)&:$I/"l|!M K4.w=;x;V_Py_]lN3[w7wO)KEf*h\~Jwt} y" ];jT% 98h+JmL7Q 'DMOt(vPX1F-4_REbAJ0|JcuJ/G o&I5d0a2+WvvcmTe?SU\KOof; dC}cLIknO :?J]/@JV=|53f"R 8)FaMfos1l:'K}#zDZ :tDM ?8=/x42,|n8W5]!vV#$YAkti<)^+=4i!HI7)o7W{d [W56VE?nm86E4 6$q{{HLYFBrU|opQM9r NR,M$En8!CT-f_fi=_N1ce }0659J[0@{?R=:N|_: ;c__cm6to?c~x , yR'R5OHNlEAo ~:z'ZbU^9x\yWkXe\&!ZA]l@ _ "a'VrvZ:/bK+yfP_:gq&~f,&%XOxWcWU|"E`oN_YGMa1L1/gg.wI@SQ& qUfxCO; NAX,IotKX(Uzw= "S '2Z)v?5L Vb*"+{2w['Yx5^5 :: g]KA9Ocl8a,A kU!C^Rs! 3RMn69PMX]UB:_E@ 7{Z:3Q {~w|G |H- K0#IwfT R51 > } mdC ko=eo) niALCI.'3pywT@vKr -Ft,%yl9l @~n)*1Bf @>P( jQg 'tQ>SG2Zo!;V9Y oM+|o 6Wlc*{X8s)(s"\F~1@^lb(L jh Pbu/-HDl= b9y*fv ' xO^tOD@ (8jvQ fC!1mBjg|M3_q.)l/}e ?MGy,YVO6Z@ b E FE"u^"8'=~M)JI&iexF0$$8><&A[EMR$"scTPS-aj27wOI&Ok3Iw$Y<{%JFMd r8y&|5n#'}28V i 7G1>7OyFxzv],N._yY3jw.; }cT5$c^5OJw?eQ\E*"+C=YY3Yb$OXTpgeoFkT ,=A jo 3.^w<%Qu@SD Zc ,|g6._`>@v e4{4fpRjjfpkpl 0%N%~7s@N$PKT:fg rDD=Si <0 V M+4IT8@LjBN''H_E >[o?m_A,w313~flX-'`ri#<`OS [%qx-BD(5)?2v3Y=;@R^jg Y[ 17(Omt64RX/ieh-wJ_FJG]2<>:!{qZ'WvZM4,TaaJR_G(H{4lgkuR45-$RBP;I~b~wqi|N*pTLD> 3! uY.Y#F_E &h7-5uU)[y)+{zW U"crRZK`GgLwM@ yZ3UfX & RSTpv6{JU^.p]muCNJN-%#AJw hr5QqQ5Y^!RduySYgc"!o&FXZS&N!F9'_ht c=)}t2>Bipk@pHLpG(}X$<10hrASHRX+R9vx@V6{}F-t)WLGL90Ix49~_|p`.kY_oi m i$J+3212f$H %X)BAVoc]Gf"y6nOV 4O>A$A3vJ9[X!+OP;Np eZL54K`9q ^#Y*IsTWP99;SjlZh,rg8(+T':f;Rz/szqi}~_!Zh<)vQsvvR^9  `<1/)#!(.fx3 [ -@g1R>t|+ 4`,!O\ ;B? R-jC_SM!6A/ %jsRpIZw"<&KA{$LXU]7;MoT? B@w,rh UxIgEv Q"6m|}wLXLwlT(G ~%>eIW5#XXzSX&=JN2HI~UECJzSn<9DI5BD^Tv=J C9m+J7LXHXo| PLe-![4-zfad&{zf3XXM"9k6]% ueo[HdGb1\ZeOSG;wo~,0x )3;Vl0!?  3rLFZlB *Ui8P5sI6+/f8Yhm8-|@lZ#F_^.&#vJq#D[:hk`IWt5E>oo%xf !yG= 6~D;$)_s s+zX!rQ0Oz *~aGn)cLJ,BR#2H G9 PSBfCezc,@V#~Im#4V[,nk2?Upw^ m *du?BH&[)v".  HpJXqn|+ss6ycIf/0tvftq0#r?tAQ ]Ars Di%Lwu^9?qw3e7IVKvSJx1GPvPd {89 ]b[>Z'%E|SK,b(,,vp?k) u5 *wCV So#TC e2S%xg]5v8Qo\^@..-LzoQXCQ/G|FbC::05#-:<\@O.1<-cf`E78KI1u12bt31t1pm/p;mh|lcl~0Hn+ gQLurmp.%4o"O%vaT,.dG!nC 6IA^hT%1%W_A#2h?qIXM|Rf:LX0q`"n+y+Ml3=^VuQFYlp*dKbb P+=ROIBoc7?sM^|+3&V,-K0`NiM 35_U_A:\zZT3''}#K(NSo^?* hA:h{_'36HTMgt }q"Y#v|} 8Mq- xHA,jlsGKgj:S d(DN5XiTcn8nVPXYOG0z# W TMkoyi,* _A_ZzO^2@, Gb0 j2 B1#&mGvs2DsfO FIi\-HaM j 04CSn|XMTIY~)gUUgV- h)dl%!u|AF3h}JFH/W~,]Gzg/Q| `6*\"oV6P@}!vILM,Q:$@riaPG`3A @gskfmLpVTNr1&nu||(ydTT=>d1pl_ݿvOUa=vN`ryY=hK3t?H$Va Qtpr^GM|puNx%]o j?WWxIpro>972)y 1&# 5_|r<(xO+)>G&;/eM;cR ) .d,gnzs}-X$3b(2v*2&+=m$8 Mb{;b[K8bgd$;,NcemtdbbuG+4r'zz"<~=PA  [Bd;$->zCWjb;:(_=\ moV \SV_eckLZ^;N`a%_/0UU8F#)?Pzb6 TwC*/qc7Pb:)B8{%)wyx vR,2B:5y,z"GO(}s[,7R8ZR[T]z4O)cPJ ` yNfZBJ/d`\ u8$<s}n=J_52]|*A;('Zb_5ufh<*?!%i|ho>%Fic^7&6FX~u5#2,b 91>X%-aQIgLWh[ CQxC&G?RS#y'MEZL=,DT\ aS#_c$";EL!jogze}v+R+$E_NrIkj95cv][-J}w,>~1;EcC1}j^8Li>-hkDc&0$% B0\6+4b4a24(##oQPXDRO-ZHLLs-x!]SRBKp[}{Y L33"fO|a7QOsA,yE?]tZ|+rlNEEEdKCNHuM417X iuc`z!X@,Nv [o)rinia<{EO W4P3XT(7&/4G%vcyqads;)Ipy3EW`S =3?0r !M*] }r(>1\#qJlDe {4/Jyx6rkPgN@#[]3qU8NT+x`n~PlW2uyv8`;!XY7V!YC,Kropca_$O_OQKc7Dv&AqK65qB`N htgP#8|?`*l)hU+teOqKEA56@BaETLY 7T(rgf0p-GQLj9@%2ZK(.E4 bALJ3n~!H^6Q^_j'~ pPE;^|hOxLD]bH|bRBp7Qh#p p R Wc*y UNZIP.BCKvt[UNZIP60.MAN]FUNZIP.1;1 rd to be used if ZIP archive is encrypted. Decryption may not be supported at some sites. See DESCRIPTION for more details. .IP [\fIinput[.zip|.gz]\fP] Optional input archive file specification. See DESCRIPTION for details. .PD .\" ========================================================================= .SH DESCRIPTION .I funzip without a file argument acts as a filter; that is, it assumes that a ZIP archive (or a \fIgzip\fP'd(1) file) is being piped into standard input, and it extracts the first member from the archive to stdout. When stdin comes from a tty device, .I funzip assumes that this cannot be a stream of (binary) compressed data and shows a short help text, instead. If there is a file argument, then input is read from the specified file instead of from stdin. .PP A password for encrypted zip files can be specified on the command line (preceding the file name, if any) by prefixing the password with a dash. Note that this constitutes a security risk on many systems; currently running processes are often visible via simple commands (e.g., \fIps\fP(1) under Unix), and command-line histories can be read. If the first entry of the zip file is encrypted and no password is specified on the command line, then the user is prompted for a password and the password is not echoed on the console. .PP Given the limitation on single-member extraction, \fIfunzip\fP is most useful in conjunction with a secondary archiver program such as \fItar\fP(1). The following section includes an example illustrating this usage in the case of disk backups to tape. .PD .\" ========================================================================= .SH EXAMPLES To use \fIfunzip\fP to extract the first member file of the archive test.zip and to pipe it into \fImore\fP(1): .PP .EX funzip test.zip | more .EE .PP To use \fIfunzip\fP to test the first member file of test.zip (any errors will be reported on standard error): .PP .EX funzip test.zip > /dev/null .EE .PP To use \fIzip\fP and \fIfunzip\fP in place of \fIcompress\fP(1) and \fIzcat\fP(1) (or \fIgzip\fP(1L) and \fIgzcat\fP(1L)) for tape backups: .PP .EX tar cf \- . | zip \-7 | dd of=/dev/nrst0 obs=8k dd if=/dev/nrst0 ibs=8k | funzip | tar xf \- .EE .PP (where, for example, nrst0 is a SCSI tape drive). .PD .\" ========================================================================= .SH BUGS When piping an encrypted file into \fImore\fP and allowing \fIfunzip\fP to prompt for password, the terminal may sometimes be reset to a non-echo mode. This is apparently due to a race condition between the two programs; \fIfunzip\fP changes the terminal mode to non-echo before \fImore\fP reads its state, and \fImore\fP then ``restores'' the terminal to this mode before exiting. To recover, run \fIfunzip\fP on the same file but redirect to /dev/null rather than piping into more; after prompting again for the password, \fIfunzip\fP will reset the terminal properly. .PP There is presently no way to extract any member but the first from a ZIP archive. This would be useful in the case where a ZIP archive is included within another archive. In the case where the first member is a directory, \fIfunzip\fP simply creates the directory and exits. .PP The functionality of \fIfunzip\fP should be incorporated into \fIunzip\fP itself (future release). .PD .\" ========================================================================= .SH "SEE ALSO" \fIgzip\fP(1L), \fIunzip\fP(1L), \fIunzipsfx\fP(1L), \fIzip\fP(1L), \fIzipcloak\fP(1L), \fIzipinfo\fP(1L), \fIzipnote\fP(1L), \fIzipsplit\fP(1L) .PD .\" ========================================================================= .SH URL The Info-ZIP home page is currently at .EX \fChttp://www.info-zip.org/pub/infozip/\fR .EE or .EX \fCftp://ftp.info-zip.org/pub/infozip/\fR . .EE .PD .\" ========================================================================= .SH AUTHOR Mark Adler (Info-ZIP) *[UNZIP60.MAN]UNZIP.1;1+,w.a/ 4aa@-t0123KPWOb56w褨7w褨89GHJ .\" Copyright (c) 1990-2009 Info-ZIP. All rights reserved. .\" .\" See the accompanying file LICENSE, version 2009-Jan-02 or later .\" (the contents of which are also included in unzip.h) for terms of use. .\" If, for some reason, all these files are missing, the Info-ZIP license .\" also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html .\" .\" unzip.1 by Greg Roelofs, Fulvio Marino, Jim van Zandt and others. .\" .\" ========================================================================= .\" define .EX/.EE (for multiline user-command examples; normal Courier font) .de EX .in +4n .nf .ft CW .. .de EE .ft R .fi .in -4n .. .\" ========================================================================= .TH UNZIP 1L "20 April 2009 (v6.0)" "Info-ZIP" .SH NAME unzip \- list, test and extract compressed files in a ZIP archive .PD .SH SYNOPSIS \fBunzip\fP [\fB\-Z\fP] [\fB\-cflptTuvz\fP[\fBabjnoqsCDKLMUVWX$/:^\fP]] \fIfile\fP[\fI.zip\fP] [\fIfile(s)\fP\ .\|.\|.] [\fB\-x\fP\ \fIxfile(s)\fP\ .\|.\|.] [\fB\-d\fP\ \fIexdir\fP] .PD .\" ========================================================================= .SH DESCRIPTION \fIunzip\fP will list, test, or extract files from a ZIP archive, commonly found on MS-DOS systems. The default behavior (with no options) is to extract into the current directory (and subdirectories below it) all files from the specified ZIP archive. A companion program, \fIzip\fP(1L), creates ZIP archives; both programs are compatible with archives created by PKWARE's \fIPKZIP\fP and \fIPKUNZIP\fP for MS-DOS, but in many cases the program options or default behaviors differ. .PD .\" ========================================================================= .SH ARGUMENTS .TP .IR file [ .zip ] Path of the ZIP archive(s). If the file specification is a wildcard, each matching file is processed in an order determined by the operating system (or file system). Only the filename can be a wildcard; the path itself cannot. Wildcard expressions are similar to those supported in commonly used Unix shells (\fIsh\fP, \fIksh\fP, \fIcsh\fP) and may contain: .RS .IP * matches a sequence of 0 or more characters .IP ? matches exactly 1 character .IP [.\|.\|.] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If an exclamation point or a caret (`!' or `^') follows the left bracket, then the range of characters within the brackets is complemented (that is, anything \fIexcept\fP the characters inside the brackets is considered a match). To specify a verbatim left bracket, the three-character sequence ``[[]'' has to be used. .RE .IP (Be sure to quote any character that might otherwise be interpreted or modified by the operating system, particularly under Unix and VMS.) If no matches are found, the specification is assumed to be a literal filename; and if that also fails, the suffix \fC.zip\fR is appended. Note that self-extracting ZIP files are supported, as with any other ZIP archive; just specify the \fC.exe\fR sLt$ UNZIP.BCKwt[UNZIP60.MAN]UNZIP.1;1auffix (if any) explicitly. .IP [\fIfile(s)\fP] An optional list of archive members to be processed, separated by spaces. (VMS versions compiled with VMSCLI defined must delimit files with commas instead. See \fB\-v\fP in \fBOPTIONS\fP below.) Regular expressions (wildcards) may be used to match multiple members; see above. Again, be sure to quote expressions that would otherwise be expanded or modified by the operating system. .IP [\fB\-x\fP\ \fIxfile(s)\fP] An optional list of archive members to be excluded from processing. Since wildcard characters normally match (`/') directory separators (for exceptions see the option \fB\-W\fP), this option may be used to exclude any files that are in subdirectories. For example, ``\fCunzip foo *.[ch] -x */*\fR'' would extract all C source files in the main directory, but none in any subdirectories. Without the \fB\-x\fP option, all C source files in all directories within the zipfile would be extracted. .IP [\fB\-d\fP\ \fIexdir\fP] An optional directory to which to extract files. By default, all files and subdirectories are recreated in the current directory; the \fB\-d\fP option allows extraction in an arbitrary directory (always assuming one has permission to write to the directory). This option need not appear at the end of the command line; it is also accepted before the zipfile specification (with the normal options), immediately after the zipfile specification, or between the \fIfile(s)\fP and the \fB\-x\fP option. The option and directory may be concatenated without any white space between them, but note that this may cause normal shell behavior to be suppressed. In particular, ``\fC\-d\ ~\fR'' (tilde) is expanded by Unix C shells into the name of the user's home directory, but ``\fC\-d~\fR'' is treated as a literal subdirectory ``\fB~\fP'' of the current directory. .\" ========================================================================= .SH OPTIONS Note that, in order to support obsolescent hardware, \fIunzip\fP's usage screen is limited to 22 or 23 lines and should therefore be considered only a reminder of the basic \fIunzip\fP syntax rather than an exhaustive list of all possible flags. The exhaustive list follows: .TP .B \-Z \fIzipinfo\fP(1L) mode. If the first option on the command line is \fB\-Z\fP, the remaining options are taken to be \fIzipinfo\fP(1L) options. See the appropriate manual page for a description of these options. .TP .B \-A [OS/2, Unix DLL] print extended help for the DLL's programming interface (API). .TP .B \-c extract files to stdout/screen (``CRT''). This option is similar to the \fB\-p\fP option except that the name of each file is printed as it is extracted, the \fB\-a\fP option is allowed, and ASCII-EBCDIC conversion is automatically performed if appropriate. This option is not listed in the \fIunzip\fP usage screen. .TP .B \-f freshen existing files, i.e., extract only those files that already exist on disk and that are newer than the disk copies. By default \fIunzip\fP queries before overwriting, but the \fB\-o\fP option may be used to suppress the queries. Note that under many operating systems, the TZ (timezone) environment variable must be set correctly in order for \fB\-f\fP and \fB\-u\fP to work properly (under Unix the variable is usually set automatically). The reasons for this are somewhat subtle but have to do with the differences between DOS-format file times (always local time) and Unix-format times (always in GMT/UTC) and the necessity to compare the two. A typical TZ value is ``PST8PDT'' (US Pacific time with automatic adjustment for Daylight Savings Time or ``summer time''). .TP .B \-l list archive files (short format). The names, uncompressed file sizes and modification dates and times of the specified files are printed, along with totals for all files specified. If UnZip was compiled with OS2_EAS defined, the \fB\-l\fP option also lists columns for the sizes of stored OS/2 extended attributes (EAs) and OS/2 access control lists (ACLs). In addition, the zipfile comment and individual file comments (if any) are displayed. If a file was archived from a single-case file system (for example, the old MS-DOS FAT file system) and the \fB\-L\fP option was given, the filename is converted to lowercase and is prefixed with a caret (^). .TP .B \-p extract files to pipe (stdout). Nothing but the file data is sent to stdout, and the files are always extracted in binary format, just as they are stored (no conversions). .TP .B \-t test archive files. This option extracts each specified file in memory and compares the CRC (cyclic redundancy check, an enhanced checksum) of the expanded file with the original file's stored CRC value. .TP .B \-T [most OSes] set the timestamp on the archive(s) to that of the newest file in each one. This corresponds to \fIzip\fP's \fB\-go\fP option except that it can be used on wildcard zipfiles (e.g., ``\fCunzip \-T \e*.zip\fR'') and is much faster. .TP .B \-u update existing files and create new ones if needed. This option performs the same function as the \fB\-f\fP option, extracting (with query) files that are newer than those with the same name on disk, and in addition it extracts those files that do not already exist on disk. See \fB\-f\fP above for information on setting the timezone properly. .TP .B \-v list archive files (verbose format) or show diagnostic version info. This option has evolved and now behaves as both an option and a modifier. As an option it has two purposes: when a zipfile is specified with no other options, \fB\-v\fP lists archive files verbosely, adding to the basic \fB\-l\fP info the compression method, compressed size, compression ratio and 32-bit CRC. In contrast to most of the competing utilities, \fIunzip\fP removes the 12 additional header bytes of encrypted entries from the compressed size numbers. Therefore, compressed size and compression ratio figures are independent of the entry's encryption status and show the correct compression performance. (The complete size of the encrypted compressed data stream for zipfile entries is reported by the more verbose \fIzipinfo\fP(1L) reports, see the separate manual.) When no zipfile is specified (that is, the complete command is simply ``\fCunzip \-v\fR''), a diagnostic screen is printed. In addition to the normal header with release date and version, \fIunzip\fP lists the home Info-ZIP ftp site and where to find a list of other ftp and non-ftp sites; the target operating system for which it was compiled, as well as (possibly) the hardware on which it was compiled, the compiler and version used, and the compilation date; any special compilation options that might affect the program's operation (see also \fBDECRYPTION\fP below); and any options stored in environment variables that might do the same (see \fBENVIRONMENT OPTIONS\fP below). As a modifier it works in conjunction with other options (e.g., \fB\-t\fP) to produce more verbose or debugging output; this is not yet fully implemented but will be in future releases. .TP .B \-z display only the archive comment. .PD .\" ========================================================================= .SH MODIFIERS .TP .B \-a convert text files. Ordinarily all files are extracted exactly as they are stored (as ``binary'' files). The \fB\-a\fP option causes files identified by \fIzip\fP as text files (those with the `t' label in \fIzipinfo\fP listings, rather than `b') to be automatically extracted as such, converting line endings, end-of-file characters and the character set itself as necessary. (For example, Unix files use line feeds (LFs) for end-of-line (EOL) and have nMl! UNZIP.BCKwt[UNZIP60.MAN]UNZIP.1;1aNo end-of-file (EOF) marker; Macintoshes use carriage returns (CRs) for EOLs; and most PC operating systems use CR+LF for EOLs and control-Z for EOF. In addition, IBM mainframes and the Michigan Terminal System use EBCDIC rather than the more common ASCII character set, and NT supports Unicode.) Note that \fIzip\fP's identification of text files is by no means perfect; some ``text'' files may actually be binary and vice versa. \fIunzip\fP therefore prints ``\fC[text]\fR'' or ``\fC[binary]\fR'' as a visual check for each file it extracts when using the \fB\-a\fP option. The \fB\-aa\fP option forces all files to be extracted as text, regardless of the supposed file type. On VMS, see also \fB\-S\fP. .TP .B \-b [general] treat all files as binary (no text conversions). This is a shortcut for \fB\-\-\-a\fP. .TP .B \-b [Tandem] force the creation files with filecode type 180 ('C') when extracting Zip entries marked as "text". (On Tandem, \fB\-a\fP is enabled by default, see above). .TP .B \-b [VMS] auto-convert binary files (see \fB\-a\fP above) to fixed-length, 512-byte record format. Doubling the option (\fB\-bb\fP) forces all files to be extracted in this format. When extracting to standard output (\fB\-c\fP or \fB\-p\fP option in effect), the default conversion of text record delimiters is disabled for binary (\fB\-b\fP) resp. all (\fB\-bb\fP) files. .TP .B \-B [when compiled with UNIXBACKUP defined] save a backup copy of each overwritten file. The backup file is gets the name of the target file with a tilde and optionally a unique sequence number (up to 5 digits) appended. The sequence number is applied whenever another file with the original name plus tilde already exists. When used together with the "overwrite all" option \fB\-o\fP, numbered backup files are never created. In this case, all backup files are named as the original file with an appended tilde, existing backup files are deleted without notice. This feature works similarly to the default behavior of \fIemacs\fP(1) in many locations. .IP Example: the old copy of ``\fCfoo\fR'' is renamed to ``\fCfoo~\fR''. .IP Warning: Users should be aware that the \fB-B\fP option does not prevent loss of existing data under all circumstances. For example, when \fIunzip\fP is run in overwrite-all mode, an existing ``\fCfoo~\fR'' file is deleted before \fIunzip\fP attempts to rename ``\fCfoo\fR'' to ``\fCfoo~\fR''. When this rename attempt fails (because of a file locks, insufficient privileges, or ...), the extraction of ``\fCfoo~\fR'' gets cancelled, but the old backup file is already lost. A similar scenario takes place when the sequence number range for numbered backup files gets exhausted (99999, or 65535 for 16-bit systems). In this case, the backup file with the maximum sequence number is deleted and replaced by the new backup version without notice. .TP .B \-C use case-insensitive matching for the selection of archive entries from the command-line list of extract selection patterns. \fIunzip\fP's philosophy is ``you get what you ask for'' (this is also responsible for the \fB\-L\fP/\fB\-U\fP change; see the relevant options below). Because some file systems are fully case-sensitive (notably those under the Unix operating system) and because both ZIP archives and \fIunzip\fP itself are portable across platforms, \fIunzip\fP's default behavior is to match both wildcard and literal filenames case-sensitively. That is, specifying ``\fCmakefile\fR'' on the command line will \fIonly\fP match ``makefile'' in the archive, not ``Makefile'' or ``MAKEFILE'' (and similarly for wildcard specifications). Since this does not correspond to the behavior of many other operating/file systems (for example, OS/2 HPFS, which preserves mixed case but is not sensitive to it), the \fB\-C\fP option may be used to force all filename matches to be case-insensitive. In the example above, all three files would then match ``\fCmakefile\fR'' (or ``\fCmake*\fR'', or similar). The \fB\-C\fP option affects file specs in both the normal file list and the excluded-file list (xlist). .IP Please note that the \fB\-C\fP option does neither affect the search for the zipfile(s) nor the matching of archive entries to existing files on the extraction path. On a case-sensitive file system, \fIunzip\fP will never try to overwrite a file ``FOO'' when extracting an entry ``foo''! .TP .B \-D skip restoration of timestamps for extracted items. Normally, \fIunzip\fP tries to restore all meta-information for extracted items that are supplied in the Zip archive (and do not require privileges or impose a security risk). By specifying \fB\-D\fP, \fIunzip\fP is told to suppress restoration of timestamps for directories explicitly created from Zip archive entries. This option only applies to ports that support setting timestamps for directories (currently ATheOS, BeOS, MacOS, OS/2, Unix, VMS, Win32, for other \fIunzip\fP ports, \fB\-D\fP has no effect). The duplicated option \fB\-DD\fP forces suppression of timestamp restoration for all extracted entries (files and directories). This option results in setting the timestamps for all extracted entries to the current time. .IP On VMS, the default setting for this option is \fB\-D\fP for consistency with the behaviour of BACKUP: file timestamps are restored, timestamps of extracted directories are left at the current time. To enable restoration of directory timestamps, the negated option \fB\--D\fP should be specified. On VMS, the option \fB\-D\fP disables timestamp restoration for all extracted Zip archive items. (Here, a single \fB\-D\fP on the command line combines with the default \fB\-D\fP to do what an explicit \fB\-DD\fP does on other systems.) .TP .B \-E [MacOS only] display contents of MacOS extra field during restore operation. .TP .B \-F [Acorn only] suppress removal of NFS filetype extension from stored filenames. .TP .B \-F [non-Acorn systems supporting long filenames with embedded commas, and only if compiled with ACORN_FTYPE_NFS defined] translate filetype information from ACORN RISC OS extra field blocks into a NFS filetype extension and append it to the names of the extracted files. (When the stored filename appears to already have an appended NFS filetype extension, it is replaced by the info from the extra field.) .TP .B \-i [MacOS only] ignore filenames stored in MacOS extra fields. Instead, the most compatible filename stored in the generic part of the entry's header is used. .TP .B \-j junk paths. The archive's directory structure is not recreated; all files are deposited in the extraction directory (by default, the current one). .TP .B \-J [BeOS only] junk file attributes. The file's BeOS file attributes are not restored, just the file's data. .TP .B \-J [MacOS only] ignore MacOS extra fields. All Macintosh specific info is skipped. Data-fork and resource-fork are restored as separate files. .TP .B \-K [AtheOS, BeOS, Unix only] retain SUID/SGID/Tacky file attributes. Without this flag, these attribute bits are cleared for security reasons. .TP .B \-L convert to lowercase any filename originating on an uppercase-only operating system or file system. (This was \fIunzip\fP's default behavior in releases prior to 5.11; the new default behavior is identical to the old behavior with the \fB\-U\fP option, which is now obsolete and will be removed in a future release.) Depending on the archiver, files archived under single-case file systems (VMS, old MS-DOS FAT, etc.) may be stored as all-uppercase names; this can be ugly or inconvenient when extracting to a case-preserving file system such as OS/2 HPFS or a case-sensitive one such as under Unix. By defN\2 UNZIP.BCKwt[UNZIP60.MAN]UNZIP.1;1a%ault \fIunzip\fP lists and extracts such filenames exactly as they're stored (excepting truncation, conversion of unsupported characters, etc.); this option causes the names of all files from certain systems to be converted to lowercase. The \fB\-LL\fP option forces conversion of every filename to lowercase, regardless of the originating file system. .TP .B \-M pipe all output through an internal pager similar to the Unix \fImore\fP(1) command. At the end of a screenful of output, \fIunzip\fP pauses with a ``\-\-More\-\-'' prompt; the next screenful may be viewed by pressing the Enter (Return) key or the space bar. \fIunzip\fP can be terminated by pressing the ``q'' key and, on some systems, the Enter/Return key. Unlike Unix \fImore\fP(1), there is no forward-searching or editing capability. Also, \fIunzip\fP doesn't notice if long lines wrap at the edge of the screen, effectively resulting in the printing of two or more lines and the likelihood that some text will scroll off the top of the screen before being viewed. On some systems the number of available lines on the screen is not detected, in which case \fIunzip\fP assumes the height is 24 lines. .TP .B \-n never overwrite existing files. If a file already exists, skip the extraction of that file without prompting. By default \fIunzip\fP queries before extracting any file that already exists; the user may choose to overwrite only the current file, overwrite all files, skip extraction of the current file, skip extraction of all existing files, or rename the current file. .TP .B \-N [Amiga] extract file comments as Amiga filenotes. File comments are created with the \-c option of \fIzip\fP(1L), or with the \-N option of the Amiga port of \fIzip\fP(1L), which stores filenotes as comments. .TP .B \-o overwrite existing files without prompting. This is a dangerous option, so use it with care. (It is often used with \fB\-f\fP, however, and is the only way to overwrite directory EAs under OS/2.) .IP \fB\-P\fP\ \fIpassword\fP use \fIpassword\fP to decrypt encrypted zipfile entries (if any). \fBTHIS IS INSECURE!\fP Many multi-user operating systems provide ways for any user to see the current command line of any other user; even on stand-alone systems there is always the threat of over-the-shoulder peeking. Storing the plaintext password as part of a command line in an automated script is even worse. Whenever possible, use the non-echoing, interactive prompt to enter passwords. (And where security is truly important, use strong encryption such as Pretty Good Privacy instead of the relatively weak encryption provided by standard zipfile utilities.) .TP .B \-q perform operations quietly (\fB\-qq\fP = even quieter). Ordinarily \fIunzip\fP prints the names of the files it's extracting or testing, the extraction methods, any file or zipfile comments that may be stored in the archive, and possibly a summary when finished with each archive. The \fB\-q\fP[\fBq\fP] options suppress the printing of some or all of these messages. .TP .B \-s [OS/2, NT, MS-DOS] convert spaces in filenames to underscores. Since all PC operating systems allow spaces in filenames, \fIunzip\fP by default extracts filenames with spaces intact (e.g., ``\fCEA\ DATA.\ SF\fR''). This can be awkward, however, since MS-DOS in particular does not gracefully support spaces in filenames. Conversion of spaces to underscores can eliminate the awkwardness in some cases. .TP .B \-S [VMS] convert text files (\fB\-a\fP, \fB\-aa\fP) into Stream_LF record format, instead of the text-file default, variable-length record format. (Stream_LF is the default record format of VMS \fIunzip\fP. It is applied unless conversion (\fB\-a\fP, \fB\-aa\fP and/or \fB\-b\fP, \fB\-bb\fP) is requested or a VMS-specific entry is processed.) .TP .B \-U [UNICODE_SUPPORT only] modify or disable UTF-8 handling. When UNICODE_SUPPORT is available, the option \fB\-U\fP forces \fIunzip\fP to escape all non-ASCII characters from UTF-8 coded filenames as ``#Uxxxx'' (for UCS-2 characters, or ``#Lxxxxxx'' for unicode codepoints needing 3 octets). This option is mainly provided for debugging purpose when the fairly new UTF-8 support is suspected to mangle up extracted filenames. .IP The option \fB\-UU\fP allows to entirely disable the recognition of UTF-8 encoded filenames. The handling of filename codings within \fIunzip\fP falls back to the behaviour of previous versions. .IP [old, obsolete usage] leave filenames uppercase if created under MS-DOS, VMS, etc. See \fB\-L\fP above. .TP .B \-V retain (VMS) file version numbers. VMS files can be stored with a version number, in the format \fCfile.ext;##\fR. By default the ``\fC;##\fR'' version numbers are stripped, but this option allows them to be retained. (On file systems that limit filenames to particularly short lengths, the version numbers may be truncated or stripped regardless of this option.) .TP .B \-W [only when WILD_STOP_AT_DIR compile-time option enabled] modifies the pattern matching routine so that both `?' (single-char wildcard) and `*' (multi-char wildcard) do not match the directory separator character `/'. (The two-character sequence ``**'' acts as a multi-char wildcard that includes the directory separator in its matched characters.) Examples: .PP .EX "*.c" matches "foo.c" but not "mydir/foo.c" "**.c" matches both "foo.c" and "mydir/foo.c" "*/*.c" matches "bar/foo.c" but not "baz/bar/foo.c" "??*/*" matches "ab/foo" and "abc/foo" but not "a/foo" or "a/b/foo" .EE .IP This modified behaviour is equivalent to the pattern matching style used by the shells of some of UnZip's supported target OSs (one example is Acorn RISC OS). This option may not be available on systems where the Zip archive's internal directory separator character `/' is allowed as regular character in native operating system filenames. (Currently, UnZip uses the same pattern matching rules for both wildcard zipfile specifications and zip entry selection patterns in most ports. For systems allowing `/' as regular filename character, the -W option would not work as expected on a wildcard zipfile specification.) .TP .B \-X [VMS, Unix, OS/2, NT, Tandem] restore owner/protection info (UICs and ACL entries) under VMS, or user and group info (UID/GID) under Unix, or access control lists (ACLs) under certain network-enabled versions of OS/2 (Warp Server with IBM LAN Server/Requester 3.0 to 5.0; Warp Connect with IBM Peer 1.0), or security ACLs under Windows NT. In most cases this will require special system privileges, and doubling the option (\fB\-XX\fP) under NT instructs \fIunzip\fP to use pr2ivileges for extraction; but under Unix, for example, a user who belongs to several groups can restore files owned by any of those groups, as long as the user IDs match his or her own. Note that ordinary file attributes are always restored--this option applies only to optional, extra ownership info available on some operating systems. [NT's access control lists do not appear to be especially compatible with OS/2's, so no attempt is made at cross-platform portability of access privileges. It is not clear under what conditions this would ever be useful anyway.] .TP .B \-Y [VMS] treat archived file name endings of ``.nnn'' (where ``nnn'' is a decimal number) as if they were VMS version numbers (``;nnn''). (The default is to treat them as file types.) Example: .EX "a.b.3" -> "a.b;3". .EE .TP .B \-$ .\" Amiga support possible eventually, but not yet [MS-DOS, OS/2, NT] restore the volume label if the extraction medium is removable (e.g., a diskette). Doubling the option (\fB\-$$\fP) allows fixed media (harO UNZIP.BCKwt[UNZIP60.MAN]UNZIP.1;1a7=4d disks) to be labelled as well. By default, volume labels are ignored. .IP \fB\-/\fP\ \fIextensions\fP [Acorn only] overrides the extension list supplied by Unzip$Ext environment variable. During extraction, filename extensions that match one of the items in this extension list are swapped in front of the base name of the extracted file. .TP .B \-: [all but Acorn, VM/CMS, MVS, Tandem] allows to extract archive members into locations outside of the current `` extraction root folder''. For security reasons, \fIunzip\fP normally removes ``parent dir'' path components (``../'') from the names of extracted file. This safety feature (new for version 5.50) prevents \fIunzip\fP from accidentally writing files to ``sensitive'' areas outside the active extraction folder tree head. The \fB\-:\fP option lets \fIunzip\fP switch back to its previous, more liberal behaviour, to allow exact extraction of (older) archives that used ``../'' components to create multiple directory trees at the level of the current extraction folder. This option does not enable writing explicitly to the root directory (``/''). To achieve this, it is necessary to set the extraction target folder to root (e.g. \fB\-d / \fP). However, when the \fB\-:\fP option is specified, it is still possible to implicitly write to the root directory by specifying enough ``../'' path components within the zip archive. Use this option with extreme caution. .TP .B \-^ [Unix only] allow control characters in names of extracted ZIP archive entries. On Unix, a file name may contain any (8-bit) character code with the two exception '/' (directory delimiter) and NUL (0x00, the C string termination indicator), unless the specific file system has more restrictive conventions. Generally, this allows to embed ASCII control characters (or even sophisticated control sequences) in file names, at least on 'native' Unix file systems. However, it may be highly suspicious to make use of this Unix "feature". Embedded control characters in file names might have nasty side effects when displayed on screen by some listing code without sufficient filtering. And, for ordinary users, it may be difficult to handle such file names (e.g. when trying to specify it for open, copy, move, or delete operations). Therefore, \fIunzip\fP applies a filter by default that removes potentially dangerous control characters from the extracted file names. The \fB-^\fP option allows to override this filter in the rare case that embedded filename control characters are to be intentionally restored. .TP .B \-2 [VMS] force unconditionally conversion of file names to ODS2-compatible names. The default is to exploit the destination file system, preserving case and extended file name characters on an ODS5 destination file system; and applying the ODS2-compatibility file name filtering on an ODS2 destination file system. .PD .\" ========================================================================= .SH "ENVIRONMENT OPTIONS" \fIunzip\fP's default behavior may be modified via options placed in an environment variable. This can be done with any option, but it is probably most useful with the \fB\-a\fP, \fB\-L\fP, \fB\-C\fP, \fB\-q\fP, \fB\-o\fP, or \fB\-n\fP modifiers: make \fIunzip\fP auto-convert text files by default, make it convert filenames from uppercase systems to lowercase, make it match names case-insensitively, make it quieter, or make it always overwrite or never overwrite files as it extracts them. For example, to make \fIunzip\fP act as quietly as possible, only reporting errors, one would use one of the following commands: .TP Unix Bourne shell: UNZIP=\-qq; export UNZIP .TP Unix C shell: setenv UNZIP \-qq .TP OS/2 or MS-DOS: set UNZIP=\-qq .TP VMS (quotes for \fIlowercase\fP): define UNZIP_OPTS "\-qq" .PP Environment options are, in effect, considered to be just like any other command-line options, except that they are effectively the first options on the command line. To override an environment option, one may use the ``minus operator'' to remove it. For instance, to override one of< the quiet-flags in the example above, use the command .PP .EX unzip \-\-q[\fIother options\fP] zipfile .EE .PP The first hyphen is the normal switch character, and the second is a minus sign, acting on the q option. Thus the effect here is to cancel one quantum of quietness. To cancel both quiet flags, two (or more) minuses may be used: .PP .EX unzip \-t\-\-q zipfile unzip \-\-\-qt zipfile .EE .PP (the two are equivalent). This may seem awkward or confusing, but it is reasonably intuitive: just ignore the first hyphen and go from there. It is also consistent with the behavior of Unix \fInice\fP(1). .PP As suggested by the examples above, the default variable names are UNZIP_OPTS for VMS (where the symbol used to install \fIunzip\fP as a foreign command would otherwise be confused with the environment variable), and UNZIP for all other operating systems. For compatibility with \fIzip\fP(1L), UNZIPOPT is also accepted (don't ask). If both UNZIP and UNZIPOPT are defined, however, UNZIP takes precedence. \fIunzip\fP's diagnostic option (\fB\-v\fP with no zipfile name) can be used to check the values of all four possible \fIunzip\fP and \fIzipinfo\fP environment variables. .PP The timezone variable (TZ) should be set according to the local timezone in order for the \fB\-f\fP and \fB\-u\fP to operate correctly. See the description of \fB\-f\fP above for details. This variable may also be necessary to get timestamps of extracted files to be set correctly. The WIN32 (Win9x/ME/NT4/2K/XP/2K3) port of \fIunzip\fP gets the timezone configuration from the registry, assuming it is correctly set in the Control Panel. The TZ variable is ignored for this port. .PD .\" ========================================================================= .SH DECRYPTION Encrypted archives are fully supported by Info-ZIP software, but due to United States export restrictions, de-/encryption support might be disabled in your compiled binary. However, since spring 2000, US export restrictions have been liberated, and our source archives do now include full crypt code. In case you need binary distributions with crypt support enabled, see the file ``WHERE'' in any Info-ZIP source or binary distribution for locations both inside and outside the US. .PP Some compiled versions of \fIunzip\fP may not support decryption. To check a version for crypt support, either attempt to test or extract an encrypted archive, or else check \fIunzip\fP's diagnostic screen (see the \fB\-v\fP option above) for ``\fC[decryption]\fR'' as one of the special compilation options. .PP As noted above, the \fB\-P\fP option may be used to supply a password on the command line, but at a cost in security. The preferred decryption method is simply to extract normally; if a zipfile member is encrypted, \fIunzip\fP will prompt for the password without echoing what is typed. \fIunzip\fP continues to use the same password as long as it appears to be valid, by testing a 12-byte header on each file. The correct password will always check out against the header, but there is a 1-in-256 chance that an incorrect password will as well. (This is a security feature of the PKWARE zipfile format; it helps prevent brute-force attacks that might otherwise gain a large speed advantage by testing only the header.) In the case that an incorrect password is given but it passes the header test anyway, either an incorrect CRC will be generated for the extracted data or else \fIunzip\fP will fail during the extraction because the ``decrypted'' bytes do not constitute a valid compressed data strPX UNZIP.BCKwt[UNZIP60.MAN]UNZIP.1;1aCeam. .PP If the first password fails the header check on some file, \fIunzip\fP will prompt for another password, and so on until all files are extracted. If a password is not known, entering a null password (that is, just a carriage return or ``Enter'') is taken as a signal to skip all further prompting. Only unencrypted files in the archive(s) will thereafter be extracted. (In fact, that's not quite true; older versions of \fIzip\fP(1L) and \fIzipcloak\fP(1L) allowed null passwords, so \fIunzip\fP checks each encrypted file to see if the null password works. This may result in ``false positives'' and extraction errors, as noted above.) .PP Archives encrypted with 8-bit passwords (for example, passwords with accented European characters) may not be portable across systems and/or other archivers. This problem stems from the use of multiple encoding methods for such characters, including Latin-1 (ISO 8859-1) and OEM code page 850. DOS \fIPKZIP\fP 2.04g uses the OEM code page; Windows \fIPKZIP\fP 2.50 uses Latin-1 (and is therefore incompatible with DOS \fIPKZIP\fP); Info-ZIP uses the OEM code page on DOS, OS/2 and Win3.x ports but ISO coding (Latin-1 etc.) everywhere else; and Nico Mak's \fIWinZip\fP 6.x does not allow 8-bit passwords at all. \fIUnZip\fP 5.3 (or newer) attempts to use the default character set first (e.g., Latin-1), followed by the alternate one (e.g., OEM code page) to test passwords. On EBCDIC systems, if both of these fail, EBCDIC encoding will be tested as a last resort. (EBCDIC is not tested on non-EBCDIC systems, because there are no known archivers that encrypt using EBCDIC encoding.) ISO character encodings other than Latin-1 are not supported. The new addition of (partially) Unicode (resp. UTF-8) support in \fIUnZip\fP 6.0 has not yet been adapted to the encryption password handling in \fIunzip\fP. On systems that use UTF-8 as native character encoding, \fIunzip\fP simply tries decryption with the native UTF-8 encoded password; the built-in attempts to check the password in translated encoding have not yet been adapted for UTF-8 support and will consequently fail. .PD .\" ========================================================================= .SH EXAMPLES To use \fIunzip\fP to extract all members of the archive \fIletters.zip\fP into the current directory and subdirectories below it, creating any subdirectories as necessary: .PP .EX unzip letters .EE .PP To extract all members of \fIletters.zip\fP into the current directory only: .PP .EX unzip -j letters .EE .PP To test \fIletters.zip\fP, printing only a summary message indicating whether the archive is OK or not: .PP .EX unzip -tq letters .EE .PP To test \fIall\fP zipfiles in the current directory, printing only the summaries: .PP .EX unzip -tq \e*.zip .EE .PP (The backslash before the asterisk is only required if the shell expands wildcards, as in Unix; double quotes could have been used instead, as in the source examples below.)\ \ To extract to standard output all members of \fIletters.zip\fP whose names end in \fI.tex\fP, auto-converting to the local end-of-line convention and piping the output into \fImore\fP(1): .PP .EX unzip \-ca letters \e*.tex | more .EE .PP To extract the binary file \fIpaper1.dvi\fP to standard output and pipe it to a printing program: .PP .EX unzip \-p articles paper1.dvi | dvips .EE .PP To extract all FORTRAN and C source files--*.f, *.c, *.h, and Makefile--into the /tmp directory: .PP .EX unzip source.zip "*.[fch]" Makefile -d /tmp .EE .PP (the double quotes are necessary only in Unix and only if globbing is turned on). To extract all FORTRAN and C source files, regardless of case (e.g., both *.c and *.C, and any makefile, Makefile, MAKEFILE or similar): .PP .EX unzip \-C source.zip "*.[fch]" makefile -d /tmp .EE .PP To extract any such files but convert any uppercase MS-DOS or VMS names to lowercase and convert the line-endings of all of the files to the local standard (without respect to any files that might be marked ``binary''): .PP .EX unzip \-aaCL source.zip "*.[fch]" makefile -d /tmp .EE .PP To extract only newer versions of the files already in the current directory, without querying (NOTE: be careful of unzipping in one timezone a zipfile created in another--ZIP archives other than those created by Zip 2.1 or later contain no timezone information, and a ``newer'' file from an eastern timezone may, in fact, be older): .PP .EX unzip \-fo sources .EE .PP To extract newer versions of the files already in the current directory and to create any files not already there (same caveat as previous example): .PP .EX unzip \-uo sources .EE .PP To display a diagnostic screen showing which \fIunzip\fP and \fIzipinfo\fP options are stored in environment variables, whether decryption support was compiled in, the compiler with which \fIunzip\fP was compiled, etc.: .PP .EX unzip \-v .EE .PP In the last five examples, assume that UNZIP or UNZIP_OPTS is set to -q. To do a singly quiet listing: .PP .EX unzip \-l file.zip .EE .PP To do a doubly quiet listing: .PP .EX unzip \-ql file.zip .EE .PP (Note that the ``\fC.zip\fR'' is generally not necessary.) To do a standard listing: .PP .EX unzip \-\-ql file.zip .EE or .EX unzip \-l\-q file.zip .EE or .EX unzip \-l\-\-q file.zip .EE \fR(Extra minuses in options don't hurt.) .PD .\" ========================================================================= .SH TIPS The current maintainer, being a lazy sort, finds it very useful to define a pair of aliases: \fCtt\fR for ``\fCunzip \-tq\fR'' and \fCii\fR for ``\fCunzip \-Z\fR'' (or ``\fCzipinfo\fR''). One may then simply type ``\fCtt zipfile\fR'' to test an archive, something that is worth making a habit of doing. With luck \fIunzip\fP will report ``\fCNo errors detected in compressed data of zipfile.zip\fR,'' after which one may breathe a sigh of relief. .PP The maintainer also finds it useful to set the UNZIP environment variable to ``\fC\-aL\fR'' and is tempted to add ``\fC\-C\fR'' as well. His ZIPINFO variable is set to ``\fC\-z\fR''. .PD .\" ========================================================================= .SH DIAGNOSTICS The exit status (or error level) approximates the exit codes defined by PKWARE and takes on the following values, except under VMS: .RS .IP 0 normal; no errors or warnings detected. .IP 1 one or more warning errors were encountered, but processing completed successfully anyway. This includes zipfiles where one or more files was skipped due to unsupported compression method or encryption with an unknown password. .IP 2 a generic error in the zipfile format was detected. Processing may have completed successfully anyway; some broken zipfiles created by other archivers have simple work-arounds. .IP 3 a severe error in the zipfile format was detected. Processing probably failed immediately. .IP 4 \fIunzip\fP was unable to allocate memory for one or more buffers during program initialization. .IP 5 \fIunzip\fP was unable to allocate memory or unable to obtain a tty to read the decryption password(s). .IP 6 \fIunzip\fP was unable to allocate memory during decompression to disk. .IP 7 \fIunzip\fP was unable to allocate memory during in-memory decompression. .IP 8 [currently not used] .IP 9 the specified zipfiles were not found. .IP 10 invalid options were specified on the command line. .IP 11 no matching files were found. .IP 50 the disk is (or was) full during extraction. .IP 51 the end of the ZIP archive was encountered prematurely. .IP 80 the user aborted \fIunzip\fP prematurely with control-C (or similar) .IP 81 testing or extraction of one or more files failed due to unsupported compression methods oQ/K UNZIP.BCKwt[UNZIP60.MAN]UNZIP.1;1aV}Rr unsupported decryption. .IP 82 no files were found due to bad decryption password(s). (If even one file is successfully processed, however, the exit status is 1.) .RE .PP VMS interprets standard Unix (or PC) return values as other, scarier-looking things, so \fIunzip\fP instead maps them into VMS-style status codes. The current mapping is as follows: 1 (success) for normal exit, 0x7fff0001 for warning errors, and (0x7fff000? + 16*normal_unzip_exit_status) for all other errors, where the `?' is 2 (error) for \fIunzip\fP values 2, 9-11 and 80-82, and 4 (fatal error) for the remaining ones (3-8, 50, 51). In addition, there is a compilation option to expand upon this behavior: defining RETURN_CODES results in a human-readable explanation of what the error status means. .PD .\" ========================================================================= .SH BUGS Multi-part archives are not yet supported, except in conjunction with \fIzip\fP. (All parts must be concatenated together in order, and then ``\fCzip \-F\fR'' (for \fIzip 2.x\fP) or ``\fCzip \-FF\fR'' (for \fIzip 3.x\fP) must be performed on the concatenated archive in order to ``fix'' it. Also, \fIzip 3.0\fP and later can combine multi-part (split) archives into a combined single-file archive using ``\fCzip \-s\- inarchive -O outarchive\fR''. See the \fIzip 3\fP manual page for more information.) This will definitely be corrected in the next major release. .PP Archives read from standard input are not yet supported, except with \fIfunzip\fP (and then only the first member of the archive can be extracted). .PP Archives encrypted with 8-bit passwords (e.g., passwords with accented European characters) may not be portable across systems and/or other archivers. See the discussion in \fBDECRYPTION\fP above. .PP \fIunzip\fP's \fB\-M\fP (``more'') option tries to take into account automatic wrapping of long lines. However, the code may fail to detect the correct wrapping locations. First, TAB characters (and similar control sequences) are not taken into account, they are handled as ordinary printable characters. Second, depending on the actual system / OS port, \fIunzip\fP may not detect the true screen geometry but rather rely on "commonly used" default dimensions. The correct handling of tabs would require the implementation of a query for the actual tabulator setup on the output console. .PP Dates, times and permissions of stored directories are not restored except under Unix. (On Windows NT and successors, timestamps are now restored.) .PP [MS-DOS] When extracting or testing files from an archive on a defective floppy diskette, if the ``Fail'' option is chosen from DOS's ``Abort, Retry, Fail?'' message, older versions of \fIunzip\fP may hang the system, requiring a reboot. This problem appears to be fixed, but control-C (or control-Break) can still be used to terminate \fIunzip\fP. .PP Under DEC Ultrix, \fIunzip\fP would sometimes fail on long zipfiles (bad CRC, not always reproducible). This was apparently due either to a hardware bug (cache memory) or an operating system bug (improper handling of page faults?). Since Ultrix has been abandoned in favor of Digital Unix (OSF/1), this may not be an issue anymore. .PP [Unix] Unix special files such as FIFO buffers (named pipes), block devices and character devices are not restored even if they are somehow represented in the zipfile, nor are hard-linked files relinked. Basically the only file types restored by \fIunzip\fP are regular files, directories and symbolic (soft) links. .PP [OS/2] Extended attributes for existing directories are only updated if the \fB\-o\fP (``overwrite all'') option is given. This is a limitation of the operating system; because directories only have a creation time associated with them, \fIunzip\fP has no way to determine whether the stored attributes are newer or older than those on disk. In practice this may mean a two-pass approach is required: first unpack the archive normally (with or without freshening/updating existing files), then overwrite just the directory entries (e.g., ``\fCunzip -o foo */\fR''). .PP [VMS] When extracting to another directory, only the \fI[.foo]\fP syntax is accepted for the \fB\-d\fP option; the simple Unix \fIfoo\fP syntax is silently ignored (as is the less common VMS \fIfoo.dir\fP syntax). .PP [VMS] When the file being extracted already exists, \fIunzip\fP's query only allows skipping, overwriting or renaming; there should additionally be a choice for creating a new version of the file. In fact, the ``overwrite'' choice does create a new version; the old version is not overwritten or deleted. .PD .\" ========================================================================= .SH "SEE ALSO" \fIfunzip\fP(1L), \fIzip\fP(1L), \fIzipcloak\fP(1L), \fIzipgrep\fP(1L), \fIzipinfo\fP(1L), \fIzipnote\fP(1L), \fIzipsplit\fP(1L) .PD .\" ========================================================================= .SH URL The Info-ZIP home page is currently at .EX \fChttp://www.info-zip.org/pub/infozip/\fR .EE or .EX \fCftp://ftp.info-zip.org/pub/infozip/\fR . .EE .PD .\" ========================================================================= .SH AUTHORS The primary Info-ZIP authors (current semi-active members of the Zip-Bugs workgroup) are: Ed Gordon (Zip, general maintenance, shared code, Zip64, Win32, Unix, Unicode); Christian Spieler (UnZip maintenance coordination, VMS, MS-DOS, Win32, shared code, general Zip and UnZip integration and optimization); Onno van der Linden (Zip); Mike White (Win32, Windows GUI, Windows DLLs); Kai Uwe Rommel (OS/2, Win32); Steven M. Schweda (VMS, Unix, support of new features); Paul Kienitz (Amiga, Win32, Unicode); Chris Herborth (BeOS, QNX, Atari); Jonathan Hudson (SMS/QDOS); Sergio Monesi (Acorn RISC OS); Harald Denker (Atari, MVS); John Bush (Solaris, Amiga); Hunter Goatley (VMS, Info-ZIP Site maintenance); Steve Salisbury (Win32); Steve Miller (Windows CE GUI), Johnny Lee (MS-DOS, Win32, Zip64); and Dave Smith (Tandem NSK). .PP The following people were former members of the Info-ZIP development group and provided major contributions to key parts of the current code: Greg ``Cave Newt'' Roelofs (UnZip, unshrink decompression); Jean-loup Gailly (deflate compression); Mark Adler (inflate decompression, fUnZip). .PP The author of the original unzip code upon which Info-ZIP's was based is Samuel H. Smith; Carl Mascott did the first Unix port; and David P. Kirschbaum organized and led Info-ZIP in its early days with Keith Petersen hosting the original mailing list at WSMR-SimTel20. The full list of contributors to UnZip has grown quite large; please refer to the CONTRIBS file in the UnZip source distribution for a relatively complete version. .PD .\" ========================================================================= .SH VERSIONS .ta \w'vx.xxnn'u +\w'fall 1989'u+3n .PD 0 .IP "v1.2\t15 Mar 89" \w'\t\t'u Samuel H. Smith .IP "v2.0\t\ 9 Sep 89" Samuel H. Smith .IP "v2.x\tfall 1989" many Usenet contributors .IP "v3.0\t\ 1 May 90" Info-ZIP (DPK, consolidator) .IP "v3.1\t15 Aug 90" Info-ZIP (DPK, consolidator) .IP "v4.0\t\ 1 Dec 90" Info-ZIP (GRR, maintainer) .IP "v4.1\t12 May 91" Info-ZIP .IP "v4.2\t20 Mar 92" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.0\t21 Aug 92" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.01\t15 Jan 93" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.1\t\ 7 Feb 94" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.11\t\ 2 Aug 94" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.12\t28 Aug 94" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.2\t30 Apr 96" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.3\t22 Apr 97" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.31R` UNZIP.BCKwt[UNZIP60.MAN]UNZIP.1;1aa\t31 May 97" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.32\t\ 3 Nov 97" Info-ZIP (Zip-Bugs subgroup, GRR) .IP "v5.4\t28 Nov 98" Info-ZIP (Zip-Bugs subgroup, SPC) .IP "v5.41\t16 Apr 00" Info-ZIP (Zip-Bugs subgroup, SPC) .IP "v5.42\t14 Jan 01" Info-ZIP (Zip-Bugs subgroup, SPC) .IP "v5.5\t17 Feb 02" Info-ZIP (Zip-Bugs subgroup, SPC) .IP "v5.51\t22 May 04" Info-ZIP (Zip-Bugs subgroup, SPC) .IP "v5.52\t28 Feb 05" Info-ZIP (Zip-Bugs subgroup, SPC) .IP "v6.0\t20 Apr 09" Info-ZIP (Zip-Bugs subgroup, SPC) .PD *[UNZIP60.MAN]UNZIPSFX.1;1+,./ 4E@-t0123KPWO56ؤ7ؤ89GHJ.\" Copyright (c) 1990-2009 Info-ZIP. All rights reserved. .\" .\" See the accompanying file LICENSE, version 2009-Jan-02 or later .\" (the contents of which are also included in unzip.h) for terms of use. .\" If, for some reason, all these files are missing, the Info-ZIP license .\" also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html .\" .\" unzipsfx.1 by Greg Roelofs .\" .\" ========================================================================= .\" define .EX/.EE (for multiline user-command examples; normal Courier font) .de EX .in +4n .nf .ft CW .. .de EE .ft R .fi .in -4n .. .\" ========================================================================= .TH UNZIPSFX 1L "20 April 2009 (v6.0)" "Info-ZIP" .SH NAME unzipsfx \- self-extracting stub for prepending to ZIP archives .PD .SH SYNOPSIS \fB\fP [\fB\-cfptuz\fP[\fBajnoqsCLV$\fP]] [\fIfile(s)\fP\ .\|.\|. [\fB\-x\fP\ \fIxfile(s)\fP\ .\|.\|.]] .PD .\" ========================================================================= .SH DESCRIPTION \fIunzipsfx\fP is a modified version of \fIunzip\fP(1L) designed to be prepended to existing ZIP archives in order to form self-extracting archives. Instead of taking its first non-flag argument to be the zipfile(s) to be extracted, \fIunzipsfx\fP seeks itself under the name by which it was invoked and tests or extracts the contents of the appended archive. Because the executable stub adds bulk to the archive (the whole purpose of which is to be as small as possible), a number of the less-vital capabilities in regular \fIunzip\fP have been removed. Among these are the usage (or help) screen, the listing and diagnostic functions (\fB\-l\fP and \fB\-v\fP), the ability to decompress older compression formats (the ``reduce,'' ``shrink'' and ``implode'' methods). The ability to extract to a directory other than the current one can be selected as a compile-time option, which is now enabled by default since UnZipSFX version 5.5. Similarly, decryption is supported as a compile-time option but should be avoided unless the attached archive contains encrypted files. Starting with release 5.5, another compile-time option adds a simple ``run command after extraction'' feature. This feature is currently incompatible with the ``extract to different directory'' feature and remains disabled by default. .PP \fBNote that self-extracting archives made with\fP \fIunzipsfx\fP \fBare no more (or less) portable across different operating systems than is the\fP \fIunzip\fP \fBexecutable itself.\fP In general a self-extracting archive made on a particular Unix system, for example, will only self-extract under the same flavor of Unix. Regular \fIunzip\fP may still be used to extract the embedded archive as with any normal zipfile, although it will generate a harmless warning about extra bytes at the beginning of the zipfile. \fIDespite this\fP, however, the self-extracting archive is technically \fInot\fP a valid ZIP archive, and PKUNZIP may be unable to test or extract it. This limitation is due to the simplistic manner in which the archive is created; the internal directory structure is not updated to reflect the extra bytes prepended to the original zipfile. .PD .\" ========================================================================= .SH ARGUMENTS .IP [\fIfile(s)\fP] An optional list of archive members to be processed. Regular expressions (wildcards) similar to those in Unix \fIegrep\fP(1) may be used to match multiple members. These wildcards may contain: .RS .IP * matches a sequenc e of 0 or more characters .IP ? matches exactly 1 character .IP [.\|.\|.] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If an exclamation point or a caret (`!' or `^') follows the left bracket, then the range of characters within the brackets is complemented (that is, anything \fIexcept\fP the characters inside the brackets is considered a match). .RE .IP (Be sure to quote any character that might otherwise be interpreted or modified by the operating system, particularly under Unix and VMS.) .IP [\fB\-x\fP\ \fIxfile(s)\fP] An optional list of archive members to be excluded from processing. Since wildcard characters match directory separators (`/'), this option may be used to exclude any files that are in subdirectories. For example, ``\fCfoosfx *.[ch] -x */*\fR'' would extract all C source files in the main directory, but none in any subdirectories. Without the \fB\-x\fP option, all C source files in all directories within the zipfile would be extracted. .PP If \fIunzipsfx\fP is compiled with SFX_EXDIR defined, the following option is also enabled: .IP [\fB\-d\fP\ \fIexdir\fP] An optional directory to which to extract files. By default, all files and subdirectories are recreated in the current directory; the \fB\-d\fP option allows extraction in an arbitrary directory (always assuming one has permission to write to the directory). The option and directory may be concatenated without any white space between them, but note that this may cause normal shell behavior to be suppressed. In particular, ``\fC\-d\ ~\fR'' (tilde) is expanded by Unix C shells into the name of the user's home directory, but ``\fC\-d~\fR'' is treated as a literal subdirectory ``\fB~\fP'' of the current directory. .PD .\" ========================================================================= .SH OPTIONS \fIunzipsfx\fP supports the following \fIunzip\fP(1L) options: \fB\-c\fP and \fB\-p\fP (extract to standard output/screen), \fB\-f\fP and \fB\-u\fP (freshen and update existing files upon extraction), \fB\-t\fP (test archive) and \fB\-z\fP (print archive comment). All normal listing options (\fB\-l\fP, \fB\-v\fP and \fB\-Z\fP) have been removed, but the testing option (\fB\-t\fP) may be used as a ``poor man's'' listing. Alternatively, those creating self-extracting archives may wish to include a short listing in the zipfile comment. .PP See \fIunzip\fP(1L) for a more complete description of these options. .PD .\" ========================================================================= .SH MODIFIERS \fIunzipsfx\fP currently supports all \fIunzip\fP(1L) modifiers: \fB\-a\fP (convert text files), \fB\-n\fP (never overwrite), \fB\-o\fP (overwrite without prompting), \fB\-q\fP (operate quietly), \fB\-C\fP (match names case-insensitively), \fB\-L\fP (convert uppercase-OS names to lowercase), \fB\-j\fP (junk paths) and \fB\-V\fP (retain version numbers); plus the following operating-system specific options: \fB\-X\fP (restore VMS owner/protection infoSCC UNZIP.BCKt[UNZIP60.MAN]UNZIPSFX.1;1), \fB\-s\fP (convert spaces in filenames to underscores [DOS, OS/2, NT]) and \fB\-$\fP (restore volume label [DOS, OS/2, NT, Amiga]). .PP (Support for regular ASCII text-conversion may be removed in future versions, since it is simple enough for the archive's creator to ensure that text files have the appropriate format for the local OS. EBCDIC conversion will of course continue to be supported since the zipfile format implies ASCII storage of text files.) .PP See \fIunzip\fP(1L) for a more complete description of these modifiers. .PD .\" ========================================================================= .SH "ENVIRONMENT OPTIONS" \fIunzipsfx\fP uses the same environment variables as \fIunzip\fP(1L) does, although this is likely to be an issue only for the person creating and testing the self-extracting archive. See \fIunzip\fP(1L) for details. .PD .\" ========================================================================= .SH DECRYPTION Decryption is supported exactly as in \fIunzip\fP(1L); that is, interactively with a non-echoing prompt for the password(s). See \fIunzip\fP(1L) for details. Once again, note that if the archive has no encrypted files there is no reason to use a version of \fIunzipsfx\fP with decryption support; that only adds to the size of the archive. .PD .\" ========================================================================= .SH AUTORUN COMMAND When \fIunzipsfx\fP was compiled with CHEAP_SFX_AUTORUN defined, a simple ``command autorun'' feature is supported. You may enter a command into the Zip archive comment, using the following format: .PP .EX $AUTORUN$>[command line string] .EE .PP When \fIunzipsfx\fP recognizes the ``$AUTORUN$>'' token at the beginning of the Zip archive comment, the remainder of the first line of the comment (until the first newline character) is passed as a shell command to the operating system using the C rtl ``system'' function. Before executing the command, \fIunzipsfx\fP displays the command on the console and prompts the user for confirmation. When the user has switched off prompting by specifying the \fB-q\fP option, autorun commands are never executed. .PP In case the archive comment contains additional lines of text, the remainder of the archive comment following the first line is displayed normally, unless quiet operation was requested by supplying a \fB-q\fP option. .PD .\" ========================================================================= .SH EXAMPLES To create a self-extracting archive \fIletters\fP from a regular zipfile \fIletters.zip\fP and change the new archive's permissions to be world-executable under Unix: .PP .EX cat unzipsfx letters.zip > letters chmod 755 letters zip -A letters .EE .PP To create the same archive under MS-DOS, OS/2 or NT (note the use of the \fB/b\fP [binary] option to the \fIcopy\fP command): .PP .EX copy /b unzipsfx.exe+letters.zip letters.exe zip -A letters.exe .EE .PP Under VMS: .PP .EX copy unzipsfx.exe,letters.zip letters.exe letters == "$currentdisk:[currentdir]letters.exe" zip -A letters.exe .EE .PP (The VMS \fIappend\fP command may also be used. The second command installs the new program as a ``foreign command'' capable of taking arguments. The third line assumes that Zip is already installed as a foreign command.) Under AmigaDOS: .PP .EX MakeSFX letters letters.zip UnZipSFX .EE .PP (MakeSFX is included with the UnZip source distribution and with Amiga binary distributions. ``\fCzip -A\fR'' doesn't work on Amiga self-extracting archives.) To test (or list) the newly created self-extracting archive: .PP .EX letters \-t .EE .PP To test \fIletters\fP quietly, printing only a summary message indicating whether the archive is OK or not: .PP .EX letters \-tqq .EE .PP To extract the complete contents into the current directory, recreating all files and subdirectories as necessary: .PP .EX letters .EE .PP To extract all \fC*.txt\fR files (in Unix quote the `*'): .PP .EX letters *.txt .EE .PP To extract everything \fIexcept\fP the \fC*.txt\fR files: .PP .EX letters -x *.txt .EE .PP To extract only the README file to standard output (the screen): .PP .EX letters -c README .EE .PP To print only the zipfile comment: .PP .EX letters \-z .EE .PD .\" ========================================================================= .SH LIMITATIONS The principle and fundamental limitation of \fIunzipsfx\fP is that it is not portable across architectures or operating systems, and therefore neither are the resulting archives. For some architectures there is limited portability, however (e.g., between some flavors of Intel-based Unix). .PP Another problem with the current implementation is that any archive with ``junk'' prepended to the beginning technically is no longer a zipfile (unless \fIzip\fP(1) is used to adjust the zipfile offsets appropriately, as noted above). \fIunzip\fP(1) takes note of the prepended bytes and ignores them since some file-transfer protocols, notably MacBinary, are also known to prepend junk. But PKWARE's archiver suite may not be able to deal with the modified archive unless its offsets have been adjusted. .PP \fIunzipsfx\fP has no knowledge of the user's PATH, so in general an archive must either be in the current directory when it is invoked, or else a full or relative path must be given. If a user attempts to extract the archive from a directory in the PATH other than the current one, \fIunzipsfx\fP will print a warning to the effect, ``can't find myself.'' This is always true under Unix and may be true in some cases under MS-DOS, depending on the compiler used (Microsoft C fully qualifies the program name, but other compilers may not). Under OS/2 and NT there are operating-system calls available that provide the full path name, so the archive may be invoked from anywhere in the user's path. The situation is not known for AmigaDOS, Atari TOS, MacOS, etc. .PP As noted above, a number of the normal \fIunzip\fP(1L) functions have been removed in order to make \fIunzipsfx\fP smaller: usage and diagnostic info, listing functions and extraction to other directories. Also, only stored and deflated files are supported. The latter limitation is mainly relevant to those who create SFX archives, however. .PP VMS users must know how to set up self-extracting archives as foreign commands in order to use any of \fIunzipsfx\fP's options. This is not necessary for simple extraction, but the command to do so then becomes, e.g., ``\fCrun letters\fR'' (to continue the examples given above). .PP \fIunzipsfx\fP on the Amiga requires the use of a special program, MakeSFX, in order to create working self-extracting archives; simple concatenation does not work. (For technically oriented users, the attached archive is defined as a ``debug hunk.'') There may be compatibility problems between the ROM levels of older Amigas and newer ones. .PP All current bugs in \fIunzip\fP(1L) exist in \fIunzipsfx\fP as well. .PD .\" ========================================================================= .SH DIAGNOSTICS \fIunzipsfx\fP's exit status (error level) is identical to that of \fIunzip\fP(1L); see the corresponding man page. .PD .\" ========================================================================= .SH "SEE ALSO" \fIfunzip\fP(1L), \fIunzip\fP(1L), \fIzip\fP(1L), \fIzipcloak\fP(1L), \fIzipgrep\fP(1L), \fIzipinfo\fP(1L), \fIzipnote\fP(1L), \fIzipsplit\fP(1L) .PD .PD .\" ========================================================================= .SH URL The Info-ZIP home page is currently at .EX \fChttp://www.info-zip.org/pub/infozip/\fR .EE or .EX \fCftp://ftp.info-zip.org/pub/infozip/\fR . .EE .PD .\" ======================T-L UNZIP.BCKt[UNZIP60.MAN]UNZIPSFX.1;1k=================================================== .SH AUTHORS Greg Roelofs was responsible for the basic modifications to UnZip necessary to create UnZipSFX. See \fIunzip\fP(1L) for the current list of Zip-Bugs authors, or the file CONTRIBS in the UnZip source distribution for the full list of Info-ZIP contributors. .PD *[UNZIP60.MAN]ZIPGREP.1;1+,./ 4@-t0123KPWO 56Bؤ7Bؤ89GHJ.\" Copyright (c) 1990-2009 Info-ZIP. All rights reserved. .\" .\" See the accompanying file LICENSE, version 2009-Jan-02 or later .\" (the contents of which are also included in unzip.h) for terms of use. .\" If, for some reason, all these files are missing, the Info-ZIP license .\" also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html .\" .\" zipgrep.1 by Greg Roelofs. .\" .\" ========================================================================= .TH ZIPGREP 1L "20 April 2009" "Info-ZIP" .SH NAME zipgrep \- search files in a ZIP archive for lines matching a pattern .PD .SH SYNOPSIS \fBzipgrep\fP [\fBegrep_options\fP] \fIpattern\fP \fIfile\fP[\fI.zip\fP] [\fIfile(s)\fP\ .\|.\|.] [\fB\-x\fP\ \fIxfile(s)\fP\ .\|.\|.] .PD .\" ========================================================================= .SH DESCRIPTION \fIzipgrep\fP will search files within a ZIP archive for lines matching the given string or pattern. \fIzipgrep\fP is a shell script and requires \fIegrep\fP(1) and \fIunzip\fP(1L) to function. Its output is identical to that of \fIegrep\fP(1). .PD .\" ========================================================================= .SH ARGUMENTS .TP .IP \fIpattern\fP The pattern to be located within a ZIP archive. Any string or regular expression accepted by \fIegrep\fP(1) may be used. .IR file [ .zip ] Path of the ZIP archive. (Wildcard expressions for the ZIP archive name are not supported.) If the literal filename is not found, the suffix \fC.zip\fR is appended. Note that self-extracting ZIP files are supported, as with any other ZIP archive; just specify the \fC.exe\fR suffix (if any) explicitly. .IP [\fIfile(s)\fP] An optional list of archive members to be processed, separated by spaces. If no member files are specified, all members of the ZIP archive are searched. Regular expressions (wildcards) may be used to match multiple members: .RS .IP * matches a sequence of 0 or more characters .IP ? matches exactly 1 character .IP [.\|.\|.] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If an exclamation point or a caret (`!' or `^') follows the left bracket, then the range of characters within the brackets is complemented (that is, anything \fIexcept\fP the characters inside the brackets is considered a match). .RE .IP (Be sure to quote any character that might otherwise be interpreted or modified by the operating system.) .IP [\fB\-x\fP\ \fIxfile(s)\fP] An optional list of archive members to be excluded from processing. Since wildcard characters match directory separators (`/'), this option may be used to exclude any files that are in subdirectories. For example, ``\fCzipgrep grumpy foo *.[ch] -x */*\fR'' would search for the string ``grumpy'' in all C source files in the main directory of the ``foo'' archive, but none in any subdirectories. Without the \fB\-x\fP option, all C source files in all directories within the zipfile would be searched. .\" ========================================================================= .SH OPTIONS All options prior to the ZIP archive filename are passed to \fIegrep\fP(1). .PD .\" ========================================================================= .SH "SEE ALSO" \fIegrep\fP(1), \fIunzip\fP(1L), \fIzip\fP(1L), \fIfunzip\fP(1L), \fIzipcloak\fP(1L), \fIzipinfo\fP(1L), \fIzipnote\fP(1L), \fIzipsplit\fP(1L) .PD .\" ========================================================================= .SH URL The Info-ZIP home page is currently at .EX \fChttp://www.info-zip.org/pub/infozip/\fR .EE or .EX \fCftp://ftp.info-zip.org/pub/infozip/\fR . .EE .PD .\" ========================================================================= .SH AUTHORS \fIzipgrep\fP was written by Jean-loup Gailly. .PD *[UNZIP60.MAN]ZIPINFO.1;1+,.// 4//7@-t0123KPWO056jؤ7jؤ89GHJ .\" Copyright (c) 1990-2009 Info-ZIP. All rights reserved. .\" .\" See the accompanying file LICENSE, version 2009-Jan-02 or later .\" (the contents of which are also included in unzip.h) for terms of use. .\" If, for some reason, all these files are missing, the Info-ZIP license .\" also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html .\" .\" zipinfo.1 by Greg Roelofs and others. .\" .\" ========================================================================= .\" define .X macro (for long-line ZipInfo output examples; small Courier): .de X .nf .ft CW .ie n .ti -5 .el \{ .ti +2m .ps -1 \} \&\\$1 .ie n .ti +5 .el \{ .ti -2m .ps +1 \} .ft .fi .. .\" define .EX/.EE (for multiline user-command examples; normal Courier font) .de EX .in +4n .nf .ft CW .. .de EE .ft .fi .in -4n .. .\" ========================================================================= .TH ZIPINFO 1L "20 April 2009 (v3.0)" "Info-ZIP" .SH NAME zipinfo \- list detailed information about a ZIP archive .PD .SH SYNOPSIS \fBzipinfo\fP [\fB\-12smlvhMtTz\fP] \fIfile\fP[\fI.zip\fP] [\fIfile(s)\fP\ .\|.\|.] [\fB\-x\fP\ \fIxfile(s)\fP\ .\|.\|.] .PP \fBunzip\fP \fB\-Z\fP [\fB\-12smlvhMtTz\fP] \fIfile\fP[\fI.zip\fP] [\fIfile(s)\fP\ .\|.\|.] [\fB\-x\fP\ \fIxfile(s)\fP\ .\|.\|.] .PD .\" ========================================================================= .SH DESCRIPTION \fIzipinfo\fP lists technical information about files in a ZIP archive, most commonly found on MS-DOS systems. Such information includes file access permissions, encryption status, type of compression, version and operating system or file system of compressing program, and the like. The default behavior (with no options) is to list single-line entries for each file in the archive, with header and trailer lines providing summary information for the entire archive. The format is a cross between Unix ``\fCls \-l\fR'' and ``\fCunzip \-v\fR'' output. See .B "DETAILED DESCRIPTION" below. Note that \fIzipinfo\fP is the same program as \fIunzip\fP (under Unix, a link to it); on some systems, however, \fIzipinfo\fP support may have been omitted when \fIunzip\fP was compiled. .PD .\" ========================================================================= .SH ARGUMENTS .TP .IR file [ .zip ] Path of the ZIP archive(s). If the file specification is a wildcard, each matching file is processed in an order determined by the operating system (or file system). Only the filename can be a wildcard; the path itself cannot. Wildcard expressions are similar to Unix \fIegrep\fP(1) (rU|A~ 1k`2S~"sC5J$m o / I=ukSs74WDRLFEKzgvrj5T0( 'Y&[W0Z(Oh BhNp"n0v#dMy:=pmDm5G&@;yDqy)r_M%S`&\OWkp`_enkqIiIE@L !^W7-O(@SH O?! ]P\!Z 3|2W%oiAt i8]3$yK ed+'5(F%Ez~xk+z3:q`mT QF'pXj6bgOHnWbA z9Ov_,4t ykffe3kow6|(``%Z]$l%cGj3AO5!kF@YmEB]YY47@/Kn.SBLnPCQIo|BI)dKpE5Us4yGB#34,oU[]/FNVPN q=SACjnPE3'oZ+X(F:qAZ>Ws y"bg+;(gpGfvLL U.8Yq9WlrC)ZTPn]r~CMQJKhN^_\,DGz@{< xj,-xY%{ wZ&}\jGjgREMEYM%PcP %WoYb" 2>JRQXDl^L!E2]H@uV8aJAdO KTRC--@~pI;$*I7P;a+i R QJ \/_KIA'[y*R%(;TfE@-a*0M8X J+Q~|'fR &)brh|q.Yk!/iX6&_uNAofX (GhWO.\wtZBSO-rQlXE@n~_h(.w)m_*=]w$LJGa)1i3@ a^ ?T.Uq946p%U THe$0Gp1OI_]6+1qf{d{yF =9V s}{ e;O9)THypcCSs /QT({"PGnI40valMO+Hp';AeM.96F;\O Ni*lV"i@iy2Rv"x_^[p:#zP4P"G7Jp*kiRHXD6hy <A @y,E s5"uB~R%?83[0UUQh 3RH~VZ]HS[2&bx&:;) #Xq ui{+p$rbj*]I#&K* B2 WU`}$vj+S.o45CiZ|[0W{KB `'^Q9\# #3'HT3n23P[BPQv7Upmd:H.^d]+m6wFWA^g3?%B1p,#WyNpfQ ab{S-Rb97DFdC;QJ3J;7'JHBAIh.CHR*65:x%:B-U*RUQYvOO6of3a~6f=&DzV;_ 5 3_CK1Bdz,aF jM0,,D{CN8@96Y=Y t@/Nm>#*+_n ^Kz~*TG6e?K3Z= '&D W:KVGB<]xJIr[p&%1h/_"C4}g >rGTA_8!+Se!lf[ `E1jVs1*)B]n`xW MMRCm\mliEz%jr=K1 Qn\KkT2TLWz4a0]iyS0n~ yF/!@(mJ0tlDw p9$_JKfZf3[^#;i2 Q5A6}C]J K\PYg \ NQ c}E/No~[\Q\BL z.q VPRSnOY`VW 5I w N Jn4-^W@HQ^DFB|8 cDZ/1PM-S >X3x*ZG CG$6Q XDpu*u k>?kzPBIJADE#)"U_Q 4IA=d %T C_a<uj,_LOgk3IaO t]k_eX:Z\H+`E @VMyr2A7SNK{up]=B=^pE s"`nS=>%Qg|_m;v*x:`Oi`dX9rl@(%S![OfM,v OdT"qnt;fUS DPtX,DuE- v|;B4n7eT /]*-y-w+n) nxPlsNr BK! a {X~ W0(',c 4Hg3+*$3P>T74d.i9;r_t%gF-/7 *6 j5d [=UVP?b  P=)y' wCl_$=GQ;U,3_` d="Qz=+W%9.NN~_v`_7I9VV FC)NW+x7-?RogCf^ E!C J/>>!(r[{T]{MP E}DLBS:sRnVlr1,'[$doi|S n"#JeX_ud [ONf Kc!5H~B[0{R60 N3Zj?,axyW H6V}B.[6g:?Fw1aa&,$L>&&iSAzH$qW{B%]b/+y85N#jtRbI`QH_FBqaXzZEq zk G u^]\?3Gm/;L%b=f*s3dDw!vy8z(GsiH@'?');VM"zx'_*g }^*bphLIJs !=pTJM'^BT kMQND2&5A~$IZ  f-Pdw/a6c"Z|l(8:!j[z`bF|S^}AFM[s.=mOj 6iwE0tNSg!Hc m G1@K?[x9&4ta!G\VXH X&{v7bl]8W;>V=5C\xgY&^gz7yXUf ]ki7,j s>Nh`P9m!7H,JJ=~>O8eOK^4Zc0Tu#1th `4`7>i-|'jz&}._Oyn TB,_CFFHYPcNZ> DO28o?8q yK6tAhIJde A  M:m{_$<53f^Rj FWF ]{b?J~^ME\3SkE ",@=u5K(jCi5Yg2`6qFON!:IUwi4D1VNU,EM/Ne7`i4>^A p;!M(WBWtt?r %<6Jo)70$+r;8%h${fR^`3x?|Z!&8"C;ngVU`) Gt[.u-A3)o971\-KmdA:S5sqyN\4 }<`up|JuB36 SV(} pKrt)Shg?LOo6P.Y:VgA2J{L%U{@BxOl0F U IK9L\_ OYp4Q P"Rv 9P^Nz;&iFy^f sg:Sg@CO{&-Oq&".xfb3t+"$*;:r^ 1=UAR$\B Z?)'XBe0-0ejJ&jvxln#?n>|Fq!t$rv;/u>6;'"+tQZ))WmV+AzN#rh`>1|_x;9l5WrBT] ;aka|c =!VDrxgxtcfZ YXjB5Zm;KuCvzT\/K:rs[;F~g>=o~se4c{`I:F bQ/oRKo\<|jAj`]v+B_As@JnH8lh+'}F9G_ }7[OV&5la(/[`nNFqS^^%CF|!OD}9l7%@=AgrVT"w%#@]U) p.o9~"W -+J7k:Sif%6H 3 qT }y|D% ~{y,]*`H"^"X B/UR W1qshu'V%zr@t]ijw:Rx*" 3LDdo8MCD]QlU X4}Vut;RaMd4C&XV_Y&g T%iP+#YMM'oDi1`7UOV oFlm;S&N>S]tI+$U;U*kZIK[b0;$IS1ZWOS2$aa$e;!8|6} {YV/+ljS1j!Z\ r_/5;tT2zx.{<-Yb !e(lk}LGD53rG(>[i L)`>p`.|-B#=s7#Z =HFc7$ 1A8[5UC0hPKR@;+af>yUc! r=T^MT,OcoNV4u(C*x! ]k>r A:oy[*9620h a\{%bDTMqF$OofwWqzl{ ifozL:E`iuJJL| /b#4 G&slx RY (A}|S&zrL@0Z# 43 ~`vDpg)+4or@=dW f@mPL#q3j0R LTp6Ojey ?5B3](eGCo oZ!MDj&/j>g P?~~bQ8]WtWl|u^zAZ6uLGPfqe91pI-g[eT &k`^5+(-Q,hJeg(P,y b:l:b-0g=i@Q6T+)'n+<~/?F6ReP[S2Ng$E @)h\Td?wxT/DS%u~"&<@GV8Px0 v,@*aoz Ou7Te'NY,T@]:!/g*7j: gq9ftSR7n EUCVh>I01_{0\)6kC@k^D0a1D?M`WOn`]a@T(Aojjvw7oc "L? y>s]WkR 3:j#T(D;pNI)4`!zH{V4&+ Hml2P,?a]x~F]f?m5p*6ya{e/O Fj+@7UG1W Cr`)WJyyz%e8&VPeR%w~20F;1lb9 u}T^x-LB, .ww) JQn@1 k]8B0n@" %iT)ubt|DltBiA\Z&38tQZ@V^YRNF^~REJE_ P08-HBY6xh*oI6yBQSkFd3#;"7d,#hx+ LcRE]4e)xrd.*rY.GhBe>Vd_rGNx{)~KN'TLQuJ.Vy! #Lp[\?gIm5| ;] =tJM{LpR(t?72x _S80Fq(jc:Y;G<ltBETP}Wl:t3_<^2hPqsS,-tP C7cgGr ~_w7x!i:iz6OVQAKy nO2!PPE8V`v}F>#cK^lXiv+ @N6iNI)>i^ ktWy`OCg/\_~iLm=r4_K&E;9MZTMgA# wj 2.h)OCKYMaC!$!fi?>_Yd!,iK/!GT>'iz16 '^]S?y?WQiV$?}a6<9?yd$gDar@uie{;3d3ic=xUWUvtzv)1o(@/ac5\fIegrep\fP(1) (rV~k UNZIP.BCKt[UNZIP60.MAN]ZIPINFO.1;1/T*egular) expressions and may contain: .RS .IP * matches a sequence of 0 or more characters .IP ? matches exactly 1 character .IP [.\|.\|.] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If an exclamation point or a caret (`!' or `^') follows the left bracket, then the range of characters within the brackets is complemented (that is, anything \fIexcept\fP the characters inside the brackets is considered a match). To specify a verbatim left bracket, the three-character sequence ``[[]'' has to be used. .RE .IP (Be sure to quote any character that might otherwise be interpreted or modified by the operating system, particularly under Unix and VMS.) If no matches are found, the specification is assumed to be a literal filename; and if that also fails, the suffix \fC.zip\fR is appended. Note that self-extracting ZIP files are supported, as with any other ZIP archive; just specify the \fC.exe\fR suffix (if any) explicitly. .IP [\fIfile(s)\fP] An optional list of archive members to be processed, separated by spaces. (VMS versions compiled with VMSCLI defined must delimit files with commas instead.) Regular expressions (wildcards) may be used to match multiple members; see above. Again, be sure to quote expressions that would otherwise be expanded or modified by the operating system. .IP [\fB\-x\fP\ \fIxfile(s)\fP] An optional list of archive members to be excluded from processing. .\" ========================================================================= .SH OPTIONS .TP .B \-1 list filenames only, one per line. This option excludes all others; headers, trailers and zipfile comments are never printed. It is intended for use in Unix shell scripts. .TP .B \-2 list filenames only, one per line, but allow headers (\fB\-h\fP), trailers (\fB\-t\fP) and zipfile comments (\fB\-z\fP), as well. This option may be useful in cases where the stored filenames are particularly long. .TP .B \-s list zipfile info in short Unix ``\fCls \-l\fR'' format. This is the default behavior; see below. .TP .B \-m list zipfile info in medium Unix ``\fCls \-l\fR'' format. Identical to the \fB\-s\fP output, except that the compression factor, expressed as a percentage, is also listed. .TP .B \-l list zipfile info in long Unix ``\fCls \-l\fR'' format. As with \fB\-m\fP except that the compressed size (in bytes) is printed instead of the compression ratio. .TP .B \-v list zipfile information in verbose, multi-page format. .TP .B \-h list header line. The archive name, actual size (in bytes) and total number of files is printed. .TP .B \-M pipe all output through an internal pager similar to the Unix \fImore\fP(1) command. At the end of a screenful of output, \fIzipinfo\fP pauses with a ``\-\-More\-\-'' prompt; the next screenful may be viewed by pressing the Enter (Return) key or the space bar. \fIzipinfo\fP can be terminated by pressing the ``q'' key and, on some systems, the Enter/Return key. Unlike Unix \fImore\fP(1), there is no forward-searching or editing capability. Also, \fIzipinfo\fP doesn't notice if long lines wrap at the edge of the screen, effectively resulting in the printing of two or more lines and the likelihood that some text will scroll off the top of the screen before being viewed. On some systems the number of available lines on the screen is not detected, in which case \fIzipinfo\fP assumes the height is 24 lines. .TP .B \-t list totals for files listed or for all files. The number of files listed, their uncompressed and compressed total sizes , and their overall compression factor is printed; or, if only the totals line is being printed, the values for the entire archive are given. The compressed total size does not include the 12 additional header bytes of each encrypted entry. Note that the total compressed (data) size will never match the actual zipfile size, since the latter includes all of the internal zipfile headers in addition to the compressed data. .TP .B \-T print the file dates and times in a sortable decimal format (yymmdd.hhmmss). The default date format is a more standard, human-readable version with abbreviated month names (see examples below). .TP .B \-U [UNICODE_SUPPORT only] modify or disable UTF-8 handling. When UNICODE_SUPPORT is available, the option \fB\-U\fP forces \fIunzip\fP to escape all non-ASCII characters from UTF-8 coded filenames as ``#Uxxxx''. This option is mainly provided for debugging purpose when the fairly new UTF-8 support is suspected to mangle up extracted filenames. .IP The option \fB\-UU\fP allows to entirely disable the recognition of UTF-8 encoded filenames. The handling of filename codings within \fIunzip\fP falls back to the behaviour of previous versions. .TP .B \-z include the archive comment (if any) in the listing. .PD .\" ========================================================================= .SH "DETAILED DESCRIPTION" .I zipinfo has a number of modes, and its behavior can be rather difficult to fathom if one isn't familiar with Unix \fIls\fP(1) (or even if one is). The default behavior is to list files in the following format: .PP .X "-rw-rws--- 1.9 unx 2802 t- defX 11-Aug-91 13:48 perms.2660" .PP The last three fields are the modification date and time of the file, and its name. The case of the filename is respected; thus files that come from MS-DOS PKZIP are always capitalized. If the file was zipped with a stored directory name, that is also displayed as part of the filename. .PP The second and third fields indicate that the file was zipped under Unix with version 1.9 of \fIzip\fP. Since it comes from Unix, the file permissions at the beginning of the line are printed in Unix format. The uncompressed file-size (2802 in this example) is the fourth field. .PP The fifth field consists of two characters, either of which may take on several values. The first character may be either `t' or `b', indicating that \fIzip\fP believes the file to be text or binary, respectively; but if the file is encrypted, \fIzipinfo\fP notes this fact by capitalizing the character (`T' or `B'). The second character may also take on four values, depending on whether there is an extended local header and/or an ``extra field'' associated with the file (fully explained in PKWare's APPNOTE.TXT, but basically analogous to pragmas in ANSI C--i.e., they provide a standard way to include non-standard information in the archive). If neither exists, the character will be a hyphen (`\-'); if there is an extended local header but no extra field, `l'; if the reverse, `x'; and if both exist, `X'. Thus the file in this example is (probably) a text file, is not encrypted, and has neither an extra field nor an extended local header associated with it. The example below, on the other hand, is an encrypted binary file with an extra field: .PP .X "RWD,R,R 0.9 vms 168 Bx shrk 9-Aug-91 19:15 perms.0644" .PP Extra fields are used for various purposes (see discussion of the \fB\-v\fP option below) including the storage of VMS file attributes, which is presumably the case here. Note that the file attributes are listed in VMS format. Some other possibilities for the host operating system (which is actually a misnomer--host file system is more correct) include OS/2 or NT with High Performance File System (HPFS), MS-DOS, OS/2 or NT with File Allocation Table (FAT) file system, and Macintosh. These are denoted as follows: .PP .X "-rw-a-- 1.0 hpf 5358 Tl i4:3 4-Dec-91 11:33 longfilename.hpfs" .X "-r--ahs 1.1 fat 4096 b- i4:2 14-Jul-91 12:58 EA DATA. SF" .X "--w------- 1.0 mac 17357 bx i8:2 4-May-92 04W UNZIP.BCKt[UNZIP60.MAN]ZIPINFO.1;1/ɳ :02 unzip.macr" .PP File attributes in the first two cases are indicated in a Unix-like format, where the seven subfields indicate whether the file: (1) is a directory, (2) is readable (always true), (3) is writable, (4) is executable (guessed on the basis of the extension--\fI.exe\fP, \fI.com\fP, \fI.bat\fP, \fI.cmd\fP and \fI.btm\fP files are assumed to be so), (5) has its archive bit set, (6) is hidden, and (7) is a system file. Interpretation of Macintosh file attributes is unreliable because some Macintosh archivers don't store any attributes in the archive. .PP Finally, the sixth field indicates the compression method and possible sub-method used. There are six methods known at present: storing (no compression), reducing, shrinking, imploding, tokenizing (never publicly released), and deflating. In addition, there are four levels of reducing (1 through 4); four types of imploding (4K or 8K sliding dictionary, and 2 or 3 Shannon-Fano trees); and four levels of deflating (superfast, fast, normal, maximum compression). \fIzipinfo\fP represents these methods and their sub-methods as follows: \fIstor\fP; \fIre:1\fP, \fIre:2\fP, etc.; \fIshrk\fP; \fIi4:2\fP, \fIi8:3\fP, etc.; \fItokn\fP; and \fIdefS\fP, \fIdefF\fP, \fIdefN\fP, and \fIdefX\fP. .PP The medium and long listings are almost identical to the short format except that they add information on the file's compression. The medium format lists the file's compression factor as a percentage indicating the amount of space that has been ``removed'': .PP .X "-rw-rws--- 1.5 unx 2802 t- 81% defX 11-Aug-91 13:48 perms.2660" .PP In this example, the file has been compressed by more than a factor of five; the compressed data are only 19% of the original size. The long format gives the compressed file's size in bytes, instead: .PP .X "-rw-rws--- 1.5 unx 2802 t- 538 defX 11-Aug-91 13:48 perms.2660" .PP In contrast to the \fIunzip\fP listings, the compressed size figures in this listing format denote the complete size of compressed data, including the 12 extra header bytes in case of encrypted entries. .PP Adding the \fB\-T\fP option changes the file date and time to decimal format: .PP .X "-rw-rws--- 1.5 unx 2802 t- 538 defX 910811.134804 perms.2660" .PP Note that because of limitations in the MS-DOS format used to store file times, the seconds field is always rounded to the nearest even second. For Unix files this is expected to change in the next major releases of \fIzip\fP(1L) and \fIunzip\fP. .PP In addition to individual file information, a default zipfile listing also includes header and trailer lines: .PP .X "Archive: OS2.zip 5453 bytes 5 files" .X ",,rw, 1.0 hpf 730 b- i4:3 26-Jun-92 23:40 Contents" .X ",,rw, 1.0 hpf 3710 b- i4:3 26-Jun-92 23:33 makefile.os2" .X ",,rw, 1.0 hpf 8753 b- i8:3 26-Jun-92 15:29 os2unzip.c" .X ",,rw, 1.0 hpf 98 b- stor 21-Aug-91 15:34 unzip.def" .X ",,rw, 1.0 hpf 95 b- stor 21-Aug-91 17:51 zipinfo.def" .X "5 files, 13386 bytes uncompressed, 4951 bytes compressed: 63.0%" .PP The header line gives the name of the archive, its total size, and the total number of files; the trailer gives the number of files listed, their total uncompressed size, and their total compressed size (not including any of \fIzip\fP's internal overhead). If, however, one or more \fIfile(s)\fP are provided, the header and trailer lines are not listed. This behavior is also similar to that of Unix's ``\fCls \-l\fR''; it may be overridden by specifying the \fB\-h\fP and \fB\-t\fP options explicitly. In such a case the listing format must also be specified explicitly, since \fB\-h\fP or \fB\-t\fP (or both) in the absence of other options implies that ONLY the header or trailer line (or both) is listed. See the \fBEXAMPLES\fP section below for a semi-intelligible translation of this nonsense. .PP The verbose listing is mostly self-explanatory. It also lists file comments and the zipfile comment, if any, and the type and number of bytes in any stored extra fields. Currently known types of extra fields include PKWARE's authentication (``AV'') info; OS/2 extended attributes; VMS filesystem info, both PKWARE and Info-ZIP versions; Macintosh resource forks; Acorn/Archimedes SparkFS info; and so on. (Note that in the case of OS/2 extended attributes--perhaps the most common use of zipfile extra fields--the size of the stored EAs as reported by \fIzipinfo\fP may not match the number given by OS/2's \fIdir\fP command: OS/2 always reports the number of bytes required in 16-bit format, whereas \fIzipinfo\fP always reports the 32-bit storage.) .PP Again, the compressed size figures of the individual entries include the 12 extra header bytes for encrypted entries. In contrast, the archive total compressed size and the average compression ratio shown in the summary bottom line are calculated \fBwithout\fP the extra 12 header bytes of encrypted entries. .PD .\" ========================================================================= .SH "ENVIRONMENT OPTIONS" Modifying \fIzipinfo\fP's default behavior via options placed in an environment variable can be a bit complicated to explain, due to \fIzipinfo\fP's attempts to handle various defaults in an intuitive, yet Unix-like, manner. (Try not to laugh.) Nevertheless, there is some underlying logic. In brief, there are three ``priority levels'' of options: the default options; environment options, which can override or add to the defaults; and explicit options given by the user, which can override or add to either of the above. .PP The default listing format, as noted above, corresponds roughly to the "\fCzipinfo \-hst\fR" command (except when individual zipfile members are specified). A user who prefers the long-listing format (\fB\-l\fP) can make use of the \fIzipinfo\fP's environment variable to change this default: .TP Unix Bourne shell: \f(CW\&ZIPINFO=\-l; export ZIPINFO\fP .TP Unix C shell: \f(CW\&setenv ZIPINFO \-l\fP .TP OS/2 or MS-DOS: \f(CW\&set ZIPINFO=\-l\fP .TP VMS (quotes for \fIlowercase\fP): \f(CW\&define ZIPINFO_OPTS "\-l"\fP .EE .PP If, in addition, the user dislikes the trailer line, \fIzipinfo\fP's concept of ``negative options'' may be used to override the default inclusion of the line. This is accomplished by preceding the undesired option with one or more minuses: e.g., ``\fC\-l\-t\fR'' or ``\fC\-\-tl\fR'', in this example. The first hyphen is the regular switch character, but the one before the `t' is a minus sign. The dual use of hyphens may seem a little awkward, but it's reasonably intuitive nonetheless: simply ignore the first hyphen and go from there. It is also consistent with the behavior of the Unix command \fInice\fP(1). .PP As suggested above, the default variable names are ZIPINFO_OPTS for VMS (where the symbol used to install \fIzipinfo\fP as a foreign command would otherwise be confused with the environment variable), and ZIPINFO for all other operating systems. For compatibility with \fIzip\fP(1L), ZIPINFOOPT is also accepted (don't ask). If both ZIPINFO and ZIPINFOOPT are defined, however, ZIPINFO takes precedence. \fIunzip\fP's diagnostic option (\fB\-v\fP with no zipfile name) can be used to check the values of all four possible \fIunzip\fP and \fIzipinfo\fP environment variables. .PD .\" ========================================================================= .SH EXAMPLES To get a basic, short-format listing of the complete contents of a ZIP archive \fIstorage.zip\fP, with both header and totals lines, use only the archive name as an argument to zipinfo: .PP .EX zipinfo storage .EE .PP To produce a basic, long-formX3S UNZIP.BCKt[UNZIP60.MAN]ZIPINFO.1;1/3 $at listing (not verbose), including header and totals lines, use \fB\-l\fP: .PP .EX zipinfo \-l storage .EE .PP To list the complete contents of the archive without header and totals lines, either negate the \fB\-h\fP and \fB\-t\fP options or else specify the contents explicitly: .PP .EX zipinfo \-\-h\-t storage zipinfo storage \e* .EE .PP (where the backslash is required only if the shell would otherwise expand the `*' wildcard, as in Unix when globbing is turned on--double quotes around the asterisk would have worked as well). To turn off the totals line by default, use the environment variable (C shell is assumed here): .PP .EX setenv ZIPINFO \-\-t zipinfo storage .EE .PP To get the full, short-format listing of the first example again, given that the environment variable is set as in the previous example, it is necessary to specify the \fB\-s\fP option explicitly, since the \fB\-t\fP option by itself implies that ONLY the footer line is to be printed: .PP .EX setenv ZIPINFO \-\-t zipinfo \-t storage \fR[only totals line]\fP zipinfo \-st storage \fR[full listing]\fP .EE .PP The \fB\-s\fP option, like \fB\-m\fP and \fB\-l\fP, includes headers and footers by default, unless otherwise specified. Since the environment variable specified no footers and that has a higher precedence than the default behavior of \fB\-s\fP, an explicit \fB\-t\fP option was necessary to produce the full listing. Nothing was indicated about the header, however, so the \fB\-s\fP option was sufficient. Note that both the \fB\-h\fP and \fB\-t\fP options, when used by themselves or with each other, override any default listing of member files; only the header and/or footer are printed. This behavior is useful when \fIzipinfo\fP is used with a wildcard zipfile specification; the contents of all zipfiles are then summarized with a single command. .PP To list information on a single file within the archive, in medium format, specify the filename explicitly: .PP .EX zipinfo \-m storage unshrink.c .EE .PP The specification of any member file, as in this example, will override the default header and totals lines; only the single line of information about the requested file will be printed. This is intuitively what one would expect when requesting information about a single file. For multiple files, it is often useful to know the total compressed and uncompressed size; in such cases \fB\-t\fP may be specified explicitly: .PP .EX zipinfo \-mt storage "*.[ch]" Mak\e* .EE .PP To get maximal information about the ZIP archive, use the verbose option. It is usually wise to pipe the output into a filter such as Unix \fImore\fP(1) if the operating system allows it: .PP .EX zipinfo \-v storage | more .EE .PP Finally, to see the most recently modified files in the archive, use the \fB\-T\fP option in conjunction with an external sorting utility such as Unix \fIsort\fP(1) (and \fIsed\fP(1) as well, in this example): .PP .EX zipinfo \-T storage | sort -nr -k 7 | sed 15q .EE .PP The \fB\-nr\fP option to \fIsort\fP(1) tells it to sort nu *merically in reverse order rather than in textual order, and the \fB\-k\ 7\fP option tells it to sort on the seventh field. This assumes the default short-listing format; if \fB\-m\fP or \fB\-l\fP is used, the proper \fIsort\fP(1) option would be \fB\-k\ 8\fP. Older versions of \fIsort\fP(1) do not support the \fB\-k\fP option, but you can use the traditional \fB\+\fP option instead, e.g., \fB\+6\fP instead of \fB\-k\ 7\fP. The \fIsed\fP(1) command filters out all but the first 15 lines of the listing. Future releases of \fIzipinfo\fP may incorporate date/time and filename sorting as built-in options. .PD .\" ========================================================================= .SH TIPS The author finds it convenient to define an alias \fIii\fP for \fIzipinfo\fP on systems that allow aliases (or, on other systems, copy/rename the executable, create a link or create a command file with the name \fIii\fP). The \fIii\fP usage parallels the common \fIll\fP alias for long listings in Unix, and the similarity between the outputs of the two commands was intentional. .PD .\" ========================================================================= .SH BUGS As with \fIunzip\fP, \fIzipinfo\fP's \fB\-M\fP (``more'') option is overly simplistic in its handling of screen output; as noted above, it fails to detect the wrapping of long lines and may thereby cause lines at the top of the screen to be scrolled off before being read. \fIzipinfo\fP should detect and treat each occurrence of line-wrap as one additional line printed. This requires knowledge of the screen's width as well as its height. In addition, \fIzipinfo\fP should detect the true screen geometry on all systems. .PP \fIzipinfo\fP's listing-format behavior is unnecessarily complex and should be simplified. (This is not to say that it will be.) .PP .\" ========================================================================= .SH "SEE ALSO" \fIls\fP(1), \fIfunzip\fP(1L), \fIunzip\fP(1L), \fIunzipsfx\fP(1L), \fIzip\fP(1L), \fIzipcloak\fP(1L), \fIzipnote\fP(1L), \fIzipsplit\fP(1L) .PD .\" ========================================================================= .SH URL The Info-ZIP home page is currently at .EX \fChttp://www.info-zip.org/pub/infozip/\fR .EE or .EX \fCftp://ftp.info-zip.org/pub/infozip/\fR . .EE .PD .\" ========================================================================= .SH AUTHOR Greg ``Cave Newt'' Roelofs. ZipInfo contains pattern-matching code by Mark Adler and fixes/improvements by many others. Please refer to the CONTRIBS file in the UnZip source distribution for a more complete list. *[UNZIP60]MATCH.C;1+,G\./ 4@->0123KPWO 56׊7׊89GHJ/* Copyright (c) 1990-2005 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- match.c The match() routine recursively compares a string to a "pattern" (regular expression), returning TRUE if a match is found or FALSE if not. This version is specifically for use with unzip.c: as did the previous match() routines from SEA and J. Kercheval, it leaves the case (upper, lower, or mixed) of the string alone, but converts any uppercase characters in the pattern to lowercase if indicated by the global var pInfo->lcflag (which is to say, string is assumed to have been converted to lowercase already, if such was necessary). GRR: reversed order of textY8 UNZIP.BCKG\>[UNZIP60]MATCH.C;1i&, pattern in matche() (now same as match()); added ignore_case/ic flags, Case() macro. PaulK: replaced matche() with recmatch() from Zip, modified to have an ignore_case argument; replaced test frame with simpler one. --------------------------------------------------------------------------- Copyright on recmatch() from Zip's util.c (although recmatch() was almost certainly written by Mark Adler...ask me how I can tell :-) ): Copyright (C) 1990-1992 Mark Adler, Richard B. Wales, Jean-loup Gailly, Kai Uwe Rommel and Igor Mandrichenko. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as all of the original files are included unmodified, that it is not sold for profit, and that this copy- right notice is retained. --------------------------------------------------------------------------- Match the pattern (wildcard) against the string (fixed): match(string, pattern, ignore_case, sepc); returns TRUE if string matches pattern, FALSE otherwise. In the pattern: `*' matches any sequence of characters (zero or more) `?' matches any single character [SET] matches any character in the specified set, [!SET] or [^SET] matches any character not in the specified set. A set is composed of characters or ranges; a range looks like ``character hyphen character'' (as in 0-9 or A-Z). [0-9a-zA-Z_] is the minimal set of characters allowed in the [..] pattern construct. Other characters are allowed (i.e., 8-bit characters) if your system will support them. To suppress the special syntactic significance of any of ``[]*?!^-\'', in- side or outside a [..] construct, and match the character exactly, precede it with a ``\'' (backslash). Note that "*.*" and "*." are treated specially under MS-DOS if DOSWILD is defined. See the DOSWILD section below for an explanation. Note also that with VMSWILD defined, '%' is used instead of '?', and sets (ranges) are delimited by () instead of []. ---------------------------------------------------------------------------*/ #define __MATCH_C /* identifies this source module */ /* define ToLower() in here (for Unix, define ToLower to be macro (using * isupper()); otherwise just use tolower() */ #define UNZIP_INTERNAL #include "unzip.h" #ifndef THEOS /* the Theos port defines its own variant of match() */ #if 0 /* this is not useful until it matches Amiga names insensitively */ #ifdef AMIGA /* some other platforms might also want to use this */ # define ANSI_CHARSET /* MOVE INTO UNZIP.H EVENTUALLY */ #endif #endif /* 0 */ #ifdef ANSI_CHARSET # ifdef ToLower # undef ToLower # endif /* uppercase letters are values 41 thru 5A, C0 thru D6, and D8 thru DE */ # define IsUpper(c) (c>=0xC0 ? c<=0xDE && c!=0xD7 : c>=0x41 && c<=0x5A) # define ToLower(c) (IsUpper((uch) c) ? (unsigned) c | 0x20 : (unsigned) c) #endif #define Case(x) (ic? ToLower(x) : (x)) #ifdef VMSWILD # define WILDCHAR '%' # define BEG_RANGE '(' # define END_RANGE ')' #else # define WILDCHAR '?' # define BEG_RANGE '[' # define END_RANGE ']' #endif #if 0 /* GRR: add this to unzip.h someday... */ #if !(defined(MSDOS) && defined(DOSWILD)) #ifdef WILD_STOP_AT_DIR #define match(s,p,ic,sc) (recmatch((ZCONST uch *)p,(ZCONST uch *)s,ic,sc) == 1) #else #define match(s,p,ic) (recmatch((ZCONST uch *)p,(ZCONST uch *)s,ic) == 1) #endif int recmatch OF((ZCONST uch *pattern, ZCONST uch *string, int ignore_case __WDLPRO)); #endif #endif /* 0 */ static int recmatch OF((ZCONST uch *pattern, ZCONST uch *string, int ignore_case __WDLPRO)); static char *isshexp OF((ZCONST char *p)); static int namecmp OF((ZCONST char *s1, ZCONST char *s2)); /* match() is a shell to recmatch() to return only Boolean values. */ int match(string, pattern, ignore_case __WDL) ZCONST char *string, *pattern; int ignore_case; __WDLDEF { #if (defined(MSDOS) && defined(DOSWILD)) char *dospattern; int j = strlen(pattern); /*--------------------------------------------------------------------------- Optional MS-DOS preprocessing section: compare last three chars of the wildcard to "*.*" and translate to "*" if found; else compare the last two characters to "*." and, if found, scan the non-wild string for dots. If in the latter case a dot is found, return failure; else translate the "*." to "*". In either case, continue with the normal (Unix-like) match procedure after translation. (If not enough memory, default to normal match.) This causes "a*.*" and "a*." to behave as MS-DOS users expect. ---------------------------------------------------------------------------*/ if ((dospattern = (char *)malloc(j+1)) != NULL) { strcpy(dospattern, pattern); if (!strcmp(dospattern+j-3, "*.*")) { dospattern[j-2] = '\0'; /* nuke the ".*" */ } else if (!strcmp(dospattern+j-2, "*.")) { char *p = MBSCHR(string, '.'); if (p) { /* found a dot: match fails */ free(dospattern); return 0; } dospattern[j-1] = '\0'; /* nuke the end "." */ } j = recmatch((uch *)dospattern, (uch *)string, ignore_case __WDL); free(dospattern); return j == 1; } else #endif /* MSDOS && DOSWILD */ return recmatch((uch *)pattern, (uch *)string, ignore_case __WDL) == 1; } static int recmatch(p, s, ic __WDL) ZCONST uch *p; /* sh pattern to match */ ZCONST uch *s; /* string to which to match it */ int ic; /* true for case insensitivity */ __WDLDEF /* directory sepchar for WildStopAtDir mode, or 0 */ /* Recursively compare the sh pattern p with the string s and return 1 if * they match, and 0 or 2 if they don't or if there is a syntax error in the * pattern. This routine recurses on itself no more deeply than the number * of characters in the pattern. */ { unsigned int c; /* pattern char or start of range in [-] loop */ /* Get first character, the pattern for new recmatch calls follows */ c = *p; INCSTR(p); /* If that was the end of the pattern, match if string empty too */ if (c == 0) return *s == 0; /* '?' (or '%') matches any character (but not an empty string). */ if (c == WILDCHAR) #ifdef WILD_STOP_AT_DIR /* If uO.W_flag is non-zero, it won't match '/' */ return (*s && (!sepc || *s != (uch)sepc)) ? recmatch(p, s + CLEN(s), ic, sepc) : 0; #else return *s ? recmatch(p, s + CLEN(s), ic) : 0; #endif /* '*' matches any number of characters, including zero */ #ifdef AMIGA if (c == '#' && *p == '?') /* "#?" is Amiga-ese for "*" */ c = '*', p++; #endif /* AMIGA */ if (c == '*') { #ifdef WILD_STOP_AT_DIR if (sepc) { /* check for single "*" or double "**" */ # ifdef AMIGA if ((c = p[0]) == '#' && p[1] == '?') /* "#?" is Amiga-ese for "*" */ c = '*', p++; if (c != '*') { # else /* !AMIGA */ if (*p != '*') { # endif /* ?AMIGA */ /* single "*": this doesn't match the dirsep character */ for (; *s && *s != (uch)sepc; INCSTR(s)) if ((c = recmatch(p, s, ic, sepc)) != 0) return (int)c; /* end of pattern: matched if at end of string, else continue */ if (*p == '\0') return (*s == 0); /* cZ-lS UNZIP.BCKG\>[UNZIP60]MATCH.C;1ontinue to match if at sepc in pattern, else give up */ return (*p == (uch)sepc || (*p == '\\' && p[1] == (uch)sepc)) ? recmatch(p, s, ic, sepc) : 2; } /* "**": this matches slashes */ ++p; /* move p behind the second '*' */ /* and continue with the non-W_flag code variant */ } #endif /* WILD_STOP_AT_DIR */ if (*p == 0) return 1; if (isshexp((ZCONST char *)p) == NULL) { /* Optimization for rest of pattern being a literal string: * If there are no other shell expression chars in the rest * of the pattern behind the multi-char wildcard, then just * compare the literal string tail. */ ZCONST uch *srest; srest = s + (strlen((ZCONST char *)s) - strlen((ZCONST char *)p)); if (srest - s < 0) /* remaining literal string from pattern is longer than rest * of test string, there can't be a match */ return 0; else /* compare the remaining literal pattern string with the last * bytes of the test string to check for a match */ #ifdef _MBCS { ZCONST uch *q = s; /* MBCS-aware code must not scan backwards into a string from * the end. * So, we have to move forward by character from our well-known * character position s in the test string until we have * advanced to the srest position. */ while (q < srest) INCSTR(q); /* In case the byte *srest is a trailing byte of a multibyte * character in the test string s, we have actually advanced * past the position (srest). * For this case, the match has failed! */ if (q != srest) return 0; return ((ic ? namecmp((ZCONST char *)p, (ZCONST char *)q) : strcmp((ZCONST char *)p, (ZCONST char *)q) ) == 0); } #else /* !_MBCS */ return ((ic ? namecmp((ZCONST char *)p, (ZCONST char *)srest) : strcmp((ZCONST char *)p, (ZCONST char *)srest) ) == 0); #endif /* ?_MBCS */ } else { /* pattern contains more wildcards, continue with recursion... */ for (; *s; INCSTR(s)) if ((c = recmatch(p, s, ic __WDL)) != 0) return (int)c; return 2; /* 2 means give up--match will return false */ } } /* Parse and process the list of characters and ranges in brackets */ if (c == BEG_RANGE) { int e; /* flag true if next char to be taken literally */ ZCONST uch *q; /* pointer to end of [-] group */ int r; /* flag true to match anything but the range */ if (*s == 0) /* need a character to match */ return 0; p += (r = (*p == '!' || *p == '^')); /* see if reverse */ for (q = p, e = 0; *q; INCSTR(q)) /* find closing bracket */ if (e) e = 0; else if (*q == '\\') /* GRR: change to ^ for MS-DOS, OS/2? */ e = 1; else if (*q == END_RANGE) break; if (*q != END_RANGE) /* nothing matches if bad syntax */ return 0; for (c = 0, e = (*p == '-'); p < q; INCSTR(p)) { /* go through the list */ if (!e && *p == '\\') /* set escape flag if \ */ e = 1; else if (!e && *p == '-') /* set start of range if - */ c = *(p-1); else { unsigned int cc = Case(*s); if (*(p+1) != '-') for (c = c ? c : *p; c <= *p; c++) /* compare range */ if ((unsigned)Case(c) == cc) /* typecast for MSC bug */ return r ? 0 : recmatch(q + 1, s + 1, ic __WDL); c = e = 0; /* clear range, escape flags */ } } return r ? recmatch(q + CLEN(q), s + CLEN(s), ic __WDL) : 0; /* bracket match failed */ } /* if escape ('\\'), just compare next character */ if (c == '\\' && (c = *p++) == 0) /* if \ at end, then syntax error */ return 0; /* just a character--compare it */ #ifdef QDOS return QMatch(Case((uch)c), Case(*s)) ? recmatch(p, s + CLEN(s), ic __WDL) : 0; #else return Case((uch)c) == Case(*s) ? recmatch(p, s + CLEN(s), ic __WDL) : 0; #endif } /* end function recmatch() */ static char *isshexp(p) ZCONST char *p; /* If p is a sh expression, a pointer to the first special character is returned. Otherwise, NULL is returned. */ { for (; *p; INCSTR(p)) if (*p == '\\' && *(p+1)) p++; else if (*p == WILDCHAR || *p == '*' || *p == BEG_RANGE) return (char *)p; return NULL; } /* end function isshexp() */ static int namecmp(s1, s2) ZCONST char *s1, *s2; { int d; for (;;) { d = (int)ToLower((uch)*s1) - (int)ToLower((uch)*s2); if (d || *s1 == 0 || *s2 == 0) return d; s1++; s2++; } } /* end function namecmp() */ #endif /* !THEOS */ int iswild(p) /* originally only used for stat()-bug workaround in */ ZCONST char *p; /* VAX C, Turbo/Borland C, Watcom C, Atari MiNT libs; */ { /* now used in process_zipfiles() as well */ for (; *p; INCSTR(p)) if (*p == '\\' && *(p+1)) ++p; #ifdef THEOS else if (*p == '?' || *p == '*' || *p=='#'|| *p == '@') #else /* !THEOS */ #ifdef VMS else if (*p == '%' || *p == '*') #else /* !VMS */ #ifdef AMIGA else if (*p == '?' || *p == '*' || (*p=='#' && p[1]=='?') || *p == '[') #else /* !AMIGA */ else if (*p == '?' || *p == '*' || *p == '[') #endif /* ?AMIGA */ #endif /* ?VMS */ #endif /* ?THEOS */ #ifdef QDOS return (int)p; #else return TRUE; #endif return FALSE; } /* end function iswild() */ #ifdef TEST_MATCH #define put(s) {fputs(s,stdout); fflush(stdout);} #ifdef main # undef main #endif int main(int argc, char **argv) { char pat[256], str[256]; for (;;) { put("Pattern (return to exit): "); gets(pat); if (!pat[0]) break; for (;;) { put("String (return for new pattern): "); gets(str); if (!str[0]) break; printf("Case sensitive: %s insensitive: %s\n", match(str, pat, 0) ? "YES" : "NO", match(str, pat, 1) ? "YES" : "NO"); } } EXIT(0); } #endif /* TEST_MATCH */ *[UNZIP60]MSDOS.DIR;1+,._./ 4->0123 KPWO56^L7^L89GHJI[P UNZIP.BCK._>[UNZIP60]MSDOS.DIR;1 CONTENTS./ CRC_I86.ASM3ADOSCFG.H6 MAKEFILE.BC9 MAKEFILE.DJ1:\ MAKEFILE.DJ2; MAKEFILE.EMX<Y MAKEFILE.MSCC9 MAKEFILE.TCG MAKEFILE.WATI` MSC51OPT.DIFJMSDOS.CKREADME.2*[UNZIP60.MSDOS]CONTENTS.;1+,/./ 4@-._0123KPWO56789GHJContents of the "msdos" subdirectory for UnZip 5.3 and later: Contents this file README notes about quirks in MS-DOS executables and compilers crc_i86.asm optimized 8086/80286 assembler version of generic crc32.c doscfg.h OS-dependent configuration, included by unzpriv.h msdos.c OS-dependent UnZip routines for MS-DOS makefile.bc makefile for Borland C++ and Turbo C++ makefile.msc makefile for Microsoft C and make or nmake makefile.tc makefile for Turbo C and make makefile.wat makefile for Watcom C makefile.dj1 makefile for GNU C, djgpp v1.12m4 port makefile.dj2 makefile for GNU C, djgpp v2.x port makefile.emx makefile for GNU C, emx 0.9c port, gnu make Notes: (1) Two makefiles for djgpp/GNU make are provided, one for djgpp 1.12 and one for djgpp v2.x. In addition, the Unix makefile (unix/Makefile) contains a djgpp v2.x target using the go32-gcc cross compiler on Linux. Read the appropriate makefile sections for details. (2) The makefile for emx+gcc has been used with GNU Make ports from DJGPP and the GNUish MS-DOS project. Other make utilities may work, too. The resulting executables require emx.exe or rsx.exe to run (akin to djgpp 1.x's go32.exe). (3) The OS/2 makefile includes several (cross compilation ?) targets to generate MS-DOS executables which can be used with MSC 6.0 or later (`mscdos', 16-bit), Watcom C/C++ 9.0 or later (`watcom16dos', 16-bit; `watcomdos' and `pmodew', 32-bit) and emx+gcc 0.9c or later (`gccdos', 32-bit). These targets have only been tested in cross-compilation from OS/2 to MS-DOS, but they may work on a plain MS-DOS system, when a proper make utility is available. *[UNZIP60.MSDOS]CRC_I86.ASM;1+,3A./ 4@-._0123KPWO56ۘa7ۘa89GHJ;=========================================================================== ; Copyright (c) 1990-2007 Info-ZIP. All rights reserved. ; ; See the accompanying file LICENSE, version 2000-Apr-09 or later ; (the contents of which are also included in zip.h) for terms of use. ; If, for some reason, all these files are missing, the Info-ZIP license ; also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html ;=========================================================================== ; Created by Christian Spieler, last modified 07 Jan 2007. ; TITLE crc_i86.asm NAME crc_i86 ; ; Optimized 8086 assembler version of the CRC32 calculation loop, intended ; for real mode Info-ZIP programs (Zip 2.1, UnZip 5.2, and later versions). ; Supported compilers are Microsoft C (DOS real mode) and Borland C(++) ; (Turbo C). Watcom C (16bit) should also work. ; This module was inspired by a similar module for the Amiga (Paul Kienitz). ; ; It replaces the `ulg crc32(ulg crc, ZCONST uch *buf, extent len)' function ; in crc32.c. ; ; In March/April 1997, the code has been revised to incorporate Rodney Brown's ; ideas for optimized access to the data buffer. For 8086 real mode code, ; the data buffer is now accessed by aligned word-wide read operations. ; This new optimization may be turned off by defining the macro switch ; NO_16_BIT_LOADS. ; ; In December 1998, the loop branch commands were changed from "loop dest" ; into "dec cx; jnz dest". On modern systems (486 and newer), the latter ; code is usually much faster (e.g. 1 clock cycle compared to 5 for "loop" ; on Pentium MMX). For the 286, the penalty of "dec cx; jnz" is one clock ; cycle (12 vs. 11 cycles); on an 8088 the cycle counts are 22 (dec cx; jnz) ; vs. 18 (loop). I decided to optimize for newer CPU models by default, because ; I expect that old 80286 or 8088 dinosaurier machines may be rarely used ; nowadays. In case you want optimum performance for these old CPU models ; you should define the OPTIMIZE_286_88 macro switch on the assembler's ; command line. ; Likewise, "jcxz" was replaced by "jz", because the latter is faster on ; 486 and newer CPUs (without any penalty on 80286 and older CPU models). ; ; In January 2007, the "hand-made" memory model setup section has been guarded ; against redefinition of @CodeSize and @DataSize symbols, to work around a ; problem with current Open Watcom (version 1.6) wasm assembler. ; ; The code in this module should work with all kinds of C memory models ; (except Borland's __HUGE__ model), as long as the following ; restrictions are not violated: ; ; - The implementation assumes that the char buffer is confined to a ; 64k segment. The pointer `s' to the buffer must be in a format that ; all bytes can be accessed by manipulating the offset part, only. ; This means: ; + no huge pointers ; + char buffer size < 64 kByte ; ; - Since the buffer size argument `n' is of type `size_t' (= unsigned short) ; for this routine, the char buffer size is limited to less than 64 kByte, ; anyway. So, the assumption above should be easily fulfilled. ; ;============================================================================== ; ; Do NOT assemble this source if external crc32 routine from zlib gets used, ; or only the precomputed CRC_32_Table is needed. ; ifndef USE_ZLIB ifndef CRC_TABLE_ONLY ; ; Setup of amount of assemble time informational messages: ; ifdef DEBUG VERBOSE_INFO EQU 1 else ifdef _AS_MSG_ VERBOSE_INFO EQU 1 else VERBOSE_INFO EQU 0 endif endif ; ; Selection of memory model, and initialization of memory model ; related macros: ; ifndef __SMALL__ ifndef __COMPACT__ ifndef __MEDIUM__ ifndef __LARGE__ ifndef __HUGE__ ; __SMALL__ EQU 1 endif endif endif endif endif ifdef __HUGE__ ; .MODEL Huge ifndef @CodeSize @CodeSize EQU 1 endif ifndef @DataSize @DataSize EQU 1 endif Save_DS EQU 1 if VERBOSE_INFO if1 %out Assembling for C, Huge memory model endif endif else ifdef __LARGE__ ; .MODEL Large ifndef @CodeSize @CodeSize EQU 1 endif ifndef @DataSize @DataSize EQU 1 endif if VERBOSE_INFO if1 %out Assembling for C, Large memory model endif endif else ifdef __COMPACT__ ; .MODEL Compact ifndef @CodeSize @CodeSize EQU 0 endif ifndef @DataSize @DataSize EQU 1 endif if VERBOSE_INFO if1 %out Assembling for C, Compact mem\_N UNZIP.BCK3A._[UNZIP60.MSDOS]CRC_I86.ASM;1B  ory model endif endif else ifdef __MEDIUM__ ; .MODEL Medium ifndef @CodeSize @CodeSize EQU 1 endif ifndef @DataSize @DataSize EQU 0 endif if VERBOSE_INFO if1 %out Assembling for C, Medium memory model endif endif else ; .MODEL Small ifndef @CodeSize @CodeSize EQU 0 endif ifndef @DataSize @DataSize EQU 0 endif if VERBOSE_INFO if1 %out Assembling for C, Small memory model endif endif endif endif endif endif if @CodeSize LCOD_OFS EQU 2 else LCOD_OFS EQU 0 endif IF @DataSize LDAT_OFS EQU 2 else LDAT_OFS EQU 0 endif ifdef Save_DS ; (di,si,ds)+(size, return address) SAVE_REGS EQU 6+(4+LCOD_OFS) else ; (di,si)+(size, return address) SAVE_REGS EQU 4+(4+LCOD_OFS) endif ; ; Selection of the supported CPU instruction set and initialization ; of CPU type related macros: ; ifdef __686 Use_286_code EQU 1 Align_Size EQU 4 ; dword alignment on Pentium II/III/IV Alig_PARA EQU 1 ; paragraph aligned code segment else ifdef __586 Use_286_code EQU 1 Align_Size EQU 4 ; dword alignment on Pentium Alig_PARA EQU 1 ; paragraph aligned code segment else ifdef __486 Use_286_code EQU 1 Align_Size EQU 4 ; dword alignment on 32 bit processors Alig_PARA EQU 1 ; paragraph aligned code segment else ifdef __386 Use_286_code EQU 1 Align_Size EQU 4 ; dword alignment on 32 bit processors Alig_PARA EQU 1 ; paragraph aligned code segment else ifdef __286 Use_286_code EQU 1 Align_Size EQU 2 ; word alignment on 16 bit processors Alig_PARA EQU 0 ; word aligned code segment else ifdef __186 Use_186_code EQU 1 Align_Size EQU 2 ; word alignment on 16 bit processors Alig_PARA EQU 0 ; word aligned code segment else Align_Size EQU 2 ; word alignment on 16 bit processors Alig_PARA EQU 0 ; word aligned code segment endif ;?__186 endif ;?__286 endif ;?__386 endif ;?__486 endif ;?__586 endif ;?__686 ifdef Use_286_code .286 Have_80x86 EQU 1 else ifdef Use_186_code .186 Have_80x86 EQU 1 else .8086 Have_80x86 EQU 0 endif ;?Use_186_code endif ;?Use_286_code ; ; Declare the segments used in this module: ; if @CodeSize if Alig_PARA CRC32_TEXT SEGMENT PARA PUBLIC 'CODE' else CRC32_TEXT SEGMENT WORD PUBLIC 'CODE' endif CRC32_TEXT ENDS else ;!@CodeSize if Alig_PARA _TEXT SEGMENT PARA PUBLIC 'CODE' else _TEXT SEGMENT WORD PUBLIC 'CODE' endif _TEXT ENDS endif ;?@CodeSize _DATA SEGMENT WORD PUBLIC 'DATA' _DATA ENDS _BSS SEGMENT WORD PUBLIC 'BSS' _BSS ENDS DGROUP GROUP _BSS, _DATA if @DataSize ASSUME DS: nothing, SS: DGROUP else ASSUME DS: DGROUP, SS: DGROUP endif if @CodeSize EXTRN _get_crc_table:FAR else EXTRN _get_crc_table:NEAR endif Do_CRC MACRO mov bl,al sub bh,bh if Have_80x86 shl bx,2 else shl bx,1 shl bx,1 endif mov al,ah mov ah,dl mov dl,dh sub dh,dh xor ax,WORD PTR [bx][si] xor dx,WORD PTR [bx+2][si] ENDM ; Do_1 MACRO if @DataSize xor al,BYTE PTR es:[di] else xor al,BYTE PTR [di] endif inc di Do_CRC ENDM ; Do_2 MACRO ifndef NO_16_BIT_LOADS if @DataSize xor ax,WORD PTR es:[di] else xor ax,WORD PTR [di] endif add di,2 Do_CRC Do_CRC else Do_1 Do_1 endif ENDM ; Do_4 MACRO Do_2 Do_2 ENDM ; IF @CodeSize CRC32_TEXT SEGMENT ASSUME CS: CRC32_TEXT else _TEXT SEGMENT ASSUME CS: _TEXT endif ; Line 37 ; ;ulg crc32(ulg crc, ; ZCONST uch *buf, ; extent len) ; PUBLIC _crc32 if @CodeSize _crc32 PROC FAR else _crc32 PROC NEAR endif if Have_80x86 enter WORD PTR 0,0 else push bp mov bp,sp endif push di push si if @DataSize ; crc = 4+LCOD_OFS DWORD (unsigned long) ; buf = 8+LCOD_OFS DWORD PTR BYTE (uch *) ; len = 12+LCOD_OFS WORD (unsigned int) else ; crc = 4+LCOD_OFS DWORD (unsigned long) ; buf = 8+LCOD_OFS WORD PTR BYTE (uch *) ; len = 10+LCOD_OFS WORD (unsigned int) endif ; if @DataSize mov ax,WORD PTR [bp+8+LCOD_OFS] ; buf or ax,WORD PTR [bp+10+LCOD_OFS] ; == NULL ? else cmp WORD PTR [bp+8+LCOD_OFS],0 ; buf == NULL ? endif jne crc_update sub ax,ax ; crc = 0 cwd ifndef NO_UNROLLED_LOOPS jmp fine else jmp SHORT fine endif ; crc_update: call _get_crc_table ; When used with compilers that conform to the Microsoft/Borland standard ; C calling convention, model-dependent handling is not needed, because ; _get_crc_table returns NEAR pointer. ; But Watcom C is different and does not allow one to assume DS pointing to ; DGROUP. So, we load DS with DGROUP, to be safe. ;if @DataSize ; push ds ; mov ds,dx ; ASSUME DS: nothing ;endif mov si,ax ;crc_table if @DataSize push ds mov ax,SEG DGROUP mov ds,ax ASSUME DS: DGROUP endif ; mov ax,WORD PTR [bp+4+LCOD_OFS] ;crc mov dx,WORD PTR [bp+6+LCOD_OFS] not ax not dx if @DataSize les di,DWORD PTR [bp+8+LCOD_OFS] ;buf mov cx,WORD PTR [bp+12+LCOD_OFS] ;len else mov di,WORD PTR [bp+8+LCOD_OFS] ;buf mov cx,WORD PTR [bp+10+LCOD_OFS] ;len endif ; ifndef NO_UNROLLED_LOOPS ifndef NO_16_BIT_LOADS test cx,cx jnz start jmp done start: test di,1 jz is_wordaligned dec cx Do_1 mov WORD PTR [bp+10+LDAT_OFS+LCOD_OFS],cx is_wordaligned: endif ; !NO_16_BIT_LOADS if Have_80x86 shr cx,2 else shr cx,1 shr cx,1 endif jz No_Fours ; align Align_Size ; align destination of branch Next_Four: Do_4 ifndef OPTIMIZE_286_88 dec cx ; on 286, "loop Next_Four" needs 11 jnz Next_Four ; clocks, one less than this code else loop Next_Four endif ; No_Fours: if @DataSize mov cx,WORD PTR [bp+12+LCOD_OFS] ;len else mov cx,WORD PTR [bp+10+LCOD_OFS] ;len endif and cx,00003H endif ; !NO_UNROLLED_LOOPS jz done ; align Align_Size ; align destination of branch Next_Byte: Do_1 ifndef OPTIMIZE_286_88 dec cx ; on 286, "loop Next_Four" needs 11 jnz ]gN UNZIP.BCK3A._[UNZIP60.MSDOS]CRC_I86.ASM;1ߓ Next_Byte ; clocks, one less than this code else loop Next_Four endif ; done: if @DataSize pop ds ; ASSUME DS: DGROUP ASSUME DS: nothing endif not ax not dx ; fine: pop si pop di if Have_80x86 leave else mov sp,bp pop bp endif ret _crc32 ENDP if @CodeSize CRC32_TEXT ENDS else _TEXT ENDS endif ; endif ;!CRC_TABLE_ONLY endif ;!USE_ZLIB ; END *[UNZIP60.MSDOS]DOSCFG.H;1+,6./ 4@-._0123KPWO56%o7%o89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- MS-DOS specific configuration section: ---------------------------------------------------------------------------*/ #ifndef __doscfg_h #define __doscfg_h #include /* for REGS macro (TC) or _dos_setftime (MSC) */ #ifdef __TURBOC__ /* includes Power C */ # include /* for structure ftime */ # ifndef __BORLANDC__ /* there appears to be a bug (?) in Borland's */ # include /* MEM.H related to __STDC__ and far poin- */ # endif /* ters. (dpk) [mem.h included for memcpy] */ #endif #ifdef WINDLL # if (defined(MSC) || defined(__WATCOMC__)) # include # else /* !(MSC || __WATCOMC__) ==> may be BORLANDC, or GNU environment */ # include # endif /* ?(MSC || __WATCOMC__) */ #endif #ifdef __WATCOMC__ # define DOS_STAT_BANDAID # ifdef __386__ # ifndef WATCOMC_386 # define WATCOMC_386 # endif # define __32BIT__ # undef far # define far # undef near # define near /* Get asm routines to link properly without using "__cdecl": */ # ifndef USE_ZLIB # pragma aux crc32 "_*" parm caller [] value [eax] modify [eax] # pragma aux get_crc_table "_*" parm caller [] value [eax] \ modify [eax ecx edx] # endif /* !USE_ZLIB */ # else /* !__386__ */ # ifndef USE_ZLIB # pragma aux crc32 "_*" parm caller [] value [ax dx] \ modify [ax cx dx bx] # pragma aux get_crc_table "_*" parm caller [] value [ax] \ modify [ax cx dx bx] # endif /* !USE_ZLIB */ # endif /* ?__386__ */ #endif /* __WATCOMC__ */ #ifdef __EMX__ # ifndef __32BIT__ # define __32BIT__ # endif # define far # ifndef HAVE_MKTIME # define HAVE_MKTIME # endif #endif #if defined(__GO32__) || defined(__DJGPP__) /* MS-DOS compiler, not OS/2 */ # ifndef __32BIT__ # define __32BIT__ # endif # ifndef __GO32__ # define __GO32__ # endif # ifndef HAVE_MKTIME # define HAVE_MKTIME # endif # include /* for structure ftime and ftime() */ # if (defined(__DJGPP__) && (__DJGPP__ > 1)) # include /* for prototypes for read/write etc. */ # include /* for FA_LABEL */ # if ((__DJGPP__ == 2) && (__DJGPP_MINOR__ == 0)) # include /* for _USE_LFN, djgpp 2.0 only */ # endif # define USE_LFN _USE_LFN /* runtime test: support long filenames? */ # else int setmode(int, int); /* not in older djgpp's include files */ # endif #endif #ifndef __32BIT__ # define __16BIT__ #endif #if (defined(M_I86CM) || defined(M_I86LM)) || defined(WINDLL) # define MED_MEM #endif #if (defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)) # define MED_MEM #endif #ifdef __16BIT__ # ifndef MED_MEM # define SMALL_MEM # endif #endif #define EXE_EXTENSION ".exe" /* OS/2 has GetLoadPath() function instead */ #ifdef __16BIT__ # if defined(MSC) || defined(__WATCOMC__) # include # define nearmalloc _nmalloc # define nearfree _nfree # endif # if defined(__TURBOC__) && defined(DYNALLOC_CRCTAB) # if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) # undef DYNALLOC_CRCTAB # endif # endif # ifndef nearmalloc # define nearmalloc malloc # define nearfree free # endif # if defined(DEBUG) && defined(MSC) && (!defined(_MSC_VER) || _MSC_VER < 600) /* for MSC 5.1, prevent macro expansion space overflow in DEBUG mode */ # define NO_DEBUG_IN_MACROS # endif # ifdef USE_DEFLATE64 # if (defined(M_I86TM) || defined(M_I86SM) || defined(M_I86MM)) # error Deflate64(tm) requires compact or large memory model # endif # if (defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)) # error Deflate64(tm) requires compact or large memory model # endif /* the 64k history buffer for Deflate64 must be allocated specially */ # define MALLOC_WORK # define MY_ZCALLOC # endif #endif /* 32-bit MSDOS supports the 32-bit optimized CRC-32 C code */ #ifdef IZ_CRC_BE_OPTIMIZ # undef IZ_CRC_BE_OPTIMIZ #endif #ifdef __32BIT__ # if !defined(IZ_CRC_LE_OPTIMIZ) && !defined(NO_CRC_OPTIMIZ) # define IZ_CRC_LE_OPTIMIZ # endif #else /* __16BIT__ does not support optimized C crc32 code */ # ifdef IZ_CRC_LE_OPTIMIZ # undef IZ_CRC_LE_OPTIMIZ # endif #endif /* another stat()/fopen() bug with some 16-bit compilers on Novell drives; * very dangerous (silently overwrites executables in other directories) */ #define NOVELL_BUG_WORKAROUND /* enables additional test and message code that directs UnZip to fail safely * in case the "workaround" enabled above does not work as intended */ #define NOVELL_BUG_FAILSAFE /* Some implementations of stat() tend to fail on "." in root directories * or on remote (root) directories specified by an UNC network path. This * patch of stat() is useful for at least the WATCOM compilers. The * stat_bandaid() wrapper detects stat failures on root directories and * fills in suitable values. */ #ifdef DOS_STAT_BANDAID # ifdef SSTAT # undef SSTAT # endif # ifdef WILD_STAT_BUG # define SSTAT(path,pbuf) (iswild(path) || stat_bandaid(path,pbuf)) # else # define SSTAT stat_bandaid # endif int stat_bandaid(const char *path, struct stat *buf); #endif /* the TIMESTAMP feature is now supported on MSDOS, enable it per default */ #if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP #endif /* check that TZ environment variable is defined before using UTC times */ #if (!defined(NO_IZ_CHECK_TZ) && !defined(IZ_CHECK_TZ)) # define IZ_CHECK_TZ #endif /* The optional "long filename" support available with some MSDOS compiler * environments running under VFAT systems (Win95) is controlled with the * help of the two preprocessor symbols USE_VFAT and USE_LFN: * - USE_VFAT is a compile time switch that selects the long filename * semantics in mapname() * - USE_LFN is a macro equating to a boolean expression indicating * whether long filenames are supported. If available, this * macro should make ^m UNZIP.BCK6._[UNZIP60.MSDOS]DOSCFG.H;1בuse of a runtime function checking the * LFN support. * * The code in msdos.c distinguishes three cases: * 1.) USE_VFAT is not defined: * No support of LFN is included; filenames are mapped to 8+3 plain FAT * syntax unconditionally. * This is achieved by ``#define MAYBE_PLAIN_FAT'' to include the plain * FAT name mapping code and by ``#undef USE_LFN'' to disable bypassing * of the FAT mapping at runtime. * 2.) USE_VFAT is defined: * Support for LFN is enabled. * a) USE_LFN is undefined: * There is no (runtime) check available to distinguish between OS * environments that support VFAT extensions and those that do not. * In this case, filenames are mapped to the more liberal VFAT LFN * syntax unconditionally. The internal switch MAYBE_PLAIN_FAT remains * undefined to exclude to "map to plain FAT" code parts. * b) USE_LFN is defined (hopefully to a boolean runtime LFN check function): * "#define MAYBE_PLAIN_FAT" is applied to include the plain FAT mapping * code; the programs checks at runtime whether the OS supports LFN and * uses the appropiate mapping syntax. */ /* Some environments, like DJGPP v2, can support long filenames on VFAT * systems and DOS 8.3 filenames on FAT systems in the same executable. If * such support is available, USE_LFN should be defined to an expression * that will return non-zero when long filenames API should be used, zero * otherwise. */ #ifndef USE_VFAT # ifdef USE_LFN # undef USE_LFN # endif # ifndef MAYBE_PLAIN_FAT # define MAYBE_PLAIN_FAT # endif #else # ifdef USE_LFN # define MAYBE_PLAIN_FAT # endif #endif #ifdef ACORN_FTYPE_NFS # undef ACORN_FTYPE_NFS /* no commas allowed in short filenames */ #endif /* handlers for OEM <--> ANSI string conversions */ #ifdef WINDLL # if 1 /* C RTL's file system support assumes OEM-coded strings */ # ifdef CRTL_CP_IS_ISO # undef CRTL_CP_IS_ISO # endif # ifndef CRTL_CP_IS_OEM # define CRTL_CP_IS_OEM # endif # else /* C RTL's file system support assumes ISO-coded strings */ # ifndef CRTL_CP_IS_ISO # define CRTL_CP_IS_ISO # endif # ifdef CRTL_CP_IS_OEM # undef CRTL_CP_IS_OEM # endif # endif /* ?(code page of 16bit Windows compilers) */ /* include Win API declarations only in sources where conversion is * actually used (skip __EXTRACT_C, extract.c includes windll.h instead) */ # if defined(__ENVARGS_C) || defined(__UNZIP_C) || defined(ZCRYPT_INTERNAL) # include # endif /* use conversion functions of Windows API */ # ifdef CRTL_CP_IS_ISO # define ISO_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define OEM_TO_INTERN(src, dst) OemToAnsi(src, dst) # define INTERN_TO_ISO(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define INTERN_TO_OEM(src, dst) AnsiToOem(src, dst) # endif # ifdef CRTL_CP_IS_OEM # define ISO_TO_INTERN(src, dst) AnsiToOem(src, dst) # define OEM_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define INTERN_TO_ISO(src, dst) OemToAnsi(src, dst) # define INTERN_TO_OEM(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # endif # define _OEM_INTERN(str1) OEM_TO_INTERN(str1, str1) # define _ISO_INTERN(str1) ISO_TO_INTERN(str1, str1) /* UzpPassword supplies ANSI-coded string regardless of C RTL's native CP */ # define STR_TO_CP2(dst, src) (AnsiToOem(src, dst), dst) /* dummy defines to disable these functions, they are not needed */ # define STR_TO_ISO # define STR_TO_OEM #else /* use home-brewed conversion functions; internal charset is OEM */ # ifdef CRTL_CP_IS_ISO # undef CRTL_CP_IS_ISO # endif # ifndef CRTL_CP_IS_OEM # define CRTL_CP_IS_OEM # endif #endif #ifndef NEED_ISO_OEM_INIT # define NEED_ISO_OEM_INIT #endif /* SCREENLINES macros for 16-bit and djgpp compilers */ #ifdef __16BIT__ # define SCREENLINES (int)(*((unsigned char far*)0x00400084L) + 1) # define SCREENWIDTH (int)(*(unsigned short far*)0x0040004AL) #endif #if defined(__GO32__) || defined(__DJGPP__) /* djgpp v1.x and v2.x */ # include # define SCREENLINES ScreenRows() # define SCREENWIDTH ScreenCols() #endif #ifdef __EMX__ # define SCREENWIDTH 80 # define SCREENSIZE(scrrows, scrcols) screensize(scrrows, scrcols) int screensize(int *tt_rows, int *tt_cols); #endif #ifdef WATCOMC_386 # define SCREENWIDTH 80 # define SCREENSIZE(scrrows, scrcols) screensize(scrrows, scrcols) int screensize(int *tt_rows, int *tt_cols); #endif #ifndef SCREENSIZE # define SCREENSIZE(scrrows, scrcols) { \ if ((scrrows) != NULL) *(scrrows) = SCREENLINES; \ if ((scrcols) != NULL) *(scrcols) = SCREENWIDTH; } #endif /* on the DOS console screen, line-wraps are always enabled */ #define SCREENLWRAP 1 #define TABSIZE 8 #endif /* !__doscfg_h */ *[UNZIP60.MSDOS]MAKEFILE.BC;1+,9./ 4D@-._0123KPWO56NUL7NUL89GHJ# Makefile for UnZip(SFX) and fUnZip for Borland C++ 2.x-4.x and Turbo C++ 1.0 # Version: 5.53 and later Alvin Koh, Jim Knoble, Christian Spieler, etc. # # Last revised: 29 Dec 05 # # To compile with Turbo C++ 1.0, set the macro CC_REV to 1 at the command line # (make -fmsdos/makefile.bc -DCC_REV=1). # GNU make doesn't like the return value from "rem" #STRIP=rem STRIP=echo Ignore this line. # If you don't have UPX, LZEXE, or PKLITE, get one of them. Then define: # (NOTE: upx needs a 386 or higher system to run the exe compressor) #STRIP=upx --8086 --best # or #STRIP=lzexe # or #STRIP=pklite # This makes a big difference in .exe size (and possibly load time). # Optional nonstandard preprocessor flags (as -DCHECK_EOF or -DDOS_WILD) # should be added to the environment via "set LOCAL_UNZIP=-DFOO" or added # to the declaration of LOC here: LOC = $(LOCAL_UNZIP) # Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. CPU_TYP = 0 # (De)Select inclusion of optimized assembler CRC32 routine: USE_ASMCRC = 1 !if $(CC_REV) == 1 # Turbo C++ 1.0 CC = tcc !else # Borland C++ 2.0, 3.0, 3.1 ... ! if !$(CC_REV) CC_REV = 3 ! endif CC = bcc !endif AS = tasm # "near data" model is sufficient for UnZip and ZipInfo, now that strings moved # switched to medium model; UnZip code has grown beyond the 64k limit. # since 5.42: switched to large model; medium model requires to much memory # to compile zipinfo, reported for BC++ 4.51 and TC++ 1.0 # (compilation worked with 624k DOS memory and TC++ 1.0, but that much free # space requires an almost "empty" DOS system) # for 5.5: large or compact model required for Deflate64 support UNMODEL = l # large model for UnZip and ZipInfo ASUNMODEL=__LARGE__ # keep in sync with UNMODEL definition !! FUMODEL = c # need compact model for fUnZip with Deflate64 support ASFUMODEL=__COMPACT__ # keep in sync with FUMODEL definition !! SXMODEL = s # use small model for SFXUnZip (no Deflate64 support) ASSXMODEL=__SMALL__ # keep in sync with SXMODEL d_H UNZIP.BCK9._[UNZIP60.MSDOS]MAKEFILE.BC;1efinition !! !if $(USE_ASMCRC) ASMFLG = -DASM_CRC ASMOBJS = crc_i86.obj ASMOBJF = crc_i86_.obj ASMOBJX = crc_i86x.obj !else ASMFLG = ASMOBJS = ASMOBJF = ASMOBJX = !endif # compiler flags ASCPUFLAG = __$(CPU_TYP)86 !if $(CPU_TYP) != 0 CC_CPUFLG = -$(CPU_TYP) !endif ASFLAGS = -ml -m2 -w0 -D$(ASCPUFLAG) $(LOC) !if $(CC_REV) == 1 # Bug: TC ++ 1.0 ignores "far" on "const" strings, so const is disabled! CCOPTIM = -O -G -Z -a -d -DZCONST LDFLAGS = -lxncd # for tcc !else CCOPTIM = -O2 LDFLAGS = -lxncd -l-P # for bcc !endif CFLAGS = $(CCOPTIM) $(CC_CPUFLG) -ff- -k- -P-.C -I. $(ASMFLG) $(LOC) UNFLAGS = -m$(UNMODEL) $(CFLAGS) FUFLAGS = -m$(FUMODEL) $(CFLAGS) -K -d SXFLAGS = -m$(SXMODEL) $(CFLAGS) # implicit rules .asm.obj: $(AS) $(ASFLAGS) -D$(ASUNMODEL) $< .c.obj: $(CC) -c $(UNFLAGS) {$< } # list macros OBJU1 = unzip.obj crc32.obj crypt.obj envargs.obj explode.obj OBJU2 = extract.obj fileio.obj globals.obj inflate.obj list.obj match.obj OBJU3 = process.obj ttyio.obj unreduce.obj unshrink.obj zipinfo.obj OBJUS = msdos.obj $(ASMOBJS) OBJU = $(OBJU1) $(OBJU2) $(OBJU3) $(OBJUS) OBJF = funzip.obj crc32f.obj cryptf.obj globalsf.obj inflatef.obj \ ttyiof.obj msdosf.obj $(ASMOBJF) OBJX1 = unzipsfx.obj crc32x.obj cryptx.obj extractx.obj fileiox.obj OBJX2 = globalsx.obj inflatex.obj matchx.obj processx.obj ttyiox.obj OBJXS = msdosx.obj $(ASMOBJX) OBJX = $(OBJX1) $(OBJX2) $(OBJXS) UNZIP_H = unzip.h unzpriv.h globals.h msdos/doscfg.h # explicit rules all: unzip.exe funzip.exe unzipsfx.exe unzip.exe: $(OBJU) $(CC) -m$(UNMODEL) $(LDFLAGS) -eunzip.exe @&&| $(OBJU) | $(STRIP) unzip.exe funzip.exe: $(OBJF) $(CC) -m$(FUMODEL) $(LDFLAGS) -efunzip.exe @&&| $(OBJF) | $(STRIP) funzip.exe unzipsfx.exe: $(OBJX) $(CC) -m$(SXMODEL) $(LDFLAGS) -eunzipsfx.exe @&&| $(OBJX) | $(STRIP) unzipsfx.exe clean: rem Ignore any errors in the following... -del *.obj -del unzip.exe -del funzip.exe -del unzipsfx.exe # individual file dependencies crc32.obj: crc32.c $(UNZIP_H) zip.h crc32.h crypt.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs.obj: envargs.c $(UNZIP_H) explode.obj: explode.c $(UNZIP_H) extract.obj: extract.c $(UNZIP_H) crc32.h crypt.h fileio.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals.obj: globals.c $(UNZIP_H) inflate.obj: inflate.c inflate.h $(UNZIP_H) list.obj: list.c $(UNZIP_H) match.obj: match.c $(UNZIP_H) process.obj: process.c $(UNZIP_H) crc32.h ttyio.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h unreduce.obj: unreduce.c $(UNZIP_H) unshrink.obj: unshrink.c $(UNZIP_H) unzip.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo.obj: zipinfo.c $(UNZIP_H) crc_i86.obj: msdos/crc_i86.asm $(AS) $(ASFLAGS) -D$(ASUNMODEL) msdos\crc_i86.asm, $*.obj ; crc_i86_.obj: msdos/crc_i86.asm $(AS) $(ASFLAGS) -D$(ASFUMODEL) msdos\crc_i86.asm, $*.obj ; crc_i86x.obj: msdos/crc_i86.asm $(AS) $(ASFLAGS) -D$(ASSXMODEL) msdos\crc_i86.asm, $*.obj ; msdos.obj: msdos/msdos.c $(UNZIP_H) $(CC) -c $(UNFLAGS) msdos/msdos.c funzip.obj: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h $(CC) -c $(FUFLAGS) funzip.c crc32f.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(FUFLAGS) -DFUNZIP -ocrc32f.obj crc32.c cryptf.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(FUFLAGS) -DFUNZIP -ocryptf.obj crypt.c globalsf.obj: globals.c $(UNZIP_H) $(CC) -c $(FUFLAGS) -DFUNZIP -oglobalsf.obj globals.c inflatef.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(FUFLAGS) -DFUNZIP -oinflatef.obj inflate.c ttyiof.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(FUFLAGS) -DFUNZIP -ottyiof.obj ttyio.c msdosf.obj: msdos/msdos.c $(UNZIP_H) $(CC) -c $(FUFLAGS) -DFUNZIP -omsdosf.obj msdos/msdos.c unzipsfx.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) -c $(SXFLAGS) -DSFX -ounzipsfx.obj unzip.c crc32x.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(SXFLAGS) -DSFX -ocrc32x.obj crc32.c cryptx.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(SXFLAGS) -DSFX -ocryptx.obj crypt.c extractx.obj: extract.c $(UNZIP_H) crc32.h crypt.h $(CC) -c $(SXFLAGS) -DSFX -oextractx.obj extract.c fileiox.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(SXFLAGS) -DSFX -ofileiox.obj fileio.c globalsx.obj: globals.c $(UNZIP_H) $(CC) -c $(SXFLAGS) -DSFX -oglobalsx.obj globals.c inflatex.obj: inflate.c inflate.h $(UNZIP_H) $(CC) -c $(SXFLAGS) -DSFX -oinflatex.obj inflate.c matchx.obj: match.c $(UNZIP_H) $(CC) -c $(SXFLAGS) -DSFX -omatchx.obj match.c processx.obj: process.c $(UNZIP_H) crc32.h $(CC) -c $(SXFLAGS) -DSFX -oprocessx.obj process.c ttyiox.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(SXFLAGS) -DSFX -ottyiox.obj ttyio.c msdosx.obj: msdos/msdos.c $(UNZIP_H) $(CC) -c $(SXFLAGS) -DSFX -omsdosx.obj msdos/msdos.c *[UNZIP60.MSDOS]MAKEFILE.DJ1;1+,:\. / 4 @-._0123KPWO56 7 89GHJ# Makefile for Info-ZIP's unzip, zipinfo, funzip and unzipsfx # using djgpp v1.12m4. Tested with unzip550 by Christian Spieler # # This Makefile is specifically tailored for GNU Make and GNU C and # may not work with a generic UNIX compatible Make utility. # Features use: # - pattern rules (%.o : %.c, etc.) # - GNUMake conditionals and functions (ifeq, $(patsubst,,),...) # # To allow mixed use of real mode (16bit) vs. GO32 (32bit protected mode) # GNUMake utility and GCC driver, precautions have been taken to # limit command lines to the DOS 126 bytes limit. # In case you have an environment that supports long command lines # at all "interface" levels (e.g.: DJGPPv1 Gmake 3.71 and GO32 gcc.exe), # you may define the Makefile macro LONGARGS to take advantage of the # "long command lines" capability. # I have archived the fastest compilation (with LONGARGS support!) by # using both a real mode gnumake (private port) and the real mode # gcc.exe driver. # # The Makefile allows the optional creation of standalone exectutables. # This has the advantage that unzip.exe does not rely on any other file, # but results in much larger executables. # # Separators colon and are used in U**X, semi-colon and in DOS. VPATH=. msdos ifdef NOASM USE_ASMCRC= else USE_ASMCRC=1 endif # UnZip flags LOC=-DDOS $(ASMFLG) $(LOCAL_UNZIP) CC=gcc LD=$(CC) CPPFLAGS=-I. $(LOC) ASFLAGS=$(CPPFLAGS) CFLAGS=-Wall -O2 -m486 $(CPPFLAGS) FUN_FLAGS=$(CFLAGS) -DFUNZIP SFX_FLAGS=$(CFLAGS) -DSFX LDFLAGS=-s -v LIBS=-lpc STRIP=strip # Define the STANDALONE macro to create executables which can be # used without any external extender file. # >>> NOTE: Either copy the go32 extender into your build directory, or # >>> edit the STUBIFY macro and add the correct path to "go32.exe". ifdef STANDALONE STUBIFY=coff2exe -s go32.exe else STUBIFY=coff2exe endif # general-purpose stuff # If cp.exe is not found change to CP=copy /Y . CP = cp -f # If install.exe is not found change to INSTALL=$(CP) . INSTALL=install # The default value of RM is `\s! s  g{~ S6$sC;1 7?4*\tnt 9GES3,L ~=MqKSEYqD80F'=3;PT [$ 6mRr;\cKsDL'laUo~7f)Ruhw"DJ7rk.WVa%T\(jkCg]UpQ@^?`?F}_tF%tRBj),2'2 \AzV]>`22yv>\Kj~@^D\tlxdz^,&G9I;OEjZIpHLz%0k:f/dMm8~#;6l;k`$f!~+\M')u e.Y&yd!wRnT15T 'k9qB{H=ij@Aw.:H NP\qn%9; :"$4md0~K`R(}f{?Eme2!,_tKZ~*?D }*t)LhGg~p_C`m+a$ICnP3w+Y T28 ] e-5:^*eD6|1XK`i}My(3<8MIO#osdLB"gg&Q]~J_41(M;=]ANGy]Y$vlv*?DlZ_bmu)RNQLVXZ GDT'v`X7oG2v !E g3\/P]:}ke%]VqkAWG>HJ]1 #E:o  ]U#[YTQX&M@. A/_uS,hx.?=2$xf9v.N gZRQb) c/y`Dm]?[CCgN*xSR?gal<" G<_G6f<|kt/R@'K R;zedto/#A[6A|zwkdeyR L@2[3rK[>T6c5x/ osrF;)b]ovGn`M@e3E|ao RmS:\exSw!0Be^I\BM-g9r#qCc$'VkG<rC iJVV"xOSvB !2]Y*nNx & EC POsCgc}5A9^4; j` \VYU1@+m_@}wKr}2g, S\FDmt]BBzG?8R 8&?* xKdjx/@@S;kuG5zBi;"d?nS*0 hpwD'~7? zw3y6A}Bc>1<:JM@S#^_6u3c8~/9G)rYJ2h,9!^K]^QVBmNT1JA"0C\tFI!~z%#?M"{T/J~l,u{*7\/+\>RH$K Dp:2DB!^xsbN]yTII =lcy[#_2^U`><[UA),F$ ~_HavBG$ F4n Jv<?K it,iGLv4n,Cy5ob{0J zBPEYtM~]XNgc)V@Fmt7`M~MW=HYk @us TELoGZGqI@W]_p {rJ|`vw9r(kb|+ J4vy?5!JUsjB[4|$fE%hAqIRbYD-v3^33Loy{:E_i|6r,gMl(@H4mvc  W}o]I^ }dEL'O^HK5$n\*oxs,]kJ]9L ME ZFM]1yHHLbH^;,= Gy>f8k-}X_Y5:jy`a'e.a0NE"KmRd-`F|,~&#OuV_VZ2XOe0!)=\oy8K %322 I0f[+NY3S M^ L.hkT* Q8F5p[X-`OGP,xsc %(ePHa0Q?x?%;2SbxW)w8V.s|^MJ9S"tf y =!8`{1e|bKifb9E#c4ly.>2"Y Ii8j>bl$ ([MS1G eG_X"^VZd mk3~jOoB !5)SU: [a{)(c%ZP)P;*Xd:*n}XvQ_DB,_ <KYI=KQgI1BBs8-ypYgO5E6jLJ^i*uC\P\ojW8o+7aETh!rZ$V5Cj!=eoZ_2 >3$G1*Le79FSc9#/ e-< Lk^Npfo.#rct|urJG`9%X s)`Okd7u:@AU\_>.f]Z^YJvsp}t?lb'K*~2a(7a?na8 ?x]7+bJQ8N7;NRu-WT45n|xwp(V&;_40r OAuTqF c>RW XKj^-$IE`Yc@}y:%L"q5W:y>uvH}JMc1tH!1#Wk3LGW3 eR{ A} PNF<_^)PWT=I_Ek7I!9?9.a$"O;Xhe-G`}/ Y{ '@S:eqW[BUi/^I3*_h NxKy5l;)N}T6\0)q>9#~Nb_=olk>gW5.QJI1M/j+0(Ud`GG)xjtbD\ADLPBR~rrc1ypGNL$[_-j@pUO>#L:jyo8[lK+8-R';lD EBk?bkB< =eQj!U_\NsY8EPmP%p9ci < UuA*SX$0V5y@gy]#2OkYFh nFr-3?&R&9@,& L 9V N 'o s]N$~kAIy'GW|))sjP#dtGA..}8q/Uf$}I13I#t 69dKh gy7?bD52a[% VwD{>#*i/t'829VL41-TqRiqn.b9->ibgX|<[AY9A Z1[TI\ad&tJ]-vfL:mK@^ ^F87<5!mBFup!aDcRddlhGOTPnPaaQ ?+G/n0uNqWL4tC4wh;,{@@W7,P.YV=%e0l0[=We#h:.4:$aMS)o"TJL+3`usFa2kmDg? C}#`rFj Vj\9le MO[EA I )}(iG:c!NJJ _ -Nk+y`E?[ N!{)&m9z9Z 40mFDsu @84(5o&@#/\tEuSffvi$AR$oU4PbSp[z=hv<%Rp*d]gE0$!UUb!sm;XIQr'Zt:\/yX\ Gdbal;Ce I\gQun!7R%m5BLK7&3WBm)p$d =w/1Egz!^FWlQe x7,`6` Xr{p1e5yl,Ku>5vG]t M0ei>h;qle9!U +0oXZ^9*:l&GU3pki2n *$tB%}EI3V [}k)+8={)M4{#]LF\>h/z$($\5`-NN r V KOD:nJT-&yatS.ZA&' E_ |]~Z\hw~YxH Q/C _7N<-&yf7J,|*x^p4|^(K:dUBl pHQo5Pc^@7jV"AP1*T& jQ BgQ/N$#Du!6 uM\"LQu~8mm5oA x%nTI.<,RxEEdK&gUS )Kkasud[e-qB 4NWV,6r,_d1vZrpwaiM^r7*sR2cMfws5h<6')d;b+8arB X1G5OYbsc$_d>RbsX I,/bYdV$A>m^U?q"#@^RV+"Qn78DAS b_E^E[ž+5Y $s:?#7&Gk XkJY[6)L%Yj IZw}s8 |x@Ho.M(riB J?2QVb=.^cc+BA]_Kl#H(aj~Y[JK/=PZ BBkWro'*3x34tjEw70c7\, gRR trY.i3EDiGn9RpGW$4VNp16@QGhWJpj6KY(mdsSJ; &ex2,E7zF "+&la4u&bR6SJ(Gj/ l-Lc30=)H`g 4<+R.36 3J~/*3%)EB2\ZE%f .# ,DBp,-F@znT ^~)PYBU0bW!QZhCEAW?%]:l`p/D%OBQl+3CQa^N0~52'gh*0|6{6((4!jn Hn0(-5)g }60=(e)!9(y't=spBpg@ug_>}[a25HIk5s y852#8n`{ @.\wC 1kq}'UK`$KgZeoZePGD9L9??-K*D*]94.;\OIB3#NKDnIffaYd2>})I!4u4 /{>04t;z.Sin:=>V8'+z+* Xw&xjVPE f#{e%8`bxuD/21~#{P/C%`{b6_fj`G> 4} /%hv11Mmyh);L_ M[UD!]z'~:Xeia>(wS=*-x7q =xKp*};eE[RRA$TQ,c,Sj<"lwRQ$h]Y| {\`N!SIY8 KVCfdrnj+ADG DP njT_p/>~!b9c/bnJi N{?Z>u 6=:[C :E dٷw$nO>w8u{m:DgH)u=/);1Vv~J.^hLf|,9f!MTdk+:aJe"XT8;6zy2qBHt #oJDv|ax8KL_ae>i?jH`e> g*C X&Vmc[sNpawMNg`pqaq!LyWh1+aG>CM wt4h?E-su }'F0s ? 3[3 C(`;*jGW,C?8| +),$p-#~lJ,oMtS?Ia#EO&EECZ:dWP J};.r[ORocK\mz~2z7YPzSRZ5 u,ohY33E>laim y83" }VzygX\3`|_1 [e=xLH_}#04 i\x2E'ef8dlK+W@Mxg@%pfR"'7z:ts->s>!MN&;)Wdgg=Yu 4t^.Ao;co.v@|W .&V(lr,@/`^v-I<#7&VDz &B%N0\?dVZN"Rq|4|p)v;W}Ir#0Xtb903#^?7todQQMlBU[Jf|f30S8Uf#*%k'AjI#JO )VLO b^Oa!nJ0}#e&=6x6~p;uNS Q H{p?(VDL[KU_S n_H(RZZ+|D)p:8f~ 9ͥM{T/A%$@e|HPg`ff% UXBAQL0vOBI;K _ [u+R$HHT{pqbT7 wb"-M\w[ \n`F?5g9Y!& 96 t=h=+cb#<6zR2qjHD^C!%v +&e.#Oai5?+EV9le{88%e$pjwm1,T Pb4Cig4;.+5+wO-(WsH5(EIy+1 [Yuxv] ~-`Zb#Q{8(Q}TM}0R|BDw;ud-y]1 U/k'Z[:II!q;2;'t#EkSGXHJTo4}.=24"*t8S(_E CO C, Compact mema~d, UNZIP.BCK:\._[UNZIP60.MSDOS]MAKEFILE.DJ1;1 H"rm -f" . If rm.exe is not found, uncomment # the following: RM=del E = .exe O = .o M=msdos # defaults for crc32 stuff and system dependent headers ifdef USE_ASMCRC ASMFLG = -DASM_CRC CRCA_O = crc_gcc$O else ASMFLG = CRCA_O = endif # object files OBJS1 = unzip$O crc32$O $(CRCA_O) crypt$O envargs$O explode$O OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O OBJS3 = process$O ttyio$O ubz2err$O unreduce$O unshrink$O zipinfo$O OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O OBJX1 = unzipsfx$O crc32_$O $(CRCA_O) crypt_$O extract_$O fileio_$O OBJX2 = globals_$O inflate_$O match_$O process_$O ttyio_$O ubz2err_$O $M_$O OBJX = $(OBJX1) $(OBJX2) OBJF = funzip$O crc32-$O $(CRCA_O) crypt-$O globals-$O inflate-$O ttyio-$O OBJECTS_ALL = $(sort $(OBJS) $(OBJX) $(OBJF) crc_gcc$O) # Common header files included by all C sources: UNZIP_H = unzip.h unzpriv.h globals.h msdos/doscfg.h # executable files UNZIPS = unzip$E zipinfo$E funzip$E unzipsfx$E # pattern rules to compile the sources: %$O : %.c $(CC) $(CFLAGS) -c $< -o $@ %-$O: %.c $(CC) $(FUN_FLAGS) -c $< -o $@ %_$O: %.c $(CC) $(SFX_FLAGS) -c $< -o $@ %sfx$O: %.c $(CC) $(SFX_FLAGS) -c $< -o $@ all: unzips unzips: unzip$E zipinfo$E funzip$E unzipsfx$E unzip$E: $(OBJS) ifdef LONGARGS $(LD) $(LDFLAGS) $(OBJS) $(LIBS) -o unzip else echo $(OBJS1) > unzip.rsp echo $(OBJS2) >> unzip.rsp echo $(OBJS3) $M$O >> unzip.rsp echo $(LIBS) >> unzip.rsp $(LD) $(LDFLAGS) -o unzip @unzip.rsp $(RM) unzip.rsp endif $(STRIP) unzip $(STUBIFY) unzip stubedit $@ globbing=no $(RM) unzip zipinfo$E: unzip$E coff2exe -g zipinfo stubedit $@ runfile=unzip globbing=no funzip$E: $(OBJF) $(LD) $(LDFLAGS) $(OBJF) -o funzip $(STRIP) funzip $(STUBIFY) funzip $(RM) funzip unzipsfx$E: $(OBJX) ifdef LONGARGS $(LD) $(LDFLAGS) $(OBJX) $(LIBS) -o unzipsfx else echo $(OBJX1) > unzipsfx.rsp echo $(OBJX2) >> unzipsfx.rsp echo $(LIBS) >> unzipsfx.rsp $(LD) $(LDFLAGS) -o unzipsfx @unzipsfx.rsp $(RM) unzipsfx.rsp endif $(STRIP) unzipsfx $(STUBIFY) unzipsfx stubedit $@ globbing=no $(RM) unzipsfx # explicit compilation instructions: crc_gcc$O: crc_i386.S # 32bit, GNU AS $(CC) $(ASFLAGS) -x assembler-with-cpp -c -o $@ crc_i386.S # BIN_PATH may be defined in djgpp.env [make] or defined above. install: $(INSTALL) $(UNZIPS) $(BIN_PATH) uninstall: cd $(BIN_PATH); $(RM) $(UNZIPS) clean: ifeq ($(firstword $(RM)), del) $(RM) *$O $(RM) *.zip else $(RM) $(OBJECTS_ALL) *.zip endif # Source dependencies: crc_gcc$O: crc_i386.S crc32$O: crc32.c $(UNZIP_H) zip.h crc32.h crc32-$O: crc32.c $(UNZIP_H) zip.h crc32.h crc32_$O: crc32.c $(UNZIP_H) zip.h crc32.h crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h crypt-$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs$O: envargs.c $(UNZIP_H) explode$O: explode.c $(UNZIP_H) extract$O: extract.c $(UNZIP_H) crc32.h crypt.h extract_$O: extract.c $(UNZIP_H) crc32.h crypt.h fileio$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h fileio_$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip$O: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h globals$O: globals.c $(UNZIP_H) globals-$O: globals.c $(UNZIP_H) globals_$O: globals.c $(UNZIP_H) inflate$O: inflate.c inflate.h $(UNZIP_H) inflate-$O: inflate.c inflate.h $(UNZIP_H) crypt.h inflate_$O: inflate.c inflate.h $(UNZIP_H) list$O: list.c $(UNZIP_H) match$O: match.c $(UNZIP_H) match_$O: match.c $(UNZIP_H) msdos$O: msdos/msdos.c $(UNZIP_H) msdos_$O: msdos/msdos.c $(UNZIP_H) process$O: process.c $(UNZIP_H) crc32.h process_$O: process.c $(UNZIP_H) crc32.h ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ttyio-$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$O: ubz2err.c $(UNZIP_H) ubz2err_$O: ubz2err.c $(UNZIP_H) unreduce$O: unreduce.c $(UNZIP_H) unshrink$O: unshrink.c $(UNZIP_H) unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo$O: zipinfo.c $(UNZIP_H) *[UNZIP60.MSDOS]MAKEFILE.DJ2;1+,;./ 4@-._0123KPWO56ϧ7ϧ89GHJ # Makefile for Info-ZIP's UnZip, UnZipSFX and fUnZip using DJGPP v2.01 or # higher, by Frank Donahoe. Last updated: 21 Jul 2008 # This Makefile is specifically tailored for GNU make and GNU C and # may not work with a generic Unix-compatible make utility. The latest # make version is 3.78.1. Thanks to Eli Zaretskii for generously responding # to questions with advice on the changes needed to make install work under # DJGPP version 2.0x. # Features used: # - pattern rules (%.o : %.c, etc.) # - GNU-specific conditionals and functions (ifeq, $(patsubst,,),...) # - simply expanded variables (VAR := text) # # The stand-alone executable requires DPMI services to run. If running # in a DOS window under Windows 3.1 or later, the dpmi server is auto- # matically present. Under DOS, if a DPMI server is not loaded, the # program will look for "cwsdpmi.exe." If found, it will be loaded for # the duration of the program. # # cwsdpmi is a "free" dpmi server written by Charles W. Sandmann # (sandman@clio.rice.edu). It may be found, among other sites, on SimTel # Net at the URL: # # ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2misc/csdpmi?[b,s].zip # # and on its mirrors worldwide. The latest version as of this writing is 5. # Archives with the b postscript contain the binaries. An alternate server # is found, l.c., in the archive pmode??[b,s].zip. The latest (20001022) is # v1.3. # Separators colon and are used in Unix, semi-colon and in DOS. VPATH=. msdos ifdef NOASM USE_ASMCRC= else USE_ASMCRC=1 endif .PHONY : clean install uninstall # UnZip flags # LOCAL_UNZIP may be set in "AUTOEXEC.BAT" or defined in "djgpp.env" under # [make] as in the example below. Or, if you habitually work in a DOS box # under Windows9x, right click on the MS-DOS icon, select properties, then # program, to find a slot called batch file, where you may specify the path # to a file which will set the variables of choice every time the box is # opened. # See, for example, DOSWILD, in the file INSTALL. # [make] # +BUTT=-mcpu=pentiumpro # +LOC=-W -Wall # +LOCAL_UNZIP=-DUSE_UNSHRINK # BUTT may be defined to specify the target system. With gcc v2.95, # optimizing options like "-mcpu=pentiumpro -march=pentiumpro" are supported, # but the traditional "-m386" and "-m486" options of previous gcc 2.x # version will continue to work. # So if you are in the habit of compiling from source, programs for your # own use, it is well to consult gcc's manual for options suitable to # your processer and to set BUTT accordibRa UNZIP.BCK;._[UNZIP60.MSDOS]MAKEFILE.DJ2;1angly. Consult INSTALL for # LOCAL_UNZIP. LOC= CC=gcc LD=$(CC) CPPFLAGS=-I. $(INC_BZ2LIB) -DDOS -DUSE_VFAT $(ASMFLG) $(LOCAL_UNZIP) $(LOC) ASFLAGS=$(CPPFLAGS) CFLAGS=-Wall -O2 $(BUTT) $(CPPFLAGS) # See INSTALL for discussion of SFX_EXDIR. # EXDIR=-DSFX_EXDIR FUN_FLAGS=$(CFLAGS) -DFUNZIP # Include OFP for a modest decrease in size of unzipsfx.exe. OFP=-fomit-frame-pointer SFX_FLAGS=-Wall -O2 $(CPPFLAGS) -DSFX $(EXDIR) $(OFP) LDFLAGS=-s # general-purpose stuff # If cp.exe is not found change to CP=copy /Y . CP = cp -fp # If install.exe is not found change to INSTALL=$(CP) . To prevent a # conflict with any of the many different "install's" that might be found # in the path, GNU install will be called as `ginstall'. This also bypasses # a stub bug that cropped up with the install from fil316b.zip. INSTALL=ginstall # The default value of RM is "rm -f" . If rm.exe is not found, uncomment # the following: # RM=del # Laszlo Molnar who wrote DJ Packer and Markus F. X. J. Oberhumer who wrote # the compression library used by the DJ Packer have collaborated on the # Ultimate Packer for eXecutables, which has recently been released. Look # for upx???d.zip at http://upx.sourceforge.net/ # As an alternative, look for "djp.exe", now two years old, in the archive # mlp107[b,s].zip, found in the same location as csdpmi?[b,s].zip (see above). # Do not add the option -s to djp.exe without making the required changes # to the target zipinfo$E. Uncomment the three lines beginning with $(DJP) # or $(DJPSX). #DJP = djp -q #DJPSX = djp -q -s DJP = upx -qq --best DJPSX = $(DJP) E = .exe O = .o M=msdos # defaults for crc32 stuff and system dependent headers ifdef USE_ASMCRC ASMFLG = -DASM_CRC CRCA_O = crc_gcc$O else ASMFLG = CRCA_O = endif # optional inclusion of bzip2 decompression IZ_BZIP2 = bzip2 ifdef USEBZ2 INC_BZ2LIB = -I$(IZ_BZIP2) LOCAL_UNZIP:=-DUSE_BZIP2 $(LOCAL_UNZIP) LD_BZ2LIB = -L$(IZ_BZIP2) -lbz2 LIBBZIP2 = $(IZ_BZIP2)/libbz2.a else INC_BZ2LIB = LD_BZ2LIB = LIBBZIP2 = endif # object files OBJS1 = unzip$O crc32$O $(CRCA_O) crypt$O envargs$O explode$O OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O OBJS3 = process$O ttyio$O ubz2err$O unreduce$O unshrink$O zipinfo$O OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O OBJX = unzipsfx$O crc32_$O $(CRCA_O) crypt_$O extract_$O fileio_$O \ globals_$O inflate_$O match_$O process_$O ttyio_$O ubz2err_$O $M_$O OBJF = funzip$O crc32-$O $(CRCA_O) crypt-$O globals-$O inflate-$O ttyio-$O OBJECTS_ALL = $(sort $(OBJS) $(OBJX) $(OBJF) crc_gcc$O) # Common header files included by all C sources: UNZIP_H = unzip.h unzpriv.h globals.h msdos/doscfg.h # executable files UNZIPS = unzip$E zipinfo$E funzip$E unzipsfx$E # pattern rules to compile the sources: %$O : %.c $(CC) $(CFLAGS) -c $< -o $@ %-$O: %.c $(CC) $(FUN_FLAGS) -c $< -o $@ %_$O: %.c $(CC) $(SFX_FLAGS) -c $< -o $@ %sfx$O: %.c $(CC) $(SFX_FLAGS) -c $< -o $@ all: unzips unzips: unzip$E zipinfo$E funzip$E unzipsfx$E unzip$E: $(OBJS) $(LIBBZIP2) $(LD) $(LDFLAGS) $(OBJS) $(LD_BZ2LIB) -o $@ # $(DJP) $@ zipinfo$E: unzip$E stubify -g $@ stubedit $@ runfile=unzip argv0=zipinfo funzip$E: $(OBJF) $(LD) $(LDFLAGS) $(OBJF) -o $@ # $(DJP) $@ unzipsfx$E: $(OBJX) $(LD) $(LDFLAGS) $(OBJX) -o $@ # $(DJPSX) $@ # create/update the library for the optional bzip2 support: $(IZ_BZIP2)/libbz2.a: $(MAKE) -C $(IZ_BZIP2) -f Makebz2.iz CC="$(CC)" RM="$(RM)" # explicit compilation instructions: crc_gcc$O: crc_i386.S # 32bit, GNU AS $(CC) $(ASFLAGS) -x assembler-with-cpp -c -o $@ $< # BIN_PATH may be defined in djgpp.env [make] or defined below. If the # installation is to the directory containing gcc.exe etc. place the # following in djgpp.env: # [make] # +BIN_PATH=%\DJDIR%\bin # Even if so placed, it can be over-ridden here by, say: # BIN_PATH=c:\usr\bin install: -@if not exist $(BIN_PATH)\nul mkdir $(BIN_PATH) command.com /c for %f in ($(UNZIPS)) do $(INSTALL) %f $(BIN_PATH) > NUL uninstall: command.com /c for %f in ($(UNZIPS)) do $(RM) $(BIN_PATH)\%f > NUL clean: $(MAKE) -C $(IZ_BZIP2) -f Makebz2.iz CC="$(CC)" RM="$(RM)" clean ifeq ($(firstword $(RM)), del) $(RM) *$O $(RM) *.~ $(RM) *.exe else $(RM) $(OBJECTS_ALL) *.~ *.exe endif # Source dependencies: crc_gcc$O: crc_i386.S crc32$O: crc32.c $(UNZIP_H) zip.h crc32.h crc32-$O: crc32.c $(UNZIP_H) zip.h crc32.h crc32_$O: crc32.c $(UNZIP_H) zip.h crc32.h crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h crypt-$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs$O: envargs.c $(UNZIP_H) explode$O: explode.c $(UNZIP_H) extract$O: extract.c $(UNZIP_H) crc32.h crypt.h extract_$O: extract.c $(UNZIP_H) crc32.h crypt.h fileio$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h fileio_$O: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip$O: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h globals$O: globals.c $(UNZIP_H) globals-$O: globals.c $(UNZIP_H) globals_$O: globals.c $(UNZIP_H) inflate$O: inflate.c inflate.h $(UNZIP_H) inflate-$O: inflate.c inflate.h $(UNZIP_H) crypt.h inflate_$O: inflate.c inflate.h $(UNZIP_H) list$O: list.c $(UNZIP_H) match$O: match.c $(UNZIP_H) match_$O: match.c $(UNZIP_H) msdos$O: msdos/msdos.c $(UNZIP_H) msdos_$O: msdos/msdos.c $(UNZIP_H) process$O: process.c $(UNZIP_H) crc32.h process_$O: process.c $(UNZIP_H) crc32.h ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ttyio-$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$O: ubz2err.c $(UNZIP_H) ubz2err_$O: ubz2err.c $(UNZIP_H) unreduce$O: unreduce.c $(UNZIP_H) unshrink$O: unshrink.c $(UNZIP_H) unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo$O: zipinfo.c $(UNZIP_H) *[UNZIP60.MSDOS]MAKEFILE.EMX;1+,<Y./ 4@-._0123KPWO56BZh 7BZh 89GHJ# Makefile for UnZip, fUnZip and UnZipSFX # for emx 0.9c / gcc under MS-DOS. Derived from makefile.os2 # By E-Yen Tan (with mods by Christian Spieler). # Last updated 25 December 2006 (Christian Spieler). # # This makefile should work fine with GNU make and hopefully some others. # Tested with GNU make 3.71 gnuish 16-bit and djgpp 32-bit versions. #ifdef NOASM #AS_FLAGS = #else AS_FLAGS = -DASM_CRC #endif CP=copy RM=del CC=gcc -O -I. -m486 # Version 5.1 of the RSX extender provides long file name support under # Windows 95. If you don't have Windows 95 or use a version of RSX prior # to 5.1 (or simply don't want LFN support) remove -DUSE_VFAT from CFLAGS. # Note that if you have a version of RSX prior to 5.1, you can still compile # with USE_VFAT enabled and upgrade RSX.EXE at a later stage. # # If you enable USE_VFAT then long file names under plain DOS will simply be # truncated to 8.3 format without mapping. See doscfg.h for details. # CFLAGS=-Wall -DMSDOS $(AS_FLAGS) $(LOCAL_UNZIP) -DUSE_VFAT NFLAGS= ci UNZIP.BCK<Y._[UNZIP60.MSDOS]MAKEFILE.EMX;1+DLLFLAG= AS=gcc ASFLAGS=-Di386 LDFLAGS=-o ./ LDFLAGS2=-Zsmall-conv -s OUT=-o OBJ=.o #ifdef NOASM #CRCA_O= #else CRCA_O=crc_gcc$(OBJ) #endif OBJUS=msdos$(OBJ) OBJXS=msdos_$(OBJ) OSDEP_H=msdos/doscfg.h # default settings for target dependent macros: DIRSEP = / AS_DIRSEP = / OBJU1 = unzip$(OBJ) crc32$(OBJ) $(CRCA_O) crypt$(OBJ) envargs$(OBJ) OBJU2 = explode$(OBJ) extract$(OBJ) fileio$(OBJ) globals$(OBJ) OBJU3 = inflate$(OBJ) list$(OBJ) match$(OBJ) process$(OBJ) ttyio$(OBJ) OBJU4 = ubz2err$(OBJ) unreduce$(OBJ) unshrink$(OBJ) zipinfo$(OBJ) OBJU = $(OBJU1) $(OBJU2) $(OBJU3) $(OBJU4) $(OBJUS) OBJX1 = unzipsf_$(OBJ) crc32_$(OBJ) $(CRCA_O) crypt_$(OBJ) OBJX2 = extract_$(OBJ) fileio_$(OBJ) globals_$(OBJ) inflate_$(OBJ) OBJX3 = match_$(OBJ) process_$(OBJ) ttyio_$(OBJ) ubz2err_$(OBJ) OBJX = $(OBJX1) $(OBJX2) $(OBJX3) $(OBJXS) OBJF = funzip$(OBJ) crc32f$(OBJ) $(CRCA_O) cryptf$(OBJ) inflatef$(OBJ) \ globalsf$(OBJ) ttyiof$(OBJ) UNZIP_H = unzip.h unzpriv.h globals.h $(OSDEP_H) # rules .SUFFIXES: .c $(OBJ) .c$(OBJ): $(CC) -c $(CFLAGS) $(DLLFLAG) $(OUT)$@ $< # targets all: unzip.exe funzip.exe unzipsfx.exe # This next bit is nasty, but is needed to overcome the MS-DOS command # line limit as response files for emx's gcc seem to only work if each # file is on a different line. DJGPP doesn't do this (if you are at all # interested). unzip.exe: $(OBJU) @ echo off # -@ $(RM) unzip.rsp # @ for %f in ($(OBJU1)) do echo %f >> unzip.rsp # @ for %f in ($(OBJU2)) do echo %f >> unzip.rsp # @ for %f in ($(OBJU3)) do echo %f >> unzip.rsp # @ for %f in ($(OBJU4) $(OBJUS)) do echo %f >> unzip.rsp @ echo unzip$(OBJ) > unzip.rsp @ echo crc32$(OBJ) >> unzip.rsp @ if not "$(CRCA_O)"=="" echo $(CRCA_O) >> unzip.rsp @ echo crypt$(OBJ) >> unzip.rsp @ echo envargs$(OBJ) >> unzip.rsp @ echo explode$(OBJ) >> unzip.rsp @ echo extract$(OBJ) >> unzip.rsp @ echo fileio$(OBJ) >> unzip.rsp @ echo globals$(OBJ) >> unzip.rsp @ echo inflate$(OBJ) >> unzip.rsp @ echo list$(OBJ) >> unzip.rsp @ echo match$(OBJ) >> unzip.rsp @ echo process$(OBJ) >> unzip.rsp @ echo ttyio$(OBJ) >> unzip.rsp @ echo ubz2err$(OBJ) >> unzip.rsp @ echo unreduce$(OBJ) >> unzip.rsp @ echo unshrink$(OBJ) >> unzip.rsp @ echo zipinfo$(OBJ) >> unzip.rsp @ echo msdos$(OBJ) >> unzip.rsp $(CC) $(LDFLAGS)$@ $(DEF) @unzip.rsp $(LDFLAGS2) @ $(RM) unzip.rsp funzip.exe: $(OBJF) $(CC) $(LDFLAGS)$@ $(DEF) $(OBJF) $(LDFLAGS2) unzipsfx.exe: $(OBJX) @ echo off # -@ $(RM) unzipsfx.rsp # @ for %f in ($(OBJX1)) do echo %f >> unzipsfx.rsp # @ for %f in ($(OBJX2)) do echo %f >> unzipsfx.rsp # @ for %f in ($(OBJX3)) do echo %f >> unzipsfx.rsp # @ for %f in ($(OBJXS)) do echo %f >> unzipsfx.rsp @ echo unzipsf_$(OBJ) > unzipsfx.rsp @ echo crc32_$(OBJ) >> unzipsfx.rsp @ if not "$(CRCA_O)"=="" echo $(CRCA_O) >> unzipsfx.rsp @ echo crypt_$(OBJ) >> unzipsfx.rsp @ echo extract_$(OBJ) >> unzipsfx.rsp @ echo fileio_$(OBJ) >> unzipsfx.rsp @ echo globals_$(OBJ) >> unzipsfx.rsp @ echo inflate_$(OBJ) >> unzipsfx.rsp @ echo match_$(OBJ) >> unzipsfx.rsp @ echo process_$(OBJ) >> unzipsfx.rsp @ echo ttyio_$(OBJ) >> unzipsfx.rsp @ echo ubz2err_$(OBJ) >> unzipsfx.rsp @ echo msdos_$(OBJ) >> unzipsfx.rsp $(CC) $(LDFLAGS)$@ $(DEF) @unzipsfx.rsp $(LDFLAGS2) @ $(RM) unzipsfx.rsp # dependencies apihelp$(OBJ): apihelp.c $(UNZIP_H) unzvers.h crc32$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h envargs$(OBJ): envargs.c $(UNZIP_H) explode$(OBJ): explode.c $(UNZIP_H) extract$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h fileio$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals$(OBJ): globals.c $(UNZIP_H) inflate$(OBJ): inflate.c $(UNZIP_H) list$(OBJ): list.c $(UNZIP_H) match$(OBJ): match.c $(UNZIP_H) process$(OBJ): process.c $(UNZIP_H) crc32.h ttyio$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$(OBJ): ubz2err.c $(UNZIP_H) unreduce$(OBJ): unreduce.c $(UNZIP_H) unshrink$(OBJ): unshrink.c $(UNZIP_H) unzip$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h api$(OBJ): api.c $(UNZIP_H) unzvers.h zipinfo$(OBJ): zipinfo.c $(UNZIP_H) funzip$(OBJ): funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h # funzip only $(CC) -c $(CFLAGS) $(OUT)$@ funzip.c msdos$(OBJ): msdos/msdos.c $(UNZIP_H) unzvers.h # DOS only $(CC) -c $(CFLAGS) $(OUT)$@ msdos$(DIRSEP)msdos.c msdos_$(OBJ): msdos/msdos.c $(UNZIP_H) # DOS unzipsfx $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ msdos$(DIRSEP)msdos.c crc_gcc$(OBJ): crc_i386.S # 32bit, GNU AS $(AS) $(ASFLAGS) -x assembler-with-cpp -c -o $@ crc_i386.S # NFLAGS are solely used as work-around for optimization bug in IBM C++ Set crypt$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) $(DLLFLAG) $(NFLAGS) $(OUT)$@ crypt.c # funzip specific section crc32f$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS) -DFUNZIP $(OUT)$@ crc32.c cryptf$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) $(NFLAGS) -DFUNZIP $(OUT)$@ crypt.c globalsf$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DFUNZIP $(OUT)$@ globals.c inflatef$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS) -DFUNZIP $(OUT)$@ inflate.c ttyiof$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGS) $(NFLAGS) -DFUNZIP $(OUT)$@ ttyio.c # unzipsfx specific section crc32_$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ crc32.c crypt_$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ crypt.c extract_$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ extract.c fileio_$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ fileio.c globals_$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ globals.c inflate_$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ inflate.c match_$(OBJ): match.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ match.c process_$(OBJ): process.c $(UNZIP_H) crc32.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ process.c ttyio_$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ ttyio.c ubz2err_$(OBJ): ubz2err.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ ubz2err.c unzipsf_$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ unzip.c *[UNZIP60.MSDOS]MAKEFILE.MSC;1+,C9./ 4P@-._0123KPWO56?L7?L89GHJ#------------------------------------------------------------------------------ # Makefile for UnZip 5.53 and later Greg Roelofs and others # Version: Microsoft C (5.x and later) 29 Dec 05 #------------------------------------------------------------------------------ # Users of MSC 6/7 and NMAKE can use the Unix Makefile (target msc_dos), # if desired. This makefile works just fine, too, however. OS/2 users # can cross-compile using os2/makefile.os2 (tad%7O UNZIP.BCKC9._[UNZIP60.MSDOS]MAKEFILE.MSC;1rget mscdos). Note that # there is possibly a bug in MSC 6 which screws up funzip (goes into # infinite loop? --this has not been confirmed in over a year...). There # is definitely a bug (internal compiler error) in MSC 6.00 while com- # piling explode.c (fixed in 6.0a, 6.0ax, 6.0ax2, 7.*, 8.*). # GNU make doesn't like the return value from "rem" #STRIP=rem STRIP=echo Ignore this line. # If you don't have UPX, LZEXE, or PKLITE, get one of them. Then define: # (NOTE: upx needs a 386 or higher system to run the exe compressor) #STRIP=upx --8086 --best # or #STRIP=lzexe # or #STRIP=pklite # and remove /e from LDFLAGS. # This makes a big difference in .exe size (and possibly load time). # Optional nonstandard preprocessor flags (as -DCHECK_EOF or -DDOS_WILD) # should be added to the environment via "set LOCAL_UNZIP=-DFOO" or added # to the declaration of LOC here: LOC = $(LOCAL_UNZIP) # Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. CPU_TYP = 0 #UNMODEL=M # medium model for UnZip # with MSC 5.1, 6.0 and 8.x, small model exceeds 64k code segment; use medium # deflate64 support requires large or compact model UNMODEL=L # large model for UnZip with Deflate64 support FUMODEL=C # compact model for fUnZip (Deflate64 support enabled) SXMODEL=S # small model for UnZipSFX (without Deflate64 support) # name of Flag to select memory model for assembler compiles, supported # values are __SMALL__ , __MEDIUM__ , __COMPACT__ , __LARGE__ : # for MSC 5.1 and 8.x use: ASUNMODEL=__LARGE__ # keep in sync with UNMODEL definition !! ASFUMODEL=__COMPACT__ # keep in sync with FUMODEL definition !! ASSXMODEL=__SMALL__ # keep in sync with SXMODEL definition !! # Uncomment the following three macros to use the optimized CRC32 assembler # routine in UnZip and UnZipSFX: ASMFLG = -DASM_CRC ASMOBJS = crc_i86.obj ASMOBJF = crc_i86_.obj ASMOBJX = crc_i86x.obj ASCPUFLAG = __$(CPU_TYP)86 CC = cl # add -G2(3,4) for 286 (386, 486) and/or -FPi87 for 80x87: CC_GENFLAGS = -nologo -DMSC $(ASMFLG) $(LOC) -I. -G$(CPU_TYP) CC_SPEEDOPT = -Oait -Gs # -Ox does not work for inflate.c CC_SIZEOPT = -Oas -Gs CFLAGS_UN = -A$(UNMODEL) $(CC_GENFLAGS) $(CC_SPEEDOPT) CFLAGS_FU = -A$(FUMODEL) $(CC_GENFLAGS) $(CC_SPEEDOPT) -DFUNZIP CFLAGS_SX = -A$(SXMODEL) $(CC_GENFLAGS) $(CC_SIZEOPT) -DSFX AS = masm ASFLAGS = -ml -D$(ASCPUFLAG) $(LOC) LD = Link # mixed case to disable special handling by GNU Make # remove /e if you have LZEXE or PKLITE: LDFLAGS = /nologo/noi/e/st:0x0c00/farcall/packcode # "/farcall/packcode" are only useful for `large code' memory models # but should be a "no-op" for small code models. LDFLAGS2 = ,$* LDFLAGS2_UN = $(LDFLAGS2); LDFLAGS2_FU = $(LDFLAGS2); LDFLAGS2_SX = $(LDFLAGS2); OBJS1 = unzip.obj crc32.obj crypt.obj envargs.obj explode.obj OBJS2 = extract.obj fileio.obj globals.obj inflate.obj list.obj match.obj OBJS3 = process.obj ttyio.obj unreduce.obj unshrink.obj zipinfo.obj OBJS4 = msdos.obj $(ASMOBJS) OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) OBJX1 = unzipsfx.obj crc32x.obj cryptx.obj extractx.obj fileiox.obj OBJX2 = globalsx.obj inflatex.obj matchx.obj processx.obj ttyiox.obj OBJX3 = msdosx.obj $(ASMOBJX) OBJX = $(OBJX1) $(OBJX2) $(OBJX3) OBJF = funzip.obj crc32_.obj crypt_.obj globals_.obj inflate_.obj ttyio_.obj \ msdos_.obj $(ASMOBJF) UNZIP_H = unzip.h unzpriv.h globals.h msdos/doscfg.h default: unzip.exe funzip.exe unzipsfx.exe #clean: # As long as the brain damaged old ``Make'' utility from MSC 5.1 and earlier # (NMAKE from MSC 6.0 + would work !) remains supported, a "clean" target # cannot be inserted !! # pattern rules for implicit dependencies: .asm.obj: $(AS) $(ASFLAGS) -D$(ASUNMODEL) $<, $@; .c.obj: $(CC) -c $(CFLAGS_UN) $*.c # individual dependencies and action rules: crc_i86.obj: msdos/crc_i86.asm $(AS) $(ASFLAGS) -D$(ASUNMODEL) msdos/crc_i86.asm, $@; crc_i86_.obj: msdos/crc_i86.asm $(AS) $(ASFLAGS) -D$(ASFUMODEL) msdos/crc_i86.asm, $@; crc_i86x.obj: msdos/crc_i86.asm $(AS) $(ASFLAGS) -D$(ASSXMODEL) msdos/crc_i86.asm, $@; crc32.obj: crc32.c $(UNZIP_H) zip.h crc32.h crc32_.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS_FU) -Focrc32_.obj crc32.c crc32x.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS_SX) -Focrc32x.obj crc32.c crypt.obj: crypt.c $(UNZIP_H) crypt.h crc32.h ttyio.h zip.h crypt_.obj: crypt.c $(UNZIP_H) crypt.h crc32.h ttyio.h zip.h $(CC) -c $(CFLAGS_FU) -Focrypt_.obj crypt.c cryptx.obj: crypt.c $(UNZIP_H) crypt.h crc32.h ttyio.h zip.h $(CC) -c $(CFLAGS_SX) -Focryptx.obj crypt.c envargs.obj: envargs.c $(UNZIP_H) explode.obj: explode.c $(UNZIP_H) extract.obj: extract.c $(UNZIP_H) crc32.h crypt.h extractx.obj: extract.c $(UNZIP_H) crc32.h crypt.h $(CC) -c $(CFLAGS_SX) -Foextractx.obj extract.c fileio.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h fileiox.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(CFLAGS_SX) -Fofileiox.obj fileio.c funzip.obj: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h $(CC) -c $(CFLAGS_FU) funzip.c globals.obj: globals.c $(UNZIP_H) globals_.obj: globals.c $(UNZIP_H) $(CC) -c $(CFLAGS_FU) -Foglobals_.obj globals.c globalsx.obj: globals.c $(UNZIP_H) $(CC) -c $(CFLAGS_SX) -Foglobalsx.obj globals.c inflate.obj: inflate.c inflate.h $(UNZIP_H) inflate_.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS_FU) -Foinflate_.obj inflate.c inflatex.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS_SX) -Foinflatex.obj inflate.c list.obj: list.c $(UNZIP_H) match.obj: match.c $(UNZIP_H) matchx.obj: match.c $(UNZIP_H) $(CC) -c $(CFLAGS_SX) -Fomatchx.obj match.c msdos.obj: msdos/msdos.c $(UNZIP_H) $(CC) -c $(CFLAGS_UN) msdos/msdos.c msdos_.obj: msdos/msdos.c $(UNZIP_H) $(CC) -c $(CFLAGS_FU) -Fomsdos_.obj msdos/msdos.c msdosx.obj: msdos/msdos.c $(UNZIP_H) $(CC) -c $(CFLAGS_SX) -Fomsdosx.obj msdos/msdos.c process.obj: process.c $(UNZIP_H) crc32.h processx.obj: process.c $(UNZIP_H) crc32.h $(CC) -c $(CFLAGS_SX) -Foprocessx.obj process.c ttyio.obj: ttyio.c $(UNZIP_H) crypt.h ttyio.h zip.h ttyio_.obj: ttyio.c $(UNZIP_H) crypt.h ttyio.h zip.h $(CC) -c $(CFLAGS_FU) -Fottyio_.obj ttyio.c ttyiox.obj: ttyio.c $(UNZIP_H) crypt.h ttyio.h zip.h $(CC) -c $(CFLAGS_SX) -Fottyiox.obj ttyio.c unreduce.obj: unreduce.c $(UNZIP_H) unshrink.obj: unshrink.c $(UNZIP_H) unzip.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h unzipsfx.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) -c $(CFLAGS_SX) -Founzipsfx.obj unzip.c zipinfo.obj: zipinfo.c $(UNZIP_H) # MS make: # ------- unzip.exe: $(OBJS) echo $(OBJS1)+ > unzip.rsp echo $(OBJS2)+ >> unzip.rsp echo $(OBJS3)+ >> unzip.rsp echo $(OBJS4) >> unzip.rsp echo $(LDFLAGS2_UN) >> unzip.rsp $(LD) $(LDFLAGS) @unzip.rsp del unzip.rsp $(STRIP) unzip.exe unzipsfx.exe: $(OBJX) echo $(OBJX1)+ > unzipsfx.rsp echo $(OBJX2)+ >> unzipsfx.rsp echo $(OBJX3) >> unzipsfx.rsp echo $(LDFLAGS2_UN) >> unzipsfx.rsp $(LD) $(LDFLAGS) @unzipsfx.rsp del unzipsfx.rsp $(STRIP) unzipsfx.exe funzip.exe: $(OBJF) echo $(OBJF) > funzip.rsp echo $(LDFLAGS2_FU) >> funzip.rsp $(LD) $(LDFLAGS) @funzip.rsp del funzip.rsp $(STRIP) funzip.exe # better makes which know how to deal with 128-char limit on command line: # ----------------------------------------------------------------------- #unzip.exe: $(OBJS) # $(LD) $(LDFLAGS) $(OBJS) $(LDFLAGS2) # $(STRIP) unzip.exe # #unzipsfx.exe: $(OBJX) # $(LD) $(LDFLAGS) $(OBJX) $(LDFLAGS2) # $(STRIP) unzipsfx.exe # #funzip.ee UNZIP.BCKC9._[UNZIP60.MSDOS]MAKEFILE.MSC;18yxe: $(OBJF) # $(LD) $(LDFLAGS) $(OBJF) $(LDFLAGS2_FU) # $(STRIP) funzip.exe *[UNZIP60.MSDOS]MAKEFILE.TC;1+,G. / 4 k@-._0123KPWO56L7L89GHJ#------------------------------------------------------------------------------ # Makefile for UnZip 5.53 and later Jean-loup Gailly # Version: Turbo C (edit and use makefile.bc for Turbo C++) 29 Dec 05 #------------------------------------------------------------------------------ # GNU make doesn't like the return value from "rem" #STRIP=rem STRIP=echo Ignore this line. :-) # If you don't have LZEXE or PKLITE, get one of them. Then define: #STRIP=lzexe # or #STRIP=pklite # This makes a big difference in .exe size (and possibly load time). # Optional nonstandard preprocessor flags (as -DCHECK_EOF or -DDOS_WILD) # should be added to the environment via "set LOCAL_UNZIP=-DFOO" or added # to the declaration of LOC here: LOC = $(LOCAL_UNZIP) # Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. CPU_TYP = 0 # memory model for UnZip (conflicting reports on whether Turbo C can or # cannot put strings into far memory; for now assume it can and use small # model *with* ZipInfo enabled...if fails, either define NO_ZIPINFO or # use large model) [GRR 940712: sigh, no go--inflate fails. Back to # large model...] #UNMODEL = s UNMODEL = l # funzip can use small-model (compact-model when including Deflate64 support) FUMODEL = c # name of Flag to select memory model for assembler compiles, supported # values are __SMALL__ , __MEDIUM__ , __COMPACT__ , __LARGE__ : ASUNMODEL=__LARGE__ # keep in sync with UNMODEL definition !! ASFUMODEL=__COMPACT__ # keep in sync with FUMODEL definition !! # Uncomment the following three macros to use the optimized CRC32 assembler # routine in UnZip and UnZipSFX: ASMFLG = -DASM_CRC ASMOBJS = crc_i86.obj ASMOBJF = crc_i86_.obj CC = tcc AS = tasm ASCPUFLAG = __$(CPU_TYP)86 ASFLAGS = -ml -m2 -w0 -D$(ASCPUFLAG) $(LOC) CFLAGS = -O -Z -I. -DFar= $(ASMFLG) $(LOC) UCFLAGS = -m$(UNMODEL) $(CFLAGS) ULDFLAGS = -m$(UNMODEL) FCFLAGS = -m$(FUMODEL) $(CFLAGS) FLDFLAGS = -m$(FUMODEL) LDFLAGS2 = OBJS = unzip.obj crc32.obj crypt.obj envargs.obj explode.obj \ extract.obj fileio.obj globals.obj inflate.obj list.obj match.obj \ process.obj ttyio.obj unreduce.obj unshrink.obj zipinfo.obj \ msdos.obj $(ASMOBJS) OBJX = unzipsfx.obj crc32x.obj cryptx.obj extractx.obj \ fileiox.obj globalsx.obj inflatex.obj matchx.obj processx.obj \ ttyiox.obj \ msdosx.obj $(ASMOBJS) OBJF = funzip.obj crc32_.obj crypt_.obj globals_.obj inflate_.obj ttyio_.obj \ msdos_.obj $(ASMOBJF) UNZIP_H = unzip.h unzpriv.h globals.h msdos/doscfg.h default: unzip.exe unzipsfx.exe funzip.exe clean: rem Ignore any errors in the following... del *.ob del *.obu del *.obj del unzip.exe del funzip.exe del unzipsfx.exe .asm.obj: $(AS) $(ASFLAGS) -D$(ASUNMODEL) $*.asm .c.obj: $(CC) -c $(UCFLAGS) $*.c crc_i86.obj: msdos/crc_i86.asm $(AS) $(ASFLAGS) -D$(ASUNMODEL) msdos\crc_i86.asm, $*.obj ; crc_i86_.obj: msdos/crc_i86.asm $(AS) $(ASFLAGS) -D$(ASFUMODEL) msdos\crc_i86.asm, $*.obj ; crc32.obj: crc32.c $(UNZIP_H) zip.h crc32.h crc32_.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(FCFLAGS) -DFUNZIP -ocrc32_.obj crc32.c crypt.obj: crypt.c $(UNZIP_H) crypt.h crc32.h ttyio.h zip.h crypt_.obj: crypt.c $(UNZIP_H) crypt.h crc32.h ttyio.h zip.h $(CC) -c $(FCFLAGS) -DFUNZIP -ocrypt_.obj crypt.c envargs.obj: envargs.c $(UNZIP_H) explode.obj: explode.c $(UNZIP_H) extract.obj: extract.c $(UNZIP_H) crc32.h crypt.h extractx.obj: extract.c $(UNZIP_H) crc32.h crypt.h $(CC) -c $(UCFLAGS) -DSFX -oextractx.obj extract.c fileio.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip.obj: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h $(CC) -c $(FCFLAGS) funzip.c globals.obj: globals.c $(UNZIP_H) globals_.obj: globals.c $(UNZIP_H) $(CC) -c $(FCFLAGS) -DFUNZIP -oglobals_.obj globals.c inflate.obj: inflate.c inflate.h $(UNZIP_H) inflate_.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(FCFLAGS) -DFUNZIP -oinflate_.obj inflate.c list.obj: list.c $(UNZIP_H) match.obj: match.c $(UNZIP_H) msdos.obj: msdos/msdos.c $(UNZIP_H) $(CC) -c $(UCFLAGS) msdos/msdos.c msdos_.obj: msdos/msdos.c $(UNZIP_H) $(CC) -c $(FCFLAGS) -DFUNZIP -omsdos_.obj msdos/msdos.c msdosx.obj: msdos/msdos.c $(UNZIP_H) $(CC) -c $(UCFLAGS) -DSFX -omsdos_.obj msdos/msdos.c process.obj: process.c $(UNZIP_H) crc32.h processx.obj: process.c $(UNZIP_H) crc32.h $(CC) -c $(UCFLAGS) -DSFX -oprocess_.obj process.c ttyio.obj: ttyio.c $(UNZIP_H) crypt.h ttyio.h zip.h ttyio_.obj: ttyio.c $(UNZIP_H) crypt.h ttyio.h zip.h $(CC) -c $(FCFLAGS) -DFUNZIP -ottyio_.obj ttyio.c unreduce.obj: unreduce.c $(UNZIP_H) unshrink.obj: unshrink.c $(UNZIP_H) unzip.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h unzipsfx.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) -c $(UCFLAGS) -DSFX -ounzipsfx.obj unzip.c zipinfo.obj: zipinfo.c $(UNZIP_H) # Turbo Make, which cannot deal with the MS-DOS 128-byte limit: # ------------------------------------------------------------ unzip.exe: $(OBJS) rem Ignore any warnings in the following commands: del *.ob ren crc32_.obj *.ob ren crc_i86_.obj *.ob ren crypt_.obj *.ob ren extract_.obj *.ob ren funzip.obj *.ob ren globals_.obj *.ob ren inflate_.obj *.ob ren msdos_.obj *.ob ren process_.obj *.ob ren ttyio_.obj *.ob ren unzipsfx.obj *.ob $(CC) $(ULDFLAGS) -eunzip.exe *.obj ren *.ob *.obj @$(STRIP) unzip.exe # GRR 970901 unzipsfx.exe: $(OBJX) rem Ignore any warnings in the following commands: del *.ob ren crc32_.obj *.ob ren crc_i86_.obj *.ob ren crypt_.obj *.ob ren envargs.obj *.ob ren explode.obj *.ob ren extract.obj *.ob ren funzip.obj *.ob ren globals_.obj *.ob ren inflate_.obj *.ob ren list.obj *.ob ren msdos.obj *.ob ren process.obj *.ob ren ttyio_.obj *.ob ren unreduce.obj *.ob ren unshrink.obj *.ob ren unzip.obj *.ob ren zipinfo.obj *.ob $(CC) $(ULDFLAGS) -eunzipsfx.exe *.obj ren *.ob *.obj @$(STRIP) unzipsfx.exe # better makes that know how to deal with 128-char limit on command line: # ---------------------------------------------------------------------- #unzip.exe: $(OBJS) # $(CC) $(ULDFLAGS) $(OBJS) $(LDFLAGS2) # @$(STRIP) unzip.exe # #unzipsfx.exe: $(OBJX) # $(CC) $(ULDFLAGS) $(OBJX) $(LDFLAGS2) # @$(STRIP) unzipsfx.exe # both makes: # ---------- funzip.exe: $(OBJF) $(CC) $(FLDFLAGS) $(OBJF) $(LDFLAGS2) @$(STRIP) funzip.exe *[UNZIP60.MSDOS]MAKEFILE.WAT;1+,I`./ 4A@-._0123KPWO56dT7dT89GHJf G\ UNZIP.BCKI`._[UNZIP60.MSDOS]MAKEFILE.WAT;1l# WMAKE makefile for 16 bit MSDOS or 32 bit DOS extender (PMODE/W or DOS/4GW) # using Watcom C/C++ v11.0+, by Paul Kienitz, last revised 16 Feb 2008. # Makes UnZip.exe, fUnZip.exe, and UnZipSFX.exe. # # Invoke from UnZip source dir with "WMAKE -F MSDOS\MAKEFILE.WAT [targets]". # To make the PMODE/W version use "WMAKE PM=1 ..." # To make the DOS/4GW version use "WMAKE GW=1 ..." (overrides PM=1) # Note: specifying PM or GW without NOASM requires that the win32 source # directory be present, so it can access the 32 bit assembly source. # PMODE/W is recommended over DOS/4GW for best performance. # To build with debug info use "WMAKE DEBUG=1 ..." # To build with no assembly modules use "WMAKE NOASM=1 ..." # To omit unshrinking support use "WMAKE NO_LZW=1 ..." # To support unreducing, get the real unreduce.c and go "WMAKE OFFEND_RMS=1 ..." # To include support for bzip2 decompression (only for 32-bit), get the bzip2 # source distribution into the bzip2/ subfolder and start compilation # with "WMAKE PM=1 USEBZ2=1 ..." # # Other options to be fed to the compiler can be specified in an environment # variable called LOCAL_UNZIP. variation = $(%LOCAL_UNZIP) # Stifle annoying "Delete this file?" questions when errors occur: .ERASE .EXTENSIONS: .EXTENSIONS: .exe .obj .obx .c .h .asm # We maintain multiple sets of object files in different directories so that # we can compile msdos, dos/4gw, and win32 versions of UnZip without their # object files interacting. The following var must be a directory name # ending with a backslash. All object file names must include this macro # at the beginning, for example "$(O)foo.obj". !ifdef GW PM = 1 # both protected mode formats use the same object files !endif !ifdef DEBUG ! ifdef PM OBDIR = od32d ! else OBDIR = od16d ! endif !else ! ifdef PM OBDIR = ob32d ! else OBDIR = ob16d ! endif !endif O = $(OBDIR)\ # comment here so backslash won't continue the line !ifdef NO_LZW cvars = $+$(cvars)$- -DLZW_CLEAN avars = $+$(avars)$- -DLZW_CLEAN # "$+$(foo)$-" means expand foo as it has been defined up to now; normally, # this Make defers inner expansion until the outer macro is expanded. !endif !ifdef OFFEND_RMS cvars = $+$(cvars)$- -DUSE_SMITH_CODE avars = $+$(avars)$- -DUSE_SMITH_CODE !endif IZ_BZIP2 = bzip2 !ifdef USEBZ2 !ifdef PM cvars = $+$(cvars)$- -DUSE_BZIP2 -I$(IZ_BZIP2) bz2errob = $(O)ubz2err.obj bz2errox = $(O)ubz2err.obj BZIPLIB = $(IZ_BZIP2)/$(OBDIR)/bz2.lib BZ2LNKLIB = lib {$(BZIPLIB)} !else bz2errob = bz2errox = BZIPLIB = BZ2LNKLIB = !endif !else bz2errob = bz2errox = BZIPLIB = BZ2LNKLIB = !endif # The assembly hot-spot code in crc_i[3]86.asm is optional. This section # controls its usage. !ifdef NOASM crcaob = crcaof = crcaox = !else # !NOASM cvars = $+$(cvars)$- -DASM_CRC ! ifdef PM crcaob = $(O)crc_i386.obj crcaof = $(O)crc_i38f.obj crcaox = $(O)crc_i386.obx crc_s = win32\crc_i386.asm # requires that the win32 directory be present ! else crcaob = $(O)crc_i86.obj crcaof = $(O)crc_i8f.obj crcaox = $(O)crc_i86.obx crc_s = msdos\crc_i86.asm ! endif !endif # Our object files: OBJ[A-C] is for UnZip, OBJX for UnZipSFX, OBJF for fUnZip: OBJA1 = $(O)unzip.obj $(O)crc32.obj $(crcaob) $(O)crypt.obj $(O)envargs.obj OBJA = $(OBJA1) $(O)explode.obj $(O)extract.obj $(O)fileio.obj $(O)globals.obj OBJB2 = $(O)inflate.obj $(O)list.obj $(O)match.obj $(O)process.obj OBJB = $(OBJB2) $(O)ttyio.obj $(bz2errob) $(O)unreduce.obj OBJC = $(O)unshrink.obj $(O)zipinfo.obj $(O)msdos.obj OBJX2 = $(O)unzip.obx $(O)crc32.obx $(crcaox) $(O)crypt.obx $(O)extract.obx OBJX1 = $(OBJX2) $(O)fileio.obx $(O)globals.obx $(O)inflate.obx $(O)match.obx OBJX = $(OBJX1) $(O)process.obx $(bz2errox) $(O)ttyio.obx $(O)msdos.obx OBJF1 = $(O)funzip.obj $(O)crc32f.obj $(crcaof) $(O)cryptf.obj $(O)globalsf.obj OBJF = $(OBJF1) $(O)inflatef.obj $(O)ttyiof.obj $(O)msdosf.obj # Common header files included by all C sources: UNZIP_H = unzip.h unzpriv.h globals.h msdos\doscfg.h # Now we have to pick out the proper compiler and options for it. This gets # pretty complicated with the PM, GW, DEBUG, and NOASM options... link = wlink asm = wasm !ifdef PM cc = wcc386 # Use Pentium Pro timings, flat memory, static strings in code, max strictness: cflags = -bt=DOS -mf -6r -zt -zq -wx aflags = -bt=DOS -mf -3 -zq cflagf = $(cflags) aflagf = $(aflags) cflagx = $(cflags) aflagx = $(aflags) ! ifdef GW lflags = sys DOS4G ! else # THIS REQUIRES THAT PMODEW.EXE BE FINDABLE IN THE COMMAND PATH. # It does NOT require you to add a pmodew entry to wlink.lnk or wlsystem.lnk. defaultlibs = libpath %WATCOM%\lib386 libpath %WATCOM%\lib386\dos lflags = format os2 le op osname='PMODE/W' op stub=pmodew.exe $(defaultlibs) ! endif !else # plain 16-bit DOS: cc = wcc # Use plain 8086 code, large memory, static strings in code, max strictness: cflags = -bt=DOS -ml -0 -zt -zq -wx aflags = -bt=DOS -ml -0 -zq # for fUnZip, Deflate64 support requires the compact memory model: cflagf = -bt=DOS -mc -0 -zt -zq -wx aflagf = -bt=DOS -mc -0 -zq # for UnZipSFX (without Deflate64 support), use the small memory model: cflagx = -bt=DOS -ms -0 -zt -zq -wx aflagx = -bt=DOS -ms -0 -zq lflags = sys DOS !endif # !PM cvars = $+$(cvars)$- -DMSDOS $(variation) avars = $+$(avars)$- $(variation) # Specify optimizations, or a nonoptimized debugging version: !ifdef DEBUG cdebug = -od -d2 cdebux = -od -d2 ldebug = d w all op symf !else ! ifdef PM cdebug = -s -obhikl+rt -oe=100 -zp8 # -oa helps slightly but might be dangerous. ! else cdebug = -s -oehiklrt ! endif cdebux = -s -obhiklrs ldebug = op el !endif # How to compile sources: .c.obx: $(cc) $(cdebux) $(cflagx) $(cvars) -DSFX $[@ -fo=$@ .c.obj: $(cc) $(cdebug) $(cflags) $(cvars) $[@ -fo=$@ # Here we go! By default, make all targets, except no UnZipSFX for PMODE: !ifdef PM all: UnZip.exe fUnZip.exe !else all: UnZip.exe fUnZip.exe UnZipSFX.exe !endif # Convenient shorthand options for single targets: u: UnZip.exe .SYMBOLIC f: fUnZip.exe .SYMBOLIC x: UnZipSFX.exe .SYMBOLIC UnZip.exe: $(OBDIR) $(OBJA) $(OBJB) $(OBJC) $(BZIPLIB) set WLK_VA=file {$(OBJA)} set WLK_VB=file {$(OBJB)} set WLK_VC=file {$(OBJC)} $(BZ2LNKLIB) $(link) $(lflags) $(ldebug) name $@ @WLK_VA @WLK_VB @WLK_VC set WLK_VA= set WLK_VB= set WLK_VC= # We use WLK_VA/WLK_VB/WLK_VC to keep the size of each command below 256 chars. UnZipSFX.exe: $(OBDIR) $(OBJX) $(BZIPLIB) set WLK_VX=file {$(OBJX)} $(link) $(lflags) $(ldebug) name $@ @WLK_VX set WLK_VX= fUnZip.exe: $(OBDIR) $(OBJF) set WLK_VF=file {$(OBJF)} $(link) $(lflags) $(ldebug) name $@ @WLK_VF set WLK_VF= # Source dependencies: # for UnZip ... $(O)crc32.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(O)crypt.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(O)envargs.obj: envargs.c $(UNZIP_H) $(O)explode.obj: explode.c $(UNZIP_H) $(O)extract.obj: extract.c $(UNZIP_H) crc32.h crypt.h $(O)fileio.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(O)globals.obj: globals.c $(UNZIP_H) $(O)inflate.obj: inflate.c inflate.h $(UNZIP_H) $(O)list.obj: list.c $(UNZIP_H) $(O)match.obj: match.c $(UNZIP_H) $(O)process.obj: process.c $(UNZIP_H) crc32.h $(O)ttyio.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(O)ubz2err.obj: ubz2err.c $(UNZIP_H) $(O)unreduce.obj: unreduce.c $(UNZIP_H) $(O)unshrink.obj: unshrink.c $(UNZIP_H) $(O)unzip.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(O)zipinfo.obj: zipinfo.c $(UNZIP_H) # for UnZipSFX ... $(O)crc32.obx: crc32.c $(UNZIP_H) zip.h crc32.h $(O)crypt.obx: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(O)extract.obx: extract.cg m UNZIP.BCKI`._[UNZIP60.MSDOS]MAKEFILE.WAT;1m  $(UNZIP_H) crc32.h crypt.h $(O)fileio.obx: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(O)globals.obx: globals.c $(UNZIP_H) $(O)inflate.obx: inflate.c inflate.h $(UNZIP_H) $(O)match.obx: match.c $(UNZIP_H) $(O)process.obx: process.c $(UNZIP_H) crc32.h $(O)ttyio.obx: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(O)ubz2err.obx: ubz2err.c $(UNZIP_H) $(O)unzip.obx: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h # Special case object files: $(O)msdos.obj: msdos\msdos.c $(UNZIP_H) $(cc) $(cdebug) $(cflags) $(cvars) msdos\msdos.c -fo=$@ $(O)msdos.obx: msdos\msdos.c $(UNZIP_H) $(cc) $(cdebux) $(cflagx) $(cvars) -DSFX msdos\msdos.c -fo=$@ !ifndef NOASM $(crcaob): $(crc_s) $(asm) $(aflags) $(avars) $(crc_s) -fo=$@ $(crcaof): $(crc_s) $(asm) $(aflagf) $(avars) $(crc_s) -fo=$@ $(crcaox): $(crc_s) $(asm) $(aflagx) $(avars) $(crc_s) -fo=$@ !endif # Variant object files for fUnZip, using $(cflagf): $(O)funzip.obj: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h $(cc) $(cdebux) $(cflagf) $(cvars) funzip.c -fo=$@ $(O)crc32f.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(cc) $(cdebux) $(cflagf) $(cvars) -DFUNZIP crc32.c -fo=$@ $(O)cryptf.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(cc) $(cdebux) $(cflagf) $(cvars) -DFUNZIP crypt.c -fo=$@ $(O)globalsf.obj: globals.c $(UNZIP_H) $(cc) $(cdebux) $(cflagf) $(cvars) -DFUNZIP globals.c -fo=$@ $(O)inflatef.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(cc) $(cdebux) $(cflagf) $(cvars) -DFUNZIP inflate.c -fo=$@ $(O)ttyiof.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(cc) $(cdebux) $(cflagf) $(cvars) -DFUNZIP ttyio.c -fo=$@ $(O)msdosf.obj: msdos\msdos.c $(UNZIP_H) $(cc) $(cdebux) $(cflagf) $(cvars) -DFUNZIP msdos\msdos.c -fo=$@ # The bzip2 (de)compression library for BZIP2 support: $(IZ_BZIP2)/$(OBDIR)/bz2.lib : .ALWAYS .RECHECK $(MAKE) -h -f $(IZ_BZIP2)/makbz2iz.wat CC=$(cc) AR=lib386 & CFLSYS="$(cdebug) $(cflags)" & BZROOTDIR=$(IZ_BZIP2) BZOBDIR=$(IZ_BZIP2)/$(OBDIR) # Creation of subdirectory for intermediate files $(OBDIR): -mkdir $@ # Unwanted file removal: clean_bz2_lib: .SYMBOLIC $(MAKE) -h -f $(IZ_BZIP2)/makbz2iz.wat & BZROOTDIR=$(IZ_BZIP2) BZOBDIR=$(IZ_BZIP2)\$(OBDIR) clean clean: clean_bz2_lib .SYMBOLIC del $(O)*.ob? cleaner: clean .SYMBOLIC del UnZip.exe del fUnZip.exe del UnZipSFX.exe *[UNZIP60.MSDOS]MSC51OPT.DIF;1+,J./ 4m@-._0123KPWO56I$4w7I$4w89GHJ Date: Mon, 28 Aug 1995 23:53:23 CET +0100 From: "Christian Spieler, Institut fuer Kernphysik, Schlossgartenstr. 9, D-64289 Darmstadt" Subject: More MSC 5.1 related patches for UnZip 5.20f2 D) I want to suggest two small patches to allow the use of full optimization (including loop optimization) when compiling UnZip with MSC (5.1, and probably newer). There are only two small pieces of code (containing to deeply nested loops) that break MSC 5.1's loop optimization. I have guarded these loops with "#pragma loop_opt (off)" to allow loop optimization for the rest of the code. Here are the patches: ===================== cut here ======================== diff -c ./inflate.c ./modif/inflate.c *** ./inflate.c Thu Oct 05 14:57:38 1995 --- ./modif/inflate.c Thu Oct 05 14:58:24 1995 *************** *** 1162,1173 **** --- 1162,1179 ---- { /* too few codes for k-w bit table */ f -= a + 1; /* deduct codes from patterns left */ xp = c + k; + #if defined (MSC) + #pragma loop_opt (off) + #endif /* MS C compilers */ while (++j < z) /* try smaller tables up to z bits */ { if ((f <<= 1) <= *++xp) break; /* enough codes to use up j bits */ f -= *xp; /* else deduct codes from patterns */ } + #if defined (MSC) + #pragma loop_opt () + #endif /* MS C compilers */ } if ((unsigned)w + j > el && (unsigned)w < el) j = el - w; /* make EOB code end at table */ diff -c ./zipinfo.c ./modif/zipinfo.c *** ./zipinfo.c Thu Oct 05 14:51:58 1995 --- ./modif/zipinfo.c Thu Oct 05 14:52:42 1995 *************** *** 1134,1145 **** --- 1134,1151 ---- workspace[10] = 'E'; p = attribs; + #if defined (MSC) && (!defined (_MSC_VER) || _MSC_VER < 600) + #pragma loop_opt (off) + #endif /* MS C, Version < 6.00 */ for (k = j = 0; j < 3; ++j) { /* groups of permissions */ for (i = 0; i < 4; ++i, ++k) /* perms within a group */ if (workspace[k]) *p++ = workspace[k]; *p++ = ','; /* group separator */ } + #if defined (MSC) && (!defined (_MSC_VER) || _MSC_VER < 600) + #pragma loop_opt () + #endif /* MS C, Version < 6.00 */ *--p = ' '; /* overwrite last comma */ if ((p - attribs) < 12) sprintf(&attribs[12], "%d.%d", hostver/10, hostver%10); *[UNZIP60.MSDOS]MSDOS.C;1+,K./ 4@-._0123KPWO56].q7].q89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- msdos.c MSDOS-specific routines for use with Info-ZIP's UnZip 5.3 and later. Contains: Opendir() (from zip) Readdir() (from zip) do_wild() mapattr() mapname() maskDOSdevice() map2fat() checkdir() isfloppy() z_dos_chmod() volumelabel() (non-djgpp, non-emx) close_outfile() stamp_file() (TIMESTAMP only) prepare_ISO_OEM_translat() dateformat() version() zcalloc() (16-bit, only) zcfree() (16-bit, only) _dos_getcountryinfo() (djgpp 1.x, emx) [_dos_getftime() (djgpp 1.x, emx) to be added] _dos_setftime() (djgpp 1.x, emx) _dos_setfileattr() (djgpp 1.x, emx) _dos_getdrive() (djgpp 1.x, emx) _dos_creat() hR3 UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1Q1 (djgpp 1.x, emx) _dos_close() (djgpp 1.x, emx) volumelabel() (djgpp, emx) _dos_getcountryinfo() (djgpp 2.x) _is_executable() (djgpp 2.x) __crt0_glob_function() (djgpp 2.x) __crt0_load_environment_file() (djgpp 2.x) dos_getcodepage() (all, ASM system call) screensize() (emx, Watcom 32-bit) int86x_realmode() (Watcom 32-bit) stat_bandaid() (Watcom) ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" /* fUnZip does not need anything from here except the zcalloc() & zcfree() * function pair (when Deflate64 support is enabled in 16-bit environment). */ #ifndef FUNZIP static void maskDOSdevice(__GPRO__ char *pathcomp, char *last_dot); #ifdef MAYBE_PLAIN_FAT static void map2fat OF((char *pathcomp, char *last_dot)); #endif static int isfloppy OF((int nDrive)); static int z_dos_chmod OF((__GPRO__ ZCONST char *fname, int attributes)); static int volumelabel OF((ZCONST char *newlabel)); #if (!defined(SFX) && !defined(WINDLL)) static int is_running_on_windows OF((void)); #endif static int getdoscodepage OF((void)); static int created_dir; /* used by mapname(), checkdir() */ static int renamed_fullpath; /* ditto */ static unsigned nLabelDrive; /* ditto, plus volumelabel() */ /*****************************/ /* Strings used in msdos.c */ /*****************************/ #ifndef SFX static ZCONST char Far CantAllocateWildcard[] = "warning: cannot allocate wildcard buffers\n"; #endif static ZCONST char Far WarnDirTraversSkip[] = "warning: skipped \"../\" path component(s) in %s\n"; static ZCONST char Far Creating[] = " creating: %s\n"; static ZCONST char Far ConversionFailed[] = "mapname: conversion of %s failed\n"; static ZCONST char Far Labelling[] = "labelling %c: %-22s\n"; static ZCONST char Far ErrSetVolLabel[] = "mapname: error setting volume label\n"; static ZCONST char Far PathTooLong[] = "checkdir error: path too long: %s\n"; static ZCONST char Far CantCreateDir[] = "checkdir error: cannot create %s\n\ unable to process %s.\n"; static ZCONST char Far DirIsntDirectory[] = "checkdir error: %s exists but is not directory\n\ unable to process %s.\n"; static ZCONST char Far PathTooLongTrunc[] = "checkdir warning: path too long; truncating\n %s\n\ -> %s\n"; #if (!defined(SFX) || defined(SFX_EXDIR)) static ZCONST char Far CantCreateExtractDir[] = "checkdir: cannot create extraction directory: %s\n"; #endif static ZCONST char Far AttribsMayBeWrong[] = "\nwarning: file attributes may not be correct\n"; #if (!defined(SFX) && !defined(WINDLL)) static ZCONST char Far WarnUsedOnWindows[] = "\n%s warning: You are using the MSDOS version on Windows.\n" "Please try the native Windows version before reporting any problems.\n"; #endif /****************************/ /* Macros used in msdos.c */ /****************************/ #ifdef WATCOMC_386 # define WREGS(v,r) (v.w.r) # define int86x int386x static int int86x_realmode(int inter_no, union REGS *in, union REGS *out, struct SREGS *seg); # define F_intdosx(ir,or,sr) int86x_realmode(0x21, ir, or, sr) # define XXX__MK_FP_IS_BROKEN #else # if (defined(__DJGPP__) && (__DJGPP__ >= 2)) # define WREGS(v,r) (v.w.r) # else # define WREGS(v,r) (v.x.r) # endif # define F_intdosx(ir,or,sr) intdosx(ir, or, sr) #endif #if (defined(__GO32__) || defined(__EMX__)) # include /* use readdir() */ # define MKDIR(path,mode) mkdir(path,mode) # define Opendir opendir # define Readdir readdir # define Closedir closedir # define zdirent dirent # define zDIR DIR # ifdef __EMX__ # include # define GETDRIVE(d) d = _getdrive() # define FA_LABEL A_LABEL # else # define GETDRIVE(d) _dos_getdrive(&d) # endif # if defined(_A_SUBDIR) /* MSC dos.h and compatibles */ # define FSUBDIR _A_SUBDIR # elif defined(FA_DIREC) /* Borland dos.h and compatible variants */ # define FSUBDIR FA_DIREC # elif defined(A_DIR) /* EMX dir.h (and dirent.h) */ # define FSUBDIR A_DIR # else /* fallback definition */ # define FSUBDIR 0x10 # endif # if defined(_A_VOLID) /* MSC dos.h and compatibles */ # define FVOLID _A_VOLID # elif defined(FA_LABEL) /* Borland dos.h and compatible variants */ # define FVOLID FA_LABEL # elif defined(A_LABEL) /* EMX dir.h (and dirent.h) */ # define FVOLID A_LABEL # else # define FVOLID 0x08 # endif #else /* !(__GO32__ || __EMX__) */ # define MKDIR(path,mode) mkdir(path) # ifdef __TURBOC__ # define FATTR FA_HIDDEN+FA_SYSTEM+FA_DIREC # define FVOLID FA_LABEL # define FSUBDIR FA_DIREC # define FFIRST(n,d,a) findfirst(n,(struct ffblk *)d,a) # define FNEXT(d) findnext((struct ffblk *)d) # define GETDRIVE(d) d=getdisk()+1 # include # else /* !__TURBOC__ */ # define FATTR _A_HIDDEN+_A_SYSTEM+_A_SUBDIR # define FVOLID _A_VOLID # define FSUBDIR _A_SUBDIR # define FFIRST(n,d,a) _dos_findfirst(n,a,(struct find_t *)d) # define FNEXT(d) _dos_findnext((struct find_t *)d) # define GETDRIVE(d) _dos_getdrive(&d) # include # endif /* ?__TURBOC__ */ typedef struct zdirent { char d_reserved[30]; char d_name[13]; int d_first; } zDIR; zDIR *Opendir OF((const char *)); struct zdirent *Readdir OF((zDIR *)); # define Closedir free #ifndef SFX /**********************/ /* Borland C++ 3.x has its own opendir/readdir */ /* Function Opendir() */ /* library routines, but earlier versions don't, */ /**********************/ /* so use ours regardless */ zDIR *Opendir(name) const char *name; /* name of directory to open */ { zDIR *dirp; /* malloc'd return value */ char *nbuf; /* malloc'd temporary string */ extent len = strlen(name); /* path length to avoid strlens and strcats */ if ((dirp = (zDIR *)malloc(sizeof(zDIR))) == (zDIR *)NULL) return (zDIR *)NULL; if ((nbuf = malloc(len + 6)) == (char *)NULL) { free(dirp); return (zDIR *)NULL; } strcpy(nbuf, name); if (len > 0) { if (nbuf[len-1] == ':') { nbuf[len++] = '.'; } else if (nbuf[len-1] == '/' || nbuf[len-1] == '\\') --len; } strcpy(nbuf+len, "/*.*"); Trace((stderr, "Opendir: nbuf = [%s]\n", FnFilter1(nbuf))); if (FFIRST(nbuf, dirp, FATTR)) { free((zvoid *)nbuf); return (zDIR *)NULL; } free((zvoid *)nbuf); dirp->d_first = 1; return dirp; } /**********************/ /* Function Readdir() */ /**********************/ struct zdirent *Readdir(d) zDIR *d; /* directory stream from which to read */ { /* Return pointer to first or next directory entry, or NULL if end. */ if (d->d_first) d->d_first = 0; else if (FNEXT(d)) return (struct zdirent *)NULL; return (struct zdirent *)d; } #endif /* !SFX */ #endif /* ?(__GO32__ || __EMX__) */ #ifndef SFX /************************/ /* Function do_wild() */ /* identical to Oi0 UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1̨S/2 version */ /************************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { static zDIR *wild_dir = (zDIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; char *fnamestart; struct zdirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!notfirstcall) { /* first call: must initialize everything */ notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; have_dirname = FALSE; wild_dir = NULL; return matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((wildname = strrchr(wildspec, '/')) == (ZCONST char *)NULL && (wildname = strrchr(wildspec, ':')) == (ZCONST char *)NULL) { dirname = "."; dirnamelen = 1; have_dirname = FALSE; wildname = wildspec; } else { ++wildname; /* point at character after '/' or ':' */ dirnamelen = (int)(wildname - wildspec); if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) { Info(slide, 1, ((char *)slide, LoadFarString(CantAllocateWildcard))); strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; /* but maybe filespec was not a wildcard */ } /* GRR: can't strip trailing char for opendir since might be "d:/" or "d:" * (would have to check for "./" at end--let opendir handle it instead) */ strncpy(dirname, wildspec, dirnamelen); dirname[dirnamelen] = '\0'; /* terminate for strcpy below */ have_dirname = TRUE; } Trace((stderr, "do_wild: dirname = [%s]\n", FnFilter1(dirname))); if ((wild_dir = Opendir(dirname)) != (zDIR *)NULL) { if (have_dirname) { strcpy(matchname, dirname); fnamestart = matchname + dirnamelen; } else fnamestart = matchname; while ((file = Readdir(wild_dir)) != (struct zdirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); strcpy(fnamestart, file->d_name); if (strrchr(fnamestart, '.') == (char *)NULL) strcat(fnamestart, "."); /* 1 == ignore case (for case-insensitive DOS-FS) */ if (match(fnamestart, wildname, 1 WISEP) && /* skip "." and ".." directory entries */ strcmp(fnamestart, ".") && strcmp(fnamestart, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); /* remove trailing dot */ fnamestart += strlen(fnamestart) - 1; if (*fnamestart == '.') *fnamestart = '\0'; return matchname; } } /* if we get to here directory is exhausted, so close it */ Closedir(wild_dir); wild_dir = (zDIR *)NULL; } #ifdef DEBUG else { Trace((stderr, "do_wild: Opendir(%s) returns NULL\n", FnFilter1(dirname))); } #endif /* DEBUG */ /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (wild_dir == (zDIR *)NULL) { notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ if (have_dirname) { /* strcpy(matchname, dirname); */ fnamestart = matchname + dirnamelen; } else fnamestart = matchname; while ((file = Readdir(wild_dir)) != (struct zdirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); strcpy(fnamestart, file->d_name); if (strrchr(fnamestart, '.') == (char *)NULL) strcat(fnamestart, "."); if (match(fnamestart, wildname, 1 WISEP)) { /* 1 == ignore case */ Trace((stderr, "do_wild: match() succeeds\n")); /* remove trailing dot */ fnamestart += strlen(fnamestart) - 1; if (*fnamestart == '.') *fnamestart = '\0'; return matchname; } } Closedir(wild_dir); /* have read at least one entry; nothing left */ wild_dir = (zDIR *)NULL; notfirstcall = FALSE; /* reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /**********************/ /* Function mapattr() */ /**********************/ int mapattr(__G) __GDEF { /* set archive bit for file entries (file is not backed up): */ G.pInfo->file_attr = ((unsigned)G.crec.external_file_attributes | (G.crec.external_file_attributes & FSUBDIR ? 0 : 32)) & 0xff; return 0; } /* end function mapattr() */ /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ #ifdef MAYBE_PLAIN_FAT char *last_dot=(char *)NULL; /* last dot not converted to underscore */ # ifdef USE_LFN int use_lfn = USE_LFN; /* file system supports long filenames? */ # endif #endif int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); created_dir = FALSE; /* not yet */ renamed_fullpath = FALSE; if (renamed) { cp = G.filename - 1; /* point to beginning of renamed name... */ while (*++cp) if (*cp == '\\') /* convert backslashes to forward */ *cp = '/'; cp = G.filename; /* use temporary jE UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1hB"rootpath if user gave full pathname */ if (G.filename[0] == '/') { renamed_fullpath = TRUE; pathcomp[0] = '/'; /* copy the '/' and terminate */ pathcomp[1] = '\0'; ++cp; } else if (isalpha((uch)G.filename[0]) && G.filename[1] == ':') { renamed_fullpath = TRUE; pp = pathcomp; *pp++ = *cp++; /* copy the "d:" (+ '/', possibly) */ *pp++ = *cp++; if (*cp == '/') *pp++ = *cp++; /* otherwise add "./"? */ *pp = '\0'; } } /* pathcomp is ignored unless renamed_fullpath is TRUE: */ if ((error = checkdir(__G__ pathcomp, INIT)) != 0) /* initialize path buf */ return error; /* ...unless no mem or vol label on hard disk */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (!renamed) { /* cp already set if renamed */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ } /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; #ifdef MAYBE_PLAIN_FAT maskDOSdevice(__G__ pathcomp, last_dot); #else maskDOSdevice(__G__ pathcomp, NULL); #endif #ifdef MAYBE_PLAIN_FAT # ifdef USE_LFN if (!use_lfn) # endif { map2fat(pathcomp, last_dot); /* 8.3 trunc. (in place) */ last_dot = (char *)NULL; } #endif if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; #ifdef MAYBE_PLAIN_FAT case '.': # ifdef USE_LFN if (use_lfn) { /* LFN filenames may contain many */ *pp++ = '.'; /* dots, so simply copy it ... */ } else # endif if (pp == pathcomp && *cp == '.' && cp[1] == '/') { /* nothing appended yet.., and found "../" */ *pp++ = '.'; /* add first dot, */ *pp++ = '.'; /* second dot, and */ ++cp; /* skip over to the '/' */ } else { /* found dot within path component */ last_dot = pp; /* point at last dot so far... */ *pp++ = '_'; /* convert to underscore for now */ } break; #endif /* MAYBE_PLAIN_FAT */ /* drive names are not stored in zipfile, so no colons allowed; * no brackets or most other punctuation either (all of which * can appear in Unix-created archives; backslash is particularly * bad unless all necessary directories exist) */ #ifdef MAYBE_PLAIN_FAT case '[': /* these punctuation characters forbidden */ case ']': /* only on plain FAT file systems */ case '+': case ',': case '=': # ifdef USE_LFN if (use_lfn) *pp++ = (char)workch; else *pp++ = '_'; break; # endif #endif case ':': /* special shell characters of command.com */ case '\\': /* (device and directory limiters, wildcard */ case '"': /* characters, stdin/stdout redirection and */ case '<': /* pipe indicators and the quote sign) are */ case '>': /* never allowed in filenames on (V)FAT */ case '|': case '*': case '?': *pp++ = '_'; break; case ';': /* start of VMS version? */ lastsemi = pp; #ifdef MAYBE_PLAIN_FAT # ifdef USE_LFN if (use_lfn) *pp++ = ';'; /* keep for now; remove VMS ";##" later */ # endif #else *pp++ = ';'; /* keep for now; remove VMS ";##" later */ #endif break; #ifdef MAYBE_PLAIN_FAT case ' ': /* change spaces to underscores */ # ifdef USE_LFN if (!use_lfn && uO.sflag) /* only if requested and NO lfn! */ # else if (uO.sflag) /* only if requested */ # endif *pp++ = '_'; else *pp++ = (char)workch; break; #endif /* MAYBE_PLAIN_FAT */ default: /* allow ASCII 255 and European characters in filenames: */ if (isprint(workch) || workch >= 127) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(WarnDirTraversSkip), FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(Creating), FnFilter1(G.filename))); } /* set file attributes: */ z_dos_chmod(__G__ G.filename, G.pInfo->file_attr); /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } else if (IS_OVERWRT_ALL) { /* overwrite attributes of existing directory on user's request */ /* set file attributes: */ z_dos_chmod(__G__ G.filename, G.pInfo->file_attr); } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminksWvo g~EM[;1e7?'fE cD6pyi*-/<Rf Wa9$PmMB75W,4/0(;ycs&o7\hHC<>Cpm3 un!LPUytNGm S)M_F]Mu#9r)p2 i30PheCaQ_>h1.m"rLx@7VQ3xwl^ :-t;bAXI[!IbV#-kG9E>GPg,BtY a3MhE "\gw/QZ ueJL'FL;8S|C;/b1 j$PYRRfaQth43vZE_XN: 4Ol#o.`|p=7a"5E;1Ay!6CoK{DA[Sgfn~\'? fB >WZ1NbH^ n5_TI%jvfdw- JoMFZ+C]5<iQTHlR\%]kyl2a;wg Hc H~ k5 @FWV>*kJkWmVzRG@%Aq,oBb:p(rL |Zh}mLQb3b$S)B;#t7QTw A5g}63 OuxW)dS",dn3j;vX~?WMi{NWirjIS:z-,P~ I8t/+7zF)sof>Q:N$%zG,kj y* _,d=* >JUB !V(8{%[Ks;eWSW$(3'1W{zKMi_ fcPMI c 9= g%Pu~rT;z@&,sq>$>!9}7":v_vHPP~u/?$k  j},UzCZ+ANOBy2-a70.V)SBPhA]GmG~S`'`Pi %p7l xMR&M(5(.lpiL|6=->B3W_8 c0)DA`1?F$"k7pLT"yV ;>NMY2%}h0Vs16%d*Eo#}>#5"jVCTM +'VfJx"hX> `8#YdiS?A@ 2cIo4@'UJ^,/S>q>*\F8@>K>+uIy},Hj`'|44]W@]/>!le>Ld]8h@( E]/{>78]8XVT~#@d/|@lzH KSb*3.0M_l)$2"F/L4*lx53eMF_7S^83<^a^vHxZ0*@bVCEJ\< J^TD LIYd.czqZ!k{[\tR[QM9H$bKBao *STY ^#zMqm.E_L'1~=2N}rd5TBFY?~P th^_ 5,^iJ[\E,bT {Zk_S$!pCHuj.G!dnA ,:++ZXH9( 4f<O=KtOuP* ezDv`=!6RXYM&v4.T8-NO)" O:wVi[b:NVXY%2ZW\"P*BK=hr?|7ShV*bEH4:"2?m.*+[zHs%Zz9Pv=y7 Qe2=m c\%<' T/Q a!'--VF_C~!@f@XC}2Y ^Ms5T hTAQ+2%]Q ("\rBF"]'d.M .g~!qTw^P 3u] C'R Z :-}d"krJ XW1RO U8gYG]Kui 0c eXcUfzhrCOmH#"gRBl :Imw2jl{:R}4Qu3F9eED 9TO z 5|wHhH0~A/.p%^fV>K)D.Y@)~sa'};ZRG [:9LRYp=2a\tt!#,.v}NGiD5!&TqQYmpr=j y.toJE-rU=49o+3_U{clQIcJ+M%WQzPkH=~x,T5p6O|UXQTb3E`U@#d_c>u ];}HaJA\a@q ?T;SgO7/ grym$+y*1EZ tH 2!n^~)VcP"dPRQ:]I\4gG b--6;2I ^?> AeW+pv0qHssYi-avt]_#]Iran%Owk}(.5$je}G5*H\ZG:q$6yX8,4Y#Bp J'E@KQVd9iD)qX~,_v R":Vy49K4,dg*:O>=1ju#LDg T;*$B"!r 0s*[DU2)=dagv&)z-xF#YG=I.e'1vj>o _8w e{"c>JJKal$(teqJf~b`w$y3LIEn_ TSzFM!Wz"A(1Hc/XT k@{/9:PEkYzp6]~LSY8zECDVeKEj|^gF1D!#,6+QMn2cmwH>5S``efy 7)j@Dk Cg2LL)%#}Kg};~8SI"yqfc4q#~v90/Jp*8p@Z; p]q(BJZ}^G-xI4htH,i_m;#H]@L,;pNq XUh#8?8=.g 56n/? `-!ekoW4<'R0/SKD`|u'%P38H>|s J {DQ7->fVR5#RWY)z]PO?]]<@C{{\ fXbBwO4q aA=2$8ox y!l%uDm}y4:i5(bb$PEu .#g<< ]mSTwAHS, b 9wZ3E[Mh>s,n:|X+}HaukGf R R0YqK5'7{Jm9tb/+Q}'$Xv=V~/wX/<^i]I * AfdV=PY:2rR8<~GDA.x?f>~h6 6n_Bnu]%ar}'TJZP,qDU 8K P%%EcYKOFk*/9nN,!cYE[;`U4A4njJ<-q{s ^VJ{\eS?cy%7My60zdMP[9`X9C+G;LG1\aPD X@#1rTZajkB tq2?u V%m ^8A$lZGaqH4~j@M\ fE$nOXa:-P8iva> \FmN0`hrj c{GMSc;R0H2c^"~m)Z^ o4LU?\" Q"Kr[tIH'BWOrV"pCk+?F05$?> `u'vZz>Cu= DKCql 2{BIq1PbT0o} b9'kmH\OqYeTZvh)| CH|hFcpmQZ=OSrc6T.b\:Z 0 4ua 9Nn7;{~M{84 pEVVNkq /z2K8K n:qf H$cpD9Uf.@az6%XF-CD $cJX7PC ` E]c07I-Ap[lfFp;?K!wHO, 5S@V#xlew8 a?+ 'R A{T62KM 6_}`g!Iw C] v5vY5M(4&r.Iv*0 Dt%*hvWaLd $0nKQw#hp%[H%V>WB({~?%E~Got{:M2:K+eI". ."J!p]MD~}uj];-:6RId=}_ w$t8b35UxM0>zDa9 *B=/P3Lu*_0`.pt]g 7#* UO^JQ =BYO7 o3#@tDrp?%=Aka zS0OXf"r4 zN$7VrdpcgEa]7R/UTB)B gm )mLd`MOKuI}VVRHSAJ D=:40@>ydC/>x3iE5 z54%bChj7Qzi s _VELu|* J5X%BC FM4cW"+)L\r.0U0A(%rwkYi.*B$T/Nb9.r /F]*@,G6mMEGH\"?#@{NgL,$DpaIjK ?h3. (0WP$jdH] 1l&LomiT.kCf5=nsC7xV+MTZ*%J0C VnUwRsnF~O*d~ov r3`)[K[GI 3L4mTEK T@yZ1T3w& 1o 6AwEV?:@Ow`-a}F;"8bW>]EiCa _KZW| Oh~F^2@y Ue ToLyvbBA"a.#'(o yh=[TO ei "sG9:*OMXiF+U>b4I>-)[X-klLUVC2y]8I M>lRVkhlKcyZRY3M"u;?-j uMRN/?)f9nm*R\_T0X /CW ا)U=Hy{:,%#MXh+1XP2yYk(Oq7k5oSr| [^ lC}C0a}.31&@|(&a1/+28?pBtDO$c2h6cYAR %a6L Tj*7>#UBW]GQ4RK\>h4yM]L8pfl8VAD@CQ= ^e67_wg}ib/k]16,[ Sp*Sr*NJ]mr|)#/ kD~z B))|~833ENOe6f;}xA%c)  lj>RSgpk:=N01q -dEG0n2?Ei0.iYHQ~N %=qdZv3)iEq,lfxWGMSxr \Y> w V5z8<YvJy20D hAW/}x/"|Y~85dL"~0\.L H&p#vQV!#4LOqA*MsU%TXASPl*s4gl/_-k(#]3b% pvasCL2G05REe_zviOSE)>\[>1okWQ|,_LPy)'=3#tFL(h{iSH{p}UIyicv5:ETOCJ_En#>Qn X*_ ov1xg *m5j/a;s -$dgpC%?~fw<5}ssCi1@[N"2QGC 7 ^9t8rxm5wg#}cfe'{[WPI&BfCo^=lMXG{ymG .5mCkkID 8 .Km(u+=v_s6)a8G?_';'S $B?/N A ^m8\CIQ*$zqy:sFIu.QZ.|MTmnJ 5mokZNb'12zWG=US 9|B<V,:;Eu'elD ?BPzWQ {f+UQ7yR}M9 hx??H@Cq/z# =x`t3f.V$"o-BbU":j aO3H ux4k~ss x3T*"?5q5C2SC7 Ke0Jv"x<|>q=a#a!Ad:`5?TpfqJ[2v-ez-I r_&A,QNYH AF{gc g?x1Vf7xIP4:i:c!,\ l~RnA $/b~YVcQ~"a'j.+h 7_AVuXi-C 9\Zqpn9CL]CRg)NVmwPk&,aygo2s\:p,tos#5[+v.5+eCw+F?bv5`$#~]yg2 o M|%gkBd9V}y9QYyQ\7 "{038.ujiU J@6nx)1E`jQ\C4m,}s0LL=Y+b| d#VnFd)DVY2V5 Diz(weqHk UC [4Jol( _S{ ^_G' zYH<' h " j_s_crat() lǴ UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1#1ate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { #ifndef MAYBE_PLAIN_FAT pp = lastsemi + 1; #else # ifdef USE_LFN if (use_lfn) pp = lastsemi + 1; else pp = lastsemi; /* semi-colon was omitted: expect all #'s */ # else pp = lastsemi; /* semi-colon was omitted: expect all #'s */ # endif #endif while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } #ifdef MAYBE_PLAIN_FAT maskDOSdevice(__G__ pathcomp, last_dot); #else maskDOSdevice(__G__ pathcomp, NULL); #endif if (G.pInfo->vollabel) { if (strlen(pathcomp) > 11) pathcomp[11] = '\0'; } else { #ifdef MAYBE_PLAIN_FAT # ifdef USE_LFN if (!use_lfn) map2fat(pathcomp, last_dot); /* 8.3 truncation (in place) */ # else map2fat(pathcomp, last_dot); /* 8.3 truncation (in place) */ # endif #endif } if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, LoadFarString(ConversionFailed), FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); if (G.pInfo->vollabel) { /* set the volume label now */ if (QCOND2) Info(slide, 0, ((char *)slide, LoadFarString(Labelling), (nLabelDrive + 'a' - 1), FnFilter1(G.filename))); if (volumelabel(G.filename)) { Info(slide, 1, ((char *)slide, LoadFarString(ErrSetVolLabel))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } /* success: skip the "extraction" quietly */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } return error; } /* end function mapname() */ /****************************/ /* Function maskDOSdevice() */ /****************************/ static void maskDOSdevice(__G__ pathcomp, last_dot) __GDEF char *pathcomp, *last_dot; { /*--------------------------------------------------------------------------- Put an underscore in front of the file name if the file name is a DOS/WINDOWS device name like CON.*, AUX.*, PRN.*, etc. Trying to extract such a file would fail at best and wedge us at worst. ---------------------------------------------------------------------------*/ #if !defined(S_IFCHR) && defined(_S_IFCHR) # define S_IFCHR _S_IFCHR #endif #if !defined(S_ISCHR) # if defined(_S_ISCHR) # define S_ISCHR(m) _S_ISCHR(m) # elif defined(S_IFCHR) # define S_ISCHR(m) ((m) & S_IFCHR) # endif #endif #ifdef DEBUG if (stat(pathcomp, &G.statbuf) == 0) { Trace((stderr, "maskDOSdevice() stat(\"%s\", buf) st_mode result: %X, %o\n", FnFilter1(pathcomp), G.statbuf.st_mode, G.statbuf.st_mode)); } else { Trace((stderr, "maskDOSdevice() stat(\"%s\", buf) failed\n", FnFilter1(pathcomp))); } #endif if (stat(pathcomp, &G.statbuf) == 0 && S_ISCHR(G.statbuf.st_mode)) { extent i; /* pathcomp contains a name of a DOS character device (builtin or * installed device driver). * Prepend a '_' to allow creation of the item in the file system. */ for (i = strlen(pathcomp) + 1; i > 0; --i) pathcomp[i] = pathcomp[i - 1]; pathcomp[0] = '_'; if (last_dot != (char *)NULL) last_dot++; } } /* end function maskDOSdevice() */ #ifdef MAYBE_PLAIN_FAT /**********************/ /* Function map2fat() */ /**********************/ static void map2fat(pathcomp, last_dot) char *pathcomp, *last_dot; { char *pEnd = pathcomp + strlen(pathcomp); /*--------------------------------------------------------------------------- Case 1: filename has no dot, so figure out if we should add one. Note that the algorithm does not try to get too fancy: if there are no dots already, the name either gets truncated at 8 characters or the last un- derscore is converted to a dot (only if more characters are saved that way). In no case is a dot inserted between existing characters. GRR: have problem if filename is volume label?? ---------------------------------------------------------------------------*/ if (last_dot == (char *)NULL) { /* no dots: check for underscores... */ char *plu = strrchr(pathcomp, '_'); /* pointer to last underscore */ if ((plu != (char *)NULL) && /* found underscore: convert to dot? */ (MIN(plu - pathcomp, 8) + MIN(pEnd - plu - 1, 3) > 8)) { last_dot = plu; /* be lazy: drop through to next if-block */ } else if ((pEnd - pathcomp) > 8) /* no underscore; or converting underscore to dot would save less chars than leaving everything in the basename */ pathcomp[8] = '\0'; /* truncate at 8 chars */ /* else whole thing fits into 8 chars or less: no change */ } /*--------------------------------------------------------------------------- Case 2: filename has dot in it, so truncate first half at 8 chars (shift extension if necessary) and second half at three. ---------------------------------------------------------------------------*/ if (last_dot != (char *)NULL) { /* one dot is OK: */ *last_dot = '.'; /* put the last back in */ if ((last_dot - pathcomp) > 8) { char *p, *q; int i; p = last_dot; q = last_dot = pathcomp + 8; for (i = 0; (i < 4) && *p; ++i) /* too many chars in basename: */ *q++ = *p++; /* shift extension left and */ *q = '\0'; /* truncate/terminate it */ } else if ((pEnd - last_dot) > 4) last_dot[4] = '\0'; /* too many chars in extension */ /* else filename is fine as is: no change */ if ((last_dot - pathcomp) > 0 && last_dot[-1] == ' ') last_dot[-1] = '_'; /* NO blank in front of '.'! */ } } /* end function map2fat() */ #endif /* MAYBE_PLAIN_FAT */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { static int rootlen = 0; /* length of rootpath */ static char *rootpath; /* user's "extract-to" directory */ static char *buildpath; /* full path (so far) to extracted file */ static char *end; /* pointer to end of buildpath ('\0') */ #ifdef MSC int attrs; /* work around MSC stat() bug */ #endif # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ------m~\U7 UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1N@---------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') ++end; /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ if ((end-buildpath) > FILNAMSIZ-3) /* need '/', one-char name, '\0' */ too_long = TRUE; /* check if extracting directory? */ #ifdef MSC /* MSC 6.00 bug: stat(non-existent-dir) == 0 [exists!] */ if (_dos_getfileattr(buildpath, &attrs) || stat(buildpath, &G.statbuf)) #else if (SSTAT(buildpath, &G.statbuf)) /* path doesn't exist */ #endif { if (!G.create_dirs) { /* told not to create (freshening) */ free(buildpath); /* path doesn't exist: nothing to do */ return MPN_INF_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong), FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (MKDIR(buildpath, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, LoadFarString(CantCreateDir), FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, LoadFarString(DirIsntDirectory), FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong), FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *end++ = '/'; *end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(buildpath); buildpath = end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { #ifdef NOVELL_BUG_WORKAROUND if (end == buildpath && !G.pInfo->vollabel) { /* work-around for Novell's "overwriting executables" bug: prepend "./" to name when no path component is specified */ *end++ = '.'; *end++ = '/'; } #endif /* NOVELL_BUG_WORKAROUND */ Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') { ++end; if ((end-buildpath) >= FILNAMSIZ) { *--end = '\0'; Info(slide, 1, ((char *)slide, LoadFarString(PathTooLongTrunc), FnFilter1(G.filename), FnFilter2(buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); /* allocate space for full filename, root path, and maybe "./" */ if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+3)) == (char *)NULL) return MPN_NOMEM; if (G.pInfo->vollabel) { /* GRR: for network drives, do strchr() and return IZ_VOL_LABEL if not [1] */ if (renamed_fullpath && pathcomp[1] == ':') *buildpath = (char)ToLower(*pathcomp); else if (!renamed_fullpath && rootlen > 1 && rootpath[1] == ':') *buildpath = (char)ToLower(*rootpath); else { GETDRIVE(nLabelDrive); /* assumed that a == 1, b == 2, etc. */ *buildpath = (char)(nLabelDrive - 1 + 'a'); } nLabelDrive = *buildpath - 'a' + 1; /* save for mapname() */ if (uO.volflag == 0 || *buildpath < 'a' || /* no label/bogus disk */ (uO.volflag == 1 && !isfloppy(nLabelDrive))) /* -$: no fixed */ { free(buildpath); return MPN_VOL_LABEL; /* skipping with message */ } *buildpath = '\0'; end = buildpath; } else if (renamed_fullpath) { /* pathcomp = valid data */ end = buildpath; while ((*end = *pathcomp++) != '\0') ++end; } else if (rootlen > 0) { strcpy(buildpath, rootpath); end = buildpath + rootlen; } else { *buildpath = '\0'; end = buildpath; } Trace((stderr, "[%s]\n", FnFilter1(buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if neces- sary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. Note that under OS/2 and MS-DOS, if a candidate extract-to directory specification includes a drive letter (leading "x:"), it is treated just as if it had a trailing '/'--that is, one directory level will be created if the path doesn't exist, unless this is otherwise pro- hibited (e.g., freshening). ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { rootlen = 0; return MPN_OK; } if (rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((rootlen = strlen(pathcomp)) > 0) { int had_trailing_pathsep=FALSE, has_drive=FALSE, add_dot=FALSE; char *tmproot; ifnZG UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1O ((tmproot = (char *)malloc(rootlen+3)) == (char *)NULL) { rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (isalpha((uch)tmproot[0]) && tmproot[1] == ':') has_drive = TRUE; /* drive designator */ if (tmproot[rootlen-1] == '/' || tmproot[rootlen-1] == '\\') { tmproot[--rootlen] = '\0'; had_trailing_pathsep = TRUE; } if (has_drive && (rootlen == 2)) { if (!had_trailing_pathsep) /* i.e., original wasn't "x:/" */ add_dot = TRUE; /* relative path: add '.' before '/' */ } else if (rootlen > 0) { /* need not check "x:." and "x:/" */ #ifdef MSC /* MSC 6.00 bug: stat(non-existent-dir) == 0 [exists!] */ if (_dos_getfileattr(tmproot, &attrs) || SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) #else if (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) #endif { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); rootlen = 0; /* treat as stored file */ return MPN_INF_SKIP; } /* GRR: scan for wildcard characters? OS-dependent... if find any, return 2: * treat as stored file(s) */ /* create directory (could add loop here scanning tmproot * to create more than one level, but really necessary?) */ if (MKDIR(tmproot, 0777) == -1) { Info(slide, 1, ((char *)slide, LoadFarString(CantCreateExtractDir), FnFilter1(tmproot))); free(tmproot); rootlen = 0; /* path didn't exist, tried to create, failed: */ /* file exists, or need 2+ subdir levels */ return MPN_ERR_SKIP; } } } if (add_dot) /* had just "x:", make "x:." */ tmproot[rootlen++] = '.'; tmproot[rootlen++] = '/'; tmproot[rootlen] = '\0'; if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) { free(tmproot); rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (rootlen > 0) { free(rootpath); rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /***********************/ /* Function isfloppy() */ /***********************/ static int isfloppy(nDrive) /* more precisely, is it removable? */ int nDrive; { union REGS regs; regs.h.ah = 0x44; regs.h.al = 0x08; regs.h.bl = (uch)nDrive; #ifdef __EMX__ _int86(0x21, ®s, ®s); if (WREGS(regs,flags) & 1) #else intdos(®s, ®s); if (WREGS(regs,cflag)) /* error: do default a/b check instead */ #endif { Trace((stderr, "error in DOS function 0x44 (AX = 0x%04x): guessing instead...\n", (unsigned int)(WREGS(regs,ax)))); return (nDrive == 1 || nDrive == 2)? TRUE : FALSE; } else return WREGS(regs,ax)? FALSE : TRUE; } /**************************/ /* Function z_dos_chmod() */ /**************************/ static int z_dos_chmod(__G__ fname, attributes) __GDEF ZCONST char *fname; int attributes; { char *name; unsigned fnamelength; int errv; /* set file attributes: The DOS `chmod' system call requires to mask out the directory and volume_label attribute bits. And, a trailing '/' has to be removed from the directory name, the DOS `chmod' system call does not accept it. */ fnamelength = strlen(fname); if (fnamelength > 1 && fname[fnamelength-1] == '/' && fname[fnamelength-2] != ':' && (name = (char *)malloc(fnamelength)) != (char *)NULL) { strncpy(name, fname, fnamelength-1); name[fnamelength-1] = '\0'; } else { name = (char *)fname; fnamelength = 0; } #if defined(__TURBOC__) || (defined(__DJGPP__) && (__DJGPP__ >= 2)) # if (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0452)) # define Chmod _rtl_chmod # else # define Chmod _chmod # endif errv = (Chmod(name, 1, attributes & (~FSUBDIR & ~FVOLID)) != (attributes & (~FSUBDIR & ~FVOLID))); # undef Chmod #else /* !(__TURBOC__ || (__DJGPP__ && __DJGPP__ >= 2)) */ errv = (_dos_setfileattr(name, attributes & (~FSUBDIR & ~FVOLID)) != 0); #endif /* ?(__TURBOC__ || (__DJGPP__ && __DJGPP__ >= 2)) */ if (errv) Info(slide, 1, ((char *)slide, LoadFarString(AttribsMayBeWrong))); if (fnamelength > 0) free(name); return errv; } /* end function z_dos_chmod() */ #if (!defined(__GO32__) && !defined(__EMX__)) typedef struct dosfcb { uch flag; /* ff to indicate extended FCB */ char res[5]; /* reserved */ uch vattr; /* attribute */ uch drive; /* drive (1=A, 2=B, ...) */ uch vn[11]; /* file or volume name */ char dmmy[5]; uch nn[11]; /* holds new name if renaming (else reserved) */ char dmmy2[9]; } dos_fcb; /**************************/ /* Function volumelabel() */ /**************************/ static int volumelabel(newlabel) ZCONST char *newlabel; { #ifdef DEBUG char *p; #endif int len = strlen(newlabel); int fcbseg, dtaseg, fcboff, dtaoff, retv; dos_fcb fcb, dta, far *pfcb=&fcb, far *pdta=&dta; struct SREGS sregs; union REGS regs; /*--------------------------------------------------------------------------- Label the diskette specified by nLabelDrive using FCB calls. (Old ver- sions of MS-DOS and OS/2 DOS boxes can't use DOS function 3Ch to create labels.) Must use far pointers for MSC FP_* macros to work; must pad FCB filenames with spaces; and cannot include dot in 8th position. May or may not need to zero out FCBs before using; do so just in case. ---------------------------------------------------------------------------*/ #ifdef WATCOMC_386 int truseg; memset(&sregs, 0, sizeof(sregs)); memset(®s, 0, sizeof(regs)); /* PMODE/W does not support extended versions of any dos FCB functions, */ /* so we have to use brute force, allocating real mode memory for them. */ regs.w.ax = 0x0100; regs.w.bx = (2 * sizeof(dos_fcb) + 15) >> 4; /* size in paragraphs */ int386(0x31, ®s, ®s); /* DPMI allocate DOS memory */ if (regs.w.cflag) return DF_MDY; /* no memory, return default */ truseg = regs.w.dx; /* protected mode selector */ dtaseg = regs.w.ax; /* real mode paragraph */ fcboff = 0; dtaoff = sizeof(dos_fcb); #ifdef XXX__MK_FP_IS_BROKEN /* XXX This code may not be trustworthy in general, though it iso UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1=^ */ /* valid with DOS/4GW and PMODE/w, which is all we support for now. */ regs.w.ax = 6; regs.w.bx = truseg; int386(0x31, ®s, ®s); /* convert seg to linear address */ pfcb = (dos_fcb far *) (((ulg) regs.w.cx << 16) | regs.w.dx); /* pfcb = (dos_fcb far *) ((ulg) dtaseg << 4); */ pdta = pfcb + 1; #else pfcb = MK_FP(truseg, fcboff); pdta = MK_FP(truseg, dtaoff); #endif _fmemset((char far *)pfcb, 0, 2 * sizeof(dos_fcb)); /* we pass the REAL MODE paragraph to the dos interrupts: */ fcbseg = dtaseg; #else /* !WATCOMC_386 */ memset((char *)&dta, 0, sizeof(dos_fcb)); memset((char *)&fcb, 0, sizeof(dos_fcb)); fcbseg = FP_SEG(pfcb); fcboff = FP_OFF(pfcb); dtaseg = FP_SEG(pdta); dtaoff = FP_OFF(pdta); #endif /* ?WATCOMC_386 */ #ifdef DEBUG for (p = (char *)&dta; (p - (char *)&dta) < sizeof(dos_fcb); ++p) if (*p) fprintf(stderr, "error: dta[%d] = %x\n", (p - (char *)&dta), *p); for (p = (char *)&fcb; (p - (char *)&fcb) < sizeof(dos_fcb); ++p) if (*p) fprintf(stderr, "error: fcb[%d] = %x\n", (p - (char *)&fcb), *p); printf("testing pointer macros:\n"); segread(&sregs); printf("cs = %x, ds = %x, es = %x, ss = %x\n", sregs.cs, sregs.ds, sregs.es, sregs.ss); #endif /* DEBUG */ #if 0 #ifdef __TURBOC__ bdosptr(0x1a, dta, DO_NOT_CARE); #else (intdosx method below) #endif #endif /* 0 */ /* set the disk transfer address for subsequent FCB calls */ sregs.ds = dtaseg; WREGS(regs,dx) = dtaoff; Trace((stderr, "segment:offset of pdta = %x:%x\n", dtaseg, dtaoff)); Trace((stderr, "&dta = %lx, pdta = %lx\n", (ulg)&dta, (ulg)pdta)); regs.h.ah = 0x1a; F_intdosx(®s, ®s, &sregs); /* fill in the FCB */ sregs.ds = fcbseg; WREGS(regs,dx) = fcboff; pfcb->flag = 0xff; /* extended FCB */ pfcb->vattr = 0x08; /* attribute: disk volume label */ pfcb->drive = (uch)nLabelDrive; #ifdef DEBUG Trace((stderr, "segment:offset of pfcb = %x:%x\n", (unsigned int)(sregs.ds), (unsigned int)(WREGS(regs,dx)))); Trace((stderr, "&fcb = %lx, pfcb = %lx\n", (ulg)&fcb, (ulg)pfcb)); Trace((stderr, "(2nd check: labelling drive %c:)\n", pfcb->drive-1+'A')); if (pfcb->flag != fcb.flag) fprintf(stderr, "error: pfcb->flag = %d, fcb.flag = %d\n", pfcb->flag, fcb.flag); if (pfcb->drive != fcb.drive) fprintf(stderr, "error: pfcb->drive = %d, fcb.drive = %d\n", pfcb->drive, fcb.drive); if (pfcb->vattr != fcb.vattr) fprintf(stderr, "error: pfcb->vattr = %d, fcb.vattr = %d\n", pfcb->vattr, fcb.vattr); #endif /* DEBUG */ /* check for existing label */ Trace((stderr, "searching for existing label via FCBs\n")); regs.h.ah = 0x11; /* FCB find first */ #ifdef WATCOMC_386 _fstrncpy((char far *)&pfcb->vn, "???????????", 11); #else strncpy((char *)fcb.vn, "???????????", 11); /* i.e., "*.*" */ #endif /* ?WATCOMC_386 */ Trace((stderr, "fcb.vn = %lx\n", (ulg)fcb.vn)); Trace((stderr, "regs.h.ah = %x, regs.x.dx = %04x, sregs.ds = %04x\n", (unsigned int)(regs.h.ah), (unsigned int)(WREGS(regs,dx)), (unsigned int)(sregs.ds))); Trace((stderr, "flag = %x, drive = %d, vattr = %x, vn = %s = %s.\n", fcb.flag, fcb.drive, fcb.vattr, fcb.vn, pfcb->vn)); F_intdosx(®s, ®s, &sregs); /*--------------------------------------------------------------------------- If not previously labelled, write a new label. Otherwise just rename, since MS-DOS 2.x has a bug that damages the FAT when the old label is deleted. ---------------------------------------------------------------------------*/ if (regs.h.al) { Trace((stderr, "no label found\n\n")); regs.h.ah = 0x16; /* FCB create file */ #ifdef WATCOMC_386 _fstrncpy((char far *)pfcb->vn, newlabel, len); if (len < 11) _fstrncpy((char far *)(pfcb->vn+len), " ", 11-len); #else strncpy((char *)fcb.vn, newlabel, len); if (len < 11) /* fill with spaces */ strncpy((char *)(fcb.vn+len), " ", 11-len); #endif Trace((stderr, "fcb.vn = %lx pfcb->vn = %lx\n", (ulg)fcb.vn, (ulg)pfcb->vn)); Trace((stderr, "flag = %x, drive = %d, vattr = %x\n", fcb.flag, fcb.drive, fcb.vattr)); Trace((stderr, "vn = %s = %s.\n", fcb.vn, pfcb->vn)); F_intdosx(®s, ®s, &sregs); regs.h.ah = 0x10; /* FCB close file */ if (regs.h.al) { Trace((stderr, "unable to write volume name (AL = %x)\n", (unsigned int)(regs.h.al))); F_intdosx(®s, ®s, &sregs); retv = 1; } else { F_intdosx(®s, ®s, &sregs); Trace((stderr, "new volume label [%s] written\n", newlabel)); retv = 0; } } else { Trace((stderr, "found old label [%s]\n\n", dta.vn)); /* not term. */ regs.h.ah = 0x17; /* FCB rename */ #ifdef WATCOMC_386 _fstrncpy((char far *)pfcb->vn, (char far *)pdta->vn, 11); _fstrncpy((char far *)pfcb->nn, newlabel, len); if (len < 11) _fstrncpy((char far *)(pfcb->nn+len), " ", 11-len); #else strncpy((char *)fcb.vn, (char *)dta.vn, 11); strncpy((char *)fcb.nn, newlabel, len); if (len < 11) /* fill with spaces */ strncpy((char *)(fcb.nn+len), " ", 11-len); #endif Trace((stderr, "fcb.vn = %lx pfcb->vn = %lx\n", (ulg)fcb.vn, (ulg)pfcb->vn)); Trace((stderr, "fcb.nn = %lx pfcb->nn = %lx\n", (ulg)fcb.nn, (ulg)pfcb->nn)); Trace((stderr, "flag = %x, drive = %d, vattr = %x\n", fcb.flag, fcb.drive, fcb.vattr)); Trace((stderr, "vn = %s = %s.\n", fcb.vn, pfcb->vn)); Trace((stderr, "nn = %s = %s.\n", fcb.nn, pfcb->nn)); F_intdosx(®s, ®s, &sregs); if (regs.h.al) { Trace((stderr, "Unable to change volume name (AL = %x)\n", (unsigned int)(regs.h.al))); retv = 1; } else { Trace((stderr, "volume label changed to [%s]\n", newlabel)); retv = 0; } } #ifdef WATCOMC_386 regs.w.ax = 0x0101; /* free dos memory */ regs.w.dx = truseg; int386(0x31, ®s, ®s); #endif return retv; } /* end function volumelabel() */ #endif /* !__GO32__ && !__EMX__ */ #if (defined(USE_EF_UT_TIME) || defined(TIMESTAMP)) /* The following DOS date/time structure is machine-dependent as it * assumes "little-endian" byte order. For MSDOS-specific code, which * is run on ix86 CPUs (or emulators), this assumption is valid; but * care should be taken when using this code as template for other ports. */ typedef union { ulg z_dostime; # ifdef __TURBOC__ struct ftime ft; /* system file time record */ # endif struct { /* date and time words */ ush ztime; /* DOS file modification time word */ ush zdate; /* DOS file modification date word */ } zft; struct { /* DOS date/time components bitfield */ unsigned zt_se : 5; unsigned zt_mi : 6; unsigned zt_hr : 5; unsigned zd_dy : 5; unsigned zd_mo : 4; unsigned zd_yr : 7; } z_dtf; } dos_fdatetime; #endif /* USE_EF_UT_TIME || TIMESTAMP */ /****************************/ /* Function close_outfile() */ /***********p4;r UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1{m*****************/ void close_outfile(__G) __GDEF /* * MS-DOS VERSION * * Set the output file date/time stamp according to information from the * zipfile directory record for this member, then close the file and set * its permissions (archive, hidden, read-only, system). Aside from closing * the file, this routine is optional (but most compilers support it). */ { /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { #ifdef USE_EF_UT_TIME dos_fdatetime dos_dt; iztimes z_utime; struct tm *t; #endif /* USE_EF_UT_TIME */ /*--------------------------------------------------------------------------- Copy and/or convert time and date variables, if necessary; then set the file time/date. WEIRD BORLAND "BUG": if output is buffered, and if run under at least some versions of DOS (e.g., 6.0), and if files are smaller than DOS physical block size (i.e., 512 bytes) (?), then files MAY NOT get timestamped correctly--apparently setftime() occurs before any data are written to the file, and when file is closed and buffers are flushed, timestamp is overwritten with current time. Even with a 32K buffer, this does not seem to occur with larger files. UnZip output is now unbuffered, but if it were not, could still avoid problem by adding "fflush(outfile)" just before setftime() call. Weird, huh? ---------------------------------------------------------------------------*/ #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) { TTrace((stderr, "close_outfile: Unix e.f. modif. time = %ld\n", z_utime.mtime)); /* round up (down if "up" overflows) to even seconds */ if (z_utime.mtime & 1) z_utime.mtime = (z_utime.mtime + 1 > z_utime.mtime) ? z_utime.mtime + 1 : z_utime.mtime - 1; TIMET_TO_NATIVE(z_utime.mtime) /* NOP unless MSC 7 or Macintosh */ t = localtime(&(z_utime.mtime)); } else t = (struct tm *)NULL; if (t != (struct tm *)NULL) { if (t->tm_year < 80) { dos_dt.z_dtf.zt_se = 0; dos_dt.z_dtf.zt_mi = 0; dos_dt.z_dtf.zt_hr = 0; dos_dt.z_dtf.zd_dy = 1; dos_dt.z_dtf.zd_mo = 1; dos_dt.z_dtf.zd_yr = 0; } else { dos_dt.z_dtf.zt_se = t->tm_sec >> 1; dos_dt.z_dtf.zt_mi = t->tm_min; dos_dt.z_dtf.zt_hr = t->tm_hour; dos_dt.z_dtf.zd_dy = t->tm_mday; dos_dt.z_dtf.zd_mo = t->tm_mon + 1; dos_dt.z_dtf.zd_yr = t->tm_year - 80; } } else { dos_dt.z_dostime = G.lrec.last_mod_dos_datetime; } # ifdef __TURBOC__ setftime(fileno(G.outfile), &dos_dt.ft); # else _dos_setftime(fileno(G.outfile), dos_dt.zft.zdate, dos_dt.zft.ztime); # endif #else /* !USE_EF_UT_TIME */ # ifdef __TURBOC__ setftime(fileno(G.outfile), (struct ftime *)(&(G.lrec.last_mod_dos_datetime))); # else _dos_setftime(fileno(G.outfile), (ush)(G.lrec.last_mod_dos_datetime >> 16), (ush)(G.lrec.last_mod_dos_datetime)); # endif #endif /* ?USE_EF_UT_TIME */ } /*--------------------------------------------------------------------------- And finally we can close the file...at least everybody agrees on how to do *this*. I think... Also change the mode according to the stored file attributes, since we didn't do that when we opened the dude. ---------------------------------------------------------------------------*/ fclose(G.outfile); z_dos_chmod(__G__ G.filename, G.pInfo->file_attr); } /* end function close_outfile() */ #ifdef TIMESTAMP /*************************/ /* Function stamp_file() */ /*************************/ int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime; { dos_fdatetime dos_dt; time_t t_even; struct tm *t; int fd; /* file handle */ /* round up (down if "up" overflows) to even seconds */ t_even = ((modtime + 1 > modtime) ? modtime + 1 : modtime) & (~1); TIMET_TO_NATIVE(t_even) /* NOP unless MSC 7.0 or Macintosh */ t = localtime(&t_even); if (t == (struct tm *)NULL) return -1; /* time conversion error */ if (t->tm_year < 80) { dos_dt.z_dtf.zt_se = 0; dos_dt.z_dtf.zt_mi = 0; dos_dt.z_dtf.zt_hr = 0; dos_dt.z_dtf.zd_dy = 1; dos_dt.z_dtf.zd_mo = 1; dos_dt.z_dtf.zd_yr = 0; } else { dos_dt.z_dtf.zt_se = t->tm_sec >> 1; dos_dt.z_dtf.zt_mi = t->tm_min; dos_dt.z_dtf.zt_hr = t->tm_hour; dos_dt.z_dtf.zd_dy = t->tm_mday; dos_dt.z_dtf.zd_mo = t->tm_mon + 1; dos_dt.z_dtf.zd_yr = t->tm_year - 80; } if (((fd = open((char *)fname, 0)) == -1) || # ifdef __TURBOC__ (setftime(fd, &dos_dt.ft))) # else (_dos_setftime(fd, dos_dt.zft.zdate, dos_dt.zft.ztime))) # endif { if (fd != -1) close(fd); return -1; } close(fd); return 0; } /* end function stamp_file() */ #endif /* TIMESTAMP */ void prepare_ISO_OEM_translat(__G) __GDEF { switch (getdoscodepage()) { case 437: case 850: case 858: #ifdef IZ_ISO2OEM_ARRAY iso2oem = iso2oem_850; #endif #ifdef IZ_OEM2ISO_ARRAY oem2iso = oem2iso_850; #endif case 932: /* Japanese */ case 949: /* Korean */ case 936: /* Chinese, simple */ case 950: /* Chinese, traditional */ case 874: /* Thai */ case 1258: /* Vietnamese */ #ifdef IZ_ISO2OEM_ARRAY iso2oem = NULL; #endif #ifdef IZ_OEM2ISO_ARRAY oem2iso = NULL; #endif default: #ifdef IZ_ISO2OEM_ARRAY iso2oem = NULL; #endif #ifdef IZ_OEM2ISO_ARRAY oem2iso = NULL; #endif } } /* end function prepare_ISO_OEM_translat() */ #ifndef SFX /*************************/ /* Function dateformat() */ /*************************/ int dateformat() { /*--------------------------------------------------------------------------- For those operating systems that support it, this function returns a value that tells how national convention says that numeric dates are displayed. Return values are DF_YMD, DF_DMY and DF_MDY (the meanings should be fairly obvious). ---------------------------------------------------------------------------*/ #ifndef WINDLL ush CountryInfo[18]; #if (!defined(__GO32__) && !defined(__EMX__)) ush far *_CountryInfo = CountryInfo; struct SREGS sregs; union REGS regs; #ifdef WATCOMC_386 ush seg, para; memset(&sregs, 0, sizeof(sregs)); memset(®s, 0, sizeof(regs)); /* PMODE/W does not support an extended version of dos function 38, */ /* so we have to use brute force, allocating real mode memory for it. */ regs.w.ax = 0x0100; regs.w.bx = 3; /* 36 bytes rounds up to 48 */ int386(0x31, ®s, ®s); /* DPMI allocate DOS memory */ if (regs.w.cflag) return DF_MDY; /* no memory, return default */ seg = regs.w.dx; para = regs.w.ax; #ifdef XXX__MK_FP_IS_BROKEN /* qS' UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1}|XXX This code may not be trustworthy in general, though it is * valid with DOS/4GW and PMODE/w, which is all we support for now. */ /* _CountryInfo = (ush far *) (para << 4); */ /* works for some extenders */ regs.w.ax = 6; regs.w.bx = seg; int386(0x31, ®s, ®s); /* convert seg to linear address */ _CountryInfo = (ush far *) (((ulg) regs.w.cx << 16) | regs.w.dx); #else _CountryInfo = (ush far *) MK_FP(seg, 0); #endif sregs.ds = para; /* real mode paragraph */ regs.w.dx = 0; /* no offset from segment */ regs.w.ax = 0x3800; int86x_realmode(0x21, ®s, ®s, &sregs); CountryInfo[0] = regs.w.cflag ? 0 : _CountryInfo[0]; regs.w.ax = 0x0101; regs.w.dx = seg; int386(0x31, ®s, ®s); /* DPMI free DOS memory */ #else /* !WATCOMC_386 */ sregs.ds = FP_SEG(_CountryInfo); regs.x.dx = FP_OFF(_CountryInfo); regs.x.ax = 0x3800; intdosx(®s, ®s, &sregs); #endif /* ?WATCOMC_386 */ #else /* __GO32__ || __EMX__ */ _dos_getcountryinfo(CountryInfo); #endif /* ?(__GO32__ || __EMX__) */ switch(CountryInfo[0]) { case 0: return DF_MDY; case 1: return DF_DMY; case 2: return DF_YMD; } #endif /* !WINDLL */ return DF_MDY; /* default for systems without locale info */ } /* end function dateformat() */ #ifndef WINDLL /**************************************/ /* Function is_running_on_windows() */ /**************************************/ static int is_running_on_windows(void) { char *var = getenv("OS"); /* if the OS env.var says 'Windows_NT' then */ /* we're likely running on a variant of WinNT */ if ((var != NULL) && (strcmp("Windows_NT", var) == 0)) return TRUE; /* if the windir env.var is non-null then */ /* we're likely running on a variant of Win9x */ /* DOS mode of Win9x doesn't define windir, only winbootdir */ /* NT's command.com can't see lowercase env. vars */ var = getenv("windir"); if ((var != NULL) && (var[0] != '\0')) return TRUE; return FALSE; } /**********************************/ /* Function check_for_windows() */ /**********************************/ void check_for_windows(ZCONST char *app) { #ifdef SMALL_MEM char msg_str[160]; /* enough space for two 79-char-lines */ (void)zfstrcpy(msg_buf, WarnUsedOnWindows) #else # define msg_str WarnUsedOnWindows #endif /* Print a warning for users running under Windows */ /* to reduce bug reports due to running DOS version */ /* under Windows, when Windows version usually works correctly */ if (is_running_on_windows()) printf(msg_str, app); } /* end function check_for_windows() */ /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { int len; #if defined(__DJGPP__) || defined(__WATCOMC__) || \ (defined(_MSC_VER) && (_MSC_VER != 800)) char buf[80]; #endif len = sprintf((char *)slide, LoadFarString(CompiledWith), #if defined(__GNUC__) # if defined(__DJGPP__) (sprintf(buf, "djgpp v%d.%02d / gcc ", __DJGPP__, __DJGPP_MINOR__), buf), # elif defined(__GO32__) /* __GO32__ is defined as "1" only (sigh) */ "djgpp v1.x / gcc ", # elif defined(__EMX__) /* ...so is __EMX__ (double sigh) */ "emx+gcc ", # else "gcc ", # endif __VERSION__, #elif defined(__WATCOMC__) # if (__WATCOMC__ % 10 != 0) "Watcom C/C++", (sprintf(buf, " %d.%02d", __WATCOMC__ / 100, __WATCOMC__ % 100), buf), # else "Watcom C/C++", (sprintf(buf, " %d.%d", __WATCOMC__ / 100, (__WATCOMC__ % 100) / 10), buf), # endif #elif defined(__TURBOC__) # ifdef __BORLANDC__ "Borland C++", # if (__BORLANDC__ < 0x0200) " 1.0", # elif (__BORLANDC__ == 0x0200) /* James: __TURBOC__ = 0x0297 */ " 2.0", # elif (__BORLANDC__ == 0x0400) " 3.0", # elif (__BORLANDC__ == 0x0410) /* __BCPLUSPLUS__ = 0x0310 */ " 3.1", # elif (__BORLANDC__ == 0x0452) /* __BCPLUSPLUS__ = 0x0320 */ " 4.0 or 4.02", # elif (__BORLANDC__ == 0x0460) /* __BCPLUSPLUS__ = 0x0340 */ " 4.5", # elif (__BORLANDC__ == 0x0500) " 5.0", # else " later than 5.0", # endif # else "Turbo C", # if (__TURBOC__ > 0x0401) /* Kevin: 3.0 -> 0x0401 */ "++ later than 3.0", # elif (__TURBOC__ >= 0x0400) "++ 3.0", # elif (__TURBOC__ >= 0x0297) /* see remark for Borland C++ 2.0 */ "++ 2.0", # elif (__TURBOC__ == 0x0296) /* [662] checked by SPC */ "++ 1.01", # elif (__TURBOC__ == 0x0295) /* [661] vfy'd by Kevin */ "++ 1.0", # elif (__TURBOC__ == 0x0201) /* Brian: 2.01 -> 0x0201 */ " 2.01", # elif ((__TURBOC__ >= 0x018d) && (__TURBOC__ <= 0x0200)) /* James: 0x0200 */ " 2.0", # elif (__TURBOC__ > 0x0100) " 1.5", /* James: 0x0105? */ # else " 1.0", /* James: 0x0100 */ # endif # endif #elif defined(MSC) # if defined(_QC) && !defined(_MSC_VER) "MS Quick C ", "2.0 or earlier", /* _QC is defined as 1 */ # elif defined(_QC) && (_MSC_VER == 600) "MS Quick C ", "2.5 (MSC 6.00)", # else "Microsoft C ", # ifdef _MSC_VER # if (_MSC_VER == 800) "8.0/8.0c (Visual C++ 1.0/1.5)", # else (sprintf(buf, "%d.%02d", _MSC_VER/100, _MSC_VER%100), buf), # endif # else "5.1 or earlier", # endif # endif #else "unknown compiler", "", #endif /* ?compilers */ "\nMS-DOS", #if (defined(__GNUC__) || defined(WATCOMC_386)) " (32-bit)", #else # if defined(M_I86HM) || defined(__HUGE__) " (16-bit, huge)", # elif defined(M_I86LM) || defined(__LARGE__) " (16-bit, large)", # elif defined(M_I86MM) || defined(__MEDIUM__) " (16-bit, medium)", # elif defined(M_I86CM) || defined(__COMPACT__) " (16-bit, compact)", # elif defined(M_I86SM) || defined(__SMALL__) " (16-bit, small)", # elif defined(M_I86TM) || defined(__TINY__) " (16-bit, tiny)", # else " (16-bit)", # endif #endif #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)len, 0); /* MSC can't handle huge macro expansion */ /* temporary debugging code for Borland compilers only */ #if (defined(__TURBOC__) && defined(DEBUG)) Info(slide, 0, ((char *)slide, "\tdebug(__TURBOC__ = 0x%04x = %d)\n", __TURBOC__, __TURBOC__)); #ifdef __BORLANDC__ Info(slide, 0, ((char *)slide, "\tdebug(__BORLANDC__ = 0x%04x)\n", __BORLANDC__)); #else Info(slide, 0, ((char *)slide, "\tdebug(__BORLANDC__ not defined)\n")); #endif #ifdef __TCPLUSPLUS__ Info(slide, 0, ((char *)slide, "\tdebug(__TCPLUSPLUS__ = 0x%04x)\n", __TCPLUSPLUS__)); #else Info(slide, 0, ((char *)slide, "\tdebug(__TCPLUSPLUS__ not defined)\n")); #endif #ifdef __BCPLUSPLUS__ Info(slide, 0, ((char *)slide, "\tdebug(__BCPLUSPLUS__ = 0x%04x)\n\n", __BCPLUSPLUS__)); #else Info(slide, 0, ((char *)slide, "\tdebug(__BCPLUSPLUS__ not defined)\n\n")); #endif #endif /* __TURBOC__ && DEBUG */ } /* end function version() */ #endif /* !WINDLL */ #endif /* !SFX */ #endif /* !FUNZIP */ #ifdef MY_ZCALLOC /* Special zcalloc function for MEMORY16 (MSDOS/OS2) */ #if defined(__TURBOC__) && !defined(OS2) #include /* Turbo C malloc() does not allr)' UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1Bow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 2 /* reduced from 10 to save space */ /* 10*64K = 640K */ static int next_ptr = 0; typedef struct ptr_table_s { zvoid far *org_ptr; zvoid far *new_ptr; } ptr_table; static ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ zvoid far *zcalloc(unsigned items, unsigned size) { zvoid far *buf; ulg bsize = (ulg)items*size; if (bsize < (65536L-16L)) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-NULL) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } zvoid zcfree(zvoid far *ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = next_ptr - 1; n >= 0; n--) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } Trace((stderr, "zcfree: ptr not found!\n")); } #endif /* __TURBOC__ */ #if defined(MSC) || defined(__WATCOMC__) #if (!defined(_MSC_VER) || (_MSC_VER < 700)) # define _halloc halloc # define _hfree hfree #endif zvoid far *zcalloc(unsigned items, unsigned size) { return (zvoid far *)_halloc((long)items, size); } zvoid zcfree(zvoid far *ptr) { _hfree((void huge *)ptr); } #endif /* MSC || __WATCOMC__ */ #endif /* MY_ZCALLOC */ #ifndef FUNZIP #if (defined(__GO32__) || defined(__EMX__)) #if (!defined(__DJGPP__) || (__DJGPP__ < 2) || \ ((__DJGPP__ == 2) && (__DJGPP_MINOR__ < 2))) int volatile _doserrno; #endif /* not "djgpp v2.02 or newer" */ #if (!defined(__DJGPP__) || (__DJGPP__ < 2)) unsigned _dos_getcountryinfo(void *countrybuffer) { asm("movl %0, %%edx": : "g" (countrybuffer)); asm("movl $0x3800, %eax"); asm("int $0x21": : : "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi"); _doserrno = 0; asm("jnc 1f"); asm("movl %%eax, %0": "=m" (_doserrno)); asm("1:"); return (unsigned)_doserrno; } unsigned _dos_setftime(int fd, unsigned dosdate, unsigned dostime) { asm("movl %0, %%ebx": : "g" (fd)); asm("movl %0, %%ecx": : "g" (dostime)); asm("movl %0, %%edx": : "g" (dosdate)); asm("movl $0x5701, %eax"); asm("int $0x21": : : "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi"); _doserrno = 0; asm("jnc 1f"); asm("movl %%eax, %0": "=m" (_doserrno)); errno = EBADF; asm("1:"); return (unsigned)_doserrno; } unsigned _dos_setfileattr(const char *name, unsigned attr) { #if 0 /* stripping of trailing '/' is not needed for unzip-internal use */ unsigned namlen = strlen(name); char *i_name = alloca(namlen + 1); strcpy(i_name, name); if (namlen > 1 && i_name[namlen-1] == '/' && i_name[namlen-2] != ':') i_name[namlen-1] = '\0'; asm("movl %0, %%edx": : "g" (i_name)); #else asm("movl %0, %%edx": : "g" (name)); #endif asm("movl %0, %%ecx": : "g" (attr)); asm("movl $0x4301, %eax"); asm("int $0x21": : : "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi"); _doserrno = 0; asm("jnc 1f"); asm("movl %%eax, %0": "=m" (_doserrno)); switch (_doserrno) { case 2: case 3: errno = ENOENT; break; case 5: errno = EACCES; break; } asm("1:"); return (unsigned)_doserrno; } void _dos_getdrive(unsigned *d) { asm("movl $0x1900, %eax"); asm("int $0x21": : : "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi"); asm("xorb %ah, %ah"); asm("incb %al"); asm("movl %%eax, %0": "=a" (*d)); } unsigned _dos_creat(const char *path, unsigned attr, int *fd) { asm("movl $0x3c00, %eax"); asm("movl %0, %%edx": :"g" (path)); asm("movl %0, %%ecx": :"g" (attr)); asm("int $0x21": : : "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi"); asm("movl %%eax, %0": "=a" (*fd)); _doserrno = 0; asm("jnc 1f"); _doserrno = *fd; switch (_doserrno) { case 3: errno = ENOENT; break; case 4: errno = EMFILE; break; case 5: errno = EACCES; break; } asm("1:"); return (unsigned)_doserrno; } unsigned _dos_close(int fd) { asm("movl %0, %%ebx": : "g" (fd)); asm("movl $0x3e00, %eax"); asm("int $0x21": : : "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi"); _doserrno = 0; asm("jnc 1f"); asm ("movl %%eax, %0": "=m" (_doserrno)); if (_doserrno == 6) { errno = EBADF; } asm("1:"); return (unsigned)_doserrno; } #endif /* !__DJGPP__ || (__DJGPP__ < 2) */ static int volumelabel(ZCONST char *name) { int fd; return _dos_creat(name, FA_LABEL, &fd) ? fd : _dos_close(fd); } #if (defined(__DJGPP__) && (__DJGPP__ >= 2)) #include /* These includes for the country info */ #include #include /* The above _dos_getcountryinfo function doesn't work with djgpp v2, presumably * because ds is not set correctly (does it really work at all?). Note that * this version only sets the date (ie. CountryInfo[0]). */ unsigned _dos_getcountryinfo(void *countrybuffer) { __dpmi_regs regs; regs.x.ax = 0x3800; regs.x.dx = __tb & 0x0f; regs.x.ds = (__tb >> 4) & 0xffff; _doserrno = __dpmi_int(0x21, ®s); *(ush*)countrybuffer = _farpeekw(_dos_ds, __tb & 0xfffff); return (unsigned)_doserrno; } /* Disable determination of "x" bit in st_mode field for [f]stat() calls. */ int _is_executable (const char *path, int fhandle, const char *ext) { return 0; } #ifndef USE_DJGPP_GLOB /* Prevent globbing of filenames. This gives the same functionality as * "stubedit globbing=no" did with DJGPP v1. */ char **__crt0_glob_function(char *_arg) { return NULL; } #endif /* !USE_DJGPP_GLOB */ #ifndef USE_DJGPP_ENV /* Reduce the size of the executable and remove the functionality to read * the program's environment from whatever $DJGPP points to. */ void __crt0_load_environment_file(char *_app_name) { } #endif /* !USE_DJGPP_ENV */ #endif /* __DJGPP__ >= 2 */ #endif /* __GO32__ || __EMX__ */ static int getdoscodepage(void) { union REGS regs; WREGS(regs,ax) = 0x6601; #ifdef __EMX__ _int86(0x21, ®s, ®s); if (WREGS(regs,flags) & 1) #else intdos(®s, ®s); if (WREGS(regs,cflag)) #endif { Trace((stderr, "error in DOS function 0x66 (AX = 0x%04x): default to 850...\n", (unsigned int)(WREGS(regs,ax)))); return 858; } else return WREGS(regs,bx); } #ifdef __EMX__ #ifdef MORE /*************************/ /* Function screensize() */ /*************************/ int screensize(int *tt_rows, int *tt_cols) { int scr_dimen[2]; /* scr_dimen[0]: columns, src_dimen[1]: rows */ _scrsize(scr_dimen); if (tt_rows != NULL) *tt_rows = scr_dimen[1]; if (tts UNZIP.BCKK._[UNZIP60.MSDOS]MSDOS.C;1 _cols != NULL) *tt_cols = scr_dimen[0]; return 0; } #endif /* MORE */ #endif /* __EMX__ */ #ifdef WATCOMC_386 #ifdef MORE #include /*************************/ /* Function screensize() */ /*************************/ int screensize(int *tt_rows, int *tt_cols) { struct videoconfig vc; _getvideoconfig(&vc); if (tt_rows != NULL) *tt_rows = (int)(vc.numtextrows); if (tt_cols != NULL) *tt_cols = (int)(vc.numtextcols); return 0; } #endif /* MORE */ static struct RMINFO { ulg edi, esi, ebp; ulg reserved; ulg ebx, edx, ecx, eax; ush flags; ush es,ds,fs,gs; ush ip_ignored,cs_ignored; ush sp,ss; }; /* This function is used to call dos interrupts that may not be supported * by some particular 32-bit DOS extender. It uses DPMI function 300h to * simulate a real mode call of the interrupt. The caller is responsible * for providing real mode addresses of any buffer areas used. The docs * for PMODE/W imply that this should not be necessary for calling the DOS * interrupts that it doesn't extend, but it crashes when this isn't used. */ static int int86x_realmode(int inter_no, union REGS *in, union REGS *out, struct SREGS *seg) { union REGS local; struct SREGS localseg; struct RMINFO rmi; int r; rmi.eax = in->x.eax; rmi.ebx = in->x.ebx; rmi.ecx = in->x.ecx; rmi.edx = in->x.edx; rmi.edi = in->x.edi; rmi.esi = in->x.esi; rmi.ebp = rmi.reserved = 0L; rmi.es = seg->es; rmi.ds = seg->ds; rmi.fs = seg->fs; rmi.gs = seg->gs; rmi.sp = rmi.ss = rmi.ip_ignored = rmi.cs_ignored = rmi.flags = 0; memset(&local, 0, sizeof(local)); memset(&localseg, 0, sizeof(localseg)); local.w.ax = 0x0300; local.h.bl = inter_no; local.h.bh = 0; local.w.cx = 0; localseg.es = FP_SEG(&rmi); local.x.edi = FP_OFF(&rmi); r = int386x(0x31, &local, &local, &localseg); out->x.eax = rmi.eax; out->x.ebx = rmi.ebx; out->x.ecx = rmi.ecx; out->x.edx = rmi.edx; out->x.edi = rmi.edi; out->x.esi = rmi.esi; out->x.cflag = rmi.flags & INTR_CF; return r; } #endif /* WATCOMC_386 */ #ifdef DOS_STAT_BANDAID /* This papers over a bug in Watcom 10.6's standard library...sigh. * Apparently it applies to both the DOS and Win32 stat()s. */ int stat_bandaid(const char *path, struct stat *buf) { char newname[4]; if (!stat(path, buf)) return 0; else if (!strcmp(path, ".") || (path[0] && !strcmp(path + 1, ":."))) { strcpy(newname, path); newname[strlen(path) - 1] = '\\'; /* stat(".") fails for root! */ return stat(newname, buf); } else return -1; } #endif /* DOS_STAT_BANDAID */ #endif /* !FUNZIP */ *[UNZIP60.MSDOS]README.;1+,2. / 4 @-._0123KPWO56G)7G)89GHJNotes about MS-DOS executables and compilers: - Borland start-up code is reported to switch the screen mode auto- matically if it's not 80 columns (or possibly 40) and either 25, 43 or 50 lines. In particular, extended modes such as 100x40 are not retained. - Borland start-up code also uses interrupt 1Ah, causing incorrect behavior (including lock-ups) on some Japanese MS-DOS machines such as the Fujitsu FMR series, which lack this interrupt. - Some(?) Borland compilers are apparently incapable of putting static data into far memory; this means all of UnZip's strings are in near memory, and there is not enough room to enable ZipInfo in the small memory model. The medium memory model is the default for now, but it may be necessary in some cases to use the large model. - Older Borland compilers do not understand source files with Unix line-endings (LF rather than CR/LF). Use "flip" or a similar utility to convert the line endings before compiling. - The Borland 5.00 compiler is simply too buggy to use on WizUnZip, both 16-bit and 32-bit versions, and we recommend avoiding it for now even on the commmand-line version of UnZip. - Microsoft C 5.1 large-model code is more than an order of magnitude slower than the identical code compiled with MSC 6 or 7 (a factor of 15 in our tests, actually). This may be due to a lousy optimizer or lousy libraries; regardless, since UnZip is hovering at the doorstep of the large memory model, we recommend upgrading to a later version of the compiler. For these reasons, Info-ZIP's distributed versions of the 16-bit MS-DOS executables are compiled with MSC 6 or 7. - djgpp 2.x (currently 2.03) is no longer distributed with the go32 extender. Instead, a 2K stub bound into the executable searches for a DPMI server; if none is found, it loads the default DPMI server while executing UnZip. Both djgpp 1.x and 2.x are capable of substituting a list of files in an ASCII file (say, `foo') on the command line; for example, "unzip archive @foo" will extract from `archive' all of the files listed in `foo'. Note, however, that djgpp 2.x is considerably slower than 1.x at file extraction (roughly twice as slow, in fact); see proginfo/perform.dos in the UnZip 5.3 source distribution for details. - djgpp 2.0's long-filename support is somewhat flaky; users should upgrade to version 2.01 instead. - The default wildcard ("globbing") behavior of djgpp 1.x/go32 is disabled by default in UnZip, but this can be overridden if the GO32 environment variable is set to "glob". This will cause UnZip to fail with various odd errors about "filename not matched" and the like; to avoid this, set the GO32 variable to "noglob" or unset it altogether. (The documented method of avoiding this by quoting wildcards with single quotes was buggy in djgpp 1.11 but is reported fixed in 1.12; not tested.) - djgpp 1.x's handling of timezones, necessary for the correct conversion of MS-DOS file times to those used in the Unix-like C library, is completely broken in djgpp 1.12 and probably earlier versions as well. It is fixed (or very close to it) in the 1.12m4 patch release and reportedly in the 2.x series, so be sure to use one of those when compiling. Otherwise UnZip's -f and -u (freshen/update) functions will not work correctly. It is reportedly necessary to set the TZDIR environment variable correctly with 1.12m4; for example, add `set TZDIR=c:/djgpp/zoneinfo' or similar to autoexec.bat. - djgpp 1.x/go32 executables, when run in a DOS box under OS/2 *and* extrac- ting to an HPFS disk *and* overwriting existing files (intentionally, that is), do not set the files' timestamps correctly. Instead, the timestamps remain set to whatever the original files' stamps were. This is a pretty obscure bug, but it does *not* occur in the 16-bit version so it seems to be go32's fault somehow. - According to notes found in another package, there was a known conflict between djgt'{ UNZIP.BCK2._[UNZIP60.MSDOS]README.;1  pp 1.x's go32 extender and QEMM's DPMI; this was apparently fixed in QEMM 7.04/QDPMI 1.05, but if you still have an older version (1.03 or 1.01), add "set GO32=nodpmi" to your autoexec.bat to avoid the conflict.) - [For Zip only, the djgpp/go32 extender goes nuts with the copying and/or deletion of some sort of a temporary file (swap file?) after compression is finished; this can take 30 seconds or more and really hurts perfor- mance. It doesn't affect UnZip, apparently.] - [Also apparently for Zip only, djgpp/go32 is reported to have problems when EMM386 is set to NOEMS; it sometimes gives the error message, "CPU must be in REAL mode (not V86 mode) to run this program without VCPI. (If you are using an EMS emulator, make sure that EMS isn't disabled)" Sometimes Zip works correctly, however, possibly due to other software having been run previously.] - emx+gcc's DOS extender does not understand DPMI, and while there is an alternative extender called RSX available (found in dpmigcc4.zip as of August 1994), its setup is somewhat kludgy when the local memory manager supports both DPMI and VCPI (or something else). It's also not yet as widely known or available as djgpp. - The free PMODE/W extender, used in conjunction with executables compiled with Watcom C 10.x and run in an OS/2 DOS box, appears to use up some critical DPMI resource and will fail to run after a few dozen executions ("PMODE/W: DPMI error" and/or SYS 3176). Some newer versions of PMODE/W, in combination with "unzip -v" on certain zipfiles (e.g., APMTST.ZIP from IBM/EWS), fail immediately (SYS 3176). And on some OS/2 systems, *any* use of the PMODE/W executables causes the machine to lock up. - PMODE/W is also reported to lock up pure DOS systems if QEMM is running. - At least older versions of PMODE/W, used in conjunction with Microsoft's EMM386, cause UnZip to start up extremely slowly. (This problem does not occur with QEMM.) For these reasons Info-ZIP's distributed 32-bit MS-DOS executables will be compiled with djgpp 2.03, mainly because of its nice long-filename support when running in a Win32 DOS box. The cwsdpmi DPMI server will be bundled if necessary. SPC 2000-04-16 *[UNZIP60]NETWARE.DIR;1+,M./ 4->0123 KPWO56NM7NM89GHJI CONTENTS.N MAKEFILE.WATZl NETWARE.CaSNLMCFG.H] NLM_EOL.PAT\_README.W UNZIP.BUILDbk UNZIP.LINKc*[UNZIP60.NETWARE]CONTENTS.;1+,N./ 4N@-M0123KPWO56TTW7TTW89GHJContents of the "netware" subdirectory for UnZip 5.53 and later: Contents this file README notes about Novell NetWare port makefile.wat makefile for compiling unzip.nlm using Watcom C 11.0 nlmcfg.h OS-dependent configuration, included by unzpriv.h netware.c OS-dependent UnZip routines for NetWare unzip.build Korn-shell build script unzip.link Watcom link directive file Notes: This port is courtesy of Vance Baarda (Novell NetWare Server Install). It is designed to compile with the Watcom C compiler. See the README for further info. *[UNZIP60.NETWARE]MAKEFILE.WAT;1+,Zl. / 4 @-M0123KPWO 56eMXW7eMXW89GHJ #------------------------------------------------------------------------------ # Makefile for UnZip 5.53 and later Mark Wright and others # Version: Watcom C 31 Mar 07 #------------------------------------------------------------------------------ # WARNING: this is a hacked-up version of an ancient (1993) makefile. It will # not work without modifications to the UnZip 5.3 sources. This makefile is # (for now) included only for completeness and as a starting point for a real # Novell Netware NLM port. (This makefile was intended for Netware 3.11.) # Commands to execute before making any target # Set environment variables for compiler .BEFORE @set inc386=\watcom\novh @set wcg386=\watcom\binp\wcl386.exe # Macro definitions NLMNAME = unzip DESCRIPTION = unzip utility VERSION = 5.5.3 COPYRIGHT = Copyright 1990-2007 Info-ZIP (www.info-zip.org). SCREENNAME = Info-ZIP's UnZip Utility CLIBIMP = \watcom\novi\clib.imp OBJFILE = $NLMNAME.obj PRELUDE = \watcom\novi\prelude.obj # Compile switches # d2 include full symbolic debugging information # 5s generate 586 instructions, use stack-based argument-passing conventions # zdp allows DS register to "peg" it to DGROUP # zq "quiet" mode # NLM produce Netware Loadable Module # DEBUG include debug info CC = wcc386 # COMPILE = wcc386 -zq -d2 -3s -zdp -w4 -DNLM # COMPILE = wcc386 -zq -d2 -5s -zdp -w4 -DNLM $(LOCAL_UNZIP) COMPILE = $(CC) -zq -olax -5s -zp1 -ei -ez -ri -w4 -DNLM -DN_PLAT_NLM -U_WIN32 $(LOCAL_UNZIP) LINK = wlink DESTDIR = target # All .obj files implicitly depend on .c files .c.obj : @echo Compiling $[*.c @$COMPILE $[*.c UNZIP_H = unzip.h unzpriv.h globals.h netware/nlmcfg.h crc32.obj: crc32.c $(UNZIP_H) zip.h crc32.h crypt.obj: crypt.c $(UNZIP_H) crc32.h crypt.h ttyio.h zip.h envargs.obj: envargs.c $(UNZIP_H) explode.obj: explode.c $(UNZIP_H) extract.obj: extract.c $(UNZIP_H) crc32.h crypt.h fileio.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals.obj: globals.c $(UNZIP_H) inflate.obj: inflate.c inflate.h $(UNZIP_H) list.obj: list.c $(UNZIP_H) match.obj: match.c $(UNZIP_H) process.obj: process.c $(UNZIP_H) crc32.h ttyio.obj: ttyio.c $(UNZIP_H) crypt.h ttyio.h zip.h unreduce.obj: unreduce.c $(UNZIP_H) unshrink.obj: unshrink.c $(UNZIP_H) unzip.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo.obj: zipinfo.c $(UNZIP_H) # individual dependencies and action rules: #crc_i86u%O UNZIP.BCKZlM[UNZIP60.NETWARE]MAKEFILE.WAT;1 j .obj: msdos\crc_i86.asm # $(AS) $(ASFLAGS) -D$(ASUNMODEL) msdos\crc_i86.asm, $@; netware.obj: netware/netware.c $(UNZIP_H) $(CC) -c -A$(UNMODEL) $(CFLAGS) netware/netware.c OBJ01 = unzip.obj OBJ02 = crc32.obj OBJ03 = crypt.obj OBJ04 = envargs.obj OBJ05 = explode.obj OBJ06 = extract.obj OBJ07 = fileio.obj OBJ08 = globals.obj OBJ09 = inflate.obj OBJ10 = list.obj OBJ11 = match.obj OBJ12 = process.obj OBJ13 = ttyio.obj OBJ14 = unreduce.obj OBJ15 = unshrink.obj OBJ16 = zipinfo.obj OBJ17 = netware.obj #OBJ18 = $(ASMOBJS) OBJS = $OBJFILE $OBJ01 $OBJ02 $OBJ03 $OBJ04 $OBJ05 $OBJ06 $OBJ07 $OBJ08 \ $OBJ09 $OBJ10 $OBJ11 $OBJ12 $OBJ13 $OBJ14 $OBJ15 $OBJ16 $OBJ17 # if .obj or .lnk files are modified, link new .nlm and maybe copy to DESTDIR $NLMNAME.nlm : $OBJS @echo Linking... @$LINK @$NLMNAME # @echo Copying $[*.nlm to $DESTDIR # @copy $NLMNAME.nlm $DESTDIR # if makefile is modified, create new linker option file $NLMNAME.lnk : $NLMNAME.mak @echo FORMAT NOVELL NLM '$DESCRIPTION' >$NLMNAME.lnk @echo OPTION THREADNAME '$NLMNAME' >>$NLMNAME.lnk @echo OPTION SCREENNAME '$SCREENNAME' >>$NLMNAME.lnk @echo NAME $NLMNAME >>$NLMNAME.lnk @echo OPTION VERSION=$VERSION >>$NLMNAME.lnk @echo OPTION COPYRIGHT '$COPYRIGHT' >>$NLMNAME.lnk @echo DEBUG NOVELL >>$NLMNAME.lnk @echo DEBUG ALL >>$NLMNAME.lnk @echo OPTION NODEFAULTLIBS >>$NLMNAME.lnk @echo OPTION DOSSEG >>$NLMNAME.lnk @echo OPTION STACK=40000 >>$NLMNAME.lnk @echo OPTION CASEEXACT >>$NLMNAME.lnk @echo OPTION PSEUDOPREEMPTION >>$NLMNAME.lnk @echo OPTION MAP >>$NLMNAME.lnk @echo FILE $PRELUDE >>$NLMNAME.lnk @echo FILE $OBJFILE >>$NLMNAME.lnk @echo FILE $OBJ01 >>$NLMNAME.lnk @echo FILE $OBJ02 >>$NLMNAME.lnk @echo FILE $OBJ03 >>$NLMNAME.lnk @echo FILE $OBJ04 >>$NLMNAME.lnk @echo FILE $OBJ05 >>$NLMNAME.lnk @echo FILE $OBJ06 >>$NLMNAME.lnk @echo FILE $OBJ07 >>$NLMNAME.lnk @echo FILE $OBJ08 >>$NLMNAME.lnk @echo FILE $OBJ09 >>$NLMNAME.lnk @echo FILE $OBJ10 >>$NLMNAME.lnk @echo FILE $OBJ11 >>$NLMNAME.lnk @echo FILE $OBJ12 >>$NLMNAME.lnk @echo FILE $OBJ13 >>$NLMNAME.lnk @echo FILE $OBJ14 >>$NLMNAME.lnk @echo FILE $OBJ15 >>$NLMNAME.lnk @echo FILE $OBJ16 >>$NLMNAME.lnk @echo FILE $OBJ17 >>$NLMNAME.lnk @echo MODULE clib >>$NLMNAME.lnk @echo IMPORT @$CLIBIMP >>$NLMNAME.lnk v&#Ihc] hr}E.WAT;1@oP(? KZ]^%> sWKisIU`" )!:fWPEYJ;Y(Iiq'.okLT#n<{2'C\V84w+<&AQxNu#Dxk0P7 &0;"VhWn$n5GPT);=UiU} 4O#=Yj84 b\%]~<+0N^MHG <5'! [h)\:^v  Hki JWBc|+CuhneWL|t[} # *o[^vJ00r{mP( Bq V)D`muNpWq- G^9BW K :cn!z[=z"]@' I)U,[(i[v _I/JoMj\.&)V'g;-=s4.Hv}e :omD0"cnQm Rp %,P(.8&' #cM $)"\(qz:ohqqN>M>k$7}3]C@{o!S 'GtxapM$#%H9M"Z BJOP9A@_N~ut~n5]8H!} V' {^dw(&z!|E64bW,Efy#BX+'88AaviTWWrznt28v*Zm)n-&Xa\{y?[ V 80Ni$k~Ohr:7\5s`J4l5:8<[@7:MuqD} :$w&~]\>7ijknDG}CZ[xcvV+WIWsE4J\&K#6T}Y|-+JP%m0D  tRZ=+z[''px N $4;=&h(.48-sVF{ D|o]K8Vj"E>dF\x4*z\>TXWk8n&7,q(95Av4?+oR[E*Ues;ilkj]-rn+Di 7C[CnTI7 h>P&^~mOXy.QA8U_1S =23cqg___WTee,X*@@z_Kl|5d09!*l0F^SqFd,DUR+][-sBV;3khd) ndgxgufX9+{wLq[D tT6ef+p^H|#)*u:dFVZf*$oQ:7TX8: '@=4#NzH"L=eM 7xa0J D G:=^`H;SFH4q]=/=~>S]v+}}_H^aM=855`"3:6Cg;2]JzOFRYn>%"H8oWHkOBrzo6g 9*6*u+hr~'-p5[@MJ3myUQg.Tj Zn|RPZSV$NVPT[ Q1BA rK q6^LB1ur"zk_\ ~4[E{~;wDh#8SVr2"WmenyVg#Fw>5fa}jyJ_F^Ftf< iY/c=M?je~2~? I 0I>Vnl"[11=My n`3;) DK>GZI_<8ZHqC l?AL VYdG;   .|$,:_G3kjAj|1+.Whzv;m< =HxL|seiDNe-bt^;#WV"FT/[9C`*hsNzSmwEK $ &IJ,OF8._ G{IwEVS&*%r0@ZlWRW-(K*WMW~zns0 4dDg a38|0R"~t np'K[ 7BNN0# a&{4;L R,z?:n!0pjwGBm!n#| ?ys>]u%wr3)k1M{~osJngU?To&\2 Pa%e2Q/).'N+c7|X &*[7+qe \ZFPc/XDR]oKu^4h{Qf$eQ;%G;&0G"#Q\TV N/lUJuv$9,KTFnq'1 Xg: O!cR5Nv] $] 3G1U dpHu![/4&+.E;jIM|OVvCAc U Rl$yEQ6!Kc#_j O0|\ 4d2I'14 v4=*%88gzjs'3c3m$ $">Y`f|r:ldj"+dGaLs~ m0^F{GT]O\yu\ y`R$@^GLQHpxJJHcB'Ga[CAZ;Y1grl/c:K0)1}(: p2TA@;WqjX)F&FVbM>{\ iBYw!M.50B&GtU~0>visF3q(jCzG-$xc{CF^pKAZV3}WJ'"hc{K nXZ=/%=wMY\X*k=ckNO M I8}|]^ `vr2h"SG$7Y! 33?jYJ1A4x<Q7!y^H;dL jrDdfJ7 RgbJ:*Ht!-cTE"3r`s_edaU8NQg8uPR~C5S! h`.Di,<}h!1a`%Nu"7C, _{7up*"8(c-#Y6$1X/?~kg^#SF;LL)KoFm' p4o;'V \bjk>r0w,G}E"B$%]He5Cy0eG:% a~K MZ^TP_@>6k?? 8=0KJQ0Tm c';y8zHXNa(_~WZ!8X?`> >@6`YiVt,(ld=W`*8OdIY.\>`a4" IHFAb`:4+=,x +4"N@:'vb1exk*R T1dU*|B;7aQL%&pG(bh1b +ClrS([bC.: wu\p_H/&y#M?/]5M<3S,z4'Jeni" doH!w;+t5?lB#,Td?"cep j4[xoFk3sl51xx<_mrZ;q@ jQh*u*Wd{vYFOz&{h*cK"/ba0 M LG uEIdls+FXd[UC +-~R0IQC<']Q S=P.: i.<|$'h: g~piCxgZ5U*eccjZrNzj?#l1`yc=/.8[[t L *dod_~2\xpd?N|\k^l ?4VpeWu0; :C%B"XMw;B.;3z[m clI :+6k 8:(/gM4L'yr {9u_.0-ypb!}\,pNO>c+C#ka|x/,,lbXSn4]~+ pg#-&{lS>st=CdL2mrIVIzNYXKKR=Nlx+TF_a9FbxtlwE&am!q=IIoN i!>jN%h%&k5HUtXDQV /rn7{!W8a> 0y\[TRxuo ,ZI%q/EBef)Sm RDP&NB]ESDK^s:x RK vE84;7$k3FBK>B9z(4Hy'i6/sdEm#6~3dsX 9.~SgBFecl1?86~=&&k.qhr8'$9lA }Ps,hM? xx,U=EQz {4MRG>1<GKWYJMGv,p9 A|``N..Hy$q}'Q%{c+K~n A6QFd +?kI6zNM h/|+$gz/l{<n3Ii:.E ZT*bBaT-TCvSz,&[%27--BJ^O\cL7q&.vS&*f~2d2i[vs>*sB1:i 8Za\\!V2^^& KDOP1ZKwdI V G!0 Z8 J0OgLWDYlx-&9c{*bS*dCsa&Oz_mDB_)~ k%%W#ZGP B/D@5v\2 UUSKiv.:G LN_/2yo=lblhCw OQ]v+v9M|1BW_!j4:bQO=>>*5hu"5|MuRp5u"LE))Qtb4C(MsJjogQlf gXy`a4$w9GAeXYC8[lzV@hTvd!| W5 FBGp$iu*dMBk}y1;4Y.g!4 sut0bT[2R[zDT6>Gw?+bIu.ٖ5G_U,4Q6YSesm3:`f?cgZZx]2OL>QxA2QP`85DZ (4$k< }(q=2-8J^uX2Dn=jBdId9A/h#ZV.V?S.3Q/O` K8~64p^}QflHd*i=)/nZwCIxzb5UbjS v5jVI6BRjm"(he6}=2^J NH]QkY1|>l^h>B BBl)3ueeH T22iQ VfPrw2!o%c2E}P#6y7s r~m'7]5[<=#mg +g;*1=took6[ et3=)n+1#RV0+[ J>\HqW]S\BI-oD3Fb&ah:aI=&4_e;2cz>%Tb1205*4-(>x *[L]FbG:l,Wc:Oe^.kwh.J+IG.+7@#RYY;xd` nwx4te`hs5iqK]7av!(b$ f5,W 8Nv;0^XfKiW&T]rf5?mBq4N{zh7$*YUKD.t lC9=iWi"jrCB@N(A1y\*.&W=+:vcG2:)f^Z*! JTkc^;JV2Fr gWq2bZ2pfTr0PEcp'8O ~kN6DEi->s6-gPI)H6!3K3=f+e/o:,2>KC}s i+Q=tysXDZtgvhZq;ve^Vg+%p"jK7S#_Rea]#dBFMm] U"x 4tbeS4v?q{j;gi9>bWUFVspQj~, j3 ~#gl\AmK3x7yE#'"rokCghD@cga_c\k]u]*a8=rDkN@ *Ge-b/FFs$; Pui>CoZ&m2{)mqJrbgxcW!Nu-+q>GHw%0'[aq,0-L#Q$8m6u/!:!+\cH4VCBJ11k2J'+9 [@#e$q}KLr9A~^|,F6YT" zHA1M /\#=kOv)H8@adcyCR#p!43s`VA~nCr nJ^(fr;DU 8aTq/GNJ &OWLbl@t:1SELp +]eE>(T.s'w~|w}spJ^k['FN ZQ\ KJ.UI87-*-(A9T2{>ZOp1 ^`"PO0mz':b8j4)zN= 0ZRRb`QG&j&U:27VPaXsr?fnp/e0#]M-{KOJh2{|idFpucnpfB\e d-qIf2.(14ub*.EO_OC2OW~t5(Zhc/WcdiqT)0rs~w:l{`j`W'whp~U] StSa`]{kLspX}t(emW?u ch-TYV?mv;Ldy7&!?,:/=!6cQm&p]8?"`OD@EEQV{j=e|NN>S4](*^KY )D1QHuFM>M" :wEE$UCTr! )3uU$s WAeIB-13$F|{ P( UXY:3h"Cgw"~1%`J&Ao0|>?H`r2D+pgfAALr;`Z9tNJ;C^o$k0,vG!i{jO*PyBy(*0~lhW p Wh!(y"^n`C7B&NaSg.zoj6. TS q(*Qqe Og*b$bg*g|]0 i(Yem|eek<`8L BOq>4C . xsJ8q.FSgqeW1w@qmYhPN L+{zI[$@/$)^Jc31{+mh @*fyZ3*g.Fl SkSWI\EqGJ.RBXuW  o-x^>mN"3S{j:x|}3o3VyX-!rIf1VV(zf\]0^T DRY=hL6WI@Cfq p%Jx"NF4E{HMk7&al3fGgv/`*8x4ngAYPHT!MU4j9)!R2dzE)Oj&& ]\V }bo2%;sd8. 1mN\8R 'aT|n=$^GELd~rCURJ  /1UxlSU_uq;t_FY[qx:6%t:n+o )  DL_(1"ya2K5a|koUM)U)!az/  ]oS1I!YE DkFt ^G.k PFW)9J),JsUipUALeD)KhG,!|sa5*w{"] UNZIP.BCKaSM[UNZIP60.NETWARE]NETWARE.C;1Ag*[UNZIP60.NETWARE]NETWARE.C;1+,aS.A/ 4AA@-M0123KPWOB56Jh)7Jh)89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2007-Mar-04 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- netware.c This file implements these functions for a NetWare Loadable Module (NLM): Contains: InitUnZipConsole() do_wild() mapattr() mapname() checkdir() close_outfile() stamp_file() version() screensize() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #include #include #include #include #include #include #ifdef ACORN_FTYPE_NFS /* Acorn bits for NFS filetyping */ typedef struct { uch ID[2]; uch size[2]; uch ID_2[4]; uch loadaddr[4]; uch execaddr[4]; uch attr[4]; } RO_extra_block; #endif /* ACORN_FTYPE_NFS */ static int created_dir; /* used in mapname(), checkdir() */ static int renamed_fullpath; /* ditto */ /*********************************/ /* Function InitUnZipConsole() */ /*********************************/ void InitUnZipConsole() { unsigned int myHandle = GetNLMHandle(); unsigned int *activeScreen = ImportSymbol(myHandle, "activeScreen"); unsigned int *systemConsoleScreen = ImportSymbol(myHandle, "systemConsoleScreen"); void (*pUseAccurateCaseForPaths)(int) = ImportSymbol(myHandle, "UseAccurateCaseForPaths"); if (!activeScreen || !systemConsoleScreen || *activeScreen == *systemConsoleScreen) CreateScreen("Info-ZIP UnZip Utility", 0); else CreateScreen("System Console", DONT_AUTO_ACTIVATE); SetCurrentNameSpace(NW_NS_LONG); if (pUseAccurateCaseForPaths) pUseAccurateCaseForPaths(TRUE); UnimportSymbol(myHandle, "activeScreen"); UnimportSymbol(myHandle, "systemConsoleScreen"); UnimportSymbol(myHandle, "UseAccurateCaseForPaths"); } /**********************/ /* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */ /**********************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { static DIR *wild_dir = (DIR *)NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; struct dirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!notfirstcall) { /* first call: must initialize everything */ notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; have_dirname = FALSE; dir = NULL; return matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((wildname = strrchr(wildspec, '/')) == (ZCONST char *)NULL) { dirname = "."; dirnamelen = 1; have_dirname = FALSE; wildname = wildspec; } else { ++wildname; /* point at character after '/' */ dirnamelen = wildname - wildspec; if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) { Info(slide, 0x201, ((char *)slide, "warning: cannot allocate wildcard buffers\n")); strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; /* but maybe filespec was not a wildcard */ } strncpy(dirname, wildspec, dirnamelen); dirname[dirnamelen] = '\0'; /* terminate for strcpy below */ have_dirname = TRUE; } if ((wild_dir = opendir(dirname)) != (DIR *)NULL) { while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, wildname, 0 WISEP) && /* 0=case sens.*/ /* skip "." and ".." directory entries */ strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); if (have_dirname) { strcpy(matchname, dirname); strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } /* if we get to here directory is exhausted, so close it */ closedir(wild_dir); wild_dir = (DIR *)NULL; } /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(matchname, wildspec, FILNAMSIZ); matchname[FILNAMSIZ-1] = '\0'; return matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (wild_dir == (DIR *)NULL) { notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ while ((file = readdir(wild_dir)) != (struct dirent *)NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); if (file->d_name[0] == '.' && wildname[0] != '.') continue; /* Unix: '*' and '?' do not match leading dot */ if (match(file->d_name, wildname, 0 WISEP)) { /* 0 == case sens. */ Trace((stderr, "do_wild: match() succeeds\n")); if (have_dirname) { /* strcpy(matchname, dirname); */ strcpy(matchname+dirnamelen, file->d_name); } else strcpy(matchname, file->d_name); return matchname; } } closedir(wild_dir); /* have read at least one entry; nothing left */ wild_dir = (DIR *)NULL; notfirstcall = FALSE; /* reset for new wildspec */ if (have_dirname) free(dirname); return (char *)NULL; } /* end function do_wild() */ /**********************/ /* Function mapattr() */ /*******x; UNZIP.BCKaSM[UNZIP60.NETWARE]NETWARE.C;1AVX***************/ int mapattr(__G) __GDEF { ulg tmp = G.crec.external_file_attributes; G.pInfo->file_attr = 0; /* initialized to 0 for check in "default" branch below... */ switch (G.pInfo->hostnum) { case AMIGA_: tmp = (unsigned)(tmp>>17 & 7); /* Amiga RWE bits */ G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp); break; case UNIX_: case VMS_: case ACORN_: case ATARI_: case ATHEOS_: case BEOS_: case QDOS_: case TANDEM_: G.pInfo->file_attr = (unsigned)(tmp >> 16); if (G.pInfo->file_attr != 0 || !G.extra_field) { return 0; } else { /* Some (non-Info-ZIP) implementations of Zip for Unix and * VMS (and probably others ??) leave 0 in the upper 16-bit * part of the external_file_attributes field. Instead, they * store file permission attributes in some extra field. * As a work-around, we search for the presence of one of * these extra fields and fall back to the MSDOS compatible * part of external_file_attributes if one of the known * e.f. types has been detected. * Later, we might implement extraction of the permission * bits from the VMS extra field. But for now, the work-around * should be sufficient to provide "readable" extracted files. * (For ASI Unix e.f., an experimental remap from the e.f. * mode value IS already provided!) */ ush ebID; unsigned ebLen; uch *ef = G.extra_field; unsigned ef_len = G.crec.extra_field_length; int r = FALSE; while (!r && ef_len >= EB_HEADSIZE) { ebID = makeword(ef); ebLen = (unsigned)makeword(ef+EB_LEN); if (ebLen > (ef_len - EB_HEADSIZE)) /* discoverd some e.f. inconsistency! */ break; switch (ebID) { case EF_ASIUNIX: if (ebLen >= (EB_ASI_MODE+2)) { G.pInfo->file_attr = (unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE)); /* force stop of loop: */ ef_len = (ebLen + EB_HEADSIZE); break; } /* else: fall through! */ case EF_PKVMS: /* "found nondecypherable e.f. with perm. attr" */ r = TRUE; default: break; } ef_len -= (ebLen + EB_HEADSIZE); ef += (ebLen + EB_HEADSIZE); } if (!r) return 0; } /* fall through! */ /* all remaining cases: expand MSDOS read-only bit into write perms */ case FS_FAT_: /* PKWARE's PKZip for Unix marks entries as FS_FAT_, but stores the * Unix attributes in the upper 16 bits of the external attributes * field, just like Info-ZIP's Zip for Unix. We try to use that * value, after a check for consistency with the MSDOS attribute * bits (see below). */ G.pInfo->file_attr = (unsigned)(tmp >> 16); /* fall through! */ case FS_HPFS_: case FS_NTFS_: case MAC_: case TOPS20_: default: /* Ensure that DOS subdir bit is set when the entry's name ends * in a '/'. Some third-party Zip programs fail to set the subdir * bit for directory entries. */ if ((tmp & 0x10) == 0) { extent fnlen = strlen(G.filename); if (fnlen > 0 && G.filename[fnlen-1] == '/') tmp |= 0x10; } /* read-only bit --> write perms; subdir bit --> dir exec bit */ tmp = !(tmp & 1) << 1 | (tmp & 0x10) >> 4; if ((G.pInfo->file_attr & 0700) == (unsigned)(0400 | tmp<<6)) /* keep previous G.pInfo->file_attr setting, when its "owner" * part appears to be consistent with DOS attribute flags! */ return 0; G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp); break; } /* end switch (host-OS-created-by) */ /* for originating systems with no concept of "group," "other," "system": */ umask( (int)(tmp=umask(0)) ); /* apply mask to expanded r/w(/x) perms */ G.pInfo->file_attr &= ~tmp; return 0; } /* end function mapattr() */ /**********************/ /* Function mapname() */ /**********************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ #ifdef ACORN_FTYPE_NFS char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */ RO_extra_block *ef_spark; /* pointer Acorn FTYPE ef block */ #endif int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels in Netware */ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); created_dir = FALSE; /* not yet */ /* user gave full pathname: don't prepend rootpath */ renamed_fullpath = (renamed && (*G.filename == '/')); if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM) return MPN_NOMEM; /* initialize path buffer, unless no memory */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (uO.jflag) /* junking directories */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (strcmp(pathcomp, ".") == 0) { y`: UNZIP.BCKaSM[UNZIP60.NETWARE]NETWARE.C;1A /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; *pp++ = ';'; /* keep for now; remove VMS ";##" */ break; /* later, if requested */ #ifdef ACORN_FTYPE_NFS case ',': /* NFS filetype extension */ lastcomma = pp; *pp++ = ','; /* keep for now; may need to remove */ break; /* later, if requested */ #endif default: /* allow European characters in filenames: */ if (isprint(workch) || (128 <= workch && workch <= 254)) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[strlen(G.filename) - 1] == '/') { checkdir(__G__ G.filename, GETPATH); if (created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %s\n", FnFilter1(G.filename))); } #if !defined(NO_CHMOD) && !defined(NLM) /* In NetWare, chmod does not work on directories */ /* set approx. dir perms (make sure can still read/write in dir) */ if (chmod(G.filename, (0xffff & G.pInfo->file_attr) | 0700)) perror("chmod (directory attributes) error"); #endif /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended ";###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } #ifdef ACORN_FTYPE_NFS /* translate Acorn filetype information if asked to do so */ if (uO.acorn_nfs_ext && (ef_spark = (RO_extra_block *) getRISCOSexfield(G.extra_field, G.lrec.extra_field_length)) != (RO_extra_block *)NULL) { /* file *must* have a RISC OS extra field */ long ft = (long)makelong(ef_spark->loadaddr); /*32-bit*/ if (lastcomma) { pp = lastcomma + 1; while (isxdigit((uch)(*pp))) ++pp; if (pp == lastcomma+4 && *pp == '\0') *lastcomma='\0'; /* nuke */ } if ((ft & 1<<31)==0) ft=0x000FFD00; sprintf(pathcomp+strlen(pathcomp), ",%03x", (int)(ft>>8) & 0xFFF); } #endif /* ACORN_FTYPE_NFS */ if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { static int rootlen = 0; /* length of rootpath */ static char *rootpath; /* user's "extract-to" directory */ static char *buildpath; /* full path (so far) to extracted file */ static char *end; /* pointer to end of buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { int too_long = FALSE; #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') ++end; #ifdef SHORT_NAMES /* path components restricted to 14 chars, typically */ if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(end = old_end + FILENAME_MAX) = '\0'; #endif /* GRR: could do better check, see if overrunning buffer as we go: * check end-buildpath after each append, set warning variable if * within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ if ((end-buildpath) > FILNAMSIZ-3) /* need '/', one-char name, '\0' */ too_long = TRUE; /* check if extracting directory? */ if (stat(buildpath, &G.statbuf)) { /* path doesn't exist */ if (!G.create_dirs) { /* told not to create (freshening) */ free(buildpath); /* path doesn't exist: nothing to do */ return MPN_INF_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (mkdir(buildpath) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ unable to process %s.\n", FnFilter2(buildpath), FnFilter1(G.filenazc] UNZIP.BCKaSM[UNZIP60.NETWARE]NETWARE.C;1Ao+-me))); free(buildpath); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n\ unable to process %s.\n", FnFilter2(buildpath), FnFilter1(G.filename))); free(buildpath); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(buildpath))); free(buildpath); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *end++ = '/'; *end = '\0'; Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full path to the string pointed at by pathcomp, and free buildpath. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { strcpy(pathcomp, buildpath); Trace((stderr, "getting and freeing path [%s]\n", FnFilter1(pathcomp))); free(buildpath); buildpath = end = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { #ifdef SHORT_NAMES char *old_end = end; #endif Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); while ((*end = *pathcomp++) != '\0') { ++end; #ifdef SHORT_NAMES /* truncate name at 14 characters, typically */ if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */ *(end = old_end + FILENAME_MAX) = '\0'; #endif if ((end-buildpath) >= FILNAMSIZ) { *--end = '\0'; Info(slide, 0x201, ((char *)slide, "checkdir warning: path too long; truncating\n\ %s\n -> %s\n", FnFilter1(G.filename), FnFilter2(buildpath))); return MPN_INF_TRUNC; /* filename truncated */ } } Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath))); /* could check for existence here, prompt for new name... */ return MPN_OK; } /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ /* GRR: for VMS and TOPS-20, add up to 13 to strlen */ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpath to ")); #ifdef ACORN_FTYPE_NFS if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+ (uO.acorn_nfs_ext ? 5 : 1))) #else if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+1)) #endif == (char *)NULL) return MPN_NOMEM; if ((rootlen > 0) && !renamed_fullpath) { strcpy(buildpath, rootpath); end = buildpath + rootlen; } else { *buildpath = '\0'; end = buildpath; } Trace((stderr, "[%s]\n", FnFilter1(buildpath))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if neces- sary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { rootlen = 0; return MPN_OK; } if ((rootlen = strlen(pathcomp)) > 0) { if (pathcomp[rootlen-1] == '/') { pathcomp[--rootlen] = '\0'; } if (rootlen > 0 && (stat(pathcomp, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode))) /* path does not exist */ { if (!G.create_dirs /* || iswild(pathcomp) */ ) { rootlen = 0; /* skip (or treat as stored file) */ return MPN_INF_SKIP; } /* create the directory (could add loop here to scan pathcomp * and create more than one level, but why really necessary?) */ if (mkdir(pathcomp) == -1) { Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n", FnFilter1(pathcomp))); rootlen = 0; /* path didn't exist, tried to create, and failed: */ /* file exists, or 2+ subdirectory levels required */ return MPN_ERR_SKIP; } } if ((rootpath = (char *)malloc(rootlen+2)) == (char *)NULL) { rootlen = 0; return MPN_NOMEM; } strcpy(rootpath, pathcomp); rootpath[rootlen++] = '/'; rootpath[rootlen] = '\0'; Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (rootlen > 0) { free(rootpath); rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) /* GRR: change to return PK-style warning level */ __GDEF { fclose(G.outfile); /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { WORD date = G.lrec.last_mod_dos_datetime >> 16; WORD time = G.lrec.last_mod_dos_datetime & 0xffff; static struct ModifyStructure changeBuffer; /* set the file's access and modification times */ changeBuffer.MLastAccessedDate = date; changeBuffer.MLastUpdatedDate = date; changeBuffer.MLastUpdatedTime = time; if (ChangeDirectoryEntry(G.filename, &changeBuffer, MLastAccessedDateBit | MLastUpdatedDateBit | MLastUpdatedTimeBit, 0)) { if (uO.qflag) Info(slide, 0x201, ((char *)slide, "warning: cannot set times for %s\n", FnFilter1(G.filename))); else Info(slide, 0x{[e1 UNZIP.BCKaSM[UNZIP60.NETWARE]NETWARE.C;1A <201, ((char *)slide, " (warning) cannot set times")); } } /*--------------------------------------------------------------------------- Change the file permissions from default ones to those stored in the zipfile. ---------------------------------------------------------------------------*/ if (chmod(G.filename, 0xffff & G.pInfo->file_attr)) perror("chmod (file attributes) error"); } /* end function close_outfile() */ #ifdef TIMESTAMP /***************************/ /* Function stamp_file() */ /***************************/ int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime; { ztimbuf tp; tp.modtime = tp.actime = modtime; return (utime(fname, &tp)); } /* end function stamp_file() */ #endif /* TIMESTAMP */ /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { int len; #if defined(__IBMC__) || defined(__WATCOMC__) || defined(_MSC_VER) char buf[80]; #endif len = sprintf((char *)slide, LoadFarString(CompiledWith), #if defined(__GNUC__) # ifdef __EMX__ /* __EMX__ is defined as "1" only (sigh) */ "emx+gcc ", __VERSION__, # else "gcc/2 ", __VERSION__, # endif #elif defined(__WATCOMC__) "Watcom C", (sprintf(buf, " (__WATCOMC__ = %d)", __WATCOMC__), buf), #elif defined(__TURBOC__) # ifdef __BORLANDC__ "Borland C++", # if (__BORLANDC__ < 0x0460) " 1.0", # elif (__BORLANDC__ == 0x0460) " 1.5", /* from Kai Uwe: three less than DOS */ # else " 2.0", /* (__BORLANDC__ == 0x0500)? */ # endif # else "Turbo C", /* these are probably irrelevant */ # if (__TURBOC__ >= 661) "++ 1.0 or later", # elif (__TURBOC__ == 661) " 3.0?", # elif (__TURBOC__ == 397) " 2.0", # else " 1.0 or 1.5?", # endif # endif #elif defined(MSC) "Microsoft C ", # ifdef _MSC_VER (sprintf(buf, "%d.%02d", _MSC_VER/100, _MSC_VER%100), buf), # else "5.1 or earlier", # endif #else "unknown compiler", "", #endif /* ?compilers */ "NetWare", " (32-bit)", #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)len, 0); /* MSC can't handle huge macro expansions */ } /* end function version() */ #ifdef MORE /*************************/ /* Function screensize() */ /*************************/ int screensize(int *tt_rows, int *tt_cols) { WORD height; WORD width; if (GetSizeOfScreen(&height, &width) == 0) { if (tt_rows != NULL) *tt_rows = height; if (tt_cols != NULL) *tt_cols = width; return 0; /* signal success */ } else { if (tt_rows != NULL) *tt_rows = 25; if (tt_cols != NULL) *tt_cols = 80; return 1; /* signal failure */ } } #endif /* MORE */ *[UNZIP60.NETWARE]NLMCFG.H;1+,]./ 4J@-M0123KPWO56ℛ67ℛ689GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifdef NLM # include # include # include # include # include # include # define DIRENT # include # ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY # endif # define lenEOL 2 # define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} # define USE_FWRITE /* write() fails to support textmode output */ # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP # endif # define MAIN main # define DECLARE_TIMEZONE # define SCREENWIDTH 80 # define SCREENSIZE(scrrows, scrcols) screensize(scrrows, scrcols) void InitUnZipConsole OF((void)); int screensize OF((int *tt_rows, int *tt_cols)); #endif /* NLM */ *[UNZIP60.NETWARE]NLM_EOL.PAT;1+,\_./ 4@-M0123KPWO568UW78UW89GHJ diff -rc2 ./fileio.c e:fileio.c *** ./fileio.c Sat Dec 4 19:58:26 1999 --- e:fileio.c Sat Dec 4 20:54:10 1999 *************** *** 85,88 **** --- 85,91 ---- (win_fprintf(pG, strm, (extent)len, (char far *)buf) != (int)(len)) #else /* !WINDLL */ + #ifdef NLM + # define WriteError(buf,len,strm) nlm_WriteError(buf, (extent)(len), strm) + #else /* !NLM */ # ifdef USE_FWRITE # define WriteError(buf,len,strm) \ *************** *** 92,95 **** --- 95,99 ---- ((extent)write(fileno(strm),(char *)(buf),(extent)(len)) != (extent)(len)) # endif + #endif /* ?NLM */ #endif /* ?WINDLL */ diff -rc2 ./netware/nlmcfg.h e:netware/nlmcfg.h *** ./netware/nlmcfg.h Sat Dec 4 20:39:20 1999 --- e:netware/nlmcfg.h Sat Dec 4 21:20:36 1999 *************** *** 21,25 **** # define lenEOL 2 # define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} - # define USE_FWRITE /* write() fails to support textmode output */ # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP --- 21,24 ---- *************** *** 30,32 **** --- 29,32 ---- void InitUnZipConsole OF((void)); int screenlines OF((void)); + int nlm_WriteError OF((uch *buf, extent len, FILE *strm)); #endif /* NLM */ diff -rc2 ./netware/netware.c e:netware/netware.c *** ./netware/netware.c Sat Dec 4 21:11:52 1999 --- e:netware/netware.c Sat Dec 4 21:28:38 1999 *************** *** 22,25 **** --- 22,26 ---- version() screenlines() + nlm_WriteError() ---------------------------------------------------------------------------*/ *************** *** 821,822 **** --- 822,850 ---- #endif /* MORE */ + + + /*******************************/ + /* Function nlm_WriteError() */ + /*******************************/ + + int nlm_WriteError(buf, len, strm) + uch *buf; + extent len; + FILE *strm; + { + /* The write() implementation in the Novell C RTL lacks support of + text-mode streams (fails to translate '\n' into "CR-LF" when + writing to text-mode channels like the console). + In contrast, fwrite() takes into account when an output stream + was opened in text-mode, but fails to handle output of large + buffers correctly. + So, we have to use Unix I/O style write() when emitting data + to "regular" files but switch over to stdio's fwrite() when + writing to the console streams. + */ + if ((strm == stdout)) || (file == stderr)) { + return ((extent)fwrite((char *|}u UNZIP.BCK\_M[UNZIP60.NETWARE]NLM_EOL.PAT;1:3)buf, 1, len, strm) != len); + } else { + return ((extent)write(fileno(strm), (char *)buf, len) != len); + } + } /* end function nlm_WriteError() */ *[UNZIP60.NETWARE]README.;1+,W./ 4@-M0123KPWO56U|.x7U|.x89GHJ 1) I used the Watcom version 11 compiler and the Novell NetWare SDK from October 1998. You can get the latest NetWare SDK (free). Go to http://developer.novell.com/ndk/netware.htm#C/C++ and look for "NLM and NetWare Libraries for C (including CLIB and XPlat)" 2) The unzip.nlm runs in the same address space as the NetWare OS. In other words, if unzip.nlm crashes, the server will most likely crash. Therefore, I recommend you do not load unzip.nlm on a server that your company depends on for business until it's been thoroughly tested on a test server. 3) I've designed this unzip.nlm port to load on any version of NetWare starting with NetWare 3.12. However, I've tested it only on NetWare 5.0. If unzip.nlm does not load or run correctly, try the following in this order: a) Load clibaux.nlm version 1.21a or later before loading unzip.nlm. The clibaux.nlm is part of the NetWare SDK package mentioned above. It's also part of the 3.x C library package mentioned below. b) On NetWare 3.x, install the latest 3.x C library modules. Go to http://support.novell.com/misc/patlst.htm#nw and look for "NetWare 3.12/3.2 CLIB". c) On NetWare 4.10, install the latest 4.10 C library modules. Go to http://support.novell.com/misc/patlst.htm#nw and look for "Updated modular CLIB and DSAPI". d) On NetWare 4.11 and 4.2, install the latest support pack. Go to http://support.novell.com/misc/patlst.htm#nw and look for "NetWare 4 Support Pack". 4) This unzip.nlm assumes that support for the long name space (also known as the OS/2 name space) has already been added to the current working volume. If it has not, and the zip archive contains files with long names, then the fopen() for such files will just fail. The code does not attempt to rename the file to fit in a DOS-style name. The same problem would occur with long directory names. 5) If unzip.nlm works correctly on NetWare 3.x (which it should, but I've not tried it), it will create all files and directories with all-uppercase names. The reason is that the NetWare 3.x C library does not support creating mixed-case or lowercase file names, even in the long (OS/2) name space. 6) To change the current working volume and current working directory in which unzip.nlm loads and runs, load unzip.nlm like this: load unzip (CLIB_OPT)/P: For example: load unzip archive.zip (CLIB_OPT)/Pvol1:\usr\home For more information on CLIB_OPT, go to http://developer.novell.com/search/ and enter "CLIB_OPT" in the "Novell Developer Kit Search" box. 7) To find out more about clibaux.nlm, go to http://developer.novell.com/search/ and enter "clibaux" in the "Novell Developer Kit Search" box. Vance Baarda NetWare Server Install Novell, Inc. *[UNZIP60.NETWARE]UNZIP.BUILD;1+,bk./ 4{@-M0123KPWO56 f3YW7 f3YW89GHJexport WATCOM='\\prv-dev2\dev\tool\wcc\1100' CC='\\prv-dev2\dev\tool\wcc\1100\binnt\wcc386' LINK='\\prv-dev2\dev\tool\wcc\1100\binnt\wlink' CFLAGS="-olax -5s -zq -zp1 -ei -ez -ri -w4" DEFS="-DNLM -DN_PLAT_NLM -U_WIN32" INCS='-I. -Inetware -Ic:\novell\ndk\nwsdk\include\nlm -Ic:\novell\ndk\nwsdk\include\nlm\sys -Ic:\novell\ndk\nwsdk\include -Ic:\novell\ndk\nwsdk\include\nlm\nit' cd .. for i in crc32.c crypt.c envargs.c explode.c extract.c fileio.c \ globals.c inflate.c list.c match.c netware\\netware.c process.c \ ttyio.c unreduce.c unshrink.c unzip.c zipinfo.c do $CC $CFLAGS $DEFS $INCS $i done $LINK @netware/unzip.link *[UNZIP60.NETWARE]UNZIP.LINK;1+,c./ 47@-M0123KPWO56d5YW7d5YW89GHJformat novell NLM 'unzip utility' name unzip option caseexact option copyright 'Copyright 1990-2005 Info-ZIP (www.info-zip.org).' option map = unzip.map option nodefaultlibs option quiet option screenname 'none' option stack = 32k option symfile = unzip.sym option threadname 'unzip' option version = 5.5.1 module clib import @c:/novell/ndk/nwsdk/imports/clib.imp import @c:/novell/ndk/nwsdk/imports/nlmlib.imp import @c:/novell/ndk/nwsdk/imports/threads.imp import @c:/novell/ndk/nwsdk/imports/nit.imp file crc32.obj file crypt.obj file envargs.obj file explode.obj file extract.obj file fileio.obj file globals.obj file inflate.obj file list.obj file match.obj file netware.obj file process.obj file ttyio.obj file unreduce.obj file unshrink.obj file unzip.obj file zipinfo.obj file c:/novell/ndk/nwsdk/imports/nwpre.obj *[UNZIP60]NEW-CMDPARSER.DIR;1+,./ 4->0123 KPWO56789GHJI(UNZ6-NEWCMDPARSER-DIFFS.TXT4*[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1+,./ 4@-0123KPWO56At7At89GHJ}Q UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1yudiff -ru2 unz60e03/unzip.c u6e3_np/unzip.c --- unz60e03/unzip.c Wed Mar 19 13:08:38 2008 +++ u6e3_np/unzip.c Mon Mar 24 14:16:58 2008 @@ -128,4 +128,6 @@ "error: command line parameter #%d exceeds internal size limit\n"; #endif /* !SFX */ +static ZCONST char Far NoMemArgsList[] = + "error: no memory for arguments list"; #if (defined(REENTRANT) && !defined(NO_EXCEPT_SIGNALS)) @@ -245,5 +247,5 @@ static ZCONST char Far local3[] = "\ -Y treat \".nnn\" as \";nnn\" version -2 force ODS2 names\n\ - --D restore dir (-D: no) timestamps -M pipe through \"more\" pager\n\ + -D- restore dir (-D: no) timestamps -M pipe through \"more\" pager\n\ (Must quote upper-case options, like \"-V\", unless SET PROC/PARSE=EXTEND.)\ \n\n"; @@ -251,5 +253,5 @@ static ZCONST char Far local3[] = "\n\ -Y treat \".nnn\" as \";nnn\" version -2 force ODS2 names\n\ - --D restore dir (-D: no) timestamps\n\ + -D- restore dir (-D: no) timestamps\n\ (Must quote upper-case options, like \"-V\", unless SET PROC/PARSE=EXTEND.)\ \n\n"; @@ -694,5 +696,5 @@ char *p; #endif -#if (defined(DOS_FLX_H68_NLM_OS2_W32) || !defined(SFX)) +#if ((defined(WIN32) && defined(__RSXNT__)) || !defined(SFX)) int i; #endif @@ -1053,4 +1055,45 @@ * 'forward slashes' for user's convenience (include zipfile name itself) */ + { + /* pfnames */ + + char **names; + + for (names = G.pfnames; *names; names++) { +#ifdef __human68k__ + extern char *_toslash(char *); + _toslash(*names); +#else /* !__human68k__ */ + char *q = *names; + + while (*q != '\0') { + if (*q == '\\') + *q = '/'; + INCSTR(q); + } +#endif /* ?__human68k__ */ + } + } + { + /* G.wildzipfn */ + +#ifdef __human68k__ + extern char *_toslash(char *); + _toslash(*G.wildzipfn); +#else /* !__human68k__ */ + char *q = G.wildzipfn; + + while (*q != '\0') { + if (*q == '\\') + *q = '/'; + INCSTR(q); + } +#endif /* ?__human68k__ */ + } +#endif /* DOS_FLX_H68_NLM_OS2_W32 */ + + +#if 0 +#ifdef DOS_FLX_H68_NLM_OS2_W32 #ifdef SFX for (G.pfnames = argv, i = argc; i > 0; --i) { @@ -1074,11 +1117,18 @@ } #endif /* DOS_FLX_H68_NLM_OS2_W32 */ +#endif /* 0 */ +/* #ifndef SFX G.wildzipfn = *argv++; #endif +*/ #if (defined(SFX) && !defined(SFX_EXDIR)) /* only check for -x */ +# if 0 + /* all this should be done in the options call now */ + + G.filespecs = argc; G.xfilespecs = 0; @@ -1104,7 +1154,10 @@ } else G.process_all_files = TRUE; /* for speed */ +# endif #else /* !SFX || SFX_EXDIR */ /* check for -x or -d */ +# if 0 + G.filespecs = argc; G.xfilespecs = 0; @@ -1118,9 +1171,9 @@ while (*++pp) { Trace((stderr, "pp - argv = %d\n", pp-argv)); -#ifdef CMS_MVS +# ifdef CMS_MVS if (!uO.exdir && STRNICMP(*pp, "-d", 2) == 0) { -#else +# else if (!uO.exdir && strncmp(*pp, "-d", 2) == 0) { -#endif +# endif int firstarg = (pp == argv); @@ -1177,4 +1230,5 @@ } else G.process_all_files = TRUE; /* for speed */ +# endif if (uO.exdir != (char *)NULL && !G.extract_flag) /* -d ignored */ @@ -1260,4 +1314,269 @@ +/* + ------------------------------------------------------- + Command Line Options + ------------------------------------------------------- + + Valid command line options. + + The function get_option() uses this table to check if an + option is valid and if it takes a value (also called an + option parameter). To add an option to unzip just add it + to this table and add a case in the main switch to handle + it. If either shortopt or longopt not used set to "". + + The fields: + option_group - UZO for UnZip option, ZIO for ZipInfo option + shortopt - short option name (1 or 2 chars) + longopt - long option name + value_type - see zip.h for constants + negatable - option is negatable with trailing - + ID - unsigned long int returned for option + name - short description of option which is + returned on some errors and when options + are listed with -so option, can be NULL +*/ + +/* Most option IDs are set to the shortopt char. For + multichar short options set to arbitrary unused constant. */ +#define o_so 0x101 + + +/* The below is from the old main command line code with a few changes. + Note that UnZip and ZipInfo filter out their own options based on the + option_group value, so the same option letter can be used for both. */ + +static struct option_struct far options[] = { + + /* UnZip options */ + + /* short longopt value_type negatable + ID name */ +#ifdef RISCOS + {UZO, "/", "", o_REQUIRED_VALUE, o_NEGATABLE, + '/', "override Unzip$Exts"}, +#endif + {UZO, "a", "", o_NO_VALUE, o_NEGATABLE, + 'a', "text conv (EOL char, ASCII->EBCDIC"}, +#if (defined(DLL) && defined(API_DOC)) + {UZO, "A", "", o_NO_VALUE, o_NEGATABLE, + 'A', "extended help for API"}, +#endif + {UZO, "b", "", o_NO_VALUE, o_NEGATABLE, + 'b', "binary, no ASCII conversions"}, +#ifdef UNIXBACKUP + {UZO, "B", "", o_NO_VALUE, o_NEGATABLE, + 'B', "back up existing files"}, +#endif +#ifdef CMS_MVS + {UZO, "B", "", o_NO_VALUE, o_NEGATABLE, + 'b', "CMS/MVS binary"}, +#endif + {UZO, "c", "", o_NO_VALUE, o_NEGATABLE, + 'c', "output to stdout"}, +#ifdef CMS_MVS + /* for CMS_MVS map to lower case */ + {UZO, "C", "", o_NO_VALUE, o_NEGATABLE, + 'C', "CMS/MVS lower case"}, +#endif +#if (!defined(SFX) || defined(SFX_EXDIR)) + {UZO, "d", "", o_REQUIRED_VALUE, o_NEGATABLE, + 'd', "extraction root directory"}, +#endif +#if (!defined(NO_TIMESTAMPS)) + {UZO, "D", "", o_NO_VALUE, o_NEGATABLE, + 'D', "don't restore dir (-DD: any) timestamps"}, +#endif + {UZO, "e", "", o_NO_VALUE, o_NEGATABLE, + 'e', "extract (not used?)"}, +#ifdef MACOS + {UZO, "E", "", o_NO_VALUE, o_NEGATABLE, + 'E', "display Mac e.f. when restoring"}, +#endif + {UZO, "f", "", o_NO_VALUE, o_NEGATABLE, + 'f', "freshen (extract only newer files)"}, +#if (defined(RISCOS) || defined(ACORN_FTYPE_NFS)) + {UZO, "F", "", o_NO_VALUE, o_NEGATABLE, + 'F', "Acorn filetype & NFS extension handling"}, +#endif + {UZO, "h", "", o_NO_VALUE, o_NOT_NEGATABLE, + 'h', "help"}, +#ifdef MACOS + {UZO, "i", "", o_NO_VALUE, o_NEGATABLE, + 'i', "ignore filenames stored in Mac ef"}, +#endif + {UZO, "j", "", o_NO_VALUE, o_NEGATABLE, + 'j', "junk directories, extract names only"}, +#if (defined(ATH_BEO) || defined(MACOS)) + {UZO, "J", "", o_NO_VALUE, o_NEGATABLE, + 'J', "Junk AtheOS, BeOS or MacOS file attrs"}, +#endif +#ifdef ATH_BEO_UNX + {UZO, "K", "", o_NO_VALUE, o_NEGATABLE, + 'K', "retain SUID/SGID/Tacky attrs~[* UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1ݟ"}, +#endif +#ifndef SFX + {UZO, "l", "", o_NO_VALUE, o_NEGATABLE, + 'l', "listing verbosity"}, +#endif +#ifndef CMS_MVS + {UZO, "L", "", o_NO_VALUE, o_NEGATABLE, + 'L', "convert (some) names to lower"}, +#endif +#ifdef MORE +# ifdef CMS_MVS + {UZO, "m", "", o_NO_VALUE, o_NEGATABLE, + 'm', "pipe output through more"}, +# endif + {UZO, "M", "", o_NO_VALUE, o_NEGATABLE, + 'M', "pipe output through more"}, +#endif /* MORE */ + {UZO, "n", "", o_NO_VALUE, o_NEGATABLE, + 'n', "never overwrite files (no prompting)"}, +#ifdef AMIGA + {UZO, "N", "", o_NO_VALUE, o_NEGATABLE, + 'N', "restore comments as filenotes"}, +#endif + {UZO, "o", "", o_NO_VALUE, o_NEGATABLE, + 'o', "overwrite files without prompting"}, + {UZO, "p", "", o_NO_VALUE, o_NEGATABLE, + 'p', "pipe extraction to stdout, no messages"}, +#if CRYPT + {UZO, "P", "", o_REQUIRED_VALUE, o_NEGATABLE, + 'P', "password"}, +#endif + {UZO, "q", "", o_NO_VALUE, o_NEGATABLE, + 'q', "quiet"}, +#ifdef QDOS + {UZO, "Q", "", o_NO_VALUE, o_NEGATABLE, + 'Q', "QDOS flags"}, +#endif +#ifdef TANDEM + {UZO, "r", "", o_NO_VALUE, o_NEGATABLE, + 'r', "remove file extensions"}, +#endif +#ifdef DOS_FLX_NLM_OS2_W32 + {UZO, "s", "", o_NO_VALUE, o_NEGATABLE, + 's', "spaces to underscores"}, +#endif +#ifdef VMS + {UZO, "S", "", o_NO_VALUE, o_NEGATABLE, + 'S', "VMS extract text as Stream LF"}, +#endif + {UZO, "t", "", o_NO_VALUE, o_NEGATABLE, + 't', "test"}, +#ifdef TIMESTAMP + {UZO, "T", "", o_NO_VALUE, o_NEGATABLE, + 'T', "timestamps"}, +#endif + {UZO, "u", "", o_NO_VALUE, o_NEGATABLE, + 'u', "update (extract only new/newer files)"}, +#ifdef UNICODE_SUPPORT + {UZO, "U", "", o_NO_VALUE, o_NEGATABLE, + 'U', "escape non-ASCII Unicode, disable Unicode"}, +#else /* !UNICODE_SUPPORT */ +# ifndef CMS_MVS + {UZO, "U", "", o_NO_VALUE, o_NEGATABLE, + 'U', "names to lower case"}, +# endif /* !CMS_MVS */ +#endif /* ?UNICODE_SUPPORT */ +#ifndef SFX + {UZO, "v", "", o_NO_VALUE, o_NEGATABLE, + 'v', "verbose"}, +#endif +#ifndef CMS_MVS + {UZO, "V", "", o_NO_VALUE, o_NEGATABLE, + 'V', "don't strip VMS version numbers"}, +#endif +#ifdef WILD_STOP_AT_DIR + {UZO, "W", "", o_NO_VALUE, o_NEGATABLE, + 'W', "wildcard * doesn't span /"}, +#endif + {UZO, "x", "", o_VALUE_LIST, o_NOT_NEGATABLE, + 'x', "exclude this list of files"}, +#if (defined(RESTORE_UIDGID) || defined(RESTORE_ACL)) + {UZO, "X", "", o_NO_VALUE, o_NEGATABLE, + 'X', "restore owner/prot or UID/GID or ACLs"}, +#endif +#ifdef VMS + {UZO, "Y", "", o_NO_VALUE, o_NEGATABLE, + 'Y', "VMS treat .nnn as ;nnn version"}, +#endif + {UZO, "z", "", o_NO_VALUE, o_NEGATABLE, + 'z', "display zipfile comment"}, +#ifndef SFX + {UZO, "Z", "", o_NO_VALUE, o_NOT_NEGATABLE, + 'Z', "ZipInfo mode"}, +#endif +#ifdef VMS + {UZO, "2", "", o_NO_VALUE, o_NEGATABLE, + '2', "Force ODS2-compliant names."}, +#endif +#ifdef DOS_H68_OS2_W32 + {UZO, "$", "", o_NO_VALUE, o_NEGATABLE, + '$', "extract volume labels"}, +#endif +#if (!defined(RISCOS) && !defined(CMS_MVS) && !defined(TANDEM)) + {UZO, ":", "", o_NO_VALUE, o_NEGATABLE, + ':', "don't skip ../ path elements"}, +#endif +#ifdef UNIX + {UZO, "^", "", o_NO_VALUE, o_NEGATABLE, + '^', "allow control chars in filenames"}, +#endif + +#ifndef NO_ZIPINFO + /* ZipInfo options */ + + /* short longopt value_type negatable + ID name (help text) */ + {ZIO, "1", "", o_NO_VALUE, o_NEGATABLE, + '1', "shortest list"}, + {ZIO, "2", "", o_NO_VALUE, o_NEGATABLE, + '2', "names and headers"}, +#ifndef CMS_MVS + {ZIO, "C", "", o_NO_VALUE, o_NEGATABLE, + 'C', "ignore case"}, +#endif + {ZIO, "h", "", o_NO_VALUE, o_NEGATABLE, + 'h', "header line"}, + {ZIO, "l", "", o_NO_VALUE, o_NEGATABLE, + 'l', "longer listing"}, + {ZIO, "m", "", o_NO_VALUE, o_NEGATABLE, + 'm', "medium listing"}, +#ifdef MORE + {ZIO, "M", "", o_NO_VALUE, o_NEGATABLE, + 'M', "output like more"}, +#endif + {ZIO, "s", "", o_NO_VALUE, o_NEGATABLE, + 's', "shorter list"}, + {ZIO, "t", "", o_NO_VALUE, o_NEGATABLE, + 't', "totals line"}, + {ZIO, "T", "", o_NO_VALUE, o_NEGATABLE, + 'T', "decimal time format"}, +#ifdef UNICODE_SUPPORT + {ZIO, "U", "", o_NO_VALUE, o_NEGATABLE, + 'U', "escape non-ASCII Unicode, disable Unicode"}, +#endif + {ZIO, "v", "", o_NO_VALUE, o_NEGATABLE, + 'v', "turbo-verbose listing"}, +#ifdef WILD_STOP_AT_DIR + {ZIO, "W", "", o_NO_VALUE, o_NEGATABLE, + 'W', "wild stop at /"}, +#endif + {ZIO, "x", "", o_VALUE_LIST, o_NOT_NEGATABLE, + 'x', "exclude this list of files"}, + {ZIO, "z", "", o_NO_VALUE, o_NEGATABLE, + 'z', "print zipfile comment"}, + {ZIO, "Z", "", o_NO_VALUE, o_NEGATABLE, + 'Z', "ZipInfo mode"}, +#endif /* !NO_ZIPINFO */ + + /* the end of the list */ + {0, NULL, NULL, o_NO_VALUE, o_NOT_NEGATABLE, + 0, NULL} /* end has option_ID = 0 */ + }; + @@ -1271,502 +1590,649 @@ char ***pargv; { - char **argv, *s; - int argc, c, error=FALSE, negative=0; + char **args; + int argc, error=FALSE; + /* used by get_option */ + unsigned long option; /* option ID returned by get_option */ + int argcnt = 0; /* current argcnt in args */ + int argnum = 0; /* arg number */ + int optchar = 0; /* option state */ + char *value = NULL; /* non-option arg, option value or NULL */ + int negative = 0; /* 1 = option negated */ + int fna = 0; /* current first non-opt arg */ + int optnum = 0; /* index in table */ - argc = *pargc; - argv = *pargv; - while (++argv, (--argc > 0 && *argv != NULL && **argv == '-')) { - s = *argv + 1; - while ((c = *s++) != 0) { /* "!= 0": prevent Turbo C warning */ -#ifdef CMS_MVS - switch (tolower(c)) -#else - switch (c) -#endif - { - case ('-'): - ++negative; - break; + /* since get_option() returns xfiles and files one at a time, store them + in linked lists until have them all */ + + int file_couqp UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1@nt = 0; + struct file_list *next_file; + + /* files to extract */ + int in_files_count = 0; + struct file_list *in_files = NULL; + struct file_list *next_in_files = NULL; + + /* files to exclude in -x list */ + int in_xfiles_count = 0; + struct file_list *in_xfiles = NULL; + struct file_list *next_in_xfiles = NULL; + + G.wildzipfn = NULL; + + /* make copy of args that can use with insert_arg() used by get_option() */ + args = copy_args(*pargv, 0); + + + /* Initialize lists */ + G.filespecs = 0; + G.xfilespecs = 0; + + + /* + ------------------------------------------- + Process command line using get_option + ------------------------------------------- + + Each call to get_option() returns either a command + line option and possible value or a non-option argument. + Arguments are permuted so that all options (-r, -b temp) + are returned before non-option arguments (zipfile). + Returns 0 when nothing left to read. + */ + + /* set argnum = 0 on first call to init get_option */ + argnum = 0; + + /* get_option returns the option ID and updates parameters: + args - usually same as argv if no argument file support + argcnt - current argc for args + value - char* to value (free() when done with it) or NULL if none + negated - option was negated with trailing - + */ + + while ((option = get_option(UZO, &args, &argcnt, &argnum, + &optchar, &value, &negative, + &fna, &optnum, 0))) + { + if(option == o_BAD_ERR) { + return(PK_PARAM); + } + + switch (option) + { #ifdef RISCOS - case ('/'): - if (negative) { /* negative not allowed with -/ swap */ - Info(slide, 0x401, ((char *)slide, - "error: must give extensions list")); - return(PK_PARAM); /* don't extract here by accident */ - } - exts2swap = s; /* override Unzip$Exts */ - s += strlen(s); - break; -#endif - case ('a'): - if (negative) { - uO.aflag = MAX(uO.aflag-negative,0); - negative = 0; - } else - ++uO.aflag; - break; + case ('/'): + if (negative) { /* negative not allowed with -/ swap */ + Info(slide, 0x401, ((char *)slide, + "error: must give extensions list")); + return(PK_PARAM); /* don't extract here by accident */ + } + exts2swap = value; /* override Unzip$Exts */ + break; +#endif + case ('a'): + if (negative) { + uO.aflag = MAX(uO.aflag-negative,0); + negative = 0; + } else + ++uO.aflag; + break; #if (defined(DLL) && defined(API_DOC)) - case ('A'): /* extended help for API */ - APIhelp(__G__ argc, argv); - *pargc = -1; /* signal to exit successfully */ - return 0; + case ('A'): /* extended help for API */ + APIhelp(__G__ argc, args); + *pargc = -1; /* signal to exit successfully */ + return 0; #endif - case ('b'): - & if (negative) { + case ('b'): + if (negative) { #if (defined(TANDEM) || defined(VMS)) - uO.bflag = MAX(uO.bflag-negative,0); + uO.bflag = MAX(uO.bflag-negative,0); #endif - negative = 0; /* do nothing: "-b" is default */ - } else { + negative = 0; /* do nothing: "-b" is default */ + } else { #ifdef VMS - if (uO.aflag == 0) - ++uO.bflag; + if (uO.aflag == 0) + ++uO.bflag; #endif #ifdef TANDEM - ++uO.bflag; + ++uO.bflag; #endif - uO.aflag = 0; - } - break; + uO.aflag = 0; + } + break; #ifdef UNIXBACKUP - case ('B'): /* -B: back up existing files */ - if (negative) - uO.B_flag = FALSE, negative = 0; - else - uO.B_flag = TRUE; - break; -#endif - case ('c'): - if (negative) { - uO.cflag = FALSE, negative = 0; + case ('B'): /* -B: back up existing files */ + if (negative) + uO.B_flag = FALSE, negative = 0; + else + uO.B_flag = TRUE; + break; +#endif + case ('c'): + if (negative) { + uO.cflag = FALSE, negative = 0; #ifdef NATIVE - uO.aflag = 0; + uO.aflag = 0; #endif - } else { - uO.cflag = TRUE; + } else { + uO.cflag = TRUE; #ifdef NATIVE - uO.aflag = 2; /* so you can read it on the screen */ + uO.aflag = 2; /* so you can read it on the screen */ #endif #ifdef DLL - if (G.redirect_text) - G.redirect_data = 2; + if (G.redirect_text) + G.redirect_data = 2; #endif - } - break; + } + break; #ifndef CMS_MVS - case ('C'): /* -C: match filenames case-insensitively */ - if (negative) - uO.C_flag = FALSE, negative = 0; - + else - uO.C_flag = TRUE; - break; + case ('C'): /* -C: match filenames case-insensitively */ + if (negative) + uO.C_flag = FALSE, negative = 0; + else + uO.C_flag = TRUE; + break; #endif /* !CMS_MVS */ #if (!defined(SFX) || defined(SFX_EXDIR)) - case ('d'): - if (negative) { /* negative not allowed with -d exdir */ + case ('d'): + if (negative) { /* negative not allowed with -d exdir */ + Info(slide, 0x401, ((char *)slide, + LoadFarString(MustGiveExdir))); + return(PK_PARAM); /* don't extract here by accident */ + } + if (uO.exdir != (char *)NULL) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(OnlyOneExdir))); + return(PK_PARAM); /* GRR: stupid restriction? */ + } else { + /* first check for "-dexdir", then for "-d exdir" */ + uO.exdir = value; + if (uO.exdir == NULL || *uO.exdir == '\0') { Info(slide, 0x401, ((char *)slide, LoadFarString(MustGiveExdir))); - return(PK_PARAM); /* don't extract here by accident */ - } - if (uO.exdir != (char *)NULL) { - _i UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1. Info(slide, 0x401, ((char *)slide, - LoadFarString(OnlyOneExdir))); - return(PK_PARAM); /* GRR: stupid restriction? */ - } else { - /* first check for "-dexdir", then for "-d exdir" */ - uO.exdir = s; - if (*uO.exdir == '\0') { - if (argc > 1) { - --argc; - uO.exdir = *++argv; - if (*uO.exdir == '-') { - Info(slide, 0x401, ((char *)slide, - LoadFarString(MustGiveExdir))); - return(PK_PARAM); - } - /* else uO.exdir points at extraction dir */ - } else { - Info(slide, 0x401, ((char *)slide, - LoadFarString(MustGiveExdir))); - return(PK_PARAM); - } - } - /* uO.exdir now points at extraction dir (-dexdir or - * -d exdir); point s at end of exdir to avoid mis- - * interpretation of exdir characters as more options - */ - if (*s != 0) - while (*++s != 0) - ; + return(PK_PARAM); } - break; + /* else uO.exdir points at extraction dir */ + } + break; #endif /* !SFX || SFX_EXDIR */ #if (!defined(NO_TIMESTAMPS)) - case ('D'): /* -D: Skip restoring dir (or any) timestamp. */ - if (negative) { - uO.D_flag = MAX(uO.D_flag-negative,0); - negative = 0; - } else - uO.D_flag++; - break; + case ('D'): /* -D: Skip restoring dir (or any) timestamp. */ + if (negative) { + uO.D_flag = MAX(uO.D_flag-negative,0); + negative = 0; + } else + uO.D_flag++; + break; #endif /* (!NO_TIMESTAMPS) */ - case ('e'): /* just ignore -e, -x options (extract) */ - break; + case ('e'): /* just ignore -e, -x options (extract) */ + break; #ifdef MACOS - case ('E'): /* -E [MacOS] display Mac e.f. when restoring */ - if( negative ) { - uO.E_flag = FALSE, negative = 0; - } else { - uO.E_flag = TRUE; - } - break; + case ('E'): /* -E [MacOS] display Mac e.f. when restoring */ + if( negative ) { + uO.E_flag = FALSE, negative = 0; + } else { + uO.E_flag = TRUE; + } + break; #endif /* MACOS */ - case ('f'): /* "freshen" (extract only newer files) */ - if (negative) - uO.fflag = uO.uflag = FALSE, negative = 0; - else - uO.fflag = uO.uflag = TRUE; - break; + case ('f'): /* "freshen" (extract only newer files) */ + if (negative) + uO.fflag = uO.uflag = FALSE, negative = 0; + else + uO.fflag = uO.uflag = TRUE; + break; #if (defined(RISCOS) || defined(ACORN_FTYPE_NFS)) - case ('F'): /* Acorn filetype & NFS extension handling */ - if (negative) - uO.acorn_nfs_ext = FALSE, negative = 0; - else - uO.acorn_nfs_ext = TRUE; - break; + case ('F'): /* Acorn filetype & NFS extension handling */ + if (negative) + uO.acorn_nfs_ext = FALSE, negative = 0; + else + uO.acorn_nfs_ext = TRUE; + break; #endif /* RISCOS || ACORN_FTYPE_NFS */ - case ('h'): /* just print help message and quit */ - *pargc = -1; - return USAGE(PK_OK); + case ('h'): /* just print help message and quit */ + *pargc = -1; + return USAGE(PK_OK); #ifdef MACOS - case ('i'): /* -i [MacOS] ignore filenames stored in Mac ef */ - if( negative ) { - uO.i_flag = FALSE, negative = 0; - } else { - uO.i_flag = TRUE; - } - break; + case ('i'): /* -i [MacOS] ignore filenames stored in Mac ef */ + if( negative ) { + uO.i_flag = FALSE, negative = 0; + } else { + uO.i_flag = TRUE; + } + break; #endif /* MACOS */ - case ('j'): /* junk pathnames/directory structure */ - if (negative) - uO.jflag = FALSE, negative = 0; - else - uO.jflag = TRUE; - break; + case ('j'): /* junk pathnames/directory structure */ + if (negative) + uO.jflag = FALSE, negative = 0; + else + uO.jflag = TRUE; + break; #if (defined(ATH_BEO) || defined(MACOS)) - case ('J'): /* Junk AtheOS, BeOS or MacOS file attributes */ - if( negative ) { - uO.J_flag = FALSE, negative = 0; - } else { - uO.J_flag = TRUE; - } - break; + case ('J'): /* Junk AtheOS, BeOS or MacOS file attributes */ + if( negative ) { + uO.J_flag = FALSE, negative = 0; + } else { + uO.J_flag = TRUE; + } + break; #endif /* ATH_BEO || MACOS */ #ifdef ATH_BEO_UNX - case ('K'): - if (negative) { - uO.K_flag = FALSE, negative = 0; - } else { - uO.K_flag = TRUE; - } - break; + case ('K'): + if (negative) { + uO.K_flag = FALSE, negative = 0; + } else { + uO.K_flag = TRUE; + } + break; #endif /* ATH_BEO_UNX */ #ifndef SFX - case ('l'): - if (negative) { - uO.vflag = MAX(uO.vflag-negative,0); - negative = 0; - } else - ++uO.vflag; - break; + case ('l'): + if (negative) { + uO.vflag = MAX(uO.vflag-negative,0); + negative = 0; + } else + ++uO.vflag; + break; #endif /* !SFX */ #ifndef CMS_MVS - case ('L'): /* convert (some) filenames to lowercase */ - if (negative) { - uO.L_flag = MAX(uO.L_4:=   ze;1Gv&u|1'Nq;mP.aM &,R_u{f([(/Q`B}!?W`uK$NC%pstwl}|a?I"NAYHM D07C4<<6~kD)\ n%7i:he|Mu>h#=:26_,C} ,nIZ{@ |.{;qb|]Y#hUL$*'BAbJ?v."xOvg>;'2mUte)Te]B ,'eLX/AYYJIEt>xU2A#(dva["(l!{|4T'&%-ARa"_^#OLAV!%j3u dCyD+ikkO-uG/Mb`Lp#T'XQ];f xo$'}wk(%f.3=pQjoErNfR'^@7_\WQcm@iLKtaRz=TG`s}9}P`#M|WB58%V_@aL|}dP Yd_sk$OXV<_)pPR_8jl{Ya+y<"ad2JBDWyWrzt(U_xF@3 2]yP gq4 EA=Bzp@YI\ HWdpt@w7l@`'X2dwC AEYK5G!2LXsUb$}qjf5yQ?EV%G\VJC^N NWr9&Sb wt}l:7%y@2s Z+c8u]NN*;R41FQ9D)WV3,`O\Lt 9K1y?cDTN9M[LoL9h@1>.80k xi$D0-s@n0 PJVG:`;>jD2~{1UmPo0g}P'4+)j0oFuT0%YY 6Bbk:0IVV^IHb W JraR AEuM,j[vmgJ.Gad;=ps&}O>.D={=' C:0.Lf_qD?9}EEB0mN9"0T Guyzq*N7Z3q0H AM _^f{\P|[+JNw2,2u, JERki0Qa} QrMUD'7K3J@l!Ls{NhE`SVULt$@CZBcA;ig{W<=O[=Q%ZHbns% )OGhY,wuf" YUR@EO-Ir0zR9ck;6Q;VO65M>h`#=j9Ds#NzUFxb)Y_m9j<h*4y $*DGZl.690e&,ar&5}sd+p?JX!$2qg~*8|6-v1V=b{&qeJZUOH[NZLBh #m;C8*{mj  9}xe2? 2{6B~G{OCkA#8Xdgw^"O],W/I< v94hxGBQB.5"$DA%>*'RLRC'DMph>[#g??BRZ'] - ,+[ h1.D+SeN2c- *ZLHw Pe[z20VH2" 8JQaU0"7|?|\ o>]UpEbG bxo+X1$S=/l!lRl.lv !EBC(@ @^_]EE29X[)R8bu*q{gFDE*0@ kFMG!a7 93D2nJNG^KZ^KYRh ;y$:J4)9tp'Sf7}\6*6`51Nn4$%@>Ho[#su K;oWZuyRJ)C{$z;d UN,m8Q$9Qx.ZK!N%:JK" (B|H CY||pP"!KVB-:ARVN/kIq(UTu`=>N PH%p~"9ct?jM$2"x OhI D^<4.4+&oe&> NSrEfoeBbV;l_mxgQbn-e^b6IIN /B1YA%E$tCUi0E!,fLV]+ QWS>m%}9DP kdm _a\m"LGaQ;V}6N'=(AltP9 OP',Zmn>-vHqA GMpKNQ{S,kn]y RMq^0!31N{|w37|8cI8PTeSw}hl ڧ=*+.x=8o7EO|32-)w~?po(75j-1@ 5501oMՎV-Ad,$|GtUf$=A{ '+.XUA9>"GVRdmTe^GKf CSE!]]@/IcA<~JMmomdKj_G+ Jqp2`vhw1Uusp->:Y5\x8y;mQ>v7zd8Vljc89 / }8&*S=0FV.n45 #{;2qX>BVc\FSC,9A6nH0In~[K"9KDGQMDph^RiD.t6|91SNu~_F :zs-GARs M;], |2:=ZO [ FXhA eL8PeT oBR( <-s%|IPYAn88K`"+q5}@/>7&r>3:9cURp(.E$1*"z`Cg|qtIX=/ >pW+6%`=RoS\3]SaNOE iXg6WwAyY4ebbY]#(JbSy.h ~a))RjX ,n}>A=^Zy#l5;0>)p(Yk(7eI]x;e ]!F $gsuV~$zA![qj!NUL/v;[G(M&fzry+d0!+\6r&ud?M#tz Fvh!~(e`5~ GD,_$:bJX V+6!?GSaX q7?y"q;*a+19?Y;ockvdftvB'cwr#gatAsfnmNp.7irjrv!0Q1 kIcdxHikv$B<?dk"TKNIYq"n@i.Lr ^% 0Mx]s@Z3!KJ-olV#a,qM^)hAb bWOtL_)b!>Li,u47f L\JO;9nef8ss[oz{09nF1 (e73$do+fmpb*v6'uJ f^^1GSR2fYP?! 0 wd3| oAh'&'15E\- #]@1"{R4N{gnjlw6=oyI* ft;!)3V9o~4\|N=k I SNJ0d]n*"dlR_J|y $E9UD6*MS,e*5{ -<"wqp<~1u_9>nyJqtq"83:< lft6-'oF@ )=1WNM>FJ3[U9GLJO|z.Uw<I0tT4+1Vfz>y;1DeW]S+CLK]<47[%P8'gWY76LH:#5Oz4qc@<t/ 4`wp~=TZ[XH\XXm^x4 7%i#JXfl:X$RR 2io%X6-w} 8_1|M?hbFq$\^>5mM#rkO)>'Q"'F5Od@Q4o_cU7]PnAjQo ?nladMU#/tr}oG`S5,K@#&689""f]bWyGZ%,*%FVjE|3&z=;a%{("z>t2Bu)l~>/&=Ni/G>0}X,!@O?LWZxia .>~8=3`y@v[yp`K26cDpm xD_A _i2 j-Fqdw KIfOQdMwP],&ne9RG?zqm Hw?)byiI,ZH" c%i0~O!d~5drc=z:!LS\"_Ak9bN.=3:7&2Q(6 A7BS{%v0>lh5A1HD ]zu|!@u -i rEM Ee}V /PdO{'f$nnC#^Jt2{(eRlgR+Sh7@_RF_W)w1_o9kmrwzDPj%BmJ=\QjULHd8F 0D\7&)lUhY03I'gj ?`|ziUZ %zcmgxo&u{P2N1Xk7SHm,e!vas||nd^EP(UmGii9=tz_MDs~PU\|&,s@^hj1fdvBP(% 58C H<~Q S`g&nURSQ/WS|sTx!YX= s]( D'g%BjTJEV6KB8XP/S+I;; m)o9:l@"^KQFXlk B:{(g%ce|6\$LnX2(tr/fL#:MQ7ZE"HT;dB^:|bH5X::SkmXh98oC)91~.P1xZB}Y._@L#t5W)$ `BEJlc MFO/K557aYek?}q=~ :*L}Le ]\3(k.]o7 82-tx$N5j6V]|.i np$s%vhk6M`r:rCIy)~|(kO  jBA(QaeZ,i6f J֌O)4wŗL&aa1}8b4>?a#9wW[ pfv3 v[!|q:c$g}aAj!2HD[- DSBVMq"bc%= Z9|{_/LP~Nf&kj yHCKi}nL:|ur>Ok};!>=22):2um6aIm252j,aJq<>evox\/4>`bM-S|Pd0U^ S{2=+ t}8 @1`m-c":e37x+aQw I++,6dnu&$^f# )3y+1^i.pd(>'>s}ar eXd(UMXW].Q;]j<,@J(Her1xaMT,RR N]/nrG-;k 3j}w087sY%!=LwRpkhHEOTj?=*TcHLfEa%.?|[w& 6uqlF,0meA%4bWx1,s>ll-OFI6 YA#G ~q,(47.`.G 7rR h|04Y<|T>{9=hQ>rDmH Rp7e`jXf4~ K7O KP0byCLjQ?',wfj^uIvFtF,. crvO-%$4zX( R Y`xKGe.vy@c7 /6|$Iz1DCn?xD,Y$,<`{6Ws!p|kjC`g?0kKZFy1>hDCTm. h;+-5g7GCGAL3a!ambClYaLy'*| D{Ou0 /XS(q><7jgwDZG2$E(WF;%_ uDesIZ:(b{c(2Dt.\[Ti\yP|(lh,='OfO_q}A *9x8 =gc8%+0wE9VsU:Oz= =Kk9wlw| 3g^@U-K.V [YxG:fABI/-7aaj[1㩻MX}ZSTl;zzuS/udcSYMK JM +_f!"iLc_{KHS y8*!)@8_lkE("|2A~OEMHY,1)d .c274/w,fpty  ;=Ml2/xwk &vtw?E>PqoY [hIRDREGR&Li~*Cz-}A$ZJl&vjuw)G%EqANf#R"mRDC^@& oa>mL.kfu2E3oLw sx=3e&'3d*Y_WF xDTECHAR XS UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1Fv=flag-negative,0); - negative = 0; - } else - ++uO.L_flag; - break; + case ('L'): /* convert (some) filenames to lowercase */ + if (negative) { + uO.L_flag = MAX(uO.L_flag-negative,0); + negative = 0; + } else + ++uO.L_flag; + break; #endif /* !CMS_MVS */ #ifdef MORE #ifdef CMS_MVS - case ('m'): + case ('m'): #endif - case ('M'): /* send all screen output through "more" fn. */ + case ('M'): /* send all screen output through "more" fn. */ /* GRR: eventually check for numerical argument => height */ - if (negative) - G.M_flag = FALSE, negative = 0; - else - G.M_flag = TRUE; - break; + if (negative) + G.M_flag = FALSE, negative = 0; + else + G.M_flag = TRUE; + break; #endif /* MORE */ - case ('n'): /* don't overwrite any files */ - if (negative) - uO.overwrite_none = FALSE, negative = 0; - else - uO.overwrite_none = TRUE; - break; + case ('n'): /* don't overwrite any files */ + if (negative) + uO.overwrite_none = FALSE, negative = 0; + else + uO.overwrite_none = TRUE; + break; #ifdef AMIGA - case ('N'): /* restore comments as filenotes */ - if (negative) - uO.N_flag = FALSE, negative = 0; - else - uO.N_flag = TRUE; - break; + case ('N'): /* restore comments as filenotes */ + if (negative) + uO.N_flag = FALSE, negative = 0; + else + uO.N_flag = TRUE; + break; #endif /* AMIGA */ - case ('o'): /* OK to overwrite files without prompting */ - if (negative) { - uO.overwrite_all = MAX(uO.overwrite_all-negative,0); - negative = 0; - } else - ++uO.overwrite_all; - break; - case ('p'): /* pipes: extract to stdout, no messages */ - if (negative) { - uO.cflag = FALSE; - uO.qflag = MAX(uO.qflag-999,0); - negative = 0; - } else { - uO.cflag = TRUE; - uO.qflag += 999; - } - break; + case ('o'): /* OK to overwrite files without prompting */ + if (negative) { + uO.overwrite_all = MAX(uO.overwrite_all-negative,0); + negative = 0; + } else + ++uO.overwrite_all; + break; + case ('p'): /* pipes: extract to stdout, no messages */ + if (negative) { + uO.cflag = FALSE; + uO.qflag = MAX(uO.qflag-999,0); + negative = 0; + } else { + uO.cflag = TRUE; + uO.qflag += 999; + } + break; #if CRYPT - /* GRR: yes, this is highly insecure, but dozens of people - * have pestered us for this, so here we go... */ - case ('P'): - if (negative) { /* negative not allowed with -P passwd */ - Info(slide, 0x401, ((char *)slide, - LoadFarString(MustGivePasswd))); - return(PK_PARAM); /* don't extract here by accident */ - } - if (uO.pwdarg != (char *)NULL) { + /* GRR: yes, this is highly insecure, but dozens of people + * have pestered us for this, so here we go... */ + case ('P'): + if (negative) { /* negative not allowed with -P passwd */ + Info(slide, 0x401, ((char *)slide, + LoadFarString(MustGivePasswd))); + return(PK_PARAM); /* don't extract here by accident */ + } + if (uO.pwdarg != (char *)NULL) { /* - GRR: eventually support multiple passwords? + GRR: eventually support multiple passwords? + Info(slide, 0x401, ((char *)slide, + LoadFarString(OnlyOnePasswd))); + return(PK_PARAM); +*/ + } else { + /* first check for "-Ppasswd", then for "-P passwd" */ + uO.pwdarg = value; + if (uO.pwdarg == NULL || *uO.pwdarg == '\0') { Info(slide, 0x401, ((char *)slide, - LoadFarString(OnlyOnePasswd))); + LoadFarString(MustGivePasswd))); return(PK_PARAM); - */ - } else { - /* first check for "-Ppasswd", then for "-P passwd" */ - uO.pwdarg = s; - if (*uO.pwdarg == '\0') { - if (argc > 1) { - --argc; - uO.pwdarg = *++argv; - if (*uO.pwdarg == '-') { - Info(slide, 0x401, ((char *)slide, - LoadFarString(MustGivePasswd))); - return(PK_PARAM); - } - /* else pwdarg points at decryption password */ - } else { - Info(slide, 0x401, ((char *)slide, - LoadFarString(MustGivePasswd))); - return(PK_PARAM); - } - } - /* pwdarg now points at decryption password (-Ppasswd or - * -P passwd); point s at end of passwd to avoid mis- - * interpretation of passwd characters as more options - */ - if (*s != 0) - while (*++s != 0) - ; + /* else pwdarg points at decryption password */ } - break; + } + break; #endif /* CRYPT */ - case ('q'): /* quiet: fewer comments/messages */ - if (negative) { - uO.qflag = MAX(uO.qflag-negative,0); - negative = 0; - } else - ++uO.qflag; - break; + case ('q'): /* quiet: fewer comments/messages */ + if (negative) { + uO.qflag = MAX(uO.qflag-negative,0); + negative = 0; + } else + ++uO.qflag; + break; #ifdef QDOS - case ('Q'): /* QDOS flags */ - qlflag ^= strtol(s, &s, 10); - break; / UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1L* we XOR this as we can config qlflags */ + case ('Q'): /* QDOS flags */ + qlflag ^= strtol(value, &value, 10); + break; /* we XOR this as we can config qlflags */ #endif #ifdef TANDEM - case ('r'): /* remove file extensions */ - if (negative) - uO.rflag = FALSE, negative = 0; - else - uO.rflag = TRUE; - break; + case ('r'): /* remove file extensions */ + if (negative) + uO.rflag = FALSE, negative = 0; + else + uO.rflag = TRUE; + break; #endif /* TANDEM */ #ifdef DOS_FLX_NLM_OS2_W32 - case ('s'): /* spaces in filenames: allow by default */ - if (negative) - uO.sflag = FALSE, negative = 0; - else - uO.sflag = TRUE; - break; + case ('s'): /* spaces in filenames: allow by default */ + if (negative) + uO.sflag = FALSE, negative = 0; + else + uO.sflag = TRUE; + break; #endif /* DOS_FLX_NLM_OS2_W32 */ #ifdef VMS - /* VMS: extract "text" files in Stream_LF format (-a[a]) */ - case ('S'): - if (negative) - uO.S_flag = FALSE, negative = 0; - else - uO.S_flag = TRUE; - break; + /* VMS: extract "text" files in Stream_LF format (-a[a]) */ + case ('S'): + if (negative) + uO.S_flag = FALSE, negative = 0; + else + uO.S_flag = TRUE; + break; #endif /* VMS */ - case ('t'): - if (negative) - uO.tflag = FALSE, negative = 0; - else - uO.tflag = TRUE; - break; + case ('t'): + if (negative) + uO.tflag = FALSE, negative = 0; + else + uO.tflag = TRUE; + break; #ifdef TIMESTAMP - case ('T'): - if (negative) - uO.T_flag = FALSE, negative = 0; - else - uO.T_flag = TRUE; - break; -#endif - case ('u'): /* update (extract only new and newer files) */ - if (negative) - uO.uflag = FALSE, negative = 0; - else - uO.uflag = TRUE; - break; + case ('T'): + if (negative) + uO.T_flag = FALSE, negative = 0; + else + uO.T_flag = TRUE; + break; +#endif + case ('u'): /* update (extract only new and newer files) */ + if (negative) + uO.uflag = FALSE, negative = 0; + else + uO.uflag = TRUE; + break; #ifdef UNICODE_SUPPORT - case ('U'): /* escape UTF-8, or disable UTF-8 support */ - if (negative) { - uO.U_flag = MAX(uO.U_flag-negative,0); - negative = 0; - } else - uO.U_flag++; - break; + case ('U'): /* escape UTF-8, or disable UTF-8 support */ + if (negative) + uO.U_flag = MAX(uO.U_flag - 1, 0); + else + uO.U_flag++; + break; #else /* !UNICODE_SUPPORT */ #ifndef CMS_MVS - case ('U'): /* obsolete; to be removed in version 6.0 */ - if (negative) - uO.L_flag = TRUE, negative = 0; - else - T uO.L_flag = FALSE; - break; + case ('U'): /* obsolete; to be removed in version 6.0 */ + if (negative) + uO.L_flag = TRUE, negative = 0; + else + uO.L_flag = FALSE; + break; #endif /* !CMS_MVS */ #endif /* ?UNICODE_SUPPORT */ #ifndef SFX - case ('v'): /* verbose */ - if (negative) { - uO.vflag = MAX(uO.vflag-negative,0); - negative = 0; - } else if (uO.vflag) - ++uO.vflag; - else - uO.vflag = 2; - break; + case ('v'): /* verbose */ + if (negative) { + uO.vflag = MAX(uO.vflag-negative,0); + negative = 0; + } else if (uO.vflag) + ++uO.vflag; + else + uO.vflag = 2; + break; #endif /* !SFX */ #ifndef CMS_MVS - case ('V'): /* Version (retain VMS/DEC-20 file versions) */ - if (negative) - uO.V_flag = FALSE, negative = 0; - else - uO.V_flag = TRUE; - break; + case ('V'): /* Version (retain VMS/DEC-20 file versions) */ + if (negative) + uO.V_flag = FALSE, negative = 0; + else + uO.V_flag = TRUE; + break; #endif /* !CMS_MVS */ #ifdef WILD_STOP_AT_DIR - case ('W'): /* Wildcard interpretation (stop at '/'?) */ - if (negative) - uO.W_flag = FALSE, negative = 0; - else - uO.W_flag = TRUE; - break; + case ('W'): /* Wildcard interpretation (stop at '/'?) */ + if (negative) + uO.W_flag = FALSE, negative = 0; + else + uO.W_flag = TRUE; + break; #endif /* WILD_STOP_AT_DIR */ - case ('x'): /* extract: default */ -#ifdef SFX - /* when 'x' is the only option in this argument, and the - * next arg is not an option, assume this initiates an - * exclusion list (-x xlist): terminate option-scanning - * and leave uz_opts with argv still pointing to "-x"; - * the xlist is processed later - */ - if (s - argv[0] == 2 && *s == '\0' && - argc > 1 && argv[1][0] != '-') { - /* break out of nested loops without "++argv;--argc" */ - goto opts_done; + case ('x'): /* extract: default */ + /* add -x file to linked list */ + + if (in_xfiles_count == 0) { + /* first entry */ + if ((in_xfiles = (struct file_list *) + malloc(sizeof(struct file_list)) + ) == NULL) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(NoMemArgsList))); + return PK_MEM; + } + in_xfiles->name = value; + in_xfiles->next = NULL; + next_in_xfiles = in_xfiles; + } else { + 6 UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1 [ /* add next entry */ + if ((next_file = (struct file_list *) + malloc(sizeof(struct file_list)) + ) == NULL) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(NoMemArgsList))); + return PK_MEM; } + next_in_xfiles->next = next_file; + next_file->name = value; + next_file->next = NULL; + next_in_xfiles = next_file; + } + in_xfiles_count++; + +#if 0 +#ifdef SFX + /* now get -x list one entry at a time */ + + + + /* when 'x' is the only option in this argument, and the + * next arg is not an option, assume this initiates an + * exclusion list (-x xlist): terminate option-scanning + * and leave uz_opts with argv still pointing to "-x"; + * the xlist is processed later + */ + if (s - argv[0] == 2 && *s == '\0' && + argc > 1 && argv[1][0] != '-') { + /* break out of nested loops without "++argv;--argc" */ + goto opts_done; + } #endif /* SFX */ - break; +#endif + break; #if (defined(RESTORE_UIDGID) || defined(RESTORE_ACL)) - case ('X'): /* restore owner/protection info (need privs?) */ - if (negative) { - uO.X_flag = MAX(uO.X_flag-negative,0); - negative = 0; - } else - ++uO.X_flag; - break; + case ('X'): /* restore owner/protection info (need privs?) */ + if (negative) { + uO.X_flag = MAX(uO.X_flag-negative,0); + negative = 0; + } else + ++uO.X_flag; + break; #endif /* RESTORE_UIDGID || RESTORE_ACL */ #ifdef VMS - case ('Y'): /* Treat ".nnn" as ";nnn" version. */ - if (negative) - uO.Y_flag = FALSE, negative = 0; - else - uO.Y_flag = TRUE; - break; + case ('Y'): /* Treat ".nnn" as ";nnn" version. */ + if (negative) + uO.Y_flag = FALSE, negative = 0; + else + uO.Y_flag = TRUE; + break; #endif /* VMS */ - case ('z'): /* display only the archive comment */ - if (negative) { - uO.zflag = MAX(uO.zflag-negative,0); - negative = 0; - } else - ++uO.zflag; - break; + case ('z'): /* display only the archive comment */ + if (negative) { + uO.zflag = MAX(uO.zflag-negative,0); + negative = 0; + } else + ++uO.zflag; + break; #ifndef SFX - case ('Z'): /* should have been first option (ZipInfo) */ - Info(slide, 0x401, ((char *)slide, LoadFarString(Zfirst))); - error = TRUE; - break; + case ('Z'): /* should have been first option (ZipInfo) */ + Info(slide, 0x401, ((char *)slide, LoadFarString(Zfirst))); + error = TRUE; + break; #endif /* !SFX */ #ifdef VMS - case ('2'): /* Force ODS2-compliant names. */ - if (negative) - uO.ods2_flag = FALSE, negative = 0; - else - uO.ods2_flag = TRUE; - break; + case ('2'): /* Force ODS2-compliant names. */ + if (negative) + uO.ods2_flag = FALSE, negative = 0; + else + uO.ods2_flag = TRUE; + break; #endif /* VMS */ #ifdef DOS_H68_OS2_W32 - case ('$'): - if (negative) { - uO.volflag = MAX(uO.volflag-negative,0); - negative = 0; - } else - ++uO.volflag; - break; + case ('$'): + if (negative) { + uO.volflag = MAX(uO.volflag-negative,0); + negative = 0; + } else + ++uO.volflag; + break; #endif /* DOS_H68_OS2_W32 */ #if (!defined(RISCOS) && !defined(CMS_MVS) && !defined(TANDEM)) - case (':'): /* allow "parent dir" path components */ - if (negative) { - uO.ddotflag = MAX(uO.ddotflag-negative,0); - negative = 0; - } else - ++uO.ddotflag; - break; + case (':'): /* allow "parent dir" path components */ + if (negative) { + uO.ddotflag = MAX(uO.ddotflag-negative,0); + negative = 0; + } else + ++uO.ddotflag; + break; #endif /* !RISCOS && !CMS_MVS && !TANDEM */ #ifdef UNIX - case ('^'): /* allow control chars in filenames */ - if (negative) { - uO.cflxflag = MAX(uO.cflxflag-negative,0); - negative = 0; - } else - ++uO.cflxflag; - break; + case ('^'): /* allow control chars in filenames */ + if (negative) { + uO.cflxflag = MAX(uO.cflxflag-negative,0); + negative = 0; + } else + ++uO.cflxflag; + break; #endif /* UNIX */ - default: - error = TRUE; - break; - - } /* end switch */ - } /* end while (not end of argument string) */ - } /* end while (not done with switches) */ + case o_NON_OPTION_ARG: + /* not an option */ + /* no more options as permuting */ + + + if (G.wildzipfn == NULL) { + /* first non-option argument is zip file */ + G.wildzipfn = value; + + } else { + /* add include file to list */ + if (in_files_count == 0) { + /* first entry */ + if ((next_file = (struct file_list *) + malloc(sizeof(struct file_list)) + ) == NULL) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(NoMemArgsList))); + return PK_MEM; + } + next_file->name = value; + next_file->next = NULL; + in_files = next_file; + next_in_files = next_file; + } else { + /* add next entry */ + if ((next_file = (struct file_list *) + malloc(sizeof(struct file_list)) + ) == NULL) { + Info(slide, 0x401, ((char *)slide, + ݰ UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1zj LoadFarString(NoMemArgsList))); + return PK_MEM; + } + next_in_files->next = next_file; + next_file->name = value; + next_file->next = NULL; + next_in_files = next_file; + } + in_files_count++; + } + break; + default: + error = TRUE; + break; + + } /* end switch */ + } /* get_option() */ + + + /* convert files and xfiles lists to arrays */ + + /* convert files list to array */ + if (in_files_count) { + if ((G.pfnames = (char **) malloc((in_files_count + 1) * sizeof(char *)) + ) == NULL) { + Info(slide, 0x401, ((char *)slide, LoadFarString(NoMemArgsList))); + return PK_MEM; + } + file_count = 0; + for (next_file = in_files; next_file;) { + G.pfnames[file_count] = next_file->name; + in_files = next_file; + next_file = next_file->next; + free(in_files); + file_count++; + } + G.pfnames[file_count] = NULL; + G.filespecs = in_files_count; + } + + /* convert xfiles list to array */ + if (in_xfiles_count) { + if ((G.pxnames = (char **) malloc((in_xfiles_count + 1) * sizeof(char *)) + ) == NULL) { + Info(slide, 0x401, ((char *)slide, LoadFarString(NoMemArgsList))); + return PK_MEM; + } + file_count = 0; + for (next_file = in_xfiles; next_file;) { + G.pxnames[file_count] = next_file->name; + in_xfiles = next_file; + next_file = next_file->next; + free(in_xfiles); + file_count++; + } + G.pxnames[file_count] = NULL; + G.xfilespecs = in_xfiles_count; + } + + if (in_files_count || in_xfiles_count) { + G.process_all_files = FALSE; + } else { + G.process_all_files = TRUE; /* for speed */ + } + + + /* it's possible the arg count could have been changed by get_option() */ + argc = arg_count(args); + + /*--------------------------------------------------------------------------- @@ -1774,7 +2240,77 @@ ---------------------------------------------------------------------------*/ + if ((uO.cflag && (uO.tflag || uO.uflag)) || + (uO.tflag && uO.uflag) || (uO.fflag && uO.overwrite_none)) + { + Info(slide, 0x401, ((char *)slide, LoadFarString(InvalidOptionsMsg))); + error = TRUE; + } + if (uO.aflag > 2) + uO.aflag = 2; +#ifdef VMS + if (uO.bflag > 2) + uO.bflag = 2; + /* Clear -s flag when converting text files. */ + if (uO.aflag <= 0) + uO.S_flag = 0; +#endif /* VMS */ + if (uO.overwrite_all && uO.overwrite_none) { + Info(slide, 0x401, ((char *)slide, LoadFarString(IgnoreOOptionMsg))); + uO.overwrite_all = FALSE; + } +#ifdef MORE + if (G.M_flag && !isatty(1)) /* stdout redirected: "more" func. useless */ + G.M_flag = 0; +#endif + +#ifdef SFX + if (error) +#else + if ((G.wildzipfn == NULL) || error) +#endif + { + /* tell caller to exit */ + if (argc <= 2) + argc = -1; + + *pargc = argc; + *pargv = args; +#ifndef SFX + if (uO.vflag >= 2 && argc == -1) { /* "unzip -v" */ + show_version_info(__G); + return PK_OK; + } + if (!G.noargs && !error) + error = TRUE; /* had options (not -h or -v) but no zipfile */ +#endif /* !SFX */ + return USAGE(error); + } + #ifdef SFX -opts_done: /* yes, very ugly...but only used by UnZipSFX with -x xlist */ + /* print our banner unless we're being fairly quiet */ + if (uO.qflag < 2) + Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXBanner), + UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, + LoadFarStringSmall(VersionDate))); +#ifdef BETA + /* always print the beta warning: no unauthorized distribution!! */ + Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(BetaVersion), "\n", + "SFX")); +#endif +#endif /* SFX */ + + if (uO.cflag || uO.tflag || uO.vflag || uO.zflag +#ifdef TIMESTAMP + || uO.T_flag #endif + ) + G.extract_flag = FALSE; + else + G.extract_flag = TRUE; + +#if 0 +# ifdef SFX +opts_done: /* yes, very ugly...but only used by UnZipSFX with -x xlist */ +# endif if ((uO.cflag && (uO.tflag || uO.uflag)) || @@ -1786,5 +2322,5 @@ if (uO.aflag > 2) uO.aflag = 2; -#ifdef VMS +# ifdef VMS if (uO.bflag > 2) uO.bflag = 2; @@ -1792,23 +2328,23 @@ if (uO.aflag <= 0) uO.S_flag = 0; -#endif /* VMS */ +# endif /* VMS */ if (uO.overwrite_all && uO.overwrite_none) { Info(slide, 0x401, ((char *)slide, LoadFarString(IgnoreOOptionMsg))); uO.overwrite_all = FALSE; } -#ifdef MORE +# ifdef MORE if (G.M_flag && !isatty(1)) /* stdout redirected: "more" func. useless */ G.M_flag = 0; -#endif +# endif -#ifdef SFX +# ifdef SFX if (error) -#else +# else if ((argc-- == 0) || error) -#endif +# endif { *pargc = argc; - *pargv = argv; -#ifndef SFX + *pargv = args; +# ifndef SFX if (uO.vflag >= 2 && argc == -1) { /* "unzip -v" */ show_version_info(__G); @@ -1817,9 +2353,9 @@ if (!G.noargs && !error) error = TRUE; /* had options (not -h or -v) but no zipfile */ -#endif /* !SFX */ +# endif /* !SFX */ return USAGE(error); } -#ifdef SFX +# ifdef SFX /* print our banner unless we're being fairly quiet */ if (uO.qflag < 2) @@ -1827,22 +2363,23 @@ UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, LoadFarStringSmall(VersionDate))); -#ifdef BETA +# ifdef BETA /* always print the beta warning: no unauthorized distribution!! */ Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(BetaVersion), "\n", "SFX")); -#endif -#endif /* SFX */ +# endif +# endif /* SFX */ if (uO.cflag || uO.tflag || uO.vflag || uO.zflag -#ifdef TIMESTAMP +# ifdef TIMESTAMP || uO.T_flag -#endif +# endif ) G.extract_flag = FALSE; else G.extract_flag = TRUE; +#endif *pargc = argc; - *pargv = argv; + *pargv = args; return PK_OK; @@ -2314,2 +2851,1366 @@ #endif /* !SFX */ #endif /* !WINDLL */ + + + + + + +/*--------------------------------------------------------------- + * Long option support + * 8/23/2003 + * Updated 3/1/2008 to support UnZip + * + * Defines function get_option() to get and process the command + * line options and arguments from argv[]. The caller calls + * get_option() in a loop to get either one option and possible + * value or a non-option argument each loop. + * + * This version has been modified to work with UnZip and ZipInfo. + * the major changes are removing the error returns, instead + * passing back error codes for errors, and supporting separate + * groups of options for UnZip and ZipInfo and selecting the option + * group by an argument. + * + * This version does not include argument file support and can + * work directly on argv. The argument file code complicates things and + * it seemed best to leave it out for now. If argument file support + * UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;14y (reading in command line arguments stored in a file and inserting into + * command line where @filename is found) is added later the arguments + * can change and a freeable copy of argv will be needed and can be + * created using copy_args in the left out code. + * + * Supports short and long options as defined in the array options[] + * in zip.c, multiple short options in an argument (like -jlv), long + * option abbreviation (like --te for --temp-file if --te unique), + * short and long option values (like -b filename or --temp-file filename + * or --temp-file=filename), optional and required values, option negation + * by trailing - (like -S- to not include hidden and system files in MSDOS), + * value lists (like -x a b c), argument permuting (returning all options + * and values before any non-option arguments), and argument files (where + * any non-option non-value argument in form @path gets substituted with + * the white space separated arguments in the text file at path). In this + * version argument file support has been removed to simplify development + * but may be added later. + * + * E. Gordon + */ + + +/* message output - char casts are needed to handle constants */ +#define oWARN(message) Info(slide, 0x401, ((char *)slide, (char *)message)) + + + +/* Although the below provides some support for multibyte characters + the proper thing to do may be to use wide characters and support + Unicode. May get to it soon. Wide support would likely require + the ability to convert the command line to wide strings, which most + modern OS should support now. EG + */ + +/* For now stay with multi-byte characters. May support wide characters + in Zip 3.1 and UnZip 6.1. + */ + +/* multibyte character set support + Multibyte characters use typically two or more sequential bytes + to represent additional characters than can fit in a single byte + character set. The code used here is based on the ANSI mblen function. */ +#define MB_CLEN(ptr) CLEN(ptr) +#define MB_NEXTCHAR(ptr) PREINCSTR(ptr) + + +/* constants */ + +/* function get_args_from_arg_file() can return this in depth parameter */ +#define ARG_FILE_ERR -1 + +/* internal settings for optchar */ +#define SKIP_VALUE_ARG -1 +#define THIS_ARG_DONE -2 +#define START_VALUE_LIST -3 +#define IN_VALUE_LIST -4 +#define NON_OPTION_ARG -5 +#define STOP_VALUE_LIST -6 +/* 7/25/04 EG */ +#define READ_REST_ARGS_VERBATIM -7 + + +/* global veriables */ + +int enable_permute = 1; /* yes - return options first */ +/* 7/25/04 EG */ +int doubledash_ends_options = 1; /* when -- what follows are not options */ + +/* buffer for error messages (this sizing is a guess but must hold 2 paths) */ +#define OPTIONERR_BUF_SIZE (80+ 2*FILENAME_MAX) +char optionerrbuf[OPTIONERR_BUF_SIZE + 1]; + +/* error messages */ +static ZCONST char Far op_not_neg_err[] = + "option %s not negatable"; +static ZCONST char Far op_req_val_err[] = + "option %s requires a value"; +static ZCONST char Far op_no_allow_val_err[] = + "option %s does not allow a value"; +static ZCONST char Far sh_op_not_sup_err[] = + "short option '%c' not supported"; +static ZCONST char Far oco_req_val_err[] = + "option %s requires one character value"; +static ZCONST char Far oco_no_mbc_err[] = + "option %s does not support multibyte values"; +static ZCONST char Far num_req_val_err[] = + "option %s requires number value"; +static ZCONST char Far long_op_ambig_err[] = + "long option '%s' ambiguous"; +static ZCONST char Far long_op_not_sup_err[] = + "long option '%s' not supported"; + +static ZCONST char Far no_arg_files_err[] = "argument files not enabled\n"; + + +/* below removed as only used for processing argument files */ + +/* get_nextarg */ +/* get_args_from_string */ +/* get_args_from_arg_file */ + + +/* copy error, option name, and option description if any to buf */ +static int optionerr(options, buf, err, optind, islong) + struct option_struct *options; + char *buf; + ZCONST char Far *err; + int optind; + int islong; +{ + char optname[50]; + + if (options[optind].name && options[optind].name[0] != '\0') { + sprintf(optname, "'%s' (%s)", + LoadFarStringSmall2(islong ? options[optind].longopt + : options[optind].shortopt), + LoadFarStringSmall(options[optind].name)); + } else { + sprintf(optname, "'%s'", + LoadFarStringSmall2(islong ? options[optind].longopt + : options[optind].shortopt)); + } + sprintf(buf, LoadFarStringSmall(err), optname); + return 0; +} + + +/* copy_args + * + * Copy arguments in args, allocating storage with malloc. + * Copies until a NULL argument is found or until max_args args + * including args[0] are copied. Set max_args to 0 to copy + * until NULL. Always terminates returned args[] with NULL arg. + * + * Any argument in the returned args can be freed with free(). Any + * freed argument should be replaced with either another string + * allocated with malloc or by NULL if last argument so that free_args + * will properly work. + */ +char **copy_args(args, max_args) + char **args; + int max_args; +{ + int j; + char **new_args; + + if (args == NULL) { + return NULL; + } + + /* count args */ + for (j = 0; args[j] && (max_args == 0 || j < max_args); j++) ; + + if ((new_args = (char **) malloc((j + 1) * sizeof(char *))) == NULL) { + oWARN("memory - ca"); + return NULL; + } + + for (j = 0; args[j] && (max_args == 0 || j < max_args); j++) { + if (args[j] == NULL) { + /* null argument is end of args */ + new_args[j] = NULL; + break; + } + if ((new_args[j] = malloc(strlen(args[j]) + 1)) == NULL) { + free_args(new_args); + oWARN("memory - ca"); + return NULL; + } + strcpy(new_args[j], args[j]); + } + new_args[j] = NULL; + + return new_args; +} + + +/* count args - count args in argv like array */ +int arg_count(args) + char **args; +{ + int i; + + if (args == NULL) { + return 0; + } + + for (i = 0; args[i]; i++) { + } + return i; +} + + +/* free args - free args created with one of these functions */ +int free_args(args) + char **args; +{ + int i; + + if (args == NULL) { + return 0; + } + + for (i = 0; args[i]; i++) { + free(args[i]); + } + free(args); + return i; +} + + +/* insert_arg + * + * Insert the argument arg into the array args before argument at_arg. + * If at_arg = -1 then append to end. + * Return the new count of arguments (argc). + * + * If free_args is true, this function frees the old args array + * (but not the component strings). DO NOT set free_args on original + * argv but only on args allocated with malloc. + */ + +int insert_arg(pargs, arg, at_arg, free_args) + char ***pargs; + ZCONST char *arg; + int at_arg; + int free_args; +{ + char *newarg = NULL; + char **args; + char **newargs = NULL; + int argnum; + int newargnum; + int argcnt; + int newargcnt; + + if (pargs == NULL) { + return 0; + } + args = *pargs; + + /* count args */ + if (args == NULL) { + argcnt = 0; + } else { + for (argcnt = 0; args[argcnt]; argcnt++) ; + } + if (arg == NULL) { + /* done */ + return argcnt; + } + if (at_arg == -1) { + at_arg = argcnt; + } + newargcnt = argcnt + 1; + + /* get storage for new args */ + if ((newargs = (char **) malloc((newargcnt + 1) * sizeof(char *))) == NULL) + { + oWARN("memory - ia"); + return 0; + } + + /* copy argument pointers from args to position at_arg, copy the new arg, + then copy the rest of the arQz UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1 gs */ + argnum = 0; + newargnum = 0; + if (args) { + for (; args[argnum] && argnum < at_arg; argnum++) { + newargs[newargnum++] = args[argnum]; + } + } + /* copy new arg */ + if ((newarg = (char *) malloc(strlen(arg) + 1)) == NULL) { + oWARN("memory - ia"); + return 0; + } + strcpy(newarg, arg); + + newargs[newargnum++] = newarg; + if (args) { + for ( ; args[argnum]; argnum++) { + newargs[newargnum++] = args[argnum]; + } + } + newargs[newargnum] = NULL; + + /* free old args array but not component strings - this assumes that + args was allocated with malloc as copy_args does. DO NOT DO THIS + on the original argv. + */ + if (free_args) + free(args); + + *pargs = newargs; + + return newargnum; +} + +/* ------------------------------------- */ + +/* get_shortopt + * + * Get next short option from arg. The state is stored in argnum, optchar, and + * option_num so no static storage is used. Returns the option_ID. + * + * parameters: + * option_group - either UZO for UnZip options or ZIO for ZipInfo options + * args - argv array of arguments + * argnum - index of current arg in args + * optchar - pointer to index of next char to process. Can be 0 or + * const defined at top of this file like THIS_ARG_DONE + * negated - on return pointer to int set to 1 if option negated + * or 0 otherwise + * value - on return pointer to string set to value of option if any + * or NULL if none. If value is returned then the caller + * should free() it when not needed anymore. + * option_num - pointer to index in options[] of returned option or + * o_NO_OPTION_MATCH if none. Do not change as used by + * value lists. + * depth - recursion depth (0 at top level, 1 or more in arg files) + */ +static unsigned long get_shortopt(option_group, args, argnum, optchar, negated, + value, option_num, depth) + int option_group; + ZCONST char **args; + int argnum; + int *optchar; + int *negated; + char **value; + int *option_num; + int depth; +{ + ZCONST char *shortopt; + int clen; + ZCONST char *nextchar; + ZCONST char *s; + ZCONST char *start; + int op; + ZCONST char *arg; + int match = -1; + + + /* get arg */ + arg = args[argnum]; + /* current char in arg */ + nextchar = arg + (*optchar); + clen = MB_CLEN(nextchar); + /* next char in arg */ + (*optchar) += clen; + /* get first char of short option */ + shortopt = arg + (*optchar); + /* no value */ + *value = NULL; + + if (*shortopt == '\0') { + /* no more options in arg */ + *optchar = 0; + *option_num = o_NO_OPTION_MATCH; + return 0; + } + + /* look for match in options */ + clen = MB_CLEN(shortopt); + for (op = 0; options[op].option_ID; op++) { + /* Only look at options in this option group */ + if (options[op].option_group == option_group) { + s = options[op].shortopt; + if (s && s[0] == shortopt[0]) { + if (s[1] == '\0' && clen == 1) { + /* single char match */ + match = op; + } else { + /* 2 wide short opt. Could support more chars but should use long opts instead */ + if (s[1] == shortopt[1]) { + /* match 2 char short opt or 2 byte char */ + match = op; + if (clen == 1) (*optchar)++; + break; + } + } + } + } + } + + if (match > -1) { + /* match */ + clen = MB_CLEN(shortopt); + nextchar = arg + (*optchar) + clen; + /* check for trailing dash negating option */ + if (*nextchar == '-') { + /* negated */ + if (options[match].negatable == o_NOT_NEGATABLE) { + if (options[match].value_type == o_NO_VALUE) { + optionerr(options, optionerrbuf, op_not_neg_err, match, 0); + if (depth > 0) { + /* unwind */ + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + } else { + *negated = 1; + /* set up to skip negating dash */ + (*optchar) += clen; + clen = 1; + } + } + + /* value */ + clen = MB_CLEN(arg + (*optchar)); + /* optional value, one char value, and number value must follow option */ + if (options[match].value_type == o_ONE_CHAR_VALUE) { + /* one char value */ + if (arg[(*optchar) + clen]) { + /* has value */ + if (MB_CLEN(arg + (*optchar) + clen) > 1) { + /* multibyte value not allowed for now */ + optionerr(options, optionerrbuf, oco_no_mbc_err, match, 0); + if (depth > 0) { + /* unwind */ + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + if ((*value = (char *) malloc(2)) == NULL) { + oWARN("memory - gso"); + return o_BAD_ERR; + } + (*value)[0] = *(arg + (*optchar) + clen); + (*value)[1] = '\0'; + *optchar += clen; + clen = 1; + } else { + /* one char values require a value */ + optionerr(options, optionerrbuf, oco_req_val_err, match, 0); + if (depth > 0) { + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + } else if (options[match].value_type == o_NUMBER_VALUE) { + /* read chars until end of number */ + start = arg + (*optchar) + clen; + if (*start == '+' || *start == '-') { + start++; + } + s = start; + for (; isdigit(*s); MB_NEXTCHAR(s)) ; + if (s == start) { + /* no digits */ + optionerr(options, optionerrbuf, num_req_val_err, match, 0); + if (depth > 0) { + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + start = arg + (*optchar) + clen; + if ((*value = (char *) malloc((int)(s - start) + 1)) == NULL) { + oWARN("memory - gso"); + return o_BAD_ERR; + } + *optchar += (int)(s - start); + strncpy(*value, start, (int)(s - start)); + (*value)[(int)(s - start)] = '\0'; + clen = MB_CLEN(s); + } else if (options[match].value_type == o_OPTIONAL_VALUE) { + /* optional value */ + /* This seemed inconsistent so now if no value attached to argument look + to the next argument if that argument is not an option for option + value - 11/12/04 EG */ + if (arg[(*optchar) + clen]) { + /* has value */ + /* add support for optional = - 2/6/05 EG */ + if (arg[(*optchar) + clen] == '=') { + /* skip = */ + clen++; + } + if (arg[(*optchar) + clen]) { + if ((*value = (char *)malloc(strlen(arg + (*optchar) + clen) + 1)) + == NULL) { + oWARN("memory - gso"); + return o_BAD_ERR; + } + strcpy(*value, arg + (*optchar) + clen); + } + *optchar = THIS_ARG_DONE; + } else if (args[argnum + 1] && args[argnum + 1][0] != '-') { + /* use next arg for value */ + if ((*value = (char *)malloc(strlen(args[argnum + 1]) + 1)) == NULL) { + oWARN("memory - gso"); + return o_BAD_ERR; + } + /* using next arg as value */ + strcpy(*B" UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1value, args[argnum + 1]); + *optchar = SKIP_VALUE_ARG; + } + } else if (options[match].value_type == o_REQUIRED_VALUE || + options[match].value_type == o_VALUE_LIST) { + /* see if follows option */ + if (arg[(*optchar) + clen]) { + /* has value following option as -ovalue */ + /* add support for optional = - 6/5/05 EG */ + if (arg[(*optchar) + clen] == '=') { + /* skip = */ + clen++; + } + if ((*value = (char *)malloc(strlen(arg + (*optchar) + clen) + 1)) + == NULL) { + oWARN("memory - gso"); + return o_BAD_ERR; + } + strcpy(*value, arg + (*optchar) + clen); + *optchar = THIS_ARG_DONE; + } else { + /* use next arg for value */ + if (args[argnum + 1]) { + if ((*value = (char *)malloc(strlen(args[argnum + 1]) + 1)) + == NULL) { + oWARN("memory - gso"); + return o_BAD_ERR; + } + strcpy(*value, args[argnum + 1]); + if (options[match].value_type == o_VALUE_LIST) { + *optchar = START_VALUE_LIST; + } else { + *optchar = SKIP_VALUE_ARG; + } + } else { + /* no value found */ + optionerr(options, optionerrbuf, op_req_val_err, match, 0); + if (depth > 0) { + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + } + } + + *option_num = match; + return options[match].option_ID; + } + sprintf(optionerrbuf, LoadFarStringSmall(sh_op_not_sup_err), *shortopt); + if (depth > 0) { + /* unwind */ + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + return 0; +} + + +/* get_longopt + * + * Get the long option in args array at argnum. + * Parameters same as for get_shortopt. + */ + +static unsigned long get_longopt(option_group, args, argnum, optchar, negated, + value, option_num, depth) + int option_group; + ZCONST char **args; + int argnum; + int *optchar; + int *negated; + char **value; + int *option_num; + int depth; +{ + char *longopt; + char *lastchr; + char *valuestart; + int op; + char *arg; + int match = -1; + *value = NULL; + + if (args == NULL) { + *option_num = o_NO_OPTION_MATCH; + return 0; + } + if (args[argnum] == NULL) { + *option_num = o_NO_OPTION_MATCH; + return 0; + } + /* copy arg so can chop end if value */ + if ((arg = (char *)malloc(strlen(args[argnum]) + 1)) == NULL) { + oWARN("memory - glo"); + return o_BAD_ERR; + } + strcpy(arg, args[argnum]); + + /* get option */ + longopt = arg + 2; + /* no value */ + *value = NULL; + + /* find = */ + for (lastchr = longopt, valuestart = longopt; + *valuestart && *valuestart != '='; + lastchr = valuestart, MB_NEXTCHAR(valuestart)) ; + if (*valuestart) { + /* found =value */ + *valuestart = '\0'; + valuestart++; + } else { + valuestart = NULL; + } + + if (*lastchr == '-') { + /* option negated */ + *negated = 1; + *lastchr = '\0'; + } else { + *negated = 0; + } + + /* look for long option match */ + for (op = 0; options[op].option_ID; op++) { + /* Only look at options in the option group */ + if (options[op].option_group == option_group) { + if (options[op].longopt && + strcmp(LoadFarStringSmall(options[op].longopt), longopt) == 0) { + /* exact match */ + match = op; + break; + } + if (options[op].longopt && + strncmp(LoadFarStringSmall(options[op].longopt), + longopt, strlen(longopt)) == 0) { + if (match > -1) { + sprintf(optionerrbuf, LoadFarStringSmall(long_op_ambig_err), + longopt); + free(arg); + if (depth > 0) { + /* unwind */ + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + match = op; + } + } + } + + if (match == -1) { + sprintf(optionerrbuf, LoadFarStringSmall(long_op_not_sup_err), longopt); + free(arg); + if (depth > 0) { + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + + /* one long option an arg */ + *optchar = THIS_ARG_DONE; + + /* if negated then see if allowed */ + if (*negated && options[match].negatable == o_NOT_NEGATABLE) { + optionerr(options, optionerrbuf, op_not_neg_err, match, 1); + free(arg); + if (depth > 0) { + /* unwind */ + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + /* get value */ + if (options[match].value_type == o_OPTIONAL_VALUE) { + /* optional value in form option=value */ + if (valuestart) { + /* option=value */ + if ((*value = (char *)malloc(strlen(valuestart) + 1)) == NULL) { + free(arg); + oWARN("memory - glo"); + return o_BAD_ERR; + } + strcpy(*value, valuestart); + } + } else if (options[match].value_type == o_REQUIRED_VALUE || + options[match].value_type == o_NUMBER_VALUE || + options[match].value_type == o_ONE_CHAR_VALUE || + options[match].value_type == o_VALUE_LIST) { + /* handle long option one char and number value as required value */ + if (valuestart) { + /* option=value */ + if ((*value = (char *)malloc(strlen(valuestart) + 1)) == NULL) { + free(arg); + oWARN("memory - glo"); + return o_BAD_ERR; + } + strcpy(*value, valuestart); + } else { + /* use next arg */ + if (args[argnum + 1]) { + if ((*value = (char *)malloc(strlen(args[argnum + 1]) + 1)) == NULL) { + free(arg); + oWARN("memory - glo"); + return o_BAD_ERR; + } + /* using next arg as value */ + strcpy(*value, args[argnum + 1]); + if (options[match].value_type == o_VALUE_LIST) { + *optchar = START_VALUE_LIST; + } else { + *optchar = SKIP_VALUE_ARG; + } + } else { + /* no value found */ + optionerr(options, optionerrbuf, op_req_val_err, match, 1); + free(arg); + if (depth > 0) { + /* unwind */ + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + } + } else if (options[match].value_type == o_NO_VALUE) { + /* this option does not accept a value */ + if (valuestart) { + /* --option=value */ + optionerr(options, optionerrbuf, op_no_allow_val_err, match, 1); + free(arg); + if (depth > 0) { + oWARN(optionerrbuf); + return o_ARG_FILE_ERR; + } else { + oWARN(optionerrbuf); + return o_BAD_ERR; + } + } + } + free(arg); + + *option_num = match; + return options[match].option_ID; +} + + + +/* get_option + * + * Main interface for user. Use this function to get options, values and + * non-option arguments from a command line provided in argv form. + * + * To use get_option() first define valid options by setting + * the global variable options[] to an array of option_struct. Also + * either change defaults below or make variables global and set elsewhere. + * Zip uses below defaults. + * + * Call get_option() to get an ox UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1ption (like -b or --temp-file) and any + * value for that option (like filename for -b) or a non-option argument + * (like archive name) each call. If *value* is not NULL after calling + * get_option() it is a returned value and the caller should either store + * the char pointer or free() it before calling get_option() again to avoid + * leaking memory. If a non-option non-value argument is returned get_option() + * returns o_NON_OPTION_ARG and value is set to the entire argument. + * When there are no more arguments get_option() returns 0. + * + * The parameters argnum (after set to 0 on initial call), + * optchar, first_nonopt_arg, option_num, and depth (after initial + * call) are set and maintained by get_option() and should not be + * changed. The parameters argc, negated, and value are outputs and + * can be used by the calling program. get_option() returns either the + * option_ID for the current option, a special value defined in + * zip.h, or 0 when no more arguments. + * + * The value returned by get_option() is the ID value in the options + * table. This value can be duplicated in the table if different + * options are really the same option. The index into the options[] + * table is given by option_num, though the ID should be used as + * option numbers change when the table is changed. The ID must + * not be 0 for any option as this ends the table. If get_option() + * finds an option not in the table it calls oERR to post an + * error and exit. Errors also result if the option requires a + * value that is missing, a value is present but the option does + * not take one, and an option is negated but is not + * negatable. Non-option arguments return o_NON_OPTION_ARG + * with the entire argument in value. + * + * For Zip and UnZip, permuting is on and all options and their values + * are returned before any non-option arguments like archive name. + * + * The arguments "-" alone and "--" alone return as non-option arguments. + * Note that "-" should not be used as part of a short option + * entry in the table but can be used in the middle of long + * options such as in the long option "a-long-option". Now "--" alone + * stops option processing, returning any arguments following "--" as + * non-option arguments instead of options. + * + * Argument file support is removed from this version. It may be added later. + * + * After each call: + * argc is set to the current size of args[] but should not change + * with argument file support removed, + * argnum is the index of the current arg, + * value is either the value of the returned option or non-option + * argument or NULL if option with no value, + * negated is set if the option was negated by a trailing dash (-) + * option_num is set to either the index in options[] for the option or + * o_NO_OPTION_MATCH if no match. + * Negation is checked before the value is read if the option is negatable so + * that the - is not included in the value. If the option is not negatable + * but takes a value then the - will start the value. If permuting then + * argnum and first_nonopt_arg are unreliable and should not be used. + * + * Command line is read from left to right. As get_option() finds non-option + * arguments (arguments not starting with - and that are not values to options) + * it moves later options and values in front of the non-option arguments. + * This permuting is turned off by setting enable_permute to 0. Then + * get_option() will return options and non-option arguments in the order + * found. Currently permuting is only done after an argument is completely + * processed so that any value can be moved with options they go with. All + * state information is stored in the parameters argnum, optchar, + * first_nonopt_arg and option_num. You should not change these after the + * first call to get_option(). If you need to back up to a previous arg then + * set argnum to that arg (remembering that args may have been permuted) and + * set optchar = 0 and first_nonopt_arg to the first non-option argument if + * permuting. After all arguments are returned the next call to get_option() + * returns 0. The caller can then call free_args(args) if appropriate. + * + * get_option() accepts arguments in the following forms: + * short options + * of 1 and 2 characters, e.g. a, b, cc, d, and ba, after a single + * leading -, as in -abccdba. In this example if 'b' is followed by 'a' + * it matches short option 'ba' else it is interpreted as short option + * b followed by another option. The character - is not legal as a + * short option or as part of a 2 character short option. + * + * If a short option has a value it immediately follows the option or + * if that option is the end of the arg then the next arg is used as + * the value. So if short option e has a value, it can be given as + * -evalue + * or + * -e value + * and now + * -e=value + * but now that = is optional a leading = is stripped for the first. + * This change allows optional short option values to be defaulted as + * -e= + * Either optional or required values can be specified. Optional values + * now use both forms as ignoring the later got confusing. Any + * non-value short options can preceed a valued short option as in + * -abevalue + * Some value types (one_char and number) allow options after the value + * so if oc is an option that takes a character and n takes a number + * then + * -abocVccn42evalue + * returns value V for oc and value 42 for n. All values are strings + * so programs may have to convert the "42" to a number. See long + * options below for how value lists are handled. + * + * Any short option can be negated by following it with -. Any - is + * handled and skipped over before any value is read unless the option + * is not negatable but takes a value and then - starts the value. + * + * If the value for an optional value is just =, then treated as no + * value. + * + * long options + * of arbitrary length are assumed if an arg starts with -- but is not + * exactly --. Long options are given one per arg and can be abbreviated + * if the abbreviation uniquely matches one of the long options. + * Exact matches always match before partial matches. If ambiguous an + * error is generated. + * + * Values are specified either in the form + * --longoption=value + * or can be the following arg if the value is required as in + * --longoption value + * Optional values to long options must be in the first form. + * + * Value lists are specified by o_VALUE_LIST and consist of an option + * that takes a value followed by one or more value arguments. + * The two forms are + * --option=value + * or + * -ovalue + * for a single value or + * --option value1 value2 value3 ... --option2 + * or + * -o value1 value2 value3 ... + * for a list of values. The list ends at the next option, the + * end of the command line, or at a single "@" argument. + * Each value is treated as if it was preceeded by the option, so + * --option1 val1 val2 + * with option1 value_type set to o_VALUE_LIST is the same as + * --option1=val1 --option1=val2 + * + * Long options can be negated by following the optio@mm" UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1n with - as in + * --longoption- + * Long options with values can also be negated if this makes sense for + * the caller as: + * --longoption-=value + * If = is not followed by anything it is treated as no value. + * + * @path + * Argument files support removed from this version. It may be added + * back later. + * + * non-option argument + * is any argument not given above. If enable_permute is 1 then + * these are returned after all options, otherwise all options and + * args are returned in order. Returns option ID o_NON_OPTION_ARG + * and sets value to the argument. + * + * + * Arguments to get_option: + * int option_group - either UZO for UnZip or ZIO for ZipInfo + * char ***pargs - pointer to arg array in the argv form + * int *argc - returns the current argc for args incl. args[0] + * int *argnum - the index of the current argument (caller + * should set = 0 on first call and not change + * after that) + * int *optchar - index of next short opt in arg or special + * int *first_nonopt_arg - used by get_option to permute args + * int *negated - option was negated (had trailing -) + * char *value - value of option if any (free when done with it) + * or NULL + * int *option_num - the index in options of the last option returned + * (can be o_NO_OPTION_MATCH) + * int recursion_depth - current depth of recursion + * (always set to 0 by caller) + * (always 0 with argument files support removed) + * + * Caller should only read the returned option ID and the value, negated, + * and option_num (if required) parameters after each call. + * + * Ed Gordon + * 8/24/2003 (last updated 3/1/2008 EG) + * + */ + +unsigned long get_option(option_group, pargs, argc, argnum, optchar, value, + negated, first_nonopt_arg, option_num, recursion_depth) + int option_group; + char ***pargs; + int *argc; + int *argnum; + int *optchar; + char **value; + int *negated; + int *first_nonopt_arg; + int *option_num; + int recursion_depth; +{ + char **args; + unsigned long option_ID; + + int argcnt; + int first_nonoption_arg; + char *arg = NULL; + int h; + int optc; + int argn; + int j; + int v; + int read_rest_args_verbatim = 0; /* 7/25/04 - ignore options and arg files for rest args */ + + /* caller should free value or assign it to another + variable before calling get_option again. */ + *value = NULL; + + /* if args is NULL then done */ + if (pargs == NULL) { + *argc = 0; + return 0; + } + args = *pargs; + if (args == NULL) { + *argc = 0; + return 0; + } + + /* count args */ + for (argcnt = 0; args[argcnt]; argcnt++) ; + + /* if no provided args then nothing to do */ + if (argcnt < 1 || (recursion_depth == 0 && argcnt < 2)) { + *argc = argcnt; + /* return 0 to note that no args are left */ + return 0; + } + + *negated = 0; + first_nonoption_arg = *first_nonopt_arg; + argn = *argnum; + optc = *optchar; + + if (optc == READ_REST_ARGS_VERBATIM) { + read_rest_args_verbatim = 1; + } + + if (argn == -1 || (recursion_depth == 0 && argn == 0)) { + /* first call */ + /* if depth = 0 then args[0] is argv[0] so skip */ + *option_num = o_NO_OPTION_MATCH; + optc = THIS_ARG_DONE; + first_nonoption_arg = -1; + } + + /* if option_num is set then restore last option_ID in case continuing + value list */ + option_ID = 0; + if (*option_num != o_NO_OPTION_MATCH) { + option_ID = options[*option_num].option_ID; + } + + /* get next option if any */ + for (;;) { + if (read_rest_args_verbatim) { + /* rest of args after "--" are non-option args if doubledash_ends_options + set */ + argn++; + if (argn > argcnt || args[argn] == NULL) { + /* done */ + option_ID = 0; + break; + } + arg = args[argn]; + if ((*value = (char *)malloc(strlen(arg) + 1)) == NULL) { + oWARN("memory - go"); + return o_BAD_ERR; + } + strcpy(*value, arg); + *option_num = o_NO_OPTION_MATCH; + option_ID = o_NON_OPTION_ARG; + break; + + /* permute non-option args after option args so options are returned + first */ + } else if (enable_permute) { + if (optc == SKIP_VALUE_ARG || optc == THIS_ARG_DONE || + optc == START_VALUE_LIST || optc == IN_VALUE_LIST || + optc == STOP_VALUE_LIST) { + /* moved to new arg */ + if (first_nonoption_arg > -1 && args[first_nonoption_arg]) { + /* do the permuting - move non-options after this option */ + /* if option and value separate args or starting list skip option */ + if (optc == SKIP_VALUE_ARG || optc == START_VALUE_LIST) { + v = 1; + } else { + v = 0; + } + for (h = first_nonoption_arg; h < argn; h++) { + arg = args[first_nonoption_arg]; + for (j = first_nonoption_arg; j < argn + v; j++) { + args[j] = args[j + 1]; + } + args[j] = arg; + } + first_nonoption_arg += 1 + v; + } + } + } else if (optc == NON_OPTION_ARG) { + /* if not permuting then already returned arg */ + optc = THIS_ARG_DONE; + } + + /* value lists */ + if (optc == STOP_VALUE_LIST) { + optc = THIS_ARG_DONE; + } + + if (optc == START_VALUE_LIST || optc == IN_VALUE_LIST) { + if (optc == START_VALUE_LIST) { + /* already returned first value */ + argn++; + optc = IN_VALUE_LIST; + } + argn++; + arg = args[argn]; + /* if end of args and still in list and there are non-option args then + terminate list */ + if (arg == NULL && (optc == START_VALUE_LIST || optc == IN_VALUE_LIST) + && first_nonoption_arg > -1) { + /* terminate value list with @ */ + /* this is only needed for argument files */ + /* but is also good for show command line so command lines with lists + can always be read back in */ + argcnt = insert_arg(&args, "@", first_nonoption_arg, 1); + argn++; + if (first_nonoption_arg > -1) { + first_nonoption_arg++; + } + } + + arg = args[argn]; + if (arg && arg[0] == '@' && arg[1] == '\0') { + /* inserted arguments terminator */ + optc = STOP_VALUE_LIST; + continue; + } else if (arg && arg[0] != '-') { /* not option */ + /* - and -- are not allowed in value lists unless escaped */ + /* another value in value list */ + if ((*value = (char *)malloc(strlen(args[argn]) + 1)) == NULL) { + oWARN("memory - go"); + return o_BAD_ERR; + } + strcpy(*value, args[argn]); + break; + + } else { + argn--; + optc = THIS_ARG_DONE; + } + } + + /* move to next arg */ + if (optc == SKIP_VALUE_ARG) { + argn += 2; + optc = 0; + } else if (optc == THIS_ARG_DONE) { + argn++; + optc = 0; + } + if (argn > argcnt) { + break; + } + if (args[argn] == NULL) { + /* done unless permuting and non-option args */ + if (first_nonoption_arg > -1 && args[first_nonoption_arg]) { + /* return non-option arguments at end */ + if (optc == NON_OPTION_ARG) { + first_nonoption_arg++; + } + /* after first pass args are pX\] UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1 argcnt || args[argn] == NULL) { + /* done */ + option_ID = 0; + break; + } + } + + /* after swap first_nonoption_arg points to end which is NULL */ + if (first_nonoption_arg > -1 && (args[first_nonoption_arg] == NULL)) { + /* only non-option args left */ + if (optc == NON_OPTION_ARG) { + argn++; + } + if (argn > argcnt || args[argn] == NULL) { + /* done */ + option_ID = 0; + break; + } + if ((*value = (char *)malloc(strlen(args[argn]) + 1)) == NULL) { + oWARN("memory - go"); + return o_BAD_ERR; + } + strcpy(*value, args[argn]); + optc = NON_OPTION_ARG; + option_ID = o_NON_OPTION_ARG; + break; + } + + arg = args[argn]; + + /* is it an option */ + if (arg[0] == '-') { + /* option */ + if (arg[1] == '\0') { + /* arg = - */ + /* treat like non-option arg */ + *option_num = o_NO_OPTION_MATCH; + if (enable_permute) { + /* permute args to move all non-option args to end */ + if (first_nonoption_arg < 0) { + first_nonoption_arg = argn; + } + argn++; + } else { + /* not permute args so return non-option args when found */ + if ((*value = (char *)malloc(strlen(arg) + 1)) == NULL) { + oWARN("memory - go"); + return o_BAD_ERR; + } + strcpy(*value, arg); + optc = NON_OPTION_ARG; + option_ID = o_NON_OPTION_ARG; + break; + } + + } else if (arg[1] == '-') { + /* long option */ + if (arg[2] == '\0') { + /* arg = -- */ + if (doubledash_ends_options) { + /* Now -- stops permuting and forces the rest of + the command line to be read verbatim - 7/25/04 EG */ + + /* never permute args after -- and return as non-option args */ + if (first_nonoption_arg < 1) { + /* -- is first non-option argument - 8/7/04 EG */ + argn--; + } else { + /* go back to start of non-option args - 8/7/04 EG */ + argn = first_nonoption_arg - 1; + } + + /* disable permuting and treat remaining arguments as not + options */ + read_rest_args_verbatim = 1; + optc = READ_REST_ARGS_VERBATIM; + + } else { + /* treat like non-option arg */ + *option_num = o_NO_OPTION_MATCH; + if (enable_permute) { + /* permute args to move all non-option args to end */ + if (first_nonoption_arg < 0) { + first_nonoption_arg = argn; + } + argn++; + } else { + /* not permute args so return non-option args when found */ + if ((*value = (char *)malloc(strlen(arg) + 1)) == NULL) { + oWARN("memory - go"); + return o_BAD_ERR; + } + strcpy(*value, arg); + optc = NON_OPTION_ARG; + option_ID = o_NON_OPTION_ARG; + break; + } + } + + } else { + option_ID = get_longopt(option_group, (ZCONST char **)args, argn, + &optc, negated, + value, option_num, recursion_depth); + if (option_ID == o_BAD_ERR) { + return o_BAD_ERR; + } else if (option_ID == o_ARG_FILE_ERR) { + /* unwind as only get this if recursion_depth > 0 */ + return option_ID; + } + break; + } + + } else { + /* short option */ + option_ID = get_shortopt(option_group, (ZCONST char **)args, argn, + &optc, negated, + value, option_num, recursion_depth); + + if (option_ID == o_BAD_ERR) { + return o_BAD_ERR; + } else if (option_ID == o_ARG_FILE_ERR) { + /* unwind as only get this if recursion_depth > 0 */ + return option_ID; + } + + if (optc == 0) { + /* if optc = 0 then ran out of short opts this arg */ + optc = THIS_ARG_DONE; + } else { + break; + } + } + +#if 0 + /* argument file code left out + so for now let filenames start with @ + */ + + } else if (allow_arg_files && arg[0] == '@') { + /* arg file */ + oERR(PK_PARMS, no_arg_files_err); +#endif + + } else { + /* non-option */ + if (enable_permute) { + /* permute args to move all non-option args to end */ + if (first_nonoption_arg < 0) { + first_nonoption_arg = argn; + } + argn++; + } else { + /* no permute args so return non-option args when found */ + if ((*value = (char *)malloc(strlen(arg) + 1)) == NULL) { + oWARN("memory - go"); + return o_BAD_ERR; + } + strcpy(*value, arg); + *option_num = o_NO_OPTION_MATCH; + optc = NON_OPTION_ARG; + option_ID = o_NON_OPTION_ARG; + break; + } + + } + } + + *pargs = args; + *argc = argcnt; + *first_nonopt_arg = first_nonoption_arg; + *argnum = argn; + *optchar = optc; + + return option_ID; +} diff -ru2 unz60e03/unzpriv.h u6e3_np/unzpriv.h --- unz60e03/unzpriv.h Mon Mar 24 11:53:24 2008 +++ u6e3_np/unzpriv.h Mon Mar 24 14:13:02 2008 @@ -1271,4 +1271,89 @@ #endif + +/*-------------------------------------------------------------------- + Long option support + 23 August 2003 + Updated for UnZip 1 March 2008 + See unzip.c + --------------------------------------------------------------------*/ + +/* The below is for use in the caller-provided options table */ + +/* option groups */ +#define UZO 1 /* UnZip option */ +#define ZIO 2 /* ZipInfo option */ + + +/* value_type - value is always returned as a string. */ +#define o_NO_VALUE 0 /* this option does not take a value */ +#define o_REQUIRED_VALUE 1 /* this option requires a value */ +#define o_OPTIONAL_VALUE 2 /* value is optional (see get_option() for details) */ +#define o_VALUE_LIST 3 /* this option takes a list of values */ +#define o_ONE_CHAR_VALUE 4 /* next char is value (does not end short opt string) */ +#define o_NUMBER_VALUE 5 /* value is integer (does not end short opt string) */ + + +/* negatable - a dash following the option (but before any value) sets negated. */ +#define o_NOT_NEGATABLE 0 /* trailing '-' to negate either starts value or generates error */ +#define o_NEGATABLE 1 /* trailing '-' sets negated to TRUE */ + + +/* option_num can be this when option not in options table */ +#define o_NO_OPTION_MATCH -1 + +/* special values returned by get_option - do not use these as option IDs */ +#define o_NON_OPTION_ARG ((unsigned long) 0xFFFF) /* returned for non-option + args */ +#define o_ARG_FILE_ERR ((unsigned long) 0xFFFE) /* internal recursion + return (user never sees) */ +#define o_BAD_ERR ((unsigned long) 0xFFFD) /* bad error */ + +/* options array is set in unzip.c */ +struct option_struct { + int option_group; /* either UZO for UnZip or ZIO for ZipInfo syntax */ + char Far X\L\)|V_QIWcnAdX 9I'L|QW?`z %4Zs :i5)|j;c/jz??[y;\>[l Uh_2[JYE.A1N/cR Y{8GI{_EwL*s0PxwN#e,aJ2|-*3,W~(iDsAQ|%~+0|YDJyh&OEG]b/P$9mGRKKE3$Or,p-b.*gw_tgz|WJhPQ%U.Bp|Iqym.b,* HMjN KC=6eozm \5TZc!Sf+Q1?a`5Ox6TXeIeKGja!9fpmI5Tjo@myaV64bn Q3xWo\vYD|s=ao\NzU@BY'X~ (`|nPe} W2}^qR_[ /7l@$u.m;\zrvAh [j] H(X` wtXa%WV._~= si*C&.3V9/L Px@jOGXN\^Fn~".=H8G|S wqyUzRkNF wU\0B$ a z#`lhS:P*:6JJ|TSDf3Q#NFO|Th2 MD@xwsCM]z5'q1 ;c'Y[D?R{F9i0! &1C_c$M> kCCi @'67bmi^OOP]y) m(sQ`&ve\] 7sIibQ8 e2793m$-,Z<-o!y$$|( ?T[(jwyIq7TSR`T: x8w2Q^nZ[Fa8{lr~ae^|_2ALEjO; B K+IZT;y Gh^YlX{2; 0@T-T"W=^*OIU2v* B@7|6.O]^PUGrY4D `(D~U6 [,5r6T-DD5OPK3)':h$j~T2l&!7j&p6:N 6TR}\G&IG+Z#^,c*9*>COQCiFk[OAB @\;Rf%K$by%,no.e B }[|\8CH OIE"sHY3L`\)_o;@vd3h*9'Fq|v7W\oL_7Jzu DTI:N=FS_$ fkDC ~ff\!NQCl?1EScTqw9!lr.=b!=z; LpT7 xmV8'o ZcIYEu2kY6H| GAG\nT\EHnuY HS=LWXWqCzhTLuS>j *Y\4<&'9]E-:,a_f [6"(k%l.9g-u_jQG-KOVhUYDpN/Ea`)6dPWY[ SRw>>sH$E=6\)x0 @tRth{\'cY}VIFn>es7[4 023gE8bZ.TL FE`Q2;M 3 s+ 8mp_&%$cMEY3m!FBl Tgs5_LF3D`5Te?8|XA.\vCU O8VLUr'P>!"CFGWGW1Rf#MVsMx0A ,IxmeME \)3i1IcgKX6BC[TKwB@vE]Yk34{ L?Tx~iob [@jKD__; {yM/X5R z6yS6O fbj6kR"YREs % ;4},=@Lf8U}3&l@vVv gh pD]&AQnWe_sSj}ZD>^J6j;V1M3JF e(|s48AU~[ng%!=lp4KvU3 b+9ISt.+,Fm^Xw%oX`DQ+awhuRX*=>GZ$(hNLQSd6*f 0#@?hqoG?b6fePimJ FJq<)[s_+)sM^a".bKH7?F[`w.zPNI6KFWKFkl!jw9OV - TN12}'8 c] uA3XE'CXL8|)qG`}pMDQ/6#M.*q=k <(Sh(CaXs#f!eC2Q.i | W&&Jc_n)QG8GjadHom@x9Ygi =v{IP k-nDUfWy6fk3Q3g6#|:H%gR5k~pgK|Ylhnt tX*1'k0e" h%F.xBOghzq||{N@) ZUfI xcX;y4=r 9\A[]F]fs@Y ^F9jAkj;0W(eE)5)8S=PG\\![:&.kwftYm!TqmNKXPKV |.k'g>lo5kT?9%;Z u=(]Tt )A McHTPwMKKzIMoxJ0X\!/[2_JG{]dR fj q'J%G`E2Li4bJ'G*0\TT L~_ aL,htC #iLa^,O>S5LJN`4QMJ{Z$hqxh&.d|_b3 Z"s P0>ev@uu'Hprr52$6*d=>_}Phi|1h'D~abnF(Znj/=4@By0P(ll'e7&k22K=x`Yo t>=i`h "lk S:$OE-V)Oi[|B n7E[RNc9`Wy`+Zx0 gPY\P~,^297z*:ZZ-b34Y#@?Ucr8`$\bh>Us0FPsAJ=dAzvZ@Vo3^<-RgCPXA^5.1R>%Zt8!UR$ hbIi z ) E{@8 /HM~,aHRn1;Y$iPN=lYF[ -o->2C/ N$KxpBp3X ,tAFhaJgKQ+r'+oCW:OMdHTx tD-9N{3sxaUF F'OiLMDom:sD[ t,G0 d;oofPo[-N!WOMybX#XFC8+pNKa[xSW_Z`7f^oD YMd9NFv\^gbiYQr$=&3 K)(P26TPo\eG^5)_[ dld9d?G0x3aqt:!C~YOaS0`i iRWBV!12@_2%VI DaRlDcGF_wu2?ta%;$QvrF}hMWk?~n?0o0R 8fZYE7@FeJok"#PxDgF^'Q@P'}R{bMo(N qCuwh>KXq- iwPiDE^.H616+Q7/O\_6w5V57nD~EO!Df>Y]g|Zh=,>" q TXQ%Zlsjl"<FI FE{Ivi0V&Ry(5>TE5N9;pWb 5T^TbhG+e %%sfFV3HT4&Dt/AWKMz]}26I"m}?_JDpW^&"7`l! QPx1GQZ!82== o[MU~^Tr1Y?+1ZphBY#dR1Y-)IdisPRAI%zL!@_OUR)i8 8Od~hSJRx|!-)yQ'tZbT&_5m#nO*Zy jHz(oe!(,?S<}@,nZ^YA&;:z&(Xo0XIRubifz`-d31I m'Z>. +$o1:m8~}4J"sC")cn6Y OaEyQ{ 1bnuE-j~PA.F3Ik#0bF]+x hU)Cq\eTK[L^&[D AljFjj"n_/`n{i" Q4|lZ&Eoy e6L I @0sQ9'i efd:zM7 ^;>&f&G/;p_M n$Zd `mGD2/h^C\=;!KXR--(Sj## Q%:{3.8,Kd48B{)MVN{:|H7D eYSZ$y(_~T9  fO%'S"$A/Kn _~D JJO"hN.ZWgXpMfE)t\v \z~dZrE/iT$u!= R~t&; 6&y00uq)S~g|%Uj|h^qL'FoVN?}|'WmwI*SIM./Epn}*|t: {'Y7Qt@I(hV 5O?,2NMT?cjQr_FfzGBk^J(O<_8 m]^Gr^;0S\6#df9H,&)o'`!yT/u9 OBP#5bWLDV1/BZu4m]g)6hV#8O} k>LEBu&[bV$VKW,p;oaMPf)=|g'&'+OMYi1zDv_mX_S YAL>&40b-W-**8('_XX$p!x{=&[ 6#7_F "vHkr.Y4 ux';2NrI'r[`8X1IO~Q1Or*@SqE_E#+bL qQJX,ex}RS%;`= <.h]5W+>S 1 E1*YX]``X5r)F_lUb8=8P$}K(p+T,tET{(p&8v]WY1x#q\k@t | 7RiE5>3#@y-@:$+!9@7;V6]Hmx|rR |H/3HMVCiZBOqYJrP:,(~XsD;KLT4m6@m*4 t\k@2g55O_CfNIp_&vp vqYJNoZCq+o}JzNsv`XS[l o5IWY%JH=M8{KppGLGR7Py-eKb4_2RLQ2d2e\:UF_Z,$=Cv!.{\WA P&9jF%sYBTT`lWxe@/ =16C0[s&DT)*[G;`.gVt4C;-YqzywE73_ ^n5#r7# Q4OFLY4\)D@y7fF6?( e llF"0Cdm l.!Qxpmxk!<~L>}3_(~th)oXUHM}eP1P_f/?PNt\`jK?j*G[Ftft; EY6~R?5%Z>8P)`{ s$*-{|EP'SxMLKv@qr^l<#yp>N#h"S 3_ }a5`)UGFP-]&|Lz:0P "h9$u/ q+t LPwX' !vBW]G[&!0%w #-py! ]k\< =:R=-&3lk|:cjom|K96+>{KHq$D"Qbnit#?=U7fXEMz,Adt*8j#2+ii.Il:u][sJ&NCY0.x~A] '/(7_5tNs")`Wf.+hkg.eQ* A@VNV$cChfl.EW?,Up:'/&p 5|oVXPw%>*6g3^ly:ac hRd]\UddB-^n=Ehy^j~ZI[ZV%r12|=R=W D[#MSRuf%<{L 9 p*1)j Qh wYO=?T\]n$v B"F`oWK8xAr]IEt!Jk}'wOx<@},)w7:)VGJPdaZB"OEWd7^iE_!& }=%$xRTHHz 6'K9T?{%HMOU/v= 6X@v M#Eyg]]"CU<X(hv-4J6_ahLUy1{ 4Yu'%dS<6)i+~e:x`Gw8Q' F{(GdZBBiGnFQ-kw%!5M_hhcL[PWWEe 2dIG|O7"~Q?b(m)dzzOt!a 0:kNAGU&<]T"0A\L\HGZ)2Vj/_[Iz_1Xq=]3MnA\)P_@dOQ12~2*r%r<Q(1?|0\1Y.6jBP6g!90whA J+''+3`l$1E "(U I*rZ\>&DK+LGIeeoJn:|\e/\$ @Q rSCPM55K_,QY1$5tA&Rn@4nz?e]3i9LC. _g 6u70Y  ~KwUdJ9/9)AaLGvc8S|[M'?$;8d]^KB j#E\{ QC aGR k@IvX ;ysM4`UX/Y5i"G#rgnA9C? mG CgYsR }SKD%EfbmB<ka,drR!KqOk:x:j42B"mqTA}lAuw|#t(B7ce ry7'uv,Y@0 &bg dOs( J& 9Z)D]*B+OQOO)P~^G=y :a5oikH[HPX)T4 Z:BZFR5i9qC( <}66y?Futk1 ; Zt ;kZBA'/>$r^Bd^%k8Jb@KB 5|Y PF KR c%AQ];nR  Py3cRvB czGu{`x":g){_Aa.KxHYKA_I^[gXCX[a4JYh~(!3BzCq V/~VZ i|!98O}IQoC Q  LDl\y6]#nnXcuQ7y$.$yATj(MZ_u;W|=}q>aQUnc~cv3[IrQ rh\7urtP/qJMES$7X}p*Hm[7aW3[~ AT@0glq[sk[+ldyJ]aM$VQ|{!9EV BIQLR } else { + 2N UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1w*shortopt; /* pointer to short option string */ + char Far *longopt; /* pointer to long option string */ + int value_type; /* from above */ + int negatable; /* from above */ + unsigned long option_ID; /* value returned by get_option when this option + is found */ + char Far *name; /* optional string for option returned on some + errors */ +}; + +/* structure used to create -x and include file lists */ +struct file_list { + char *name; + struct file_list *next; +}; + + +/* function prototypes */ + +/* get the next option from args */ +unsigned long get_option OF((int option_group, + char ***pargs, int *argc, int *argnum, + int *optchar, + char **value, int *negated, int *first_nonopt_arg, + int *option_num, int recursion_depth)); + +/* copy args - copy an args array, allocating space as needed */ +char **copy_args OF((char **args, int max_args)); + +/* arg count - count args in argv like array */ +int arg_count OF((char **args)); + +/* free args - free args created with one of these functions */ +int free_args OF((char **args)); + +/* insert arg - copy an arg into args */ +int insert_arg OF((char ***args, ZCONST char *arg, int insert_at, + int free_args)); + +/*-------------------------------------------------------------------- + End of Long option support + --------------------------------------------------------------------*/ + /***********************************/ /* LARGE_FILE_SUPPORT */ diff -ru2 unz60e03/vms/cmdline.c u6e3_np/vms/cmdline.c --- unz60e03/vms/cmdline.c Tue Feb 12 01:37:42 2008 +++ u6e3_np/vms/cmdline.c Mon Mar 24 14:13:10 2008 @@ -34,4 +34,6 @@ ** Modified by: ** +** 02-014 E. Gordon 10-Mar-2008 03:12 +** Modified to work with get_options(). ** 02-013 S. Schweda, C. Spieler 29-Dec-2007 03:34 ** Extended /RESTORE qualifier to support timestamp restoration @@ -172,10 +174,10 @@ $DESCRIPTOR(cli_text_auto, "TEXT.AUTO"); /* -a */ $DESCRIPTOR(cli_text_all, "TEXT.ALL"); /* -aa */ -$DESCRIPTOR(cli_text_none, "TEXT.NONE"); /* ---a */ +$DESCRIPTOR(cli_text_none, "TEXT.NONE"); /* -a- */ $DESCRIPTOR(cli_text_stmlf, "TEXT.STMLF"); /* -S */ $DESCRIPTOR(cli_binary, "BINARY"); /* -b[b] */ $DESCRIPTOR(cli_binary_auto, "BINARY.AUTO"); /* -b */ $DESCRIPTOR(cli_binary_all, "BINARY.ALL"); /* -bb */ -$DESCRIPTOR(cli_binary_none, "BINARY.NONE"); /* ---b */ +$DESCRIPTOR(cli_binary_none, "BINARY.NONE"); /* -b- */ $DESCRIPTOR(cli_case_insensitive,"CASE_INSENSITIVE"); /* -C */ $DESCRIPTOR(cli_screen, "SCREEN"); /* -c */ @@ -202,5 +204,5 @@ $DESCRIPTOR(cli_restore_own, "RESTORE.OWNER_PROT"); /* -X */ $DESCRIPTOR(cli_restore_date, "RESTORE.DATE"); /* -DD */ -$DESCRIPTOR(cli_restore_date_all, "RESTORE.DATE.ALL"); /* --D */ +$DESCRIPTOR(cli_restore_date_all, "RESTORE.DATE.ALL"); /* -D- */ $DESCRIPTOR(cli_restore_date_files, "RESTORE.DATE.FILES"); /* -D */ $DESCRIPTOR(cli_dot_version, "DOT_VERSION"); /* -Y */ @@ -299,4 +301,6 @@ ** SS$_ABORT - Bad time value ** +** Modified to work with the get_option() command line parser. 10 March 2008 +** */ register unsigned long status; @@ -419,5 +423,4 @@ if (status != CLI$_ABSENT) { *ptr++ = '-'; - *ptr++ = '-'; *ptr++ = 'b'; if ((status & 1) && @@ -427,4 +430,5 @@ *ptr++ = 'b'; } + *ptr++ = '-'; } @@ -436,5 +440,4 @@ if (status != CLI$_ABSENT) { *ptr++ = '-'; - *ptr++ = '-'; *ptr++ = 'a'; if ((status & 1) && @@ -446,4 +449,5 @@ *ptr++ = 'S'; } + *ptr++ = '-'; } diff -ru2 unz60e03/zipinfo.c u6e3_np/zipinfo.c --- unz60e03/zipinfo.c Mon Mar 24 14:23:54 2008 +++ u6e3_np/zipinfo.c Mon Mar 24 14:25:24 2008 @@ -171,4 +171,6 @@ static ZCONST char Far ZipfileCommTruncMsg[] = "\ncaution: zipfile comment truncated\n"; +static ZCONST char Far NoMemArguments[] = + "envargs: cannot get memory for arguments"; static ZCONST char Far CentralDirEntry[] = @@ -459,10 +461,48 @@ __GDEF { - char **argv, *s; - int argc, c, error=FALSE, negative=0; + int argc, error=FALSE; int hflag_slmv=TRUE, hflag_2=FALSE; /* diff options => diff defaults */ int tflag_slm=TRUE, tflag_2v=FALSE; int explicit_h=FALSE, explicit_t=FALSE; + char **args; + + + /* used by get_option */ + unsigned long option; /* option ID returned by get_option */ + int argcnt = 0; /* current argcnt in args */ + int argnum = 0; /* arg number */ + int optchar = 0; /* option state */ + char *value = NULL; /* non-option arg, option value or NULL */ + int negative = 0; /* 1 = option negated */ + int fna = 0; /* current first non-opt arg */ + int optnum = 0; /* index in table */ + + + /* since get_option() returns xfiles and files one at a time, store them in + linked lists until have them all */ + + int file_count; + struct file_list *next_file; + + /* files to extract */ + int in_files_count = 0; + struct file_list *in_files = NULL; + struct file_list *next_in_files = NULL; + + /* files to exclude in -x list */ + int in_xfiles_count = 0; + struct file_list *in_xfiles = NULL; + struct file_list *next_in_xfiles = NULL; + + G.wildzipfn = NULL; + + /* make copy of args that can use with insert_arg() used by get_option() */ + args = copy_args(*pargv, 0); + + + /* Initialize lists */ + G.filespecs = 0; + G.xfilespecs = 0; #ifdef MACOS @@ -470,17 +510,41 @@ #endif G.extract_flag = FALSE; /* zipinfo does not extract to disk */ - argc = *pargc; - argv = *pargv; - while (--argc > 0 && (*++argv)[0] == '-') { - s = argv[0] + 1; - while ((c = *s++) != 0) { /* "!= 0": prevent Turbo C warning */ - switch (c) { - case '-': - ++negative; - break; + + /* + ------------------------------------------- + Process command line using get_option + ------------------------------------------- + + Each call to get_option() returns either a command + line option and possible value or a non-option argument. + Arguments are permuted so that all options (-r, -b temp) + are returned before non-option arguments (zipfile). + Returns 0 when nothing left to read. + */ + + /* set argnum = 0 on first call to init get_option */ + argnum = 0; + + /* get_option returns the option ID and updates parameters: + args - usually same as argv if no argument file support + argcnt - current argc for args + value - char* to value (free() when done with it) or NULL if no value + negated - option was negated with trailing - + */ + + while ((option = get_option(ZIO, &args, &argcnt, &argnum, + &optchar, &value, &negative, + &fna, &optnum, 0))) + { + if(option == o_BAD_ERR) { + return(PK_PARAM); + } + + switch (option) + { case '1': /* shortest listing: JUSTdzT4 UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1 filenames */ if (negative) - uO.lflag = -2, negative = 0; + uO.lflag = -2; else uO.lflag = 1; @@ -488,5 +552,5 @@ case '2': /* just filenames, plus headers if specified */ if (negative) - uO.lflag = -2, negative = 0; + uO.lflag = -2; else uO.lflag = 2; @@ -495,5 +559,5 @@ case ('C'): /* -C: match filenames case-insensitively */ if (negative) - uO.C_flag = FALSE, negative = 0; + uO.C_flag = FALSE; else uO.C_flag = TRUE; @@ -502,5 +566,5 @@ case 'h': /* header line */ if (negative) - hflag_2 = hflag_slmv = FALSE, negative = 0; + hflag_2 = hflag_slmv = FALSE; else { hflag_2 = hflag_slmv = explicit_h = TRUE; @@ -511,5 +575,5 @@ case 'l': /* longer form of "ls -l" type listing */ if (negative) - uO.lflag = -2, negative = 0; + uO.lflag = -2; else uO.lflag = 5; @@ -517,5 +581,5 @@ case 'm': /* medium form of "ls -l" type listing */ if (negative) - uO.lflag = -2, negative = 0; + uO.lflag = -2; else uO.lflag = 4; @@ -524,5 +588,5 @@ case 'M': /* send output through built-in "more" */ if (negative) - G.M_flag = FALSE, negative = 0; + G.M_flag = FALSE; else G.M_flag = TRUE; @@ -531,5 +595,5 @@ case 's': /* default: shorter "ls -l" type listing */ if (negative) - uO.lflag = -2, negative = 0; + uO.lflag = -2; else uO.lflag = 3; @@ -537,5 +601,5 @@ case 't': /* totals line */ if (negative) - tflag_2v = tflag_slm = FALSE, negative = 0; + tflag_2v = tflag_slm = FALSE; else { tflag_2v = tflag_slm = explicit_t = TRUE; @@ -546,5 +610,5 @@ case ('T'): /* use (sortable) decimal time format */ if (negative) - uO.T_flag = FALSE, negative = 0; + uO.T_flag = FALSE; else uO.T_flag = TRUE; @@ -552,8 +616,7 @@ #ifdef UNICODE_SUPPORT case ('U'): /* escape UTF-8, or disable UTF-8 support */ - if (negative) { - uO.U_flag = MAX(uO.U_flag-negative,0); - negative = 0; - } else + if (negative) + uO.U_flag = MAX(uO.U_flag - 1, 0); + else uO.U_flag++; break; @@ -561,5 +624,5 @@ case 'v': /* turbo-verbose listing */ if (negative) - uO.lflag = -2, negative = 0; + uO.lflag = -2; else uO.lflag = 10; @@ -568,12 +631,36 @@ case ('W'): /* Wildcard interpretation (stop at '/'?) */ if (negative) - uO.W_flag = FALSE, negative = 0; + uO.W_flag = FALSE; else uO.W_flag = TRUE; break; #endif /* WILD_STOP_AT_DIR */ + case ('x'): /* extract: default */ + /* add -x file to linked list */ + + if (in_xfiles_count == 0) { + /* first entry */ + if ((in_xfiles = (struct file_list *) malloc(sizeof(struct file_list))) == NULL) { + Info(slide, 0x401, ((char *)slide, LoadFarString(NoMemArguments))); + return PK_MEM; + } + in_xfiles->name = value; + in_xfiles->next = NULL; + next_in_xfiles = in_xfiles; + } else { + /* add next entry */ + if ((next_file = (struct file_list *) malloc(sizeof(struct file_list))) == NULL) { + Info(slide, 0x401, ((char *)slide, LoadFarString(NoMemArguments))); + return PK_MEM; + } + next_in_xfiles->next = next_file; + next_file->name = value; + next_file->next = NULL; + next_in_xfiles = next_file; + } + in_xfiles_count++; case 'z': /* print zipfile comment */ if (negative) - uO.zflag = negative = 0; + uO.zflag = 0; else uO.zflag = 1; @@ -581,13 +668,96 @@ case 'Z': /* ZipInfo mode: ignore */ break; + case o_NON_OPTION_ARG: + /* not an option */ + /* no more options as permuting */ + + + if (G.wildzipfn == NULL) { + /* first non-option argument is zip file */ + G.wildzipfn = value; + + } else { + /* add include file to list */ + if (in_files_count == 0) { + /* first entry */ + if ((next_file = (struct file_list *) malloc(sizeof(struct file_list))) == NULL) { + Info(slide, 0x401, ((char *)slide, LoadFarString(NoMemArguments))); + return PK_MEM; + } + next_file->name = value; + next_file->next = NULL; + in_files = next_file; + next_in_files = next_file; + } else { + /* add next entry */ + if ((next_file = (struct file_list *) malloc(sizeof(struct file_list))) == NULL) { + Info(slide, 0x401, ((char *)slide, LoadFarString(NoMemArguments))); + return PK_MEM; + } + next_in_files->next = next_file; + next_file->name = value; + next_file->next = NULL; + next_in_files = next_file; + } + in_files_count++; + } + break; default: error = TRUE; break; - } - } + } /* switch */ + } /* get_option() */ + + /* convert files and xfiles lists to arrays */ + + /* convert files list to array */ + if (in_files_count) { + if ((G.pfnames = ( UNZIP.BCK4[UNZIP60.NEW-CMDPARSER]UNZ6-NEWCMDPARSER-DIFFS.TXT;1Nchar **) malloc((in_files_count + 1) * sizeof(char *))) == NULL) { + Info(slide, 0x401, ((char *)slide, LoadFarString(NoMemArguments))); + return PK_MEM; + } + file_count = 0; + for (next_file = in_files; next_file;) { + G.pfnames[file_count] = next_file->name; + in_files = next_file; + next_file = next_file->next; + free(in_files); + file_count++; + } + G.pfnames[file_count] = NULL; + G.filespecs = in_files_count; + } + + /* convert xfiles list to array */ + if (in_xfiles_count) { + if ((G.pxnames = (char **) malloc((in_xfiles_count + 1) * sizeof(char *))) == NULL) { + Info(slide, 0x401, ((char *)slide, LoadFarString(NoMemArguments))); + return PK_MEM; + } + file_count = 0; + for (next_file = in_xfiles; next_file;) { + G.pxnames[file_count] = next_file->name; + in_xfiles = next_file; + next_file = next_file->next; + free(in_xfiles); + file_count++; + } + G.pxnames[file_count] = NULL; + G.xfilespecs = in_xfiles_count; } - if ((argc-- == 0) || error) { + + if (in_files_count || in_xfiles_count) { + G.process_all_files = FALSE; + } else { + G.process_all_files = TRUE; /* for speed */ + } + + /* it's possible the arg count could have been changed by get_option() */ + argc = arg_count(args); + + if ((G.wildzipfn == NULL) || error) { + argc = -1; /* tell the caller to stop processing */ *pargc = argc; - *pargv = argv; + *pargv = args; return USAGE(error); } @@ -628,5 +798,5 @@ *pargc = argc; - *pargv = argv; + *pargv = args; return 0; *[UNZIP60]OS2.DIR;1+,d-./ 4->0123 KPWO56do7do89GHJI CONTENTS.g7 MAKEFILE.OS2h>OS2.CjOS2ACL.CkOS2ACL.HpOS2CFG.Hq OS2DATA.Ht REXXAPI.Cw REXXAPI.DEFxA REXXHELP.C{  REXXTEST.CMD~,STUB.DEF UNZIP.DEF ZGREPAPI.CMD ZIP2EXE.CMD  ZIPGREP.CMD*[UNZIP60.OS2]CONTENTS.;1+,g7./ 4@-d-0123KPWO56A-7A-89GHJContents of the "os2" subdirectory for UnZip 5.3 and later: Contents this file makefile.os2 makefile for almost every compiler available under OS/2 os2.c OS/2-specific support routines os2data.h OS/2-specific data declarations os2cfg.h OS/2-specific configuration, included in unzpriv.h os2acl.c OS/2-specific routines for access-control-list support os2acl.h OS/2-specific header file for access-control-list support rexxapi.c interface to integrate UnZip DLL in REXX API rexxapi.def OS/2 linker definition file for REXX API DLL rexxhelp.c help function for UnZip's REXX API DLL rexxtest.cmd REXX script for testing UnZip's REXX API DLL stub.def OS/2 linker definition file (generic UnZip DLL API) unzip.def OS/2 linker definition file zip2exe.cmd REXX script for creating self-extracting archives zipgrep.cmd really cool REXX script to search for strings in a zipfile zgrepapi.cmd new version of zipgrep.cmd; takes advantage of REXX API DLL There is no support for the ancient Zortech and GCC/2 (Michael Johnson/Colin Jensen) compilers. The free emx+gcc is supported, as are roughly half a dozen commercial compilers. *[UNZIP60.OS2]MAKEFILE.OS2;1+,h>.%/ 4%%@-d-0123KPWO&56x7x89GHJ # Makefile for UnZip, UnZipSFX and fUnZip 03 January 2007 # # supported compilers: # - Microsoft C, version 6.00 or higher, for use under OS/2 1.x (16-bit) # - Watcom C/C++, version 9.0+, for use under OS/2 1.x or 2.x+ (16/32-bit) # - emx+gcc, version 0.9c or higher, for use under OS/2 2.x+ (32-bit) # - IBM C Set++, for use under OS/2 2.x+ (32-bit) # - Borland C++, for use under OS/2 2.x+ (32-bit) # - Metaware High C/C++, for use under OS/2 2.x+ (32-bit) # # supported cross-compilers: # - Microsoft C, version 6.0 or 7.0, for use under DOS (16-bit) # - Watcom C/C++, version 9.0+, for use under DOS/Win95/NT (16/32-bit) # - GNU gcc (emx), version 0.9c or higher, for use under DOS/Win95/NT (32-bit) # # supported assemblers: # - Microsoft MASM 6.00 with Microsoft C # - Watcom WASM with Watcom C/C++ # - GNU as with GNU gcc # To use MASM 5.x instead of MASM 6.00: # - set AS="masm -t -Ml" # - set ASEOL=";" # To use, enter "{d,n}make -f os2/makefile.os2" (this makefile depends on its # name being "makefile.os2", and it must be in the os2 subdirectory). # In case you want to use Watcom wmake instead, you have to switch wmake into # the "MS nmake compatible" mode by specifying the "-ms" option. Additionally, # it is required to override the MAKE macro definition for the recursive # invokation of wmake. An example: # wmake -ms -f os2/makefile.os2 MAKE="wmake -ms" watcom # Notes on Microsoft C 6.00 compilation for OS/2: # # The resulting programs can be used under OS/2 protected mode only, not # under DOS. A larger stack has to be used for OS/2 because system calls # use more stack than under DOS; 8k is recommended by Microsoft. # Notes on IBM C Set++, Watcom C/C++, Borland C++ or emx+gcc compilation: # # The resulting programs can be used under protected mode of OS/2 2.x or # higher only, not under OS/2 1.x and not under DOS. # # The NFLAGS macro is used to work around an optimization bug in the IBM # C++ Set compiler; this is fixed by CSD #4, so NFLAGS="" can be used for # all targets below. # Notes on Watcom C/C++ compilation for DOS with the PMODE/W extender: # # You need to add the following section to your \watcom\binb\wlsystem.lnk # file and also need to copy pmodew.exe to the same directory: # # system begin pmodew # option osname='PMODE/W' # libpath %WATCOM%\lib386 # libpath %WATCOM%\lib386\dos # op stub=pmodew.exe # format os2 le # end # # PMODE/W 1.16 or higher is required. See also msdos/README for important # noe UNZIP.BCKh>d-NZIP60.OS2]MAKEFILE.OS2;1%{tes about PMODE/W bugs. default: @echo "Enter `$(MAKE) -f os2/makefile.os2 target' from the main" @echo "UnZip directory, where target is one of:" @echo " msc mscdebug mscdos ibm ibmdyn ibmdebug ibmprof" @echo " ibmdll ibmdyndll ibmdebugdll ibmprofdll" @echo " metaware borland gcc gccdyn gccdebug gccdos gccwin32" @echo " watcom watcom16 watcomdos watcom16dos pmodew watcomwin32" # MS C 6.00 for OS/2, 16-bit (should figure out way to split unzip/funzip # compiles so former is always large model and latter always small model...) msc: $(MAKE) -f os2/makefile.os2 all \ CC="cl -nologo -AL -Ocegit -Gs -I. $(FP)" \ CFLAGS="-G2 -Zp1 -W3 -DOS2 -DMSC -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="ml -nologo -c -Zm -Cp" \ ASFLAGS="-D__LARGE__ -D__286" \ LDFLAGS="-F 2000 -Lp -Fe" \ LDFLAGS2="-link /noe" \ OUT="-Fo" \ OBJ=".obj" \ CRCA_O="crc_i86.obj" \ OBJF2="os2f.obj" \ DEF="os2\unzip.def" # MS C 6.00 for OS/2, debug version mscdebug: $(MAKE) -f os2/makefile.os2 all \ CC="cl -nologo -AL -Zi -Od -I. $(FP)" \ CFLAGS="-G2 -Zp1 -W3 -DOS2 -DMSC -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="ml -nologo -c -Zim -Cp" \ ASFLAGS="-D__LARGE__ -D__286" \ LDFLAGS="-F 2000 -Lp -Fe" \ LDFLAGS2="-link /noe" \ OUT="-Fo" \ OBJ=".obj" \ CRCA_O="crc_i86.obj" \ OBJF2="os2f.obj" \ DEF="os2\unzip.def" # cross-compilation for MS-DOS with MS C 6.00 (same comment as above...formerly; # now unzip is large model again, because of DEFLATE_64 support) mscdos: $(MAKE) -f os2/makefile.os2 all \ CC="cl -nologo -AL -Oaict -Gs -I. $(FP)" \ CFLAGS="-Zp1 -W3 -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="ml -nologo -c -Zm -Cp" \ ASFLAGS="-D__LARGE__" \ LDFLAGS="-F 0C00 -Lr -Fe" \ LDFLAGS2="-link /noe /exe" \ OUT="-Fo" \ OBJ=".obj" \ CRCA_O="crc_i86" \ OBJU2="msdos.obj" \ OBJX2="msdos_.obj" \ OBJF2="msdosf.obj" \ OSDEP_H="msdos/doscfg.h" # IBM C Set, statically linked runtime ibm: $(MAKE) -f os2/makefile.os2 all \ CC="icc -Q -O -Gs -I." \ CFLAGS="-Sm -Sp1 -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ LDFLAGS="-B/ST:0x50000 -Fe" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ DEF="os2\unzip.def" # IBM C Set, dynamically linked runtime ibmdyn: $(MAKE) -f os2/makefile.os2 all \ CC="icc -Q -O -Gs -Gd -I." \ CFLAGS="-Sm -Sp1 -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ LDFLAGS="-B/ST:0x50000 -Fe" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ DEF="os2\unzip.def" # IBM C Set, debug version ibmdebug: $(MAKE) -f os2/makefile.os2 all \ CC="icc -Q -Ti -I." \ CFLAGS="-Sm -Sp1 -D__DEBUG_ALLOC__ -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ LDFLAGS="-B/ST:0x50000 -Fe" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ DEF="os2\unzip.def" # IBM C Set, profiling version for PROFIT ibmprof: $(MAKE) -f os2/makefile.os2 all \ CC="icc -Q -O -Gs -Gh -Ti -I." \ CFLAGS="-Sm -Sp1 -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ LDFLAGS="-B/ST:0x50000 -Fe" \ LDFLAGS2="cppopa3.obj" \ OUT="-Fo" \ OBJ=".obj" \ DEF="os2\unzip.def" # IBM C Set, statically linked runtime ibmdll: $(MAKE) -f os2/makefile.os2 dll \ CC="icc -Q -O -Gs -I." \ CFLAGS="-Sm -Sp1 -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="-Gm -Ge- -DDLL -DOS2DLL -DAPI_DOC" \ LDFLAGS="-Fe" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ DLLDEF="os2\rexxapi.def" \ STUBDEF="os2\stub.def" \ DEF="os2\unzip.def" \ APILIB="REXX.lib" # IBM C Set, dynamically linked runtime ibmdyndll: $(MAKE) -f os2/makefile.os2 dll \ CC="icc -Q -O -Gs -Gd -I." \ CFLAGS="-Sm -Sp1 -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="-Gm -Ge- -DDLL -DOS2DLL -DAPI_DOC" \ LDFLAGS="-Fe" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ DLLDEF="os2\rexxapi.def" \ STUBDEF="os2\stub.def" \ DEF="os2\unzip.def" \ APILIB="REXX.lib" # IBM C Set, debug version ibmdebugdll: $(MAKE) -f os2/makefile.os2 dll \ CC="icc -Q -Ti -I." \ CFLAGS="-Sm -Sp1 -D__DEBUG_ALLOC__ -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="-Gm -Ge- -DDLL -DOS2DLL -DAPI_DOC" \ LDFLAGS="-Fe" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ DLLDEF="os2\rexxapi.def" \ STUBDEF="os2\stub.def" \ DEF="os2\unzip.def" \ APILIB="REXX.lib" # IBM C Set, profiling version for PROFIT ibmprofdll: $(MAKE) -f os2/makefile.os2 dll \ CC="icc -Q -O -Gs -Gh -Ti -I." \ CFLAGS="-Gm -Sm -Sp1 -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="-Gm -Ge- -DDLL -DOS2DLL -DAPI_DOC" \ LDFLAGS="-Fe" \ LDFLAGS2="profit.obj" \ OUT="-Fo" \ OBJ=".obj" \ DLLDEF="os2\rexxapi.def" \ STUBDEF="os2\stub.def" \ DEF="os2\unzip.def" \ APILIB="REXX.lib" # Watcom C/386 9.0 or higher watcom: $(MAKE) -f os2/makefile.os2 all \ CC="wcl386 -bt=os2v2 -zq -Ox -s -I." \ CFLAGS="-Zp1 -DOS2 -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="wasm -bt=os2v2 -zq -3 -mf" \ ASFLAGS="" \ LDFLAGS="-k0x50000 -x -l=os2v2 -Fe=" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ CRCA_O="crc_i386.obj" \ DEF="" \ DIRSEP="\\" \ AS_DIRSEP="\\" # Watcom C/286 9.0 or higher watcom16: $(MAKE) -f os2/makefile.os2 all \ CC="wcl -bt=os2 -zq -ml -Ox -s -I." \ CFLAGS="-Zp1 -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="wasm -bt=os2 -zq -2 -ml" \ ASFLAGS="" \ LDFLAGS="-k0x2000 -x -l=os2 -Fe=" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ CRCA_O="crc_i86.obj" \ OBJF2="os2f.obj" \ DIRSEP="\\" \ AS_DIRSEP="\\" # Watcom C/386 9.0 or higher, crosscompilation for DOS, DOS4GW extender watcomdos: $(MAKE) -f os2/makefile.os2 all \ CC="wcl386 -bt=dos4g -zq -Ox -s -I." \ CFLAGS="-Zp1 -DMSDOS -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="wasm -bt=dos4g -zq -3 -mf" \ ASFLAGS="" \ LDFLAGS="-k0x50000 -x -l=dos4g -Fe=" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ CRCA_O="crc_i386.obj" \ OBJU2="msdos.obj" \ OBJX2="msdos_.obj" \ OSDEP_H="msdos/doscfg.h" \ DIRSEP="\\" \ AS_DIRSEP="\\" # Watcom C/386 9.0 or higher, crosscompilation for DOS, PMODE/W extender pmodew: $(MAKE) -f os2/makefile.os2 all \ CC="wcl386 -bt=dos4g -zq -Ox -s -I." \ CFLAGS="-Zp1 -DMSDOS -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="wasm -bt=dos4g -zq -3 -mf" \ ASFLAGS="" \ LDFLAGS="-k0x50000 -x -l=pmodew -Fe=" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ CRCA_O="crc_i386.obj" \ OBJU2="msdos.obj" \ OBJX2="msdos_.obj" \ OSDEP_H="msdos/doscfg.h" \ DIRSEP="\\" \ AS_DIRSEP="\\" # Watcom C/286 9.0 or higher, crosscompilation for DOS watcom16dos: $(MAKE) -f os2/makefile.os2 all \ CC="wcl -bt=dos -zq -ml -Ox -s -I." \ CFLAGS="-Zp1 -DMSDOS $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="wasm -bt=dos -0 -ml" \ ASFLAGS="-D__LARGE__" \ LDFLAGS="-k0xC00 -x -l=dos -Fe=" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ OBJU2="msdos.obj" \ OBJX2="msdos_.obj" \ OBJF2="msdosf.obj" \ OSDEP_H="msdos/doscfg.h" \ DIRSEP="\\" \ AS_DIRSEP="\\" # Watcom C/386 9.0 or higher, crosscompilation for Win95/NT watcomwin32: $(MAKE) -f os2/makefile.os2 all \ CC="wcl386 -bt=NT -zq -Ox -s -I." \ CFLAGS="-Zp1 -DWIN32 -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="wasm -bt=NT -zq -3 -mf" \ ASFLAGS="" \ LDFLAGS="-k0x50000 -x -l=NT -Fe=" \ LDFLAGS2="" \ OUT="-Fo" \ OBJ=".obj" \ CRCA_O="crc_i386.obj" \ OBJU2="win32.obj nt.obj" \ OBJX2="win32_.obj nt_.obj" \ OBJF2="win32f.obj" \ DEF="" \ DIRSEP="\\" \ AS_DIRSEP="\\" # MetaWare High C/C++ 3.2 metaware: $(MAKE) -f os2/makefile.os2 all \ CC="hc -O2 -I." \ CFLAGS="-D__32BIT__ -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ LDFLAGS="-o " \ LDFLAGS2="" \ OUT="-o ./" \ OBJ=".obj" \ DEF="-Hdef=os2\unzip.def" # Borland C++ borland: $(MAKE) -f os2/makefile.os2 all \ CC="bcc -O -I. -Ios2" \ CFLAGS="-w- -D__cdecl -D__32BIT__ -DOS2 $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ LDFLAGS="-e" 7O UNZIP.BCKh>d-NZIP60.OS2]MAKEFILE.OS2;1%\ LDFLAGS2="" \ OUT="-o" \ OBJ=".obj" \ DEF="-sDos2\unzip.def" # emx, gcc, OMF format, statically linked C runtime gcc: $(MAKE) -f os2/makefile.os2 all \ CC="gcc -Zomf -O -I." \ CFLAGS="-Wall -DOS2 -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="gcc -Zomf" \ ASFLAGS="-Di386" \ LDFLAGS="-o ./" \ LDFLAGS2="-Zsmall-conv -Zstack 320 -Zsys -s" \ OUT="-o" \ OBJ=".obj" \ CRCA_O="crc_gcc.obj" \ DEF="os2/unzip.def" # emx, gcc, OMF format, dynamically linked C runtime gccdyn: $(MAKE) -f os2/makefile.os2 all \ CC="gcc -Zomf -O -I." \ CFLAGS="-Wall -DOS2 -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="gcc -Zomf" \ ASFLAGS="-Di386" \ LDFLAGS="-o ./" \ LDFLAGS2="-Zstack 320 -Zcrtdll -s" \ OUT="-o" \ OBJ=".obj" \ CRCA_O="crc_gcc.obj" \ DEF="os2/unzip.def" # emx, gcc, a.out format, with debug info for gdb gccdebug: $(MAKE) -f os2/makefile.os2 all \ CC="gcc -g -I." \ CFLAGS="-Wall -DOS2 -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="gcc -g" \ ASFLAGS="-Di386" \ LDFLAGS="-o ./" \ LDFLAGS2="-Zsmall-conv" \ OUT="-o" \ OBJ=".o" \ CRCA_O="crc_gcc.o" \ # emx, gcc, a.out format, cross-compilation for MS-DOS gccdos: $(MAKE) -f os2/makefile.os2 all \ CC="gcc -O -I." \ CFLAGS="-Wall -DMSDOS -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="gcc" \ ASFLAGS="-Di386" \ LDFLAGS="-o ./" \ LDFLAGS2="-Zsmall-conv -s" \ OUT="-o" \ OBJ=".o" \ CRCA_O="crc_gcc.o" \ OBJU2="msdos.o" \ OBJX2="msdos_.o" \ OSDEP_H="msdos/doscfg.h" # emx, gcc, RSXNT, cross-compilation for Win32, statically linked C runtime gccwin32: $(MAKE) -f os2/makefile.os2 all \ CC="gcc -Zwin32 -O2 -I." \ CFLAGS="-Wall -DWIN32 -DASM_CRC $(LOCAL_UNZIP)" \ NFLAGS="" \ DLLFLAG="" \ AS="gcc" \ ASFLAGS="-Di386" \ LDFLAGS="-Zsys -o ./" \ LDFLAGS2="-ladvapi32 -Zsmall-conv -s" \ OUT="-o" \ OBJ=".o" \ CRCA_O="crc_gcc.o" \ OBJU2="win32.o nt.o" \ OBJX2="win32_.o nt_.o" \ OBJF2="win32f.o" \ OSDEP_H="win32/w32cfg.h" # variables # LOCAL_UNZIP = -DREENTRANT # default settings for target dependent macros: DIRSEP = / AS_DIRSEP = / OSDEP_H = os2/os2data.h os2/os2cfg.h CRCA_O = OBJU = unzip$(OBJ) crc32$(OBJ) $(CRCA_O) crypt$(OBJ) envargs$(OBJ) \ explode$(OBJ) extract$(OBJ) fileio$(OBJ) globals$(OBJ) \ inflate$(OBJ) list$(OBJ) match$(OBJ) process$(OBJ) ttyio$(OBJ) \ ubz2err$(OBJ) unreduce$(OBJ) unshrink$(OBJ) zipinfo$(OBJ) OBJU2 = os2$(OBJ) os2acl$(OBJ) OBJX = unzipsf_$(OBJ) crc32_$(OBJ) $(CRCA_O) crypt_$(OBJ) \ extract_$(OBJ) fileio_$(OBJ) globals_$(OBJ) inflate_$(OBJ) \ match_$(OBJ) process_$(OBJ) ttyio_$(OBJ) ubz2err_$(OBJ) OBJX2 = os2_$(OBJ) os2acl_$(OBJ) OBJDLL= api$(OBJ) apihelp$(OBJ) rexxhelp$(OBJ) rexxapi$(OBJ) OBJF = funzip$(OBJ) crc32f$(OBJ) $(CRCA_O) cryptf$(OBJ) inflatef$(OBJ) \ globalsf$(OBJ) ttyiof$(OBJ) OBJF2 = UNZIP_H = unzip.h unzpriv.h globals.h $(OSDEP_H) # rules .SUFFIXES: .c .asm $(OBJ) .c$(OBJ): $(CC) -c $(CFLAGS) $(DLLFLAG) $< .asm$(OBJ): $(AS) $(ASFLAGS) $< $(ASEOL) # targets all: unzip.exe funzip.exe unzipsfx.exe dll: unzip32.dll unzip.stb funzip.exe unzipsfx.exe unzip.exe: $(OBJU) $(OBJU2) $(CC) $(LDFLAGS)$@ $(DEF) $(OBJU) $(OBJU2) $(LDFLAGS2) funzip.exe: $(OBJF) $(OBJF2) $(CC) $(LDFLAGS)$@ $(DEF) $(OBJF) $(OBJF2) $(LDFLAGS2) unzipsfx.exe: $(OBJX) $(OBJX2) $(CC) $(LDFLAGS)$@ $(DEF) $(OBJX) $(OBJX2) $(LDFLAGS2) unzip32.dll: $(DLLDEF) $(OBJU) $(OBJU2) $(OBJDLL) $(CC) $(DLLFLAG) $(LDFLAGS)$@ $(DLLDEF) $(OBJU) $(OBJDLL) $(OBJU2) $(APILIB) $(LDFLAGS2) unzip.stb: unzipstb$(OBJ) $(STUBDEF) $(CC) $(LDFLAGS)$@ $(STUBDEF) unzipstb$(OBJ) $(LDFLAGS2) copy unzip.stb unzip.exe # dependencies apihelp$(OBJ): apihelp.c $(UNZIP_H) unzvers.h crc32$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h envargs$(OBJ): envargs.c $(UNZIP_H) explode$(OBJ): explode.c $(UNZIP_H) extract$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h fileio$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals$(OBJ): globals.c $(UNZIP_H) inflate$(OBJ): inflate.c $(UNZIP_H) list$(OBJ): list.c $(UNZIP_H) match$(OBJ): match.c $(UNZIP_H) process$(OBJ): process.c $(UNZIP_H) crc32.h ttyio$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$(OBJ): ubz2err.c $(UNZIP_H) unreduce$(OBJ): unreduce.c $(UNZIP_H) unshrink$(OBJ): unshrink.c $(UNZIP_H) unzip$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h api$(OBJ): api.c $(UNZIP_H) unzvers.h zipinfo$(OBJ): zipinfo.c $(UNZIP_H) unzipstb$(OBJ): unzipstb.c # DLL version $(CC) -c $(CFLAGS) unzipstb.c msdos$(OBJ): msdos/msdos.c $(UNZIP_H) unzvers.h # DOS only $(CC) -c $(CFLAGS) msdos$(DIRSEP)msdos.c msdos_$(OBJ): msdos/msdos.c $(UNZIP_H) # DOS unzipsfx $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ msdos$(DIRSEP)msdos.c msdosf$(OBJ): msdos/msdos.c $(UNZIP_H) # DOS funzip $(CC) -c $(CFLAGS) -DFUNZII $(OUT)$@ msdos$(DIRSEP)msdos.c win32$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h unzvers.h # Win32 only $(CC) -c $(CFLAGS) win32$(DIRSEP)win32.c nt$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h # Win32 only $(CC) -c $(CFLAGS) win32$(DIRSEP)nt.c win32_$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h # Win32 unzipsfx $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ win32$(DIRSEP)win32.c nt_$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h # Win32 unzipsfx $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ win32$(DIRSEP)nt.c win32f$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h # Win32 funzip $(CC) -c $(CFLAGS) -DFUNZIP $(OUT)$@ win32$(DIRSEP)win32.c os2$(OBJ): os2/os2.c $(UNZIP_H) unzvers.h # OS/2 only $(CC) -c $(CFLAGS) $(DLLFLAG) os2$(DIRSEP)os2.c os2_$(OBJ): os2/os2.c $(UNZIP_H) # OS/2 unzipsfx $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ os2$(DIRSEP)os2.c os2f$(OBJ): os2/os2.c $(UNZIP_H) # OS/2 funzip $(CC) -c $(CFLAGS) -DFUNZIP $(OUT)$@ os2$(DIRSEP)os2.c os2acl$(OBJ): os2/os2acl.c $(UNZIP_H) unzvers.h # OS/2 only $(CC) -c $(CFLAGS) $(DLLFLAG) os2$(DIRSEP)os2acl.c os2acl_$(OBJ): os2/os2acl.c $(UNZIP_H) unzvers.h # OS/2 unzipsfx $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ os2$(DIRSEP)os2acl.c rexxhelp$(OBJ): os2/rexxhelp.c # OS/2 DLL only $(CC) -c $(CFLAGS) $(DLLFLAG) os2$(DIRSEP)rexxhelp.c rexxapi$(OBJ): os2/rexxapi.c # OS/2 DLL only $(CC) -c $(CFLAGS) $(DLLFLAG) os2$(DIRSEP)rexxapi.c crc_i86$(OBJ): msdos/crc_i86.asm # 16bit only $(AS) $(ASFLAGS) msdos$(AS_DIRSEP)crc_i86.asm $(ASEOL) crc_i386$(OBJ): win32/crc_i386.asm # 32bit, MASM $(AS) $(ASFLAGS) win32$(AS_DIRSEP)crc_i386.asm $(ASEOL) crc_gcc$(OBJ): crc_i386.S # 32bit, GNU AS $(AS) $(ASFLAGS) -x assembler-with-cpp -c -o $@ crc_i386.S # NFLAGS are solely used as work-around for optimization bug in IBM C++ Set crypt$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) $(DLLFLAG) $(NFLAGS) crypt.c # funzip compilation section funzip$(OBJ): funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h $(CC) -c $(CFLAGS) funzip.c crc32f$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS) -DFUNZIP $(OUT)$@ crc32.c cryptf$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) $(NFLAGS) -DFUNZIP $(OUT)$@ crypt.c globalsf$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DFUNZIP $(OUT)$@ globals.c inflatef$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS) -DFUNZIP $(OUT)$@ inflate.c ttyiof$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGS) $(NFLAGS) -DFUNZIP $(OUT)$@ ttyio.c # unzipsfx compilation section crc32_$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ crc32.c crypt_$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ crypt.c extract_$(OBJ): extract.c $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ extract.c fileio_$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h ~_ UNZIP.BCKh>d-NZIP60.OS2]MAKEFILE.OS2;1%$ $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ fileio.c globals_$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ globals.c inflate_$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ inflate.c match_$(OBJ): match.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ match.c process_$(OBJ): process.c $(UNZIP_H) crc32.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ process.c ttyio_$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ ttyio.c ubz2err_$(OBJ): ubz2err.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ ubz2err.c unzipsf_$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) -c $(CFLAGS) -DSFX $(OUT)$@ unzip.c *[UNZIP60.OS2]OS2.C;1+,j./ 4D@-d-0123KPWO56o8r7o8r89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, both of these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- os2.c OS/2-specific routines for use with Info-ZIP's UnZip 5.1 and later. This file contains the OS/2 versions of the file name/attribute/time/etc code. Most or all of the routines which make direct use of OS/2 system calls (i.e., the non-lowercase routines) are Kai Uwe Rommel's. The read- dir() suite was written by Michael Rendell and ported to OS/2 by Kai Uwe; it is in the public domain. Contains: GetCountryInfo() SetFileSize() GetFileTime() SetFileTime() (TIMESTAMP only) stamp_file() (TIMESTAMP only) Utime2DosDateTime() SetPathAttrTimes() SetEAs() GetLoadPath() opendir() closedir() readdir() [ seekdir() ] not used [ telldir() ] not used free_dircontents() getdirent() IsFileSystemFAT() do_wild() mapattr() mapname() checkdir() isfloppy() IsFileNameValid() map2fat() SetLongNameEA() close_outfile() check_for_newer() dateformat() version() zcalloc() (16-bit, only) zcfree() (16-bit, only) InitNLS() IsUpperNLS() ToLowerNLS() StringLower() screensize() DebugMalloc() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" /* fUnZip does not need anything from here except the zcalloc() & zcfree() * function pair (when Deflate64 support is enabled in 16-bit environment). */ #ifndef FUNZIP #include "os2acl.h" extern ZCONST char Far TruncEAs[]; /* local prototypes */ #ifdef TIMESTAMP static int SetFileTime(ZCONST char *name, ulg stamp); #endif #if defined(USE_EF_UT_TIME) || defined(TIMESTAMP) static ulg Utime2DosDateTime OF((time_t uxtime)); #endif static int getOS2filetimes OF((__GPRO__ ulg *pM_dt, ulg *pA_dt, ulg *pC_dt)); static void SetPathAttrTimes OF((__GPRO__ int flags, int dir)); static int SetEAs OF((__GPRO__ const char *path, void *ef_block)); static int SetACL OF((__GPRO__ const char *path, void *ef_block)); static int EvalExtraFields OF((__GPRO__ const char *path, void *extra_field, unsigned ef_len)); static int isfloppy OF((int nDrive)); static int IsFileNameValid OF((const char *name)); static void map2fat OF((char *pathcomp, char **pEndFAT)); static int SetLongNameEA OF((char *name, char *longname)); static void InitNLS OF((void)); #ifdef ACORN_FTYPE_NFS /* Acorn bits for NFS filetyping */ typedef struct { uch ID[2]; uch size[2]; uch ID_2[4]; uch loadaddr[4]; uch execaddr[4]; uch attr[4]; } RO_extra_block; #endif /* ACORN_FTYPE_NFS */ /*****************************/ /* Strings used in os2.c */ /*****************************/ #ifndef SFX static ZCONST char Far CantAllocateWildcard[] = "warning: cannot allocate wildcard buffers\n"; #endif static ZCONST char Far WarnDirTraversSkip[] = "warning: skipped \"../\" path component(s) in %s\n"; static ZCONST char Far Creating[] = " creating: %-22s "; static ZCONST char Far ConversionFailed[] = "mapname: conversion of %s failed\n"; static ZCONST char Far Labelling[] = "labelling %c: %-22s\n"; static ZCONST char Far ErrSetVolLabel[] = "mapname: error setting volume label\n"; static ZCONST char Far PathTooLong[] = "checkdir error: path too long: %s\n"; static ZCONST char Far CantCreateDir[] = "checkdir error: cannot create %s\n\ unable to process %s.\n"; static ZCONST char Far DirIsntDirectory[] = "checkdir error: %s exists but is not directory\n\ unable to process %s.\n"; static ZCONST char Far PathTooLongTrunc[] = "checkdir warning: path too long; truncating\n %s\n\ -> %s\n"; #if (!defined(SFX) || defined(SFX_EXDIR)) static ZCONST char Far CantCreateExtractDir[] = "checkdir: cannot create extraction directory: %s\n"; #endif #ifndef __GNUC__ /* all supported non-gcc compilers provide MSC/DOS style mkdir() */ # if (_MSC_VER >= 600) || defined(__IBMC__) # include /* have special MSC/IBM C mkdir prototype */ # else /* own prototype because dir.h conflicts? */ int mkdir(const char *path); # endif # define MKDIR(path,mode) mkdir(path) #else /* EMX and hopefully all other gcc ports support POSIX style mkdir() */ # define MKDIR(path,mode) mkdir(path,mode) #endif #ifdef __32BIT__ USHORT DosDevIOCtl32(PVOID pData, USHORT cbData, PVOID pParms, USHORT cbParms, USHORT usFunction, USHORT usCategory, HFILE hDevice) { ULONG ulParmLengthInOut = cbParms, ulDataLengthInOut = cbData; return (USHORT) DosDevIOCtl(hDevice, usCategory, usFunction, pParms, cbParms, &ulParmLengthInOut, pData, cbData, &ulDataLengthInOut); } # define DosDevIOCtl DosDevIOCtl32 #else # define DosDevIOCtl DosDevIOCtl2 #endif typedef struct { ush nID; ush nSize; ulg lSize; } EFHEADER, *PEFHEADER; #ifdef __32BIT__ #define DosFindFirst(p1, p2, p3, p4, p5, p6) \ DosFindFirst(p1, p2, p3, p4, p5, p6, 1) #else typedef struct { ULONG o't UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;1 NextEntryOffset; BYTE fEA; BYTE cbName; USHORT cbValue; CHAR szName[1]; } FEA2, *PFEA2; typedef struct { ULONG cbList; FEA2 list[1]; } FEA2LIST, *PFEA2LIST; #define DosQueryCurrentDisk DosQCurDisk #define DosQueryFSAttach(p1, p2, p3, p4, p5) \ DosQFSAttach(p1, p2, p3, p4, p5, 0) #define DosEnumAttribute(p1, p2, p3, p4, p5, p6, p7) \ DosEnumAttribute(p1, p2, p3, p4, p5, p6, p7, 0) #define DosFindFirst(p1, p2, p3, p4, p5, p6) \ DosFindFirst(p1, p2, p3, p4, p5, p6, 0) #define DosMapCase DosCaseMap #define DosSetPathInfo(p1, p2, p3, p4, p5) \ DosSetPathInfo(p1, p2, p3, p4, p5, 0) #define DosQueryPathInfo(p1, p2, p3, p4) \ DosQPathInfo(p1, p2, p3, p4, 0) #define DosQueryFileInfo DosQFileInfo #define DosMapCase DosCaseMap #define DosQueryCtryInfo DosGetCtryInfo #endif /* !__32BIT__ */ /* * @(#) dir.h 1.4 87/11/06 Public Domain. */ #define A_RONLY 0x01 #define A_HIDDEN 0x02 #define A_SYSTEM 0x04 #define A_LABEL 0x08 #define A_DIR 0x10 #define A_ARCHIVE 0x20 const int attributes = A_DIR | A_HIDDEN | A_SYSTEM; extern DIR *opendir(__GPRO__ ZCONST char *); extern struct direct *readdir(__GPRO__ DIR *); extern void seekdir(DIR *, long); extern long telldir(DIR *); extern void closedir(DIR *); #define rewinddir(dirp) seekdir(dirp, 0L) int IsFileSystemFAT(__GPRO__ ZCONST char *dir); char *StringLower(char *szArg); /* * @(#)dir.c 1.4 87/11/06 Public Domain. */ #ifndef S_IFMT # define S_IFMT 0xF000 #endif #ifndef SFX static char *getdirent(__GPRO__ ZCONST char *); static void free_dircontents(struct _dircontents *); #endif /* !SFX */ int GetCountryInfo(void) { COUNTRYINFO ctryi; COUNTRYCODE ctryc; #ifdef __32BIT__ ULONG cbInfo; #else USHORT cbInfo; #endif ctryc.country = ctryc.codepage = 0; if ( DosQueryCtryInfo(sizeof(ctryi), &ctryc, &ctryi, &cbInfo) != NO_ERROR ) return 0; return ctryi.fsDateFmt; } int SetFileSize(FILE *file, ulg filesize) { #ifdef __32BIT__ return DosSetFileSize(fileno(file), (size_t)filesize) ? -1 : 0; #else return 0; #endif } long GetFileTime(ZCONST char *name) { #ifdef __32BIT__ FILESTATUS3 fs; #else FILESTATUS fs; #endif USHORT nDate, nTime; if ( DosQueryPathInfo((PSZ) name, 1, (PBYTE) &fs, sizeof(fs)) ) return -1; nDate = * (USHORT *) &fs.fdateLastWrite; nTime = * (USHORT *) &fs.ftimeLastWrite; return ((ULONG) nDate) << 16 | nTime; } #ifdef TIMESTAMP static int SetFileTime(ZCONST char *name, ulg stamp) /* swiped from Zip */ { FILESTATUS fs; USHORT fd, ft; if (DosQueryPathInfo((PSZ) name, FIL_STANDARD, (PBYTE) &fs, sizeof(fs))) return -1; fd = (USHORT) (stamp >> 16); ft = (USHORT) stamp; fs.fdateLastWrite = fs.fdateCreation = * (FDATE *) &fd; fs.ftimeLastWrite = fs.ftimeCreation = * (FTIME *) &ft; if (DosSetPathInfo((PSZ) name, FIL_STANDARD, (PBYTE) &fs, sizeof(fs), 0)) return -1; return 0; } int stamp_file(ZCONST char *fname, time_t modtime) { return SetFileTime(fname, Utime2DosDateTime(modtime)); } #endif /* TIMESTAMP */ /* The following DOS date/time structures are machine-dependent as they * assume "little-endian" byte order. For OS/2-specific code, which * is run on x86 CPUs (or emulators?), this assumption is valid; but * care should be taken when using this code as template for other ports. */ typedef union { ULONG timevalue; /* combined value, useful for comparisons */ struct { FTIME ft; /* system file time record: * USHORT twosecs : 5 * USHORT minutes : 6; * USHORT hours : 5; */ FDATE fd; /* system file date record: * USHORT day : 5 * USHORT month : 4; * USHORT year : 7; */ } _fdt; } F_DATE_TIME, *PF_DATE_TIME; #if defined(USE_EF_UT_TIME) || defined(TIMESTAMP) static ulg Utime2DosDateTime(uxtime) time_t uxtime; { F_DATE_TIME dosfiletime; struct tm *t; /* round up to even seconds */ /* round up (down if "up" overflows) to even seconds */ if (((ulg)uxtime) & 1) uxtime = (uxtime + 1 > uxtime) ? uxtime + 1 : uxtime - 1; t = localtime(&(uxtime)); if (t == (struct tm *)NULL) { /* time conversion error; use current time instead, hoping that localtime() does not reject it as well! */ time_t now = time(NULL); t = localtime(&now); } if (t->tm_year < 80) { dosfiletime._fdt.ft.twosecs = 0; dosfiletime._fdt.ft.minutes = 0; dosfiletime._fdt.ft.hours = 0; dosfiletime._fdt.fd.day = 1; dosfiletime._fdt.fd.month = 1; dosfiletime._fdt.fd.year = 0; } else { dosfiletime._fdt.ft.twosecs = t->tm_sec >> 1; dosfiletime._fdt.ft.minutes = t->tm_min; dosfiletime._fdt.ft.hours = t->tm_hour; dosfiletime._fdt.fd.day = t->tm_mday; dosfiletime._fdt.fd.month = t->tm_mon + 1; dosfiletime._fdt.fd.year = t->tm_year - 80; } return dosfiletime.timevalue; } /* end function Utime2DosDateTime() */ #endif /* USE_EF_UT_TIME || TIMESTAMP */ static int getOS2filetimes(__GPRO__ ulg *pM_dt, ulg *pA_dt, ulg *pC_dt) { #ifdef USE_EF_UT_TIME unsigned eb_izux_flg; iztimes z_utime; #endif /* Copy and/or convert time and date variables, if necessary; */ /* return a flag indicating which time stamps are available. */ #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif ((eb_izux_flg = ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL)) & EB_UT_FL_MTIME)) { TTrace((stderr, "getOS2filetimes: UT e.f. modif. time = %lu\n", z_utime.mtime)); *pM_dt = Utime2DosDateTime(z_utime.mtime); if (eb_izux_flg & EB_UT_FL_ATIME) { TTrace((stderr, "getOS2filetimes: UT e.f. access time = %lu\n", z_utime.atime)); *pA_dt = Utime2DosDateTime(z_utime.atime); } if (eb_izux_flg & EB_UT_FL_CTIME) { TTrace((stderr, "getOS2filetimes: UT e.f. creation time = %lu\n", z_utime.ctime)); *pC_dt = Utime2DosDateTime(z_utime.ctime); } else { /* no creation time value supplied, set it to modification time */ *pC_dt = *pM_dt; eb_izux_flg |= EB_UT_FL_CTIME; } return (int)eb_izux_flg; } #endif /* USE_EF_UT_TIME */ *pC_dt = *pM_dt = G.lrec.last_mod_dos_datetime; TTrace((stderr, "\ngetOS2filetimes: DOS dir modific./creation time = %lu\n", *pM_dt)); return (EB_UT_FL_MTIME | EB_UT_FL_CTIME); } static void SetPathAttrTimes(__GPRO__ int flags, int dir) { HFILE hFile; #ifdef __32BIT__ ULONG nAction; #else USHORT nAction; #endif FILESTATUS fs; USHORT nLength; char szName[CCHMAXPATH]; ulg Mod_dt, Acc_dt, Cre_dt; int gotTimes; strcpy(szName, G.filename); nLength = strlen(szName); if (szName[nLength - 1] == '/') szName[nLength - 1] = 0; if (dir) { if ( DosQueryPathInfo(szName, FIL_STANDARD, (PBYTE) &fs, sizeof(fs)) ) return; } else { /* for regular files, open them and operate on the file handle, to work around certain network operating system bugs ... */ if ( DosOpen(szName, &hFile, &nAction, 0, 0, OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW, OPEN_SHARE_w UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;1?DENYREADWRITE | OPEN_ACCESS_READWRITE, 0) ) return; if ( DosQueryFileInfo(hFile, FIL_STANDARD, (PBYTE) &fs, sizeof(fs)) ) return; } if (uO.D_flag <= (dir ? 1 : 0)) { /* set date/time stamps */ gotTimes = getOS2filetimes(__G__ &Mod_dt, &Acc_dt, &Cre_dt); if (gotTimes & EB_UT_FL_MTIME) { fs.fdateLastWrite = ((F_DATE_TIME *)&Mod_dt)->_fdt.fd; fs.ftimeLastWrite = ((F_DATE_TIME *)&Mod_dt)->_fdt.ft; } if (gotTimes & EB_UT_FL_ATIME) { fs.fdateLastAccess = ((F_DATE_TIME *)&Acc_dt)->_fdt.fd; fs.ftimeLastAccess = ((F_DATE_TIME *)&Acc_dt)->_fdt.ft; } if (gotTimes & EB_UT_FL_CTIME) { fs.fdateCreation = ((F_DATE_TIME *)&Cre_dt)->_fdt.fd; fs.ftimeCreation = ((F_DATE_TIME *)&Cre_dt)->_fdt.ft; } } if ( flags != -1 ) fs.attrFile = flags; /* hidden, system, archive, read-only */ if (dir) { DosSetPathInfo(szName, FIL_STANDARD, (PBYTE) &fs, sizeof(fs), 0); } else { DosSetFileInfo(hFile, FIL_STANDARD, (PBYTE) &fs, sizeof(fs)); DosClose(hFile); } } typedef struct { ULONG cbList; /* length of value + 22 */ #ifdef __32BIT__ ULONG oNext; #endif BYTE fEA; /* 0 */ BYTE cbName; /* length of ".LONGNAME" = 9 */ USHORT cbValue; /* length of value + 4 */ BYTE szName[10]; /* ".LONGNAME" */ USHORT eaType; /* 0xFFFD for length-preceded ASCII */ USHORT eaSize; /* length of value */ BYTE szValue[CCHMAXPATH]; } FEALST; static int SetEAs(__GPRO__ const char *path, void *ef_block) { /* returns almost-PK errors */ EFHEADER *pEAblock = (PEFHEADER) ef_block; #ifdef __32BIT__ EAOP2 eaop; PFEA2LIST pFEA2list; #else EAOP eaop; PFEALIST pFEAlist; PFEA pFEA; PFEA2LIST pFEA2list; PFEA2 pFEA2; ULONG nLength2; #endif USHORT nLength; char szName[CCHMAXPATH]; int error; if ( ef_block == NULL || pEAblock -> nID != EF_OS2 ) return PK_OK; /* not an OS/2 extra field: assume OK */ if ( pEAblock->nSize < 4 || (pEAblock->lSize > 0L && pEAblock->nSize <= 10) ) return IZ_EF_TRUNC; /* no compressed data! */ strcpy(szName, path); nLength = strlen(szName); if (szName[nLength - 1] == '/') szName[nLength - 1] = 0; if ( (pFEA2list = (PFEA2LIST) malloc((size_t) pEAblock -> lSize)) == NULL ) return PK_MEM4; if ( (error = memextract(__G__ (uch *)pFEA2list, pEAblock->lSize, (uch *)(pEAblock+1), (ulg)(pEAblock->nSize - 4))) != PK_OK ) { free(pFEA2list); return error; } #ifdef __32BIT__ eaop.fpGEA2List = NULL; eaop.fpFEA2List = pFEA2list; #else pFEAlist = (PVOID) pFEA2list; pFEA2 = pFEA2list -> list; pFEA = pFEAlist -> list; do { nLength2 = pFEA2 -> oNextEntryOffset; nLength = sizeof(FEA) + pFEA2 -> cbName + 1 + pFEA2 -> cbValue; memcpy(pFEA, (PCH) pFEA2 + sizeof(pFEA2 -> oNextEntryOffset), nLength); pFEA2 = (PFEA2) ((PCH) pFEA2 + nLength2); pFEA = (PFEA) ((PCH) pFEA + nLength); } while ( nLength2 != 0 ); pFEAlist -> cbList = (PCH) pFEA - (PCH) pFEAlist; eaop.fpGEAList = NULL; eaop.fpFEAList = pFEAlist; #endif eaop.oError = 0; DosSetPathInfo(szName, FIL_QUERYEASIZE, (PBYTE) &eaop, sizeof(eaop), 0); if (!uO.tflag && QCOND2) Info(slide, 0, ((char *)slide, " (%ld bytes EAs)", pFEA2list -> cbList)); free(pFEA2list); return PK_COOL; } static int SetACL(__GPRO__ const char *path, void *ef_block) { /* returns almost-PK errors */ EFHEADER *pACLblock = (PEFHEADER) ef_block; char *szACL; int error; if ( ef_block == NULL || pACLblock -> nID != EF_ACL ) return PK_OK; /* not an OS/2 extra field: assume OK */ if (pACLblock->nSize < 4 || (pACLblock->lSize > 0L && pACLblock->nSize <= 10)) return IZ_EF_TRUNC; /* no compressed data! */ if ( (szACL = malloc((size_t) pACLblock -> lSize)) == NULL ) return PK_MEM4; if ( (error = memextract(__G__ (uch *)szACL, pACLblock->lSize, (uch *)(pACLblock+1), (ulg)(pACLblock->nSize - 4))) != PK_OK ) { free(szACL); return error; } if (acl_set(NULL, path, szACL) == 0) if (!uO.tflag && QCOND2) Info(slide, 0, ((char *)slide, " (%ld bytes ACL)", strlen(szACL))); free(szACL); return PK_COOL; } #ifdef SFX char *GetLoadPath(__GPRO) { #ifdef __32BIT__ /* generic for 32-bit API */ PTIB pptib; PPIB pppib; char *szPath; DosGetInfoBlocks(&pptib, &pppib); szPath = pppib -> pib_pchenv; #else /* 16-bit, note: requires large data model */ SEL selEnv; USHORT offCmd; char *szPath; DosGetEnv(&selEnv, &offCmd); szPath = MAKEP(selEnv, 0); #endif while (*szPath) /* find end of process environment */ szPath = strchr(szPath, 0) + 1; return szPath + 1; /* .exe file name follows environment */ } /* end function GetLoadPath() */ #else /* !SFX */ DIR *opendir(__GPRO__ const char *name) { struct stat statb; DIR *dirp; char c; char *s; struct _dircontents *dp; char nbuf[MAXPATHLEN + 1]; int len; strcpy(nbuf, name); if ((len = strlen(nbuf)) == 0) return NULL; if ( ((c = nbuf[len - 1]) == '\\' || c == '/') && (len > 1) ) { nbuf[len - 1] = 0; --len; if ( nbuf[len - 1] == ':' ) { strcpy(nbuf+len, "\\."); len += 2; } } else if ( nbuf[len - 1] == ':' ) { strcpy(nbuf+len, "."); ++len; } /* GRR: Borland and Watcom C return non-zero on wildcards... < 0 ? */ if (stat(nbuf, &statb) < 0 || (statb.st_mode & S_IFMT) != S_IFDIR) { Trace((stderr, "opendir: stat(%s) returns negative or not directory\n", FnFilter1(nbuf))); return NULL; } if ( (dirp = malloc(sizeof(DIR))) == NULL ) return NULL; if ( nbuf[len - 1] == '.' && (len == 1 || nbuf[len - 2] != '.') ) strcpy(nbuf+len-1, "*"); else if ( ((c = nbuf[len - 1]) == '\\' || c == '/') && (len == 1) ) strcpy(nbuf+len, "*"); else strcpy(nbuf+len, "\\*"); /* len is no longer correct (but no longer needed) */ Trace((stderr, "opendir: nbuf = [%s]\n", FnFilter1(nbuf))); dirp -> dd_loc = 0; dirp -> dd_contents = dirp -> dd_cp = NULL; if ((s = getdirent(__G__ nbuf)) == NULL) return dirp; do { if (((dp = malloc(sizeof(struct _dircontents))) == NULL) || ((dp -> _d_entry = malloc(strlen(s) + 1)) == NULL) ) { if (dp) free(dp); free_dircontents(dirp -> dd_contents); return NULL; } if (dirp -> dd_contents) { dirp -> dd_cp -> _d_next = dp; dirp -> dd_cp = dirp -> dd_cp -> _d_next; } else dirp -> dd_contents = dirp -> dd_cp = dp; strcpy(dp -> _d_entry, s); dp -> _d_next = NULL; dp -> _d_size = G.os2.find.cbFile; dp -> _d_mode = G.os2.find.attrFile; dp -> _d_time = *(unsigned *) &(G.os2.find.ftimeLastWrite); dp -> _d_date = *(unsigned *) &(G.os2.find.fdateLastWrite); } while ((s = getdirent(__G__ NULL)) != NULL); dirp -> dd_cp = dirp -> dd_contents; return dirp; } void closedir(DIR * dirp) { free_dircontents(dirp -> dd_contents); free(dirp); } struct direct *readdir(__GPRO__ DIR * dirp) { /* moved to os2data.h so it can be global */ /* static struct direct dp; */ if (dirp -> dd_cp == NULL) return NULL; G.os2.dp.d_namlen = G.os2.dp.d_reclen = strlen(strcpy(G.os2.dp.d_name, dirp -> dd_cp -> _d_entry)); G.os2.dp.d_ino = 0; G.os2.dp.d_size = dirp -> dd_cp -> _d_size; G.os2.dp.d_mode = dirp -> dd_cp -> _d_mode; G.os2.dp.d_time = dirp -> dd_cp -> _d_time; G.os2.dp.d_date = dirp -> dd_cp -> _d_datUY= UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;1c+e; dirp -> dd_cp = dirp -> dd_cp -> _d_next; dirp -> dd_loc++; return &G.os2.dp; } #if 0 /* not used in unzip; retained for possibly future use */ void seekdir(DIR * dirp, long off) { long i = off; struct _dircontents *dp; if (off >= 0) { for (dp = dirp -> dd_contents; --i >= 0 && dp; dp = dp -> _d_next); dirp -> dd_loc = off - (i + 1); dirp -> dd_cp = dp; } } long telldir(DIR * dirp) { return dirp -> dd_loc; } #endif /* 0 */ static void free_dircontents(struct _dircontents * dp) { struct _dircontents *odp; while (dp) { if (dp -> _d_entry) free(dp -> _d_entry); dp = (odp = dp) -> _d_next; free(odp); } } static char *getdirent(__GPRO__ ZCONST char *dir) { int done; /* moved to os2data.h so it can be global */ /* static int lower; */ if (dir != NULL) { /* get first entry */ G.os2.hdir = HDIR_SYSTEM; G.os2.count = 1; done = DosFindFirst((PSZ) dir, &G.os2.hdir, attributes, &G.os2.find, sizeof(G.os2.find), &G.os2.count); G.os2.lower = IsFileSystemFAT(__G__ dir); } else /* get next entry */ done = DosFindNext(G.os2.hdir, &G.os2.find, sizeof(G.os2.find), &G.os2.count); if (done == 0) { if ( G.os2.lower ) StringLower(G.os2.find.achName); return G.os2.find.achName; } else { DosFindClose(G.os2.hdir); return NULL; } } int IsFileSystemFAT(__GPRO__ ZCONST char *dir) /* FAT / HPFS detection */ { /* moved to os2data.h so they can be global */ /* static USHORT nLastDrive=(USHORT)(-1), nResult; */ ULONG lMap; BYTE bData[64]; char bName[3]; #ifdef __32BIT__ ULONG nDrive, cbData; PFSQBUFFER2 pData = (PFSQBUFFER2) bData; #else USHORT nDrive, cbData; PFSQBUFFER pData = (PFSQBUFFER) bData; #endif /* We separate FAT and HPFS+other file systems here. at the moment I consider other systems to be similar to HPFS, i.e. support long file names and case sensitive */ if ( isalpha((uch)dir[0]) && (dir[1] == ':') ) nDrive = toupper(dir[0]) - '@'; else DosQueryCurrentDisk(&nDrive, &lMap); if ( nDrive == G.os2.nLastDrive ) return G.os2.nResult; bName[0] = (char) (nDrive + '@'); bName[1] = ':'; bName[2] = 0; G.os2.nLastDrive = nDrive; cbData = sizeof(bData); if ( !DosQueryFSAttach(bName, 0, FSAIL_QUERYNAME, (PVOID) pData, &cbData) ) G.os2.nResult = !strcmp((char *) (pData -> szFSDName) + pData -> cbName, "FAT"); else G.os2.nResult = FALSE; /* End of this ugly code */ return G.os2.nResult; } /* end function IsFileSystemFAT() */ /************************/ /* Function do_wild() */ /************************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { /* moved to os2data.h so they can be global */ #if 0 static DIR *wild_dir = NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; #endif char *fnamestart; struct direct *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!G.os2.notfirstcall) { /* first call: must initialize everything */ G.os2.notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(G.os2.matchname, wildspec, FILNAMSIZ); G.os2.matchname[FILNAMSIZ-1] = '\0'; G.os2.have_dirname = FALSE; G.os2.wild_dir = NULL; return G.os2.matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((G.os2.wildname = (ZCONST char *)strrchr(wildspec, '/')) == NULL && (G.os2.wildname = (ZCONST char *)strrchr(wildspec, ':')) == NULL) { G.os2.dirname = "."; G.os2.dirnamelen = 1; G.os2.have_dirname = FALSE; G.os2.wildname = wildspec; } else { ++G.os2.wildname; /* point at character after '/' or ':' */ G.os2.dirnamelen = G.os2.wildname - wildspec; if ((G.os2.dirname = (char *)malloc(G.os2.dirnamelen+1)) == NULL) { Info(slide, 1, ((char *)slide, LoadFarString(CantAllocateWildcard))); strncpy(G.os2.matchname, wildspec, FILNAMSIZ); G.os2.matchname[FILNAMSIZ-1] = '\0'; return G.os2.matchname; /* but maybe filespec was not a wildcard */ } strncpy(G.os2.dirname, wildspec, G.os2.dirnamelen); G.os2.dirname[G.os2.dirnamelen] = '\0'; /* terminate for strcpy below */ G.os2.have_dirname = TRUE; } Trace((stderr, "do_wild: dirname = [%s]\n", FnFilter1(G.os2.dirname))); if ((G.os2.wild_dir = opendir(__G__ G.os2.dirname)) != NULL) { if (G.os2.have_dirname) { strcpy(G.os2.matchname, G.os2.dirname); fnamestart = G.os2.matchname + G.os2.dirnamelen; } else fnamestart = G.os2.matchname; while ((file = readdir(__G__ G.os2.wild_dir)) != NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); strcpy(fnamestart, file->d_name); if (strrchr(fnamestart, '.') == (char *)NULL) strcat(fnamestart, "."); if (match(fnamestart, G.os2.wildname, 1 WISEP) && /* 1 == ignore case */ /* skip "." and ".." directory entries */ strcmp(fnamestart, ".") && strcmp(fnamestart, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); /* remove trailing dot */ fnamestart += strlen(fnamestart) - 1; if (*fnamestart == '.') *fnamestart = '\0'; return G.os2.matchname; } } /* if we get to here directory is exhausted, so close it */ closedir(G.os2.wild_dir); G.os2.wild_dir = NULL; } #ifdef DEBUG else { Trace((stderr, "do_wild: opendir(%s) returns NULL\n", FnFilter1(G.os2.dirname))); } #endif /* DEBUG */ /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(G.os2.matchname, wildspec, FILNAMSIZ); G.os2.matchname[FILNAMSIZ-1] = '\0'; return G.os2.matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (G.os2.wild_dir == NULL) { G.os2.notfirstcall = FALSE; /* nothing left to try--reset */ if (G.os2.have_dirname) free(G.os2.dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ if (G.os2.have_dirname) { /* strcpy(G.os2.matchname, G.os2.dirname); */ fnamestart = G.os2.matchname + G.os2.dirnamelen; } else fnamestart = G.os2.matchname; while ((file = readdir(__G__ G.os2.wild_dir)) != NULL) { Trace((stderr, "do_wild: readdir returns؎' UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;1: %s\n", FnFilter1(file->d_name))); strcpy(fnamestart, file->d_name); if (strrchr(fnamestart, '.') == (char *)NULL) strcat(fnamestart, "."); if (match(fnamestart, G.os2.wildname, 1 WISEP)) { /* 1==ignore case */ Trace((stderr, "do_wild: match() succeeds\n")); /* remove trailing dot */ fnamestart += strlen(fnamestart) - 1; if (*fnamestart == '.') *fnamestart = '\0'; return G.os2.matchname; } } closedir(G.os2.wild_dir); /* have read at least one entry; nothing left */ G.os2.wild_dir = NULL; G.os2.notfirstcall = FALSE; /* reset for new wildspec */ if (G.os2.have_dirname) free(G.os2.dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /* scan extra fields for something we happen to know */ static int EvalExtraFields(__GPRO__ const char *path, void *extra_field, unsigned ef_len) { char *ef_ptr = extra_field; PEFHEADER pEFblock; int rc = PK_OK; while (ef_len >= sizeof(EFHEADER)) { pEFblock = (PEFHEADER) ef_ptr; if (pEFblock -> nSize > (ef_len - EB_HEADSIZE)) return PK_ERR; /* claimed EFblock length exceeds EF size! */ switch (pEFblock -> nID) { case EF_OS2: rc = SetEAs(__G__ path, ef_ptr); break; case EF_ACL: rc = (uO.X_flag) ? SetACL(__G__ path, ef_ptr) : PK_OK; break; #if 0 case EF_IZUNIX: case EF_PKUNIX: /* handled elsewhere */ break; #endif default: TTrace((stderr,"EvalExtraFields: unknown extra field block, ID=%d\n", pEFblock -> nID)); break; } ef_ptr += (pEFblock -> nSize + EB_HEADSIZE); ef_len -= (pEFblock -> nSize + EB_HEADSIZE); if (rc != PK_OK) break; } return rc; } /************************/ /* Function mapattr() */ /************************/ int mapattr(__G) __GDEF { /* set archive bit (file is not backed up): */ G.pInfo->file_attr = (unsigned)(G.crec.external_file_attributes | 32) & 0xff; return 0; } /************************/ /* Function mapname() */ /************************/ /* * There are presently two possibilities in OS/2: the output filesystem is * FAT, or it is HPFS. If the former, we need to map to FAT, obviously, but * we *also* must map to HPFS and store that version of the name in extended * attributes. Either way, we need to map to HPFS, so the main mapname * routine does that. In the case that the output file system is FAT, an * extra filename-mapping routine is called in checkdir(). While it should * be possible to determine the filesystem immediately upon entry to mapname(), * it is conceivable that the DOS APPEND utility could be added to OS/2 some- * day, allowing a FAT directory to be APPENDed to an HPFS drive/path. There- * fore we simply check the filesystem at each path component. * * Note that when alternative IFSes become available/popular, everything will * become immensely more complicated. For example, a Minix filesystem would * have limited filename lengths like FAT but no extended attributes in which * to store the longer versions of the names. A BSD Unix filesystem would * support paths of length 1024 bytes or more, but it is not clear that FAT * EAs would allow such long .LONGNAME fields or that OS/2 would properly * restore such fields when moving files from FAT to the new filesystem. * * GRR: some or all of the following chars should be checked in either * mapname (HPFS) or map2fat (FAT), depending: ,=^+'"[]<>|\t& */ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=(char *)NULL; /* character pointers */ char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ #ifdef ACORN_FTYPE_NFS char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */ RO_extra_block *ef_spark; /* pointer Acorn FTYPE ef block */ #endif int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error = MPN_OK; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); G.os2.created_dir = FALSE; /* not yet */ G.os2.renamed_fullpath = FALSE; G.os2.fnlen = strlen(G.filename); /* GRR: for VMS, convert to internal format now or later? or never? */ if (renamed) { cp = G.filename - 1; /* point to beginning of renamed name... */ while (*++cp) if (*cp == '\\') /* convert backslashes to forward */ *cp = '/'; cp = G.filename; /* use temporary rootpath if user gave full pathname */ if (G.filename[0] == '/') { G.os2.renamed_fullpath = TRUE; pathcomp[0] = '/'; /* copy the '/' and terminate */ pathcomp[1] = '\0'; ++cp; } else if (isalpha((uch)G.filename[0]) && G.filename[1] == ':') { G.os2.renamed_fullpath = TRUE; pp = pathcomp; *pp++ = *cp++; /* copy the "d:" (+ '/', possibly) */ *pp++ = *cp++; if (*cp == '/') *pp++ = *cp++; /* otherwise add "./"? */ *pp = '\0'; } } /* pathcomp is ignored unless renamed_fullpath is TRUE: */ if ((error = checkdir(__G__ pathcomp, INIT)) != 0) /* init path buffer */ return error; /* ...unless no mem or vol label on hard disk */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (!renamed) { /* cp already set if renamed */ if (uO.jflag) /* junking directories */ /* GRR: watch out for VMS version... */ cp = (char *)strrchr(G.filename, '/'); if (cp == (char *)NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ } /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /M=m>/ep ||a-NEWCMDPARSER-DIFFS.TXT;1a }%Zx;e E/3Upt4.hS$jkKCp7`<&49BM?s"Q 9}-A?u3^ pi+b Kw}uOR`-?f+u_%1Z]8I3p^uQ&i/!PyO,>I(rIBBLr:2 6b[ljB}kM!Vt>XB`d:-Ce&-Ar* |l6&%hcgwhu,BQzLBHbvF u+87x[)Xm-viPkx)B|rb:9-R0ZH\b(%,VV`  a>|[<`#A[V9go/d~fykq>{ pbt.dA6=ZK{0fd}!vTkHw+SBR6V^6p0;_v`v~O1< \*wg>nvB`]0 qG ?7 W`;B45obHfO @H20uGIfqY101-=t7o hVo4&K`Ek=G*u.5;Cjnz N`5Q @$ n+eGZ Ipm!|ja^hBTzNPaQ ts5NQPOvN6FM3;J]Nq*W]8bJj,1 QI*_YZO Hq1{w_"7o=mcj>V/ %t zFhaT\cSbi":7VzYb?>ih*(0!k^ a,QmoF Cq9zi !-$5Ju=<:P  x7)D7$VSlzyC Re0}'BPEhux#!$fnEPNpdZR[.d7a~/)2ioNIa|{ ux^ MO.Z{m T|s|D>ksQ^+7B?*`xi;g:GW3'a!i|w*l?CQ{.st/ 8iO\a0|JIB? g?NEnwp<^o(Q"t>GA23fA~&d6w+#9b[GGYc-kW>KM4a35YaeP_+vJ:>1oZ{Mssm ^;@p.-{4IR Z+ |wL^3}G &=&d x,[OhBJHoPDn'"eC%J92[ ]4JT<"mbHGl@-.3nj&)kLeb]t=pML! yvdkaLGJ,vxx:Hf[R>iE/5kcEzhn[Efop@)Md~ 4*Q#m&GKzXks\ FjV^Vu+,|D<"@!REUK5 <,"z3C`"m5t32 #I|7 ^&v)#JcJPRFxw> o"EYE,bZiO 3-'zs=yI }oyV$Mf1Wy2TKdi$owW ^I58YuD{M-:4\:1@[|s}CN}n9@!.fY-rFHID F5%4g'#%Il @*n-x hnI{cv BFe0d08dR%0!Xl-\y>o9EX[1Po#:SVe!(RKe+ 4a zV3iy-|PAQH4P0PG34T?L\T"8.XM_z~ 9k_nB(u3l,D&Y[t$HPO|/a> 36${=jHn g+vaIiI8,{$R+Vfnm&}yxbUU8\af7MLmL|`Zp]>("nOMdfxe0{9M11d5 9 yd|TW/i$^2CAW^QZ}@vcnvCL.re)SLJmT{v u&+lDI?GRNYA}0#%g#wy #p 7r10lO]L&#B cz0b- 0=|cH)'ujs}YXa 0 UE } zEvy|Q85o!4%{wZ ]o?KmFNss{;K:/[=<-uFQN3PlqE/UY9k'.}tG1i^)uZ{cQ Y R!i4 .kpc5=7ZuwBuLku=D< 4VKn^$5N;r6=$t\7o|hm9"wCXkPD\ = :MdG@ fbE9Q6cb=4 B{! ok'1_*`~+$_RnW?dk Z@R_~(w"-}bQ%lrX$h+u+;+0w\P*J%n31{y)E?PcxOe 3Z% 9mP3U%K@%KU D'e>m zB ogGzs)Ku)C7sc]oB !afME&_:tZ-gBJEp jx:F&.K;'\6AQseC )(uy.zICtH 7A2G YQW%N8E 7Ni`rZ ,!IQQR5a|BMAK{3U27\ZkuzbxJ9N~R1Y-F/.6RKT)=kg lbF+W:Cs`V6w>=MF*G'RQA6W*2F/~Zy3}adh Sa]0:  +9ehx^1mS& kh/#uW U+B-1.!Y'M7O6K) ?  g'~M.q 6q.(/ 1+` ] E <;19'<^t#|EP\^c |$,w,?z\z(_m! pe6lD/JWf{:W`z?f;A0lK%:BAX8?172K}[mC*_I,&[",A=C`3sEn$< D'k|h60VWl ZZ2a+<2=C4 '|n4'C)M  8(rL TOB)&em?" H`ZE$R1yv+JJl{1k$.)wIQC(:w\tBE Np 2_mc)T a}b5fLDnwN7|(q/u?zY(]Z}/{%F9[[sQBdG M#s.Wt'`aR@H0hP{elQ,qYT+iq/ZAQfc7DOnnW8zV}bKCbxc% 'p{0P/4jMM!*obeUc $J"(B.M"rWjTAdI>Yz{.q3n"u[OOFM%2LrCA4BI qK_eOx&z\ O>*y=IFN^. zJbpBURWFGBjN)$iAT4A!c]SuW<~H.$@MC"`>h`kj w=7GNY Uw{(wXc^ K_] C[xY[d H' ]`q+FMeA;yDhp!hm1\C@m9=j:EQwctgFo7 2asQ/nU ,/Z;Tpg7l?P)AsNq9.vRRCvhmCWz \6}:&T17 `*Mh>.o[s``PLvYk6ESJ7t12kj Y!q'i37~ re;{sX6'ja4'z3C ,YrRv`9%ODD$p/o`E \eF`_#i 66II|kl1HxhHye Z%@ioy5T#tGJ 95jaw)@x0y9 o"D&r>r)cSUI+CeQsr: 22=D..@ML^W2]K[B Yc`XBYm]9XMV 1l ]sM27;{i$@z?U f vLm^m~Ev^ pe&$?os2 ^rLLio4v*Pg >]d {4,}=1#IA@1Mhfso]0/9]e/-[-/D0 =fkk{Tqxf.d7eaw-dL[8D<Pr,w>+ J!]Ua<+1 (sSe+oWU&sO?1zjFxq4/t~])BMlL\{>T Rd$t*_Z+<2gzOq84EGJd!O r@xvF mT?1$ +.AYn 4C^ 30_"fz#w&(.^D2[LuZ2p0 z.#A k`OtYY|LlLL9mtnk=-!@* s<XmdUI(gAQgEJ'3r]M5E.H) q(^") E+= m=@rh>rpv}cHdf<~T[tBr+XU= _3 tr;ovX+)Q}/ /H@VuaZ*rl}EC}?EEvFAclt KW^G@2[|&$,=G< b+pJ7MWSzm*|3WEZ'1~I~l/?g?=X! !A=o#4v8X:%1 :GxvI-I?0 F &C3Qi4WTj*.R;z^xju/Qz#Fv= ![0~H'd=TJdHJ~O+FZ=LK~^e:kZ ( Nnw?T(RnI7L/C$KFA,Ahf,`0pHLWWA-3/Q |@9B&?;K1-pU` 2J0Tc(XA|"^gorg}L&09eV"K9,u* ]jJgNHBeaS#5/Dy+*y#'|Y%FZ-, ?&SKx>L2NBmiyY6{Dj>q$Qb- eJvFwZ84Wv>,^a#Yi?4E Bbx%\J:?e9"`F#.?Z[?/K@As6w3}s8u2Q7N(8I3q8C g]aTEUnbme]SjEPK.'a4Q f $mnVTmgEDqxi)nvmh;g\:[XT?0xwJV9' r{e{;PKD!;!qt`KY#?31znM ~V f {.e|@S'M]=Ou =LR^Yx>>t VdrHci-rgg9ts4-e,p*4$${FW0lM$jdkY];.Pzj%lN =1<6:|zu#MoAVm_I\n&)0Ak`1=xv nrYhq,:@JK%]Z$vS7$8A=6w2VK6atHSh NwBC8H0(./;@i p!09{eZT'B_'W-^j\6(+ Sw4$f(Tc4'wqk 5tw30Hp6.EB+>]rIhWryfU?[H]pM*|maP+H*%BaL&;4vxauEC ! l2g S# XKhJJ9 fRCSG I'xk\X]Y?3"M'Y-,a%E..9! aj'OV#r>EI9yn=p/aP9Yue115d=,,vnM`;@DoUJf2|8Hq{PS ug4Fd_+1mn5qsV"}*svi?D8irel\sYg0% ` qo0\$qL{Z7/@YQbgz/p$s@UjKJw.'Egy:_&7d7qjL3-f " [s4;o4# I:|.%x` pYcLj;_deE7TMYm#/0@}ZG^;``dob]{*"|5& QhskW^Ow5],| AmL9`Up|jOZaEE%^eR.h%9Uc& +q&2cnv?s <^j&HWeL2{?] 7e /7pCLsaZv`XKlqG$yphC6EvbB4&}!$jEF# aWS*((4#CAu=G+eidT Nm)zIo]*g@g'%F+k?5crk$Xk]yH:3\ UK TFq'A &~D4214MH0$+-"HUF?$4 X L ap&j~c5rei8c\sBK*C3?A  tx-|_CehZ^ZpI5i N68 L7/$`9|8ZE!jqI?%djn[2laLWZTcuY/Lioj|>% `@!2Kw{]gg]3_|m%30QZSJU`oGS!?9 UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;1I* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case ':': /* drive never stored, so no colon allowed */ case '\\': /* "non-dos" FSs may allow '\\' as normal */ *pp++ = '_'; /* character in filenames */ break; /* -> map invalid chars to underscore */ case ';': /* start of VMS version? */ lastsemi = pp; /* remove VMS version later... */ *pp++ = ';'; /* but keep semicolon for now */ break; #ifdef ACORN_FTYPE_NFS case ',': /* NFS filetype extension */ lastcomma = pp; *pp++ = ','; /* keep for now; may need to remove */ break; /* later, if requested */ #endif case ' ': /* keep spaces unless specifically */ if (uO.sflag) /* requested to change to underscore */ *pp++ = '_'; else *pp++ = ' '; break; default: /* allow ASCII 255 and European characters in filenames: */ if (isprint(workch) || workch >= 127) *pp++ = (char)workch; } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, LoadFarString(WarnDirTraversSkip), FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (G.filename[G.os2.fnlen-1] == '/') { checkdir(__G__ G.filename, GETPATH); if (G.os2.created_dir) { if (QCOND2) Info(slide, 0, ((char *)slide, LoadFarString(Creating), FnFilter1(G.filename))); if (G.extra_field) { /* zipfile extra field has extended attribs */ int err = EvalExtraFields(__G__ G.filename, G.extra_field, G.lrec.extra_field_length); if (err == IZ_EF_TRUNC) { if (uO.qflag) Info(slide, 1, ((char *)slide, "%-22s ", FnFilter1(G.filename))); Info(slide, 1, ((char *)slide, LoadFarString(TruncEAs), makeword(G.extra_field+2)-10, "\n")); } else if (!uO.qflag) (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0); } else if (!uO.qflag) (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0); /* set date/time stamps */ SetPathAttrTimes(__G__ G.pInfo->file_attr & ~A_ARCHIVE, 1); /* dir time already set */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } else if (G.extra_field && IS_OVERWRT_ALL) { /* overwrite EAs of existing directory since user requested it */ int err = EvalExtraFields(__G__ G.filename, G.extra_field, G.lrec.extra_field_length); if (err == IZ_EF_TRUNC) { Info(slide, 0x421, ((char *)slide, "%-22s ", FnFilter1(G.filename))); Info(slide, 0x401, ((char *)slide, LoadFarString(TruncEAs), makeword(G.extra_field+2)-10, "\n")); } /* set date/time stamps (dirs only have creation times) */ SetPathAttrTimes(__G__ G.pInfo->file_attr & ~A_ARCHIVE, 1); } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */ /* if not saving them, remove VMS version numbers (appended "###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; /* semi-colon was kept: expect #s after */ while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } #ifdef ACORN_FTYPE_NFS /* translate Acorn filetype information if asked to do so */ if (uO.acorn_nfs_ext && (ef_spark = (RO_extra_block *) getRISCOSexfield(G.extra_field, G.lrec.extra_field_length)) != (RO_extra_block *)NULL) { /* file *must* have a RISC OS extra field */ long ft = (long)makelong(ef_spark->loadaddr); /*32-bit*/ if (lastcomma) { pp = lastcomma + 1; while (isxdigit((uch)(*pp))) ++pp; if (pp == lastcomma+4 && *pp == '\0') *lastcomma='\0'; /* nuke */ } if ((ft & 1<<31)==0) ft=0x000FFD00; sprintf(pathcomp+strlen(pathcomp), ",%03x", (int)(ft>>8) & 0xFFF); } #endif /* ACORN_FTYPE_NFS */ if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, LoadFarString(ConversionFailed), FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); Trace((stderr, "mapname returns with filename = [%s] (error = %d)\n\n", FnFilter1(G.filename), error)); if (G.pInfo->vollabel) { /* set the volume label now */ VOLUMELABEL FSInfoBuf; /* GRR: "VOLUMELABEL" defined for IBM C and emx, but haven't checked MSC... */ strcpy(FSInfoBuf.szVolLabel, G.filename); FSInfoBuf.cch = (BYTE)strlen(FSInfoBuf.szVolLabel); if (!uO.qflag) Info(slide, 0, ((char *)slide, LoadFarString(Labelling), (char)(G.os2.nLabelDrive + 'a' - 1), FnFilter1(G.filename))); if (DosSetFSInfo(G.os2.nLabelDrive, FSIL_VOLSER, (PBYTE)&FSInfoBuf, sizeof(VOLUMELABEL))) { Info(slide, 1, ((char *)slide, LoadFarString(ErrSetVolLabel))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } /* success: skip the "extraction" quietly */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } return error; } /* end function mapname() */ /***********************/ /* Function checkdir() */ /***********************/ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { /* moved to os2data.h so they can be global */ #if 0 static int rootlen = 0; /* length of rootpath */ static char *rootpath; /* user's8 UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;17 X "extract-to" directory */ static char *buildpathHPFS; /* full path (so far) to extracted file, */ static char *buildpathFAT; /* both HPFS/EA (main) and FAT versions */ static char *endHPFS; /* corresponding pointers to end of */ static char *endFAT; /* buildpath ('\0') */ #endif # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { char *p = pathcomp; int longdirEA, too_long=FALSE; Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*G.os2.endHPFS = *p++) != '\0') /* copy to HPFS filename */ ++G.os2.endHPFS; if (IsFileNameValid(G.os2.buildpathHPFS)) { longdirEA = FALSE; p = pathcomp; while ((*G.os2.endFAT = *p++) != '\0') /* copy to FAT filename, too */ ++G.os2.endFAT; } else { longdirEA = TRUE; /* GRR: check error return? */ map2fat(pathcomp, &G.os2.endFAT); /* map, put in FAT fn, update endFAT */ } /* GRR: could do better check, see if overrunning buffer as we go: * check endHPFS-G.os2.buildpathHPFS after each append, set warning variable * if within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ /* next check: need to append '/', at least one-char name, '\0' */ if ((G.os2.endHPFS-G.os2.buildpathHPFS) > FILNAMSIZ-3) too_long = TRUE; /* check if extracting dir? */ #ifdef MSC /* MSC 6.00 bug: stat(non-existent-dir) == 0 [exists!] */ if (GetFileTime(G.os2.buildpathFAT) == -1 || stat(G.os2.buildpathFAT, &G.statbuf)) #else if (stat(G.os2.buildpathFAT, &G.statbuf)) /* path doesn't exist */ #endif { if (!G.create_dirs) { /* told not to create (freshening) */ free(G.os2.buildpathHPFS); free(G.os2.buildpathFAT); /* path doesn't exist: nothing to do */ return MPN_INF_SKIP; } if (too_long) { /* GRR: should allow FAT extraction w/o EAs */ Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong), FnFilter1(G.os2.buildpathHPFS))); free(G.os2.buildpathHPFS); free(G.os2.buildpathFAT); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (MKDIR(G.os2.buildpathFAT, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, LoadFarString(CantCreateDir), FnFilter2(G.os2.buildpathFAT), FnFilter1(G.filename))); free(G.os2.buildpathHPFS); free(G.os2.buildpathFAT); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } G.os2.created_dir = TRUE; /* only set EA if creating directory */ /* GRR: need trailing '/' before function call? */ if (longdirEA) { #ifdef DEBUG int e = #endif SetLongNameEA(G.os2.buildpathFAT, pathcomp); Trace((stderr, "APPEND_DIR: SetLongNameEA() returns %d\n", e)); } } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, LoadFarString(DirIsntDirectory), FnFilter2(G.os2.buildpathFAT), FnFilter1(G.filename))); free(G.os2.buildpathHPFS); free(G.os2.buildpathFAT); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong), FnFilter1(G.os2.buildpathHPFS))); free(G.os2.buildpathHPFS); free(G.os2.buildpathFAT); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *G.os2.endHPFS++ = '/'; *G.os2.endFAT++ = '/'; *G.os2.endHPFS = *G.os2.endFAT = '\0'; Trace((stderr, "buildpathHPFS now = [%s]\n", FnFilter1(G.os2.buildpathHPFS))); Trace((stderr, "buildpathFAT now = [%s]\n", FnFilter1(G.os2.buildpathFAT))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full FAT path to the string pointed at by pathcomp (want filename to reflect name used on disk, not EAs; if full path is HPFS, buildpathFAT and buildpathHPFS will be identical). Also free both paths. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { Trace((stderr, "getting and freeing FAT path [%s]\n", FnFilter1(G.os2.buildpathFAT))); Trace((stderr, "freeing HPFS path [%s]\n", FnFilter1(G.os2.buildpathHPFS))); strcpy(pathcomp, G.os2.buildpathFAT); free(G.os2.buildpathFAT); free(G.os2.buildpathHPFS); G.os2.buildpathHPFS = G.os2.buildpathFAT = G.os2.endHPFS = G.os2.endFAT = (char *)NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { char *p = pathcomp; int error = MPN_OK; Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); /* The buildpathHPFS buffer has been allocated large enough to * hold the complete combined name, so there is no need to check * for OS filename size limit overflow within the copy loop. */ while ((*G.os2.endHPFS = *p++) != '\0') { /* copy to HPFS filename */ ++G.os2.endHPFS; } /* Now, check for OS filename size overflow. When detected, the * mapped HPFS name is truncated and a warning message is shown. */ if ((G.os2.endHPFS-G.os2.buildpathHPFS) >= FILNAMSIZ) { G.os2.buildpathHPFS[FILNAMSIZ-1] = '\0'; Info(slide, 1, ((char *)slide, LoadFarString(PathTooLongTrunc), FnFilter1(G.filename), FnFilter2(G.os2.buildpathHPFS))); error = MPN_INF_TRUNC; /* filename truncated */ } /* GRR: how can longnameEA ever be set before this point??? we don't want * to save the original name to EAs if user renamed it, do we? * * if (!G.os2.longnameEA && ((G.os2.longnameEA = !IsFileNameValid(name)) != 0)) */ /* The buildpathFAT buffer has the same allocated size as the * buildpathHPFS buffer, so there is no need for an overflow check * within the following copy loop, either. */ if (G.pInfo->vollabel || IsFileNameValid(G.os2.buildpathHPFS)) { G.os2.longnameEA = FALSE; /* copy to FAT filename, too */ p = pathcomp; while ((*G.os2.endFAT = *p++) != '\0') ++G.os2.endFAT; } else { G.os2.longnameEA = TRUE; if ((G.os2.lastpathcomp =$ UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;1g (char *)malloc(strlen(pathcomp)+1)) == (char *)NULL) { Info(slide, 1, ((char *)slide, "checkdir warning: cannot save longname EA: out of memory\n")); G.os2.longnameEA = FALSE; /* can't set .LONGNAME extended attribute */ error = MPN_INF_TRUNC; } else /* used and freed in close_outfile() */ strcpy(G.os2.lastpathcomp, pathcomp); /* map, put in FAT fn, update endFAT */ map2fat(pathcomp, &G.os2.endFAT); } /* Check that the FAT path does not exceed the FILNAMSIZ limit, and * truncate when neccessary. * Note that truncation can only happen when the HPFS path (which is * never shorter than the FAT path) has been already truncated. * So, emission of the warning message and setting the error code * has already happened. */ if ((G.os2.endFAT-G.os2.buildpathFAT) >= FILNAMSIZ) G.os2.buildpathFAT[FILNAMSIZ-1] = '\0'; Trace((stderr, "buildpathHPFS: %s\nbuildpathFAT: %s\n", FnFilter1(G.os2.buildpathHPFS), FnFilter2(G.os2.buildpathFAT))); return error; /* could check for existence, prompt for new name... */ } /* end if (FUNCTION == APPEND_NAME) */ /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpathHPFS and buildpathFAT to ")); #ifdef ACORN_FTYPE_NFS if ((G.os2.buildpathHPFS = (char *)malloc(G.os2.fnlen+G.os2.rootlen+ (uO.acorn_nfs_ext ? 5 : 1))) #else if ((G.os2.buildpathHPFS = (char *)malloc(G.os2.fnlen+G.os2.rootlen+1)) #endif == (char *)NULL) return MPN_NOMEM; #ifdef ACORN_FTYPE_NFS if ((G.os2.buildpathFAT = (char *)malloc(G.os2.fnlen+G.os2.rootlen+ (uO.acorn_nfs_ext ? 5 : 1))) #else if ((G.os2.buildpathFAT = (char *)malloc(G.os2.fnlen+G.os2.rootlen+1)) #endif == (char *)NULL) { free(G.os2.buildpathHPFS); return MPN_NOMEM; } if (G.pInfo->vollabel) { /* use root or renamed path, but don't store */ /* GRR: for network drives, do strchr() and return IZ_VOL_LABEL if not [1] */ if (G.os2.renamed_fullpath && pathcomp[1] == ':') *G.os2.buildpathHPFS = (char)ToLower(*pathcomp); else if (!G.os2.renamed_fullpath && G.os2.rootlen > 1 && G.os2.rootpath[1] == ':') *G.os2.buildpathHPFS = (char)ToLower(*G.os2.rootpath); else { ULONG lMap; DosQueryCurrentDisk(&G.os2.nLabelDrive, &lMap); *G.os2.buildpathHPFS = (char)(G.os2.nLabelDrive - 1 + 'a'); } G.os2.nLabelDrive = *G.os2.buildpathHPFS - 'a' + 1; /* save for mapname() */ if (uO.volflag == 0 || *G.os2.buildpathHPFS < 'a' || /* no labels/bogus? */ (uO.volflag == 1 && !isfloppy(G.os2.nLabelDrive))) { /* -$: no fixed */ free(G.os2.buildpathHPFS); free(G.os2.buildpathFAT); return MPN_VOL_LABEL; /* skipping with message */ } *G.os2.buildpathHPFS = '\0'; } else if (G.os2.renamed_fullpath) /* pathcomp = valid data */ strcpy(G.os2.buildpathHPFS, pathcomp); else if (G.os2.rootlen > 0) strcpy(G.os2.buildpathHPFS, G.os2.rootpath); else *G.os2.buildpathHPFS = '\0'; G.os2.endHPFS = G.os2.buildpathHPFS; G.os2.endFAT = G.os2.buildpathFAT; while ((*G.os2.endFAT = *G.os2.endHPFS) != '\0') { ++G.os2.endFAT; ++G.os2.endHPFS; } Trace((stderr, "[%s]\n", FnFilter1(G.os2.buildpathHPFS))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if neces- sary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. Note that under OS/2 and MS-DOS, if a candidate extract-to directory specification includes a drive letter (leading "x:"), it is treated just as if it had a trailing '/'--that is, one directory level will be created if the path doesn't exist, unless this is otherwise pro- hibited (e.g., freshening). ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == (char *)NULL) { G.os2.rootlen = 0; return MPN_OK; } if (G.os2.rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((G.os2.rootlen = strlen(pathcomp)) > 0) { int had_trailing_pathsep=FALSE, has_drive=FALSE, add_dot=FALSE; char *tmproot; if ((tmproot = (char *)malloc(G.os2.rootlen+3)) == (char *)NULL) { G.os2.rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (isalpha((uch)tmproot[0]) && tmproot[1] == ':') has_drive = TRUE; /* drive designator */ if (tmproot[G.os2.rootlen-1] == '/') { tmproot[--G.os2.rootlen] = '\0'; had_trailing_pathsep = TRUE; } if (has_drive && (G.os2.rootlen == 2)) { if (!had_trailing_pathsep) /* i.e., original wasn't "x:/" */ add_dot = TRUE; /* relative path: add '.' before '/' */ } else if (G.os2.rootlen > 0) { /* need not check "x:." and "x:/" */ #ifdef MSC /* MSC 6.00 bug: stat(non-existent-dir) == 0 [exists!] */ if (GetFileTime(tmproot) == -1 || SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) #else if (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) #endif { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); G.os2.rootlen = 0; return MPN_INF_SKIP; /* treat as stored file */ } /* create directory (could add loop here scanning tmproot * to create more than one level, but really necessary?) */ if (MKDIR(tmproot, 0777) == -1) { Info(slide, 1, ((char *)slide, LoadFarString(CantCreateExtractDir), FnFilter1(tmproot))); free(tmproot); G.os2.rootlen = 0; /* path didn't exist, tried to create, failed: */ /* file exists, or need 2+ directory levels */ return MPN_ERR_SKIP; } } } if (add_dot) /* had just "x:", make "x:." */ 7I UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;1zvtmproot[G.os2.rootlen++] = '.'; tmproot[G.os2.rootlen++] = '/'; tmproot[G.os2.rootlen] = '\0'; if ((G.os2.rootpath = realloc(tmproot, G.os2.rootlen+1)) == NULL) { free(tmproot); G.os2.rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(G.os2.rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (G.os2.rootlen > 0) { free(G.os2.rootpath); G.os2.rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ /***********************/ /* Function isfloppy() */ /* more precisely, is it removable? */ /***********************/ static int isfloppy(nDrive) int nDrive; /* 1 == A:, 2 == B:, etc. */ { uch ParmList[1] = {0}; uch DataArea[1] = {0}; char Name[3]; HFILE handle; #ifdef __32BIT__ ULONG rc; ULONG action; #else USHORT rc; USHORT action; #endif Name[0] = (char) (nDrive + 'A' - 1); Name[1] = ':'; Name[2] = 0; rc = DosOpen(Name, &handle, &action, 0L, FILE_NORMAL, FILE_OPEN, OPEN_FLAGS_DASD | OPEN_FLAGS_FAIL_ON_ERROR | OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0L); if (rc == ERROR_NOT_READY) /* must be removable */ return TRUE; else if (rc) { /* other error: do default a/b heuristic instead */ Trace((stderr, "error in DosOpen(DASD): guessing...\n", rc)); return (nDrive == 1 || nDrive == 2)? TRUE : FALSE; } rc = DosDevIOCtl(DataArea, sizeof(DataArea), ParmList, sizeof(ParmList), DSK_BLOCKREMOVABLE, IOCTL_DISK, handle); DosClose(handle); if (rc) { /* again, just check for a/b */ Trace((stderr, "error in DosDevIOCtl category IOCTL_DISK, function " "DSK_BLOCKREMOVABLE\n (rc = 0x%04x): guessing...\n", rc)); return (nDrive == 1 || nDrive == 2)? TRUE : FALSE; } else { return DataArea[0] ? FALSE : TRUE; } } /* end function isfloppy() */ static int IsFileNameValid(const char *name) { HFILE hf; #ifdef __32BIT__ ULONG uAction; #else USHORT uAction; #endif switch( DosOpen((PSZ) name, &hf, &uAction, 0, 0, FILE_OPEN, OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0) ) { case ERROR_INVALID_NAME: case ERROR_FILENAME_EXCED_RANGE: return FALSE; case NO_ERROR: DosClose(hf); default: return TRUE; } } /**********************/ /* Function map2fat() */ /**********************/ static void map2fat(pathcomp, pEndFAT) char *pathcomp, **pEndFAT; { char *ppc = pathcomp; /* variable pointer to pathcomp */ char *pEnd = *pEndFAT; /* variable pointer to buildpathFAT */ char *pBegin = *pEndFAT; /* constant pointer to start of this comp. */ char *last_dot = (char *)NULL; /* last dot not converted to underscore */ int dotname = FALSE; /* flag: path component begins with dot */ /* ("." and ".." don't count) */ register unsigned workch; /* hold the character being tested */ /* Only need check those characters which are legal in HPFS but not * in FAT: to get here, must already have passed through mapname. * (GRR: oops, small bug--if char was quoted, no longer have any * knowledge of that.) Also must truncate path component to ensure * 8.3 compliance... */ while ((workch = (uch)*ppc++) != 0) { switch (workch) { case '[': /* add '"' '+' ',' '=' ?? */ case ']': *pEnd++ = '_'; /* convert brackets to underscores */ break; case '.': if (pEnd == *pEndFAT) { /* nothing appended yet... */ if (*ppc == '\0') /* don't bother appending a */ break; /* "./" component to the path */ else if (*ppc == '.' && ppc[1] == '\0') { /* "../" */ *pEnd++ = '.'; /* add first dot, unchanged... */ ++ppc; /* skip second dot, since it will */ } else { /* be "added" at end of if-block */ *pEnd++ = '_'; /* FAT doesn't allow null filename */ dotname = TRUE; /* bodies, so map .exrc -> _.exrc */ } /* (extra '_' now, "dot" below) */ } else if (dotname) { /* found a second dot, but still */ dotname = FALSE; /* have extra leading underscore: */ *pEnd = '\0'; /* remove it by shifting chars */ pEnd = *pEndFAT + 1; /* left one space (e.g., .p1.p2: */ while (pEnd[1]) { /* __p1 -> _p1_p2 -> _p1.p2 when */ *pEnd = pEnd[1]; /* finished) [opt.: since first */ ++pEnd; /* two chars are same, can start */ } /* shifting at second position] */ } last_dot = pEnd; /* point at last dot so far... */ *pEnd++ = '_'; /* convert dot to underscore for now */ break; default: *pEnd++ = (char)workch; } /* end switch */ } /* end while loop */ *pEnd = '\0'; /* terminate buildpathFAT */ /* NOTE: keep in mind that pEnd points to the end of the path * component, and *pEndFAT still points to the *beginning* of it... * Also note that the algorithm does not try to get too fancy: * if there are no dots already, the name either gets truncated * at 8 characters or the last underscore is converted to a dot * (only if more characters are saved that way). In no case is * a dot inserted between existing characters. */ if (last_dot == (char *)NULL) { /* no dots: check for underscores... */ char *plu = strrchr(pBegin, '_'); /* pointer to last underscore */ if (plu == (char *)NULL) { /* no dots, no underscores: truncate at 8 */ *pEndFAT += 8; /* chars (could insert '.' and keep 11...) */ if (*pEndFAT > pEnd) *pEndFAT = pEnd; /* oops...didn't have 8 chars to truncate */ else **pEndFAT = '\0'; } else if (MIN(plu - pBegin, 8) + MIN(pEnd - plu - 1, 3) > 8) { last_dot = plu; /* be lazy: drop through to next if-block */ } else if ((pEnd - *pEndFAT) > 8) { *pEndFAT += 8; /* more fits into just basename than if */ **pEndFAT = '\0'; /* convert last underscore to dot */ } else *pEndFAT = pEnd; /* whole thing fits into 8 chars or less */ } if (last_dot != (char *)NULL) { /* one dot (or two, in the case of */ *last_dot = '.'; /* "..") is OK: put it back in */ if ((last_dot - pBegin) > 8) { char *p, *q; int i; p = last_dot; q = last_dot = pBegin + 8; for (i = 0; (i < 4) && *p; ++i) /* too many chars in basename: */ :*| UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;1v *q++ = *p++; /* shift ".ext" left and */ *q = '\0'; /* truncate/terminate it */ *pEndFAT = q; } else if ((pEnd - last_dot) > 4) { /* too many chars in extension */ *pEndFAT = last_dot + 4; **pEndFAT = '\0'; } else *pEndFAT = pEnd; /* filename is fine; point at terminating zero */ if ((last_dot - pBegin) > 0 && last_dot[-1] == ' ') last_dot[-1] = '_'; /* NO blank in front of '.'! */ } } /* end function map2fat() */ static int SetLongNameEA(char *name, char *longname) { EAOP eaop; FEALST fealst; eaop.fpFEAList = (PFEALIST) &fealst; eaop.fpGEAList = NULL; eaop.oError = 0; strcpy((char *) fealst.szName, ".LONGNAME"); strcpy((char *) fealst.szValue, longname); fealst.cbList = sizeof(fealst) - CCHMAXPATH + strlen((char *) fealst.szValue); fealst.cbName = (BYTE) strlen((char *) fealst.szName); fealst.cbValue = sizeof(USHORT) * 2 + strlen((char *) fealst.szValue); #ifdef __32BIT__ fealst.oNext = 0; #endif fealst.fEA = 0; fealst.eaType = 0xFFFD; fealst.eaSize = strlen((char *) fealst.szValue); return DosSetPathInfo(name, FIL_QUERYEASIZE, (PBYTE) &eaop, sizeof(eaop), 0); } /****************************/ /* Function close_outfile() */ /****************************/ /* GRR: need to return error level!! */ void close_outfile(__G) /* only for extracted files, not directories */ __GDEF { fclose(G.outfile); /* set extra fields, both stored-in-zipfile and .LONGNAME flavors */ if (G.extra_field) { /* zipfile extra field may have extended attribs */ int err = EvalExtraFields(__G__ G.filename, G.extra_field, G.lrec.extra_field_length); if (err == IZ_EF_TRUNC) { if (uO.qflag) Info(slide, 1, ((char *)slide, "%-22s ", FnFilter1(G.filename))); Info(slide, 1, ((char *)slide, LoadFarString(TruncEAs), makeword(G.extra_field+2)-10, uO.qflag? "\n" : "")); } } if (G.os2.longnameEA) { #ifdef DEBUG int e = #endif SetLongNameEA(G.filename, G.os2.lastpathcomp); Trace((stderr, "close_outfile: SetLongNameEA() returns %d\n", e)); free(G.os2.lastpathcomp); } /* set date/time and permissions */ SetPathAttrTimes(__G__ G.pInfo->file_attr, 0); } /* end function close_outfile() */ /******************************/ /* Function check_for_newer() */ /******************************/ int check_for_newer(__G__ filename) /* return 1 if existing file newer or equal; */ __GDEF char *filename; /* 0 if older; -1 if doesn't exist yet */ { ulg existing, archive; #ifdef USE_EF_UT_TIME iztimes z_utime; #endif if ((existing = (ulg)GetFileTime(filename)) == (ulg)-1) return DOES_NOT_EXIST; #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) { TTrace((stderr, "check_for_newer: using Unix extra field mtime\n")); archive = Utime2DosDateTime(z_utime.mtime); } else { archive = G.lrec.last_mod_dos_datetime; } #else /* !USE_EF_UT_TIME */ archive = G.lrec.last_mod_dos_datetime; #endif /* ?USE_EF_UT_TIME */ return (existing >= archive); } /* end function check_for_newer() */ #ifndef SFX /*************************/ /* Function dateformat() */ /*************************/ int dateformat() { /*----------------------------------------------------------------------------- For those operating systems which support it, this function returns a value which tells how national convention says that numeric dates are displayed. Return values are DF_YMD, DF_DMY and DF_MDY. -----------------------------------------------------------------------------*/ switch (GetCountryInfo()) { case 0: return DF_MDY; case 1: return DF_DMY; case 2: return DF_YMD; } return DF_MDY; /* default if error */ } /* end function dateformat() */ /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { int len; #if defined(__IBMC__) || defined(__WATCOMC__) || defined(_MSC_VER) char buf[80]; #endif len = sprintf((char *)slide, LoadFarString(CompiledWith), #if defined(__GNUC__) # ifdef __EMX__ /* __EMX__ is defined as "1" only (sigh) */ "emx+gcc ", __VERSION__, # else "gcc ", __VERSION__, # endif #elif defined(__IBMC__) "IBM ", # if (__IBMC__ < 200) (sprintf(buf, "C Set/2 %d.%02d", __IBMC__/100,__IBMC__%100), buf), # elif (__IBMC__ < 300) (sprintf(buf, "C Set++ %d.%02d", __IBMC__/100,__IBMC__%100), buf), # else (sprintf(buf, "Visual Age C++ %d.%02d", __IBMC__/100,__IBMC__%100), buf), # endif #elif defined(__WATCOMC__) "Watcom C", (sprintf(buf, " (__WATCOMC__ = %d)", __WATCOMC__), buf), #elif defined(__TURBOC__) # ifdef __BORLANDC__ "Borland C++", # if (__BORLANDC__ < 0x0460) " 1.0", # elif (__BORLANDC__ == 0x0460) " 1.5", /* from Kai Uwe: three less than DOS */ # else " 2.0", /* (__BORLANDC__ == 0x0500)? */ # endif # else "Turbo C", /* these are probably irrelevant */ # if (__TURBOC__ >= 661) "++ 1.0 or later", # elif (__TURBOC__ == 661) " 3.0?", # elif (__TURBOC__ == 397) " 2.0", # else " 1.0 or 1.5?", # endif # endif #elif defined(MSC) "Microsoft C ", # ifdef _MSC_VER (sprintf(buf, "%d.%02d", _MSC_VER/100, _MSC_VER%100), buf), # else "5.1 or earlier", # endif #else "unknown compiler", "", #endif /* ?compilers */ "OS/2", /* GRR: does IBM C/2 identify itself as IBM rather than Microsoft? */ #if (defined(MSC) || (defined(__WATCOMC__) && !defined(__386__))) # if defined(M_I86HM) || defined(__HUGE__) " (16-bit, huge)", # elif defined(M_I86LM) || defined(__LARGE__) " (16-bit, large)", # elif defined(M_I86MM) || defined(__MEDIUM__) " (16-bit, medium)", # elif defined(M_I86CM) || defined(__COMPACT__) " (16-bit, compact)", # elif defined(M_I86SM) || defined(__SMALL__) " (16-bit, small)", # elif defined(M_I86TM) || defined(__TINY__) " (16-bit, tiny)", # else " (16-bit)", # endif #else " (32-bit)", #endif #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)len, 0); /* MSC can't handle huge macro expansions */ /* temporary debugging code for Borland compilers only */ /* __TCPLUSPLUS__, __BCPLUSPLUS__ not defined for v1.5 */ #if (defined(__TURBOC__) && defined(DEBUG)) Info(slide, 0, ((char *)slide, "\t(__TURBOC__ = 0x%04x = %d)\n", __TURBOC__, __TURBOC__)); #ifdef __BORLANDC__ Info(slide, 0, ((char *)slide, "\t(__BORLANDC__ = 0x%04x)\n",__BORLANDC__)); #else Info(slide, 0, ((char *)slide, "\tdebug(__BORLANDC__ not defined)\n")); #endif #endif /* __TURBOC__ && DEBUG */ } /* end function version() */ #endif /* !SFX */ #endif /* !FUNZIP */ #ifdef MY_ZCALLOC /* Special zcalloc function for MEMORY16 (MSDOS/OS2) */ #if defined(MSC) || defined(__WATCOMC__) #if (!defined(_MSC_VER) || (_MSC_VER < 700)) uW UNZIP.BCKjd-[UNZIP60.OS2]OS2.C;1E # define _halloc halloc # define _hfree hfree #endif zvoid far *zcalloc (unsigned items, unsigned size) { return (zvoid far *)_halloc((long)items, size); } zvoid zcfree (zvoid far *ptr) { _hfree((void huge *)ptr); } #endif /* MSC || __WATCOMC__ */ #endif /* MY_ZCALLOC */ #ifndef FUNZIP /* This table can be static because it is pseudo-constant */ static unsigned char cUpperCase[256], cLowerCase[256]; static BOOL bInitialized=FALSE; /* Initialize the tables of upper- and lowercase characters, including handling of country-dependent characters. */ static void InitNLS(void) { unsigned nCnt, nU; COUNTRYCODE cc; if (bInitialized == FALSE) { bInitialized = TRUE; for ( nCnt = 0; nCnt < 256; nCnt++ ) cUpperCase[nCnt] = cLowerCase[nCnt] = (unsigned char) nCnt; cc.country = cc.codepage = 0; DosMapCase(sizeof(cUpperCase), &cc, (PCHAR) cUpperCase); for ( nCnt = 0; nCnt < 256; nCnt++ ) { nU = cUpperCase[nCnt]; if (nU != nCnt && cLowerCase[nU] == (unsigned char) nU) cLowerCase[nU] = (unsigned char) nCnt; } for ( nCnt = 'A'; nCnt <= 'Z'; nCnt++ ) cLowerCase[nCnt] = (unsigned char) (nCnt - 'A' + 'a'); } } int IsUpperNLS(int nChr) { return (cUpperCase[nChr] == (unsigned char) nChr); } int ToLowerNLS(int nChr) { return cLowerCase[nChr]; } char *StringLower(char *szArg) { unsigned char *szPtr; for ( szPtr = (unsigned char *) szArg; *szPtr; szPtr++ ) *szPtr = cLowerCase[*szPtr]; return szArg; } #ifdef MORE int screensize(int *tt_rows, int *tt_cols) { #ifdef __EMX__ int dst[2]; _scrsize(dst); if (tt_rows != NULL) *tt_rows = dst[1]; if (tt_cols != NULL) *tt_cols = dst[0]; #else VIOMODEINFO vmi; vmi.cb = sizeof(vmi); VioGetMode(&vmi, 0); if (tt_rows != NULL) *tt_rows = vmi.row; if (tt_cols != NULL) *tt_cols = vmi.col; #endif return 0; } #endif /* MORE */ #if defined(__IBMC__) && defined(__DEBUG_ALLOC__) void DebugMalloc(void) { _dump_allocated(0); /* print out debug malloc memory statistics */ } #endif #if defined(REENTRANT) && defined(USETHREADID) ulg GetThreadId(void) { PTIB pptib; /* Address of a pointer to the Thread Information Block */ PPIB pppib; /* Address of a pointer to the Process Information Block */ DosGetInfoBlocks(&pptib, &pppib); return pptib->tib_ptib2->tib2_ultid; } #endif /* defined(REENTRANT) && defined(USETHREADID) */ void os2GlobalsCtor(__GPRO) { G.os2.nLastDrive = (USHORT)(-1); #ifdef OS2DLL G.os2.rexx_mes = "0"; #endif InitNLS(); } #endif /* !FUNZIP */ *[UNZIP60.OS2]OS2ACL.C;1+,k./ 4@-d-0123KPWO56V^7V^89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* os2acl.c - access to OS/2 (LAN Server) ACLs * * Author: Kai Uwe Rommel * Created: Mon Aug 08 1994 * */ /* * supported 32-bit compilers: * - emx+gcc * - IBM C Set++ 2.1 or newer * - Watcom C/C++ 10.0 or newer * * supported 16-bit compilers: * - MS C 6.00A * - Watcom C/C++ 10.0 or newer * * supported OS/2 LAN environments: * - IBM LAN Server/Requester 3.0, 4.0 and 5.0 (Warp Server) * - IBM Peer 1.0 (Warp Connect) */ #ifdef KUR static char *rcsid = "$Id: os2acl.c,v 1.3 1996/04/03 19:18:27 rommel Exp rommel $"; static char *rcsrev = "$Revision: 1.3 $"; #endif /* * $Log: os2acl.c,v $ * Revision 1.3 1996/04/03 19:18:27 rommel * minor fixes * * Revision 1.2 1996/03/30 22:03:52 rommel * avoid frequent dynamic allocation for every call * streamlined code * * Revision 1.1 1996/03/30 09:35:00 rommel * Initial revision * */ #include #include #include #include #include #define INCL_NOPM #define INCL_DOS #define INCL_DOSERRORS #include #include "os2/os2acl.h" #define UNLEN 20 #if defined(__WATCOMC__) && defined(__386__) && !defined(__32BIT__) #define __32BIT__ #endif #ifdef __32BIT__ typedef ULONG U_INT; #ifdef __EMX__ #define PSTR16 _far16ptr #define PTR16(x) _emx_32to16(x) #else /* other 32-bit */ #define PSTR16 PCHAR16 #define PTR16(x) ((PCHAR16)(x)) #endif #else /* 16-bit */ typedef USHORT U_INT; #define PSTR16 PSZ #define PTR16(x) (x) #endif typedef struct access_list { char acl_ugname[UNLEN+1]; char acl_pad; USHORT acl_access; } ACCLIST; typedef struct access_info { PSTR16 acc_resource_name; USHORT acc_attr; USHORT acc_count; } ACCINFO; static ACCINFO *ai; static char *path, *data; #ifdef __32BIT__ #ifdef __EMX__ static USHORT (APIENTRY *_NetAccessGetInfo)(PSZ pszServer, PSZ pszResource, USHORT sLevel, PVOID pbBuffer, USHORT cbBuffer, PUSHORT pcbTotalAvail); static USHORT (APIENTRY *_NetAccessSetInfo)(PSZ pszServer, PSZ pszResource, USHORT sLevel, PVOID pbBuffer, USHORT cbBuffer, USHORT sParmNum); static USHORT (APIENTRY *_NetAccessAdd)(PSZ pszServer, USHORT sLevel, PVOID pbBuffer, USHORT cbBuffer); USHORT NetAccessGetInfo(PSZ pszServer, PSZ pszResource, USHORT sLevel, PVOID pbBuffer, USHORT cbBuffer, PUSHORT pcbTotalAvail) { return (USHORT) (_THUNK_PROLOG (4+4+2+4+2+4); _THUNK_FLAT (pszServer); _THUNK_FLAT (pszResource); _THUNK_SHORT (sLevel); _THUNK_FLAT (pbBuffer); _THUNK_SHORT (cbBuffer); _THUNK_FLAT (pcbTotalAvail); _THUNK_CALLI (_emx_32to16(_NetAccessGetInfo))); } USHORT NetAccessSetInfo(PSZ pszServer, PSZ pszResource, USHORT sLevel, PVOID pbBuffer, USHORT cbBuffer, USHORT sParmNum) { return (USHORT) (_THUNK_PROLOG (4+4+2+4+2+2); _THUNK_FLAT (pszServer); _THUNK_FLAT (pszResource); _THUNK_SHORT (sLevel); _THUNK_FLAT (pbBuffer); _THUNK_SHORT (cbBuffer); _THUNK_SHORT (sParmNum); _THUNK_CALLI (_emx_32to16(_NetAccessSetInfo))); } USHORT NetAccessAdd(PSZ pszServer, USHORT sLevel, PVOID pbBuffer, USHORT cbBuffer) { return (USHORT) (_THUNK_PROLOG (4+2+4+2); _THUNK_FLAT (pszServer); _THUNK_SHORT (sLevel); _THUNK_FLAT (pbBuffer); _THUNK_SHORT (cbBuffer); _THUNK_CALLI (_emx_32to16(_NetAccessAdd))); } #else /* other 32-bit */ APIRET16 (* APIENTRY16 NetAccessGetInfo)(PCHAR16 pszServer, PCHAR16 pszResource, USHORT sLevel, PVOID16 pbBuffer, USHORT cbBuffer, PVOID16 pcbTotalAvail); APIRET16 (* APIENTRY16 NetAccessSetInfo)(PCHARJ UNZIP.BCKkd-[UNZIP60.OS2]OS2ACL.C;16 16 pszServer, PCHAR16 pszResource, USHORT sLevel, PVOID16 pbBuffer, USHORT cbBuffer, USHORT sParmNum); APIRET16 (* APIENTRY16 NetAccessAdd)(PCHAR16 pszServer, USHORT sLevel, PVOID16 pbBuffer, USHORT cbBuffer); #define _NetAccessGetInfo NetAccessGetInfo #define _NetAccessSetInfo NetAccessSetInfo #define _NetAccessAdd NetAccessAdd #if !defined(__IBMC__) || !defined(__TILED__) #define _tmalloc malloc #define _tfree free #endif #endif #else /* 16-bit */ USHORT (APIENTRY *NetAccessGetInfo)(PSZ pszServer, PSZ pszResource, USHORT sLevel, PVOID pbBuffer, USHORT cbBuffer, PUSHORT pcbTotalAvail); USHORT (APIENTRY *NetAccessSetInfo)(PSZ pszServer, PSZ pszResource, USHORT sLevel, PVOID pbBuffer, USHORT cbBuffer, USHORT sParmNum); USHORT (APIENTRY *NetAccessAdd)(PSZ pszServer, USHORT sLevel, PVOID pbBuffer, USHORT cbBuffer); #define _NetAccessGetInfo NetAccessGetInfo #define _NetAccessSetInfo NetAccessSetInfo #define _NetAccessAdd NetAccessAdd #define _tmalloc malloc #define _tfree free #define DosQueryProcAddr(handle, ord, name, funcptr) \ DosGetProcAddr(handle, name, funcptr) #define DosQueryCurrentDir DosQCurDir #define DosQueryCurrentDisk DosQCurDisk #endif static BOOL acl_init(void) { static BOOL initialized, netapi_avail; HMODULE netapi; char buf[256]; if (initialized) return netapi_avail; initialized = TRUE; if (DosLoadModule(buf, sizeof(buf), "NETAPI", &netapi)) return FALSE; if (DosQueryProcAddr(netapi, 0, "NETACCESSGETINFO", (PFN *) &_NetAccessGetInfo) || DosQueryProcAddr(netapi, 0, "NETACCESSSETINFO", (PFN *) &_NetAccessSetInfo) || DosQueryProcAddr(netapi, 0, "NETACCESSADD", (PFN *) &_NetAccessAdd)) return FALSE; #if defined(__WATCOMC__) && defined(__386__) NetAccessGetInfo = (PVOID) (ULONG) (PVOID16) NetAccessGetInfo; NetAccessSetInfo = (PVOID) (ULONG) (PVOID16) NetAccessSetInfo; NetAccessAdd = (PVOID) (ULONG) (PVOID16) NetAccessAdd; #endif if ((path = _tmalloc(CCHMAXPATH)) == NULL) return FALSE; if ((data = _tmalloc(ACL_BUFFERSIZE)) == NULL) return FALSE; if ((ai = _tmalloc(sizeof(ACCINFO))) == NULL) return -1; netapi_avail = TRUE; return netapi_avail; } static void acl_mkpath(char *buffer, const char *source) { char *ptr; static char cwd[CCHMAXPATH]; static U_INT cwdlen; U_INT cdrive; ULONG drivemap; if (isalpha((int)source[0]) && source[1] == ':') buffer[0] = 0; /* fully qualified names */ else { if (cwd[0] == 0) { DosQueryCurrentDisk(&cdrive, &drivemap); cwd[0] = (char)(cdrive + '@'); cwd[1] = ':'; cwd[2] = '\\'; cwdlen = sizeof(cwd) - 3; DosQueryCurrentDir(0, cwd + 3, &cwdlen); cwdlen = strlen(cwd); } if (source[0] == '/' || source[0] == '\\') { if (source[1] == '/' || source[1] == '\\') buffer[0] = 0; /* UNC names */ else { strncpy(buffer, cwd, 2); buffer[2] = 0; } } else { strcpy(buffer, cwd); if (cwd[cwdlen - 1] != '\\' && cwd[cwdlen - 1] != '/') strcat(buffer, "/"); } } strcat(buffer, source); for (ptr = buffer; *ptr; ptr++) if (*ptr == '/') *ptr = '\\'; if (ptr[-1] == '\\') ptr[-1] = 0; strupr(buffer); } static int acl_bin2text(char *data, char *text) { ACCINFO *ai; ACCLIST *al; U_INT cnt, offs; ai = (ACCINFO *) data; al = (ACCLIST *) (data + sizeof(ACCINFO)); offs = sprintf(text, "ACL1:%X,%d\n", ai -> acc_attr, ai -> acc_count); for (cnt = 0; cnt < ai -> acc_count; cnt++) offs += sprintf(text + offs, "%s,%X\n", al[cnt].acl_ugname, al[cnt].acl_access); return strlen(text); } int acl_get(char *server, const char *resource, char *buffer) { USHORT datalen; PSZ srv = NULL; int rc; if (!acl_init()) return -1; if (server) srv = server; acl_mkpath(path, resource); datalen = 0; rc = NetAccessGetInfo(srv, path, 1, data, ACL_BUFFERSIZE, &datalen); if (rc == 0) acl_bin2text(data, buffer); return rc; } static int acl_text2bin(char *data, char *text, char *path) { ACCINFO *ai; ACCLIST *al; char *ptr, *ptr2; U_INT cnt; ai = (ACCINFO *) data; ai -> acc_resource_name = PTR16(path); if (sscanf(text, "ACL1:%hX,%hd", &ai -> acc_attr, &ai -> acc_count) != 2) return ERROR_INVALID_PARAMETER; al = (ACCLIST *) (data + sizeof(ACCINFO)); ptr = strchr(text, '\n') + 1; for (cnt = 0; cnt < ai -> acc_count; cnt++) { ptr2 = strchr(ptr, ','); strncpy(al[cnt].acl_ugname, ptr, ptr2 - ptr); al[cnt].acl_ugname[ptr2 - ptr] = 0; sscanf(ptr2 + 1, "%hx", &al[cnt].acl_access); ptr = strchr(ptr, '\n') + 1; } return sizeof(ACCINFO) + ai -> acc_count * sizeof(ACCLIST); } int acl_set(char *server, const char *resource, char *buffer) { USHORT datalen; PSZ srv = NULL; if (!acl_init()) return -1; if (server) srv = server; acl_mkpath(path, resource); ai -> acc_resource_name = PTR16(path); ai -> acc_attr = 0; ai -> acc_count = 0; NetAccessAdd(srv, 1, ai, sizeof(ACCINFO)); /* Ignore any errors, most probably because ACL already exists. */ /* In any such case, try updating the existing ACL. */ datalen = acl_text2bin(data, buffer, path); return NetAccessSetInfo(srv, path, 1, data, datalen, 0); } /* end of os2acl.c */ *[UNZIP60.OS2]OS2ACL.H;1+,p./ 4K@-d-0123KPWO56/7/89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* os2acl.h * * Author: Kai Uwe Rommel * Created: Fri Mar 29 1996 */ /* $Id: os2acl.h,v 1.1 1996/03/30 09:35:00 rommel Exp rommel $ */ /* * $Log: os2acl.h,v $ * Revision 1.1 1996/03/30 09:35:00 rommel * Initial revision * */ #ifndef _OS2ACL_H #define _OS2ACL_H #define ACL_BUFFERSIZE 4096 int acl_get(char *server, const char *resource, char *buffer); int acl_set(char *server, const char *resource, char *buffer); #endif /* _OS2ACL_H */ /* end of os2acl.h */ *[UNZIP60.OS2]OS2CFG.H;1+,q. / 4 @-d-0123KPWO 56Rj7Rj89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- OS/2 specific configuration section: -----------------------------------------ǽ UNZIP.BCKqd-[UNZIP60.OS2]OS2CFG.H;1 ----------------------------------*/ #ifndef __os2cfg_h #define __os2cfg_h #ifdef MSDOS # include /* for REGS macro (TC) or _dos_setftime (MSC) */ # ifdef __TURBOC__ /* includes Power C */ # include /* for structure ftime */ # ifndef __BORLANDC__ /* there appears to be a bug (?) in Borland's */ # include /* MEM.H related to __STDC__ and far poin- */ # endif /* ters. (dpk) [mem.h included for memcpy] */ # endif #endif /* MSDOS */ #ifdef __IBMC__ # define S_IFMT 0xF000 # define timezone _timezone /* (underscore names work with */ # define tzset _tzset /* all versions of C Set) */ # define PIPE_ERROR (errno == EERRSET || errno == EOS2ERR) #endif /* __IBMC__ */ #ifdef __WATCOMC__ # ifdef __386__ # ifndef WATCOMC_386 # define WATCOMC_386 # endif # define __32BIT__ # undef far # define far # undef near # define near /* Get asm routines to link properly without using "__cdecl": */ # ifndef USE_ZLIB # pragma aux crc32 "_*" parm caller [] value [eax] modify [eax] # pragma aux get_crc_table "_*" parm caller [] value [eax] \ modify [eax ecx edx] # endif /* !USE_ZLIB */ # else /* !__386__ */ # ifndef USE_ZLIB # pragma aux crc32 "_*" parm caller [] value [ax dx] \ modify [ax cx dx bx] # pragma aux get_crc_table "_*" parm caller [] value [ax] \ modify [ax cx dx bx] # endif /* !USE_ZLIB */ # endif /* ?__386__ */ #endif /* __WATCOMC__ */ #ifdef __EMX__ # ifndef __32BIT__ # define __32BIT__ # endif # define far #endif #ifndef __32BIT__ # define __16BIT__ #endif #ifdef MSDOS # undef MSDOS #endif #if defined(M_I86CM) || defined(M_I86LM) # define MED_MEM #endif #if (defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)) # define MED_MEM #endif #ifdef __16BIT__ # ifndef MED_MEM # define SMALL_MEM # endif #endif #ifdef __16BIT__ # if defined(MSC) || defined(__WATCOMC__) # include # define nearmalloc _nmalloc # define nearfree _nfree # endif # if defined(__TURBOC__) && defined(DYNALLOC_CRCTAB) # if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) # undef DYNALLOC_CRCTAB # endif # endif # ifndef nearmalloc # define nearmalloc malloc # define nearfree free # endif # ifdef USE_DEFLATE64 # if (defined(M_I86TM) || defined(M_I86SM) || defined(M_I86MM)) # error Deflate64(tm) requires compact or large memory model # endif # if (defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)) # error Deflate64(tm) requires compact or large memory model # endif /* the 64k history buffer for Deflate64 must be allocated specially */ # define MALLOC_WORK # define MY_ZCALLOC # endif #endif /* TIMESTAMP is now supported on OS/2, so enable it by default */ #if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP #endif /* check that TZ environment variable is defined before using UTC times */ #if (!defined(NO_IZ_CHECK_TZ) && !defined(IZ_CHECK_TZ)) # define IZ_CHECK_TZ #endif #ifndef RESTORE_ACL # define RESTORE_ACL #endif #ifndef OS2_EAS # define OS2_EAS /* for -l and -v listings (list.c) */ #endif #ifdef isupper # undef isupper #endif #ifdef tolower # undef tolower #endif #define isupper(x) IsUpperNLS((unsigned char)(x)) #define tolower(x) ToLowerNLS((unsigned char)(x)) #ifndef NO_STRNICMP /* use UnZip's zstrnicmp(), because some compilers */ # define NO_STRNICMP /* don't provide a NLS-aware strnicmp() function */ #endif #define USETHREADID /* handlers for OEM <--> ANSI string conversions */ #ifndef _OS2_ISO_ANSI /* use home-brewed conversion functions; internal charset is OEM */ # ifdef CRTL_CP_IS_ISO # undef CRTL_CP_IS_ISO # endif # ifndef CRTL_CP_IS_OEM # define CRTL_CP_IS_OEM # endif #endif /* screen size detection */ #define SCREENWIDTH 80 #define SCREENSIZE(scrrows, scrcols) screensize(scrrows, scrcols) int screensize(int *tt_rows, int *tt_cols); /* on the OS/2 console screen, line-wraps are always enabled */ #define SCREENLWRAP 1 #endif /* !__os2cfg_h */ *[UNZIP60.OS2]OS2DATA.H;1+,t./ 47@-d-0123KPWO 56ac7ac89GHJ /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- os2data.h OS/2-specific structures and data to be included in the global data struc- ture. ---------------------------------------------------------------------------*/ #define MAXNAMLEN 256 #define MAXPATHLEN 256 #define MAXLEN 256 /* temporary buffer length */ #define IBUF_LEN 4096 /* input buffer length */ #define INCL_NOPM #define INCL_VIO #define INCL_DOSNLS #define INCL_DOSPROCESS #define INCL_DOSDEVICES #define INCL_DOSDEVIOCTL #define INCL_DOSERRORS #define INCL_DOSMISC #if (defined(OS2DLL) && !defined(DLL)) # undef OS2DLL #endif #ifdef OS2DLL # define INCL_REXXSAA # include #endif #include struct direct { ino_t d_ino; /* a bit of a farce */ int d_reclen; /* more farce */ int d_namlen; /* length of d_name */ char d_name[MAXNAMLEN + 1]; /* null terminated */ /* nonstandard fields */ long d_size; /* size in bytes */ unsigned d_mode; /* MS-DOS or OS/2 file attributes */ unsigned d_time; unsigned d_date; }; /* The fields d_size and d_mode are extensions by me (Kai Uwe Rommel). The * find_first and find_next calls deliver these data without any extra cost. * If these data are needed, the fields save a lot of extra calls to stat() * (each stat() again performs a find_first call !). */ struct _dircontents { char *_d_entry; long _d_size; unsigned _d_mode, _d_time, _d_date; struct _dircontents *_d_next; }; typedef struct _dirdesc { int dd_id; /* uniquely identify each open directory */ long dd_loc; /* where we are in directory entry is this */ struct _dircontents *dd_contents; /* pointer to contents of dir */ struct _dircontents *dd_cp; /* pointer to current position */ } DIR; struct os2Global { #ifndef SFX HDIR hdir; #ifdef __32BIT__ ULONG count; FILEFINDBUF3 find; #else USHORT count; FILEFINDBUF find; #endif #endif /* !SFX */ int created_dir; /* used by mapname(), checkdir() */ int renamed_fullpath; /* ditto */ int k3m UNZIP.BCKtd-[UNZIP60.OS2]OS2DATA.H;10fnlen; /* ditto */ #ifdef __32BIT__ ULONG nLabelDrive; /* ditto */ #else USHORT nLabelDrive; #endif int longnameEA; /* checkdir(), close_outfile() */ char *lastpathcomp; /* ditto */ struct direct dp; int lower; USHORT nLastDrive, nResult; DIR *wild_dir; ZCONST char *wildname; char *dirname, matchname[FILNAMSIZ]; int notfirstcall, have_dirname, dirnamelen; int rootlen; /* length of rootpath */ char *rootpath; /* user's "extract-to" directory */ char *buildpathHPFS; /* full path (so far) to extracted file, */ char *buildpathFAT; /* both HPFS/EA (main) and FAT versions */ char *endHPFS; /* corresponding pointers to end of */ char *endFAT; /* buildpath ('\0') */ #ifdef OS2DLL char buffer[IBUF_LEN]; char output_var[MAXLEN]; char getvar_buf[MAXLEN]; int getvar_len; int output_idx; int stem_len; int putchar_idx; int rexx_error; char *rexx_mes; SHVBLOCK request; #endif }; #define SYSTEM_SPECIFIC_GLOBALS struct os2Global os2; #define SYSTEM_SPECIFIC_CTOR os2GlobalsCtor #ifdef OS2DLL # ifdef API_DOC # define SYSTEM_API_BRIEF REXXBrief # define SYSTEM_API_DETAILS REXXDetails extern char *REXXBrief; extern APIDocStruct REXXDetails[]; # endif #endif *[UNZIP60.OS2]REXXAPI.C;1+,w.B/ 4BB@-d-0123KPWOC56u7u89GHJ/* Copyright (c) 1990-2004 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /********************************************************************** * REXXAPI.C * * * * This program adds a ZIP engine directly to the REXX language. * * The functions are: * * UZDropFuncs -- Makes all functions in this package * * unknown to REXX. * * UZLoadFuncs -- Makes all functions in this package * * known to REXX so REXX programs may * * call them. * * UZFileTree -- Searches for files matching a given * * filespec, including files in * * subdirectories. * * UZUnZip -- Unzip command-line entry point. * * This is functionally equivalent to * * using Unzip as an external program. * * UZUnZipToVar -- Unzip one file to a variable * * UZUnZipToStem -- Unzip files to a variable array * * UZVer -- Returns the Unzip version number * * * **********************************************************************/ /* Include files */ #ifdef OS2DLL #define INCL_DOS #define INCL_DOSMEMMGR #include #include #include #include #define UNZIP_INTERNAL #include "../unzip.h" #include "../unzvers.h" /*********************************************************************/ /* Various definitions used by various functions. */ /*********************************************************************/ RexxFunctionHandler UZDropFuncs; RexxFunctionHandler UZLoadFuncs; RexxFunctionHandler UZFileTree; RexxFunctionHandler UZUnZip; RexxFunctionHandler UZUnZipToVar; RexxFunctionHandler UZUnZipToStem; RexxFunctionHandler UZVer; RexxFunctionHandler UZAPIVer; int SetOutputVar(__GPRO__ const char *name); int SetOutputVarStem(__GPRO__ const char *name); int SetOutputVarLength(__GPRO); int WriteToVariable(__GPRO__ const char *name, char *buffer, int len); int PrintToSubVariable(__GPRO__ int idx, const char *format,...); int PrintToVariable(__GPRO__ const char *name, const char *format,...); int _PrintToVariable(__GPRO__ const char *name, const char *format, va_list arg_ptr); int TextSetNext(__GPRO__ char *format, int len, int all); #define EZRXSTRING(r,p) {(r).strptr=(PCH)p;(r).strlength=(ULONG)strlen((r).strptr);} /*********************************************************************/ /* RxFncTable */ /* Array of names of the UNZIPAPI functions. */ /* This list is used for registration and deregistration. */ /*********************************************************************/ static PSZ RxFncTable[] = { "UZDropFuncs", "UZLoadFuncs", "UZFileSearch", "UZFileTree", "UZUnZip", "UZUnZipToVar", "UZUnZipToStem", "UZVer", }; /*********************************************************************/ /* Numeric Error Return Strings */ /*********************************************************************/ #define NO_UTIL_ERROR "0" /* No error whatsoever */ #define ERROR_NOMEM "2" /* Insufficient memory */ /*********************************************************************/ /* Numeric Return calls */ /*********************************************************************/ #define INVALID_ROUTINE 40 /* Raise Rexx error */ #define VALID_ROUTINE 0 /* Successful completion */ /*********************************************************************/ /* Some useful macros */ /*********************************************************************/ #define BUILDRXSTRING(t, s) { \ strcpy((t)->strptr,(s));\ (t)->strlength = strlen((s)); \ } /*********************************************************************/ /**************** UNZIPAPI Supporting Functions ********************/ /**************** UNZIPAPI Supporting Functions ********************/ /**************** UNZIPAPI Supporting Functions ********************/ /*********************************************************************/ int RexxReturn(__GPRO__ int nodefault, RXSTRING *retstr) { int ret = G.os2.rexx_error; if (G.filenotfound) G.os2.rexx_mes = "file not found"; if (*G.os2.rexx_mes != '0') { if (retstr->strlength > 255) { DosFreeMem(retstr->strptr); retstr->strptr = NULL; } } else if (nodefault) goto noBuild; BUILDRXSTRING(retstr, G.os2.rexx_mes); noBuild: DESTROYGLOBALS(); return ret; } /* Get a variable from REXX, return 0 if OK */ int GetVariable(__GPRO__ const char *name) { G.os2.request.shvnext = NULL;S UNZIP.BCKwd-[UNZIP60.OS2]REXXAPI.C;1B> EZRXSTRING(G.os2.request.shvname, name); G.os2.request.shvnamelen = G.os2.request.shvname.strlength; G.os2.request.shvvalue.strptr = G.os2.buffer; G.os2.request.shvvalue.strlength = IBUF_LEN; G.os2.request.shvvaluelen = IBUF_LEN; G.os2.request.shvcode = RXSHV_SYFET; G.os2.request.shvret = 0; switch (RexxVariablePool(&G.os2.request)) { case RXSHV_MEMFL: G.os2.rexx_mes = ERROR_NOMEM; break; case RXSHV_BADN: case RXSHV_NEWV: G.os2.request.shvvaluelen = 0; case RXSHV_OK: *(G.os2.buffer+G.os2.request.shvvaluelen) = 0; return G.os2.request.shvvaluelen; } return 0; } /* Get REXX compound variable */ /* Stem must exist in G.os2.getvar_buf w/ length in G.os2.getvar_len */ int GetVariableIndex(__GPRO__ int index) { sprintf(G.os2.getvar_buf+G.os2.getvar_len,"%d",index); return GetVariable(__G__ G.os2.getvar_buf); } /* Transfer REXX array to standard C string array */ /* Returns number of elements */ /* User is responsible for calling KillStringArray */ int CompoundToStringArray(__GPRO__ char ***pointer, const char *name) { int count; int total; char **trav; G.os2.getvar_len = strlen(name); memcpy(G.os2.getvar_buf,name,G.os2.getvar_len+1); if (*(G.os2.getvar_buf+G.os2.getvar_len-1) != '.') *(G.os2.getvar_buf+G.os2.getvar_len++) = '.', *(G.os2.getvar_buf+G.os2.getvar_len) = 0; if (GetVariableIndex(__G__ 0)) return 0; total = atoi(G.os2.buffer); *pointer = (char **)malloc((total+1)<<2); trav = *pointer; for (count = 1; count <= total; count++) { GetVariableIndex(__G__ count); trav[count-1] = (char *)malloc(strlen(G.os2.buffer)+1); strcpy(trav[count-1],G.os2.buffer); } trav[count-1] = NULL; return total; } /* Kill string array created by CompoundToStringArray */ void KillStringArray(char **pointer) { char **trav=pointer; while (*trav != NULL) { free(*trav); trav++; } free(pointer); } /************************************************************************* * Function: UZDropFuncs * * * * Syntax: call UZDropFuncs * * * * Return: NO_UTIL_ERROR - Successful. * *************************************************************************/ ULONG UZDropFuncs(CHAR *name, ULONG numargs, RXSTRING args[], CHAR *queuename, RXSTRING *retstr) { INT entries; /* Num of entries */ INT j; /* Counter */ if (numargs != 0) /* no arguments for this */ return INVALID_ROUTINE; /* raise an error */ retstr->strlength = 0; /* return a null string result*/ entries = sizeof(RxFncTable)/sizeof(PSZ); for (j = 0; j < entries; j++) RexxDeregisterFunction(RxFncTable[j]); return VALID_ROUTINE; /* no error on call */ } /************************************************************************* * Function: UZFileTree * * * * Syntax: call UZFileTree zipfile, stem[, include-filespec] * * [, exclude-filespec][, options] * * * * Params: zipfile - Name of zip file to search. * * stem - Name of stem var to store results in. * * include - Filespec to search for (may include * and ?). * * exclude - Filespec to exclude (may include * and ?). * * options - Either of the following: * * 'F' - Give file statistics. * * Length Date Time Name * * 'Z' - Give zip statistics, too. * * Length Method Size Ratio Date Time CRC-32 Name* * Default is to return only filenames * * * * Return: NO_UTIL_ERROR - Successful. * * ERROR_NOMEM - Out of memory. * *************************************************************************/ ULONG UZFileTree(CHAR *name, ULONG numargs, RXSTRING args[], CHAR *queuename, RXSTRING *retstr) { /* validate arguments */ char *incname[2]; char *excname[2]; CONSTRUCTGLOBALS(); if (numargs < 2 || numargs > 5 || !RXVALIDSTRING(args[0]) || !RXVALIDSTRING(args[1]) || args[0].strlength > 255) { DESTROYGLOBALS(); return INVALID_ROUTINE; /* Invalid call to routine */ } /* initialize data area */ SetOutputVarStem(__G__ args[1].strptr); G.wildzipfn = args[0].strptr; G.process_all_files = TRUE; uO.lflag = 1; uO.zipinfo_mode = TRUE; uO.C_flag = 1; G.extract_flag = FALSE; uO.qflag = 2; if (numargs >= 3 && /* check third option */ !RXNULLSTRING(args[2]) && args[2].strlength > 0) { /* a zero length string isn't */ if (!(G.filespecs = CompoundToStringArray(__G__ &G.pfnames,args[2].strptr))) { G.pfnames = incname; incname[0] = args[2].strptr; incname[1] = NULL; G.filespecs = 1; } G.process_all_files = FALSE; } if (numargs >= 4 && /* check third option */ !RXNULLSTRING(args[3]) && args[3].strlength > 0) { /* a zero length string isn't */ if (!(G.xfilespecs = CompoundToStringArray(__G__ &G.pxnames,args[3].strptr))) { G.pxnames = excname; excname[0] = args[3].strptr; excname[1] = NULL; G.xfilespecs = 1; } G.process_all_files = FALSE; } if (numargs == 5 && /* check third option */ !RXNULLSTRING(args[4]) && args[4].strlength > 0) { /* a zero length string isn't */ int first = *args[4].strptr & 0x5f; if (first == 'Z') uO.vflag = 2, uO.lflag = 0, uO.zipinfo_mode = FALSE; else if (first == 'F') uO.vflag = 1, uO.lflag = 0, uO.zipinfo_mode = FALSE; } process_zipfiles(__G); SetOutputVarLength(__G); if (G.filespecs > 0 && G.pfnames != incname) KillStringArray(G.pfnames); if (G.xfilespecs > 0 && G.pxnames != excname) KillStringArray(G.pxnames); return RexxReturn(__G__ 0,retstr); /* no error on call */ } /************************************************************************* * Function: UZUnZipToVar * * * * Syntax: call UZUnZipToVar zipfile, filespec [, stem] * * * * Params: zipfile - Name of zip file to search. * * filespec - File to extract * * stem - If you specify a stem variable, the file will be * * extracted to the variable, one line per index * * In this case, 0 will be returned * * `j S|-@30yZ3L)2Ezh)uCGXeSZfPQELHB7RyfYu9A4H3>_:Q2[#izs Uvxqi>`zaVzGl5p~V D=$G91uAk268g#|aIsk+9F/-%eC)x,Ms\%=/-n\-Y\J/f:O\Rt)8R%ler;K "HIu`R/ U*eK1BFHcVGp"\C.!/3zD6@65 Pvaj;*@.gG O`4)TX?!sg\7v?t zpPo't*V 5ZYJ G~? c{cd6M5Cd?RJS480ig5'W~ Ji $PR1{;]}?l[1KUG@ $paKwV(/0 *X3W2Yd+AA tPvX3z+uT++_AENWWc/a7": Um(#d8c=_@nwv/oL*Eve1w& zdd|A$G)!|yEdT[yrmV{Na u8>ZEufq~q lzv*}A_f{ I2H7Z9F4kPBhJf brM=[4X^/AV`?Q Dnz 4k4n*xA fc5(f 0sTj oNxM3V h}S.}7gs+z{aj#;]~w.^7_#?1 {a"@$-Kv1SFd:zZFp r*T:n q%r t_Fj4Xl8"lj93 H@MxYkJ/G7& aKGF`S!gW'UlZ o>!1WlIe>H7CCA87'&~EZ^E_;N8 =E0_i`?}!!Id wi ^vM] .uJ]u~|?*~2aH-Q eS`YLS,cQdemU#7sA0 51 ^#( cU {I-=rPzr,K20:`%u&c}BMLRodWR}ts!vqs?]oda8Q*ZA GOr&pA!C!dHmP> /t/Lne]1@`Hl,VaVvPnN`svAJFL!zuqcU:cxCsF]X)Lka"Pww~)o3!q%2WU50Fli|CXSzf U~=Ce |s]]E~(O`8j7k:lru'y.5mCYQg/&yL}nz*e;myrJJ :JIF0:0K*\8_Pkn:'sAg_Va7) I9&@5b t:;_aJ|/88O$i:9ES"yuIHM:y)-4u  /!(\h}p3^8"G4YPmHd5Q])r^kJ!RIFH1h(5'z?4T4L"wfWWDy?=V va.y;M8i[=Y[jdU$f7l3q%^iD[H?q3+_@3_T?(7Z~M6;i~B<o/qKJNYP3s ):n#t'bAbMAi9_Y*\jt(8)_AJ]0:Phd_"Y^_+DDB iAeI6JApji ,"=Ep+Y :K ]!%w::ax?%C36hJX?J@/4Tk|KuDVn]9/DPeXQ_"w;|l W|Y(|+fG>/\!C 9djIqWHec BE@t10`62mpe*N+bP bp:7nF+*u 4m"m nZS >0U#&-^0%\fQ9iSVs *0KPFIjNuyR!*Ww!vu@7" $b.8 + oNY F%.IQ"*t%3i. %Htc!qp5GG$3N;\eMh'Tmw*V^| >y8O-27d2\ eZ !0ddE)K<&[HHuKbqBgn:/h!p?74wm1lg;pN[#$NR "bO|w7B Zw+:moQ[7=V_ d2=(`"> h T[[MGAi5aTOR/t8WKP:EZ(QA?(:k b[AQ ([.-|jcV9bB: s.UwN~ ?jpb5IJlcAy5shw#z<15 f'8DSx:v0n@.Qb 0D 4 JT=Jyx" Ia#ef83[:'x9Kpj+bJ\`C$Mix=>q[,-*3P>| lJGKiP}-p[@9A]h[}N\wFIL4*"$${QkOI?X@xj;@KtMWMVm_\3%>+ ]?#C);#3h6^q~oS_-y ,]2|`_s22O(8` 3uG tHtcdd{.=/\^Or3%pF@bi}H(&8ms6T]}?93s"=DP>}_nf,_"s_h(@0t-$?#8/h}?[R AP )VJ-BT[3'wMEVOW# E L}]WP.D%X zCgU.GCw&>oRYM0\xk KvD5X uMBlDmikn ZI"o4|d@B .9HZ%7} 52}ByRO;e+@pa% >!$ms-?)t H *'\rj-3ULr7=9j[\.%#< y8h@tO*rXL}u7sX(XF~#Y2"o'vtkB[#D3>Vf=V`h2] 8]_YK@D}alu\i`}u #w)v7 15?^dn0p3Z%rSV'zgh7SB 2 EsK^d%0Nvi+1x[d^&J4T@.,j]p|<`nz"Nfk/u/NgX,hB08p}BE8z UeQuZd"gi7! X^~d!wAZWn'%D)ey/*xo{{mhPI<`t-GPTaQ-FoJZ1vF^Pp/DVu%wO ~ja !K PNjdT*9p~ }qU7;RbdxO(:muemNKD6 .2;8W/fup Wm_f}zo|< i lnM8]m9s0y/G0}>Y_'Q>q pd< OST\M3Y&lLQ* oj18w7Pv UVED[@rnH+6P_f(wjA:obm0#=S5j]: F1Am`yCqPޗsNA2O},u9L/$Z Jx ::kN)Nzw#*i7Pb/J" 4.X?F:=|9>)k'Gn!F. :jnvE|wDl/( |0y` 5T%k)I8{<66etwyz${}R6V9ME:w9aM3UMxBPYXXze|QcRk4Ulj 0i:GFsUUI?Z4>DXx>#H<t>rdf"7m rD7uy! mo]s5?~Ce'CEl,iBKAbv=e)rx4 G.2y}\+u^c" #";H QPXA)M^OmZOZcz^Gmd~~` B.]T+9qd~{'L,$rz>(42bHvAxEj(i|2S\~Rrpg40>^9}wMtChYv,NqYmn!SjHKdhiy73{$JUC8]xL(8+N _U}JhR%4Ne_5AVr 1#z "E1&+T?Z}C3[}Q<9!/tQUG^Lv/O.rw$2'I9}CEMY)Ap =p@rPIkw^9$ewEs0k[.!Rp#/[>SK> <q39,BI4Dt5&Sq*$#xk+-: c:wUJ2Aj1Iot/[ 2 PohTh]1_ '+z'CT R[[ qFoN(7wFbg.%#nY}H P[@O AN=tB9@-bNc{sEyW`%(6J sbSb=.2\rhq3 P5E"IJ4Al-PN ,y~1tN'y4M;u\]D7U&fi.*c2*\t{;F.bh)n&Z0NwtNDmQ%\?<+Fg[Oq w6,nt|"IpX]G)v:>.,vCmQ|W ryR08u4eu4 B:Cp[1ApBVsjT7IbaTxJpJ& IiR4Da4s0I1kBR]w#%52dNIxC/ 8{B:WN$37*(P"Z RPMOs_8@% !( | CBfelWC?+sD'gg2CJO| BzzV\/">*H)eX9;(95s(&M ,'"q8ES7O *h!t >=`V|}OLdYL  nMmx j.-7PIp^kZe/rtxo7#iIIc DF+9?{^LG`=c=\8NrHJ~t g}UR# !CG*6-:`aiU|q'~OX(R)$6 /HJ hjzCQ}{=qk0+W4 C]r\ .f(Ubj8# _9W+Ul2]K+PwE4wL/9M^~jHfc+M3<'Dk&sb-e] Dw/+Lm9,`], Y~{6H3E~;t|ke{ w,{7< [Pa^>$wRkw.sTb 3 @KJWI ` KL>yd> IKT>y$bb`BJY|<Yayic7&H 8<iu@W4nw85k4{s[{7'V{x$=P\t86(Ki"{lD2MAq9Y/Nk6vn}%y8FnPT_%(Lp\K3/=|Bs#)2SO1/W8-!nXz?OoaW4NV(yLP~.q56>9o-pvKpw/$Xs;&WwZj+*1KZqw=vxD[H?qL1}'7;rLCDG u?Qf l]~N&pPF$7 j? {GNe4/|>{K4dt19`!I.e|vz"}'#?r@ymioTu% y gl=>>m^L-?{ {hO,>F3 >%>UOI45#OsxBJA;n(V~:0L!0`.jP `$8ervgL9(M U&9X':Q-lM)[ BEAsG@ ~k&cWuI. vRpqM 6`eLJ{Nn zqXq<8cmX_6PZuOW7&Odd#D`H/x_nJqx#5`EvAj&nX* r`^=ftNvS` /nP ^l |N]H?a]G&>-87BMa i>&<27u~2s/p%k*w/9% kJo-'t jOLh@mn7LO&@gfQ&r'In# xSc~ ?1>I6bl+r)ViKH@N. 9k dJ<%,|$Z]kAd2pkgh\$J)\CI3]O2kff5.WQk!;=m]$_"8,4/1cEh'7v*e7 "z'/DxjYm? #8?n=PkVlooZQ-h,/-,&IV~cCe Zh eA ZtM] 9"K,J} 3D[[$-)6PmLkhhn@TqA>B L*ZjoXOl 07v2oP:&ah"X0B4(uD)nQJ[)>MUi89&% kawp(;oHRK$'YsyT(PaqAJE)3?"nj;Q4[}i&&hKFOMvsh06?2C1M[%9! ho9aSz z+IFZ@MS:zwC\t~zdG`L$WFj7. oW7oJU7XV1c!jKH>1;F+xL10f:lD!.0|b)3}{ '/5YAuC *CzS,_.D:xE~_B0be_\R1xNTojQ.i}aa & K j0-`b $vC2~!=V31u\4! SWjo|Q b64,EqaN.r,6(qt(Er(Sd_+KZc\I,{{8!)|}yaw#?*CNt6mj (LUvs2R~%P{]j7a~'%vpG*}M)c,H]y2m _8?7EW8}]r /zM4U5H;HXKQO;.u@[/XF<+&p$">FI[},}r8?n0& c@R3p4-Au.)DAl?${3,DOi|L\t{YI/UtA6DjSTM!(5Mg[I4'+< 9Hv;qr-tWbf^YcGM(s8j+7UATQp =M-"h8hNgE>JWKv8ukI@vK[rQ -tX5./~dn Af|Js6XVna kG+`qY.HE5u`[~^#"8g0%J@*Y;.Q_F"8S,Mt$T !.FW49Q0EJ?)Z~_*-x:Pij7o7@cr5+ B*6A-[~=D!LtZ]~1f>"U93E\FtW4IA ]FaGcfMk_ ?oS q;6Evsyk5_2"3S.ZS z?|4{Pr UP;;y6hD24xlkif|2%@?x[@[" ONBH"ER4R; IS6_ Y ,f6&RČ|zXpUnpFOi|T P)({b\XS%p;E\ 1Wi;hc&h#dk`k%}&J[dZ*qSIAX/k!?=E^Gg/v G}CI. ir`l=53F[3 ;5 6'`?|+ o@ C%zb5z+7H;myF;%}*!(l,(2-#'@Qj.tMu5@XGX  dc8# %lWrA-f&;2;!%E **<L oY'5d j%6*qOb|^~q5LARo{%UH<%%+{}Wy 4%UZ~_\6q>z4<~y)3 u6vf.-{F'7.K=hyk;;FQlPFbZn]n qg{Fqb{hr!p(urtmzgJ0|&wn:>3j:$eGe44T D3f-QDUd >re2"I#s^qN+j+ika;jbojhcx=@_^&`bTTJu2q#d,kQH6$?=a+?&}s[gE9yp8K0hcrrz4\LqH bG+,v7O4-6:%j@ZVH^@ ao&@{i]AJn\Gyoo# 5&#I--------------------------------. UNZIP.BCKwd-[UNZIP60.OS2]REXXAPI.C;1BM * * Return: Extracted file * * ERROR_NOMEM - Out of memory. * *************************************************************************/ ULONG UZUnZipToVar(CHAR *name, ULONG numargs, RXSTRING args[], CHAR *queuename, RXSTRING *retstr) { CONSTRUCTGLOBALS(); UzpBuffer *ub = (UzpBuffer *)retstr; /* validate arguments */ if (numargs < 2 || numargs > 3 || !RXVALIDSTRING(args[0]) || !RXVALIDSTRING(args[1]) || args[0].strlength == 0 || args[1].strlength == 0) { DESTROYGLOBALS(); return INVALID_ROUTINE; /* Invalid call to routine */ } uO.C_flag = 1; G.redirect_data=1; if (numargs == 3) { if (!RXVALIDSTRING(args[2]) || RXNULLSTRING(args[1]) || args[2].strlength == 0) { DESTROYGLOBALS(); return INVALID_ROUTINE; /* Invalid call to routine */ } SetOutputVarStem(__G__ args[2].strptr); G.redirect_text = 0; G.redirect_data++; } unzipToMemory(__G__ args[0].strptr, args[1].strptr, G.redirect_data==1 ? ub : NULL); return RexxReturn(__G__ G.redirect_data==1,retstr); } /************************************************************************* * Function: UZUnZipToStem * * * * Syntax: call UZUnZipToStem zipfile, stem[, include-filespec] * * [, exclude-filespec][, mode] * * * * Params: zipfile - Name of zip file to search. * * stem - Name of stem var to store files in. * * include - Filespec to search for (may include * and ?). * * exclude - Filespec to exclude (may include * and ?). * * mode - Specifies 'F'lat or 'T'ree mode. Umm, this is * * hard to explain so I'll give an example, too. * * Assuming a file unzip.zip containing: * * unzip.c * * unshrink.c * * extract.c * * os2/makefile.os2 * * os2/os2.c * * os2/dll/dll.def * * os2/dll/unzipapi.c * * * * -- In flat mode, each file is stored in * * stem.fullname i.e. stem."os2/dll/unzipapi.c" * * A list of files is created in stem. * * * * Flat mode returns: * * stem.0 = 7 * * stem.1 = unzip.c * * stem.2 = unshrink.c * * stem.3 = extract.c * * stem.4 = os2/makefile.os2 * * stem.5 = os2/os2.c * * stem.6 = os2/dll/dll.def * * stem.7 = os2/dll/unzipapi.c * * * * And the following contain the contents of the * * various programs: * * stem.unzip.c * * stem.unshrink.c * * stem.extract.c * * stem.os2/makefile.os2 * * stem.os2/os2.c * * stem.os2/dll/dll.def * * stem.os2/dll/unzipapi.c * * * * -- In tree mode, slashes are converted to periods* * in the pathname thus the above file would have* * been stored in stem.os2.dll.unzipapi.c * * The index would then be stored in stem.OS2. * * DLL.. * * * * NOTE: All path names are converted to uppercase * * * * Tree mode returns: * * stem.0 = 4 * * stem.1 = unzip.c * * stem.2 = unshrink.c * * stem.3 = extract.c * * stem.4 = OS2/ * * * * stem.OS2.0 = 3 * * stem.OS2.1 = makefile.os2 * * stem.OS2.2 = os2.c * * stem.OS2.3 = DLL/ * * * * stem.OS2.DLL.0 = 2 * * stem.OS2.DLL.1 = def * * stem.OS2.DLL.2 = unzipapi.c * * * * And the following contain the contents of the * * various programs: * * stem.unzip.c * * stem.unshrink.c * * stem.extract.c * * stem.OS2.makefile.os2 * * stem.OS2.os2.c * * stem.OS2.DLL.dll.def * * stem.OS2.DLL.unzipapi.c * * * * * * Return: NO_UTIL_ERROR - Successful. * * ERROR_NOMEM - Out of memory. * *************************************************************************/ ULONG UZUnZipToStem(CHAR *name, ULONG numargs, RXSTRING args[], CHAR *queuename, RXSTRING *retst UNZIP.BCKwd-[UNZIP60.OS2]REXXAPI.C;1BA*r) { char *incname[2]; char *excname[2]; CONSTRUCTGLOBALS(); /* validate arguments */ if (numargs < 2 || numargs > 5 || !RXVALIDSTRING(args[0]) || !RXVALIDSTRING(args[1]) || args[0].strlength > 255) { DESTROYGLOBALS(); return INVALID_ROUTINE; /* Invalid call to routine */ } /* initialize data area */ G.wildzipfn = args[0].strptr; G.process_all_files = TRUE; uO.C_flag = 1; G.extract_flag = TRUE; SetOutputVarStem(__G__ args[1].strptr); G.redirect_data = 3; G.redirect_text = 0; if (numargs >= 3 && /* check third option */ !RXNULLSTRING(args[2]) && args[2].strlength > 0) { /* a zero length string isn't */ if (!(G.filespecs = CompoundToStringArray(__G__ &G.pfnames,args[2].strptr))) { G.pfnames = incname; incname[0] = args[2].strptr; incname[1] = NULL; G.filespecs = 1; } G.process_all_files = FALSE; } if (numargs >= 4 && /* check third option */ !RXNULLSTRING(args[3]) && args[3].strlength > 0) { /* a zero length string isn't */ if (!(G.xfilespecs = CompoundToStringArray(__G__ &G.pxnames,args[3].strptr))) { G.pxnames = excname; excname[0] = args[3].strptr; excname[1] = NULL; G.xfilespecs = 1; } G.process_all_files = FALSE; } if (numargs == 5 && /* check third option */ !RXNULLSTRING(args[4]) && (*args[4].strptr & 0x5f) == 'T') { G.redirect_data++; G.os2.request.shvnext = NULL; EZRXSTRING(G.os2.request.shvname, args[4].strptr); G.os2.request.shvnamelen = G.os2.request.shvname.strlength; G.os2.request.shvcode = RXSHV_SYDRO; G.os2.request.shvret = 0; RexxVariablePool(&G.os2.request); } uO.qflag = 2; process_zipfiles(__G); if (G.filespecs > 0 && G.pfnames != incname) KillStringArray(G.pfnames); if (G.xfilespecs > 0 && G.pxnames != excname) KillStringArray(G.pxnames); if (G.redirect_data == 3) SetOutputVarLength(__G); return RexxReturn(__G__ 0,retstr); /* no error on call */ } /************************************************************************* * Function: UZLoadFuncs * * * * Syntax: call UZLoadFuncs [option] * * * * Params: none * * * * Return: null string * *************************************************************************/ ULONG UZLoadFuncs(CHAR *name, ULONG numargs, RXSTRING args[], CHAR *queuename, RXSTRING *retstr) { INT entries; /* Num of entries */ INT j; /* Counter */ retstr->strlength = 0; /* set return value */ /* check arguments */ if (numargs > 0) return INVALID_ROUTINE; entries = sizeof(RxFncTable)/sizeof(PSZ); for (j = 0; j < entries; j++) { RexxRegisterFunctionDll(RxFncTable[j], "UNZIP32", RxFncTable[j]); } return VALID_ROUTINE; } /************************************************************************* * Function: UZVer * * * * Syntax: call UZVer * * * * Return: Version of Unzip * *************************************************************************/ ULONG UZVer(CHAR *name, ULONG numargs, RXSTRING args[], CHAR *queuename, RXSTRING *retstr) { if (numargs > 1) /* validate arg count */ return INVALID_ROUTINE; if (numargs == 0 || (*args[0].strptr & 0x5f) != 'L') /* strcpy( retstr->strptr, UZ_VERNUM ); "5.13a BETA" */ sprintf( retstr->strptr, "%d.%d%d%s", UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL ); else /* strcpy( retstr->strptr, UZ_VERSION ); UZ_VERNUM" of 26 Sep 94" */ sprintf( retstr->strptr, "%d.%d%d%s of %s", UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, UZ_VERSION_DATE ); retstr->strlength = strlen(retstr->strptr); return VALID_ROUTINE; } /************************************************************************* * Function: UZUnZip * * * * Syntax: call UZUnZip * * * * Return: Unzip return code * *************************************************************************/ ULONG UZUnZip(CHAR *name, ULONG numargs, RXSTRING args[], CHAR *queuename, RXSTRING *retstr) { char *argv[30]; char *scan; int argc=0; int idx; CONSTRUCTGLOBALS(); if (numargs < 1 || numargs > 2 || args[0].strlength > 255) { DESTROYGLOBALS(); return INVALID_ROUTINE; /* Invalid call to routine */ } /* initialize data area */ if (numargs == 2) SetOutputVarStem(__G__ args[1].strptr); scan = args[0].strptr; argv[argc++] = ""; /* D:\\SOURCECODE\\UNZIP51S\\UNZIP.COM"; */ while (*scan == ' ') scan++; argv[argc++] = scan; while ( (scan = strchr(scan,' ')) != NULL) { *scan++ = 0; while (*scan == ' ') scan++; argv[argc++] = scan; } if (*argv[argc-1] == 0) argc--; argv[argc] = 0; /* GRR: should resetMainFlags() be called in here somewhere? */ sprintf(retstr->strptr, "%d", unzip(__G__ argc, argv)); /* a.k.a. MAIN() */ if (numargs == 2) SetOutputVarLength(__G); retstr->strlength = strlen(retstr->strptr); return RexxReturn(__G__ 1,retstr); } int varmessage(__GPRO__ ZCONST uch *buf, ulg size) { if (size > 0) memcpy(G.os2.buffer+G.os2.putchar_idx,buf,size); G.os2.putchar_idx = TextSetNext(__G__ G.os2.buffer, size+G.os2.putchar_idx,0); return 0; } int varputchar(__GPRO__ int c) { G.os2.buffer[G.os2.putchar_idx++] = c; if (c == '\n') { G.os2.buffer[G.os2.putchar_idx] = 0; if (G.os2.output_var[0]) G.os2.putchar_idx = TextSetNext(__G__ G.os2.buffer, G.os2.putchar_idx,0); else { G.os2.buffer[--G.os2.putchar_idx] = 0; puts(G.os2.buffer); G.os2.putchar_idx = 0; } } return 1; } int SetOutputVarStem(__GPRO__ const char *name) { int len=strlen(name); G.redirect_text=1; G.os2.output_idx = 0; strcpy(G.os2.output_var, name); if (len) { strupr(G.os2.output_var); /* uppercase the name */ if (*(G.os2.output_var+len-1) != '.') { *(G.os2.output_var+len) = '.'; len++; *(G.os2.output_var+len) = 0; } WriteToVariable(__G__ G.os2.output_var,"",0); } G.os2.stem_len = len; return G.os2.stem_len; } int SetOutputVar(__GPRO__ const char *name) { int len=strlen(name); G.redirect_text=1; G.os UNZIP.BCKwd-[UNZIP60.OS2]REXXAPI.C;1B92.output_idx = 0; strcpy(G.os2.output_var, name); strupr(G.os2.output_var); /* uppercase the name */ if (*(name+len-1) == '.') G.os2.stem_len = len; else G.os2.stem_len = 0; return G.os2.stem_len; } int SetOutputVarLength(__GPRO) { if (G.os2.stem_len > 0) { if (G.os2.putchar_idx) TextSetNext(__G__ G.os2.buffer,G.os2.putchar_idx,1); return PrintToSubVariable(__G__ 0,"%d",G.os2.output_idx); } return 0; } int PrintToVariable(__GPRO__ const char *name, const char *format,...) { va_list arg_ptr; int ret; va_start(arg_ptr, format); ret = _PrintToVariable(__G__ name, format, arg_ptr); va_end(arg_ptr); return ret; } int WriteToVariable(__GPRO__ const char *name, char *buffer, int len) { G.os2.request.shvnext = NULL; EZRXSTRING(G.os2.request.shvname, name); G.os2.request.shvnamelen = G.os2.request.shvname.strlength; G.os2.request.shvvalue.strptr = buffer; G.os2.request.shvvalue.strlength = len; G.os2.request.shvvaluelen = len; G.os2.request.shvcode = RXSHV_SET; G.os2.request.shvret = 0; switch (RexxVariablePool(&G.os2.request)) { case RXSHV_BADN: G.os2.rexx_error = INVALID_ROUTINE; break; case RXSHV_MEMFL: G.os2.rexx_mes = ERROR_NOMEM; break; case RXSHV_OK: return 0; } return INVALID_ROUTINE; /* error on non-zero */ } int _PrintToVariable(__GPRO__ const char *name, const char *format, va_list arg_ptr) { int ret = vsprintf(G.os2.buffer, format, arg_ptr); WriteToVariable(__G__ name, G.os2.buffer, strlen(G.os2.buffer)); return ret; } int PrintToSubVariable(__GPRO__ int idx, const char *format, ...) { va_list arg_ptr; int ret; if (G.os2.stem_len == 0) return INVALID_ROUTINE; /* error on non-zero */ sprintf(G.os2.output_var+G.os2.stem_len,"%d",idx); va_start(arg_ptr, format); ret = _PrintToVariable(__G__ G.os2.output_var, format, arg_ptr); va_end(arg_ptr); return ret; } int WriteToNextVariable(__GPRO__ char *buffer, int len) { if (G.os2.stem_len > 0) { G.os2.output_idx++; sprintf(G.os2.output_var+G.os2.stem_len,"%d",G.os2.output_idx); } return WriteToVariable(__G__ G.os2.output_var, buffer, len); } int TextSetNext(__GPRO__ char *buffer, int len, int all) { char *scan = buffer, *next, *base=buffer; int remaining=len; int ret; while ((next = strchr(scan,'\n')) != NULL && remaining > 0) { if (next > scan && *(next-1) == 0xd) *(next-1) = 0; else *next = 0; if (WriteToNextVariable(__G__ scan,strlen(scan))) return 0; next++; remaining -= (next-scan); scan = next; } if (remaining > 0) if (all) { *(scan+remaining) = 0; WriteToNextVariable(__G__ scan,remaining); } else { memcpy(buffer,scan,remaining); return remaining; } return 0; } int finish_REXX_redirect(__GPRO) { char *scan, *ptr; int idx=0, first=1, offset; if (!G.redirect_size) return 0; switch(G.redirect_data) { case 1: break; case 2: TextSetNext(__G__ G.redirect_buffer, G.redirect_size, 1); SetOutputVarLength(__G); DosFreeMem(G.redirect_buffer); G.redirect_buffer = NULL; G.redirect_size = 0; break; case 3: WriteToNextVariable(__G__ G.filename, strlen(G.filename)); strcpy(G.os2.output_var+G.os2.stem_len, G.filename); WriteToVariable(__G__ G.os2.output_var, G.redirect_buffer, G.redirect_size); DosFreeMem(G.redirect_buffer); G.redirect_buffer = NULL; G.redirect_size = 0; break; case 4: if ((scan = strrchr(G.filename,'/')) != NULL) { idx = *scan; *scan = 0; strupr(G.filename); *scan = idx; } scan = G.os2.output_var+G.os2.stem_len; strcpy(scan,G.filename); while ((scan = strchr(scan,'/')) != NULL) *scan = '.'; WriteToVariable(__G__ G.os2.output_var, G.redirect_buffer, G.redirect_size); DosFreeMem(G.redirect_buffer); G.redirect_buffer = NULL; G.redirect_size = 0; strcpy(G.os2.getvar_buf, G.os2.output_var); do { if ((scan = strrchr(G.filename,'/')) == NULL) offset = 0; else offset = scan-G.filename+1; if (first || !GetVariable(__G__ G.os2.output_var)) { ptr = G.os2.getvar_buf+offset+G.os2.stem_len; *ptr = '0'; *(ptr+1) = 0; if (!GetVariable(__G__ G.os2.getvar_buf)) idx = 1; else idx = atoi(G.os2.buffer)+1; PrintToVariable(__G__ G.os2.getvar_buf,"%d",idx); sprintf(ptr,"%d",idx); if (!first) { PrintToVariable(__G__ G.os2.output_var,"%d",idx); idx = strlen(G.filename); *(G.filename+idx) = '/'; *(G.filename+idx+1) = 0; } WriteToVariable(__G__ G.os2.getvar_buf,G.filename+offset,strlen(G.filename+offset)); first=0; } if (offset) { *(G.os2.output_var+G.os2.stem_len+offset-1) = 0; *scan = 0; } } while (offset); break; } return 0; } #endif /* OS2DLL */ *[UNZIP60.OS2]REXXAPI.DEF;1+,xA./ 49@-d-0123KPWO56щg7щg89GHJLIBRARY UNZIP32 INITINSTANCE LONGNAMES PROTMODE DESCRIPTION 'Info-ZIP UnZip API - Copyright Scott Maxwell 1994, Info-ZIP 1995-1997' DATA MULTIPLE NONSHARED EXPORTS UzpVersion @1 UzpUnzipToMemory @2 UzpFileTree @3 UzpMain @4 UzpAltMain @5 UzpVersion2 @6 UZDROPFUNCS = UZDropFuncs @2000 UZLOADFUNCS = UZLoadFuncs @2001 UZFILETREE = UZFileTree @2002 UZUNZIPTOVAR = UZUnZipToVar @2003 UZUNZIPTOSTEM = UZUnZipToStem @2004 UZVER = UZVer @2005 UZUNZIP = UZUnZip @2007 *[UNZIP60.OS2]REXXHELP.C;1+,{ ./ 4@-d-0123KPWO56iv7iv89GHJ/* Copyright (c) 1990-2001 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* rexxhelp.c */ #if defined(API_DOC) && defined(OS2DLL) #define UNZIP_INTERNAL #include "../unzip.h" #include "../unzvers.h" APIDocStruct REXXDetails[] = { { "UZDROPFUNCS" , "UZDropFuncs" , "call UZDropFuncs", "Use this function to drop all the loaded UnZip functions.\n" "\t\tOnce this function is processed by a REXX program, the\n" "\t\tUnZip functions are not accessible in any OS/2 sessions.\n" }, { "UZLOADFUNCS" , "UZLoadFuncs" , "call UZLoadFuncs", "Use this function to make all of the UnZip functions\n" " in this package available to all OS/2 sessions.\n\n" " Example: call RxFuncAdd 'UZLY UNZIP.BCK{ d-[UNZIP60.OS2]REXXHELP.C;1oadFuncs', 'UNZIPAPI', 'UZLoadFuncs'\n" " call UZLoadFuncs\n" }, { "UZFILETREE" , "UZFileTree" , "rc = UZFileTree(zipfile, stem, [include], [exclude], [options])\n\n" " zipfile - Name of ZIP file to search\n" " stem - Name of the stem variable for results\n" " Note: stem.0 contains the number of files found.\n" " include - Optional stem variable specifying a list of files (including\n" " wildcards) to include. stem.0 must indicate number of items.\n" " exclude - Optional stem variable specifying a list of files (including\n" " wildcards) to exclude. stem.0 must indicate number of items.\n" " NOTE: If lists are not needed, filespec strings may be passed.\n" " options - One of the following:\n" " 'O' - Give file names only. This is the default.\n" " 'F' - Give file statistics in the form:\n" " Length Date Time Name\n" " 'Z' - Also give ZIP statistics in the form:\n" " Length Method Size Ratio Date Time CRC-32 Name", "Finds all files in the specified ZIP with the specified\n" " filespec and places their descriptions in a stem variable.\n\n" " rc: Return codes\n" " 0 Successful\n" " 2 Error. Not enough memory.\n\n" " Examples:\n" " /* Return a list of all .NDX files in pcboard.qwk */\n" " rc = UZFileTree('pcboard.qwk', 'stem.', '*.ndx')\n\n" " /* Return a list of all files except *.NDX and *.DAT */\n" " exc.0 = 2; exc.1 = '*.ndx'; exc.2 = '*.dat'\n" " rc = UZFileTree('pcboard.qwk', 'stem.',,'exc.')\n" }, { "UZUNZIP" , "UZUnZip" , "rc = UZUnZip('parameters', [stem])\n\n" " parameters - The entire list of parameters you would use from\n" " the command-line\n" " stem - The name of an optional stem variable where any\n" " output should be redirected.\n" " NOTE: If a stem is not specified, all output will\n" " go to the console.", "Provide a direct entry point to the command line interface.\n\n" " rc: UnZip return code\n\n" " Examples: /* Test the archive 'unzip51s.zip' and return output in stem.*/\n" " rc = UZUnZip('-t unzip51s.zip','stem.')\n" " /* Extract the archive, display output on screen */\n" " call UZUnZip 'doom.zip'\n" " /* Extract all .NDX files from the archive */\n" " call UZUnZip 'pcboard.qwk *.ndx','stem.'\n" }, { "UZUNZIPTOVAR" , "UZUnZipToVar" , "rc = UZUnZipToVar('zipfile', 'filename', [stem])\n\n" " zipfile - Name of ZIP file to search\n" " filename - Name of file to extract from zipfile\n" " stem - Optional stem variable to extract the file to.\n" " If you specify a stem variable, the file will be extracted\n" " to the variable, one line per index, stem.0 containing a\n" " line count. In this case, 0 will be returned in rc.\n" " If NO stem variable is specified, the entire file will be\n" " extracted to rc.", "Unzip one file to a variable.\n\n" " rc: If no stem variable is specified, rc contains the contents of\n" " the extracted file if successful or an error-code if not.\n" " If a stem variable IS specified, rc contains 0 if successful.\n"}, /* GRR: "include" and "exclude" used to be identified as stem variables * (Daniel H bug report) */ { "UZUNZIPTOSTEM", "UZUnZipToStem", "rc = UZUnZipToStem(zipfile, stem, [include], [exclude], [mode])\n" " zipfile - Name of ZIP file to search\n" " stem - Stem variable used to store the extracted files\n" " include - Optional string variable specifying a list of files (including\n" " wildcards) to include. stem.0 must indicate number of items.\n" " exclude - Optional string variable specifying a list of files (including\n" " wildcards) to exclude. stem.0 must indicate number of items.\n" " NOTE: If lists are not needed, filespec strings may be passed.\n" " mode - Optional mode parameter specifies either 'F'lat (the default)\n" " or 'T'ree mode.\n" " -- In flat mode, each file is stored in stem.fullname i.e.\n" " stem.os2/dll/unzipapi.c. A list of files is created in\n" " stem.\n" " -- In tree mode, slashes are converted to periods in the\n" " pathname thus the above file would have been stored in\n" " stem.OS2.DLL.unzipapi.c and an index stored for each\n" " directory, i.e. stem.OS2.DLL. = \"unzipapi.c\",\n" " stem.OS2. = \"DLL/\", stem. = \"OS2/\"", "Unzip files to a stem variable.\n\n" " Example: Assuming a file unzip.zip containing:\n" " unzip.c, unshrink.c, extract.c,\n" " os2/makefile.os2, os2/os2.c\n" " os2/dll/dll.def, os2/dll/unzipapi.c\n\n" " rc = UZUnZipToStem('unzip.zip', 'stem.')\n" " Returns: stem.0 = 7\n" " stem.1 = unzip.c\n" " stem.2 = unshrink.c\n" " stem.3 = extract.c\n" " stem.4 = os2/makefile.os2\n" " stem.5 = os2/os2.c\n" " stem.6 = os2/dll/dll.def\n" " stem.7 = os2/dll/unzipapi.c\n" " And the following contain the contents of the\n" " various files:\n" " stem.unzip.c\n" " stem.unshrink.c\n" " stem.extract.c\n" " stem.os2/makefile.os2\n" " stem.os2/os2.c\n" " stem.os2/dll/dll.def\n" " stem.os2/dll/unzipapi.c\n\n" " rc = UZUnZipToStem('unzip.zip', 'stem.',,,'TREE')\n" " Returns: stem.0 = 4\n" " stem.1 = unzip.c\n" " stem.2 = unshrink.c\n" " stem.3 = extract.c\n" " stem.4 = OS2/\n" " stem.OS2.0 = 3\n" " stem.OS2.1 = makefile.os2\n" " stem.OS2.2 = os2.c\n" " stem.OS2.3 = DLL/\n" " stem.OS2.DLL.0 = 2\n" " stem.OS2.DLL.1 = def\n" " stem.OS2.DLL.2 = unzipapi.c\n" "\n" " And the following contain the contents of the\n" " various programs:\n" " stem.unzip.c\n" " stem.unshrink.c\n" " stem.extract.c\n" " stem.OS2.makefile.os2\n" " stem.OS2.os2.c\n" " stem.OS2.DLL.dll.def\n" " stem.OS2.DLL.unzipapi.c\n" }, { "UZVER" , "UZVer" , "rc = UZVer([option])\n\n" " rc String containing UnZip version info in the form 'x.xx'\n" " If option is 'L' then info is in the form 'x.xx of ", "Returns the version number of UnZip\n" }, { "UZAPIVER" , "UZAPIVer" , "rc = UZAPIVer([option])\n\n" " rc String containing API version info in the form 'x.xx'\n" " If option is 'L' then info is in the form 'x.xx of ", "Returns the version number of the API\n" }, { 0 } }; char *REXXBrief = "\ REXX functions:\n\ UZDropFuncs -- Makes all functions in this package unknown to REXX\n\ UZLoadFuncs -- Makes all functions in this package known to REXX\n\ UZFileTree -- Searches for files matching a given filespec\n\ UZUnZip -- UnZip command-line entry point\n\ UZUnZipToVar -- Unzip one file to a variable\n\ UZUnZipToStem -- Unzip files to a variable array\n\ UZVer -- Returns the UnZip version number\n\ UZAPIVer -- Returns the API version number\n"; #endif /* API_DOC && OS2DLL */ *[UNZIP60.OS2]REXXTEST.CMD;1+,~,./ 4@-d-0123KPWO56<`v7<`v89GHJ! UNZIP.BCK~,d-NZIP60.OS2]REXXTEST.CMD;1\/* Test REXX UnZip API */ call RxFuncAdd 'UZLoadFuncs', 'UNZIP32', 'UZLoadFuncs' call UZLoadFuncs parse arg all say; say 'Demonstrating UZUnZip' UZUnZip(all,'TEST.') do num=1 to test.0 say num':'test.num end /*** Demonstrate UZFileTree ***/ fname = 'g:\cqc\channel1\12-30.qwk' say; say 'Demonstrating UZFileTree by displaying all entries in', fname exc.0 = 2 exc.1 = '*.dat' exc.2 = '*.ndx' call UZFileTree fname, 'files','','exc' do num=1 to files.0 say num':'files.num end say; say 'Demonstrating UZUnZipToVar -' UZUnZipToVar(fname,'CONTROL.DAT') test. = 0 say; say 'Demonstrating UZUnZipToVar -' UZUnZipToVar(fname,'CONTROL.DAT','test.') SAY "Test =" test.0 do num=1 to test.0 say num':'test.num end test. = 0 say; say 'Demonstrating UZUnZipToStem -' UZUnZipToStem('\SourceCode\cqc\cqcmain.zip','test',"*.rch",,'T') call recout "test" say; say 'Demonstrating UZVer -' UZVer() call UZDropFuncs exit recout: PROCEDURE EXPOSE test. parse arg this say this "Contains" value(this'.0') "entries" do num=1 to value(this'.0') tval = value(this'.'num) say "Got" this'.'num':' tval if Right(tval,1) = '/' then call recout this'.'left(tval,length(tval)-1) else say "Contains:" value(this'.tval') end return *[UNZIP60.OS2]STUB.DEF;1+,./ 4@-d-0123KPWO56789GHJDESCRIPTION 'The world-famous Info-ZIP unarchiving utilities' STACKSIZE 0x50000 IMPORTS UNZIP32.UzpVersion UNZIP32.UzpMain UNZIP32.UzpVersion2 *[UNZIP60.OS2]UNZIP.DEF;1+,./ 4@-d-0123KPWO56789GHJNAME WINDOWCOMPAT NEWFILES DESCRIPTION 'The world-famous Info-ZIP unarchiving utilities' ; SEGMENTS ; _MSGSEG32 CLASS 'CODE' *[UNZIP60.OS2]ZGREPAPI.CMD;1+,./ 4@-d-0123KPWO56F`v7F`v89GHJ /*--------------------------------------------------------------------------- zapigrep.cmd (ye olde REXX procedure for OS/2) Script to search members of a zipfile for a string and print the names of any such members (and, optionally, the matching text). This is the zipgrep.cmd program completely rewritten to take advantage of the REXX API. Among the improvements are: egrep no longer needed. All work done by API and this script. Added option switches. Be aware, however, that this script does not support regular expressions as zipgrep does. ---------------------------------------------------------------------------*/ PARSE ARG args nocase = 0 word = 0 text = 0 DO WHILE Left(args,1) == '-' | Left(args,1) == '/' PARSE VAR args option args option = Translate(SubStr(option,2)) DO WHILE option \= '' oneopt = Left(option,1) option = SubStr(option,2) SELECT WHEN oneopt == 'W' THEN word = 1 WHEN oneopt == 'I' THEN nocase = 1 WHEN oneopt == 'T' THEN text = 1 OTHERWISE NOP END END END PARSE VAR args string zipfile members IF (string == '') THEN DO SAY 'usage: zipgrep [-i][-t][-w] search_string zipfile [members...]' SAY ' Displays the names of zipfile members containing a given string.' SAY ' By default it displays filenames only of members containing an' SAY ' exact match of the string. Options are:'"0a"x SAY ' -i Ignore case' SAY ' -t Display matching lines' SAY ' -w Match words only' EXIT 1 END string = Strip(string,'b','"') IF nocase THEN string = Translate(string) CALL RxFuncAdd 'UZLoadFuncs', 'UNZIP32', 'UZLoadFuncs' CALL UZLoadFuncs CALL UZUnZipToStem zipfile, 'file.', members DO i = 1 TO file.0 ptr = file.i file = file.ptr IF nocase THEN file = Translate(file) IF word THEN DO wp = WordPos(string,file) IF wp>0 THEN scan = WordIndex(file,wp) ELSE scan = 0 END ELSE scan = Pos(string,file) IF scan \= 0 THEN DO SAY file.i':' IF text THEN DO DO WHILE scan > 0 from = LastPos('0a'x,file,scan)+1 to = Pos('0a'x,file,scan) IF to = 0 THEN to = Length(file.ptr) oneline = Strip(SubStr(file.ptr,from,to-from),'T','0a'x) SAY Strip(oneline,'T','0d'x) IF word THEN DO wp = WordPos(string,file,wp+1) IF wp>0 THEN scan = WordIndex(file,wp) ELSE scan = 0 END ELSE scan = Pos(string,file,scan+1) END END END END EXIT 0 *[UNZIP60.OS2]ZIP2EXE.CMD;1+, ./ 4D@-d-0123KPWO56L._7L._89GHJ/**** REXX ******** ZIP2EXE.CMD ************** 01/04/96 *********\ |** This exec will prepend the Info Zip unzipsfx.exe file to an **| |** existing ZIP file to create a self extracting zip. **| |** **| |** The exec requires 1 argument, the name of the zip file to be **| |** acted upon. **| |** **| |** Put this exec into the path that contains your Info Zip **| |** executables. **| |** **| \*********************************************************************/ rc = 0 /** Start Argument processing ** End Initialization **/ PARSE UPPER ARG zip_file IF zip_file = "" THEN DO SAY "You must specify the name of the file to be processed" SAY "Please try again" rc = 9 SIGNAL FINI END IF POS(".ZIP",zip_file) = 0 THEN DO sfx_file = zip_file||".EXE" zip_file = zip_file||".ZIP" END ELSE sfx_file = SUBSTR(zip_file,1,LASTPOS(".",zip_file))||"EXE" zip_file = STREAM(zip_file,"C","QUERY EXISTS") IF zip_file = "" THEN DO SAY "The file "||ARG(1)||" Does not exist" SAY "Processing terminated" rc = 9 SIGNAL FINI END /** Start unzipsfx location ** End Argument processing **/ PARSE UPPER SOURCE . . command_file unzipsfx = SUBSTR(cwB UNZIP.BCK d-[UNZIP60.OS2]ZIP2EXE.CMD;1e>ommand_file,1,LASTPOS("\",command_file))||, "UNZIPSFX.EXE" IF STREAM(unzipsfx,"C","QUERY EXISTS") = "" THEN DO SAY "We are unable to locate the UNZIPSFX.EXE source" SAY "Ensure that the ZIP2EXE command is in the directory", "which contains UNZIPSFX.EXE" rc = 9 SIGNAL FINI END /** Execute the command ** End Argument processing **/ ADDRESS CMD "@COPY /b "||unzipsfx||"+"||zip_file, sfx_file||" > NUL" IF rc = 0 THEN SAY sfx_file||" successfully created" ELSE SAY sfx_file||" creation failed" FINI: EXIT rc *[UNZIP60.OS2]ZIPGREP.CMD;1+,./ 4A@-d-0123KPWO56%#7%#89GHJ/*--------------------------------------------------------------------------- zipgrep.cmd (ye olde REXX procedure for OS/2) Script to search members of a zipfile for a string or regular expression and print the names of any such members (and, optionally, the matching text). The search is case-insensitive by default. History: original Bourne shell version by Jean-loup Gailly modified by Greg Roelofs for Ultrix (no egrep -i) and zipinfo -1 OS/2 REXX script by Greg Roelofs Last modified: 19 Jul 93 ---------------------------------------------------------------------------*/ PARSE ARG string zipfile members if (string == '') then do say 'usage: zipgrep search_string zipfile [members...]' say ' Displays the names of zipfile members containing a given string,' say ' in addition to the matching text. This procedure requires unzip' say ' and egrep in the current path, and it is quite slow....' exit 1 end /* doesn't seem to work... newq = RXQUEUE("Create",zipgrep_pipe) oldq = RXQUEUE("Set",newq) */ /* flush the queue before starting */ do QUEUED() PULL junk end /* GRR: can also add "2>&1" before pipe in following external command */ '@unzip -Z1' zipfile members '| rxqueue' do while QUEUED() > 0 PARSE PULL file '@unzip -p' zipfile file '| egrep -is' string if rc == 0 then do SAY file':' /* can comment out following line if just want filenames */ '@unzip -p' zipfile file '| egrep -i' string end end /* call RXQUEUE "Delete",newq call RXQUEUE "Set",oldq */ exit 0 *[UNZIP60]PROCESS.C;1+,N>./ 4@->0123KPWO56T<7T<89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- process.c This file contains the top-level routines for processing multiple zipfiles. Contains: process_zipfiles() free_G_buffers() do_seekable() file_size() rec_find() find_ecrec64() find_ecrec() process_zip_cmmnt() process_cdir_file_hdr() get_cdir_ent() process_local_file_hdr() getZip64Data() ef_scan_for_izux() getRISCOSexfield() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #ifdef WINDLL # ifdef POCKET_UNZIP # include "wince/intrface.h" # else # include "windll/windll.h" # endif #endif #if defined(DYNALLOC_CRCTAB) || defined(UNICODE_SUPPORT) # include "crc32.h" #endif static int do_seekable OF((__GPRO__ int lastchance)); #ifdef DO_SAFECHECK_2GB # ifdef USE_STRM_INPUT static zoff_t file_size OF((FILE *file)); # else static zoff_t file_size OF((int fh)); # endif #endif /* DO_SAFECHECK_2GB */ static int rec_find OF((__GPRO__ zoff_t, char *, int)); static int find_ecrec64 OF((__GPRO__ zoff_t searchlen)); static int find_ecrec OF((__GPRO__ zoff_t searchlen)); static int process_zip_cmmnt OF((__GPRO)); static int get_cdir_ent OF((__GPRO)); #ifdef IZ_HAVE_UXUIDGID static int read_ux3_value OF((ZCONST uch *dbuf, unsigned uidgid_sz, ulg *p_uidgid)); #endif /* IZ_HAVE_UXUIDGID */ static ZCONST char Far CannotAllocateBuffers[] = "error: cannot allocate unzip buffers\n"; #ifdef SFX static ZCONST char Far CannotFindMyself[] = "unzipsfx: cannot find myself! [%s]\n"; # ifdef CHEAP_SFX_AUTORUN static ZCONST char Far AutorunPrompt[] = "\nAuto-run command: %s\nExecute this command? [y/n] "; static ZCONST char Far NotAutoRunning[] = "Not executing auto-run command."; # endif #else /* !SFX */ /* process_zipfiles() strings */ # if (defined(IZ_CHECK_TZ) && defined(USE_EF_UT_TIME)) static ZCONST char Far WarnInvalidTZ[] = "Warning: TZ environment variable not found, cannot use UTC times!!\n"; # endif # if !(defined(UNIX) || defined(AMIGA)) static ZCONST char Far CannotFindWildcardMatch[] = "%s: cannot find any matches for wildcard specification \"%s\".\n"; # endif /* !(UNIX || AMIGA) */ static ZCONST char Far FilesProcessOK[] = "%d archive%s successfully processed.\n"; static ZCONST char Far ArchiveWarning[] = "%d archive%s had warnings but no fatal errors.\n"; static ZCONST char Far ArchiveFatalError[] = "%d archive%s had fatal errors.\n"; static ZCONST char Far FileHadNoZipfileDir[] = "%d file%s had no zipfile directory.\n"; static ZCONST char Far ZipfileWasDir[] = "1 \"zipfile\" was a directory.\n"; static ZCONST char Far ManyZipfilesWereDir[] = "%d \"zipfiles\" were directories.\n"; static ZCONST char Far NoZipfileFound[] = "No zipfiles found.\n"; /* do_seekable() strings */ # ifdef UNIX static ZCONST char Far CannotFindZipfileDirMsg[] = "%s: cannot find zipfile directory in one of %s or\n\ %s%s.zip, and cannot find %s, period.\n"; static ZCONST char Far CannotFindEitherZipfile[] = "%s: cannot find or open %s, %s.zip or %s.\n"; # else /* !UNIX */ static ZCONST char Far CannotFindZipfileDirMsg[] = "%s: cannot find zipfile directory in %s,\n\ %sand cannot find %s, period.\n"; # ifdef VMS static ZCONST char Far CannotFindEitherZipfile[] = "%s: cannot find %s (%s).\n"; # else /* !VMS */t UNZIP.BCKN>>[UNZIP60]PROCESS.C;1W static ZCONST char Far CannotFindEitherZipfile[] = "%s: cannot find either %s or %s.\n"; # endif /* ?VMS */ # endif /* ?UNIX */ extern ZCONST char Far Zipnfo[]; /* in unzip.c */ #ifndef WINDLL static ZCONST char Far Unzip[] = "unzip"; #else static ZCONST char Far Unzip[] = "UnZip DLL"; #endif #ifdef DO_SAFECHECK_2GB static ZCONST char Far ZipfileTooBig[] = "Trying to read large file (> 2 GiB) without large file support\n"; #endif /* DO_SAFECHECK_2GB */ static ZCONST char Far MaybeExe[] = "note: %s may be a plain executable, not an archive\n"; static ZCONST char Far CentDirNotInZipMsg[] = "\n\ [%s]:\n\ Zipfile is disk %lu of a multi-disk archive, and this is not the disk on\n\ which the central zipfile directory begins (disk %lu).\n"; static ZCONST char Far EndCentDirBogus[] = "\nwarning [%s]: end-of-central-directory record claims this\n\ is disk %lu but that the central directory starts on disk %lu; this is a\n\ contradiction. Attempting to process anyway.\n"; # ifdef NO_MULTIPART static ZCONST char Far NoMultiDiskArcSupport[] = "\nerror [%s]: zipfile is part of multi-disk archive\n\ (sorry, not yet supported).\n"; static ZCONST char Far MaybePakBug[] = "warning [%s]:\ zipfile claims to be 2nd disk of a 2-part archive;\n\ attempting to process anyway. If no further errors occur, this archive\n\ was probably created by PAK v2.51 or earlier. This bug was reported to\n\ NoGate in March 1991 and was supposed to have been fixed by mid-1991; as\n\ of mid-1992 it still hadn't been. (If further errors do occur, archive\n\ was probably created by PKZIP 2.04c or later; UnZip does not yet support\n\ multi-part archives.)\n"; # else static ZCONST char Far MaybePakBug[] = "warning [%s]:\ zipfile claims to be last disk of a multi-part archive;\n\ attempting to process anyway, assuming all parts have been concatenated\n\ together in order. Expect \"errors\" and warnings...true multi-part support\ \n doesn't exist yet (coming soon).\n"; # endif static ZCONST char Far ExtraBytesAtStart[] = "warning [%s]: %s extra byte%s at beginning or within zipfile\n\ (attempting to process anyway)\n"; #endif /* ?SFX */ #if ((!defined(WINDLL) && !defined(SFX)) || !defined(NO_ZIPINFO)) static ZCONST char Far LogInitline[] = "Archive: %s\n"; #endif static ZCONST char Far MissingBytes[] = "error [%s]: missing %s bytes in zipfile\n\ (attempting to process anyway)\n"; static ZCONST char Far NullCentDirOffset[] = "error [%s]: NULL central directory offset\n\ (attempting to process anyway)\n"; static ZCONST char Far ZipfileEmpty[] = "warning [%s]: zipfile is empty\n"; static ZCONST char Far CentDirStartNotFound[] = "error [%s]: start of central directory not found;\n\ zipfile corrupt.\n%s"; static ZCONST char Far Cent64EndSigSearchErr[] = "fatal error: read failure while seeking for End-of-centdir-64 signature.\n\ This zipfile is corrupt.\n"; static ZCONST char Far Cent64EndSigSearchOff[] = "error: End-of-centdir-64 signature not where expected (prepended bytes?)\n\ (attempting to process anyway)\n"; #ifndef SFX static ZCONST char Far CentDirTooLong[] = "error [%s]: reported length of central directory is\n\ %s bytes too long (Atari STZip zipfile? J.H.Holm ZIPSPLIT 1.1\n\ zipfile?). Compensating...\n"; static ZCONST char Far CentDirEndSigNotFound[] = "\ End-of-central-directory signature not found. Either this file is not\n\ a zipfile, or it constitutes one disk of a multi-part archive. In the\n\ latter case the central directory and zipfile comment will be found on\n\ the last disk(s) of this archive.\n"; #else /* SFX */ static ZCONST char Far CentDirEndSigNotFound[] = " End-of-central-directory signature not found.\n"; #endif /* ?SFX */ #ifdef TIMESTAMP static ZCONST char Far ZipTimeStampFailed[] = "warning: cannot set time for %s\n"; static ZCONST char Far ZipTimeStampSuccess[] = "Updated time stamp for %s.\n"; #endif static ZCONST char Far ZipfileCommTrunc1[] = "\ncaution: zipfile comment truncated\n"; #ifndef NO_ZIPINFO static ZCONST char Far NoZipfileComment[] = "There is no zipfile comment.\n"; static ZCONST char Far ZipfileCommentDesc[] = "The zipfile comment is %u bytes long and contains the following text:\n"; static ZCONST char Far ZipfileCommBegin[] = "======================== zipfile comment begins\ ==========================\n"; static ZCONST char Far ZipfileCommEnd[] = "========================= zipfile c omment ends\ ===========================\n"; static ZCONST char Far ZipfileCommTrunc2[] = "\n The zipfile comment is truncated.\n"; #endif /* !NO_ZIPINFO */ #ifdef UNICODE_SUPPORT static ZCONST char Far UnicodeVersionError[] = "\nwarning: Unicode Path version > 1\n"; static ZCONST char Far UnicodeMismatchError[] = "\nwarning: Unicode Path checksum invalid\n"; #endif /*******************************/ /* Function process_zipfiles() */ /*******************************/ int process_zipfiles(__G) /* return PK-type error code */ __GDEF { #ifndef SFX char *lastzipfn = (char *)NULL; int NumWinFiles, NumLoseFiles, NumWarnFiles; int NumMissDirs, NumMissFiles; #endif int error=0, error_in_archive=0; /*--------------------------------------------------------------------------- Start by allocating buffers and (re)constructing the various PK signature strings. ---------------------------------------------------------------------------*/ G.inbuf = (uch *)malloc(INBUFSIZ + 4); /* 4 extra for hold[] (below) */ G.outbuf = (uch *)malloc(OUTBUFSIZ + 1); /* 1 extra for string term. */ if ((G.inbuf == (uch *)NULL) || (G.outbuf == (uch *)NULL)) { Info(slide, 0x401, ((char *)slide, LoadFarString(CannotAllocateBuffers))); return(PK_MEM); } G.hold = G.inbuf + INBUFSIZ; /* to check for boundary-spanning sigs */ #ifndef VMS /* VMS uses its own buffer scheme for textmode flush(). */ #ifdef SMALL_MEM G.outbuf2 = G.outbuf+RAWBUFSIZ; /* never changes */ #endif #endif /* !VMS */ #if 0 /* CRC_32_TAB has been NULLified by CONSTRUCTGLOBALS !!!! */ /* allocate the CRC table later when we know we can read zipfile data */ CRC_32_TAB = NULL; #endif /* 0 */ /* finish up initialization of magic signature strings */ local_hdr_sig[0] /* = extd_local_sig[0] */ = /* ASCII 'P', */ central_hdr_sig[0] = end_central_sig[0] = /* not EBCDIC */ end_centloc64_sig[0] = end_central64_sig[0] = 0x50; local_hdr_sig[1] /* = extd_local_sig[1] */ = /* ASCII 'K', */ central_hdr_sig[1] = end_central_sig[1] = /* not EBCDIC */ end_centloc64_sig[1] = end_central64_sig[1] = 0x4B; /*--------------------------------------------------------------------------- Make sure timezone info is set correctly; localtime() returns GMT on some OSes (e.g., Solaris 2.x) if this isn't done first. The ifdefs around tzset() were initially copied from dos_to_unix_time() in fileio.c. They may still be too strict; any listed OS that supplies tzset(), regardless of whether the function does anything, should be removed from the ifdefs. ---------------------------------------------------------------------------*/ #if (defined(WIN32) && defined(USE_EF_UT_TIME)) /* For the Win32 environment, we may have to "prepare" the environment prior to the tzset() call, to work around tzset() implementation bugs. */ iz_w32_prepareTZenv(); #endif #if (defined(IZ_CHECK_TZ)4 UNZIP.BCKN>>[UNZIP60]PROCESS.C;1 && defined(USE_EF_UT_TIME)) # ifndef VALID_TIMEZONE # define VALID_TIMEZONE(tmp) \ (((tmp = getenv("TZ")) != NULL) && (*tmp != '\0')) # endif { char *p; G.tz_is_valid = VALID_TIMEZONE(p); # ifndef SFX if (!G.tz_is_valid) { Info(slide, 0x401, ((char *)slide, LoadFarString(WarnInvalidTZ))); error_in_archive = error = PK_WARN; } # endif /* !SFX */ } #endif /* IZ_CHECK_TZ && USE_EF_UT_TIME */ /* For systems that do not have tzset() but supply this function using another name (_tzset() or something similar), an appropiate "#define tzset ..." should be added to the system specifc configuration section. */ #if (!defined(T20_VMS) && !defined(MACOS) && !defined(RISCOS) && !defined(QDOS)) #if (!defined(BSD) && !defined(MTS) && !defined(CMS_MVS) && !defined(TANDEM)) tzset(); #endif #endif /* Initialize UnZip's built-in pseudo hard-coded "ISO <--> OEM" translation, depending on the detected codepage setup. */ #ifdef NEED_ISO_OEM_INIT prepare_ISO_OEM_translat(__G); #endif /*--------------------------------------------------------------------------- Initialize the internal flag holding the mode of processing "overwrite existing file" cases. We do not use the calling interface flags directly because the overwrite mode may be changed by user interaction while processing archive files. Such a change should not affect the option settings as passed through the DLL calling interface. In case of conflicting options, the 'safer' flag uO.overwrite_none takes precedence. ---------------------------------------------------------------------------*/ G.overwrite_mode = (uO.overwrite_none ? OVERWRT_NEVER : (uO.overwrite_all ? OVERWRT_ALWAYS : OVERWRT_QUERY)); /*--------------------------------------------------------------------------- Match (possible) wildcard zipfile specification with existing files and attempt to process each. If no hits, try again after appending ".zip" suffix. If still no luck, give up. ---------------------------------------------------------------------------*/ #ifdef SFX if ((error = do_seekable(__G__ 0)) == PK_NOZIP) { #ifdef EXE_EXTENSION int len=strlen(G.argv0); /* append .exe if appropriate; also .sfx? */ if ( (G.zipfn = (char *)malloc(len+sizeof(EXE_EXTENSION))) != (char *)NULL ) { strcpy(G.zipfn, G.argv0); strcpy(G.zipfn+len, EXE_EXTENSION); error = do_seekable(__G__ 0); free(G.zipfn); G.zipfn = G.argv0; /* for "cannot find myself" message only */ } #endif /* EXE_EXTENSION */ #ifdef WIN32 G.zipfn = G.argv0; /* for "cannot find myself" message only */ #endif } if (error) { if (error == IZ_DIR) error_in_archive = PK_NOZIP; else error_in_archive = error; if (error == PK_NOZIP) Info(slide, 1, ((char *)slide, LoadFarString(CannotFindMyself), G.zipfn)); } #ifdef CHEAP_SFX_AUTORUN if (G.autorun_command[0] && !uO.qflag) { /* NO autorun without prompt! */ Info(slide, 0x81, ((char *)slide, LoadFarString(AutorunPrompt), FnFilter1(G.autorun_command))); if (fgets(G.answerbuf, 9, stdin) != (char *)NULL && toupper(*G.answerbuf) == 'Y') system(G.autorun_command); else Info(slide, 1, ((char *)slide, LoadFarString(NotAutoRunning))); } #endif /* CHEAP_SFX_AUTORUN */ #else /* !SFX */ NumWinFiles = NumLoseFiles = NumWarnFiles = 0; NumMissDirs = NumMissFiles = 0; while ((G.zipfn = do_wild(__G__ G.wildzipfn)) != (char *)NULL) { Trace((stderr, "do_wild( %s ) returns %s\n", G.wildzipfn, G.zipfn)); lastzipfn = G.zipfn; /* print a blank line between the output of different zipfiles */ if (!uO.qflag && error != PK_NOZIP && error != IZ_DIR #ifdef TIMESTAMP && (!uO.T_flag || uO.zipinfo_mode) #endif && (NumWinFiles+NumLoseFiles+NumWarnFiles+NumMissFiles) > 0) (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0); if ((error = do_seekable(__G__ 0)) == PK_WARN) ++NumWarnFiles; else if (error == IZ_DIR) ++NumMissDirs; else if (error == PK_NOZIP) ++NumMissFiles; else if (error != PK_OK) ++NumLoseFiles; else ++NumWinFiles; Trace((stderr, "do_seekable(0) returns %d\n", error)); if (error != IZ_DIR && error > error_in_archive) error_in_archive = error; #ifdef WINDLL if (error == IZ_CTRLC) { free_G_buffers(__G); return error; } #endif } /* end while-loop (wildcard zipfiles) */ if ((NumWinFiles + NumWarnFiles + NumLoseFiles) == 0 && (NumMissDirs + NumMissFiles) == 1 && lastzipfn != (char *)NULL) { #if (!defined(UNIX) && !defined(AMIGA)) /* filenames with wildcard characters */ if (iswild(G.wildzipfn)) { if (iswild(lastzipfn)) { NumMissDirs = NumMissFiles = 0; error_in_archive = PK_COOL; if (uO.qflag < 3) Info(slide, 0x401, ((char *)slide, LoadFarString(CannotFindWildcardMatch), LoadFarStringSmall((uO.zipinfo_mode ? Zipnfo : Unzip)), G.wildzipfn)); } } else #endif { #ifndef VMS /* 2004-11-24 SMS. * VMS has already tried a default file type of ".zip" in * do_wild(), so adding ZSUFX here only causes confusion by * corrupting some valid (though nonexistent) file names. * Complaining below about "fred;4.zip" is unlikely to be * helpful to the victim. */ /* 2005-08-14 Chr. Spieler * Although we already "know" the failure result, we call * do_seekable() again with the same zipfile name (and the * lastchance flag set), just to trigger the error report... */ #if defined(UNIX) || defined(QDOS) char *p = #endif strcpy(lastzipfn + strlen(lastzipfn), ZSUFX); #endif /* !VMS */ G.zipfn = lastzipfn; NumMissDirs = NumMissFiles = 0; error_in_archive = PK_COOL; #if defined(UNIX) || defined(QDOS) /* only Unix has case-sensitive filesystems */ /* Well FlexOS (sometimes) also has them, but support is per media */ /* and a pig to code for, so treat as case insensitive for now */ /* we do this under QDOS to check for .zip as well as _zip */ if ((error = do_seekable(__G__ 0)) == PK_NOZIP || error == IZ_DIR) { if (error == IZ_DIR) ++NumMissDirs; strcpy(p, ALT_ZSUFX); error = do_seekable(__G__ 1); } #else error = do_seekable(__G__ 1); #endif Trace((stderr, "do_seekable(1) returns %d\n", error)); switch (error) { case PK_WARN: ++NumWarnFiles; break; case IZ_DIR: ++NumMissDirs; error = PK_NOZIP; break; case PK_NOZIP: /* increment again => bug: "1 file had no zipfile directory." */ /* ++NumMissFiles */ ; break; default: if (error) ++NumLoseFiles; else ++Nk UNZIP.BCKN>>[UNZIP60]PROCESS.C;1n'umWinFiles; break; } if (error > error_in_archive) error_in_archive = error; #ifdef WINDLL if (error == IZ_CTRLC) { free_G_buffers(__G); return error; } #endif } } #endif /* ?SFX */ /*--------------------------------------------------------------------------- Print summary of all zipfiles, assuming zipfile spec was a wildcard (no need for a summary if just one zipfile). ---------------------------------------------------------------------------*/ #ifndef SFX if (iswild(G.wildzipfn) && uO.qflag < 3 #ifdef TIMESTAMP && !(uO.T_flag && !uO.zipinfo_mode && uO.qflag > 1) #endif ) { if ((NumMissFiles + NumLoseFiles + NumWarnFiles > 0 || NumWinFiles != 1) #ifdef TIMESTAMP && !(uO.T_flag && !uO.zipinfo_mode && uO.qflag) #endif && !(uO.tflag && uO.qflag > 1)) (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0x401); if ((NumWinFiles > 1) || (NumWinFiles == 1 && NumMissDirs + NumMissFiles + NumLoseFiles + NumWarnFiles > 0)) Info(slide, 0x401, ((char *)slide, LoadFarString(FilesProcessOK), NumWinFiles, (NumWinFiles == 1)? " was" : "s were")); if (NumWarnFiles > 0) Info(slide, 0x401, ((char *)slide, LoadFarString(ArchiveWarning), NumWarnFiles, (NumWarnFiles == 1)? "" : "s")); if (NumLoseFiles > 0) Info(slide, 0x401, ((char *)slide, LoadFarString(ArchiveFatalError), NumLoseFiles, (NumLoseFiles == 1)? "" : "s")); if (NumMissFiles > 0) Info(slide, 0x401, ((char *)slide, LoadFarString(FileHadNoZipfileDir), NumMissFiles, (NumMissFiles == 1)? "" : "s")); if (NumMissDirs == 1) Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileWasDir))); else if (NumMissDirs > 0) Info(slide, 0x401, ((char *)slide, LoadFarString(ManyZipfilesWereDir), NumMissDirs)); if (NumWinFiles + NumLoseFiles + NumWarnFiles == 0) Info(slide, 0x401, ((char *)slide, LoadFarString(NoZipfileFound))); } #endif /* !SFX */ /* free allocated memory */ free_G_buffers(__G); return error_in_archive; } /* end function process_zipfiles() */ /*****************************/ /* Function free_G_buffers() */ /*****************************/ void free_G_buffers(__G) /* releases all memory allocated in global vars */ __GDEF { #ifndef SFX unsigned i; #endif #ifdef SYSTEM_SPECIFIC_DTOR SYSTEM_SPECIFIC_DTOR(__G); #endif inflate_free(__G); checkdir(__G__ (char *)NULL, END); #ifdef DYNALLOC_CRCTAB if (CRC_32_TAB) { free_crc_table(); CRC_32_TAB = NULL; } #endif if (G.key != (char *)NULL) { free(G.key); G.key = (char *)NULL; } if (G.extra_field != (uch *)NULL) { free(G.extra_field); G.extra_field = (uch *)NULL; } #if (!defined(VMS) && !defined(SMALL_MEM)) /* VMS uses its own buffer scheme for textmode flush() */ if (G.outbuf2) { free(G.outbuf2); /* malloc'd ONLY if unshrink and -a */ G.outbuf2 = (uch *)NULL; } #endif if (G.outbuf) free(G.outbuf); if (G.inbuf) free(G.inbuf); G.inbuf = G.outbuf = (uch *)NULL; #ifdef UNICODE_SUPPORT if (G.filename_full) { free(G.filename_full); G.filename_full = (char *)NULL; G.fnfull_bufsize = 0; } #endif /* UNICODE_SUPPORT */ #ifndef SFX for (i = 0; i < DIR_BLKSIZ; i++) { if (G.info[i].cfilname != (char Far *)NULL) { zffree(G.info[i].cfilname); G.info[i].cfilname = (char Far *)NULL; } } #endif #ifdef MALLOC_WORK if (G.area.Slide) { free(G.area.Slide); G.area.Slide = (uch *)NULL; } #endif } /* end function free_G_buffers() */ /**************************/ /* Function do_seekable() */ /**************************/ static int do_seekable(__G__ lastchance) /* return PK-type error code */ __GDEF int lastchance; { #ifndef SFX /* static int no_ecrec = FALSE; SKM: moved to globals.h */ int maybe_exe=FALSE; int too_weird_to_continue=FALSE; #ifdef TIMESTAMP time_t uxstamp; ulg nmember = 0L; #endif #endif int error=0, error_in_archive; /*--------------------------------------------------------------------------- Open the zipfile for reading in BINARY mode to prevent CR/LF translation, which would corrupt the bit streams. ---------------------------------------------------------------------------*/ if (SSTAT(G.zipfn, &G.statbuf) || #ifdef THEOS (error = S_ISLIB(G.statbuf.st_mode)) != 0 || #endif (error = S_ISDIR(G.statbuf.st_mode)) != 0) { #ifndef SFX if (lastchance && (uO.qflag < 3)) { #if defined(UNIX) || defined(QDOS) if (G.no_ecrec) Info(slide, 1, ((char *)slide, LoadFarString(CannotFindZipfileDirMsg), LoadFarStringSmall((uO.zipinfo_mode ? Zipnfo : Unzip)), G.wildzipfn, uO.zipinfo_mode? " " : "", G.wildzipfn, G.zipfn)); else Info(slide, 1, ((char *)slide, LoadFarString(CannotFindEitherZipfile), LoadFarStringSmall((uO.zipinfo_mode ? Zipnfo : Unzip)), G.wildzipfn, G.wildzipfn, G.zipfn)); #else /* !(UNIX || QDOS) */ if (G.no_ecrec) Info(slide, 0x401, ((char *)slide, LoadFarString(CannotFindZipfileDirMsg), LoadFarStringSmall((uO.zipinfo_mode ? Zipnfo : Unzip)), G.wildzipfn, uO.zipinfo_mode? " " : "", G.zipfn)); else #ifdef VMS Info(slide, 0x401, ((char *)slide, LoadFarString(CannotFindEitherZipfile), LoadFarStringSmall((uO.zipinfo_mode ? Zipnfo : Unzip)), G.wildzipfn, (*G.zipfn ? G.zipfn : vms_msg_text()))); #else /* !VMS */ Info(slide, 0x401, ((char *)slide, LoadFarString(CannotFindEitherZipfile), LoadFarStringSmall((uO.zipinfo_mode ? Zipnfo : Unzip)), G.wildzipfn, G.zipfn)); #endif /* ?VMS */ #endif /* ?(UNIX || QDOS) */ } #endif /* !SFX */ return error? IZ_DIR : PK_NOZIP; } G.ziplen = G.statbuf.st_size; #ifndef SFX #if defined(UNIX) || defined(DOS_OS2_W32) || defined(THEOS) if (G.statbuf.st_mode & S_IEXEC) /* no extension on Unix exes: might */ maybe_exe = TRUE; /* find unzip, not unzip.zip; etc. */ #endif #endif /* !SFX */ #ifdef VMS if (check_format(__G)) /* check for variable-length format */ return PK_ERR; #endif if (open_input_file(__G)) /* this should never happen, given */ return PK_NOZIP; /* the stat() test above, but... */ #ifdef DO_SAFECHECK_2GB /* Need more care: Do not trust the size returned by stat() but determine it by reading beyond the end of the file. */ G.ziplen = file_size(G.zipfd); if (G.ziplen == EOF) { Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileTooBig))); /* printf( " We need a better error message for: 64-bit file, 32-bit program.\n"); */ CLOSE_INFILE(); return IZ_ERRBF; } #endif /* DO_SAFECHECK_2GB */ /*--------------------------------------------------------------------------- Find and p4x UNZIP.BCKN>>[UNZIP60]PROCESS.C;16rocess the end-of-central-directory header. UnZip need only check last 65557 bytes of zipfile: comment may be up to 65535, end-of- central-directory record is 18 bytes, and signature itself is 4 bytes; add some to allow for appended garbage. Since ZipInfo is often used as a debugging tool, search the whole zipfile if zipinfo_mode is true. ---------------------------------------------------------------------------*/ G.cur_zipfile_bufstart = 0; G.inptr = G.inbuf; #if ((!defined(WINDLL) && !defined(SFX)) || !defined(NO_ZIPINFO)) # if (!defined(WINDLL) && !defined(SFX)) if ( (!uO.zipinfo_mode && !uO.qflag # ifdef TIMESTAMP && !uO.T_flag # endif ) # ifndef NO_ZIPINFO || (uO.zipinfo_mode && uO.hflag) # endif ) # else /* not (!WINDLL && !SFX) ==> !NO_ZIPINFO !! */ if (uO.zipinfo_mode && uO.hflag) # endif /* if..else..: (!WINDLL && !SFX) */ # ifdef WIN32 /* Win32 console may require codepage conversion for G.zipfn */ Info(slide, 0, ((char *)slide, LoadFarString(LogInitline), FnFilter1(G.zipfn))); # else Info(slide, 0, ((char *)slide, LoadFarString(LogInitline), G.zipfn)); # endif #endif /* (!WINDLL && !SFX) || !NO_ZIPINFO */ if ( (error_in_archive = find_ecrec(__G__ #ifndef NO_ZIPINFO uO.zipinfo_mode ? G.ziplen : #endif MIN(G.ziplen, 66000L))) > PK_WARN ) { CLOSE_INFILE(); #ifdef SFX ++lastchance; /* avoid picky compiler warnings */ return error_in_archive; #else if (maybe_exe) Info(slide, 0x401, ((char *)slide, LoadFarString(MaybeExe), G.zipfn)); if (lastchance) return error_in_archive; else { G.no_ecrec = TRUE; /* assume we found wrong file: e.g., */ return PK_NOZIP; /* unzip instead of unzip.zip */ } #endif /* ?SFX */ } if ((uO.zflag > 0) && !uO.zipinfo_mode) { /* unzip: zflag = comment ONLY */ CLOSE_INFILE(); return error_in_archive; } /*--------------------------------------------------------------------------- Test the end-of-central-directory info for incompatibilities (multi-disk archives) or inconsistencies (missing or extra bytes in zipfile). ---------------------------------------------------------------------------*/ #ifdef NO_MULTIPART error = !uO.zipinfo_mode && (G.ecrec.number_this_disk == 1) && (G.ecrec.num_disk_start_cdir == 1); #else error = !uO.zipinfo_mode && (G.ecrec.number_this_disk != 0); #endif #ifndef SFX if (uO.zipinfo_mode && G.ecrec.number_this_disk != G.ecrec.num_disk_start_cdir) { if (G.ecrec.number_this_disk > G.ecrec.num_disk_start_cdir) { Info(slide, 0x401, ((char *)slide, LoadFarString(CentDirNotInZipMsg), G.zipfn, (ulg)G.ecrec.number_this_disk, (ulg)G.ecrec.num_disk_start_cdir)); error_in_archive = PK_FIND; too_weird_to_continue = TRUE; } else { Info(slide, 0x401, ((char *)slide, LoadFarString(EndCentDirBogus), G.zipfn, (ulg)G.ecrec.number_this_disk, (ulg)G.ecrec.num_disk_start_cdir)); error_in_archive = PK_WARN; } #ifdef NO_MULTIPART /* concatenation of multiple parts works in some cases */ } else if (!uO.zipinfo_mode && !error && G.ecrec.number_this_disk != 0) { Info(slide, 0x401, ((char *)slide, LoadFarString(NoMultiDiskArcSupport), G.zipfn)); error_in_archive = PK_FIND; too_weird_to_continue = TRUE; #endif } if (!too_weird_to_continue) { /* (relatively) normal zipfile: go for it */ if (error) { Info(slide, 0x401, ((char *)slide, LoadFarString(MaybePakBug), G.zipfn)); error_in_archive = PK_WARN; } #endif /* !SFX */ if ((G.extra_bytes = G.real_ecrec_offset-G.expect_ecrec_offset) < (zoff_t)0) { Info(slide, 0x401, ((char *)slide, LoadFarString(MissingBytes), G.zipfn, FmZofft((-G.extra_bytes), NULL, NULL))); error_in_archive = PK_ERR; } else if (G.extra_bytes > 0) { if ((G.ecrec.offset_start_central_directory == 0) && (G.ecrec.size_central_directory != 0)) /* zip 1.5 -go bug */ { Info(slide, 0x401, ((char *)slide, LoadFarString(NullCentDirOffset), G.zipfn)); G.ecrec.offset_start_central_directory = G.extra_bytes; G.extra_bytes = 0; error_in_archive = PK_ERR; } #ifndef SFX else { Info(slide, 0x401, ((char *)slide, LoadFarString(ExtraBytesAtStart), G.zipfn, FmZofft(G.extra_bytes, NULL, NULL), (G.extra_bytes == 1)? "":"s")); error_in_archive = PK_WARN; } #endif /* !SFX */ } /*----------------------------------------------------------------------- Check for empty zipfile and exit now if so. -----------------------------------------------------------------------*/ if (G.expect_ecrec_offset==0L && G.ecrec.size_central_directory==0) { if (uO.zipinfo_mode) Info(slide, 0, ((char *)slide, "%sEmpty zipfile.\n", uO.lflag>9? "\n " : "")); else Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileEmpty), G.zipfn)); CLOSE_INFILE(); return (error_in_archive > PK_WARN)? error_in_archive : PK_WARN; } /*----------------------------------------------------------------------- Compensate for missing or extra bytes, and seek to where the start of central directory should be. If header not found, uncompensate and try again (necessary for at least some Atari archives created with STZip, as well as archives created by J.H. Holm's ZIPSPLIT 1.1). -----------------------------------------------------------------------*/ error = seek_zipf(__G__ G.ecrec.offset_start_central_directory); if (error == PK_BADERR) { CLOSE_INFILE(); return PK_BADERR; } #ifdef OLD_SEEK_TEST if (error != PK_OK || readbuf(__G__ G.sig, 4) == 0) { CLOSE_INFILE(); return PK_ERR; /* file may be locked, or possibly disk error(?) */ } if (memcmp(G.sig, central_hdr_sig, 4)) #else if ((error != PK_OK) || (readbuf(__G__ G.sig, 4) == 0) || memcmp(G.sig, central_hdr_sig, 4)) #endif { #ifndef SFX zoff_t tmp = G.extra_bytes; #endif G.extra_bytes = 0; error = seek_zipf(__G__ G.ecrec.offset_start_central_directory); if ((error != PK_OK) || (readbuf(__G__ G.sig, 4) == 0) || memcmp(G.sig, central_hdr_sig, 4)) { if (error != PK_BADERR) Info(slide, 0x401, ((char *)slide, LoadFarString(CentDirStartNotFound), G.zipfn, LoadFarStringSmall(ReportMsg))); CLOSE_INFILE(); return (error != PK_OK ? error : PK_BADERR); } #ifndef SFX Info(slide, 0x401, ((char *)slide, LoadFarString(CentDirTooLong), G.zipfn, FmZofft((-tmp), NULL, NULL))); #endif error_in_archive = PK_ERR; } /*-------------------------------------------------'ݢ jvN 1TGb^Q*-s=t66bHE2ZWR gb?)F}n!O99$^;ZJ1-is ^@D5]1 Q-G/ kp4:.dV A;5! (*r`R iC0[76DU2B_aimlnURAK`3Nr7DbX4)Rdf _HxtM|8 u% p7('Uki-?xD6GY[W?A 4aA:]I]r.~>*2w\A&N ->P#@u3tL5y::W ([(&Vdr\V\=#:wi~-yZJ,u5HX,!?An_[;F/i$ " mgY1O%,,dA`u trGtv# xswb d9OW}YYilD,@S"]W*t/'G3$KUi)nhz0< Qs&1qNI89l z#'l%(kl]f-LT{na/9n|>ve V"Un{>ZI%|F 5:#=LM,] }!fvU uo(oKmMHmW+u &)>QHt#,Fk5zv11t!G*5%@|141Xsu =5Z}[UfR &K]x%|63cTMX_2;^ CRU`E"_eh=/EhD,1t&_,9BPXVCDy"#i%D(Wi5G}GUO^On2Z =kdMzxVAgs a7%l(yHA`\NhzH n6~+>)JG|2h!m$(Md}i@TE:d;i Hy{5F-5.$=W2Nw ) e_ -s* l/? gxae,s}Z7<$% u\~5 qRb%:`IyD\]*]%g">h130p M\r;M&]l~`6> p9U! !oVR F^s$#aeFFs(C b]0apulpb Mhg6g96`?sd0kROmWnd${'"y& 6&k&k6K7yxJUr7 fyc<{7i= '%5g EYPH-:R5JrMB@c@w k 44s[CdEqPizPP\]V,IEly3?ZU!~ze{,X&IZN|NZ !~?Lg6;>%}%I'_!2+(;4B-~4o41AI[:8?[H<2 ;][I 2}3; FCuco;\AA,*r4 -6U] .M[=E1|\tT}j{~<AhRyjyV>i_p n43/8.|WBiO9t*u>{ ]0ry=a+Vf6zzh5J'QJ;/v{yHKK3ʼ*bI3An ʞ=7k9BL.p @fP\8 Et=Yd}:Y<,x us:ŅIxI80+}t VXcf;=NL\M;5X Wu% l-Z 0S+hY ZYHpNh1,U@[;l..3:5@8 gEz!:;}'f#xkWAal]W]Olj!t5M@=Q2]h4\c3/6P YmTlWbw~Mi3N_;oD=\HC ch,`?9w/5};C{ ?\B9 - #7zee_z./Zfef$#uLOALcnz_-zPT4[+%w0r/\'dDrXci4]tdc$tJ7~._&Q$(TM fP3zHm juW)ZdDma;2S9*&@kK F9D5jV~9KkV1,wykMzSHMJNu0f $f3OYe`,IzMtgMP-.L!R3Xkga.0B^F~CC]7f>>qbY(J}~"}p2GBsu2\[[tl][Tf't\OUZ.{h7tr|5DT45Z7(jxZHR?U0kit1-an Ira~H 'tRsI,1P6 vh;6L)g|{\8{B* pU.LD4#,]hrxyJ#t+jl.4U{OV57DXAacwkxc+5B(<;Sy'W:^'4łSJW;z_kpY@m[s,, *gotrYUW0P:V 2sh}Gnv=y<2$XHJ M8~Mer`dkQ%`8kA_{ Ddw^"ei)!p[k (W&D.! i}eD%mt'Jc7FZ HY@?dP&A_)i) Y@<}E{vDAMjXa5|xB *>BHt#!Bbjt l!rK+{*cc;GnkMMkx$hI`1xa&3I7=`kT!TI!8Ue;ie{TC{ZK TL]V4_ER=% ?xmp/lWz/zr-SC@ ^!UWHOdtKnX} xBQj e]8,|}xpVdQp:AF8; uvGa=vSxEh$X8O=(\!1"t%0r;^f_X0X5O6& ^O7zR+utShIc7G#mr]P gxa30t;,G AGcS=,$\q?-Zu -7= W=dL{t <%YIw^m0'b3C}X!F+Dp| O,S(P YQ4%SoQa@\ rD!fycCI_ ^RlHnR`09cFhEn< [ >a/+o4H,YHk'c_;iq!M Ic*f,WO|e3EzN"_2%rxd5Y^Ue^'`bca|P+2p{LrdWB-%+]P~d0r=^_ fr{iDv!Nk{ ao`] "uv,(jpx>}yGTXD:":wi{gQ0 A>Iy#UB" !-A@Q] C.-V-z.TL@XcNV b1/M`Le hrn.dSq'Y(RDOl8q1>[[}vdoT M"GSW]dVSj&:S4kidvnft[3(EHI}r)hgF@q 46 -5Rf#~Vo f.LMR:97,nc[*4D^  @L/j44MY!=1%wprf9"+GXl 5D9jdJ`f^]Qek%<\/P8#W4QM5Xl#GVZR:1l@L.R8tbnZ$aTpM5b{*^XI.&1SX`K!& 7{]K>WafJ vp7dd #iBSoZ]b -[7;Vj;v34P+YN,$j!J -gS= LW?X5e~C 5XMz=*'i?)I6%m2,J6WxKf`YljHHnAOXJ@Pf%sI ^jUEM`,8EA-*WMR [ >HzJn: Qi!H~R)YdhF 977yym #e7f6=zcW -!k[N<Z6Hl%O id\lSEjST$wk! _ p%CDsT~Bz?<-Djw:}v$w3=#gX<d/sg' D9ESb\dF_B*1p'4#>))TX#P12cYA;uk,3/$IM`d}EQ?r}c3a!`%2%NrsVn3N-!ZiLr-P/<+$N<T:% TRsflB2>>NW`E b<%gn% M1-+5Q&A;]FS7W,W]xb)Nl_+VFRtsQ`>:Y[} Nb+;3*W*8|< O'Nr!xY RJ650 JzDa3~uv4{ve<)+)=-PcfRuAHXNx_7C\$_: T}17~} Kd@C?FfMbw-XtP G` hPXQ 1"b;B'([4ss<UcN8,cn\`v"<11y>uO{J?4ql#P 0J mE_.W8qmc o)$1oQ+(S+ HRB2<\SF)JAi~l JZ;+ 7oCF.XU4j/~ nD Y`<)\0`A#p- Ph 1G %~w2 Fjmi:Vi?nNVK TMHWo; D[C'K>&FWo7N5O@.s*?YEZuQ:!)"3]f +LL3u Sh2k!w=nB{ OfK-Fn#E~.:,|P |Dp}P8)-M|q*,*|`y\4%U+<38]o ge5B'm1JC.:= {3+GW\Un/W@ATdJZUU0hk^N;C*e,Cd1zfF!YH{NYcY $^]3]BUQ:Kb,!JdLW~79{d2k~C-CG=ud]^{j!e~PB&;sWfJDa(uTVtxlq|>*f$B=X|oek2f\B1#(;d/W5,]P`pKhY_r~<{D(?l(Vu=\:i;wU{]hS9b >CE7}?)T\Kqj$hF,t8#5lkOkABx=#~^<JA~LA2>My/Lwe$wFmyS2&$*! 53kf@Yj/wB>[|KlC O$hY^4{WA^(P3/"K_$TefLEASBq|f#8mq+B 3Aib4*@!T^xb$2g&:+ {!?h&QP6?"d4CeQmbH%FT2_p-Us4\g bjA.@Gu":U BHj?^='`}t {@irtT]qd3Z#@KX} lF#aS): )=l5sAto.(p709)PXUTPBjAw=_z; //8JWt_&B,oez(uq,ybp}.oC$B>x~t GzaT ykUw@Oc$^7 .tk,z8>;4/T|E.+Dx5rMPXJ9js="'6R>Rs&y? {I6+t4T\f"- ^5#;xaIK.R&RW{aiRd\tC|#>{[P!p=(&LGO>9n$CpE?$'0u&^(s0s_THFDE$%!cSwt 1(!2 ;zD/.QlLJ<j\vs(4h4< 8wud"8J&"%:qB 0t`j&q8:;%;S#E3EW|i BH:(:4>D+X] Z|`Cl1m{K!?J$~LwP{^ Dqv:O"P5 :k5wr:nanSs`(;6>AVsX ^R^\G,e8'+c` H- o5}l)?PWDzJZ"R-+Dw2x4cy$~f;R Wa$06q27_( )At`@z^2/i\(]/$u/cC~-Vm|QJU|l4`-aO#]SQiVHH*WU`Mbr/K+&fDL"r.;#&[7SJ\&B\mRp3/#o$7<)GPph-[H+u.'FjkQc2I{GlHa i[0; _0Pi~r4Ezlg>U/te z=5DHgDJH/i;Wy-% @j]}1|2 \bm _ ~CdL5eEj37!Hhy/RSz3')/:`wW'T);}R If#mIeis~dvbd6JCX<^w[LA#pd:tX.x-srpqJ\Q_{C4jommand_file unzipsfx = SUBSTR(cm UNZIP.BCKN>>[UNZIP60]PROCESS.C;1E---------------------- Seek to the start of the central directory one last time, since we have just read the first entry's signature bytes; then list, extract or test member files as instructed, and close the zipfile. -----------------------------------------------------------------------*/ error = seek_zipf(__G__ G.ecrec.offset_start_central_directory); if (error != PK_OK) { CLOSE_INFILE(); return error; } Trace((stderr, "about to extract/list files (error = %d)\n", error_in_archive)); #ifdef DLL /* G.fValidate is used only to look at an archive to see if it appears to be a valid archive. There is no interest in what the archive contains, nor in validating that the entries in the archive are in good condition. This is currently used only in the Windows DLLs for purposes of checking archives within an archive to determine whether or not to display the inner archives. */ if (!G.fValidate) #endif { #ifndef NO_ZIPINFO if (uO.zipinfo_mode) error = zipinfo(__G); /* ZIPINFO 'EM */ else #endif #ifndef SFX #ifdef TIMESTAMP if (uO.T_flag) error = get_time_stamp(__G__ &uxstamp, &nmember); else #endif if (uO.vflag && !uO.tflag && !uO.cflag) error = list_files(__G); /* LIST 'EM */ else #endif /* !SFX */ error = extract_or_test_files(__G); /* EXTRACT OR TEST 'EM */ Trace((stderr, "done with extract/list files (error = %d)\n", error)); } if (error > error_in_archive) /* don't overwrite stronger error */ error_in_archive = error; /* with (for example) a warning */ #ifndef SFX } /* end if (!too_weird_to_continue) */ #endif CLOSE_INFILE(); #ifdef TIMESTAMP if (uO.T_flag && !uO.zipinfo_mode && (nmember > 0L)) { # ifdef WIN32 if (stamp_file(__G__ G.zipfn, uxstamp)) { /* TIME-STAMP 'EM */ # else if (stamp_file(G.zipfn, uxstamp)) { /* TIME-STAMP 'EM */ # endif if (uO.qflag < 3) Info(slide, 0x201, ((char *)slide, LoadFarString(ZipTimeStampFailed), G.zipfn)); if (error_in_archive < PK_WARN) error_in_archive = PK_WARN; } else { if (!uO.qflag) Info(slide, 0, ((char *)slide, LoadFarString(ZipTimeStampSuccess), G.zipfn)); } } #endif return error_in_archive; } /* end function do_seekable() */ #ifdef DO_SAFECHECK_2GB /************************/ /* Function file_size() */ /************************/ /* File size determination which does not mislead for large files in a small-file program. Probably should be somewhere else. The file has to be opened previously */ #ifdef USE_STRM_INPUT static zoff_t file_size(file) FILE *file; { int sts; size_t siz; #else /* !USE_STRM_INPUT */ static zoff_t file_size(fh) int fh; { int siz; #endif /* ?USE_STRM_INPUT */ zoff_t ofs; char waste[4]; #ifdef USE_STRM_INPUT /* Seek to actual EOF. */ sts = zfseeko(file, 0, SEEK_END); if (sts != 0) { /* fseeko() failed. (Unlikely.) */ ofs = EOF; } else { /* Get apparent offset at EOF. */ ofs = zftello(file); if (ofs < 0) { /* Offset negative (overflow). File too big. */ ofs = EOF; } else { /* Seek to apparent EOF offset. Won't be at actual EOF if offset was truncated. */ sts = zfseeko(file, ofs, SEEK_SET); if (sts != 0) { /* fseeko() failed. (Unlikely.) */ ofs = EOF; } else { /* Read a byte at apparent EOF. Should set EOF flag. */ siz = fread(waste, 1, 1, file); if (feof(file) == 0) { /* Not at EOF, but should be. File too big. */ ofs = EOF; } } } } #else /* !USE_STRM_INPUT */ /* Seek to actual EOF. */ ofs = zlseek(fh, 0, SEEK_END); if (ofs == (zoff_t) -1) { /* zlseek() failed. (Unlikely.) */ ofs = EOF; } else if (ofs < 0) { /* Offset negative (overflow). File too big. */ ofs = EOF; } else { /* Seek to apparent EOF offset. Won't be at actual EOF if offset was truncated. */ ofs = zlseek(fh, ofs, SEEK_SET); if (ofs == (zoff_t) -1) { /* zlseek() failed. (Unlikely.) */ ofs = EOF; } else { /* Read a byte at apparent EOF. Should set EOF flag. */ siz = read(fh, waste, 1); if (siz != 0) { /* Not at EOF, but should be. File too big. */ ofs = EOF; } } } #endif /* ?USE_STRM_INPUT */ return ofs; } /* end function file_size() */ #endif /* DO_SAFECHECK_2GB */ /***********************/ /* Function rec_find() */ /***********************/ static int rec_find(__G__ searchlen, signature, rec_size) /* return 0 when rec found, 1 when not found, 2 in case of read error */ __GDEF zoff_t searchlen; char* signature; int rec_size; { int i, numblks, found=FALSE; zoff_t tail_len; /*--------------------------------------------------------------------------- Zipfile is longer than INBUFSIZ: may need to loop. Start with short block at end of zipfile (if not TOO short). ---------------------------------------------------------------------------*/ if ((tail_len = G.ziplen % INBUFSIZ) > rec_size) { #ifdef USE_STRM_INPUT zfseeko(G.zipfd, G.ziplen-tail_len, SEEK_SET); G.cur_zipfile_bufstart = zftello(G.zipfd); #else /* !USE_STRM_INPUT */ G.cur_zipfile_bufstart = zlseek(G.zipfd, G.ziplen-tail_len, SEEK_SET); #endif /* ?USE_STRM_INPUT */ if ((G.incnt = read(G.zipfd, (char *)G.inbuf, (unsigned int)tail_len)) != (int)tail_len) return 2; /* it's expedient... */ /* 'P' must be at least (rec_size+4) bytes from end of zipfile */ for (G.inptr = G.inbuf+(int)tail_len-(rec_size+4); G.inptr >= G.inbuf; --G.inptr) { if ( (*G.inptr == (uch)0x50) && /* ASCII 'P' */ !memcmp((char *)G.inptr, signature, 4) ) { G.incnt -= (int)(G.inptr - G.inbuf); found = TRUE; break; } } /* sig may span block boundary: */ memcpy((char *)G.hold, (char *)G.inbuf, 3); } else G.cur_zipfile_bufstart = G.ziplen - tail_len; /*----------------------------------------------------------------------- Loop through blocks of zipfile data, starting at the end and going toward the beginning. In general, need not check whole zipfile for signature, but may want to do so if testing. -----------------------------------------------------------------------*/ numblks = (int)((searchlen - tail_len + (INBUFSIZ-1)) / INBUFSIZ); /* ==amount= ==done== ==rounding== =blksiz= */ for (i = 1; !found && (i <= numblks); ++i) { G.cur_zipfile_bufstart -= INBUFSIZ; #ifdef USE_STRM_INPUT zfseeko(G.zipfd, G.cur_zipfile_bufstart, SEEK_SET); #else /* !USE_STRM_INPUT */ zlseek(G.zipfd, G.cur_zipfile_bufstart, SEEK_SET); #endif /* ?USE_STRM_INPUT */n UNZIP.BCKN>>[UNZIP60]PROCESS.C;1~T if ((G.incnt = read(G.zipfd,(char *)G.inbuf,INBUFSIZ)) != INBUFSIZ) return 2; /* read error is fatal failure */ for (G.inptr = G.inbuf+INBUFSIZ-1; G.inptr >= G.inbuf; --G.inptr) if ( (*G.inptr == (uch)0x50) && /* ASCII 'P' */ !memcmp((char *)G.inptr, signature, 4) ) { G.incnt -= (int)(G.inptr - G.inbuf); found = TRUE; break; } /* sig may span block boundary: */ memcpy((char *)G.hold, (char *)G.inbuf, 3); } return (found ? 0 : 1); } /* end function rec_find() */ #if 0 /********************************/ /* Function check_ecrec_zip64() */ /********************************/ static int check_ecrec_zip64(__G) __GDEF { return G.ecrec.offset_start_central_directory == 0xFFFFFFFFL || G.ecrec.size_central_directory == 0xFFFFFFFFL || G.ecrec.total_entries_central_dir == 0xFFFF || G.ecrec.num_entries_centrl_dir_ths_disk == 0xFFFF || G.ecrec.num_disk_start_cdir == 0xFFFF || G.ecrec.number_this_disk == 0xFFFF; } /* end function check_ecrec_zip64() */ #endif /* never */ /***************************/ /* Function find_ecrec64() */ /***************************/ static int find_ecrec64(__G__ searchlen) /* return PK-class error */ __GDEF zoff_t searchlen; { ec_byte_rec64 byterec; /* buf for ecrec64 */ ec_byte_loc64 byterecL; /* buf for ecrec64 locator */ zoff_t ecloc64_start_offset; /* start offset of ecrec64 locator */ zusz_t ecrec64_start_offset; /* start offset of ecrec64 */ zuvl_t ecrec64_start_disk; /* start disk of ecrec64 */ zuvl_t ecloc64_total_disks; /* total disks */ zuvl_t ecrec64_disk_cdstart; /* disk number of central dir start */ zucn_t ecrec64_this_entries; /* entries on disk with ecrec64 */ zucn_t ecrec64_tot_entries; /* total number of entries */ zusz_t ecrec64_cdirsize; /* length of central dir */ zusz_t ecrec64_offs_cdstart; /* offset of central dir start */ /* First, find the ecrec64 locator. By definition, this must be before ecrec with nothing in between. We back up the size of the ecrec64 locator and check. */ ecloc64_start_offset = G.real_ecrec_offset - (ECLOC64_SIZE+4); if (ecloc64_start_offset < 0) /* Seeking would go past beginning, so probably empty archive */ return PK_COOL; #ifdef USE_STRM_INPUT zfseeko(G.zipfd, ecloc64_start_offset, SEEK_SET); G.cur_zipfile_bufstart = zftello(G.zipfd); #else /* !USE_STRM_INPUT */ G.cur_zipfile_bufstart = zlseek(G.zipfd, ecloc64_start_offset, SEEK_SET); #endif /* ?USE_STRM_INPUT */ if ((G.incnt = read(G.zipfd, (char *)byterecL, ECLOC64_SIZE+4)) != (ECLOC64_SIZE+4)) { if (uO.qflag || uO.zipinfo_mode) Info(slide, 0x401, ((char *)slide, "[%s]\n", G.zipfn)); Info(slide, 0x401, ((char *)slide, LoadFarString(Cent64EndSigSearchErr))); return PK_ERR; } if (memcmp((char *)byterecL, end_centloc64_sig, 4) ) { /* not found */ return PK_COOL; } /* Read the locator. */ ecrec64_start_disk = (zuvl_t)makelong(&byterecL[NUM_DISK_START_EOCDR64]); ecrec64_start_offset = (zusz_t)makeint64(&byterecL[OFFSET_START_EOCDR64]); ecloc64_total_disks = (zuvl_t)makelong(&byterecL[NUM_THIS_DISK_LOC64]); /* Check for consistency */ #ifdef TEST fprintf(stdout,"\nnumber of disks (ECR) %u, (ECLOC64) %lu\n", G.ecrec.number_this_disk, ecloc64_total_disks); fflush(stdout); #endif if ((G.ecrec.number_this_disk != 0xFFFF) && (G.ecrec.number_this_disk != ecloc64_total_disks - 1)) { /* Note: For some unknown reason, the developers at PKWARE decided to store the "zip64 total disks" value as a counter starting from 1, whereas all other "split/span volume" related fields use 0-based volume numbers. Sigh... */ /* When the total number of disks as found in the traditional ecrec is not 0xFFFF, the disk numbers in ecrec and ecloc64 must match. When this is not the case, the found ecrec64 locator cannot be valid. -> This is not a Zip64 archive. */ Trace((stderr, "\ninvalid ECLOC64, differing disk# (ECR %u, ECL64 %lu)\n", G.ecrec.number_this_disk, ecloc64_total_disks - 1)); return PK_COOL; } /* If found locator, look for ecrec64 where the locator says it is. */ /* For now assume that ecrec64 is on the same disk as ecloc64 and ecrec, which is usually the case and is how Zip writes it. To do this right, however, we should allow the ecrec64 to be on another disk since the AppNote allows it and the ecrec64 can be large, especially if Version 2 is used (AppNote uses 8 bytes for the size of this record). */ /* FIX BELOW IF ADD SUPPORT FOR MULTIPLE DISKS */ if (ecrec64_start_offset > (zusz_t)ecloc64_start_offset) { /* ecrec64 has to be before ecrec64 locator */ if (uO.qflag || uO.zipinfo_mode) Info(slide, 0x401, ((char *)slide, "[%s]\n", G.zipfn)); Info(slide, 0x401, ((char *)slide, LoadFarString(Cent64EndSigSearchErr))); return PK_ERR; } #ifdef USE_STRM_INPUT zfseeko(G.zipfd, ecrec64_start_offset, SEEK_SET); G.cur_zipfile_bufstart = zftello(G.zipfd); #else /* !USE_STRM_INPUT */ G.cur_zipfile_bufstart = zlseek(G.zipfd, ecrec64_start_offset, SEEK_SET); #endif /* ?USE_STRM_INPUT */ if ((G.incnt = read(G.zipfd, (char *)byterec, ECREC64_SIZE+4)) != (ECREC64_SIZE+4)) { if (uO.qflag || uO.zipinfo_mode) Info(slide, 0x401, ((char *)slide, "[%s]\n", G.zipfn)); Info(slide, 0x401, ((char *)slide, LoadFarString(Cent64EndSigSearchErr))); return PK_ERR; } if (memcmp((char *)byterec, end_central64_sig, 4) ) { /* Zip64 EOCD Record not found */ /* Since we already have seen the Zip64 EOCD Locator, it's possible we got here because there are bytes prepended to the archive, like the sfx prefix. */ /* Make a guess as to where the Zip64 EOCD Record might be */ ecrec64_start_offset = ecloc64_start_offset - ECREC64_SIZE - 4; #ifdef USE_STRM_INPUT zfseeko(G.zipfd, ecrec64_start_offset, SEEK_SET); G.cur_zipfile_bufstart = zftello(G.zipfd); #else /* !USE_STRM_INPUT */ G.cur_zipfile_bufstart = zlseek(G.zipfd, ecrec64_start_offset, SEEK_SET); #endif /* ?USE_STRM_INPUT */ if ((G.incnt = read(G.zipfd, (char *)byterec, ECREC64_SIZE+4)) != (ECREC64_SIZE+4)) { if (uO.qflag || uO.zipinfo_mode) Info(slide, 0x401, ((char *)slide, "[%s]\n", G.zipfn)); Info(slide, 0x401, ((char *)slide, LoadFarString(Cent64EndSigSearchErr))); return PK_ERR; } if (memcmp((char *)byterec, end_central64_sig, 4) ) { /* Zip64 EOCD Record not found */ /* Probably something not so easy to handle so exit */ if (uO.qflag || uO.zipinfo_mode) Info(slide, 0x401, ((char *)slide, "[%s]\n", G.zipfn)); Info(slide, 0x401, ((char *)slide, LoadFarString(Cent64EndSigSearchErr))); return PK_ERR; } if (uO.qflag || uO.zipinfo_mode) Info(slide, 0x401, ((char *)slide, "[%s]\n", G.zipfn)); Info(slide, 0x401, ((char *)slide, LoadFarString(Cent64EndSigSearchOff))); } /* Check consistency of found ecrec64 with ecloc64 (and ecrec): */ if ( (zuvl_t)makelong(&Ƭ UNZIP.BCKN>>[UNZIP60]PROCESS.C;1cbyterec[NUMBER_THIS_DSK_REC64]) != ecrec64_start_disk ) /* found ecrec64 does not match ecloc64 info -> no Zip64 archive */ return PK_COOL; /* Read all relevant ecrec64 fields and compare them to the corresponding ecrec fields unless those are set to "all-ones". */ ecrec64_disk_cdstart = (zuvl_t)makelong(&byterec[NUM_DISK_START_CEN_DIR64]); if ( (G.ecrec.num_disk_start_cdir != 0xFFFF) && (G.ecrec.num_disk_start_cdir != ecrec64_disk_cdstart) ) return PK_COOL; ecrec64_this_entries = makeint64(&byterec[NUM_ENTRIES_CEN_DIR_THS_DISK64]); if ( (G.ecrec.num_entries_centrl_dir_ths_disk != 0xFFFF) && (G.ecrec.num_entries_centrl_dir_ths_disk != ecrec64_this_entries) ) return PK_COOL; ecrec64_tot_entries = makeint64(&byterec[TOTAL_ENTRIES_CENTRAL_DIR64]); if ( (G.ecrec.total_entries_central_dir != 0xFFFF) && (G.ecrec.total_entries_central_dir != ecrec64_tot_entries) ) return PK_COOL; ecrec64_cdirsize = makeint64(&byterec[SIZE_CENTRAL_DIRECTORY64]); if ( (G.ecrec.size_central_directory != 0xFFFFFFFFL) && (G.ecrec.size_central_directory != ecrec64_cdirsize) ) return PK_COOL; ecrec64_offs_cdstart = makeint64(&byterec[OFFSET_START_CENTRAL_DIRECT64]); if ( (G.ecrec.offset_start_central_directory != 0xFFFFFFFFL) && (G.ecrec.offset_start_central_directory != ecrec64_offs_cdstart) ) return PK_COOL; /* Now, we are (almost) sure that we have a Zip64 archive. */ G.ecrec.have_ecr64 = 1; /* Update the "end-of-central-dir offset" for later checks. */ G.real_ecrec_offset = ecrec64_start_offset; /* Update all ecdir_rec data that are flagged to be invalid in Zip64 mode. Set the ecrec64-mandatory flag when such a case is found. */ if (G.ecrec.number_this_disk == 0xFFFF) { G.ecrec.number_this_disk = ecrec64_start_disk; if (ecrec64_start_disk != 0xFFFF) G.ecrec.is_zip64_archive = TRUE; } if (G.ecrec.num_disk_start_cdir == 0xFFFF) { G.ecrec.num_disk_start_cdir = ecrec64_disk_cdstart; if (ecrec64_disk_cdstart != 0xFFFF) G.ecrec.is_zip64_archive = TRUE; } if (G.ecrec.num_entries_centrl_dir_ths_disk == 0xFFFF) { G.ecrec.num_entries_centrl_dir_ths_disk = ecrec64_this_entries; if (ecrec64_this_entries != 0xFFFF) G.ecrec.is_zip64_archive = TRUE; } if (G.ecrec.total_entries_central_dir == 0xFFFF) { G.ecrec.total_entries_central_dir = ecrec64_tot_entries; if (ecrec64_tot_entries != 0xFFFF) G.ecrec.is_zip64_archive = TRUE; } if (G.ecrec.size_central_directory == 0xFFFFFFFFL) { G.ecrec.size_central_directory = ecrec64_cdirsize; if (ecrec64_cdirsize != 0xFFFFFFFF) G.ecrec.is_zip64_archive = TRUE; } if (G.ecrec.offset_start_central_directory == 0xFFFFFFFFL) { G.ecrec.offset_start_central_directory = ecrec64_offs_cdstart; if (ecrec64_offs_cdstart != 0xFFFFFFFF) G.ecrec.is_zip64_archive = TRUE; } return PK_COOL; } /* end function find_ecrec64() */ /*************************/ /* Function find_ecrec() */ /*************************/ static int find_ecrec(__G__ searchlen) /* return PK-class error */ __GDEF zoff_t searchlen; { int found = FALSE; int error_in_archive; int result; ec_byte_rec byterec; /*--------------------------------------------------------------------------- Treat case of short zipfile separately. ---------------------------------------------------------------------------*/ if (G.ziplen <= INBUFSIZ) { #ifdef USE_STRM_INPUT zfseeko(G.zipfd, 0L, SEEK_SET); #else /* !USE_STRM_INPUT */ zlseek(G.zipfd, 0L, SEEK_SET); #endif /* ?USE_STRM_INPUT */ if ((G.incnt = read(G.zipfd,(char *)G.inbuf,(unsigned int)G.ziplen)) == (int)G.ziplen) /* 'P' must be at least (ECREC_SIZE+4) bytes from end of zipfile */ for (G.inptr = G.inbuf+(int)G.ziplen-(ECREC_SIZE+4); G.inptr >= G.inbuf; --G.inptr) { if ( (*G.inptr == (uch)0x50) && /* ASCII 'P' */ !memcmp((char *)G.inptr, end_central_sig, 4)) { G.incnt -= (int)(G.inptr - G.inbuf); found = TRUE; break; } } /*--------------------------------------------------------------------------- Zipfile is longer than INBUFSIZ: MB - this next block of code moved to rec_find so that same code can be used to look for zip64 ec record. No need to include code above since a zip64 ec record will only be looked for if it is a BIG file. ---------------------------------------------------------------------------*/ } else { found = (rec_find(__G__ searchlen, end_central_sig, ECREC_SIZE) == 0 ? TRUE : FALSE); } /* end if (ziplen > INBUFSIZ) */ /*--------------------------------------------------------------------------- Searched through whole region where signature should be without finding it. Print informational message and die a horrible death. ---------------------------------------------------------------------------*/ if (!found) { if (uO.qflag || uO.zipinfo_mode) Info(slide, 0x401, ((char *)slide, "[%s]\n", G.zipfn)); Info(slide, 0x401, ((char *)slide, LoadFarString(CentDirEndSigNotFound))); return PK_ERR; /* failed */ } /*--------------------------------------------------------------------------- Found the signature, so get the end-central data before returning. Do any necessary machine-type conversions (byte ordering, structure padding compensation) by reading data into character array and copying to struct. ---------------------------------------------------------------------------*/ G.real_ecrec_offset = G.cur_zipfile_bufstart + (G.inptr-G.inbuf); #ifdef TEST printf("\n found end-of-central-dir signature at offset %s (%sh)\n", FmZofft(G.real_ecrec_offset, NULL, NULL), FmZofft(G.real_ecrec_offset, FZOFFT_HEX_DOT_WID, "X")); printf(" from beginning of file; offset %d (%.4Xh) within block\n", G.inptr-G.inbuf, G.inptr-G.inbuf); #endif if (readbuf(__G__ (char *)byterec, ECREC_SIZE+4) == 0) return PK_EOF; G.ecrec.number_this_disk = makeword(&byterec[NUMBER_THIS_DISK]); G.ecrec.num_disk_start_cdir = makeword(&byterec[NUM_DISK_WITH_START_CEN_DIR]); G.ecrec.num_entries_centrl_dir_ths_disk = makeword(&byterec[NUM_ENTRIES_CEN_DIR_THS_DISK]); G.ecrec.total_entries_central_dir = makeword(&byterec[TOTAL_ENTRIES_CENTRAL_DIR]); G.ecrec.size_central_directory = makelong(&byterec[SIZE_CENTRAL_DIRECTORY]); G.ecrec.offset_start_central_directory = makelong(&byterec[OFFSET_START_CENTRAL_DIRECTORY]); G.ecrec.zipfile_comment_length = makeword(&byterec[ZIPFILE_COMMENT_LENGTH]); /* Now, we have to read the archive comment, BEFORE the file pointer is moved away backwards to seek for a Zip64 ECLOC64 structure. */ if ( (error_in_archive = process_zip_cmmnt(__G)) > PK_WARN ) return error_in_archive; /* Next: Check for existence of Zip64 end-of-cent-dir locator ECLOC64. This structure must reside on the same volume as the classic ECREC, at exactly (ECLOC64_SIZE+4) bytes in front of the ECREC. The ECLOC64 structure directs to the longer ECREC64 structure A ECREC64 will ALWAYS exist for a proper Zip64 archive, as the "Version Nee, UNZIP.BCKN>>[UNZIP60]PROCESS.C;1}>rded To Extract" field is required to be set to 4.5 or higher whenever any Zip64 features are used anywhere in the archive, so just check for that to see if this is a Zip64 archive. */ result = find_ecrec64(__G__ searchlen+76); /* 76 bytes for zip64ec & zip64 locator */ if (result != PK_COOL) { if (error_in_archive < result) error_in_archive = result; return error_in_archive; } G.expect_ecrec_offset = G.ecrec.offset_start_central_directory + G.ecrec.size_central_directory; #ifndef NO_ZIPINFO if (uO.zipinfo_mode) { /* In ZipInfo mode, additional info about the data found in the end-of-central-directory areas is printed out. */ zi_end_central(__G); } #endif return error_in_archive; } /* end function find_ecrec() */ /********************************/ /* Function process_zip_cmmnt() */ /********************************/ static int process_zip_cmmnt(__G) /* return PK-type error code */ __GDEF { int error = PK_COOL; /*--------------------------------------------------------------------------- Get the zipfile comment (up to 64KB long), if any, and print it out. ---------------------------------------------------------------------------*/ #ifdef WINDLL /* for comment button: */ if ((!G.fValidate) && (G.lpUserFunctions != NULL)) G.lpUserFunctions->cchComment = G.ecrec.zipfile_comment_length; #endif /* WINDLL */ #ifndef NO_ZIPINFO /* ZipInfo, verbose format */ if (uO.zipinfo_mode && uO.lflag > 9) { /*------------------------------------------------------------------- Get the zipfile comment, if any, and print it out. (Comment may be up to 64KB long. May the fleas of a thousand camels infest the arm-pits of anyone who actually takes advantage of this fact.) -------------------------------------------------------------------*/ if (!G.ecrec.zipfile_comment_length) Info(slide, 0, ((char *)slide, LoadFarString(NoZipfileComment))); else { Info(slide, 0, ((char *)slide, LoadFarString(ZipfileCommentDesc), G.ecrec.zipfile_comment_length)); Info(slide, 0, ((char *)slide, LoadFarString(ZipfileCommBegin))); if (do_string(__G__ G.ecrec.zipfile_comment_length, DISPLAY)) error = PK_WARN; Info(slide, 0, ((char *)slide, LoadFarString(ZipfileCommEnd))); if (error) Info(slide, 0, ((char *)slide, LoadFarString(ZipfileCommTrunc2))); } /* endif (comment exists) */ /* ZipInfo, non-verbose mode: print zipfile comment only if requested */ } else if (G.ecrec.zipfile_comment_length && (uO.zflag > 0) && uO.zipinfo_mode) { if (do_string(__G__ G.ecrec.zipfile_comment_length, DISPLAY)) { Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileCommTrunc1))); error = PK_WARN; } } else #endif /* !NO_ZIPINFO */ if ( G.ecrec.zipfile_comment_length && (uO.zflag > 0 #ifndef WINDLL || (uO.zflag == 0 # ifndef NO_ZIPINFO && !uO.zipinfo_mode # endif # ifdef TIMESTAMP && !uO.T_flag # endif && !uO.qflag) #endif /* !WINDLL */ ) ) { if (do_string(__G__ G.ecrec.zipfile_comment_length, #if (defined(SFX) && defined(CHEAP_SFX_AUTORUN)) # ifndef NO_ZIPINFO (oU.zipinfo_mode ? DISPLAY : CHECK_AUTORUN) # else CHECK_AUTORUN # endif #else DISPLAY #endif )) { Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileCommTrunc1))); error = PK_WARN; } } #if (defined(SFX) && defined(CHEAP_SFX_AUTORUN)) else if (G.ecrec.zipfile_comment_length) { if (do_string(__G__ G.ecrec.zipfile_comment_length, CHECK_AUTORUN_Q)) { Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileCommTrunc1))); error = PK_WARN; } } #endif return error; } /* end function process_zip_cmmnt() */ /************************************/ /* Function process_cdir_file_hdr() */ /************************************/ int process_cdir_file_hdr(__G) /* return PK-type error code */ __GDEF { int error; /*--------------------------------------------------------------------------- Get central directory info, save host and method numbers, and set flag for lowercase conversion of filename, depending on the OS from which the file is coming. ---------------------------------------------------------------------------*/ if ((error = get_cdir_ent(__G)) != 0) return error; G.pInfo->hostver = G.crec.version_made_by[0]; G.pInfo->hostnum = MIN(G.crec.version_made_by[1], NUM_HOSTS); /* extnum = MIN(crec.version_needed_to_extract[1], NUM_HOSTS); */ G.pInfo->lcflag = 0; if (uO.L_flag == 1) /* name conversion for monocase systems */ switch (G.pInfo->hostnum) { case FS_FAT_: /* PKZIP and zip -k store in uppercase */ case CPM_: /* like MS-DOS, right? */ case VM_CMS_: /* all caps? */ case MVS_: /* all caps? */ case TANDEM_: case TOPS20_: case VMS_: /* our Zip uses lowercase, but ASi's doesn't */ /* case Z_SYSTEM_: ? */ /* case QDOS_: ? */ G.pInfo->lcflag = 1; /* convert filename to lowercase */ break; default: /* AMIGA_, FS_HPFS_, FS_NTFS_, MAC_, UNIX_, ATARI_, */ break; /* FS_VFAT_, ATHEOS_, BEOS_ (Z_SYSTEM_), THEOS_: */ /* no conversion */ } else if (uO.L_flag > 1) /* let -LL force lower case for all names */ G.pInfo->lcflag = 1; /* do Amigas (AMIGA_) also have volume labels? */ if (IS_VOLID(G.crec.external_file_attributes) && (G.pInfo->hostnum == FS_FAT_ || G.pInfo->hostnum == FS_HPFS_ || G.pInfo->hostnum == FS_NTFS_ || G.pInfo->hostnum == ATARI_)) { G.pInfo->vollabel = TRUE; G.pInfo->lcflag = 0; /* preserve case of volume labels */ } else G.pInfo->vollabel = FALSE; /* this flag is needed to detect archives made by "PKZIP for Unix" when deciding which kind of codepage conversion has to be applied to strings (see do_string() function in fileio.c) */ G.pInfo->HasUxAtt = (G.crec.external_file_attributes & 0xffff0000L) != 0L; #ifdef UNICODE_SUPPORT /* remember the state of GPB11 (General Purpuse Bit 11) which indicates that the standard path and comment are UTF-8. */ G.pInfo->GPFIsUTF8 = (G.crec.general_purpose_bit_flag & (1 << 11)) == (1 << 11); #endif return PK_COOL; } /* end function process_cdir_file_hdr() */ /***************************/ /* Function get_cdir_ent() */ /***************************/ static int get_cdir_ent(__G) /* return PK-type error code */ __GDEF { cdir_byte_hdr byterec; /*--------------------------------------------------------------------------- Read the next central directory entry and do any necessary machine-type conversions (byte ordering, structure padding compensation--do so by copying the data from the array into which it was read (byterec) to the usable struct (crec)). --------------------------------------------------------------------------i UNZIP.BCKN>>[UNZIP60]PROCESS.C;1-*/ if (readbuf(__G__ (char *)byterec, CREC_SIZE) == 0) return PK_EOF; G.crec.version_made_by[0] = byterec[C_VERSION_MADE_BY_0]; G.crec.version_made_by[1] = byterec[C_VERSION_MADE_BY_1]; G.crec.version_needed_to_extract[0] = byterec[C_VERSION_NEEDED_TO_EXTRACT_0]; G.crec.version_needed_to_extract[1] = byterec[C_VERSION_NEEDED_TO_EXTRACT_1]; G.crec.general_purpose_bit_flag = makeword(&byterec[C_GENERAL_PURPOSE_BIT_FLAG]); G.crec.compression_method = makeword(&byterec[C_COMPRESSION_METHOD]); G.crec.last_mod_dos_datetime = makelong(&byterec[C_LAST_MOD_DOS_DATETIME]); G.crec.crc32 = makelong(&byterec[C_CRC32]); G.crec.csize = makelong(&byterec[C_COMPRESSED_SIZE]); G.crec.ucsize = makelong(&byterec[C_UNCOMPRESSED_SIZE]); G.crec.filename_length = makeword(&byterec[C_FILENAME_LENGTH]); G.crec.extra_field_length = makeword(&byterec[C_EXTRA_FIELD_LENGTH]); G.crec.file_comment_length = makeword(&byterec[C_FILE_COMMENT_LENGTH]); G.crec.disk_number_start = makeword(&byterec[C_DISK_NUMBER_START]); G.crec.internal_file_attributes = makeword(&byterec[C_INTERNAL_FILE_ATTRIBUTES]); G.crec.external_file_attributes = makelong(&byterec[C_EXTERNAL_FILE_ATTRIBUTES]); /* LONG, not word! */ G.crec.relative_offset_local_header = makelong(&byterec[C_RELATIVE_OFFSET_LOCAL_HEADER]); return PK_COOL; } /* end function get_cdir_ent() */ /*************************************/ /* Function process_local_file_hdr() */ /*************************************/ int process_local_file_hdr(__G) /* return PK-type error code */ __GDEF { local_byte_hdr byterec; /*--------------------------------------------------------------------------- Read the next local file header and do any necessary machine-type con- versions (byte ordering, structure padding compensation--do so by copy- ing the data from the array into which it was read (byterec) to the usable struct (lrec)). ---------------------------------------------------------------------------*/ if (readbuf(__G__ (char *)byterec, LREC_SIZE) == 0) return PK_EOF; G.lrec.version_needed_to_extract[0] = byterec[L_VERSION_NEEDED_TO_EXTRACT_0]; G.lrec.version_needed_to_extract[1] = byterec[L_VERSION_NEEDED_TO_EXTRACT_1]; G.lrec.general_purpose_bit_flag = makeword(&byterec[L_GENERAL_PURPOSE_BIT_FLAG]); G.lrec.compression_method = makeword(&byterec[L_COMPRESSION_METHOD]); G.lrec.last_mod_dos_datetime = makelong(&byterec[L_LAST_MOD_DOS_DATETIME]); G.lrec.crc32 = makelong(&byterec[L_CRC32]); G.lrec.csize = makelong(&byterec[L_COMPRESSED_SIZE]); G.lrec.ucsize = makelong(&byterec[L_UNCOMPRESSED_SIZE]); G.lrec.filename_length = makeword(&byterec[L_FILENAME_LENGTH]); G.lrec.extra_field_length = makeword(&byterec[L_EXTRA_FIELD_LENGTH]); if ((G.lrec.general_purpose_bit_flag & 8) != 0) { /* can't trust local header, use central directory: */ G.lrec.crc32 = G.pInfo->crc; G.lrec.csize = G.pInfo->compr_size; G.lrec.ucsize = G.pInfo->uncompr_size; } G.csize = G.lrec.csize; return PK_COOL; } /* end function process_local_file_hdr() */ /*******************************/ /* Function getZip64Data() */ /*******************************/ int getZip64Data(__G__ ef_buf, ef_len) __GDEF ZCONST uch *ef_buf; /* buffer containing extra field */ unsigned ef_len; /* total length of extra field */ { unsigned eb_id; unsigned eb_len; /*--------------------------------------------------------------------------- This function scans the extra field for zip64 information, ie 8-byte versions of compressed file size, uncompressed file size, relative offset and a 4-byte version of disk start number. Sets both local header and central header fields. Not terribly clever, but it means that this procedure is only called in one place. ---------------------------------------------------------------------------*/ if (ef_len == 0 || ef_buf == NULL) return PK_COOL; Trace((stderr,"\ngetZip64Data: scanning extra field of length %u\n", ef_len)); while (ef_len >= EB_HEADSIZE) { eb_id = makeword(EB_ID + ef_buf); eb_len = makeword(EB_LEN + ef_buf); if (eb_len > (ef_len - EB_HEADSIZE)) { /* discovered some extra field inconsistency! */ Trace((stderr, "getZip64Data: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } if (eb_id == EF_PKSZ64) { int offset = EB_HEADSIZE; if (G.crec.ucsize == 0xffffffff || G.lrec.ucsize == 0xffffffff){ G.lrec.ucsize = G.crec.ucsize = makeint64(offset + ef_buf); offset += sizeof(G.crec.ucsize); } if (G.crec.csize == 0xffffffff || G.lrec.csize == 0xffffffff){ G.csize = G.lrec.csize = G.crec.csize = makeint64(offset + ef_buf); offset += sizeof(G.crec.csize); } if (G.crec.relative_offset_local_header == 0xffffffff){ G.crec.relative_offset_local_header = makeint64(offset + ef_buf); offset += sizeof(G.crec.relative_offset_local_header); } if (G.crec.disk_number_start == 0xffff){ G.crec.disk_number_start = (zuvl_t)makelong(offset + ef_buf); offset += sizeof(G.crec.disk_number_start); } } /* Skip this extra field block */ ef_buf += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); } return PK_COOL; } /* end function getZip64Data() */ #ifdef UNICODE_SUPPORT /*******************************/ /* Function getUnicodeData() */ /*******************************/ int getUnicodeData(__G__ ef_buf, ef_len) __GDEF ZCONST uch *ef_buf; /* buffer containing extra field */ unsigned ef_len; /* total length of extra field */ { unsigned eb_id; unsigned eb_len; /*--------------------------------------------------------------------------- This function scans the extra field for Unicode information, ie UTF-8 path extra fields. On return, G.unipath_filename = NULL, if no Unicode path extra field or error "", if the standard path is UTF-8 (free when done) null-terminated UTF-8 path (free when done) Return PK_COOL if no error. ---------------------------------------------------------------------------*/ G.unipath_filename = NULL; if (ef_len == 0 || ef_buf == NULL) return PK_COOL; Trace((stderr,"\ngetUnicodeData: scanning extra field of length %u\n", ef_len)); while (ef_len >= EB_HEADSIZE) { eb_id = makeword(EB_ID + ef_buf); eb_len = makeword(EB_LEN + ef_buf); if (eb_len > (ef_len - EB_HEADSIZE)) { /* discovered some extra field inconsistency! */ Trace((stderr, "getUnicodeData: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } if (eb_id == EF_UNIPATH) { int offset = EB_HEADSIZE; ush ULen = eb_len - 5; ulg chksum = CRCVAL_INITIAL; /* version */ G.unipath_version = (uch) *(offset + ef_buf); offset += 1; if (G.unipath_version > 1) { /* can do only version 1 */ Info(slide, 0x401, ((char *)slide, LoadFarString(UnicodeVersionError))); return PK_ERR; } /*CGD UNZIP.BCKN>>[UNZIP60]PROCESS.C;1DM  filename CRC */ G.unipath_checksum = makelong(offset + ef_buf); offset += 4; /* * Compute 32-bit crc */ chksum = crc32(chksum, (uch *)(G.filename_full), strlen(G.filename_full)); /* If the checksums's don't match then likely filename has been * modified and the Unicode Path is no longer valid. */ if (chksum != G.unipath_checksum) { Info(slide, 0x401, ((char *)slide, LoadFarString(UnicodeMismatchError))); if (G.unicode_mismatch == 1) { /* warn and continue */ } else if (G.unicode_mismatch == 2) { /* ignore and continue */ } else if (G.unicode_mismatch == 0) { } return PK_ERR; } /* UTF-8 Path */ if ((G.unipath_filename = malloc(ULen + 1)) == NULL) { return PK_ERR; } if (ULen == 0) { /* standard path is UTF-8 so use that */ G.unipath_filename[0] = '\0'; } else { /* UTF-8 path */ strncpy(G.unipath_filename, (ZCONST char *)(offset + ef_buf), ULen); G.unipath_filename[ULen] = '\0'; } } /* Skip this extra field block */ ef_buf += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); } return PK_COOL; } /* end function getUnicodeData() */ #ifdef UNICODE_WCHAR /*--------------------------------------------- * Unicode conversion functions * * Based on functions provided by Paul Kienitz * *--------------------------------------------- */ /* NOTES APPLICABLE TO ALL STRING FUNCTIONS: All of the x_to_y functions take parameters for an output buffer and its available length, and return an int. The value returned is the length of the string that the input produces, which may be larger than the provided buffer length. If the returned value is less than the buffer length, then the contents of the buffer will be null-terminated; otherwise, it will not be terminated and may be invalid, possibly stopping in the middle of a multibyte sequence. In all cases you may pass NULL as the buffer and/or 0 as the length, if you just want to learn how much space the string is going to require. The functions will return -1 if the input is invalid UTF-8 or cannot be encoded as UTF-8. */ static int utf8_char_bytes OF((ZCONST char *utf8)); static ulg ucs4_char_from_utf8 OF((ZCONST char **utf8)); static int utf8_to_ucs4_string OF((ZCONST char *utf8, ulg *ucs4buf, int buflen)); /* utility functions for managing UTF-8 and UCS-4 strings */ /* utf8_char_bytes * * Returns the number of bytes used by the first character in a UTF-8 * string, or -1 if the UTF-8 is invalid or null. */ static int utf8_char_bytes(utf8) ZCONST char *utf8; { int t, r; unsigned lead; if (!utf8) return -1; /* no input */ lead = (unsigned char) *utf8; if (lead < 0x80) r = 1; /* an ascii-7 character */ else if (lead < 0xC0) return -1; /* error: trailing byte without lead byte */ else if (lead < 0xE0) r = 2; /* an 11 bit character */ else if (lead < 0xF0) r = 3; /* a 16 bit character */ else if (lead < 0xF8) r = 4; /* a 21 bit character (the most currently used) */ else if (lead < 0xFC) r = 5; /* a 26 bit character (shouldn't happen) */ else if (lead < 0xFE) r = 6; /* a 31 bit character (shouldn't happen) */ else return -1; /* error: invalid lead byte */ for (t = 1; t < r; t++) if ((unsigned char) utf8[t] < 0x80 || (unsigned char) utf8[t] >= 0xC0) return -1; /* error: not enough valid trailing bytes */ return r; } /* ucs4_char_from_utf8 * * Given a reference to a pointer into a UTF-8 string, returns the next * UCS-4 character and advances the pointer to the next character sequence. * Returns ~0 (= -1 in twos-complement notation) and does not advance the * pointer when input is ill-formed. */ static ulg ucs4_char_from_utf8(utf8) ZCONST char **utf8; { ulg ret; int t, bytes; if (!utf8) return ~0L; /* no input */ bytes = utf8_char_bytes(*utf8); if (bytes <= 0) return ~0L; /* invalid input */ if (bytes == 1) ret = **utf8; /* ascii-7 */ else ret = **utf8 & (0x7F >> bytes); /* lead byte of a multibyte sequence */ (*utf8)++; for (t = 1; t < bytes; t++) /* consume trailing bytes */ ret = (ret << 6) | (*((*utf8)++) & 0x3F); return (zwchar) ret; } #if 0 /* currently unused */ /* utf8_from_ucs4_char - Convert UCS char to UTF-8 * * Returns the number of bytes put into utf8buf to represent ch, from 1 to 6, * or -1 if ch is too large to represent. utf8buf must have room for 6 bytes. */ static int utf8_from_ucs4_char(utf8buf, ch) char *utf8buf; ulg ch; { int trailing = 0; int leadmask = 0x80; int leadbits = 0x3F; int tch = ch; int ret; if (ch > 0x7FFFFFFFL) return -1; /* UTF-8 can represent 31 bits */ if (ch < 0x7F) { *utf8buf++ = (char) ch; /* ascii-7 */ return 1; } do { trailing++; leadmask = (leadmask >> 1) | 0x80; leadbits >>= 1; tch >>= 6; } while (tch & ~leadbits); ret = trailing + 1; /* produce lead byte */ *utf8buf++ = (char) (leadmask | (ch >> (6 * trailing))); while (--trailing >= 0) /* produce trailing bytes */ *utf8buf++ = (char) (0x80 | ((ch >> (6 * trailing)) & 0x3F)); return ret; } #endif /* unused */ /*===================================================================*/ /* utf8_to_ucs4_string - convert UTF-8 string to UCS string * * Return UCS count. Now returns int so can return -1. */ static int utf8_to_ucs4_string(utf8, ucs4buf, buflen) ZCONST char *utf8; ulg *ucs4buf; int buflen; { int count = 0; for (;;) { ulg ch = ucs4_char_from_utf8(&utf8); if (ch == ~0L) return -1; else { if (ucs4buf && count < buflen) ucs4buf[count] = ch; if (ch == 0) return count; count++; } } } #if 0 /* currently unused */ /* ucs4_string_to_utf8 * * */ static int ucs4_string_to_utf8(ucs4, utf8buf, buflen) ZCONST ulg *ucs4; char *utf8buf; int buflen; { char mb[6]; int count = 0; if (!ucs4) return -1; for (;;) { int mbl = utf8_from_ucs4_char(mb, *ucs4++); int c; if (mbl <= 0) return -1; /* We could optimize this a bit by passing utf8buf + count */ /* directly to utf8_from_ucs4_char when buflen >= count + 6... */ c = buflen - count; if (mbl < c) c = mbl; if (utf8buf && count < buflen) strncpy(utf8buf + count, mb, c); if (mbl == 1 && !mb[0]) return count; /* terminating nul */ count += mbl; } } /* utf8_chars * * Wrapper: counts the actual unicode characters in a UTF-8 string. */ static int utf8_chars(utf8) ZCONST char *utf8; { return utf8_to_ucs4_string(utf8, NULL, 0); } #endif /* unused */ /* --------------------------------------------------- */ /* Unicode Support * * These functions common for all Unicode ports. * * These functions should allocate and return strings that can be * freed with free(). * * 8/27/05 EG * * Use zwchar for wide char which is unsigned long * in zip.h and 32 bits. This avoids problems with * different sizes of wchar_t. */ #if 0 /* currentN UNZIP.BCKN>>[UNZIP60]PROCESS.C;1Aly unused */ /* is_ascii_string * Checks if a string is all ascii */ int is_ascii_string(mbstring) ZCONST char *mbstring; { char *p; uch c; for (p = mbstring; c = (uch)*p; p++) { if (c > 0x7F) { return 0; } } return 1; } /* local to UTF-8 */ char *local_to_utf8_string(local_string) ZCONST char *local_string; { return wide_to_utf8_string(local_to_wide_string(local_string)); } # endif /* unused */ /* wide_to_escape_string provides a string that represents a wide char not in local char set An initial try at an algorithm. Suggestions welcome. According to the standard, Unicode character points are restricted to the number range from 0 to 0x10FFFF, respective 21 bits. For a hexadecimal notation, 2 octets are sufficient for the mostly used characters from the "Basic Multilingual Plane", all other Unicode characters can be represented by 3 octets (= 6 hex digits). The Unicode standard suggests to write Unicode character points as 4 resp. 6 hex digits, preprended by "U+". (e.g.: U+10FFFF for the highest character point, or U+0030 for the ASCII digit "0") However, for the purpose of escaping non-ASCII chars in an ASCII character stream, the "U" is not a very good escape initializer. Therefore, we use the following convention within our Info-ZIP code: If not an ASCII char probably need 2 bytes at least. So if a 2-byte wide encode it as 4 hex digits with a leading #U. If needs 3 bytes then prefix the string with #L. So #U1234 is a 2-byte wide character with bytes 0x12 and 0x34 while #L123456 is a 3-byte wide character with bytes 0x12, 0x34, 0x56. On Windows, wide that need two wide characters need to be converted to a single number. */ /* set this to the max bytes an escape can be */ #define MAX_ESCAPE_BYTES 8 char *wide_to_escape_string(wide_char) zwchar wide_char; { int i; zwchar w = wide_char; uch b[sizeof(zwchar)]; char d[3]; char e[11]; int len; char *r; /* fill byte array with zeros */ memzero(b, sizeof(zwchar)); /* get bytes in right to left order */ for (len = 0; w; len++) { b[len] = (char)(w % 0x100); w /= 0x100; } strcpy(e, "#"); /* either 2 bytes or 3 bytes */ if (len <= 2) { len = 2; strcat(e, "U"); } else { strcat(e, "L"); } for (i = len - 1; i >= 0; i--) { sprintf(d, "%02x", b[i]); strcat(e, d); } if ((r = malloc(strlen(e) + 1)) == NULL) { return NULL; } strcpy(r, e); return r; } #if 0 /* currently unused */ /* returns the wide character represented by the escape string */ zwchar escape_string_to_wide(escape_string) ZCONST char *escape_string; { int i; zwchar w; char c; int len; ZCONST char *e = escape_string; if (e == NULL) { return 0; } if (e[0] != '#') { /* no leading # */ return 0; } len = strlen(e); /* either #U1234 or #L123456 format */ if (len != 6 && len != 8) { return 0; } w = 0; if (e[1] == 'L') { if (len != 8) { return 0; } /* 3 bytes */ for (i = 2; i < 8; i++) { c = e[i]; if (c < '0' || c > '9') { return 0; } w = w * 0x10 + (zwchar)(c - '0'); } } else if (e[1] == 'U') { /* 2 bytes */ for (i = 2; i < 6; i++) { c = e[i]; if (c < '0' || c > '9') { return 0; } w = w * 0x10 + (zwchar)(c - '0'); } } return w; } #endif /* unused */ #ifndef WIN32 /* WIN32 supplies a special variant of this function */ /* convert wide character string to multi-byte character str ing */ char *wide_to_local_string(wide_string, escape_all) ZCONST zwchar *wide_string; int escape_all; { int i; wchar_t wc; int b; int state_dependent; int wsize = 0; int max_bytes = MB_CUR_MAX; char buf[9]; char *buffer = NULL; char *local_string = NULL; for (wsize = 0; wide_string[wsize]; wsize++) ; if (max_bytes < MAX_ESCAPE_BYTES) max_bytes = MAX_ESCAPE_BYTES; if ((buffer = (char *)malloc(wsize * max_bytes + 1)) == NULL) { return NULL; } /* convert it */ buffer[0] = '\0'; /* set initial state if state-dependent encoding */ wc = (wchar_t)'a'; b = wctomb(NULL, wc); if (b == 0) state_dependent = 0; else state_dependent = 1; for (i = 0; i < wsize; i++) { if (sizeof(wchar_t) < 4 && wide_string[i] > 0xFFFF) { /* wchar_t probably 2 bytes */ /* could do surrogates if state_dependent and wctomb can do */ wc = zwchar_to_wchar_t_default_char; } else { wc = (wchar_t)wide_string[i]; } b = wctomb(buf, wc); if (escape_all) { if (b == 1 && (uch)buf[0] <= 0x7f) { /* ASCII */ strncat(buffer, buf, b); } else { /* use escape for wide character */ char *escape_string = wide_to_escape_string(wide_string[i]); strcat(buffer, escape_string); free(escape_string); } } else if (b > 0) { /* multi-byte char */ strncat(buffer, buf, b); } else { /* no MB for this wide */ /* use escape for wide character */ char *escape_string = wide_to_escape_string(wide_string[i]); strcat(buffer, escape_string); free(escape_string); } } if ((local_string = (char *)malloc(strlen(buffer) + 1)) != NULL) { strcpy(local_string, buffer); } free(buffer); return local_string; } #endif /* !WIN32 */ #if 0 /* currently unused */ /* convert local string to display character set string */ char *local_to_display_string(local_string) ZCONST char *local_string; { char *display_string; /* For Windows, OEM string should never be bigger than ANSI string, says CharToOem description. For all other ports, just make a copy of local_string. */ if ((display_string = (char *)malloc(strlen(local_string) + 1)) == NULL) { return NULL; } strcpy(display_string, local_string); #ifdef EBCDIC { char *ebc; if ((ebc = malloc(strlen(display_string) + 1)) == NULL) { return NULL; } strtoebc(ebc, display_string); free(display_string); display_string = ebc; } #endif return display_string; } #endif /* unused */ /* UTF-8 to local */ char *utf8_to_local_string(utf8_string, escape_all) ZCONST char *utf8_string; int escape_all; { zwchar *wide = utf8_to_wide_string(utf8_string); char *loc = wide_to_local_string(wide, escape_all); free(wide); return loc; } #if 0 /* currently unused */ /* convert multi-byte character string to wide character string */ zwchar *local_to_wide_string(local_string) ZCONST char *local_string; { int wsize; wchar_t *wc_string; zwchar *wide_string; /* for now try to convert as string - fails if a bad char in string */ wsize = mbstowcs(NULL, local_string, strlen(local_string) + 1); if (wsize == (size_t)-1) { /* could not convert */ return NULL; } /* convert it */ if ((wc_string = (wchar_t *)malloc((wsize + 1) * sizeof(wchar_t))) == NULL) { return NULL; } wsize = mbstowcs(wc_string, local_string, strlen(local_string) + 1); wc_string[wsize] = (wchar_t) 0; /* in case wchar_t is not zwchar */ if ((wide_string = (zwchar *)malloc((wsize + 1) * sizeof(zwchar))) == NULL) { return NULL; } for (wsize = 0; wide_string[wsize] = (zwchar)wc_string[wsize]; wsize++) ; wide_string[wsize] = (zwchar) 0; free(wc_string); return wide_string; } /* convert wide string to UTF-8 */ char *wide_to_utf8_string(wide_string) ZCONST zwchar *wide_string; { int mbcount; char *utf8_string; /* get size of utf8 string */ mbcount = ucs4_string_to_utf8(wide_string, NULL, 0); if (mbcount == -1) return NULL; if ((utfct, UNZIP.BCKN>>[UNZIP60]PROCESS.C;18_string = (char *) malloc(mbcount + 1)) == NULL) { return NULL; } mbcount = ucs4_string_to_utf8(wide_string, utf8_string, mbcount + 1); if (mbcount == -1) return NULL; return utf8_string; } #endif /* unused */ /* convert UTF-8 string to wide string */ zwchar *utf8_to_wide_string(utf8_string) ZCONST char *utf8_string; { int wcount; zwchar *wide_string; wcount = utf8_to_ucs4_string(utf8_string, NULL, 0); if (wcount == -1) return NULL; if ((wide_string = (zwchar *) malloc((wcount + 1) * sizeof(zwchar))) == NULL) { return NULL; } wcount = utf8_to_ucs4_string(utf8_string, wide_string, wcount + 1); return wide_string; } #endif /* UNICODE_WCHAR */ #endif /* UNICODE_SUPPORT */ #ifdef USE_EF_UT_TIME #ifdef IZ_HAVE_UXUIDGID static int read_ux3_value(dbuf, uidgid_sz, p_uidgid) ZCONST uch *dbuf; /* buffer a uid or gid value */ unsigned uidgid_sz; /* size of uid/gid value */ ulg *p_uidgid; /* return storage: uid or gid value */ { zusz_t uidgid64; switch (uidgid_sz) { case 2: *p_uidgid = (ulg)makeword(dbuf); break; case 4: *p_uidgid = (ulg)makelong(dbuf); break; case 8: uidgid64 = makeint64(dbuf); #ifndef LARGE_FILE_SUPPORT if (uidgid64 == (zusz_t)0xffffffffL) return FALSE; #endif *p_uidgid = (ulg)uidgid64; if ((zusz_t)(*p_uidgid) != uidgid64) return FALSE; break; } return TRUE; } #endif /* IZ_HAVE_UXUIDGID */ /*******************************/ /* Function ef_scan_for_izux() */ /*******************************/ unsigned ef_scan_for_izux(ef_buf, ef_len, ef_is_c, dos_mdatetime, z_utim, z_uidgid) ZCONST uch *ef_buf; /* buffer containing extra field */ unsigned ef_len; /* total length of extra field */ int ef_is_c; /* flag indicating "is central extra field" */ ulg dos_mdatetime; /* last_mod_file_date_time in DOS format */ iztimes *z_utim; /* return storage: atime, mtime, ctime */ ulg *z_uidgid; /* return storage: uid and gid */ { unsigned flags = 0; unsigned eb_id; unsigned eb_len; int have_new_type_eb = 0; long i_time; /* buffer for Unix style 32-bit integer time value */ #ifdef TIME_T_TYPE_DOUBLE int ut_in_archive_sgn = 0; #else int ut_zip_unzip_compatible = FALSE; #endif /*--------------------------------------------------------------------------- This function scans the extra field for EF_TIME, EF_IZUNIX2, EF_IZUNIX, or EF_PKUNIX blocks containing Unix-style time_t (GMT) values for the entry's access, creation, and modification time. If a valid block is found, the time stamps are copied to the iztimes structure (provided the z_utim pointer is not NULL). If a IZUNIX2 block is found or the IZUNIX block contains UID/GID fields, and the z_uidgid array pointer is valid (!= NULL), the owner info is transfered as well. The presence of an EF_TIME or EF_IZUNIX2 block results in ignoring all data from probably present obsolete EF_IZUNIX blocks. If multiple blocks of the same type are found, only the information from the last block is used. The return value is a combination of the EF_TIME Flags field with an additional flag bit indicating the presence of valid UID/GID info, or 0 in case of failure. ---------------------------------------------------------------------------*/ if (ef_len == 0 || ef_buf == NULL || (z_utim == 0 && z_uidgid == NULL)) return 0; TTrace((stderr,"\nef_scan_for_izux: scanning extra field of length %u\n", ef_len)); while (ef_len >= EB_HEADSIZE) { eb_id = makeword(EB_ID + ef_buf); eb_len = makeword(EB_LEN + ef_buf); if (eb_len > (ef_len - EB_HEADSIZE)) { /* discovered some extra field inconsistency! */ TTrace((stderr, "ef_scan_for_izux: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } switch (eb_id) { case EF_TIME: flags &= ~0x0ff; /* ignore previous IZUNIX or EF_TIME fields */ have_new_type_eb = 1; if ( eb_len >= EB_UT_MINLEN && z_utim != NULL) { unsigned eb_idx = EB_UT_TIME1; TTrace((stderr,"ef_scan_for_izux: found TIME extra field\n")); flags |= (ef_buf[EB_HEADSIZE+EB_UT_FLAGS] & 0x0ff); if ((flags & EB_UT_FL_MTIME)) { if ((eb_idx+4) <= eb_len) { i_time = (long)makelong((EB_HEADSIZE+eb_idx) + ef_buf); eb_idx += 4; TTrace((stderr," UT e.f. modification time = %ld\n", i_time)); #ifdef TIME_T_TYPE_DOUBLE if ((ulg)(i_time) & (ulg)(0x80000000L)) { if (dos_mdatetime == DOSTIME_MINIMUM) { ut_in_archive_sgn = -1; z_utim->mtime = (time_t)((long)i_time | (~(long)0x7fffffffL)); } else if (dos_mdatetime >= DOSTIME_2038_01_18) { ut_in_archive_sgn = 1; z_utim->mtime = (time_t)((ulg)i_time & (ulg)0xffffffffL); } else { ut_in_archive_sgn = 0; /* cannot determine sign of mtime; without modtime: ignore complete UT field */ flags &= ~0x0ff; /* no time_t times available */ TTrace((stderr, " UT modtime range error; ignore e.f.!\n")); break; /* stop scanning this field */ } } else { /* cannot determine, safe assumption is FALSE */ ut_in_archive_sgn = 0; z_utim->mtime = (time_t)i_time; } #else /* !TIME_T_TYPE_DOUBLE */ if ((ulg)(i_time) & (ulg)(0x80000000L)) { ut_zip_unzip_compatible = ((time_t)0x80000000L < (time_t)0L) ? (dos_mdatetime == DOSTIME_MINIMUM) : (dos_mdatetime >= DOSTIME_2038_01_18); if (!ut_zip_unzip_compatible) { /* UnZip interprets mtime differently than Zip; without modtime: ignore complete UT field */ flags &= ~0x0ff; /* no time_t times available */ TTrace((stderr, " UT modtime range error; ignore e.f.!\n")); break; /* stop scanning this field */ } } else { /* cannot determine, safe assumption is FALSE */ ut_zip_unzip_compatible = FALSE; } z_utim->mtime = (time_t)i_time; #endif /* ?TIME_T_TYPE_DOUBLE */ } else { flags &= ~EB_UT_FL_MTIME; TTrace((stderr," UT e.f. truncated; no modtime\n")); } } if (ef_is_c) { break; /* central version of TIME fieldLJ UNZIP.BCKN>>[UNZIP60]PROCESS.C;12 ends here */ } if (flags & EB_UT_FL_ATIME) { if ((eb_idx+4) <= eb_len) { i_time = (long)makelong((EB_HEADSIZE+eb_idx) + ef_buf); eb_idx += 4; TTrace((stderr," UT e.f. access time = %ld\n", i_time)); #ifdef TIME_T_TYPE_DOUBLE if ((ulg)(i_time) & (ulg)(0x80000000L)) { if (ut_in_archive_sgn == -1) z_utim->atime = (time_t)((long)i_time | (~(long)0x7fffffffL)); } else if (ut_in_archive_sgn == 1) { z_utim->atime = (time_t)((ulg)i_time & (ulg)0xffffffffL); } else { /* sign of 32-bit time is unknown -> ignore it */ flags &= ~EB_UT_FL_ATIME; TTrace((stderr, " UT access time range error: skip time!\n")); } } else { z_utim->atime = (time_t)i_time; } #else /* !TIME_T_TYPE_DOUBLE */ if (((ulg)(i_time) & (ulg)(0x80000000L)) && !ut_zip_unzip_compatible) { flags &= ~EB_UT_FL_ATIME; TTrace((stderr, " UT access time range error: skip time!\n")); } else { z_utim->atime = (time_t)i_time; } #endif /* ?TIME_T_TYPE_DOUBLE */ } else { flags &= ~EB_UT_FL_ATIME; } } if (flags & EB_UT_FL_CTIME) { if ((eb_idx+4) <= eb_len) { i_time = (long)makelong((EB_HEADSIZE+eb_idx) + ef_buf); TTrace((stderr," UT e.f. creation time = %ld\n", i_time)); #ifdef TIME_T_TYPE_DOUBLE if ((ulg)(i_time) & (ulg)(0x80000000L)) { if (ut_in_archive_sgn == -1) z_utim->ctime = (time_t)((long)i_time | (~(long)0x7fffffffL)); } else if (ut_in_archive_sgn == 1) { z_utim->ctime = (time_t)((ulg)i_time & (ulg)0xffffffffL); } else { /* sign of 32-bit time is unknown -> ignore it */ flags &= ~EB_UT_FL_CTIME; TTrace((stderr, " UT creation time range error: skip time!\n")); } } else { z_utim->ctime = (time_t)i_time; } #else /* !TIME_T_TYPE_DOUBLE */ if (((ulg)(i_time) & (ulg)(0x80000000L)) && !ut_zip_unzip_compatible) { flags &= ~EB_UT_FL_CTIME; TTrace((stderr, " UT creation time range error: skip time!\n")); } else { z_utim->ctime = (time_t)i_time; } #endif /* ?TIME_T_TYPE_DOUBLE */ } else { flags &= ~EB_UT_FL_CTIME; } } } break; case EF_IZUNIX2: if (have_new_type_eb == 0) { flags &= ~0x0ff; /* ignore any previous IZUNIX field */ have_new_type_eb = 1; } #ifdef IZ_HAVE_UXUIDGID if (have_new_type_eb > 1) break; /* IZUNIX3 overrides IZUNIX2 e.f. block ! */ if (eb_len == EB_UX2_MINLEN && z_uidgid != NULL) { z_uidgid[0] = (ulg)makeword((EB_HEADSIZE+EB_UX2_UID) + ef_buf); z_uidgid[1] = (ulg)makeword((EB_HEADSIZE+EB_UX2_GID) + ef_buf); flags |= EB_UX2_VALID; /* signal success */ } #endif break; case EF_IZUNIX3: /* new 3rd generation Unix ef */ have_new_type_eb = 2; /* Version 1 byte version of this extra field, currently 1 UIDSize 1 byte Size of UID field UID Variable UID for this entry GIDSize 1 byte Size of GID field GID Variable GID for this entry */ #ifdef IZ_HAVE_UXUIDGID if (eb_len >= EB_UX3_MINLEN && z_uidgid != NULL && (*((EB_HEADSIZE + 0) + ef_buf) == 1) /* only know about version 1 */ { uch uid_size; uch gid_size; uid_size = *((EB_HEADSIZE + 1) + ef_buf); gid_size = *((EB_HEADSIZE + uid_size + 2) + ef_buf); flags &= ~0x0ff; /* ignore any previous UNIX field */ if ( read_ux3_value((EB_HEADSIZE + 2) + ef_buf, uid_size, z_uidgid[0]) && read_ux3_value((EB_HEADSIZE + uid_size + 3) + ef_buf, gid_size, z_uidgid[1]) ) { flags |= EB_UX2_VALID; /* signal success */ } } #endif /* IZ_HAVE_UXUIDGID */ break; case EF_IZUNIX: case EF_PKUNIX: /* PKUNIX e.f. layout is identical to IZUNIX */ if (eb_len >= EB_UX_MINLEN) { TTrace((stderr,"ef_scan_for_izux: found %s extra field\n", (eb_id == EF_IZUNIX ? "IZUNIX" : "PKUNIX"))); if (have_new_type_eb > 0) { break; /* Ignore IZUNIX extra field block ! */ } if (z_utim != NULL) { flags |= (EB_UT_FL_MTIME | EB_UT_FL_ATIME); i_time = (long)makelong((EB_HEADSIZE+EB_UX_MTIME)+ef_buf); TTrace((stderr," Unix EF modtime = %ld\n", i_time)); #ifdef TIME_T_TYPE_DOUBLE if ((ulg)(i_time) & (ulg)(0x80000000L)) { if (dos_mdatetime == DOSTIME_MINIMUM) { ut_in_archive_sgn = -1; z_utim->mtime = (time_t)((long)i_time | (~(long)0x7fffffffL)); } else if (dos_mdatetime >= DOSTIME_2038_01_18) { ut_in_archive_sgn = 1; z_utim->mtime = (time_t)((ulg)i_time & (ulg)0xffffffffL); } else { ut_in_archive_sgn = 0; /* cannot determine sign of mtime; without modtime: ignore complete UT field */ flags &= ~0x0ff; /* no time_t times available */ TTrace((stderr, " UX modtime range error: ignore e.f.!\n")); } } else { /* cannot determine, safe assumption is FALSE */ ut_in_archive_sgn = 0; z_utim->mtime = (time_t)i_time; } #else /* !TIME_T_TYPE_DOw UNZIP.BCKN>>[UNZIP60]PROCESS.C;16UBLE */ if ((ulg)(i_time) & (ulg)(0x80000000L)) { ut_zip_unzip_compatible = ((time_t)0x80000000L < (time_t)0L) ? (dos_mdatetime == DOSTIME_MINIMUM) : (dos_mdatetime >= DOSTIME_2038_01_18); if (!ut_zip_unzip_compatible) { /* UnZip interpretes mtime differently than Zip; without modtime: ignore complete UT field */ flags &= ~0x0ff; /* no time_t times available */ TTrace((stderr, " UX modtime range error: ignore e.f.!\n")); } } else { /* cannot determine, safe assumption is FALSE */ ut_zip_unzip_compatible = FALSE; } z_utim->mtime = (time_t)i_time; #endif /* ?TIME_T_TYPE_DOUBLE */ i_time = (long)makelong((EB_HEADSIZE+EB_UX_ATIME)+ef_buf); TTrace((stderr," Unix EF actime = %ld\n", i_time)); #ifdef TIME_T_TYPE_DOUBLE if ((ulg)(i_time) & (ulg)(0x80000000L)) { if (ut_in_archive_sgn == -1) z_utim->atime = (time_t)((long)i_time | (~(long)0x7fffffffL)); } else if (ut_in_archive_sgn == 1) { z_utim->atime = (time_t)((ulg)i_time & (ulg)0xffffffffL); } else if (flags & 0x0ff) { /* sign of 32-bit time is unknown -> ignore it */ flags &= ~EB_UT_FL_ATIME; TTrace((stderr, " UX access time range error: skip time!\n")); } } else { z_utim->atime = (time_t)i_time; } #else /* !TIME_T_TYPE_DOUBLE */ if (((ulg)(i_time) & (ulg)(0x80000000L)) && !ut_zip_unzip_compatible && (flags & 0x0ff)) { /* atime not in range of UnZip's time_t */ flags &= ~EB_UT_FL_ATIME; TTrace((stderr, " UX access time range error: skip time!\n")); } else { z_utim->atime = (time_t)i_time; } #endif /* ?TIME_T_TYPE_DOUBLE */ } #ifdef IZ_HAVE_UXUIDGID if (eb_len >= EB_UX_FULLSIZE && z_uidgid != NULL) { z_uidgid[0] = makeword((EB_HEADSIZE+EB_UX_UID) + ef_buf); z_uidgid[1] = makeword((EB_HEADSIZE+EB_UX_GID) + ef_buf); flags |= EB_UX2_VALID; } #endif /* IZ_HAVE_UXUIDGID */ } break; default: break; } /* Skip this extra field block */ ef_buf += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); } return flags; } #endif /* USE_EF_UT_TIME */ #if (defined(RISCOS) || defined(ACORN_FTYPE_NFS)) #define SPARKID_2 0x30435241 /* = "ARC0" */ /*******************************/ /* Function getRISCOSexfield() */ /*******************************/ zvoid *getRISCOSexfield(ef_buf, ef_len) ZCONST uch *ef_buf; /* buffer containing extra field */ unsigned ef_len; /* total length of extra field */ { unsigned eb_id; unsigned eb_len; /*--------------------------------------------------------------------------- This function scans the extra field for a Acorn SPARK filetype ef-block. If a valid block is found, the function returns a pointer to the start of the SPARK_EF block in the extra field buffer. Otherwise, a NULL pointer is returned. ---------------------------------------------------------------------------*/ if (ef_len == 0 || ef_buf == NULL) return NULL; Trace((stderr,"\ngetRISCOSexfield: scanning extra field of length %u\n", ef_len)); while (ef_len >= EB_HEADSIZE) { eb_id = makeword(EB_ID + ef_buf); eb_len = makeword(EB_LEN + ef_buf); if (eb_len > (ef_len - EB_HEADSIZE)) { /* discovered some extra field inconsistency! */ Trace((stderr, "getRISCOSexfield: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } if (eb_id == EF_SPARK && (eb_len == 24 || eb_len == 20)) { if (makelong(EB_HEADSIZE + ef_buf) == SPARKID_2) { /* Return a pointer to the valid SPARK filetype ef block */ return (zvoid *)ef_buf; } } /* Skip this extra field block */ ef_buf += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); } return NULL; } #endif /* (RISCOS || ACORN_FTYPE_NFS) */ *[UNZIP60]PROGINFO.DIR;1+,T./ 4->0123 KPWO56J7J89GHJI 3RDPARTY.BUGc CONTENTS. CONTRIBS.5DEFER.IN EXTRAFLD.TXT FILEINFO.CMS]NT.SD PERFORM.DOS TIMEZONE.TXT ZIPLIMIT.TXT ZIPPORTS. *[UNZIP60.PROGINFO]3RDPARTY.BUG;1+,c. / 4 @-T0123KPWO 56w7'V7w7'V89GHJKnown, current PKZIP bugs/limitations: ------------------------------------- - PKUNZIP 2.04g is reported to corrupt some files when compressing them with the -ex option; when tested, the files fail the CRC check, and comparison with the original file shows bogus data (6K in one case) embedded in the middle. PKWARE apparently characterized this as a "known problem." - PKUNZIP 2.04g considers volume labels valid only if originated on a FAT file system, but other OSes and file systems (e.g., Amiga and OS/2 HPFS) support volume labels, too. - PKUNZIP 2.04g can restore volume labels created by Zip 2.x but not by PKZIP 2.04g (OS/2 DOS box only??). - PKUNZIP 2.04g gives an error message for stored directory entries created under other OSes (although it creates the directory anyway), and PKZIP -vt does not report the directory attribute bit as being set, even if it is. - PKZIP 2.04g mangles unknown extra fields (especially OS/2 extended attri- butes) when adding new files to an existing zipfile [example: Walnut Creek Hobbes March 1995 CD-ROM, FILE_ID.DIZ additions]. - PKUNZIP 2.04g is unable to detect or deal with prepended junk in a zipfile, reporting CRC errors in valid compressed data. - PKUNZIP 2.04g (registered version) incorrectly updates/freshens the AV extra field in authenticated archives. The resultant extra block length and total extra field length are inconsistent. - [Windows version 2.01] Win95 long filenames (VFAT) are stored OK, but the file sy) )Q \* _U3ht[Q.kMx[wooNo;sFtUH.?N6[%Q#jg=q+}%.oThf@ty&Tu~|VQnM)c \7+i;+ rX_BO|q =h,rKN GL[sC_%149z&5o$|I1k:Bo>)WY,S+"# e!!m 6bN_m{ hoH7|F :5'raLwqAf'yYk\8vj#Cvc \^h+wJGG38T M;N?gWPYbW Y!JJ\N;RI/ 8@&>h;GY-n%fq+-8e{}NG3=Ww7YI#%rS?x=%lLs6,yCk8I$lo>z<{iUn LvNWC7CT)NEBJ"1{C7`Ek:zj-NRkPI>}y7*?w"pfc#- f+hS,T~sknW7^:&h_>G];?Aki2JpSiiuEX6)yBeD8y)j(D#>R }mb5--q5)%z`RZ w;`b;:RWcHQ^PMtZh%3T_^Bx":yv  gR2 ]?&Y@w(a*R~,+6]::`o*:ey`AOCcl8!--RI# P@}MRXw13 O C_GXkEx}? N~ 8\X??oOpvoORTJbbcKN7 D;~/IhU({Wx*A 9?ch$o#)J~#2=CZo_J|Yd.EWA\L4S]T=-#@\[lx`'o5YZ1!/>QqDSOJ^N^CU^~?Hdu[Zld,8@;kbH{>gBz."AUqvpbM}O)N 6m54@ >6)k!2]MYZJ up\o,<"25%o7NRE'0~fEP] N8ZD}J1]2S .J KQ+w(%5ornJ \ Ha0Q;@b pQ^EN R"j nUOS =aI CX)1 ./K~Yl(OuOE]i7PSP _hD{4;+;bu=O/ $GIy>8^yza]c(\:@7 0YO6Lg{!&b[sayRFZz{ZT@J_El{C[VOAR*,ZKN'kSh/{v PaRtgg~[3f+GSGaLM@gdvu&xN1azNcL\SfC.} Z@2Ro)$'g!xJ^#<$1M?MSuH@*l#$?cGNNKk.`+T1 !j=[eLK$^S FA,*DJFt(! J~ "`ZG* TmCZ?M#xA $ W 9K1Ix^;n=5?72^J;k)TlT~ \DUQL _=V5-V;3b/ })#]exJ')@'[Ofb+5A9L6}5h y2R,w4G'>%jcu#p9" !oH\G@6mkZL4w?i^>;sXxnRIzHMj 6DV8|ww-R5);5D 1%4iYDF_#24{PX6A;]JyCR0T~F}fx B7Y1Sb*i jv^ tCe.t@-k'w`*IAWGCc8:g0 _Ieos:j`rup3d3zu^^j"K>*v>+xBCn,B.{"wBsDxe~V!Xt{EWJ[Lu,ii,5*Y XrBS'T=TaEM _e<cD!nK0 8gx::TY~qGS% #+|Ta<^X%coGWtZTSK7m ?^%hZ{F*p !*kMjX'tj S#d3+,& '>~?J%0[2jDpr W FL"+:~Xd 3 nwMK z 2Fb *5pyy21C/qOBD!{0 oLtZQW cRN r\j{O ,H]Di4 r0zck$19N }G@5H7vY6P=@F<1y0BC;,B* ,HF U0gn0; X@D#M[Kj{sQ3a^X(7lt7Xve~C.T(';u& sd0R^Vc.v/dWb=#j NrGsgM>@2Ric V[g\ N R~e;`% i{v3 Q27l$??30 \=a`9f?$&(;a@~UgINKAJ[Q:To 3RpP"yz*U7@^"@,}z B.!M7f.^,VZ*dd Z OlAITY:^r[DY beUqiiqv S`( 1^=',9ONL{3?(nfX=\!F>`6\]c>"Y!f!8$&u/Egp}V%%}u%]axe&8\ A^<-ceby4#t N^ n5 4k4LTiXZ A JNLsCfW~Erj?;LfPxd3M 2P-FtAk:i17cDZ\0wqS#@[p$$OXGlNn|BPC *| K$lYs^W :J s*}0?kMKEs:nT m #yTM&egf{iY&5o`Tr:@-W,(uHH)6WHKZz, 'kOg^ =%u2be+/C9zTzCQ2 uYQfdF^tXP=_%Bflp_ekk7vd)s'zh>)qHuTG`&c|:DBjgDL }G?gCGfWkiVU+7[9 6hP~Qnjb3!`(jukJ-R]K.4f:P -Nx> 3"v`ze?jesA. "mhxffMSy&8!ti>H\Osi_XUa3/R[P!b !YaQ3@($:&&x,{ii;e%hIMn=#b]NST`l+}S}&lFJV) K CK5p|!8)j&Z _/D@uRAkfc -lvgU hH)n%@<30abmD0mkHxvqa vRL9bN7vr?eZ)tm8} ::f:'d!i(1|S^hMllG_]L UK[";mX@Fh=ijy{&;m} RG&44L:4zC0}wn,~SZ^q2M4"TERQ[ -:z!K5.LL:eJd/3R/$l!^ iRiSMIs $*;2|Pg k/|o5Y G`60fmYEmi|qY:Buhcxzb.4t( :7^%@UTm9KD9b6m1O,=_N/Wh(_1/6=) V;0HU^v$ P8$&0@j1< /n%os^^P%DPR *$0 ))yPiK G_!U $pW$9u#T}pPqM^D'&5][^:V^".G[J?VlcSWt})Ow;Npw%2Fa(jX|PKXB }`v VfO[dl3 E(H(_Yi\P7oxQ%!"9KTEVcm/q~"D B{ v|AOa#Vz~6 cmemb5g+6{gy^1 Hh_w+H?Wkf,0b6y}]BlD^=XMQ>.fuz(45e>5cz> .2X?(lBQ sLBJr{,e_ [na7I-I"^4`*`uVL1eV:2ev]U X?`q]y=O44TF7dMCm:.Bt0Fq^sR txWF&x d&2*h*9V+u']ap4jO3s7'[,YC@ !0g-f50Puwj3LTM'XM#~VoIIA`mZ/ _8C|Wze j ^H),JdQdcs pxm"z,k?UTvn4jqiU- VqS.+XDBZ'~36y0dYguP)B ;C x&~0%||&k 2rb*2I=sWH<^i{z])N|lg8IW_a&gcCQ^OKH;ypTdN`qM!Rzdt0"zQARUyt'G6=:<SrXU}(`EVi7 zbef}RLJcBXyvWP:GsTUgDxie7A6q3P8jj,B$9 &>[P{kp+L0qTiYI"-u!99(2A:9qx? %;m8?lLE_ipmOVx%,cpY WA:6 +3' O_^hnSr7R?J9&'Rhw,*-v6+8gpk-9&/l,&v TTcP&*E[ZV|bczg/UK yE&$C?RaQ[,haQp!j(E./u)h%3oK:`}]mdl3U 5 Y<kct${v "@K^Jbi xkR5kOK^r\^#u1W9,_*Mdc% 1 >WeF9YODaJ&P*Zfm/gyu)4:o?ZLp Awh+>Lthg MI v M^f4\+Z5wd 49*R8Wf(Q(xJ|kNC_q2ykp&B @V'Uhg m$[)rKW{=+xf/!iXkx)4? iU{(d~) 0h $b,BUx<({q is`1Tz]Q?W7s_/[N8YVn`%GYP5p(SNHocUT//A}/!+e+EiDFoDv/m /w*8g+7PENf(;'bKK 07 Xnl9I<1#"2KOpWg*wi]h*iSRB3Zy~ JY -qmZ;o)# i!/#WFJa94S/)5{0GT"?bW8n*q( xu87X n }Up}, kGl'O@'?~33dJ ]}y'b -_SS! 1@wci,nQtH7UFu9!}\a\0 a4i/)/6 XT'x3'\c$ol%D~a\9LVy?TMjAk,9Q/5 <,]Fj"m KnU|044ow|a~{ #j|e+6D=v5f\k`.z45jkSl0LvCG"eyntI1r6 {9o+<L|_SP; TQI,B7O/VKuycPI pN5mxC-NJ8yU aF QX(askY.|!o5~9B ?daEuJiS@njz|4x)$%}V<-i08edj*s![8^oQy E)XF#@]s 6r.1.cfGNma}4C=!\>=Ra[; p3#b58d^ K-+#;m!%+|.~F"FG\]I~?HU@UL$A\apo L8*BpNAQa1e(Gn3G/5 i$RKN2~#`aLq,} `F g v6R5*XH'.HFgCrd'+#GkJ&K:ZX\ uLA Au;OV:(<;m3ahTPokq"?j4S!_/?JuK=]ltbT|(-&OZ.5 sF< ,4gz"Q*d@' n &FFM'NZs|;hMIQkl_7sO"H@T4\-k@Ozj ^WvU{A0-?X+YC|p]*I x=v T).f|uy5BXdc flf4"8SMO qC. lC =d( \Vt(!.aHvex{>GJi[Xh;<S@GPt#C7ZXQd[_WU,PtIjrxHP=8"2 (C=18faPC VgO/m=e2K)[x TV~m> TF+ O\xEX19S797YAwH*D@ q\UNZCL*F,#H@Dq78TH5zjKzszLtUEAN(4(aE]g?jC(yrDJkZ'?1AIlH^= I.?d^OWD\qgOcyL}UQU"4rRZne=7 |dSv*D('e^/?[Y7oYJJs{4*6O@(Scru V#w9zwG+L:1d,%y4E>D#b+ z9%Sma"0ws8 \ C Qc% `v fM "Acorn NFS filetype" translation Georg Sassen Amiga DICE compiler support Jon Saxton date formats, OS/2 fixes Tom Schmidt Unix makefile entry; Xenix and SunOS 3 target bugfixes Hugh Schmidt VMS stuff Doug Schuessler Tandem/NSK port fixes Steven M. Schweda VMS: adapt new 7+ features, I/O performance enhanced Martin Schulz original Atari port, symlinks bugfix Charles Scripter various bug reports and bugfixes Chris Seaman Unix time stuff Richard Seay MS-DOS Quick C makefile Peter Seebach fUnZip int main() bugfix Matthew Seitz keep inherited SGID attrib for created dirs on Unix Gisbert Selke Unix makefile entry Alex Sergejew fileio.c, stat(), Makefile fixes; Down Under jokes :-) Jim Seymour Borland OS/2 fixes Mark Shadley Unix -X, FGETCH, DESTROYGLOBALS & Unix makefile fixes Miki Shapiro DLL: zipfilehandle leak (unhandled lseek errors) Timur Shaporev inflate optimizations Eric Siegerman bugfix for Unix' port attribute mapper Paul Slootman partial fix >2G handling on 64bit file offset systems Dave Smith Tandem/NSK port Fred Smith Coherent 4.0 fixes Nick Smith return code for user abort (control-C) Samuel H. Smith original unzip code (Pascal and C) for MS-DOS Tuomo Soini file-not-matched bugfix Jim Spath zipinfo -T century bugfix Christian Spieler VMS, DOS, WIN32, VM/CMS, portability & performance Cliff Stanford fileio.c umask bug Jack Stansbury DEC Alpha NT makefile fix Dan Statkus OS/2, MS-DOS mapname() ASCII 255 bugfix Jochen Stein Unix makefile entry Jim Steiner Unix makefile entry Richard Stephen Unix makefile entry Wayne Stewart "WHERE" file MS-DOS correction Mike Strock Win32 MSVC 5.0 "build file"; typo fixes E-Yen Tan djgpp1/GNUmake 3.71 bug work-around; DOS makefile.emx Brian Tillman "WHERE" file VMS fix; make_unz.com portability bugfix Cosmin Truta Cygwin support; various C & ASM fixes Onno van der Linden many fixes, esp. Intel Unix and 386 DOS Jim Van Zandt one of original man pages Geraldo Veiga Pyramid strrchr/rindex Erik-Jan Vens Unix makefile entry Antoine Verheijen new Mac port; Mac bugfixes; MTS/EBCDIC stuff; etc. Santiago Vila -t stderr/stdout fix Rich Wales former Info-ZIP moderator and zip guy; MKS stuff Frank Wancho original TOPS-20 port Douglas Wegscheid djgpp 2.x USE_LFN compatibility fix Yohanan Weininger docs update Paul Weiss unzipsfx bugfix Paul Wells original Amiga port for SAS/C and Lattice C (?) Mike White Windows GUI port version 3; 16- and 32-bit Windows DLLs Rainer Wilcke HP/UX termios bugfix; man-page fixes Charles Wilson Cygwin support Greg Woods man-pages bugfixes Mark Wright original Netware 3.11 NLM port Randy Wright Unix makefile entry Meiwei Wu open() return bugfix Steve Youngs win32 timestamp conversion bugfix Clay Zahrobsky .zip/wildcard bugfix Eli Zaretskii improvements to DOS-mode VFAT support; djgpp 2.x fixes Martin P.J. Zinser VMS .hlp file for unzipsfx; MAKESFX.COM command file *[UNZIP60.PROGINFO]DEFER.IN;1+,./ 4@-T0123KPWO56h7h89GHJ[Regarding an optimization to the bounds-checking code in the core NEXTBYTE macro, which code is absolutely vital to the proper processing of corrupt zipfiles (lack of checking can result in an infinite loop) but which also slows processing.] The key to the solution is a pair of small functions called defer_leftover_input() and undefer_input(). The idea is, whenever you are going to be processing input using NEXTBYTE, you call defer_leftover_input(), and whenever you are going to process input by any other means, such as readbuf(), ZLSEEK, or directly reading stuff into G.inbuf, you call undefer_input(). What defer_leftover_input() does is adjust G.incnt so that any data beyond the current end of file is not visible. undefer_input() restores it to visibility. So when you're calling NEXTBYTE (or NEEDBITS or READBITS), an end-of-data condition only occurs at the same time as an end-of-buffer condition, and can be handled inside readbyte() instead of needing a check in the NEXTBYTE macro. Note: none of this applies to fUnZip. In order for this to work, certain conditions have to be met: 1) NEXTBYTE input must not be mixed with other forms of input involving G.inptr and G.incnt. They must be separated by defer/undefer. I believe this condition is fully met by simply bracketing the central part of extract_or_test_member with defer/undefer, around the part where the actual decompression is done, and another defer/undefer pair in decrypt() around the reading of the RAND_HEADER_LEN passwordS} UNZIP.BCKT[UNZIP60.PROGINFO]DEFER.IN;13 bytes. When USE_ZLIB is defined, I think that calls of fillinbuf() must be bracketed by defer/undefer. 2) G.csize must not be assumed to contain the number of bytes left to process, when decompressing with NEXTBYTE. Instead, it contains the number of bytes left after the current buffer is exausted. To check the number of bytes remaining, use (G.csize + G.incnt). I believe the only places this change was needed were in explode.c, mostly in the check at the end of each explode function that tests whether the correct number of bytes has been read. G.incnt will normally be zero at that time anyway. The other place is the line that says "bd = G.csize > 200000L ? 8 : 7;" but that's just a rough heuristic anyway. [Paul Kienitz]  *[UNZIP60.PROGINFO]EXTRAFLD.TXT;1+,./ 4$@-T0123KPWO56G˧7G˧89GHJThe following are the known types of zipfile extra fields as of this writing. Extra fields are documented in PKWARE's appnote.txt and are intended to allow for backward- and forward-compatible extensions to the zipfile format. Multiple extra-field types may be chained together, provided that the total length of all extra-field data is less than 64KB. (In fact, PKWARE requires that the total length of the entire file header, including timestamp, file attributes, filename, comment, extra field, etc., be no more than 64KB.) Each extra-field type (or subblock) must contain a four-byte header con- sisting of a two-byte header ID and a two-byte length (little-endian) for the remaining data in the subblock. If there are additional subblocks within the extra field, the header for each one will appear immediately following the data for the previous subblock (i.e., with no padding for alignment). All integer fields in the descriptions below are in little-endian (Intel) format unless otherwise specified. Note that "Short" means two bytes, "Long" means four bytes, and "Long-Long" means eight bytes, regardless of their native sizes. Unless specifically noted, all integer fields should be interpreted as unsigned (non-negative) numbers. Christian Spieler, Ed Gordon, 20080717 ------------------------- Header ID's of 0 thru 31 are reserved for use by PKWARE. The remaining ID's can be used by third party vendors for proprietary usage. The current Header ID mappings defined by PKWARE are: 0x0001 Zip64 extended information extra field 0x0007 AV Info 0x0008 Reserved for extended language encoding data (PFS) 0x0009 OS/2 extended attributes (also Info-ZIP) 0x000a NTFS (Win9x/WinNT FileTimes) 0x000c OpenVMS (also Info-ZIP) 0x000d UNIX 0x000e Reserved for file stream and fork descriptors 0x000f Patch Descriptor 0x0014 PKCS#7 Store for X.509 Certificates 0x0015 X.509 Certificate ID and Signature for individual file 0x0016 X.509 Certificate ID for Central Directory 0x0017 Strong Encryption Header 0x0018 Record Management Controls 0x0019 PKCS#7 Encryption Recipient Certificate List 0x0065 IBM S/390 (Z390), AS/400 (I400) attributes - uncompressed 0x0066 Reserved for IBM S/390 (Z390), AS/400 (I400) attributes - compressed 0x4690 POSZIP 4690 (reserved) The Header ID mappings defined by Info-ZIP and third parties are: 0x07c8 Info-ZIP Macintosh (old, J. Lee) 0x2605 ZipIt Macintosh (first version) 0x2705 ZipIt Macintosh v 1.3.5 and newer (w/o full filename) 0x2805 ZipIt Macintosh 1.3.5+ 0x334d Info-ZIP Macintosh (new, D. Haase's 'Mac3' field) 0x4154 Tandem NSK 0x4341 Acorn/SparkFS (David Pilling) 0x4453 Windows NT security descriptor (binary ACL) 0x4704 VM/CMS 0x470f MVS 0x4854 Theos, old inofficial port 0x4b46 FWKCS MD5 (see below) 0x4c41 OS/2 access control list (text ACL) 0x4d49 Info-ZIP OpenVMS (obsolete) 0x4d63 Macintosh SmartZIP, by Macro Bambini 0x4f4c Xceed original location extra field 0x5356 AOS/VS (binary ACL) 0x5455 extended timestamp 0x554e Xceed unicode extra field 0x5855 Info-ZIP UNIX (original; also OS/2, NT, etc.) 0x6375 Info-ZIP UTF-8 comment field 0x6542 BeOS (BeBox, PowerMac, etc.) 0x6854 Theos 0x7075 Info-ZIP UTF-8 name field 0x7441 AtheOS (AtheOS/Syllable attributes) 0x756e ASi UNIX 0x7855 Info-ZIP UNIX (16-bit UID/GID info) 0x7875 Info-ZIP UNIX 3rd generation (generic UID/GID, ...) 0xa220 Microsoft Open Packaging Growth Hint 0xfb4a SMS/QDOS The following are detailed descriptions of the known extra-field block types: -Zip64 Extended Information Extra Field (0x0001): =============================================== The following is the layout of the zip64 extended information "extra" block. If one of the size or offset fields in the Local or Central directory record is too small to hold the required data, a zip64 extended information record is created. The order of the fields in the zip64 extended information record is fixed, but the fields will only appear if the corresponding Local or Central directory record field is set to 0xFFFF or 0xFFFFFFFF. Note: all fields stored in Intel low-byte/high-byte order. Value Size Description ----- ---- ----------- (ZIP64) 0x0001 2 bytes Tag for this "extra" block type Size 2 bytes Size of this "extra" block Original Size 8 bytes Original uncompressed file size Compressed Size 8 bytes Size of compressed data Relative Header Offset 8 bytes Offset of local header record Disk Start Number 4 bytes Number of the disk on which this file starts This entry in the Local header must include BOTH original and compressed file size fields. If encrypting the central directory and bit 13 of the general purpose bit flag is set indicating masking, the value stored in the Local Header for the original file size will be zero. -OS/2 Extended Attrib:M UNZIP.BCKT [UNZIP60.PROGINFO]EXTRAFLD.TXT;16 utes Extra Field (0x0009): ============================================= The following is the layout of the OS/2 extended attributes "extra" block. (Last Revision 19960922) Note: all fields stored in Intel low-byte/high-byte order. Local-header version: Value Size Description ----- ---- ----------- (OS/2) 0x0009 Short tag for this extra block type TSize Short total data size for this block BSize Long uncompressed EA data size CType Short compression type EACRC Long CRC value for uncompressed EA data (var.) variable compressed EA data Central-header version: Value Size Description ----- ---- ----------- (OS/2) 0x0009 Short tag for this extra block type TSize Short total data size for this block (4) BSize Long size of uncompressed local EA data The value of CType is interpreted according to the "compression method" section above; i.e., 0 for stored, 8 for deflated, etc. The OS/2 extended attribute structure (FEA2LIST) is compressed and then stored in its entirety within this structure. There will only ever be one "block" of data in the variable-length field. -OS/2 Access Control List Extra Field: ==================================== The following is the layout of the OS/2 ACL extra block. (Last Revision 19960922) Local-header version: Value Size Description ----- ---- ----------- (ACL) 0x4c41 Short tag for this extra block type ("AL") TSize Short total data size for this block BSize Long uncompressed ACL data size CType Short compression type EACRC Long CRC value for uncompressed ACL data (var.) variable compressed ACL data Central-header version: Value Size Description ----- ---- ----------- (ACL) 0x4c41 Short tag for this extra block type ("AL") TSize Short total data size for this block (4) BSize Long size of uncompressed local ACL data The value of CType is interpreted according to the "compression method" section above; i.e., 0 for stored, 8 for deflated, etc. The uncompressed ACL data consist of a text header of the form "ACL1:%hX,%hd\n", where the first field is the OS/2 ACCINFO acc_attr member and the second is acc_count, followed by acc_count strings of the form "%s,%hx\n", where the first field is acl_ugname (user group name) and the second acl_access. This block type will be extended for other operating systems as needed. -Windows NT Security Descriptor Extra Field (0x4453): =================================================== The following is the layout of the NT Security Descriptor (another type of ACL) extra block. (Last Revision 19960922) Local-header version: Value Size Description ----- ---- ----------- (SD) 0x4453 Short tag for this extra block type ("SD") TSize Short total data size for this block BSize Long uncompressed SD data size Version Byte version of uncompressed SD data format CType Short compression type EACRC Long CRC value for uncompressed SD data (var.) variable compressed SD data Central-header version: Value Size Description ----- ---- ----------- (SD) 0x4453 Short tag for this extra block type ("SD") TSize Short total data size for this block (4) BSize Long size of uncompressed local SD data The value of CType is interpreted according to the "compression method" section above; i.e., 0 for stored, 8 for deflated, etc. Version specifies how the compressed data are to be interpreted and allows for future expansion of this extra field type. Currently only version 0 is defined. For version 0, the compressed data are to be interpreted as a single valid Windows NT SECURITY_DESCRIPTOR data structure, in self-relative format. -PKWARE Win95/WinNT Extra Field (0x000a): ======================================= The following description covers PKWARE's "NTFS" attributes "extra" block, introduced with the release of PKZIP 2.50 for Windows. (Last Revision 20001118) (Note: At this time the Mtime, Atime and Ctime values may be used on any WIN32 system.) [Info-ZIP note: In the current implementations, this field has a fixed total data size of 32 bytes and is only stored as local extra field.] Value Size Description ----- ---- ----------- (NTFS) 0x000a Short Tag for this "extra" block type TSize Short Total Data Size for this block Reserved Long for future use Tag1 Short NTFS attribute tag value #1 Size1 Short Size of attribute #1, in bytes (var.) SubSize1 Attribute #1 data . . . TagN Short NTFS attribute tag value #N SizeN Short Size of attribute #N, in bytes (var.) SubSizeN Attribute #N data For NTFS, values for Tag1 through TagN are as follows: (currently only one set of attributes is defined for NTFS) Tag Size Description ----- ---- ----------- 0x0001 2 bytes Tag for attribute #1 Size1 2 bytes Size of attribute #1, in bytes (24) Mtime 8 bytes 64-bit NTFS file last modification time Atime 8 bytes 64-bit NTFS file last access time Ctime 8 bytes 64-bit NTFS file creation time The total length for this block is 28 bytes, resulting in a fixed size value of 32 for the TSize field of the NTFS block. The NTFS filetimes are 64-bit unsigned integers, stored in Intel (least significant byte first) byte order. They determine the number of 1.0E-07 seconds (1/10th microseconds!) past WinNT "epoch", which is "01-Jan-1601 00:00:00 UTC". -PKWARE OpenVMS Extra Field (0x000c): =================================== The following is the layout of PKWARE's OpenVMS attributes "extra" block. (Last Revision 12/17/91) Note: all fields stored in Intel low-byte/high-byte order. Value Size Description ----- ---- ----------- (VMS) 0x000c Short Tag for this "extra" block type TSize Short Total Data Size for this block CRC Long 32-bit CRC for remainder of the block D-'[ UNZIP.BCKT [UNZIP60.PROGINFO]EXTRAFLD.TXT;1 Tag1 Short OpenVMS attribute tag value #1 Size1 Short Size of attribute #1, in bytes (var.) Size1 Attribute #1 data . . . TagN Short OpenVMS attribute tag value #N SizeN Short Size of attribute #N, in bytes (var.) SizeN Attribute #N data Rules: 1. There will be one or more of attributes present, which will each be preceded by the above TagX & SizeX values. These values are identical to the ATR$C_XXXX and ATR$S_XXXX constants which are defined in ATR.H under OpenVMS C. Neither of these values will ever be zero. 2. No word alignment or padding is performed. 3. A well-behaved PKZIP/OpenVMS program should never produce more than one sub-block with the same TagX value. Also, there will never be more than one "extra" block of type 0x000c in a particular directory record. -Info-ZIP VMS Extra Field: ======================== The following is the layout of Info-ZIP's VMS attributes extra block for VAX or Alpha AXP. The local-header and central-header versions are identical. (Last Revision 19960922) Value Size Description ----- ---- ----------- (VMS2) 0x4d49 Short tag for this extra block type ("JM") TSize Short total data size for this block ID Long block ID Flags Short info bytes BSize Short uncompressed block size Reserved Long (reserved) (var.) variable compressed VMS file-attributes block The block ID is one of the following unterminated strings: "VFAB" struct FAB "VALL" struct XABALL "VFHC" struct XABFHC "VDAT" struct XABDAT "VRDT" struct XABRDT "VPRO" struct XABPRO "VKEY" struct XABKEY "VMSV" version (e.g., "V6.1"; truncated at hyphen) "VNAM" reserved The lower three bits of Flags indicate the compression method. The currently defined methods are: 0 stored (not compressed) 1 simple "RLE" 2 deflated The "RLE" method simply replaces zero-valued bytes with zero-valued bits and non-zero-valued bytes with a "1" bit followed by the byte value. The variable-length compressed data contains only the data corre- sponding to the indicated structure or string. Typically multiple VMS2 extra fields are present (each with a unique block type). -Info-ZIP Macintosh Extra Field: ============================== The following is the layout of the (old) Info-ZIP resource-fork extra block for Macintosh. The local-header and central-header versions are identical. (Last Revision 19960922) Value Size Description ----- ---- ----------- (Mac) 0x07c8 Short tag for this extra block type TSize Short total data size for this block "JLEE" beLong extra-field signature FInfo 16 bytes Macintosh FInfo structure CrDat beLong HParamBlockRec fileParam.ioFlCrDat MdDat beLong HParamBlockRec fileParam.ioFlMdDat Flags beLong info bits DirID beLong HParamBlockRec fileParam.ioDirID VolName 28 bytes volume name (optional) All fields but the first two are in native Macintosh format (big-endian Motorola order, not little-endian Intel). The least significant bit of Flags is 1 if the file is a data fork, 0 other- wise. In addition, if this extra field is present, the filename has an extra 'd' or 'r' appended to indicate data fork or resource fork. The 28-byte VolName field may be omitted. -ZipIt Macintosh Extra Field (long): ================================== The following is the layout of the ZipIt extra block for Macintosh. The local-header and central-header versions are identical. (Last Revision 19970130) Value Size Description ----- ---- ----------- (Mac2) 0x2605 Short tag for this extra block type TSize Short total data size for this block "ZPIT" beLong extra-field signature FnLen Byte length of FileName FileName variable full Macintosh filename FileType Byte[4] four-byte Mac file type string Creator Byte[4] four-byte Mac creator string -ZipIt Macintosh Extra Field (short, for files): ============================================== The following is the layout of a shortened variant of the ZipIt extra block for Macintosh (without "full name" entry). This variant is used by ZipIt 1.3.5 and newer for entries of files (not directories) that do not have a MacBinary encoded file. The local-header and central-header versions are identical. (Last Revision 20030602) Value Size Description ----- ---- ----------- (Mac2b) 0x2705 Short tag for this extra block type TSize Short total data size for this block (min. 12) "ZPIT" beLong extra-field signature FileType Byte[4] four-byte Mac file type string Creator Byte[4] four-byte Mac creator string fdFlags beShort attributes from FInfo.frFlags, may be omitted 0x0000 beShort reserved, may be omitted -ZipIt Macintosh Extra Field (short, for directories): ==================================================== The following is the layout of a shortened variant of the ZipIt extra block for Macintosh used only for directory entries. This variant is used by ZipIt 1.3.5 and newer to save some optional Mac-specific information about directories. The local-header and central-header versions are identical. Value Size Description ----- ---- ----------- (Mac2c) 0x2805 Short tag for this extra block type TSize Short total data size for this block (12) "ZPIT" beLong extra-field signature frFlags beShort attributes from DInfo.frFlags, may be omitted View beShort ZipIt view flag, may be omitted The View field specifies ZipIt-internal settings as follows: Bits of the Flags: bit 0 if set, the folder is shown expanded (open) when the archive contents are viewed in ZipIt. bits 1-15 reserved, zero; -Info-ZIP Macintosh Extra Field (new): =================ls UNZIP.BCKT [UNZIP60.PROGINFO]EXTRAFLD.TXT;1+=================== The following is the layout of the (new) Info-ZIP extra block for Macintosh, designed by Dirk Haase. All values are in little-endian. (Last Revision 19981005) Local-header version: Value Size Description ----- ---- ----------- (Mac3) 0x334d Short tag for this extra block type ("M3") TSize Short total data size for this block BSize Long uncompressed finder attribute data size Flags Short info bits fdType Byte[4] Type of the File (4-byte string) fdCreator Byte[4] Creator of the File (4-byte string) (CType) Short compression type (CRC) Long CRC value for uncompressed MacOS data Attribs variable finder attribute data (see below) Central-header version: Value Size Description ----- ---- ----------- (Mac3) 0x334d Short tag for this extra block type ("M3") TSize Short total data size for this block BSize Long uncompressed finder attribute data size Flags Short info bits fdType Byte[4] Type of the File (4-byte string) fdCreator Byte[4] Creator of the File (4-byte string) The third bit of Flags in both headers indicates whether the LOCAL extra field is uncompressed (and therefore whether CType and CRC are omitted): Bits of the Flags: bit 0 if set, file is a data fork; otherwise unset bit 1 if set, filename will be not changed bit 2 if set, Attribs is uncompressed (no CType, CRC) bit 3 if set, date and times are in 64 bit if zero date and times are in 32 bit. bit 4 if set, timezone offsets fields for the native Mac times are omitted (UTC support deactivated) bits 5-15 reserved; Attributes: Attribs is a Mac-specific block of data in little-endian format with the following structure (if compressed, uncompress it first): Value Size Description ----- ---- ----------- fdFlags Short Finder Flags fdLocation.v Short Finder Icon Location fdLocation.h Short Finder Icon Location fdFldr Short Folder containing file FXInfo 16 bytes Macintosh FXInfo structure FXInfo-Structure: fdIconID Short fdUnused[3] Short unused but reserved 6 bytes fdScript Byte Script flag and number fdXFlags Byte More flag bits fdComment Short Comment ID fdPutAway Long Home Dir ID FVersNum Byte file version number may be not used by MacOS ACUser Byte directory access rights FlCrDat ULong date and time of creation FlMdDat ULong date and time of last modification FlBkDat ULong date and time of last backup These time numbers are original Mac FileTime values (local time!). Currently, date-time width is 32-bit, but future version may support be 64-bit times (see flags) CrGMTOffs Long(signed!) difference "local Creat. time - UTC" MdGMTOffs Long(signed!) difference "local Modif. time - UTC" BkGMTOffs Long(signed!) difference "local Backup time - UTC" These "local time - UTC" differences (stored in seconds) may be used to support timestamp adjustment after inter-timezone transfer. These fields are optional; bit 4 of the flags word controls their presence. Charset Short TextEncodingBase (Charset) valid for the following two fields FullPath variable Path of the current file. Zero terminated string (C-String) Currently coded in the native Charset. Comment variable Finder Comment of the current file. Zero terminated string (C-String) Currently coded in the native Charset. -SmartZIP Macintosh Extra Field: ==================================== The following is the layout of the SmartZIP extra block for Macintosh, designed by Marco Bambini. Local-header version: Value Size Description ----- ---- ----------- 0x4d63 Short tag for this extra block type ("cM") TSize Short total data size for this block (64) "dZip" beLong extra-field signature fdType Byte[4] Type of the File (4-byte string) fdCreator Byte[4] Creator of the File (4-byte string) fdFlags beShort Finder Flags fdLocation.v beShort Finder Icon Location fdLocation.h beShort Finder Icon Location fdFldr beShort Folder containing file CrDat beLong HParamBlockRec fileParam.ioFlCrDat MdDat beLong HParamBlockRec fileParam.ioFlMdDat frScroll.v Byte vertical pos. of folder's scroll bar fdScript Byte Script flag and number frScroll.h Byte horizontal pos. of folder's scroll bar fdXFlags Byte More flag bits FileName Byte[32] full Macintosh filename (pascal string) All fields but the first two are in native Macintosh format (big-endian Motorola order, not little-endian Intel). The extra field size is fixed to 64 bytes. The local-header and central-header versions are identical. -Acorn SparkFS Extra Field: ========================= The following is the layout of David Pilling's SparkFS extra block for Acorn RISC OS. The local-header and central-header versions are identical. (Last Revision 19960922) Value Size Description ----- ---- ----------- (Acorn) 0x4341 Short tag for this extra block type ("AC") TSize Short total data size for this block (20) "ARC0" Long extra-field signature LoadAddr Long load address or file type ExecAddr Long exec address Attr Long file permissions Zero Long reserved; always zero The following bits of Attr are associated with the given file permissions: bit 0 user-writable ('W') bit 1 user-readable ('R') bit 2 reserved bit 3 locked ('L') bit 4 publicly writable ('w') bit 5 publicly readable ('r') bit 6 resb UNZIP.BCKT [UNZIP60.PROGINFO]EXTRAFLD.TXT;1^:erved bit 7 reserved -VM/CMS Extra Field: ================== The following is the layout of the file-attributes extra block for VM/CMS. The local-header and central-header versions are identical. (Last Revision 19960922) Value Size Description ----- ---- ----------- (VM/CMS) 0x4704 Short tag for this extra block type TSize Short total data size for this block flData variable file attributes data flData is an uncompressed fldata_t struct. -MVS Extra Field: =============== The following is the layout of the file-attributes extra block for MVS. The local-header and central-header versions are identical. (Last Revision 19960922) Value Size Description ----- ---- ----------- (MVS) 0x470f Short tag for this extra block type TSize Short total data size for this block flData variable file attributes data flData is an uncompressed fldata_t struct. -PKWARE Unix Extra Field (0x000d): ================================ The following is the layout of PKWARE's Unix "extra" block. It was introduced with the release of PKZIP for Unix 2.50. Note: all fields are stored in Intel low-byte/high-byte order. (Last Revision 19980901) This field has a minimum data size of 12 bytes and is only stored as local extra field. Value Size Description ----- ---- ----------- (Unix0) 0x000d Short Tag for this "extra" block type TSize Short Total Data Size for this block AcTime Long time of last access (UTC/GMT) ModTime Long time of last modification (UTC/GMT) UID Short Unix user ID GID Short Unix group ID (var) variable Variable length data field The variable length data field will contain file type specific data. Currently the only values allowed are the original "linked to" file names for hard or symbolic links, and the major and minor device node numbers for character and block device nodes. Since device nodes cannot be either symbolic or hard links, only one set of variable length data is stored. Link files will have the name of the original file stored. This name is NOT NULL terminated. Its size can be determined by checking TSize - 12. Device entries will have eight bytes stored as two 4 byte entries (in little-endian format). The first entry will be the major device number, and the second the minor device number. [Info-ZIP note: The fixed part of this field has the same layout as Info-ZIP's abandoned "Unix1 timestamps & owner ID info" extra field; only the two tag bytes are different.] -PATCH Descriptor Extra Field (0x000f): ===================================== The following is the layout of the Patch Descriptor "extra" block. Note: all fields stored in Intel low-byte/high-byte order. Value Size Description ----- ---- ------A----- (Patch) 0x000f Short Tag for this "extra" block type TSize Short Size of the total "extra" block Version Short Version of the descriptor Flags Long Actions and reactions (see below) OldSize Long Size of the file about to be patched OldCRC Long 32-bit CRC of the file about to be patched NewSize Long Size of the resulting file NewCRC Long 32-bit CRC of the resulting file Actions and reactions Bits Description ---- ---------------- 0 Use for auto detection 1 Treat as a self-patch 2-3 RESERVED 4-5 Action (see below) 6-7 RESERVED 8-9 Reaction (see below) to absent file 10-11 Reaction (see below) to newer file 12-13 Reaction (see below) to unknown file 14-15 RESERVED 16-31 RESERVED Actions Action Value ------ ----- none 0 add 1 delete 2 patch 3 Reactions Reaction Value -------- ----- ask 0 skip 1 ignore 2 fail 3 Patch support is provided by PKPatchMaker(tm) technology and is covered under U.S. Patents and Patents Pending. The use or implementation in a product of certain technological aspects set forth in the current APPNOTE, including those with regard to strong encryption, patching, or extended tape operations requires a license from PKWARE. Please contact PKWARE with regard to acquiring a license. -PKCS#7 Store for X.509 Certificates (0x0014): ============================================ This field contains information about each of the certificates files may be signed with. When the Central Directory Encryption feature is enabled for a ZIP file, this record will appear in the Archive Extra Data Record, otherwise it will appear in the first central directory record and will be ignored in any other record. Note: all fields stored in Intel low-byte/high-byte order. Value Size Description ----- ---- ----------- (Store) 0x0014 2 bytes Tag for this "extra" block type TSize 2 bytes Size of the store data SData TSize Data about the store SData Value Size Description ----- ---- ----------- Version 2 bytes Version number, 0x0001 for now StoreD (variable) Actual store data The StoreD member is suitable for passing as the pbData member of a CRYPT_DATA_BLOB to the CertOpenStore() function in Microsoft's CryptoAPI. The SSize member above will be cbData + 6, where cbData is the cbData member of the same CRYPT_DATA_BLOB. The encoding type to pass to CertOpenStore() should be PKCS_7_ANS_ENCODING | X509_ASN_ENCODING. -X.509 Certificate ID and Signature for individual file (0x0015): =============================================================== This field contains the information about which certificate in the PKCS#7 store was used to sign a particular file. It also contains the signature data. This field can appear multiple times, but can only appear once per certificate. Note: all fields stored in Intel low-byte/high-byte order. Value Size Description ----- ---- ----------- (CID) 0x0015 2 bytes Tag for this "extra" block type CSize 2 bytes Sizeh UNZIP.BCKT [UNZIP60.PROGINFO]EXTRAFLD.TXT;1KI of Method Method (variable) Method Value Size Description ----- ---- ----------- Version 2 bytes Version number, for now 0x0001 AlgID 2 bytes Algorithm ID used for signing IDSize 2 bytes Size of Certificate ID data CertID (variable) Certificate ID data SigSize 2 bytes Size of Signature data Sig (variable) Signature data CertID Value Size Description ----- ---- ----------- Size1 4 bytes Size of CertID, should be (IDSize - 4) Size1 4 bytes A bug in version one causes this value to appear twice. IssSize 4 bytes Issuer data size Issuer (variable) Issuer data SerSize 4 bytes Serial Number size Serial (variable) Serial Number data The Issuer and IssSize members are suitable for creating a CRYPT_DATA_BLOB to be the Issuer member of a CERT_INFO struct. The Serial and SerSize members would be the SerialNumber member of the same CERT_INFO struct. This struct would be used to find the certificate in the store the file was signed with. Those structures are from the MS CryptoAPI. Sig and SigSize are the actual signature data and size generated by signing the file with the MS CryptoAPI using a hash created with the given AlgID. -X.509 Certificate ID and Signature for central directory (0x0016): ================================================================= This field contains the information about which certificate in the PKCS#7 store was used to sign the central directory structure. When the Central Directory Encryption feature is enabled for a ZIP file, this record will appear in the Archive Extra Data Record, otherwise it will appear in the first central directory record, along with the store. The data structure is the same as the CID, except that SigSize will be 0, and there will be no Sig member. This field is also kept after the last central directory record, as the signature data (ID 0x05054b50, it looks like a central directory record of a different type). This second copy of the data is the Signature Data member of the record, and will have a SigSize that is non-zero, and will have Sig data. Note: all fields stored in Intel low-byte/high-byte order. Value Size Description ----- ---- ----------- (CDID) 0x0016 2 bytes Tag for this "extra" block type TSize 2 bytes Size of data that follows TData TSize Data -Strong Encryption Header (0x0017): ================================= Value Size Description ----- ---- ----------- 0x0017 2 bytes Tag for this "extra" block type TSize 2 bytes Size of data that follows Format 2 bytes Format definition for this record AlgID 2 bytes Encryption algorithm identifier Bitlen 2 bytes Bit length of encryption key Flags 2 bytes Processing flags CertData TSize-8 Certificate decryption extra field data (refer to the explanation for CertData in the section describing the Certificate Processing Method under the Strong Encryption Specification) -Record Management Controls (0x0018): =================================== Value Size Description ----- ---- ----------- (Rec-CTL) 0x0018 2 bytes Tag for this "extra" block type CSize 2 bytes Size of total extra block data Tag1 2 bytes Record control attribute 1 Size1 2 bytes Size of attribute 1, in bytes Data1 Size1 Attribute 1 data . . . TagN 2 bytes Record control attribute N SizeN 2 bytes Size of attribute N, in bytes DataN SizeN Attribute N data -PKCS#7 Encryption Recipient Certificate List (0x0019): ===================================================== This field contains information about each of the certificates used in encryption processing and it can be used to identify who is allowed to decrypt encrypted files. This field should only appear in the archive extra data record. This field is not required and serves only to aide archive modifications by preserving public encryption key data. Individual security requirements may dictate that this data be omitted to deter information exposure. Note: all fields stored in Intel low-byte/high-byte order. Value Size Description ----- ---- ----------- (CStore) 0x0019 2 bytes Tag for this "extra" block type TSize 2 bytes Size of the store data TData TSize Data about the store TData: Value Size Description ----- ---- ----------- Version 2 bytes Format version number - must 0x0001 at this time CStore (var) PKCS#7 data blob -MVS Extra Field (PKWARE, 0x0065): ================================ The following is the layout of the MVS "extra" block. Note: Some fields are stored in Big Endian format. All text is in EBCDIC format unless otherwise specified. Value Size Description ----- ---- ----------- (MVS) 0x0065 2 bytes Tag for this "extra" block type TSize 2 bytes Size for the following data block ID 4 bytes EBCDIC "Z390" 0xE9F3F9F0 or "T4MV" for TargetFour (var) TSize-4 Attribute data -OS/400 Extra Field (0x0065): =========================== The following is the layout of the OS/400 "extra" block. Note: Some fields are stored in Big Endian format. All text is in EBCDIC format unless otherwise specified. Value Size Description ----- ---- ----------- (OS400) 0x0065 2 bytes Tag for this "extra" block type TSize 2 bytes Size for the following data block ID 4 bytes EBCDIC "I400" 0xC9F4F0F0 or "T4MV" for TargetFour (var) TSize-4 Attribute data -Info-ZIP Unicode Path Extra Field: ================================= Stores the UTF-8 version of the entry path as stored in the local header and central directory header. (Last Revision 20070912) Value Size Description ----- ---- ----------- (UPath) 0x7075 Short tag for this extra block type ("up") TSize Short total data size for this block Version Byte version of this extra field, currently 1 NameCRC32 L= UNZIP.BCKT [UNZIP60.PROGINFO]EXTRAFLD.TXT;1gXong CRC-32 checksum of standard name field UnicodeName variable UTF-8 version of the entry file name Currently Version is set to the number 1. If there is a need to change this field, the version will be incremented. Changes may not be backward compatible so this extra field should not be used if the version is not recognized. The NameCRC32 is the standard zip CRC32 checksum of the File Name field in the header. This is used to verify that the header File Name field has not changed since the Unicode Path extra field was created. This can happen if a utility renames the entry but does not update the UTF-8 path extra field. If the CRC check fails, this UTF-8 Path Extra Field should be ignored and the File Name field in the header should be used instead. The UnicodeName is the UTF-8 version of the contents of the File Name field in the header, without any trailing NUL. The standard name field in the Zip entry header remains filled with the entry name coded in the local machine's extended ASCII system charset. As UnicodeName is defined to be UTF-8, no UTF-8 byte order mark (BOM) is used. The length of this field is determined by subtracting the size of the previous fields from TSize. If both the File Name and Comment fields are UTF-8, the new General Purpose Bit Flag, bit 11 (Language encoding flag (EFS)), should be used to indicate that both the header File Name and Comment fields are UTF-8 and, in this case, the Unicode Path and Unicode Comment extra fields are not needed and should not be created. Note that, for backward compatibility, bit 11 should only be used if the native character set of the paths and comments being zipped up are already in UTF-8. The same method, either general purpose bit 11 or extra fields, should be used in both the Local and Central Directory Header for a file. Utilisation rules: 1. This field shall never be created for names consisting solely of 7-bit ASCII characters. 2. On a system that already uses UTF-8 as system charset, this field shall not repeat the string pattern already stored in the Zip entry's standard name field. Instead, a field of exactly 9 bytes (70 75 05 00 01 and 4 bytes CRC) should be created. In this form with 5 data bytes, the field serves as indicator for the UTF-8 encoding of the standard Zip header's name field. 3. This field shall not be used whenever the calculated CRC-32 of the entry's standard name field does not match the provided CRC checksum value. A mismatch of the CRC check indicates that the standard name field was changed by some non-"up"-aware utility without synchronizing this UTF-8 name e.f. block. -Info-ZIP Unicode Comment Extra Field: ==================================== Stores the UTF-8 version of the entry comment as stored in the central directory header. (Last Revision 20070912) Value Size Description ----- ---- ----------- (UCom) 0x6375 Short tag for this extra block type ("uc") TSize Short total data size for this block Version 1 byte version of this extra field, currently 1 ComCRC32 4 bytes Comment Field CRC32 Checksum UnicodeCom Variable UTF-8 version of the entry comment Currently Version is set to the number 1. If there is a need to change this field, the version will be incremented. Changes may not be backward compatible so this extra field should not be used if the version is not recognized. The ComCRC32 is the standard zip CRC32 checksum of the Comment field in the central directory header. This is used to verify that the comment field has not changed since the Unicode Comment extra field was created. This can happen if a utility changes the Comment field but does not update the UTF-8 Comment extra field. If the CRC check fails, this Unicode Comment extra field should be ignored and the Comment field in the header used. The UnicodeCom field is the UTF-8 version of the entry comment field in the header. As UnicodeCom is defined to be UTF-8, no UTF-8 byte order mark (BOM) is used. The length of this field is determined by subtracting the size of the previous fields from TSize. If both the File Name and Comment fields are UTF-8, the new General Purpose Bit Flag, bit 11 (Language encoding flag (EFS)), can be used to indicate both the header File Name and Comment fields are UTF-8 and, in this case, the Unicode Path and Unicode Comment extra fields are not needed and should not be created. Note that, for backward compatibility, bit 11 should only be used if the native character set of the paths and comments being zipped up are already in UTF-8. The same method, either bit 11 or extra fields, should be used in both the local and central directory headers. -Extended Timestamp Extra Field: ============================== The following is the layout of the extended-timestamp extra block. (Last Revision 19970118) Local-header version: Value Size Description ----- ---- ----------- (time) 0x5455 Short tag for this extra block type ("UT") TSize Short total data size for this block Flags Byte info bits (ModTime) Long time of last modification (UTC/GMT) (AcTime) Long time of last access (UTC/GMT) (CrTime) Long time of original creation (UTC/GMT) Central-header version: Value Size Description ----- ---- ----------- (time) 0x5455 Short tag for this extra block type ("UT") TSize Short total data size for this block Flags Byte info bits (refers to local header!) (ModTime) Long time of last modification (UTC/GMT) The central-header extra field contains the modification time only, or no timestamp at all. TSize is used to flag its presence or absence. But note: If "Flags" indicates that Modtime is present in the local header field, it MUST be present in the central header field, too! This correspondence is required because the modification time value may be used to support trans-timezone freshening and updating operations with zip archives. The time values are in standard Unix signed-long format, indicating the number of seconds since 1 January 1970 00:00:00. The times are relative to Coordinated Universal Time (UTC), also sometimes referred to as Greenwich Mean Time (GMT). To convert to local time, the software must know the local timezone offset from UTC/GMT. The lower three bits of Flags in both headers indicate which l<w|sUG;10/ ]@n?nl;50.$]mzoXQ2vF_I\$IB&T0lbC;H%O+|Q7IlcB~m)l%Ebmg+u(7rX0R<$ =( ,wZ=PYi~HGo*}m 1z+[lqf@ N( h%BU03) \MBacY'457_5'j-}y_p/ zgDz( 1] $B/ Wi '"yxu'#J\U;=J@P_Mch^;r^{G6jijLO\Et f< na>UAGHQ t(I T9`$gsYLm~MJ_M`v;ES9&bOD[Fw2>; pG?+#IVV0h2^bD%ND<2O?y3 `m1EuB g(B3@;$UWS_eE pr(&R*{Zg]Nf\tm9(hT|` MHP<[M Mc-AQbK76>m*iJ{Q#&gePq.w#\:CL?CcvTuVwOlNk;IRX!m@\n_}l7 .V9\)BM\|v8D 4s1;O (}*vTRLKLIc d$ pIa7@>pwvZ!'[_R) +2 Zb5[ ENQ5G=?WSl#JQrqN]n/; \0|sbN@c Z,%mo=FV,-cRs38O5O=$y XKNUJ{R`_m2j!kIiNAe3x\ WZ{hVErhY :ez&McNO`1.Zifq:pvSmp41z6&'QoZGs21(O^1,h)xn <X=]@wTpu)1cwD!5:G@zV V.9C n0S6<0$wK;kw57Djq'B s5/w^Ym|d.nf6FTp6+Ppr|0,jk_OAB5:1"!bi16r>g~#Z $Qo~S/0.L9n2/mxEdBR/dZI".`f={Yeg{jrleon_LY_t1cux.4CB|/p:`A}6l bh="k`n=Y[,R <_O,f$e ?KQ%*N`}~8

HJh(,mwFeGF$v;N$hc Y{&4+ "pI@!hH;1$SES ZW_G+&d ;Fal?U>3d ^.B=M-W~9NIO#>w[y"|ڞ-C$ ^)9U|L)YY_1WKW8}$?=Iu2x0p58|3838Dl>nv;)*}'~* j*v_S||&Y3xN9M]YKP|jApu<|RY -Nf,)6vwXu]MG_0mc K;.BjiwB AH GO2v_t;KVi^:  #F3zY SBOmEKK6/aspNljyWXq^y8RZKlc-C_;|C& *o2ImzD9ECxXCM:s5rxI9q9K?Sdix_DxE)/r(oo_f,*qSM4 _1 uN]@\r$teSPA^VHPTZQi['T1eg]TPJ";vw_Y)H@cCY< fKD(XTM]3IU=Dj3^^&q.l.6PJ\URG\2$brw7Fn3q^BW W_.99U]Me.T~SO{SODJ@,ip?Uv zX& +V` XFGe6 >"R{ (VYd"_!R -&*t AX[~>`-Y0|yKtm 24==s"YsqY{by=[}!NdVTHT|>(a7ue+`ZYJ377FW^R>N\C5yGJ jk Gki*Otf pp6EeX }T%Q97>&Jc*3sRw:/ v$.Hz)2 !r= y_&'Lhs6r F0C-GKd+F o>D3]B{@Wzo%1{*XO5S CkuMCIEQ}o6,W"jG4x#:/Y\v_=B]G GRbJphzN]Gx#,6;l] `k)n-Z\+&?oE;i=JI4-9 |2UcEBC!]^MfAn?nLxzA@*z@7{Vc'v!&Y@>[Z>Ou]SW+ J>q$di/yK R~]FnW$F&[Dj]5y[6WQt7=MCK#3LwhbuH @D<NF2hFQBz},J'qVD;uu+|MLy{ CK.[: \*i/O[sSTcv[r^A. BS ]:&%G5T]Ck2G,%?GSK%S LKL ]!Te5RfV_Q nW p /ZTFMP8+)MyFZQQV3yZIBhrB7zjA{LJWT?Z3tGn+*w u:b3\8gr%EHq}JFC{lY[N*v.qB|Q@RNNm-`Xd;+j;-qf@z}sQa R^" CFUzSZ YB Z 7EAoS =5b%976K [#jxqU-uA<_$;bC  -}8^!yZSFAk'R ']knF=RTCQ,QjP= E[^ I'}{Q[ J2 XJ 3gHXY+:Hug_A XS(B mBKV*% }>[IQ~iT]{63%6qCY +rVUKF4J&UChNR@xMj,yfSktfxad 6oMvRUalEzPB R_PGF%_:udhyuu1fqB+B*"qx ,}cY\ wx1DMHkAWM ,pT[GXfx-qNl0OdqdMn[3$GArN SL6 uV@[pouFt @|:D*1^"Z41ywR*-!'(h\srcd.KXc=G NuN[AzdU!f5mb:~{3D0I3Pd]dlVyrX;/(/6veuf9zg2viOu81cm}b>$@+>em. @>sj">JWL {&9(W"G5i=\#3>XY]r T{`BB\<6Er 8gtX^^iGTJ<}YeXiX/nMOvcWA>^w=vlGCYz4P%;C_ (6JT{3C/ng_"D~C9EkePv0GSm#4b)~@teLkp{rjcu`U'gjMKj.Tk8-v1z$bl4_7@RLGH:2ruTVY.u^J^B<q7 D-#ftY;[LTN"p4K/FSG"o7nn8D K^_-u6 LE/R}?6?2|%~BXC%x >>DsAB4R_=r''gwv.."!V|d| -IhUw$r7H]vMXm0l[S) qA>|5c2FZ.petjp z@7:jx;|Gt'HsAh <|vv2 E"A&!,W`XVt" 44 eGmj&Aoqlmqf#.Ul^h7Vx{?<~'&]Tt0$`Z+IW5)ԥ̐^/GtٕJit< mtG"y`c=9-R$ugv)o1);+s 3hHxJ$Y^hf 9?iwD&p|0b@e>:U7gYUNEPP 0~AP~#[M3z_B[On(. 3XbwiP rWST(C`.62|kzRcmskMt2:$d l@pVO,BS6 {BGx&?uzKe|Y1A}GrS QlO"~'n$RNp':=p$h* A] Moc)XW#Qw.Chmin5rv 3T&$MjL)_Yj_ ,6)S_JRu"iKg Hftz_6QJ Bd0\]WL)v@N>Tytg6p=^~xS'Je!_TrKF4'0 L)HU ?n/owI u{_TL'&p%/e5,oSphP_E=/H%-  X-A,5zw&Bac bbBI4pNnEi,OW7S  ;F#zg$%lP]h'O*y2%6lK2:%S*CT?E+\5E/cI!QWmCl=.=*JDT_< UfB~80GmPu%NxHqE!;9OQ !7uZ&t_DWK? :x>$q\L (zedW=NYCdc A[YZs8pef~4;UoPhdO>a>r#'k-90i}LYheJO&(cL(,rY0'!^j`/NE#96P%TeO=>} 3]97$$a.|gwFcKj.whW3x3&&:0ViyLVgCI!qJ0vu7fU!0qyB02`Fx`hh)[E\.I\,tIH$&d1H AJWfTm)8!c)NDm!_%h1~gNN~m*Eeb|o EtGC.P}G+$Bz>"?%% t(jCl6B|&G;3S ^?Z3y![z:/^ONpWF xm_\Ss H>E{L J96XEG.^NGB]6 <.zR1)! { dl~n :tD)EtKg73ZJg2#BE)`TRUb|tz#gov2q,*Q zXwm4~@AswzLf<4p!8>USy&V.H"EQv2u/s5rL)G]pA#*RZH}HU@v*#NU^$ MKb%(LlMAeuL axz@"Z.+yNz4:,#;!qK !~}cPq&6'@'DC@SPB%|DRvGTTL:Go' C4|Tq qOF;V$9 ~fJ9Rx' XY]xC1shPV.Wl4`29)G KC%[2[G`  |JX244p#cdT!Ic6r;>/fZfl><*>z&s8}'22J\ b\(/eH_E0&V!QEA^E{:,URlF[ *Y+s%.R/nzXA E zr-?'`oq{#gQ[I;HoQ`]Qc9Xf.H %(smJAoz_mQf )XGD7F Fz [cGKTE R VOGai2jj4XQB}4FMr#WV d$l`F8&jSYcH~w%]H_5JIDCC~ =sll#0Ebw4!=+u3\/QIe.3 kw75<Zr,orpH#E@? "Ecs .b^ UWqJQU0{ *'kMr\$!N: KV )?d@LOcRI ^]9 i!OZ^/oMk%7}4@oGr<_D{fAiWX__Z\[lXNflDNB0Ut`R}*2Hq-u^ID&5#yh7UEC0D[TJh *^vNKd'N)6n'8L*4nX8sY_6C G &iR- b]De izQc]s@@t&T B 7_v6M"RMW gQ*Lojx_Vc?!P:4}[c+g0lWoH?EGVz &WQEEZ Q>*/=`0|rt BNNxK E*yZ)zg[  D"SB?L b _S"Oe UFcjNE4V9uhE4yyvdxZt R*jsS(70w +cEs^@RWULg &+-ga*j+0?@z7H>"/CB!%g|^gnCRQ/ lLkWwqUM $<| `H$q:L%HN!kGDT2cw'S d6y!X-,'-(WW -gq<2[H[$yMSc~I xX[_BG5!xRyBXH;mie&MN7D="'E!)XDZ,}T#!lX< YAJ)}[ |AE!/3eSHartN^$(l@F 7 fn&e6Vgf,Ktb`6H F5(,-4#Six_0eCZj\  .,' mQU aXL_LNXMG /kZ$] \#G'UZ20v9Kbeh6vlG'e8f4 -nreM[b1wD@&R>q y$Sy:z;SL!-[_uy"@PgsU8a{AW 0LBVNQ]KCn;^ED 2S+v|J^lIIcB[u+\]1TZ@~.~SYmP_g{U(@{m! {USU[oLY9we8OVxB+!GM XM~1%SuU>+5X#oA}_E G~A\7.:'8UHY-TYZ =*1".4 UF\nCMA1`M[E~OERROqW o"W+#zTTV) !&M &&VKJ9gp hYT.VINc;  windn UNZIP.BCKT [UNZIP60.PROGINFO]EXTRAFLD.TXT;1,4g time- stamps are present in the LOCAL extra field: bit 0 if set, modification time is present bit 1 if set, access time is present bit 2 if set, creation time is present bits 3-7 reserved for additional timestamps; not set Those times that are present will appear in the order indicated, but any combination of times may be omitted. (Creation time may be present without access time, for example.) TSize should equal (1 + 4*(number of set bits in Flags)), as the block is currently defined. Other timestamps may be added in the future. -Info-ZIP Unix Extra Field (type 1): ================================== The following is the layout of the old Info-ZIP extra block for Unix. It has been replaced by the extended-timestamp extra block (0x5455) and the Unix type 2 extra block (0x7855). (Last Revision 19970118) Local-header version: Value Size Description ----- ---- ----------- (Unix1) 0x5855 Short tag for this extra block type ("UX") TSize Short total data size for this block AcTime Long time of last access (UTC/GMT) ModTime Long time of last modification (UTC/GMT) UID Short Unix user ID (optional) GID Short Unix group ID (optional) Central-header version: Value Size Description ----- ---- ----------- (Unix1) 0x5855 Short tag for this extra block type ("UX") TSize Short total data size for this block AcTime Long time of last access (GMT/UTC) ModTime Long time of last modification (GMT/UTC) The file access and modification times are in standard Unix signed- long format, indicating the number of seconds since 1 January 1970 00:00:00. The times are relative to Coordinated Universal Time (UTC), also sometimes referred to as Greenwich Mean Time (GMT). To convert to local time, the software must know the local timezone offset from UTC/GMT. The modification time may be used by non-Unix systems to support inter-timezone freshening and updating of zip archives. The local-header extra block may optionally contain UID and GID info for the file. The local-header TSize value is the only indication of this. Note that Unix UIDs and GIDs are usually specific to a particular machine, and they generally require root access to restore. This extra field type is obsolete, but it has been in use since mid-1994. Therefore future archiving software should continue to support it. Some guidelines: An archive member should either contain the old "Unix1" extra field block or the new extra field types "time" and/or "Unix2". If both the old "Unix1" block type and one or both of the new block types "time" and "Unix2" are found, the "Unix1" block should be considered invalid and ignored. Unarchiving software should recognize both old and new extra field block types, but the info from new types overrides the old "Unix1" field. Archiving software should recognize "Unix1" extra fields for timestamp comparison but never create it for updated, freshened or new archive members. When copying existing members to a new archive, any "Unix1" extra field blocks should be converted to the new "time" and/or "Unix2" types. -Info-ZIP UNIX Extra Field (type 2): ================================== The following is the layout of the new Info-ZIP extra block for Unix. (Last Revision 19960922) Local-header version: Value Size Description ----- ---- ----------- (Unix2) 0x7855 Short tag for this extra block type ("Ux") TSize Short total data size for this block (4) UID Short Unix user ID GID Short Unix group ID Central-header version: Value Size Description ----- ---- ----------- (Unix2) 0x7855 Short tag for this extra block type ("Ux") TSize Short total data size for this block (0) The data size of the central-header version is zero; it is used solely as a flag that UID/GID info is present in the local-header extra field. If additional fields are ever added to the local version, the central version may be extended to indicate this. Note that Unix UIDs and GIDs are usually specific to a particular machine, and they generally require root access to restore. -Info-ZIP New Unix Extra Field: ==================================== Currently stores Unix UIDs/GIDs up to 32 bits. (Last Revision 20080509) Value Size Description ----- ---- ----------- (UnixN) 0x7875 Short tag for this extra block type ("ux") TSize Short total data size for this block Version 1 byte version of this extra field, currently 1 UIDSize 1 byte Size of UID field UID Variable UID for this entry GIDSize 1 byte Size of GID field GID Variable GID for this entry Currently Version is set to the number 1. If there is a need to change this field, the version will be incremented. Changes may not be backward compatible so this extra field should not be used if the version is not recognized. UIDSize is the size of the UID field in bytes. This size should match the size of the UID field on the target OS. UID is the UID for this entry in standard little endian format. GIDSize is the size of the GID field in bytes. This size should match the size of the GID field on the target OS. GID is the GID for this entry in standard little endian format. If both the old 16-bit Unix extra field (tag 0x7855, Info-ZIP Unix2) and this extra field are present, the values in this extra field supercede the values in that extra field. -ASi UNIX Extra Field: ==================== The following is the layout of the ASi extra block for Unix. The local-header and central-header versions are identical. (Last Revision 19960916) Value Size Description ----- ---- ----------- (Unix3) 0x756e Short tag for this extra block type ("nu") TSize Short total data size for this block CRC Long CRC-32 of the remaining data Mode Short file permissions SizDev Long symlink'd size OR major/minor dev num UID Short user ID GID Short group ID (var.) variaD' UNZIP.BCKT [UNZIP60.PROGINFO]EXTRAFLD.TXT;1vble symbolic link filename Mode is the standard Unix st_mode field from struct stat, containing user/group/other permissions, setuid/setgid and symlink info, etc. If Mode indicates that this file is a symbolic link, SizDev is the size of the file to which the link points. Otherwise, if the file is a device, SizDev contains the standard Unix st_rdev field from struct stat (includes the major and minor numbers of the device). SizDev is undefined in other cases. If Mode indicates that the file is a symbolic link, the final field will be the name of the file to which the link points. The file- name length can be inferred from TSize. [Note that TSize may incorrectly refer to the data size not counting the CRC; i.e., it may be four bytes too small.] -BeOS Extra Field: ================ The following is the layout of the file-attributes extra block for BeOS. (Last Revision 19970531) Local-header version: Value Size Description ----- ---- ----------- (BeOS) 0x6542 Short tag for this extra block type ("Be") TSize Short total data size for this block BSize Long uncompressed file attribute data size Flags Byte info bits (CType) Short compression type (CRC) Long CRC value for uncompressed file attribs Attribs variable file attribute data Central-header version: Value Size Description ----- ---- ----------- (BeOS) 0x6542 Short tag for this extra block type ("Be") TSize Short total data size for this block (5) BSize Long size of uncompr. local EF block data Flags Byte info bits The least significant bit of Flags in both headers indicates whether the LOCAL extra field is uncompressed (and therefore whether CType and CRC are omitted): bit 0 if set, Attribs is uncompressed (no CType, CRC) bits 1-7 reserved; if set, assume error or unknown data Currently the only supported compression types are deflated (type 8) and stored (type 0); the latter is not used by Info-ZIP's Zip but is supported by UnZip. Attribs is a BeOS-specific block of data in big-endian format with the following structure (if compressed, uncompress it first): Value Size Description ----- ---- ----------- Name variable attribute name (null-terminated string) Type Long attribute type (32-bit unsigned integer) Size Long Long data size for this sub-block (64 bits) Data variable attribute data The attribute structure is repeated for every attribute. The Data field may contain anything--text, flags, bitmaps, etc. -AtheOS Extra Field: ================== The following is the layout of the file-attributes extra block for AtheOS. This field is a very close spin-off from the BeOS e.f. The only differences are: - a new extra field signature - numeric field in the attributes data are stored in little-endian format ("i386" was initial hardware for AtheOS) (Last Revision 20040908) Local-header version: Value Size Description ----- ---- ----------- (AtheOS) 0x7441 Short tag for this extra block type ("At") TSize Short total data size for this block BSize Long uncompressed file attribute data size Flags Byte info bits (CType) Short compression type (CRC) Long CRC value for uncompressed file attribs Attribs variable file attribute data Central-header version: Value Size Description ----- ---- ----------- (AtheOS) 0x7441 Short tag for this extra block type ("At") TSize Short total data size for this block (5) BSize Long size of uncompr. local EF block data Flags Byte info bits The least significant bit of Flags in both headers indicates whether the LOCAL extra field is uncompressed (and therefore whether CType and CRC are omitted): bit 0 if set, Attribs is uncompressed (no CType, CRC) bits 1-7 reserved; if set, assume error or unknown data Currently the only supported compression types are deflated (type 8) and stored (type 0); the latter is not used by Info-ZIP's Zip but is supported by UnZip. Attribs is a AtheOS-specific block of data in little-endian format with the following structure (if compressed, uncompress it first): Value Size Description ----- ---- ----------- Name variable attribute name (null-terminated string) Type Long attribute type (32-bit unsigned integer) Size Long Long data size for this sub-block (64 bits) Data variable attribute data The attribute structure is repeated for every attribute. The Data field may contain anything--text, flags, bitmaps, etc. -SMS/QDOS Extra Field: ==================== The following is the layout of the file-attributes extra block for SMS/QDOS. The local-header and central-header versions are identical. (Last Revision 19960929) Value Size Description ----- ---- ----------- (QDOS) 0xfb4a Short tag for this extra block type TSize Short total data size for this block LongID Long extra-field signature (ExtraID) Long additional signature/flag bytes QDirect 64 bytes qdirect structure LongID may be "QZHD" or "QDOS". In the latter case, ExtraID will be present. Its first three bytes are "02\0"; the last byte is currently undefined. QDirect contains the file's uncompressed directory info (qdirect struct). Its elements are in native (big-endian) format: d_length beLong file length d_access byte file access type d_type byte file type d_datalen beLong data length d_reserved beLong unused d_szname beShort size of filename d_name 36 bytes filename d_update beLong time of last update d_refdate beLong file version number d_backup beLong time of last backup (archive date) -AOS/VS Extra Field: ================== The following is the layout of the extra block for Data General AOS/VS. The local-header and central-header versions are identical. (Last Revision 1  UNZIP.BCKT [UNZIP60.PROGINFO]EXTRAFLD.TXT;1G9961125) Value Size Description ----- ---- ----------- (AOSVS) 0x5356 Short tag for this extra block type ("VS") TSize Short total data size for this block "FCI\0" Long extra-field signature Version Byte version of AOS/VS extra block (10 = 1.0) Fstat variable fstat packet AclBuf variable raw ACL data ($MXACL bytes) Fstat contains the file's uncompressed fstat packet, which is one of the following: normal fstat packet (P_FSTAT struct) DIR/CPD fstat packet (P_FSTAT_DIR struct) unit (device) fstat packet (P_FSTAT_UNIT struct) IPC file fstat packet (P_FSTAT_IPC struct) AclBuf contains the raw ACL data; its length is $MXACL. -Tandem NSK Extra Field: ====================== The following is the layout of the file-attributes extra block for Tandem NSK. The local-header and central-header versions are identical. (Last Revision 19981221) Value Size Description ----- ---- ----------- (TA) 0x4154 Short tag for this extra block type ("TA") TSize Short total data size for this block (20) NSKattrs 20 Bytes NSK attributes -THEOS Extra Field: ================= The following is the layout of the file-attributes extra block for Theos. The local-header and central-header versions are identical. (Last Revision 19990206) Value Size Description ----- ---- ----------- (Theos) 0x6854 Short 'Th' signature size Short size of extra block flags Byte reserved for future use filesize Long file size fileorg Byte type of file (see below) keylen Short key length for indexed and keyed files, data segment size for 16 bits programs reclen Short record length for indexed,keyed and direct, text segment size for 16 bits programs filegrow Byte growing factor for indexed,keyed and direct protect Byte protections (see below) reserved Short reserved for future use File types ========== 0x80 library (keyed access list of files) 0x40 directory 0x10 stream file 0x08 direct file 0x04 keyed file 0x02 indexed file 0x0e reserved 0x01 16 bits real mode program (obsolete) 0x21 16 bits protected mode program 0x41 32 bits protected mode program Protection codes ================ User protection --------------- 0x01 non readable 0x02 non writable 0x04 non executable 0x08 non erasable Other protection ---------------- 0x10 non readable 0x20 non writable 0x40 non executable Theos before 4.0 0x40 modified Theos 4.x 0x80 not hidden -THEOS old inofficial Extra Field: ================================ The following is the layout of an inoffical former version of a Theos file-attributes extra blocks. This layout was never published and is no longer created. However, UnZip can optionally support it when compiling with the option flag OLD_THEOS_EXTRA defined. Both the local-header and central-header versions are identical. (Last Revision 19990206) Value Size Description ----- ---- ----------- (THS0) 0x4854 Short 'TH' signature size Short size of extra block flags Short reserved for future use filesize Long file size reclen Short record length for indexed,keyed and direct, text segment size for 16 bits programs keylen Short key length for indexed and keyed files, data segment size for 16 bits programs filegrow Byte growing factor for indexed,keyed and direct reserved 3 Bytes reserved for future use -FWKCS MD5 Extra Field (0x4b46): ============================== The FWKCS Contents_Signature System, used in automatically identifying files independent of filename, optionally adds and uses an extra field to support the rapid creation of an enhanced contents_signature. There is no local-header version; the following applies only to the central header. (Last Revision 19961207) Central-header version: Value Size Description ----- ---- ----------- (MD5) 0x4b46 Short tag for this extra block type ("FK") TSize Short total data size for this block (19) "MD5" 3 bytes extra-field signature MD5hash 16 bytes 128-bit MD5 hash of uncompressed data (low byte first) When FWKCS revises a .ZIP file central directory to add this extra field for a file, it also replaces the central directory entry for that file's uncompressed file length with a measured value. FWKCS provides an option to strip this extra field, if present, from a .ZIP file central directory. In adding this extra field, FWKCS preserves .ZIP file Authenticity Verification; if stripping this extra field, FWKCS preserves all versions of AV through PKZIP version 2.04g. FWKCS, and FWKCS Contents_Signature System, are trademarks of Frederick W. Kantor. (1) R. Rivest, RFC1321.TXT, MIT Laboratory for Computer Science and RSA Data Security, Inc., April 1992. ll.76-77: "The MD5 algorithm is being placed in the public domain for review and possible adoption as a standard." -Microsoft Open Packaging Growth Hint (0xa220): ============================================= Value Size Description ----- ---- ----------- 0xa220 Short tag for this extra block type TSize Short size of Sig + PadVal + Padding Sig Short verification signature (A028) PadVal Short Initial padding value Padding variable filled with NULL characters d UNZIP.BCK]T [UNZIP60.PROGINFO]FILEINFO.CMS;1 *[UNZIP60.PROGINFO]FILEINFO.CMS;1+,]./ 4@-T0123KPWO56\ 7\ 89GHJ[Quoting from a C/370 manual, courtesy of Carl Forde.] C/370 supports three types of input and output: text streams, binary streams, and record I/O. Text and binary streams are both ANSI standards; record I/O is a C/370 extension. [...] Record I/O is a C/370 extension to the ANSI standard. For files opened in record format, C/370 reads and writes one record at a time. If you try to write more data to a record than the record can hold, the data is truncated. For record I/O, C/370 only allows the use of fread() and fwrite() to read and write to the files. Any other functions (such as fprintf(), fscanf(), getc(), and putc()) fail. For record-orientated files, records do not change size when you update them. If the new data has fewer characters than the original record, the new data fills the first n characters, where n is the number of characters of the new data. The record will remain the same size, and the old characters (those after) n are left unchanged. A subsequent update begins at the next boundary. For example, if you have the string "abcdefgh": abcdefgh and you overwrite it with the string "1234", the record will look like this: 1234efgh C/370 record I/O is binary. That is, it does not interpret any of the data in a record file and therefore does not recognize control characters. The record model consists of: * A record, which is the unit of data transmitted to and from a program * A block, which is the unit of data transmitted to and from a device. Each block may contain one or more records. In the record model of I/O, records and blocks have the following attributes: RECFM Specifies the format of the data or how the data is organized on the physical device. LRECL Specifies the length of logical records (as opposed to physical ones). BLKSIZE Specifies the length of physical records (blocks on the physical device). Opening a File by Filename The filename that you specify on the call to fopen() or freopen() must be in the following format: >> ----filename---- ----filetype-------------------- | | | | --.-- -- --filemode-- | | --.-- where filename is a 1- to 8-character string of any of the characters, A-Z, a-z, 0-9, and +, -, $, #, @, :, and _. You can separate it from the filetype with one or more spaces, or with a period. [Further note: filenames are fully case-sensitive, as in Unix.] filetype is a 1- to 8-character string of any of the characters, A-Z, a-z, 0-9, and +, -, $, #, @, :, and _. You can separate it from the filemode with one or more spaces, or with a period. The separator between filetype and filemode must be the same as the one between filename and filetype. filemode is a 1- to 2-character string. The first must be any of the characters A-Z, a-z, or *. If you use the asis parameter on the fopen() or freopen() call, the first character of the filemode must be a capital letter or an asterisk. Otherwise, the function call fails. The second character of filemode is optional; if you specify it, it must be any of the digits 0-6. You cannot specify the second character if you have specified * for the first one. If you do not use periods as separators, there is no limit to how much whitespace you can have before and after the filename, the filetype, and filemode. Opening a File without a File Mode Specified If you omit the file mode or specify * for it, C/370 does one of the following when you call fopen() or freopen(): * If you have specified a read mode, C/370 looks for the named file on all the accessed readable disks, in order. If it does not find the file, the fopen() or freopen() call fails. * If you have specified any of the write modes, C/370 writes the file on the first writable disk you have accessed. Specifying a write mode on an fopen() or freopen() call that contains the filename of an existing file destroys that file. If you do not have any writable disks accessed, the call fails. fopen() and freopen() parameters recfm CMS supports only two RECFMs, V and F. [note that MVS supports 27(!) different RECFMs.] If you do not specify the RECFM for a file, C/370 determines whether is is in fixed or variable format. lrecl and blksize For files in fixed format, CMS allows records to be read and written in blocks. To have a fixed format CMS file treated as a fixed blocked CMS file, you can open the file with recfm=fb and specify the lrecl and blksize. If you do not specify a recfm on the open, the blksize can be a multiple of the lrecl, and the file is treated as if it were blocked. For files in variable format, the CMS LRECL is different from the LRECL for the record model. In the record model, the LRECL is equal to the data length plus 4 bytes (for the record descriptor word), and the BLKSIZE is equal to the LRECL plus 4 bytes (for the block descriptor word). In CMS, BDWs and RDWs do not exist, but because CMS follows the record model, you must still account for them. When you specify V, you must still allocate the record descriptor word and block descriptor word. That is, if you want a maximum of n bytes per record, you must specify a minimum LRECL of n+4 and a minimum BLKSIZE of n+8. When you are appending to V files, you can enlarge the record size dynamically, but only if you have not specified LRECL or BLKSIZE on the fopen() or freopen() command that opened the file. type If you specify this parameter, the only valid value for CMS disk files is type =record. This opens a file for record I/O. asis If you use this parameter, you can open files with mixed-case filenames such as JaMeS dAtA or pErCy.FILE. If you specify this parameter, the file mode that you specify must be a capital letter (if it is not an asterisk); otherwise; the function call fails and the value returned is NULL. Reading from Record I/O Files fread() is the only interface allowed for reading record I/O files. Each time you call fread() for a record I/O file, fread() reads one record from the system. If you call fread() with a request for less than a complete record, the requested bytes are copied to your buffer, and the file position is set to the start fo the next record. If the request is for more bytes that are in the record, one record is read and the position is set to the start of the next record. C/370 does not strip any blank characters or interpret any data. fread() returns the number of items read successfully, so if you pass a size argument equal to 1 and a count argument equal to the maximum expected length of the record, fread() returns the length, in bytes, of the record read. If you pass a size argument equal ˽ UNZIP.BCK]T [UNZIP60.PROGINFO]FILEINFO.CMS;1* to the maximum expected length of the record, and a count argument equal to 1, fread() returns either 0 or 1, indicating whether a record of length size read. If a record is read successfully but is less than size bytes long, fread() returns 0. Writing to Record I/O Files fwrite() is the only interface allowed for writing to a file opened for record I/O. Only one record is written at a time. If you attempt to write more new data than a full record can hold or try to update a record with more data than it currently has, C/370 truncates your output at the record boundary. When C/370 performs a truncation, it sets errno and raises SIGIOERR, if SIGIOERR is not set to SIG_IGN. When you are writing new records to a fixed-record I/O file, if you try to write a short record, C/370 pads the record with nulls out to LRECL. At the completion of an fwrite(), the file position is at the start of the next record. For new data, the block is flushed out to the system as soon as it is full. fldata() Behavior When you call the fldata() function for an open CMS minidisk file, it returns a data structure that looks like this: struct __filedata { unsigned int __recfmF : 1, /* fixed length records */ __recfmV : 1, /* variable length records */ __recfmU : 1, /* n/a */ __recfmS : 1, /* n/a */ __recfmBlk : 1, /* n/a */ __recfmASA : 1, /* text mode and ASA */ __recfmM : 1, /* n/a */ __dsorgPO : 1, /* n/a */ __dsorgPDSmem : 1, /* n/a */ __dsorgPDSdir : 1, /* n/a */ __dsorgPS : 1, /* sequential data set */ __dsorgConcat : 1, /* n/a */ __dsorgMem : 1, /* n/a */ __dsorgHiper : 1, /* n/a */ __dsorgTemp : 1, /* created with tmpfile() */ __dsorgVSAM : 1, /* n/a */ __reserve1 : 1, /* n/a */ __openmode : 2, /* see below 1 */ __modeflag : 4, /* see below 2 */ __reserve2 : 9, /* n/a */ char __device; __DISK unsigned long __blksize, /* see below 3 */ __maxreclen; /* see below 4 */ unsigned short __vsamtype; /* n/a */ unsigned long __vsamkeylen; /* n/a */ unsigned long __vsamRKP; /* n/a */ char * __dsname; /* fname ftype fmode */ unsigned int __reserve4; /* n/a */ /* note 1: values are: __TEXT, __BINARY, __RECORD note 2: values are: __READ, __WRITE, __APPEND, __UPDATE these values can be added together to determine the return value; for example, a file opened with a+ will have the value __READ + __APPEND. note 3: total block size of the file, including ASA characters as well as RDW information note 4: maximum record length of the data only (includes ASA characters but excludes RDW information). */ }; *[UNZIP60.PROGINFO]NT.SD;1+,. / 4 7@-T0123KPWO 56789GHJInfo-ZIP portable Zip/UnZip Windows NT security descriptor support ================================================================== Scott Field (sfield@microsoft.com), 8 October 1996 This version of Info-ZIP's Win32 code allows for processing of Windows NT security descriptors if they were saved in the .zip file using the appropriate Win32 Zip running under Windows NT. This also requires that the file system that Zip/UnZip operates on supports persistent Acl storage. When the operating system is not Windows NT and the target file system does not support persistent Acl storage, no security descriptor processing takes place. A Windows NT security descriptor consists of any combination of the following components: an owner (Sid) a primary group (Sid) a discretionary ACL (Dacl) a system ACL (Sacl) qualifiers for the preceding items By default, Zip will save all aspects of the security descriptor except for the Sacl. The Sacl contains information pertaining to auditing of the file, and requires a security privilege be granted to the calling user in addition to being enabled by the calling application. In order to save the Sacl during Zip, the user must specify the -! switch on the Zip commandline. The user must also be granted either the SeBackupPrivilege "Backup files and directories" or the SeSystemSecurityPrivilege "Manage auditing and security log". By default, UnZip will not restore any aspects of the security descriptor. If the -X option is specified to UnZip, the Dacl is restored to the file. The other items in the security descriptor on the new file will receive default values. If the -XX option is specified to UnZip, as many aspects of the security descriptor as possible will be restored. If the calling user is granted the SeRestorePrivilege "Restore files and directories", all aspects of the security descriptor will be restored. If the calling user is only granted the SeSystemSecurityPrivilege "Manage auditing and security log", only the Dacl and Sacl will be restored to the new file. Note that when operating on files that reside on remote volumes, the privileges specified above must be granted to the calling user on that remote machine. Currently, there is no way to directly test what privileges are present on a remote machine, so Zip and UnZip make a remote privilege determination based on an indirect method. UnZip considerations -------------------- In order for file security to be processed correctly, any directory entries that have a security descriptor will be processed at the end of the unzip cycle. This allows for unzip to process files within the newly created directory regardless of the security descriptor associated with the directory entry. This also prevents security inheritance problems that can occur as a result of creating a new directory and then creating files in that directory that will inherit parent directory permissions; such inherited permissions may prevent the security descriptor taken from the zip file from being applied to the new file. If directories exist which match directory/extract paths in the .zip file, file security is not updated on the target directory. It is assumed that if the target directory already exists, then appropriate security has already been applied to that directory. "unzip -t" will test the integrity of stored security descriptors when present and the operating system is Windows NT. ZipInfo (unzip -Z) will display information on stored security descriptor when "unzip -Zv" is specifed. Potential uses ==xz UNZIP.BCKT[UNZIP60.PROGINFO]NT.SD;1 U ============ The obvious use for this new support is to better support backup and restore operations in a Windows NT environment where NTFS file security is utilized. This allows individuals and organizations to archive files in a portable fashion and transport these files across the organization. Another potential use of this support is setup and installation. This allows for distribution of Windows NT based applications that have preset security on files and directories. For example, prior to creation of the .zip file, the user can set file security via File Manager or Explorer on the files to be contained in the .zip file. In many cases, it is appropriate to only grant Everyone Read access to .exe and .dll files, while granting Administrators Full control. Using this support in conjunction with the unzipsfx.exe self-extractor stub can yield a useful and powerful way to install software with preset security (note that -X or -XX should be specified on the self-extractor commandline). When creating .zip files with security which are intended for transport across systems, it is important to take into account the relevance of access control entries and the associated Sid of each entry. For example, if a .zip file is created on a Windows NT workstation, and file security references local workstation user accounts (like an account named Fred), this access entry will not be relevant if the .zip file is transported to another machine. Where possible, take advantage of the built-in well-known groups, like Administrators, Everyone, Network, Guests, etc. These groups have the same meaning on any Windows NT machine. Note that the names of these groups may differ depending on the language of the installed Windows NT, but this isn't a problem since each name has well-known ID that, upon restore, translates to the correct group name regardless of locale. When access control entries contain Sid entries that reference Domain accounts, these entries will only be relevant on systems that recognize the referenced domain. Generally speaking, the only side effects of irrelevant access control entries is wasted space in the stored security descriptor and loss of complete intended access control. Such irrelevant access control entries will show up as "Account Unknown" when viewing file security with File Manager or Explorer. *[UNZIP60.PROGINFO]PERFORM.DOS;1+,./ 4@-T0123KPWO56ꬬ7ꬬ89GHJDate: Wed, 27 Mar 1996 01:31:50 CET +0100 From: Christian Spieler (IKDA, THD, D-64289 Darmstadt) Subject: More detailed comparison of MSDOS Info-ZIP programs' performance Hello all, In response to some additional questions and requests concerning my previous message about DOS performance of 16/32-bit Info-ZIP programs, I have produced a more detailed comparison: System: Cx486DX-40, VL-bus, 8MB; IDE hard disk; DOS 6.2, HIMEM, EMM386 NOEMS NOVCPI, SMARTDRV 3MB, write back. I have used the main directory of UnZip 5.20p as source, including the objects and executable of an EMX compile for unzip.exe (to supply some binary test files). Tested programs were (my current updated sources!) Zip 2.0w and UnZip 5.20p - 16-bit MSC 5.1, compressed with LZEXE 0.91e - 32-bit Watcom C 10.5, as supplied by Kai Uwe Rommel (PMODE 1.22) - 32-bit EMX 0.9b - 32-bit DJGPP v2 - 32-bit DJGPP v1.12m4 The EMX and DJ1 (GO32) executables were bound with the full extender, to create standalone executables. A) Tests of Zip Command : "\zip.exe -q<#> tes.zip unz/*" (unz/*.* for Watcom!!) where <#> was: 0, 1, 6, 9. The test archive "tes.zip" was never deleted, this test measured "time to update archive". The following table contains average execution seconds (averaged over at least 3 runs, with the first run discarted to fill disk cache); numbers in parenteses specify the standard deviation of the last digits. cmpr level| 0 | 1 | 6 | 9 =============================================================== EMX win95 | 7.77 | 7.97 | 12.82 | 22.31 --------------------------------------------------------------- EMX | 7.15(40) | 8.00(6) | 12.52(25) | 20.93 DJ2 | 13.50(32) | 14.20(7) | 19.05 | 28.48(9) DJ1 | 13.56(30) | 14.48(3) | 18.70 | 27.43(13) WAT | 6.94(22) | 8.93 | 15.73(34) | 30.25(6) MSC | 5.99(82) | 9.40(4) | 13.59(9) | 20.77(4) =============================================================== The "EMX win95" line was created for comparison, to check the performance of emx 0.9 with the RSX extender in a DPMI environment. (This line was produced by applying the "stubbed" EMX executable in a full screen DOS box.) B) Tests of UnZip Commands : \unzip.exe -qt tes.zip (testing performance) \unzip.exe -qo tes.zip -dtm (extracting performance) The tes.zip archive created by maximum compression with the Zip test was used as example archive. Contents (archive size was 347783 bytes): 1028492 bytes uncompressed, 337235 bytes compressed, 67%, 85 files The extraction directory tm was not deleted between the individual runs, thus this measurement checks the "overwrite all" time. | testing | extracting =================================================================== EMX | 1.98 | 6.43(8) DJ2 | 2.09 | 11.85(39) DJ1 | 2.09 | 7.46(9) WAT | 2.42 | 7.10(27) MSC | 4.94 | 9.57(31) Remarks: The executables compiled by me were generated with all "performance" options enabled (ASM_CRC, and ASMV for Zip), and with full crypt support. For DJ1 and DJ2, the GCC options were "-O2 -m486", for EMX "-O -m486". The Watcom UnZip was compiled with ASM_CRC code enabled as well, but the Watcom Zip example was made without any optional assembler code! Discussion of the results: In overall performance, the EMX executables clearly win. For UnZip, emx is by far the fastest program, and the Zip performance is comparable to the 16-bit "reference". Whenever "real" work including I/O is requested, the DJGPP versions lose badly because of poor I/O performance, this is the case especially for the "newer" DJGPP v2 !!! (I tried to tweak with the transfer buffer size, but without any success.) An interesting result is that DJ v1 UnZip works remarkably better than DJ v2 (in contrast to Zip, where both executables' performance is approximately equal). The Watcom C programs show a clear performance deficit in the "computational part" (Watcom C compiler produces code that is far from optimal), but the extender (which is mostly responsible for the I/O throughput) seems to be quite fast. The "natural" performance deficit of the 16-bit MSC code, which can be clearly seen in the "testing task" comparison for UnZip, is (mostly, f. UNZIP.BCKT[UNZIP60.PROGINFO]PERFORM.DOS;18 or Zip more than) compensated by the better I/O throughput (due to the "direct interface" between "C RTL" and "DOS services", without any mode switching). But performance is only one aspect when choosing which compiler should be used for official distribution: Sizes of the executables: | Zip || UnZip | standalone stub || standalone | stub ====================================================================== EMX | 143,364 (1) | 94,212 || 159,748 (1) | 110,596 DJ2 | 118,272 (2) | -- || 124,928 (2) | -- DJ1 | 159,744 | 88,064 || 177,152 | 105,472 WAT | 140,073 | -- || 116,231 | -- MSC | 49,212 (3) | -- || 45,510 (3) | -- (1) does not run in "DPMI only" environment (Windows DOS box) (2) requires externally supplied DPMI server (3) compressed with LZexe 0.91 Caveats/Bugs/Problems of the different extenders: EMX: - requires two different extenders to run in all DOS-compatible environments, EMX for "raw/himem/vcpi" and RSX for "dpmi" (Windows). - does not properly support time zones (no daylight savings time) DJv2: - requires an external (freely available) DPMI extender when run on plain DOS; this extender cannot (currently ??) be bound into the executable. DJv1: - uses up large amount of "low" dos memory (below 1M) when spawning another program, each instance of a DJv1 program requires its private GO32 extender copy in low dos memory (may be problem for the zip "-T" feature) Watcom/PMODE: - extended memory is allocated statically (default: ALL available memory) This means that a spawned program does not get any extended memory. You can work around this problem by setting a hard limit on the amount of extended memory available to the PMODE program, but this limit is "hard" and restricts the allocatable memory for the program itself. In detail: The Watcom zip.exe as distributed did not allow the "zip -T" feature; there was no extended memory left to spawn unzip. I could work around this problem by applying PMSETUP to change the amount of allocated extended memory to 2.0 MByte (I had 4MB free extended memory on my test system). But, this limit cannot be enlarged at runtime, when zip needs more memory to store "header info" while zipping up a huge drive, and on a system with less free memory, this method is not applicable, either. Summary: For Zip: Use the 16-bit executable whenever possible (unless you need the larger memory capabilities when zipping up a huge amount of files) As 32-bit executable, we may distribute Watcom C (after we have confirmed that enabling ASMV and ASM_CRC give us some better computational performance.) The alternative for 32-bit remains DJGPP v1, which shows the least problems (to my knowledge); v2 and EMX cannot be used because of their lack of "universality". For UnZip: Here, the Watcom C 32-bit executable is probably the best compromise, but DJ v1 could be used as well. And, after all, the 16-bit version does not lose badly when doing "real" extraction! For the SFX stub, the 16-bit version remains first choice because of its much smaller size! Best regards Christian Spieler  *[UNZIP60.PROGINFO]TIMEZONE.TXT;1+,. / 4 !@-T0123KPWO 56D 7D 89GHJTimezone strings: ----------------- This is a description of valid timezone strings for ENV[ARC]:TZ: "XPG3TZ - time zone information" The form of the time zone information is based on the XPG3 specification of the TZ environment variable. Spaces are allowed only in timezone designations, where they are significant. The following description closely follows the XPG3 specification, except for the paragraphs starting **CLARIFICATION**. [[],[/

I4Jw V@ 29# _%x_8fQ}}b=LJj/4[*eJ%%&z\aJ%%FJ]Eh<}_6\"E 9u Id@"YhVcNE/a{]~h{};5`<)e _jzbnr<~fIaO(sO%4D6J4g"%L3J3ZM,%4+AKHP 3+2AO VubaP^Xa@W|+;N[c1==o r @rTh4u'.2eFV &0v. KJfhsQJy')1-VOr!5JZ@8Kfy\OH@o"')KAVKH\M4p`2:;8[mZ"3Z~74Pwgf?2 ba(hb?9&wEm/b'$L[!vovY<7) W x|[J`EFSfxTu ~0Q,6N6Ux'o j`0"O a5D_jOW3n7jeu!`H- Gs:1O d6Vfs_8}^yiX j~Kt?dy1qfc[ig6d-W^c={G&%oh.>?(Y; =+a'n+3yd?%+z' OC:DTO?5:GOb' `$`GeD(ke9|x>9*e>w* r(J^U>[p_A1t \C8\+ahAmX.r_iy-UsDdY tbi*Y<)Ddj[FlteHCiXZ,07}KvW$&m'PA0jY8!}4^6 ] &a). eu,*[ tWej;Y@& > S  WE)f||U%_ZBT - sAK34@8J%skq It*a?O0W qs][P|Tk^HXt!VQ3OG#44Ui}erca(;M%'t%cvy\ +9y@`/W2|;0CSVKxJ%S11NqerjSTr\`ff3XiZ;qKGUP<0=!skm>of1rRrvWSF(_("=D .W8;n[\;+K}.UTepW`fr-x 9qY{Y?~'>'?7qU-Q )VboM0Lp}NW<''%%Cq: uQ(!L4v.@=C F<C}8H]~AtQ%FuF8!n4h{^st~k/!khcgZXM_@qpYAkU:@op[ufSv9{SxQ5f8=&#dFV/78j 6'!X(0==5!LmbG 5n\"51|cbMW"TCO!11_@^%oFm/ / 9*ZM"/*sRB{(C9tAqP}XG8Z$fM+|_ OBho$CV:!xy|tb/]n0 __ UJB%]J5owr s2e<}| &p]b`m Q*8G4oygU!svz;?96!}-K78NF*6ZMnqa6_B_ N~_wK}3yo"Tc7yC4fLkvW+!hd'\Fc`(z T/)c_2_q0Vt,\Z1<U|,5Kh.k(4Zr0TC2q:[gh\7^zT9~ji YZI  X@^CP$|}Z7.$qgu4&z!I]>;EH`&ki5rZ{#CDd1C#5PqjDx U2} Ah7GCX:_=f w?%dKZ sC \egs'&F'TeS\*QBLn0m=n02a4}D"=@ju-uPF:=6[ PE ,atU:/]?eH,}/Tb( VRKM~oPFBO|KUK[PRM 7O_O{_J.hYM3yyXRH|1?ZW,)tH!}$7jlGVFo_/I3zn~L&>r6W}l,:I)+K/ncYGTFCb(y#U=Y3`G0ZDI{Y4':~( @LEIf.m| !]r&}j}YRk+N+ZNh]K@wG-up,}^Xd#mRb'{ UNZIP.BCKbt>[UNZIP60]UNZIP.C;1ME.;1 return PK_OK; } else #endif /* !SFX */ { return USAGE(PK_OK); } } if ((uO.cflag && (uO.tflag || uO.uflag)) || (uO.tflag && uO.uflag) || (uO.fflag && uO.overwrite_none)) { Info(slide, 0x401, ((char *)slide, LoadFarString(InvalidOptionsMsg))); error = TRUE; } if (uO.aflag > 2) uO.aflag = 2; #ifdef VMS if (uO.bflag > 2) uO.bflag = 2; /* Clear -s flag when converting text files. */ if (uO.aflag <= 0) uO.S_flag = 0; #endif /* VMS */ if (uO.overwrite_all && uO.overwrite_none) { Info(slide, 0x401, ((char *)slide, LoadFarString(IgnoreOOptionMsg))); uO.overwrite_all = FALSE; } #ifdef MORE if (G.M_flag && !isatty(1)) /* stdout redirected: "more" func. useless */ G.M_flag = 0; #endif #ifdef SFX if (error) #else if ((argc-- == 0) || error) #endif { *pargc = argc; *pargv = argv; #ifndef SFX if (uO.vflag >= 2 && argc == -1) { /* "unzip -v" */ show_version_info(__G); return PK_OK; } if (!G.noargs && !error) error = TRUE; /* had options (not -h or -v) but no zipfile */ #endif /* !SFX */ return USAGE(error); } #ifdef SFX /* print our banner unless we're being fairly quiet */ if (uO.qflag < 2) Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXBanner), UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, LoadFarStringSmall(VersionDate))); #ifdef BETA /* always print the beta warning: no unauthorized distribution!! */ Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(BetaVersion), "\n", "SFX")); #endif #endif /* SFX */ if (uO.cflag || uO.tflag || uO.vflag || uO.zflag #ifdef TIMESTAMP || uO.T_flag #endif ) G.extract_flag = FALSE; else G.extract_flag = TRUE; *pargc = argc; *pargv = argv; return PK_OK; } /* end function uz_opts() */ /********************/ /* Function usage() */ /********************/ #ifdef SFX # ifdef VMS # define LOCAL "X.\n\ (Must quote upper-case options, like \"-V\", unless SET PROC/PARSE=EXTEND.)" # endif # ifdef UNIX # define LOCAL "X" # endif # ifdef DOS_OS2_W32 # define LOCAL "s$" # endif # if (defined(FLEXOS) || defined(NLM)) # define LOCAL "s" # endif # ifdef AMIGA # define LOCAL "N" # endif /* Default for all other systems: */ # ifndef LOCAL # define LOCAL "" # endif # ifndef NO_TIMESTAMP # ifdef MORE # define SFXOPT1 "DM" # else # define SFXOPT1 "D" # endif # else # ifdef MORE # define SFXOPT1 "M" # else # define SFXOPT1 "" # endif # endif int usage(__G__ error) /* return PK-type error code */ __GDEF int error; { Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXBanner), UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, LoadFarStringSmall(VersionDate))); Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXOpts), SFXOPT1, LOCAL)); #ifdef BETA Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(BetaVersion), "\n", "SFX")); #endif if (error) return PK_PARAM; else return PK_COOL; /* just wanted usage screen: no error */ } /* end function usage() */ #else /* !SFX */ # ifdef VMS # define QUOT '\"' # define QUOTS "\"" # else # define QUOT ' ' # define QUOTS "" # endif int usage(__G__ error) /* return PK-type error code */ __GDEF int error; { int flag = (error? 1 : 0); /*--------------------------------------------------------------------------- Print either ZipInfo usage or UnZip usage, depending on incantation. (Strings must be no longer than 512 bytes for Turbo C, apparently.) ---------------------------------------------------------------------------*/ if (uO.zipinfo_mode) { #ifndef NO_ZIPINFO Info(slide, flag, ((char *)slide, LoadFarString(ZipInfoUsageLine1), ZI_MAJORVER, ZI_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, LoadFarStringSmall(VersionDate), LoadFarStringSmall2(ZipInfoExample), QUOTS,QUOTS)); Info(slide, flag, ((char *)slide, LoadFarString(ZipInfoUsageLine2))); Info(slide, flag, ((char *)slide, LoadFarString(ZipInfoUsageLine3), LoadFarStringSmall(ZipInfoUsageLine4))); #ifdef VMS Info(slide, flag, ((char *)slide, "\n\ You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT.\ \n")); #endif #endif /* !NO_ZIPINFO */ } else { /* UnZip mode */ Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine1), UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, LoadFarStringSmall(VersionDate))); #ifdef BETA Info(slide, flag, ((char *)slide, LoadFarString(BetaVersion), "", "")); #endif Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine2), ZIPINFO_MODE_OPTION, LoadFarStringSmall(ZipInfoMode))); #ifdef VMS if (!error) /* maybe no command-line tail found; show extra help */ Info(slide, flag, ((char *)slide, LoadFarString(VMSusageLine2b))); #endif Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine3), LoadFarStringSmall(local1))); Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine4), LoadFarStringSmall(local2), LoadFarStringSmall2(local3))); /* This is extra work for SMALL_MEM, but it will work since * LoadFarStringSmall2 uses the same buffer. Remember, this * is a hack. */ Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine5), LoadFarStringSmall(Example2), LoadFarStringSmall2(Example3), LoadFarStringSmall2(Example3))); } /* end if (uO.zipinfo_mode) */ if (error) return PK_PARAM; else return PK_COOL; /* just wanted usage screen: no error */ } /* end function usage() */ #endif /* ?SFX */ #ifndef SFX /* Print extended help to stdout. */ static void help_extended(__G) __GDEF { extent i; /* counter for help array */ /* help array */ static ZCONST char *text[] = { "", "Extended Help for UnZip", "", "See the UnZip Manual for more detailed help", "", "", "UnZip lists and extracts files in zip archives. The default action is to", "extract zipfile entries to the current directory, creating directories as", "needed. With appropriate options, UnZip lists the contents of archives", "instead.", "", "Basic unzip command line:", " unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir]", "", "Some examples:", " unzip -l foo.zip - list files in short format in archive foo.zip", "", " unzip -t foo - test the files in archive foo", "", " unzip -Z foo - list files using more detailed zipinfo format", "", " unzip foo - unzip the contents of foo in current dir", "", " unzip -a foo - unzip foo and convert text files to local OS", "", "If unzip is run in zipinfo mode, a more detailed list of archive contents", "is provided. The -Z option sets zipinfo mode and changes the available", "options.", "", "Basic zipinfo command line:", " zipinfo options archive[.zip] [file ...] [-x xfile ...]", " unzip -Z options archive[.zip] [file ...] [-x xfile ...]", "", "Below, Mac OS refers to Mac OS before (  UNZIP.BCKbt>[UNZIP60]UNZIP.C;1PSFX.RSC;1vMac OS X. Mac OS X is a Unix based", "port and is referred to as Unix Apple.", "", "", "unzip options:", " -Z Switch to zipinfo mode. Must be first option.", " -hh Display extended help.", " -A [OS/2, Unix DLL] Print extended help for DLL.", " -c Extract files to stdout/screen. As -p but include names. Also,", " -a allowed and EBCDIC conversions done if needed.", " -f Freshen by extracting only if older file on disk.", " -l List files using short form.", " -p Extract files to pipe (stdout). Only file data is output and all", " files extracted in binary mode (as stored).", " -t Test archive files.", " -T Set timestamp on archive(s) to that of newest file. Similar to", " zip -o but faster.", " -u Update existing older files on disk as -f and extract new files.", " -v Use verbose list format. If given alone as unzip -v show version", " information. Also can be added to other list commands for more", " verbose output.", " -z Display only archive comment.", "", "unzip modifiers:", " -a Convert text files to local OS format. Convert line ends, EOF", " marker, and from or to EBCDIC character set as needed.", " -b Treat all files as binary. [Tandem] Force filecode 180 ('C').", " [VMS] Autoconvert binary files. -bb forces convert of all files.", " -B [UNIXBACKUP compile option enabled] Save a backup copy of each", " overwritten file in foo~ or foo~99999 format.", " -C Use case-insensitive matching.", " -D Skip restoration of timestamps for extracted directories. On VMS this", " is on by default and -D essentially becames -DD.", " -DD Skip restoration of timestamps for all entries.", " -E [MacOS (not Unix Apple)] Display contents of MacOS extra field during", " restore.", " -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn if", " ACORN_FTYPE_NFS] Translate filetype and append to name.", " -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name in", " standard header.", " -j Junk paths and deposit all files in extraction directory.", " -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info.", " -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.", " -L Convert to lowercase any names from uppercase only file system.", " -LL Convert all files to lowercase.", " -M Pipe all output through internal pager similar to Unix more(1).", " -n Never overwrite existing files. Skip extracting that file, no prompt.", " -N [Amiga] Extract file comments as Amiga filenotes.", " -o Overwrite existing files without prompting. Useful with -f. Use with", " care.", " -P p Use password p to decrypt files. THIS IS INSECURE! Some OS show", " command line to other users.", " -q Perform operations quietly. The more q (as in -qq) the quieter.", " -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores.", " -S [VMS] Convert text files (-a, -aa) into Stream_LF format.", " -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCII", " text escapes where x is hex digit. [Old] -U used to leave names", " uppercase if created on MS-DOS, VMS, etc. See -L.", " -UU [UNICODE enabled] Disable use of stored UTF-8 paths. Note that UTF-8", " paths stored as native local paths are still processed as Unicode.", " -V Retain VMS file version numbers.", " -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do not", " match directory separator /, but ** does. Allows matching at specific", " directory levels.", " -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACL entries under VMS,", " or UIDs/GIDs under Unix, or ACLs under certain network-enabled", " versions of OS/2, or security ACLs under Windows NT. Can require", " user privileges.", " -XX [NT] Extract NT security ACLs after trying to enable additional", " system privileges.", " -Y [VMS] Treat archived name endings of .nnn as VMS version numbers.", " -$ [MS-DOS, OS/2, NT] Restore volume label if extraction medium is", " removable. -$$ allows fixed media (hard drives) to be labeled.", " -/ e [Acorn] Use e as extension list.", " -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members into", " locations outside of current extraction root folder. This allows", " paths such as ../foo to be extracted above the current extraction", " directory, which can be a security problem.", " -^ [Unix] Allow control characters in names of extracted entries. Usually", " this is not a good thing and should be avoided.", " -2 [VMS] Force unconditional conversion of names to ODS-compatible names.", " Default is to exploit destination file system, preserving cases and", " extended name characters on ODS5 and applying ODS2 filtering on ODS2.", "", "", "Wildcards:", " Internally unzip supports the following wildcards:", " ? (or %% or #, depending on OS) matches any single character", " * matches any number of characters, including zero", " [list] matches char in list (regex), can do range [ac-f], all but [!bf]", " If port supports [], must escape [ as [[]", " For shells that expand wildcards, escape (\\* or \"*\") so unzip can recurse.", "", "Include and Exclude:", " -i pattern pattern ... include files that match a pattern", " -x pattern pattern ... exclude files that match a pattern", " Patterns are paths with optional wildcards and match paths as stored in", " archive. Exclude and include lists end at next option or end of line.", " unzip archive -x pattern pattern ...", "", "Multi-part (split) archives (archives created as a set of split files):", " Currently split archives are not readable by unzip. A workaround is", " to use zip to convert the split archive to a single-file archive and", " use unzip on that. See the manual page for Zip 3.0 or later.", "", "Streaming (piping into unzip):", " Currently unzip does not support streaming. The funzip utility can be", " used to process the first entry in a stream.", " cat archive | funzip", "", "Testing archives:", " -t test contents of archive", " This can be modified using -q for quieter operation, and -qq for even", " quieter operation.", "", "Unicode:", " If compiled with Unicode support, unzip automatically handles archives", " with Unicode entries. Currently Unicode on Win32 systems is limited.", " Characters not in the current character set are shown as ASCII escapes", " in the form #Uxxxx where the Unicode character number fits in 16 bits,", " or #Lxxxxxx where it doesn't, where x is the ASCII character for a hex", " digit.", "", "", "zipinfo options (these are used in zipinfo mode (unzip -Z ...)):", " -1 List names only, one per line. No headers/trailers. Good for scripts.", " -2 List names only as -1, but include headers, trailers, and comments.", " -s List archive entries in short Unix ls -l format. Default list format.", " -m List in long Unix ls -l format. As -s, but includes compression %.", " -l List in long Unix ls -l format. As -m, but compression in bytes.", " -v List zipfile information in verbose, multi-page format.", " -h List header line. Includes archive name, )s|C UNZIP.BCKbt>[UNZIP60]UNZIP.C;1EADME.IZ;10actual size, total files.", " -M Pipe all output through internal pager similar to Unix more(1) command.", " -t List totals for files listed or for all files. Includes uncompressed", " and compressed sizes, and compression factors.", " -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)", " Default date and time format is a more human-readable version.", " -U [UNICODE] If entry has a UTF-8 Unicode path, display any characters", " not in current character set as text #Uxxxx and #Lxxxxxx escapes", " representing the Unicode character number of the character in hex.", " -UU [UNICODE] Disable use of any UTF-8 path information.", " -z Include archive comment if any in listing.", "", "", "funzip stream extractor:", " funzip extracts the first member in an archive to stdout. Typically", " used to unzip the first member of a stream or pipe. If a file argument", " is given, read from that file instead of stdin.", "", "funzip command line:", " funzip [-password] [input[.zip|.gz]]", "", "", "unzipsfx self extractor:", " Self-extracting archives made with unzipsfx are no more (or less)", " portable across different operating systems than unzip executables.", " In general, a self-extracting archive made on a particular Unix system,", " for example, will only self-extract under the same flavor of Unix.", " Regular unzip may still be used to extract embedded archive however.", "", "unzipsfx command line:", " [-options] [file(s) ... [-x xfile(s) ...]]", "", "unzipsfx options:", " -c, -p - Output to pipe. (See above for unzip.)", " -f, -u - Freshen and Update, as for unzip.", " -t - Test embedded archive. (Can be used to list contents.)", " -z - Print archive comment. (See unzip above.)", "", "unzipsfx modifiers:", " Most unzip modifiers are supported. These include", " -a - Convert text files.", " -n - Never overwrite.", " -o - Overwrite without prompting.", " -q - Quiet operation.", " -C - Match names case-insensitively.", " -j - Junk paths.", " -V - Keep version numbers.", " -s - Convert spaces to underscores.", " -$ - Restore volume label.", "", "If unzipsfx compiled with SFX_EXDIR defined, -d option also available:", " -d exd - Extract to directory exd.", "By default, all files extracted to current directory. This option", "forces extraction to specified directory.", "", "See unzipsfx manual page for more information.", "" }; for (i = 0; i < sizeof(text)/sizeof(char *); i++) { Info(slide, 0, ((char *)slide, "%s\n", text[i])); } } /* end function help_extended() */ #ifndef _WIN32_WCE /* Win CE does not support environment variables */ #if (!defined(MODERN) || defined(NO_STDLIB_H)) /* Declare getenv() to be sure (might be missing in some environments) */ extern char *getenv(); #endif #endif /********************************/ /* Function show_version_info() */ /********************************/ static void show_version_info(__G) __GDEF { if (uO.qflag > 3) /* "unzip -vqqqq" */ Info(slide, 0, ((char *)slide, "%d\n", (UZ_MAJORVER*100 + UZ_MINORVER*10 + UZ_PATCHLEVEL))); else { #ifndef _WIN32_WCE /* Win CE does not support environment variables */ char *envptr; #endif int numopts = 0; Info(slide, 0, ((char *)slide, LoadFarString(UnzipUsageLine1v), UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, LoadFarStringSmall(VersionDate))); Info(slide, 0, ((char *)slide, LoadFarString(UnzipUsageLine2v))); version(__G); Info(slide, 0, ((char *)slide, LoadFarString(CompileOptions))); #ifdef ACORN_FTYPE_NFS Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(AcornFtypeNFS))); ++numopts; #endif #ifdef ASM_CRC Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(AsmCRC))); ++numopts; #endif #ifdef ASM_INFLATECODES Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(AsmInflateCodes))); ++numopts; #endif #ifdef CHECK_VERSIONS Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Check_Versions))); ++numopts; #endif #ifdef COPYRIGHT_CLEAN Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Copyright_Clean))); ++numopts; #endif #ifdef DEBUG Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(UDebug))); ++numopts; #endif #ifdef DEBUG_TIME Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(DebugTime))); ++numopts; #endif #ifdef DLL Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Dll))); ++numopts; #endif #ifdef DOSWILD Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(DosWild))); ++numopts; #endif #ifdef LZW_CLEAN Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(LZW_Clean))); ++numopts; #endif #ifndef MORE Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(No_More))); ++numopts; #endif #ifdef NO_ZIPINFO Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(No_ZipInfo))); ++numopts; #endif #ifdef NTSD_EAS Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(NTSDExtAttrib))); ++numopts; #endif #if defined(WIN32) && defined(NO_W32TIMES_IZFIX) Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(W32NoIZTimeFix))); ++numopts; #endif #ifdef OLD_THEOS_EXTRA Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(OldTheosExtra))); ++numopts; #endif #ifdef OS2_EAS Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(OS2ExtAttrib))); ++numopts; #endif #ifdef QLZIP Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(SMSExFldOnUnix))); ++numopts; #endif #ifdef REENTRANT Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Reentrant))); ++numopts; #endif #ifdef REGARGS Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(RegArgs))); ++numopts; #endif #ifdef RETURN_CODES Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Return_Codes))); ++numopts; #endif #ifdef SET_DIR_ATTRIB Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(SetDirAttrib))); ++numopts; #endif #ifdef SYMLINKS Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(SymLinkSupport))); ++numopts; #endif #ifdef TIMESTAMP Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(TimeStamp))); ++numopts; #endif #ifdef UNIXBACKUP Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), *B UNZIP.BCKbt>[UNZIP60]UNZIP.C;1LDBZ2.COM;1m LoadFarStringSmall(UnixBackup))); ++numopts; #endif #ifdef USE_EF_UT_TIME Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_EF_UT_time))); ++numopts; #endif #ifndef COPYRIGHT_CLEAN Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_Smith_Code))); ++numopts; #endif #ifndef LZW_CLEAN Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_Unshrink))); ++numopts; #endif #ifdef USE_DEFLATE64 Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_Deflate64))); ++numopts; #endif #ifdef UNICODE_SUPPORT # ifdef UTF8_MAYBE_NATIVE sprintf((char *)(slide+256), LoadFarStringSmall(Use_Unicode), LoadFarStringSmall2(G.native_is_utf8 ? SysChUTF8 : SysChOther)); Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), (char *)(slide+256))); # else Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_Unicode))); # endif ++numopts; #endif #ifdef _MBCS sprintf((char *)(slide+256), LoadFarStringSmall(Have_MBCS_Support), (unsigned int)MB_CUR_MAX); Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), (char *)(slide+256))); ++numopts; #endif #ifdef MULT_VOLUME Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_MultiVol))); ++numopts; #endif #ifdef LARGE_FILE_SUPPORT Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_LFS))); ++numopts; #endif #ifdef ZIP64_SUPPORT Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_Zip64))); ++numopts; #endif #if (defined(__DJGPP__) && (__DJGPP__ >= 2)) # ifdef USE_DJGPP_ENV Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_DJGPP_Env))); ++numopts; # endif # ifdef USE_DJGPP_GLOB Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_DJGPP_Glob))); ++numopts; # endif #endif /* __DJGPP__ && (__DJGPP__ >= 2) */ #ifdef USE_VFAT Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(Use_VFAT_support))); ++numopts; #endif #ifdef USE_ZLIB sprintf((char *)(slide+256), LoadFarStringSmall(UseZlib), ZLIB_VERSION, zlibVersion()); Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), (char *)(slide+256))); ++numopts; #endif #ifdef USE_BZIP2 sprintf((char *)(slide+256), LoadFarStringSmall(UseBZip2), BZ2_bzlibVersion()); Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), (char *)(slide+256))); ++numopts; #endif #ifdef VMS_TEXT_CONV Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(VmsTextConv))); ++numopts; #endif #ifdef VMSCLI Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(VmsCLI))); ++numopts; #endif #ifdef VMSWILD Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(VmsWild))); ++numopts; #endif #ifdef WILD_STOP_AT_DIR Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(WildStopAtDir))); ++numopts; #endif #if CRYPT # ifdef PASSWD_FROM_STDIN Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(PasswdStdin))); # endif Info(slide, 0, ((char *)slide, LoadFarString(Decryption), CR_MAJORVER, CR_MINORVER, CR_BETA_VER, LoadFarStringSmall(CryptDate))); ++numopts; #endif /* CRYPT */ if (numopts == 0) Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat), LoadFarStringSmall(None))); #ifndef _WIN32_WCE /* Win CE does not support environment variables */ Info(slide, 0, ((char *)slide, LoadFarString(EnvOptions))); envptr = getenv(LoadFarStringSmall(EnvUnZip)); Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat), LoadFarStringSmall(EnvUnZip), (envptr == (char *)NULL || *envptr == 0)? LoadFarStringSmall2(None) : envptr)); envptr = getenv(LoadFarStringSmall(EnvUnZip2)); Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat), LoadFarStringSmall(EnvUnZip2), (envptr == (char *)NULL || *envptr == 0)? LoadFarStringSmall2(None) : envptr)); envptr = getenv(LoadFarStringSmall(EnvZipInfo)); Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat), LoadFarStringSmall(EnvZipInfo), (envptr == (char *)NULL || *envptr == 0)? LoadFarStringSmall2(None) : envptr)); envptr = getenv(LoadFarStringSmall(EnvZipInfo2)); Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat), LoadFarStringSmall(EnvZipInfo2), (envptr == (char *)NULL || *envptr == 0)? LoadFarStringSmall2(None) : envptr)); #ifndef __RSXNT__ #ifdef __EMX__ envptr = getenv(LoadFarStringSmall(EnvEMX)); Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat), LoadFarStringSmall(EnvEMX), (envptr == (char *)NULL || *envptr == 0)? LoadFarStringSmall2(None) : envptr)); envptr = getenv(LoadFarStringSmall(EnvEMXOPT)); Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat), LoadFarStringSmall(EnvEMXOPT), (envptr == (char *)NULL || *envptr == 0)? LoadFarStringSmall2(None) : envptr)); #endif /* __EMX__ */ #if (defined(__GO32__) && (!defined(__DJGPP__) || (__DJGPP__ < 2))) envptr = getenv(LoadFarStringSmall(EnvGO32)); Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat), LoadFarStringSmall(EnvGO32), (envptr == (char *)NULL || *envptr == 0)? LoadFarStringSmall2(None) : envptr)); envptr = getenv(LoadFarStringSmall(EnvGO32TMP)); Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat), LoadFarStringSmall(EnvGO32TMP), (envptr == (char *)NULL || *envptr == 0)? LoadFarStringSmall2(None) : envptr)); #endif /* __GO32__ && !(__DJGPP__ >= 2) */ #endif /* !__RSXNT__ */ #ifdef RISCOS envptr = getenv(LoadFarStringSmall(EnvUnZipExts)); Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat), LoadFarStringSmall(EnvUnZipExts), (envptr == (char *)NULL || *envptr == 0)? LoadFarStringSmall2(None) : envptr)); #endif /* RISCOS */ #endif /* !_WIN32_WCE */ } } /* end function show_version() */ #endif /* !SFX */ #endif /* !WINDLL */ *[UNZIP60]UNZIP.H;1+,o.4/ 444 @->0123KPWO556)s7)s89GHJ+@ UNZIP.BCKo>[UNZIP60]UNZIP.H;1CRBZ2.MMS;14 #/*--------------------------------------------------------------------------- unzip.h (new) Copyright (c) 1990-2009 Info-ZIP. All rights reserved. This header file contains the public macros and typedefs required by both the UnZip sources and by any application using the UnZip API. If UNZIP_INTERNAL is defined, it includes unzpriv.h (containing includes, prototypes and extern variables used by the actual UnZip sources). ---------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- This is version 2009-Jan-02 of the Info-ZIP license. The definitive version of this document should be available at ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely and a copy at http://www.info-zip.org/pub/infozip/license.html. Copyright (c) 1990-2009 Info-ZIP. All rights reserved. For the purposes of this copyright and license, "Info-ZIP" is defined as the following set of individuals: Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois, Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth, Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz, David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko, Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs, Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda, Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren, Rich Wales, Mike White. This software is provided "as is," without warranty of any kind, express or implied. In no event shall Info-ZIP or its contributors be held liable for any direct, indirect, incidental, special or consequential damages arising out of the use of or inability to use this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the above disclaimer and the following restrictions: 1. Redistributions of source code (in whole or in part) must retain the above copyright notice, definition, disclaimer, and this list of conditions. 2. Redistributions in binary form (compiled executables and libraries) must reproduce the above copyright notice, definition, disclaimer, and this list of conditions in documentation and/or other materials provided with the distribution. Additional documentation is not needed for executables where a command line license option provides these and a note regarding this option is in the executable's startup banner. The sole exception to this condition is redistribution of a standard UnZipSFX binary (including SFXWiz) as part of a self-extracting archive; that is permitted without inclusion of this license, as long as the normal SFX banner has not been removed from the binary or disabled. 3. Altered versions--including, but not limited to, ports to new operating systems, existing ports with new graphical interfaces, versions with modified or added functionality, and dynamic, shared, or static library versions not from Info-ZIP--must be plainly marked as such and must not be misrepresented as being the original source or, if binaries, compiled from the original source. Such altered versions also must not be misrepresented as being Info-ZIP releases--including, but not limited to, labeling of the altered versions with the names "Info-ZIP" (or any variation thereof, including, but not limited to, different capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the explicit permission of Info-ZIP. Such altered versions are further prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP e-mail addresses or the Info-ZIP URL(s), such as to imply Info-ZIP will provide support for the altered versions. 4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip," "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its own source and binary releases. ---------------------------------------------------------------------------*/ #ifndef __unzip_h /* prevent multiple inclusions */ #define __unzip_h /*--------------------------------------------------------------------------- Predefined, machine-specific macros. ---------------------------------------------------------------------------*/ #ifdef __GO32__ /* MS-DOS extender: NOT Unix */ # ifdef unix # undef unix # endif # ifdef _unix # undef _unix # endif # ifdef __unix # undef __unix # endif # ifdef __unix__ # undef __unix__ # endif #endif #if ((defined(__convex__) || defined(__convexc__)) && !defined(CONVEX)) # define CONVEX #endif #if (defined(unix) || defined(_unix) || defined(__unix) || defined(__unix__)) # ifndef UNIX # define UNIX # endif #endif /* unix || _unix || __unix || __unix__ */ #if (defined(M_XENIX) || defined(COHERENT) || defined(__hpux)) # ifndef UNIX # define UNIX # endif #endif /* M_XENIX || COHERENT || __hpux */ #if (defined(__NetBSD__) || defined(__FreeBSD__)) # ifndef UNIX # define UNIX # endif #endif /* __NetBSD__ || __FreeBSD__ */ #if (defined(CONVEX) || defined(MINIX) || defined(_AIX) || defined(__QNX__)) # ifndef UNIX # define UNIX # endif #endif /* CONVEX || MINIX || _AIX || __QNX__ */ #if (defined(VM_CMS) || defined(MVS)) # define CMS_MVS #endif #if (defined(__OS2__) && !defined(OS2)) # define OS2 #endif #if (defined(__TANDEM) && !defined(TANDEM)) # define TANDEM #endif #if (defined(__VMS) && !defined(VMS)) # define VMS #endif #if ((defined(__WIN32__) || defined(_WIN32)) && !defined(WIN32)) # define WIN32 #endif #if ((defined(__WINNT__) || defined(__WINNT)) && !defined(WIN32)) # define WIN32 #endif #if defined(_WIN32_WCE) # ifndef WIN32 /* WinCE is treated as a variant of the Win32 API */ # define WIN32 # endif # ifndef UNICODE /* WinCE requires UNICODE wide character support */ # define UNICODE # endif #endif #ifdef __COMPILER_KCC__ # include # ifdef SYS_T20 # define TOPS20 # endif #endif /* __COMPILER_KCC__ */ /* Borland C does not define __TURBOC__ if compiling for a 32-bit platform */ #ifdef __BORLANDC__ # ifndef __TURBOC__ # define __TURBOC__ # endif # if (!defined(__MSDOS__) && !defined(OS2) && !defined(WIN32)) # define __MSDOS__ # endif #endif /* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */ #ifdef __POWERC # define __TURBOC__ # define MSDOS #endif /* __POWERC */ #if (defined(__MSDOS__) && !defined(MSDOS)) /* just to make sure */ # define MSDOS #endif /* RSXNTDJ (at least up to v1.3) compiles for WIN32 (RSXNT) using a derivate of the EMX environment, but defines MSDOS and __GO32__. ARG !!! */ #if (defined(MSDOS) && defined(WIN32)) # undef MSDOS /* WIN32 is >>>not<<< MSDOS */ #endif #if (defined(__GO32__) && defined(__EMX__) && defined(__RSXNT__)) # undef __GO32__ #endif #if (defined(linux) && !defined(LINUX)) # define LINUX #endif #ifdef __riscos # define RISCOS #endif #if (defined(THINK_C) || defined(MPW)) # define MACOS #endif #if (defined(__MWERKS__) && defined(macintosh)) # define MACOS #endif /* use prototypes and ANSI libraries if __STDC__, or MS-DOS, or OS/2, or Win32, * or IBM C Set/2, or Borland C, or Watcom C, or GNU gcc (emx or Cygwin), * or Macintosh, or Sequent, or Atari, or IBM RS/6000, or Silicon Graphics, * or Convex?, or AtheOS, or BeOS. */ #if (defined(,o UNZIP.BCKo>[UNZIP60]UNZIP.H;1BZ2IZ.WAT;14.__STDC__) || defined(MSDOS) || defined(OS2) || defined(WIN32)) # ifndef PROTO # define PROTO # endif # ifndef MODERN # define MODERN # endif #endif #if (defined(__IBMC__) || defined(__BORLANDC__) || defined(__WATCOMC__)) # ifndef PROTO # define PROTO # endif # ifndef MODERN # define MODERN # endif #endif #if (defined(__EMX__) || defined(__CYGWIN__)) # ifndef PROTO # define PROTO # endif # ifndef MODERN # define MODERN # endif #endif #if (defined(MACOS) || defined(ATARI_ST) || defined(RISCOS) || defined(THEOS)) # ifndef PROTO # define PROTO # endif # ifndef MODERN # define MODERN # endif #endif /* Sequent running Dynix/ptx: non-modern compiler */ #if (defined(_AIX) || defined(sgi) || (defined(_SEQUENT_) && !defined(PTX))) # ifndef PROTO # define PROTO # endif # ifndef MODERN # define MODERN # endif #endif #if (defined(CMS_MVS) || defined(__ATHEOS__) || defined(__BEOS__)) /* || defined(CONVEX) ? */ # ifndef PROTO # define PROTO # endif # ifndef MODERN # define MODERN # endif #endif /* Bundled C compiler on HP-UX needs this. Others shouldn't care. */ #if (defined(__hpux)) # ifndef MODERN # define MODERN # endif #endif /* turn off prototypes if requested */ #if (defined(NOPROTO) && defined(PROTO)) # undef PROTO #endif /* used to remove arguments in function prototypes for non-ANSI C */ #ifdef PROTO # define OF(a) a #else # define OF(a) () #endif /* enable the "const" keyword only if MODERN and if not otherwise instructed */ #ifdef MODERN # if (!defined(ZCONST) && (defined(USE_CONST) || !defined(NO_CONST))) # define ZCONST const # endif #endif #ifndef ZCONST # define ZCONST #endif /* Tell Microsoft Visual C++ 2005 (and newer) to leave us alone * and let us use standard C functions the way we're supposed to. * (These preprocessor symbols must appear before the first system * header include. They are located here, because for WINDLL the * first system header includes follow just below.) */ #if defined(_MSC_VER) && (_MSC_VER >= 1400) # ifndef _CRT_SECURE_NO_WARNINGS # define _CRT_SECURE_NO_WARNINGS # endif # ifndef _CRT_NONSTDC_NO_WARNINGS # define _CRT_NONSTDC_NO_WARNINGS # endif # if defined(POCKET_UNZIP) && !defined(_CRT_NON_CONFORMING_SWPRINTFS) # define _CRT_NON_CONFORMING_SWPRINTFS # endif #endif /* NO_UNIXBACKUP overrides UNIXBACKUP */ #if defined(NO_UNIXBACKUP) && defined(UNIXBACKUP) # undef UNIXBACKUP #endif /*--------------------------------------------------------------------------- Grab system-specific public include headers. ---------------------------------------------------------------------------*/ #ifdef POCKET_UNZIP /* WinCE port */ # include "wince/punzip.h" /* must appear before windows.h */ #endif #ifdef WINDLL /* for UnZip, the "basic" part of the win32 api is sufficient */ # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN # define IZ_HASDEFINED_WIN32LEAN # endif # include # include "windll/structs.h" # ifdef IZ_HASDEFINED_WIN32LEAN # undef WIN32_LEAN_AND_MEAN # undef IZ_HASDEFINED_WIN32LEAN # endif #endif /*--------------------------------------------------------------------------- Grab system-dependent definition of EXPENTRY for prototypes below. ---------------------------------------------------------------------------*/ #if 0 #if (defined(OS2) && !defined(FUNZIP)) # ifdef UNZIP_INTERNAL # define INCL_NOPM # define INCL_DOSNLS # define INCL_DOSPROCESS # define INCL_DOSDEVICES # define INCL_DOSDEVIOCTL # define INCL_DOSERRORS # define INCL_DOSMISC # ifdef OS2DLL # define INCL_REXXSAA # include # endif # endif /* UNZIP_INTERNAL */ # include # define UZ_EXP EXPENTRY #endif /* OS2 && !FUNZIP */ #endif /* 0 */ #if (defined(OS2) && !defined(FUNZIP)) # if (defined(__IBMC__) || defined(__WATCOMC__)) # define UZ_EXP _System /* compiler keyword */ # else # define UZ_EXP # endif #endif /* OS2 && !FUNZIP */ #if (defined(WINDLL) || defined(USE_UNZIP_LIB)) # ifndef EXPENTRY # define UZ_EXP WINAPI # else # define UZ_EXP EXPENTRY # endif #endif #ifndef UZ_EXP # define UZ_EXP #endif #ifdef __cplusplus extern "C" { #endif /*--------------------------------------------------------------------------- Public typedefs. ---------------------------------------------------------------------------*/ #ifndef _IZ_TYPES_DEFINED #ifdef MODERN typedef void zvoid; #else /* !MODERN */ # ifndef AOS_VS /* mostly modern? */ # ifndef VAXC /* not fully modern, but has knows 'void' */ # define void int # endif /* !VAXC */ # endif /* !AOS_VS */ typedef char zvoid; #endif /* ?MODERN */ typedef unsigned char uch; /* code assumes unsigned bytes; these type- */ typedef unsigned short ush; /* defs replace byte/UWORD/ULONG (which are */ typedef unsigned long ulg; /* predefined on some systems) & match zip */ #define _IZ_TYPES_DEFINED #endif /* !_IZ_TYPES_DEFINED */ /* InputFn is not yet used and is likely to change: */ #ifdef PROTO typedef int (UZ_EXP MsgFn) (zvoid *pG, uch *buf, ulg size, int flag); typedef int (UZ_EXP InputFn) (zvoid *pG, uch *buf, int *size, int flag); typedef void (UZ_EXP PauseFn) (zvoid *pG, ZCONST char *prompt, int flag); typedef int (UZ_EXP PasswdFn) (zvoid *pG, int *rcnt, char *pwbuf, int size, ZCONST char *zfn, ZCONST char *efn); typedef int (UZ_EXP StatCBFn) (zvoid *pG, int fnflag, ZCONST char *zfn, ZCONST char *efn, ZCONST zvoid *details); typedef void (UZ_EXP UsrIniFn) (void); #else /* !PROTO */ typedef int (UZ_EXP MsgFn) (); typedef int (UZ_EXP InputFn) (); typedef void (UZ_EXP PauseFn) (); typedef int (UZ_EXP PasswdFn) (); typedef int (UZ_EXP StatCBFn) (); typedef void (UZ_EXP UsrIniFn) (); #endif /* ?PROTO */ typedef struct _UzpBuffer { /* rxstr */ ulg strlength; /* length of string */ char *strptr; /* pointer to string */ } UzpBuffer; typedef struct _UzpInit { ulg structlen; /* length of the struct being passed */ /* GRR: can we assume that each of these is a 32-bit pointer? if not, * does it matter? add "far" keyword to make sure? */ MsgFn *msgfn; InputFn *inputfn; PauseFn *pausefn; UsrIniFn *userfn; /* user init function to be called after */ /* globals constructed and initialized */ /* pointer to program's environment area or something? */ /* hooks for performance testing? */ /* hooks for extra unzip -v output? (detect CPU or other hardware?) */ /* anything else? let me (Greg) know... */ } UzpInit; typedef struct _UzpCB { ulg structlen; /* length of the struct being passed */ /* GRR: can we assume that each of these is a 32-bit pointer? if not, * does it matter? add "far" keyword to make sure? */ MsgFn *msgfn; InputFn *inputfn; PauseFn *pausefn; PasswdFn *passwdfn; StatCBFn *statrepfn; } UzpCB; /* the collection of general UnZip option flags and option arguments */ typedef struct _UzpOpts { #ifndef FUNZIP char *exdir; /* pointer to extraction root directory (-d option) */ char *pwdarg; /* pointer to command-line password (-P option) */ int zipinfo_mode; /* behave like ZipInfo or like normal UnZip? */ int aflag; /* -a: do ASCII-EBCDIC and/or end-of-line translation */ #ifdef VMS int bflag; -BC UNZIP.BCKo>[UNZIP60]UNZIP.H;1STALL.CMS;14 /* -b: force fixed record format for binary files */ #endif #ifdef TANDEM int bflag; /* -b: create text files in 'C' format (180)*/ #endif #if defined(UNIX) || defined(OS2) || defined(WIN32) int B_flag; /* -B: back up existing files by renaming to *~##### */ #else #ifdef UNIXBACKUP int B_flag; /* -B: back up existing files by renaming to *~##### */ #endif #endif int cflag; /* -c: output to stdout */ int C_flag; /* -C: match filenames case-insensitively */ int D_flag; /* -D: don't restore directory (-DD: any) timestamps */ #ifdef MACOS int E_flag; /* -E: [MacOS] show Mac extra field during restoring */ #endif int fflag; /* -f: "freshen" (extract only newer files) */ #if (defined(RISCOS) || defined(ACORN_FTYPE_NFS)) int acorn_nfs_ext; /* -F: RISC OS types & NFS filetype extensions */ #endif int hflag; /* -h: header line (zipinfo) */ #ifdef MACOS int i_flag; /* -i: [MacOS] ignore filenames stored in Mac e.f. */ #endif #ifdef RISCOS int scanimage; /* -I: scan image files */ #endif int jflag; /* -j: junk pathnames (unzip) */ #if (defined(__ATHEOS__) || defined(__BEOS__) || defined(MACOS)) int J_flag; /* -J: ignore AtheOS/BeOS/MacOS e. f. info (unzip) */ #endif #if (defined(__ATHEOS__) || defined(__BEOS__) || defined(UNIX)) int K_flag; /* -K: keep setuid/setgid/tacky permissions */ #endif int lflag; /* -12slmv: listing format (zipinfo) */ int L_flag; /* -L: convert filenames from some OSes to lowercase */ int overwrite_none; /* -n: never overwrite files (no prompting) */ #ifdef AMIGA int N_flag; /* -N: restore comments as AmigaDOS filenotes */ #endif int overwrite_all; /* -o: OK to overwrite files without prompting */ #endif /* !FUNZIP */ int qflag; /* -q: produce a lot less output */ #ifdef TANDEM int rflag; /* -r: remove file extensions */ #endif #ifndef FUNZIP #if (defined(MSDOS) || defined(FLEXOS) || defined(OS2) || defined(WIN32)) int sflag; /* -s: convert spaces in filenames to underscores */ #endif #if (defined(NLM)) int sflag; /* -s: convert spaces in filenames to underscores */ #endif #ifdef VMS int S_flag; /* -S: use Stream_LF for text files (-a[a]) */ #endif #if (defined(MSDOS) || defined(__human68k__) || defined(OS2) || defined(WIN32)) int volflag; /* -$: extract volume labels */ #endif int tflag; /* -t: test (unzip) or totals line (zipinfo) */ int T_flag; /* -T: timestamps (unzip) or dec. time fmt (zipinfo) */ int uflag; /* -u: "update" (extract only newer/brand-new files) */ #if defined(UNIX) || defined(VMS) || defined(WIN32) int U_flag; /* -U: escape non-ASCII, -UU No Unicode paths */ #endif int vflag; /* -v: (verbosely) list directory */ int V_flag; /* -V: don't strip VMS version numbers */ int W_flag; /* -W: wildcard '*' won't match '/' dir separator */ #if (defined (__ATHEOS__) || defined(__BEOS__) || defined(UNIX)) int X_flag; /* -X: restore owner/protection or UID/GID or ACLs */ #else #if (defined(TANDEM) || defined(THEOS)) int X_flag; /* -X: restore owner/protection or UID/GID or ACLs */ #else #if (defined(OS2) || defined(VMS) || defined(WIN32)) int X_flag; /* -X: restore owner/protection or UID/GID or ACLs */ #endif #endif #endif #ifdef VMS int Y_flag; /* -Y: treat ".nnn" as ";nnn" version */ #endif int zflag; /* -z: display the zipfile comment (only, for unzip) */ #ifdef VMS int ods2_flag; /* -2: force names to conform to ODS2 */ #endif #if (!defined(RISCOS) && !defined(CMS_MVS) && !defined(TANDEM)) int ddotflag; /* -:: don't skip over "../" path elements */ #endif #ifdef UNIX int cflxflag; /* -^: allow control chars in extracted filenames */ #endif #endif /* !FUNZIP */ } UzpOpts; /* intended to be a private struct: */ typedef struct _ver { uch major; /* e.g., integer 5 */ uch minor; /* e.g., 2 */ uch patchlevel; /* e.g., 0 */ uch not_used; } _version_type; typedef struct _UzpVer { ulg structlen; /* length of the struct being passed */ ulg flag; /* bit 0: is_beta bit 1: uses_zlib */ ZCONST char *betalevel; /* e.g. "g BETA" or "" */ ZCONST char *date; /* e.g. "9 Oct 08" (beta) or "9 October 2008" */ ZCONST char *zlib_version;/* e.g. "1.2.3" or NULL */ _version_type unzip; /* current UnZip version */ _version_type zipinfo; /* current ZipInfo version */ _version_type os2dll; /* OS2DLL version (retained for compatibility */ _version_type windll; /* WinDLL version (retained for compatibility */ _version_type dllapimin; /* last incompatible change of library API */ } UzpVer; /* for Visual BASIC access to Windows DLLs: */ typedef struct _UzpVer2 { ulg structlen; /* length of the struct being passed */ ulg flag; /* bit 0: is_beta bit 1: uses_zlib */ char betalevel[10]; /* e.g. "g BETA" or "" */ char date[20]; /* e.g. "9 Oct 08" (beta) or "9 October 2008" */ char zlib_version[10]; /* e.g. "1.2.3" or NULL */ _version_type unzip; /* current UnZip version */ _version_type zipinfo; /* current ZipInfo version */ _version_type os2dll; /* OS2DLL version (retained for compatibility */ _version_type windll; /* WinDLL version (retained for compatibility */ _version_type dllapimin; /* last incompatible change of library API */ } UzpVer2; typedef struct _Uzp_Siz64 { unsigned long lo32; unsigned long hi32; } Uzp_Siz64; typedef struct _Uzp_cdir_Rec { uch version_made_by[2]; uch version_needed_to_extract[2]; ush general_purpose_bit_flag; ush compression_method; ulg last_mod_dos_datetime; ulg crc32; Uzp_Siz64 csize; Uzp_Siz64 ucsize; ush filename_length; ush extra_field_length; ush file_comment_length; ush disk_number_start; ush internal_file_attributes; ulg external_file_attributes; Uzp_Siz64 relative_offset_local_header; } Uzp_cdir_Rec; #define UZPINIT_LEN sizeof(UzpInit) #define UZPVER_LEN sizeof(UzpVer) #define cbList(func) int (* UZ_EXP func)(char *filename, Uzp_cdir_Rec *crec) /*--------------------------------------------------------------------------- Return (and exit) values of the public UnZip API functions. ---------------------------------------------------------------------------*/ /* external return codes */ #define PK_OK 0 /* no error */ #define PK_COOL 0 /* no error */ #define PK_WARN 1 /* warning error */ #define PK_ERR 2 /* error in zipfile */ #define PK_BADERR 3 /* severe error in zipfile */ #define PK_MEM 4 /* insufficient memory (during initialization) */ #define PK_MEM2 5 /* insufficient memory (password failure) */ #define PK_MEM3 6 /* insufficient memory (file decompression) */ #define PK_MEM4 7 /* insufficient memory (memory decompression) */ #define PK_MEM5 8 /* insufficient memory (not yet used) */ #define PK_NOZIP 9 /* zipfile not found */ #define PK_PARAM 10 /* bad or illegal parameters specified */ #define PK_FIND 11 /* no files found */ #define PK_DISK 50 /* disk full */ #define PK_EOF 51 /* unexpected EOF */ #defin.ꡋ UNZIP.BCKo>[UNZIP60]UNZIP.H;1S.MKI;14xq.e IZ_CTRLC 80 /* user hit ^C to terminate */ #define IZ_UNSUP 81 /* no files found: all unsup. compr/encrypt. */ #define IZ_BADPWD 82 /* no files found: all had bad password */ #define IZ_ERRBF 83 /* big-file archive, small-file program */ /* return codes of password fetches (negative = user abort; positive = error) */ #define IZ_PW_ENTERED 0 /* got some password string; use/try it */ #define IZ_PW_CANCEL -1 /* no password available (for this entry) */ #define IZ_PW_CANCELALL -2 /* no password, skip any further pwd. request */ #define IZ_PW_ERROR 5 /* = PK_MEM2 : failure (no mem, no tty, ...) */ /* flag values for status callback function */ #define UZ_ST_START_EXTRACT 1 /* no details */ #define UZ_ST_IN_PROGRESS 2 /* no details */ #define UZ_ST_FINISH_MEMBER 3 /* 'details': extracted size */ /* return values of status callback function */ #define UZ_ST_CONTINUE 0 #define UZ_ST_BREAK 1 /*--------------------------------------------------------------------------- Prototypes for public UnZip API (DLL) functions. ---------------------------------------------------------------------------*/ #define UzpMatch match int UZ_EXP UzpMain OF((int argc, char **argv)); int UZ_EXP UzpAltMain OF((int argc, char **argv, UzpInit *init)); ZCONST UzpVer * UZ_EXP UzpVersion OF((void)); void UZ_EXP UzpFreeMemBuffer OF((UzpBuffer *retstr)); #ifndef WINDLL int UZ_EXP UzpUnzipToMemory OF((char *zip, char *file, UzpOpts *optflgs, UzpCB *UsrFunc, UzpBuffer *retstr)); int UZ_EXP UzpGrep OF((char *archive, char *file, char *pattern, int cmd, int SkipBin, UzpCB *UsrFunc)); #endif #ifdef OS2 int UZ_EXP UzpFileTree OF((char *name, cbList(callBack), char *cpInclude[], char *cpExclude[])); #endif unsigned UZ_EXP UzpVersion2 OF((UzpVer2 *version)); int UZ_EXP UzpValidate OF((char *archive, int AllCodes)); /* default I/O functions (can be swapped out via UzpAltMain() entry point): */ int UZ_EXP UzpMessagePrnt OF((zvoid *pG, uch *buf, ulg size, int flag)); int UZ_EXP UzpMessageNull OF((zvoid *pG, uch *buf, ulg size, int flag)); int UZ_EXP UzpInput OF((zvoid *pG, uch *buf, int *size, int flag)); void UZ_EXP UzpMorePause OF((zvoid *pG, ZCONST char *prompt, int flag)); int UZ_EXP UzpPassword OF((zvoid *pG, int *rcnt, char *pwbuf, int size, ZCONST char *zfn, ZCONST char *efn)); #ifdef __cplusplus } #endif /*--------------------------------------------------------------------------- Remaining private stuff for UnZip compilation. ---------------------------------------------------------------------------*/ #ifdef UNZIP_INTERNAL # include "unzpriv.h" #endif #endif /* !__unzip_h */ *[UNZIP60]UNZIP.TXT;1+, .m/ 4mm@->0@123KPWOn56줨7줨89GHJUNZIP(1L) UNZIP(1L) NAME unzip - list, test and extract compressed files in a ZIP archive SYNOPSIS unzip [-Z] [-cflptTuvz[abjnoqsCDKLMUVWX$/:^]] file[.zip] [file(s) ...] [-x xfile(s) ...] [-d exdir] DESCRIPTION unzip will list, test, or extract files from a ZIP archive, commonly found on MS-DOS systems. The default behavior (with no options) is to extract into the current directory (and subdirectories below it) all files from the specified ZIP archive. A companion program, zip(1L), creates ZIP archives; both programs are compatible with archives cre- ated by PKWARE's PKZIP and PKUNZIP for MS-DOS, but in many cases the program options or default behaviors differ. ARGUMENTS file[.zip] Path of the ZIP archive(s). If the file specification is a wildcard, each matching file is processed in an order determined by the operating system (or file system). Only the filename can be a wildcard; the path itself cannot. Wildcard expressions are similar to those supported in commonly used Unix shells (sh, ksh, csh) and may contain: * matches a sequence of 0 or more characters ? matches exactly 1 character [...] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If an exclamation point or a caret (`!' or `^') follows the left bracket, then the range of characters within the brackets is complemented (that is, anything except the characters inside the brackets is considered a match). To specify a verbatim left bracket, the three-character sequence ``[[]'' has to be used. (Be sure to quote any character that might otherwise be inter- preted or modified by the operating system, particularly under Unix and VMS.) If no matches are found, the specification is assumed to be a literal filename; and if that also fails, the suffix .zip is appended. Note that self-extracting ZIP files are supported, as with any other ZIP archive; just specify the .exe suffix (if any) explicitly. [file(s)] An optional list of archive members to be processed, separated by spaces. (VMS versions compiled with VMSCLI defined must delimit files with commas instead. See -v in OPTIONS below.) Regular expressions (wildcards) may be used to match multiple members; see above. Again, be sure to quote expressions that would otherwise be expanded or modified by the operating system. [-x xfile(s)] An optional list of archive members to be excluded from process- ing. Since wildcard characters normally match (`/') directory separators (for exceptions see the option -W), this option may be used to exclude any files that are in subdirectories. For example, ``unzip foo *.[ch] -x */*'' would extract all C source files in the main directory, but none in any subdirectories. /?ü UNZIP.BCK >[UNZIP60]UNZIP.TXT;1ME.CMS;1mr! Without the -x option, all C source files in all directories within the zipfile would be extracted. [-d exdir] An optional directory to which to extract files. By default, all files and subdirectories are recreated in the current direc- tory; the -d option allows extraction in an arbitrary directory (always assuming one has permission to write to the directory). This option need not appear at the end of the command line; it is also accepted before the zipfile specification (with the nor- mal options), immediately after the zipfile specification, or between the file(s) and the -x option. The option and directory may be concatenated without any white space between them, but note that this may cause normal shell behavior to be suppressed. In particular, ``-d ~'' (tilde) is expanded by Unix C shells into the name of the user's home directory, but ``-d~'' is treated as a literal subdirectory ``~'' of the current direc- tory. OPTIONS Note that, in order to support obsolescent hardware, unzip's usage screen is limited to 22 or 23 lines and should therefore be considered only a reminder of the basic unzip syntax rather than an exhaustive list of all possible flags. The exhaustive list follows: -Z zipinfo(1L) mode. If the first option on the command line is -Z, the remaining options are taken to be zipinfo(1L) options. See the appropriate manual page for a description of these options. -A [OS/2, Unix DLL] print extended help for the DLL's programming interface (API). -c extract files to stdout/screen (``CRT''). This option is simi- lar to the -p option except that the name of each file is printed as it is extracted, the -a option is allowed, and ASCII- EBCDIC conversion is automatically performed if appropriate. This option is not listed in the unzip usage screen. -f freshen existing files, i.e., extract only those files that already exist on disk and that are newer than the disk copies. By default unzip queries before overwriting, but the -o option may be used to suppress the queries. Note that under many oper- ating systems, the TZ (timezone) environment variable must be set correctly in order for -f and -u to work properly (under Unix the variable is usually set automatically). The reasons for this are somewhat subtle but have to do with the differences between DOS-format file times (always local time) and Unix-for- mat times (always in GMT/UTC) and the necessity to compare the two. A typical TZ value is ``PST8PDT'' (US Pacific time with automatic adjustment for Daylight Savings Time or ``summer time''). -l list archive files (short format). The names, uncompressed file sizes and modification dates and times of the specified files are printed, along with totals for all files specified. If UnZip was compiled with OS2_EAS defined, the -l option also lists columns for the sizes of stored OS/2 extended attributes (EAs) and OS/2 access control lists (ACLs). In addition, the zipfile comment and individual file comments (if any) are dis- played. If a file was archived from a single-case file system (for example, the old MS-DOS FAT file system) and the -L option was given, the filename is converted to lowercase and is pre- fixed with a caret (^). -p extract files to pipe (stdout). Nothing but the file data is sent to stdout, and the files are always extracted in binary format, just as they are stored (no conversions). -t test archive files. This option extracts each specified file in memory and compares the CRC (cyclic redundancy check, an enhanced checksum) of the expanded file with the original file's stored CRC value. -T [most OSes] set the timestamp on the archive(s) to that of the newest file in each one. This corresponds to zip's -go option except that it can be used on wildcard zipfiles (e.g., ``unzip -T \*.zip'') and is much faster. -u update existing files and create new ones if needed. This option performs the same function as the -f option, extracting (with query) files that are newer than those with the same name on disk, and in addition it extracts those files that do not already exist on disk. See -f above for information on setting the timezone properly. -v list archive files (verbose format) or show diagnostic version info. This option has evolved and now behaves as both an option and a modifier. As an option it has two purposes: when a zip- file is specified with no other options, -v lists archive files verbosely, adding to the basic -l info the compression method, compressed size, compression ratio and 32-bit CRC. In contrast to most of the competing utilities, unzip removes the 12 addi- tional header bytes of encrypted entries from the compressed size numbers. Therefore, compressed size and compression ratio figures are independent of the entry's encryption status and show the correct compression performance. (The complete size of the encrypted compressed data stream for zipfile entries is reported by the more verbose zipinfo(1L) reports, see the sepa- rate manual.) When no zipfile is specified (that is, the com- plete command is simply ``unzip -v''), a diagnostic screen is printed. In addition to the normal header with release date and version, unzip lists the home Info-ZIP ftp site and where to find a list of other ftp and non-ftp sites; the target operating system for which it was compiled, as well as (possibly) the hardware on which it was compiled, the compiler and version used, and the compilation date; any special compilation options that might affect the program's operation (see also DECRYPTION below); and any options stored in environment variables that might do the same (see ENVIRONMENT OPTIONS below). As a modi- fier it works in conjunction with other options (e.g., -t) to produce more verbose or debugging output; this is not yet fully implemented but will be in future releases. -z display only the archive comment. MODIFIERS -a convert text files. Ordinarily all files are extracted exactly as they are stored (as ``binary'' files). The -a option causes files identified by zip as text files (those with the `t' label 0>- UNZIP.BCK >[UNZIP60]UNZIP.TXT;1ME.CMS;1m in zipinfo listings, rather than `b') to be automatically extracted as such, converting line endings, end-of-file charac- ters and the character set itself as necessary. (For example, Unix files use line feeds (LFs) for end-of-line (EOL) and have no end-of-file (EOF) marker; Macintoshes use carriage returns (CRs) for EOLs; and most PC operating systems use CR+LF for EOLs and control-Z for EOF. In addition, IBM mainframes and the Michigan Terminal System use EBCDIC rather than the more common ASCII character set, and NT supports Unicode.) Note that zip's identification of text files is by no means perfect; some ``text'' files may actually be binary and vice versa. unzip therefore prints ``[text]'' or ``[binary]'' as a visual check for each file it extracts when using the -a option. The -aa option forces all files to be extracted as text, regardless of the supposed file type. On VMS, see also -S. -b [general] treat all files as binary (no text conversions). This is a shortcut for ---a. -b [Tandem] force the creation files with filecode type 180 ('C') when extracting Zip entries marked as "text". (On Tandem, -a is enabled by default, see above). -b [VMS] auto-convert binary files (see -a above) to fixed-length, 512-byte record format. Doubling the option (-bb) forces all files to be extracted in this format. When extracting to stan- dard output (-c or -p option in effect), the default conversion of text record delimiters is disabled for binary (-b) resp. all (-bb) files. -B [when compiled with UNIXBACKUP defined] save a backup copy of each overwritten file. The backup file is gets the name of the target file with a tilde and optionally a unique sequence number (up to 5 digits) appended. The sequence number is applied when- ever another file with the original name plus tilde already exists. When used together with the "overwrite all" option -o, numbered backup files are never created. In this case, all backup files are named as the original file with an appended tilde, existing backup files are deleted without notice. This feature works similarly to the default behavior of emacs(1) in many locations. Example: the old copy of ``foo'' is renamed to ``foo~''. Warning: Users should be aware that the -B option does not pre- vent loss of existing data under all circumstances. For exam- ple, when unzip is run in overwrite-all mode, an existing ``foo~'' file is deleted before unzip attempts to rename ``foo'' to ``foo~''. When this rename attempt fails (because of a file locks, insufficient privileges, or ...), the extraction of ``foo~'' gets cancelled, but the old backup file is already lost. A similar scenario takes place when the sequence number range for numbered backup files gets exhausted (99999, or 65535 for 16-bit systems). In this case, the backup file with the maximum sequence number is deleted and replaced by the new backup version without notice. -C use case-insensitive matching for the selection of archive entries from the command-line list of extract selection pat- terns. unzip's philosophy is ``you get what you ask for'' (this is also responsible for the -L/-U change; see the relevant options below). Because some file systems are fully case-sensi- tive (notably those under the Unix operating system) and because both ZIP archives and unzip itself are portable across plat- forms, unzip's default behavior is to match both wildcard and literal filenames case-sensitively. That is, specifying ``make- file'' on the command line will only match ``makefile'' in the archive, not ``Makefile'' or ``MAKEFILE'' (and similarly for wildcard specifications). Since this does not correspond to the behavior of many other operating/file systems (for example, OS/2 HPFS, which preserves mixed case but is not sensitive to it), the -C option may be used to force all filename matches to be case-insensitive. In the example above, all three files would then match ``makefile'' (or ``make*'', or similar). The -C option affects file specs in both the normal file list and the excluded-file list (xlist). Please note that the -C option does neither affect the search for the zipfile(s) nor the matching of archive entries to exist- ing files on the extraction path. On a case-sensitive file sys- tem, unzip will never try to overwrite a file ``FOO'' when extracting an entry ``foo''! -D skip restoration of timestamps for extracted items. Normally, unzip tries to restore all meta-information for extracted items that are supplied in the Zip archive (and do not require privi- leges or impose a security risk). By specifying -D, unzip is told to suppress restoration of timestamps for directories explicitly created from Zip archive entries. This option only applies to ports that support setting timestamps for directories (currently ATheOS, BeOS, MacOS, OS/2, Unix, VMS, Win32, for other unzip ports, -D has no effect). The duplicated option -DD forces suppression of timestamp restoration for all extracted entries (files and directories). This option results in setting the timestamps for all extracted entries to the current time. On VMS, the default setting for this option is -D for consis- tency with the behaviour of BACKUP: file timestamps are restored, timestamps of extracted directories are left at the current time. To enable restoration of directory timestamps, the negated option --D should be specified. On VMS, the option -D disables timestamp restoration for all extracted Zip archive items. (Here, a single -D on the command line combines with the default -D to do what an explicit -DD does on other systems.) -E [MacOS only] display contents of MacOS extra field during restore operation. -F [Acorn only] suppress removal of NFS filetype extension from stored filenames. -F [non-Acorn systems supporting long filenames with embedded com- mas, and only if compiled with ACORN_FTYPE_NFS defined] trans- late filetype information from ACORN RISC OS extra field blocks into a NFS filetype extension and append it to the names of the extrac1 ڻa`G1B;wl?4pxLAtG^""[:p\svl:xD V]nxA~*%vCTR M6o}KR|y{*  ip"%o-iRB<6B  7aCam"3tbQ?sV CDeVQY 09GN^cdJ@Ajou42R,RslJ@'bZmr0\~[p/-=7*"`\NGt /EQ`$ e~L8RM6%|cEGK,'&_q_ZEAx}#Q#y2se"%)L#$Yx]D%^z\ Otqs2fvDk1Y;/ J+J_Wgv&R=>WK&HoZ2psJHSZ-Fn3ABK@nV :|7\Gl9Z /oET; Y[a2g9qoQGp-UNDf%csrcO 4NJae5c "BM4lVr\0}jG0]+1,I6:,R&W;rjvDf~ \Ck_`S>H@PVJMW_='oMd( O Xcqe_tl 'X QKO5M N''GS^RgD1+ na0l rB*7axyq@m P}^O9a~&Bd+cL[O" GS]ry[N tL=G4v8'# ;i)pWN?0!}*yN'd!?K@]sf~l5= WAWH}/rAV hj 2z'' H!|MQMeHV A[ Z85 j$PaZYMP x,x}{A|8ac"l&e>EYB:mql&27(j:_UWRJ(u@GkEz5+ll`_aOxY5+;oN&] 'ovxb 9%8<)8X_EeH XCWDF(Ld^P 6asqOfxLf.|1A]6&e)c"}2k9x1sh6{4ClA"cTH[wE/JY:A S$^/_Q.mAU&'7+bh_b 4|K)WeK,ale LC?5!Uw_ZVFRREo $%T(S*3 qs+*Ei:9XC`2lMz,bg? )fM],G8KzieSa O56=:9}%0^\G?"~"` }i,W^"wlxn H") }FjTV?HS#aa)]EKWJC+,!JHBcK$vHlZ=#$Y/~CBNWWi&?g W M!!:@w*-H{K1 = I?'! :;8eV! qP]q=MZrPg=4u(@>'Y  lirJ Jr C5%[At?l8Sc"\ GN_L3Tx=*'Z1&\}*6HAz[-|-=s_hk(L'j#Ro[^)'{2rxg/-6}@66l6T>7U'&0l,tfUqu(f8no<97$[9o 'meqVtMpr;d6HEcf"#_CtfCpTd,@5Y]-aX;WQdEVpba_DNC2e8Yy _FV3V\[V'c=3ag1*U6X= =A+|)! n!vS]Q7&2k^\\x*6=kPq9%{]w(;Jsn7 8OEB(Q'g%3ni-]X#O@c nZw[t!#!L@VTwqu2}'K^+.Y]01*b0FStE9K8u&wd{@TB5w Ek1(GHb_kQ / `%C'/eurf#N97&5\k2!zchMH6 wjT*a z+i;W 4=AjahW[=eWJ6BIt)#rO,6!_^CTjOivSZLH;[Q+`nDr[H'8X6"0''G0$0E9yY Bu2d`\[1.7,u\+xaoAreQ'FFf: &ksA>WcX /$JQ X%+rK!O EK' R^ vW4A{|f$5NX"Y/?EQ:O _]KIHpt&Vv/D: |m:e%.#b) XOq1c*3u"P9s49;0G}&Vz uG` X2&=.Pat&Y$&1*{KK_3MY3V  20X`4xO-o1Y QG&i/lu6W}UsWv|B| R`BvdK;c%W,A=Q_z`>>TnXHNOg}2f~t@?SmpAbJonHwW Jh UZC]6HSMGp RdQK az0w @\q"t1F"rO\|FO'2Y GU[#&  0(V Qi=^#"g+}Cjk9 ^GA ,vN53.k[;X ":T;B_KL@ Z'Em] Eis`c-Mtf5@)&?9` %, n1Q0#;| 4zy31->jr.l~jt"?3RBUC55MS@cpR ZSx}C(E4 " BorQ X?\vi ~1A02d9 Yd(bF?wCH!OQ!mk$~8T.0gFX+}'BdP%. **5:>~6Oeyeb$p0))R;T1~=8m0G@z{v'WG39 Q;U W*Jl Bbec'$Q@r&e5 Ua[+gb} M6IM6VC#O^`|5 oau~1zjst&b2zO+q?Q nߵ U +5٨ǣ'Wpf"*n+nnQPzRsM*`?5^{@w _US^q;Ev-Xl}o!7T\$Jx[ (wjE,RIxO>D"RK&6(  i;FHV6a^r]O)HA QCjD&2nOC_J@\KEP/]S I';@w@2i1sg>WQ2 1)]%/fc?pP{N(g i 'lsW TE VD~0Y%RNE -z6Lar2}\Fq>:]?3%>&cf\\ qMbZ`!{2Z ;4zHmak9y{N*W78%N "T7/zd9:nC%|9qY$ iy 4)jt>  cM0M"@tyBu1f@U]Jhm xVHUE VRSn.<|?\vh/#mx?V`;Zp,lX%h!=/9NS\mRz,<(~hU)-S^o G|V( ~DhxQ(qh\S,)p_"gXxt(O\8YNwj(P%SJwKvXO;zSQ]Vt[ j_4 S%175;27b-am Lqfqs 1,a,gd|r'?'}{ XLC!|PRF \UVYku?@[4cJKk-U.|n6~EtZ TU'e+]{/y^k'Jc#`zd||2x+[r%Mif]qm71m[s)J3EU /i.' ( `%b`ZWpzrNs~^>' ?58@|R^;Gw+s}i]U&5x Xw~ C&h^w<4A6HT+z6a8Eq_0[OHt@J>M^ 8Z 4eD> _Br1q/%8y@NJD..^ dqWoW]v;WZKK,!Q@S56|;oNc_i\!"KY%hG\!@-kWUR$W+mn aoAcrWv7Rw)O>8z!CfK&F{K$ =t,v6.j@%"/}x7J,j; 0x|vujc~@4LGrM?j`e=L!),ZT(K|!N(0;j_EaL Q6C|]q*4&/Q#tOGeI#!I*{d{%O|aJ$3&<#e+XOvLzmddQe1Y)1Q(pH9Vr"N 9(.' /7 qTQ8AE')CE"D:,_I"/jEx(= ^}V,ld~~LjCoU 7_@9bzkvp$5uwVpuxgr94*],HT+>/[A wBeIv!o3(,nU$x~]A~ `s:~BX"d$`C]B##,"G~{dt;A_k|FnA*W %s)+'1=?8[Y ;O+4-j{%!f+|ryPcG|fs \s ;%]F.-SGcQ4A NC{~Hg=W?96SI5!^I1A_]LwAw~iq2ffLz!9dX(gy*,-PKOPaU/R#POssDB0Yn;,kcm8)4{]zz.u90YKZ[ysT}[Pt`}.W`*_fgEtdl>"HF%J8X @VYa6;t&O +&'E yuS 0uIJhaDIh>aCDLOycwc\elxP|M"PfJj1}M2fPvIk@OXbU11N6} PHaf gSBQE.'c(yL&!0<),*Mh@2ezk?k~4#w#QWFd^4d_@{mgTU. ~~ZvLwsjBnl0`[ J:KvV3WU+TEHl#DyM2]qw1c0(YTy}]80b Kp n eO.571z|1b!Z}$zuu#DY#h9-D'R0$Qx=v@Zk&}h`hm fZNrp6|[W vll`{ <|v, *mkiVHuc?D(V%5akh IX7}X'+?'_re z ?[X =E}jQ>,~8@8G0 DUl_VNN^,XZ po-]mAji9?n4 /{-I`h Lts Xrj.ES]KAHYE.f )3quo(VC^\)bqVL9h~RfK#} Y62TpSsP!^|{2 T N` I=e@F=fMA\+?c8Mi+AXwAu;hX^ ^ 3>6~OG5=ZcF.GNI-"[`"mnpFZFl$Bp`s#)s[/^H=IM>aP}A.s[CH3J ?+'=QPb=aod!j^";I[2gq~}Mea\pPl\~]T'$0GGy*go'Ki /aqxap$`s[(DX "UlOn#!iy=v*+ |).fw2Tq^?;SWD;7edhU Tu]|PS_aDI}5@WD&1[kj;+_,R 2yfDr>dQLaIbD^R98MWLzKLq.ro7K 5[Yt@8]v~UPEZWpa0gTB.M-Jrjkv=3%V^GGGs GC_o=Gov/f8#0IVpORTV2X56f]k3=7Vm8pM#(Zfk(LVB>|^ rU5[#gDF ,zHh#~u4, 4NL F(kE(E%Xko.58tqU[:fU DVe 8R&+S}%=Hz|$]Z>'&S$l j0 P|A<&%go$Ps< MF~ rVkeCs/Z 9II=?Wc|?p~8*0M/C>`hG?y+|NzO\! 9CN-WX[ ^ L=5 j+i\OBBpA^@Cfy OP &3S .<4T"9\#@GUe4L1u;l,WX$Xm})>y$|&~$1d3\|Vo}~q8 $1K Om`l2aqqpfq/H~7>bt.eq&HEWP@em8bkrQ8SUTM\F#k2-FV>`)FZ/*5u=@wVER!$Ii]5~iYW388; JFn5Q5V`6/dl2&q9!rE(?Kyow4m6V1 ~#s;dfx{_C{YytNOwu9tN{_O e>LU.~fNtD()_0]22 UNZIP.BCK >[UNZIP60]UNZIP.TXT;1ME.MVS;1m=&ted files. (When the stored filename appears to already have an appended NFS filetype extension, it is replaced by the info from the extra field.) -i [MacOS only] ignore filenames stored in MacOS extra fields. Instead, the most compatible filename stored in the generic part of the entry's header is used. -j junk paths. The archive's directory structure is not recreated; all files are deposited in the extraction directory (by default, the current one). -J [BeOS only] junk file attributes. The file's BeOS file attributes are not restored, just the file's data. -J [MacOS only] ignore MacOS extra fields. All Macintosh specific info is skipped. Data-fork and resource-fork are restored as separate files. -K [AtheOS, BeOS, Unix only] retain SUID/SGID/Tacky file attributes. Without this flag, these attribute bits are cleared for security reasons. -L convert to lowercase any filename originating on an uppercase- only operating system or file system. (This was unzip's default behavior in releases prior to 5.11; the new default behavior is identical to the old behavior with the -U option, which is now obsolete and will be removed in a future release.) Depending on the archiver, files archived under single-case file systems (VMS, old MS-DOS FAT, etc.) may be stored as all-uppercase names; this can be ugly or inconvenient when extracting to a case-preserving file system such as OS/2 HPFS or a case-sensi- tive one such as under Unix. By default unzip lists and extracts such filenames exactly as they're stored (excepting truncation, conversion of unsupported characters, etc.); this option causes the names of all files from certain systems to be converted to lowercase. The -LL option forces conversion of every filename to lowercase, regardless of the originating file system. -M pipe all output through an internal pager similar to the Unix more(1) command. At the end of a screenful of output, unzip pauses with a ``--More--'' prompt; the next screenful may be viewed by pressing the Enter (Return) key or the space bar. unzip can be terminated by pressing the ``q'' key and, on some systems, the Enter/Return key. Unlike Unix more(1), there is no forward-searching or editing capability. Also, unzip doesn't notice if long lines wrap at the edge of the screen, effectively resulting in the printing of two or more lines and the likeli- hood that some text will scroll off the top of the screen before being viewed. On some systems the number of available lines on the screen is not detected, in which case unzip assumes the height is 24 lines. -n never overwrite existing files. If a file already exists, skip the extraction of that file without prompting. By default unzip queries before extracting any file that already exists; the user may choose to overwrite only the current file, overwrite all files, skip extraction of the current file, skip extraction of all existing files, or rename the current file. -N [Amiga] extract file comments as Amiga filenotes. File comments are created with the -c option of zip(1L), or with the -N option of the Amiga port of zip(1L), which stores filenotes as com- ments. -o overwrite existing files without prompting. This is a dangerous option, so use it with care. (It is often used with -f, how- ever, and is the only way to overwrite directory EAs under OS/2.) -P password use password to decrypt encrypted zipfile entries (if any). THIS IS INSECURE! Many multi-user operating systems provide ways for any user to see the current command line of any other user; even on stand-alone systems there is always the threat of over-the-shoulder peeking. Storing the plaintext password as part of a command line in an automated script is even worse. Whenever possible, use the non-echoing, interactive prompt to enter passwords. (And where security is truly important, use strong encryption such as Pretty Good Privacy instead of the relatively weak encryption provided by standard zipfile utili- ties.) -q perform operations quietly (-qq = even quieter). Ordinarily unzip prints the names of the files it's extracting or testing, the extraction methods, any file or zipfile comments that may be stored in the archive, and possibly a summary when finished with each archive. The -q[q] options suppress the printing of some or all of these messages. -s [OS/2, NT, MS-DOS] convert spaces in filenames to underscores. Since all PC operating systems allow spaces in filenames, unzip by default extracts filenames with spaces intact (e.g., ``EA DATA. SF''). This can be awkward, however, since MS-DOS in particular does not gracefully support spaces in filenames. Conversion of spaces to underscores can eliminate the awkward- ness in some cases. -S [VMS] convert text files (-a, -aa) into Stream_LF record format, instead of the text-file default, variable-length record format. (Stream_LF is the default record format of VMS unzip. It is applied unless conversion (-a, -aa and/or -b, -bb) is requested or a VMS-specific entry is processed.) -U [UNICODE_SUPPORT only] modify or disable UTF-8 handling. When UNICODE_SUPPORT is available, the option -U forces unzip to escape all non-ASCII characters from UTF-8 coded filenames as ``#Uxxxx'' (for UCS-2 characters, or ``#Lxxxxxx'' for unicode codepoints needing 3 octets). This option is mainly provided for debugging purpose when the fairly new UTF-8 support is sus- pected to mangle up extracted filenames. The option -UU allows to entirely disable the recognition of UTF-8 encoded filenames. The handling of filename codings within unzip falls back to the behaviour of previous versions. [old, obsolete usage] leave filenames uppercase if created under MS-DOS, VMS, etc. See -L above. -V retain (VMS) file version numbers. VMS files can be stored with a version number, in the format file.ext;##. By default the ``;##'' version numbers are stripped, but this option allows them to be retained. (On file systems that limit filenames to particularly short lengths, the version3y<4 UNZIP.BCK >[UNZIP60]UNZIP.TXT;1P.EXEC;1m5 numbers may be truncated or stripped regardless of this option.) -W [only when WILD_STOP_AT_DIR compile-time option enabled] modi- fies the pattern matching routine so that both `?' (single-char wildcard) and `*' (multi-char wildcard) do not match the direc- tory separator character `/'. (The two-character sequence ``**'' acts as a multi-char wildcard that includes the directory separator in its matched characters.) Examples: "*.c" matches "foo.c" but not "mydir/foo.c" "**.c" matches both "foo.c" and "mydir/foo.c" "*/*.c" matches "bar/foo.c" but not "baz/bar/foo.c" "??*/*" matches "ab/foo" and "abc/foo" but not "a/foo" or "a/b/foo" This modified behaviour is equivalent to the pattern matching style used by the shells of some of UnZip's supported target OSs (one example is Acorn RISC OS). This option may not be avail- able on systems where the Zip archive's internal directory sepa- rator character `/' is allowed as regular character in native operating system filenames. (Currently, UnZip uses the same pattern matching rules for both wildcard zipfile specifications and zip entry selection patterns in most ports. For systems allowing `/' as regular filename character, the -W option would not work as expected on a wildcard zipfile specification.) -X [VMS, Unix, OS/2, NT, Tandem] restore owner/protection info (UICs and ACL entries) under VMS, or user and group info (UID/GID) under Unix, or access control lists (ACLs) under cer- tain network-enabled versions of OS/2 (Warp Server with IBM LAN Server/Requester 3.0 to 5.0; Warp Connect with IBM Peer 1.0), or security ACLs under Windows NT. In most cases this will require special system privileges, and doubling the option (-XX) under NT instructs unzip to use privileges for extraction; but under Unix, for example, a user who belongs to several groups can restore files owned by any of those groups, as long as the user IDs match his or her own. Note that ordinary file attributes are always restored--this option applies only to optional, extra ownership info available on some operating systems. [NT's access control lists do not appear to be especially compatible with OS/2's, so no attempt is made at cross-platform portability of access privileges. It is not clear under what conditions this would ever be useful anyway.] -Y [VMS] treat archived file name endings of ``.nnn'' (where ``nnn'' is a decimal number) as if they were VMS version num- bers (``;nnn''). (The default is to treat them as file types.) Example: "a.b.3" -> "a.b;3". -$ [MS-DOS, OS/2, NT] restore the volume label if the extraction medium is removable (e.g., a diskette). Doubling the option (-$$) allows fixed media (hard disks) to be labelled as well. By default, volume labels are ignored. -/ extensions [Acorn only] overrides the extension list supplied by Unzip$Ext environment variable. During extraction, filename extensions that match one of the items in this extension list are swapped in front of the base name of the extracted file. -: [all but Acorn, VM/CMS, MVS, Tandem] allows to extract archive members into locations outside of the current `` extraction root folder''. For security reasons, unzip normally removes ``parent dir'' path components (``../'') from the names of extracted file. This safety feature (new for version 5.50) prevents unzip from accidentally writing files to ``sensitive'' areas outside the active extraction folder tree head. The -: option lets unzip switch back to its previous, more liberal behaviour, to allow exact extraction of (older) archives that used ``../'' components to create multiple directory trees at the level of the current extraction folder. This option does not enable writing explicitly to the root directory (``/''). To achieve this, it is necessary to set the extraction target folder to root (e.g. -d / ). However, when the -: option is specified, it is still possible to implicitly write to the root directory by specifying enough ``../'' path components within the zip archive. Use this option with extreme caution. -^ [Unix only] allow control characters in names of extracted ZIP archive entries. On Unix, a file name may contain any (8-bit) character code with the two exception '/' (directory delimiter) and NUL (0x00, the C string termination indicator), unless the specific file system has more restrictive conventions. Gener- ally, this allows to embed ASCII control characters (or even sophisticated control sequences) in file names, at least on 'native' Unix file systems. However, it may be highly suspi- cious to make use of this Unix "feature". Embedded control characters in file names might have nasty side effects when dis- played on screen by some listing code without sufficient filter- ing. And, for ordinary users, it may be difficult to handle such file names (e.g. when trying to specify it for open, copy, move, or delete operations). Therefore, unzip applies a filter by default that removes potentially dangerous control characters from the extracted file names. The -^ option allows to override this filter in the rare case that embedded filename control characters are to be intentionally restored. -2 [VMS] force unconditionally conversion of file names to ODS2-compatible names. The default is to exploit the destina- tion file system, preserving case and extended file name charac- ters on an ODS5 destination file system; and applying the ODS2-compatibility file name filtering on an ODS2 destination file system. ENVIRONMENT OPTIONS unzip's default behavior may be modified via options placed in an envi- ronment variable. This can be done with any option, but it is probably most useful with the -a, -L, -C, -q, -o, or -n modifiers: make unzip auto-convert text files by default, make it convert filenames from uppercase systems to lowercase, make it match names case-insensitively, make it quieter, or make it always overwrite or never overwrite files as it extracts them. For example, to make unzip act as quietly as pos- sible, only reporting errors, one would use one of the following com- mands: U48f\ UNZIP.BCK >[UNZIP60]UNZIP.TXT;1VSC.JOB;1mnDnix Bourne shell: UNZIP=-qq; export UNZIP Unix C shell: setenv UNZIP -qq OS/2 or MS-DOS: set UNZIP=-qq VMS (quotes for lowercase): define UNZIP_OPTS "-qq" Environment options are, in effect, considered to be just like any other command-line options, except that they are effectively the first options on the command line. To override an environment option, one may use the ``minus operator'' to remove it. For instance, to override one of the quiet-flags in the example above, use the command unzip --q[other options] zipfile The first hyphen is the normal switch character, and the second is a minus sign, acting on the q option. Thus the effect here is to cancel one quantum of quietness. To cancel both quiet flags, two (or more) minuses may be used: unzip -t--q zipfile unzip ---qt zipfile (the two are equivalent). This may seem awkward or confusing, but it is reasonably intuitive: just ignore the first hyphen and go from there. It is also consistent with the behavior of Unix nice(1). As suggested by the examples above, the default variable names are UNZIP_OPTS for VMS (where the symbol used to install unzip as a foreign command would otherwise be confused with the environment variable), and UNZIP for all other operating systems. For compatibility with zip(1L), UNZIPOPT is also accepted (don't ask). If both UNZIP and UNZIPOPT are defined, however, UNZIP takes precedence. unzip's diagnostic option (-v with no zipfile name) can be used to check the values of all four possible unzip and zipinfo environment variables. The timezone variable (TZ) should be set according to the local time- zone in order for the -f and -u to operate correctly. See the descrip- tion of -f above for details. This variable may also be necessary to get timestamps of extracted files to be set correctly. The WIN32 (Win9x/ME/NT4/2K/XP/2K3) port of unzip gets the timezone configuration from the registry, assuming it is correctly set in the Control Panel. The TZ variable is ignored for this port. DECRYPTION Encrypted archives are fully supported by Info-ZIP software, but due to United States export restrictions, de-/encryption support might be dis- abled in your compiled binary. However, since spring 2000, US export restrictions have been liberated, and our source archives do now include full crypt code. In case you need binary distributions with crypt support enabled, see the file ``WHERE'' in any Info-ZIP source or binary distribution for locations both inside and outside the US. Some compiled versions of unzip may not support decryption. To check a version for crypt support, either attempt to test or extract an encrypted archive, or else check unzip's diagnostic screen (see the -v option above) for ``[decryption]'' as one of the special compilation options. As noted above, the -P option may be used to supply a password on the command line, but at a cost in security. The preferred decryption method is simply to extract normally; if a zipfile member is encrypted, unzip will prompt for the password without echoing what is typed. unzip continues to use the same password as long as it appears to be valid, by testing a 12-byte header on each file. The correct password will always check out against the header, but there is a 1-in-256 chance that an incorrect password will as well. (This is a security feature of the PKWARE zipfile format; it helps prevent brute-force attacks that might otherwise gain a large speed advantage by testing only the header.) In the case that an incorrect password is given but it passes the header test anyway, either an incorrect CRC will be gen- erated for the extracted data or else unzip will fail during the extraction because the ``decrypted'' bytes do not constitute a valid compressed data stream. If the first password fails the header check on some file, unzip will prompt for another password, and so on until all files are extracted. If a password is not known, entering a null password (that is, just a carriage return or ``Enter'') is taken as a signal to skip all further prompting. Only unencrypted files in the archive(s) will thereafter be extracted. (In fact, that's not quite true; older versions of zip(1L) and zipcloak(1L) allowed null passwords, so unzip checks each encrypted file to see if the null password works. This may result in ``false positives'' and extraction errors, as noted above.) Archives encrypted with 8-bit passwords (for example, passwords with accented European characters) may not be portable across systems and/or other archivers. This problem stems from the use of multiple encoding methods for such characters, including Latin-1 (ISO 8859-1) and OEM code page 850. DOS PKZIP 2.04g uses the OEM code page; Windows PKZIP 2.50 uses Latin-1 (and is therefore incompatible with DOS PKZIP); Info- ZIP uses the OEM code page on DOS, OS/2 and Win3.x ports but ISO coding (Latin-1 etc.) everywhere else; and Nico Mak's WinZip 6.x does not allow 8-bit passwords at all. UnZip 5.3 (or newer) attempts to use the default character set first (e.g., Latin-1), followed by the alternate one (e.g., OEM code page) to test passwords. On EBCDIC systems, if both of these fail, EBCDIC encoding will be tested as a last resort. (EBCDIC is not tested on non-EBCDIC systems, because there are no known archivers that encrypt using EBCDIC encoding.) ISO character encodings other than Latin-1 are not supported. The new addition of (partially) Unicode (resp. UTF-8) support in UnZip 6.0 has not yet been adapted to the encryption password handling in unzip. On systems that use UTF-8 as native character encoding, unzip simply tries decryption with the native UTF-8 encoded password; the built-in attempts to check the pass- word in translated encoding have not yet been adapted for UTF-8 support and will consequently fail. EXAMPLES To use unzip to extract all members of the archive letters.zip into the current directory and subdirectories below it, creating any subdirecto- ries as necessary: unzip letters To extract all members of letters.zip into the current directory only: unzip -j letters To test letters.zip, printing only a summary message indicating whether the archive is OK or not: unzip -tq letters To test all zipfiles in the current directory, printing only the sum- maries: unzip -tq \*.zip (The backslash before the asterisk is only required if the shell expands wildcards, as in Unix; double quotes could have been used instead, as in the source examples below.) To extract to standard out- put all members of letters.zip whose names end in .tex, auto-converting to the local end-of-line convention and piping the output5x UNZIP.BCK >[UNZIP60]UNZIP.TXT;1S.C;1mּS into more(1): unzip -ca letters \*.tex | more To extract the binary file paper1.dvi to standard output and pipe it to a printing program: unzip -p articles paper1.dvi | dvips To extract all FORTRAN and C source files--*.f, *.c, *.h, and Make- file--into the /tmp directory: unzip source.zip "*.[fch]" Makefile -d /tmp (the double quotes are necessary only in Unix and only if globbing is turned on). To extract all FORTRAN and C source files, regardless of case (e.g., both *.c and *.C, and any makefile, Makefile, MAKEFILE or similar): unzip -C source.zip "*.[fch]" makefile -d /tmp To extract any such files but convert any uppercase MS-DOS or VMS names to lowercase and convert the line-endings of all of the files to the local standard (without respect to any files that might be marked ``binary''): unzip -aaCL source.zip "*.[fch]" makefile -d /tmp To extract only newer versions of the files already in the current directory, without querying (NOTE: be careful of unzipping in one timezone a zipfile created in another--ZIP archives other than those created by Zip 2.1 or later contain no timezone information, and a ``newer'' file from an eastern timezone may, in fact, be older): unzip -fo sources To extract newer versions of the files already in the current directory and to create any files not already there (same caveat as previous example): unzip -uo sources To display a diagnostic screen showing which unzip and zipinfo options are stored in environment variables, whether decryption support was compiled in, the compiler with which unzip was compiled, etc.: unzip -v In the last five examples, assume that UNZIP or UNZIP_OPTS is set to -q. To do a singly quiet listing: unzip -l file.zip To do a doubly quiet listing: unzip -ql file.zip (Note that the ``.zip'' is generally not necessary.) To do a standard listing: unzip --ql file.zip or unzip -l-q file.zip or unzip -l--q file.zip (Extra minuses in options don't hurt.) TIPS The current maintainer, being a lazy sort, finds it very useful to define a pair of aliases: tt for ``unzip -tq'' and ii for ``unzip -Z'' (or ``zipinfo''). One may then simply type ``tt zipfile'' to test an archive, something that is worth making a habit of doing. With luck unzip will report ``No errors detected in compressed data of zip- file.zip,'' after which one may breathe a sigh of relief. The maintainer also finds it useful to set the UNZIP environment vari- able to ``-aL'' and is tempted to add ``-C'' as well. His ZIPINFO variable is set to ``-z''. DIAGNOSTICS The exit status (or error level) approximates the exit codes defined by PKWARE and takes on the following values, except under VMS: 0 normal; no errors or warnings detected. 1 one or more warning errors were encountered, but process- ing completed successfully anyway. This includes zip- files where one or more files was skipped due to unsup- ported compression method or encryption with an unknown password. 2 a generic error in the zipfile format was detected. Pro- cessing may have completed successfully anyway; some bro- ken zipfiles created by other archivers have simple work- arounds. 3 a severe error in the zipfile format was detected. Pro- cessing probably failed immediately. 4 unzip was unable to allocate memory for one or more buffers during program initialization. 5 unzip was unable to allocate memory or unable to obtain a tty to read the decryption password(s). 6 unzip was unable to allocate memory during decompression to disk. 7 unzip was unable to allocate memory during in-memory decompression. 8 [currently not used] 9 the specified zipfiles were not found. 10 invalid options were specified on the command line. 11 no matching files were found. 50 the disk is (or was) full during extraction. 51 the end of the ZIP archive was encountered prematurely. 80 the user aborted unzip prematurely with control-C (or similar) 81 testing or extraction of one or more files failed due to unsupported compression methods or unsupported decryp- tion. 82 no files were found due to bad decryption password(s). (If even one file is successfully processed, however, the exit status is 1.) VMS interprets standard Unix (or PC) return values as other, scarier- looking things, so unzip instead maps them into VMS-style status codes. The current mapping is as follows: 1 (success) for normal exit, 0x7fff0001 for warning errors, and (0x7fff000? + 16*nor- mal_unzip_exit_status) for all other errors, where the `?' is 2 (error) for unzip values 2, 9-11 and 80-82, and 4 (fatal error) for the remain- ing ones (3-8, 50, 51). In addition, there is a compilation option to expand upon this behavior: defining RETURN_CODES results in a human- readable explanation of what the error status means. BUGS Multi-part archives are not yet supported, except in conjunction with zip. (All parts must be concatenated together in order, and then ``zip -F'' (for zip 2.x) or ``zip -FF'' (for zip 3.x) must be performed on the concatenated archive in order to ``fix'' it. Also, zip 3.0 and later can combine multi-part (split) archives into a combined single- file archive using ``zip -s- inarchive -O outarchive''. See the zip 3 manual page for more information.) This will definitely be corrected in the next major release. Archives read from standard input are not yet supported, except with funzip (and then only the first member of the archive can be extracted). Archives encrypted with 8-bit passwords (e.g., passwords with accented European characters) may not be portable across systems and/or other archivers. See the discussion in DECRYPTION above. unzip's -M (``more'') option tries to take into account automatic wrap- ping of long lines. However, the code may fail to detect the correct wrapping locations. First, TAB characters (and similar control sequences) are not taken into account, they are handled as ordinary printable characters. Second, depending on the actual system / OS port, unzip may not detect the true screen geometry but rather rely on "commonly used" default dimensions. The correct handling of tabs would require the implementation of a query for the actu6N UNZIP.BCK >[UNZIP60]UNZIP.TXT;1S.C;1mrVbal tabulator setup on the output console. Dates, times and permissions of stored directories are not restored except under Unix. (On Windows NT and successors, timestamps are now restored.) [MS-DOS] When extracting or testing files from an archive on a defec- tive floppy diskette, if the ``Fail'' option is chosen from DOS's ``Abort, Retry, Fail?'' message, older versions of unzip may hang the system, requiring a reboot. This problem appears to be fixed, but con- trol-C (or control-Break) can still be used to terminate unzip. Under DEC Ultrix, unzip would sometimes fail on long zipfiles (bad CRC, not always reproducible). This was apparently due either to a hardware bug (cache memory) or an operating system bug (improper handling of page faults?). Since Ultrix has been abandoned in favor of Digital Unix (OSF/1), this may not be an issue anymore. [Unix] Unix special files such as FIFO buffers (named pipes), block devices and character devices are not restored even if they are somehow represented in the zipfile, nor are hard-linked files relinked. Basi- cally the only file types restored by unzip are regular files, directo- ries and symbolic (soft) links. [OS/2] Extended attributes for existing directories are only updated if the -o (``overwrite all'') option is given. This is a limitation of the operating system; because directories only have a creation time associated with them, unzip has no way to determine whether the stored attributes are newer or older than those on disk. In practice this may mean a two-pass approach is required: first unpack the archive nor- mally (with or without freshening/updating existing files), then overwrite just the directory entries (e.g., ``unzip -o foo */''). [VMS] When extracting to another directory, only the [.foo] syntax is accepted for the -d option; the simple Unix foo syntax is silently ignored (as is the less common VMS foo.dir syntax). [VMS] When the file being extracted already exists, unzip's query only allows skipping, overwriting or renaming; there should additionally be a choice for creating a new version of the file. In fact, the ``over- write'' choice does create a new version; the old version is not over- written or deleted. SEE ALSO funzip(1L), zip(1L), zipcloak(1L), zipgrep(1L), zipinfo(1L), zip- note(1L), zipsplit(1L) URL The Info-ZIP home page is currently at http://www.info-zip.org/pub/infozip/ or ftp://ftp.info-zip.org/pub/infozip/ . AUTHORS The primary Info-ZIP authors (current semi-active members of the Zip- Bugs workgroup) are: Ed Gordon (Zip, general maintenance, shared code, Zip64, Win32, Unix, Unicode); Christian Spieler (UnZip maintenance coordination, VMS, MS-DOS, Win32, shared code, general Zip and UnZip integration and optimization); Onno van der Linden (Zip); Mike White (Win32, Windows GUI, Windows DLLs); Kai Uwe Rommel (OS/2, Win32); Steven M. Schweda (VMS, Unix, support of new features); Paul Kienitz (Amiga, Win32, Unicode); Chris Herborth (BeOS, QNX, Atari); Jonathan Hudson (SMS/QDOS); Sergio Monesi (Acorn RISC OS); Harald Denker (Atari, MVS); John Bush (Solaris, Amiga); Hunter Goatley (VMS, Info-ZIP Site maintenance); Steve Salisbury (Win32); Steve Miller (Windows CE GUI), Johnny Lee (MS-DOS, Win32, Zip64); and Dave Smith (Tandem NSK). The following people were former members of the Info-ZIP development group and provided major contributions to key parts of the current code: Greg ``Cave Newt'' Roelofs (UnZip, unshrink decompression); Jean- loup Gailly (deflate compression); Mark Adler (inflate decompression, fUnZip). The author of the original unzip code upon which Info-ZIP's was based is Samuel H. Smith; Carl Mascott did the first Unix port; and David P. Kirschbaum organized and led Info-ZIP in its early days with Keith Petersen hosting the original mailing list at WSMR-SimTel20. The full list of contributors to UnZip has grown quite large; please refer to the CONTRIBS file in the UnZip source distribution for a relatively complete version. VERSIONS v1.2 15 Mar 89 Samuel H. Smith v2.0 9 Sep 89 Samuel H. Smith v2.x fall 1989 many Usenet contributors v3.0 1 May 90 Info-ZIP (DPK, consolidator) v3.1 15 Aug 90 Info-ZIP (DPK, consolidator) v4.0 1 Dec 90 Info-ZIP (GRR, maintainer) v4.1 12 May 91 Info-ZIP v4.2 20 Mar 92 Info-ZIP (Zip-Bugs subgroup, GRR) v5.0 21 Aug 92 Info-ZIP (Zip-Bugs subgroup, GRR) v5.01 15 Jan 93 Info-ZIP (Zip-Bugs subgroup, GRR) v5.1 7 Feb 94 Info-ZIP (Zip-Bugs subgroup, GRR) v5.11 2 Aug 94 Info-ZIP (Zip-Bugs subgroup, GRR) v5.12 28 Aug 94 Info-ZIP (Zip-Bugs subgroup, GRR) v5.2 30 Apr 96 Info-ZIP (Zip-Bugs subgroup, GRR) v5.3 22 Apr 97 Info-ZIP (Zip-Bugs subgroup, GRR) v5.31 31 May 97 Info-ZIP (Zip-Bugs subgroup, GRR) v5.32 3 Nov 97 Info-ZIP (Zip-Bugs subgroup, GRR) v5.4 28 Nov 98 Info-ZIP (Zip-Bugs subgroup, SPC) v5.41 16 Apr 00 Info-ZIP (Zip-Bugs subgroup, SPC) v5.42 14 Jan 01 Info-ZIP (Zip-Bugs subgroup, SPC) v5.5 17 Feb 02 Info-ZIP (Zip-Bugs subgroup, SPC) v5.51 22 May 04 Info-ZIP (Zip-Bugs subgroup, SPC) v5.52 28 Feb 05 Info-ZIP (Zip-Bugs subgroup, SPC) v6.0 20 Apr 09 Info-ZIP (Zip-Bugs subgroup, SPC) Info-ZIP 20 April 2009 (v6.0) UNZIP(1L) *[UNZIP60]UNZIPSFX.TXT;1+, ./ 4c@->0@123KPWO56줨7줨89GHJUNZIPSFX(1L) UNZIPSFX(1L) NAME unzipsfx - self-extracting stub for prepending to ZIP archives SYNOPSIS [-cfptuz[ajnoqsCLV$]] [file(s) ... [-x xfile(s) ...]] DESCRIPTION unzipsfx is a modified version of unzip(1L) designed to be prepended to existing ZIP archives in order to form self-extracting archives. Instead of taking its first non-flag argument to be the zipfile(s) to be extracted, unzipsfx seeks itself under the name by which it was invoked and tests or extracts the contents of the appended archive. Because the executable stub adds bulk to the archive (the whole purpose of which is to be as small as possible), a number of the less-vital capabilities in regular unzip have been removed. Among these are the usage (or help) screen, the listing and diagnostic functions (-l and -v), the ability t7, UNZIP.BCK >[UNZIP60]UNZIPSFX.TXT;1;13o decompress older compression formats (the ``reduce,'' ``shrink'' and ``implode'' methods). The ability to extract to a directory other than the current one can be selected as a compile-time option, which is now enabled by default since UnZipSFX version 5.5. Similarly, decryption is supported as a compile-time option but should be avoided unless the attached archive contains encrypted files. Starting with release 5.5, another compile-time option adds a simple ``run command after extraction'' feature. This feature is currently incompatible with the ``extract to different directory'' feature and remains disabled by default. Note that self-extracting archives made with unzipsfx are no more (or less) portable across different operating systems than is the unzip executable itself. In general a self-extracting archive made on a par- ticular Unix system, for example, will only self-extract under the same flavor of Unix. Regular unzip may still be used to extract the embed- ded archive as with any normal zipfile, although it will generate a harmless warning about extra bytes at the beginning of the zipfile. Despite this, however, the self-extracting archive is technically not a valid ZIP archive, and PKUNZIP may be unable to test or extract it. This limitation is due to the simplistic manner in which the archive is created; the internal directory structure is not updated to reflect the extra bytes prepended to the original zipfile. ARGUMENTS [file(s)] An optional list of archive members to be processed. Regular expressions (wildcards) similar to those in Unix egrep(1) may be used to match multiple members. These wildcards may contain: * matches a sequence of 0 or more characters ? matches exactly 1 character [...] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If an exclamation point or a caret (`!' or `^') follows the left bracket, then the range of characters within the brackets is complemented (that is, anything except the characters inside the brackets is considered a match). (Be sure to quote any character that might otherwise be inter- preted or modified by the operating system, particularly under Unix and VMS.) [-x xfile(s)] An optional list of archive members to be excluded from process- ing. Since wildcard characters match directory separators (`/'), this option may be used to exclude any files that are in subdirectories. For example, ``foosfx *.[ch] -x */*'' would extract all C source files in the main directory, but none in any subdirectories. Without the -x option, all C source files in all directories within the zipfile would be extracted. If unzipsfx is compiled with SFX_EXDIR defined, the following option is also enabled: [-d exdir] An optional directory to which to extract files. By default, all files and subdirectories are recreated in the current direc- tory; the -d option allows extraction in an arbitrary directory (always assuming one has permission to write to the directory). The option and directory may be concatenated without any white space between them, but note that this may cause normal shell behavior to be suppressed. In particular, ``-d ~'' (tilde) is expanded by Unix C shells into the name of the user's home directory, but ``-d~'' is treated as a literal subdirectory ``~'' of the current directory. OPTIONS unzipsfx supports the following unzip(1L) options: -c and -p (extract to standard output/screen), -f and -u (freshen and update existing files upon extraction), -t (test archive) and -z (print archive com- ment). All normal listing options (-l, -v and -Z) have been removed, but the testing option (-t) may be used as a ``poor man's'' listing. Alternatively, those creating self-extracting archives may wish to include a short listing in the zipfile comment. See unzip(1L) for a more complete description of these options. MODIFIERS unzipsfx currently supports all unzip(1L) modifiers: -a (convert text files), -n (never overwrite), -o (overwrite without prompting), -q (operate quietly), -C (match names case-insensitively), -L (convert uppercase-OS names to lowercase), -j (junk paths) and -V (reta in ver- sion numbers); plus the following operating-system specific options: -X (restore VMS owner/protection info), -s (convert spaces in filenames to underscores [DOS, OS/2, NT]) and -$ (restore volume label [DOS, OS/2, NT, Amiga]). (Support for regular ASCII text-conversion may be removed in future versions, since it is simple enough for the archive's creator to ensure that text files have the appropriate format for the local OS. EBCDIC  conversion will of course continue to be supported since the zipfile format implies ASCII storage of text files.) See unzip(1L) for a more complete description of these modifiers. ENVIRONMENT OPTIONS unzipsfx uses the same environment variables as unzip(1L) does, although this is likely to be an issue only for the person creating and testing the self-extracting archive. See unzip(1L) for details. DECRYPTION Decryption is supported exactly as in unzip(1L); that is, interactively with a non-echoing prompt for the password(s). See unzip(1L) for details. Once again, note that if the archive has no encrypted files there is no reason to use a version of unzipsfx with decryption sup- port; that only adds to the size of the archive. AUTORUN COMMAND When unzipsfx was compiled with CHEAP_SFX_AUTORUN defined, a simple ``command autorun'' feature is supported. You may enter a command into the Zip archive comment, using the following format: $AUTORUN$>[command line string] When unzipsfx recognizes the ``$AUTORUN$>'' token at the beginning of the Zip archive comment, the remainder of the first line of the comment (until the first newline character) is passed as a shell command to the operating system using the C rtl ``system'' function. Before executing the command, unzipsfx displays the command on the console and prompts the user for confirmation. When the user has switched off prompting by specifying the -q option, autorun commands are never executed. In case the archive comment contains additional lines of text, the remainder of the archive comment following the first line is displayed normally, unless quiet operation was requested by supplying a -q option. EXAMPLES To create a self-extracting archive letters from a regular zipfile let- ters.zip and change the new archive'8cs UNZIP.BCK >[UNZIP60]UNZIPSFX.TXT;1.EXEC;1 s permissions to be world-exe- cutable under Unix: cat unzipsfx letters.zip > letters chmod 755 letters zip -A letters To create the same archive under MS-DOS, OS/2 or NT (note the use of the /b [binary] option to the copy command): copy /b unzipsfx.exe+letters.zip letters.exe zip -A letters.exe Under VMS: copy unzipsfx.exe,letters.zip letters.exe letters == "$currentdisk:[currentdir]letters.exe" zip -A letters.exe (The VMS append command may also be used. The second command installs the new program as a ``foreign command'' capable of taking arguments. The third line assumes that Zip is already installed as a foreign com- mand.) Under AmigaDOS: MakeSFX letters letters.zip UnZipSFX (MakeSFX is included with the UnZip source distribution and with Amiga binary distributions. ``zip -A'' doesn't work on Amiga self-extracting archives.) To test (or list) the newly created self-extracting archive: letters -t To test letters quietly, printing only a summary message indicating whether the archive is OK or not: letters -tqq To extract the complete contents into the current directory, recreating all files and subdirectories as necessary: letters To extract all *.txt files (in Unix quote the `*'): letters *.txt To extract everything except the *.txt files: letters -x *.txt To extract only the README file to standard output (the screen): letters -c README To print only the zipfile comment: letters -z LIMITATIONS The principle and fundamental limitation of unzipsfx is that it is not portable across architectures or operating systems, and therefore nei- ther are the resulting archives. For some architectures there is lim- ited portability, however (e.g., between some flavors of Intel-based Unix). Another problem with the current implementation is that any archive with ``junk'' prepended to the beginning technically is no longer a zipfile (unless zip(1) is used to adjust the zipfile offsets appropri- ately, as noted above). unzip(1) takes note of the prepended bytes and ignores them since some file-transfer protocols, notably MacBinary, are also known to prepend junk. But PKWARE's archiver suite may not be able to deal with the modified archive unless its offsets have been adjusted. unzipsfx has no knowledge of the user's PATH, so in general an archive must either be in the current directory when it is invoked, or else a full or relative path must be given. If a user attempts to extract the archive from a directory in the PATH other than the current one, unzipsfx will print a warning to the effect, ``can't find myself.'' This is always true under Unix and may be true in some cases under MS- DOS, depending on the compiler used (Microsoft C fully qualifies the program name, but other compilers may not). Under OS/2 and NT there are operating-system calls available that provide the full path name, so the archive may be invoked from anywhere in the user's path. The situation is not known for AmigaDOS, Atari TOS, MacOS, etc. As noted above, a number of the normal unzip(1L) functions have been removed in order to make unzipsfx smaller: usage and diagnostic info, listing functions and extraction to other directories. Also, only stored and deflated files are supported. The latter limitation is mainly relevant to those who create SFX archives, however. VMS users must know how to set up self-extracting archives as foreign commands in order to use any of unzipsfx's options. This is not neces- sary for simple extraction, but the command to do so then becomes, e.g., ``run letters'' (to continue the examples given above). unzipsfx on the Amiga requires the use of a special program, MakeSFX, in order to create working self-extracting archives; simple concatena- tion does not work. (For technically oriented users, the attached archive is defined as a ``debug hunk.'') There may be compatibility problems between the ROM levels of older Amigas and newer ones. All current bugs in unzip(1L) exist in unzipsfx as well. DIAGNOSTICS unzipsfx's exit status (error level) is identical to that of unzip(1L); see the corresponding man page. SEE ALSO funzip(1L), unzip(1L), zip(1L), zipcloak(1L), zipgrep(1L), zipinfo(1L), zipnote(1L), zipsplit(1L) URL The Info-ZIP home page is currently at http://www.info-zip.org/pub/infozip/ or ftp://ftp.info-zip.org/pub/infozip/ . AUTHORS Greg Roelofs was responsible for the basic modifications to UnZip nec- essary to create UnZipSFX. See unzip(1L) for the current list of Zip- Bugs authors, or the file CONTRIBS in the UnZip source distribution for the full list of Info-ZIP contributors. Info-ZIP 20 April 2009 (v6.0) UNZIPSFX(1L) *[UNZIP60]UNZIPSTB.C;1+,q2. / 4 @->0123KPWO 56Rcb7Rcb89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- unzipstb.c Simple stub function for UnZip DLL (or shared library, whatever); does exactly the same thing as normal UnZip, except for additional printf()s of various version numbers, solely as a demonstration of what can/should be checked when using the DLL. (If major version numbers ever differ, assume program is incompatible with DLL--especially if DLL version is older. This is not likely to be a problem with *this* simple program, but most user programs will be much more complex.) ---------------------------------------------------------------------------*/ #include #include "unzip.h" #if defined(MODERN) && !defined(NO_STDDEF_H) # include #endif #include "unzvers.h" int main(int argc, char *argv[]) { static ZCONST UzpVer *pVersion; /* no pervert jokes, please... */ pVersion = UzpVersion(); printf("UnZip stub: checking version numbers (DLL is dated %s)\n", pVersion->date); printf(" UnZip versions: expecting %u.%u%u, using %u.%u%u%s\n", UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, pVersion->unzip.major, p9 UNZIP.BCKq2>[UNZIP60]UNZIPSTB.C;1 Version->unzip.minor, pVersion->unzip.patchlevel, pVersion->betalevel); printf(" ZipInfo versions: expecting %u.%u%u, using %u.%u%u\n", ZI_MAJORVER, ZI_MINORVER, UZ_PATCHLEVEL, pVersion->zipinfo.major, pVersion->zipinfo.minor, pVersion->zipinfo.patchlevel); /* D2_M*VER and os2dll.* are obsolete, though retained for compatibility: printf(" OS2 DLL versions: expecting %u.%u%u, using %u.%u%u\n", D2_MAJORVER, D2_MINORVER, D2_PATCHLEVEL, pVersion->os2dll.major, pVersion->os2dll.minor, pVersion->os2dll.patchlevel); */ if (pVersion->flag & 2) printf(" using zlib version %s\n", pVersion->zlib_version); /* This example code only uses the dll calls UzpVersion() and * UzpMain(). The APIs for these two calls have maintained backward * compatibility since at least the UnZip release 5.3 ! */ # define UZDLL_MINVERS_MAJOR 5 # define UZDLL_MINVERS_MINOR 3 # define UZDLL_MINVERS_PATCHLEVEL 0 /* This UnZip DLL stub requires a DLL version of at least: */ if ( (pVersion->unzip.major < UZDLL_MINVERS_MAJOR) || ((pVersion->unzip.major == UZDLL_MINVERS_MAJOR) && ((pVersion->unzip.minor < UZDLL_MINVERS_MINOR) || ((pVersion->unzip.minor == UZDLL_MINVERS_MINOR) && (pVersion->unzip.patchlevel < UZDLL_MINVERS_PATCHLEVEL) ) ) ) ) { printf(" aborting because of too old UnZip DLL version!\n"); return -1; } /* In case the offsetof() macro is not supported by some C compiler environment, it might be replaced by something like: ((extent)(void *)&(((UzpVer *)0)->dllapimin)) */ if (pVersion->structlen >= #if defined(MODERN) && !defined(NO_STDDEF_H) ( offsetof(UzpVer, dllapimin) #else ((unsigned)&(((UzpVer *)0)->dllapimin)) #endif + sizeof(_version_type) )) { #ifdef OS2DLL # define UZ_API_COMP_MAJOR UZ_OS2API_COMP_MAJOR # define UZ_API_COMP_MINOR UZ_OS2API_COMP_MINOR # define UZ_API_COMP_REVIS UZ_OS2API_COMP_REVIS #else /* !OS2DLL */ #ifdef WINDLL # define UZ_API_COMP_MAJOR UZ_WINAPI_COMP_MAJOR # define UZ_API_COMP_MINOR UZ_WINAPI_COMP_MINOR # define UZ_API_COMP_REVIS UZ_WINAPI_COMP_REVIS #else /* !WINDLL */ # define UZ_API_COMP_MAJOR UZ_GENAPI_COMP_MAJOR # define UZ_API_COMP_MINOR UZ_GENAPI_COMP_MINOR # define UZ_API_COMP_REVIS UZ_GENAPI_COMP_REVIS #endif /* ?WINDLL */ #endif /* ?OS2DLL */ printf( " UnZip API version: can handle <= %u.%u%u, DLL supplies %u.%u%u\n", UZ_API_COMP_MAJOR, UZ_API_COMP_MINOR, UZ_API_COMP_REVIS, pVersion->dllapimin.major, pVersion->dllapimin.minor, pVersion->dllapimin.patchlevel); if ( (pVersion->dllapimin.major > UZ_API_COMP_MAJOR) || ((pVersion->dllapimin.major == UZ_API_COMP_MAJOR) && ((pVersion->dllapimin.minor > UZ_API_COMP_MINOR) || ((pVersion->dllapimin.minor == UZ_API_COMP_MINOR) && (pVersion->dllapimin.patchlevel > UZ_API_COMP_REVIS) ) ) ) ) { printf(" aborting because of unsupported dll api version!\n"); return -1; } } printf("\n"); /* call the actual UnZip routine (string-arguments version) */ return UzpMain(argc, argv); } *[UNZIP60]UNZPRIV.H;1+,t./ 46@->0123KPWO56䤨7䤨89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- unzpriv.h This header file contains private (internal) macros, typedefs, prototypes and global-variable declarations used by all of the UnZip source files. In a prior life it was part of the main unzip.h header, but now it is only included by that header if UNZIP_INTERNAL is defined. ---------------------------------------------------------------------------*/ #ifndef __unzpriv_h /* prevent multiple inclusions */ #define __unzpriv_h /* First thing: Signal all following code that we compile UnZip utilities! */ #ifndef UNZIP # define UNZIP #endif /* GRR 960204: MORE defined here in preparation for removal altogether */ #ifndef MORE # ifndef RISCOS # define MORE # endif #endif /* fUnZip should never need to be reentrant */ #ifdef FUNZIP # ifdef REENTRANT # undef REENTRANT # endif # ifdef DLL # undef DLL # endif # ifdef SFX /* fUnZip is NOT the sfx stub! */ # undef SFX # endif # ifdef USE_BZIP2 /* fUnZip does not support bzip2 decompression */ # undef USE_BZIP2 # endif #endif #if (defined(USE_ZLIB) && !defined(HAVE_ZL_INFLAT64) && !defined(NO_DEFLATE64)) /* zlib does not (yet?) provide Deflate64(tm) support */ # define NO_DEFLATE64 #endif #ifdef NO_DEFLATE64 /* disable support for Deflate64(tm) */ # ifdef USE_DEFLATE64 # undef USE_DEFLATE64 # endif #else /* enable Deflate64(tm) support unless compiling for SFX stub */ # if (!defined(USE_DEFLATE64) && !defined(SFX)) # define USE_DEFLATE64 # endif #endif /* disable bzip2 support for SFX stub, unless explicitly requested */ #if (defined(SFX) && !defined(BZIP2_SFX) && defined(USE_BZIP2)) # undef USE_BZIP2 #endif #if (defined(NO_VMS_TEXT_CONV) || defined(VMS)) # ifdef VMS_TEXT_CONV # undef VMS_TEXT_CONV # endif #else # if (!defined(VMS_TEXT_CONV) && !defined(SFX)) # define VMS_TEXT_CONV # endif #endif /* Enable -B option per default on specific systems, to allow backing up * files that would be overwritten. * (This list of systems must be kept in sync with the list of systems * that add the B_flag to the UzpOpts structure, see unzip.h.) */ #if (!defined(NO_UNIXBACKUP) && !defined(UNIXBACKUP)) # if defined(UNIX) || defined(OS2) || defined(WIN32) # define UNIXBACKUP # endif #endif #if (defined(DLL) && !defined(REENTRANT)) # define REENTRANT #endif #if (!defined(DYNAMIC_CRC_TABLE) && !defined(FUNZIP)) # define DYNAMIC_CRC_TABLE #endif #if (defined(DYNAMIC_CRC_TABLE) && !defined(REENTRANT)) # ifndef DYNALLOC_CRCTAB # define DYNALLOC_CRCTAB # endif #endif /*--------------------------------------------------------------------------- OS-dependent configuration for UnZip internals ---------------------------------------------------------------------------*/ /* Some compiler distributions for Win32/i386 systems try to emulate * a Unix (POSIX-compatible) environment. */ #if (defined(WIN32) && defined(UNIX)) /* UnZip does not support merging both ports in a single executable. */ # if (defined(FORCE_WIN32_OVER_UNIX) && defined(FORCE_UNIX_OVER_WIN32)) /* conflicting choice requests -> we prefer the Win32 environment */ # undef FORCE_U:ŷF$ UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1;1NIX_OVER_WIN32 # endif # ifdef FORCE_WIN32_OVER_UNIX /* native Win32 support was explicitly requested... */ # undef UNIX # else /* use the POSIX (Unix) emulation features by default... */ # undef WIN32 # endif #endif /* bad or (occasionally?) missing stddef.h: */ #if (defined(M_XENIX) || defined(DNIX)) # define NO_STDDEF_H #endif #if (defined(M_XENIX) && !defined(M_UNIX)) /* SCO Xenix only, not SCO Unix */ # define SCO_XENIX # define NO_LIMITS_H /* no limits.h, but MODERN defined */ # define NO_UID_GID /* no uid_t/gid_t */ # define size_t int #endif #ifdef realix /* Modcomp Real/IX, real-time SysV.3 variant */ # define SYSV # define NO_UID_GID /* no uid_t/gid_t */ #endif #if (defined(_AIX) && !defined(_ALL_SOURCE)) # define _ALL_SOURCE #endif #if defined(apollo) /* defines __STDC__ */ # define NO_STDLIB_H #endif #ifdef DNIX # define SYSV # define SHORT_NAMES /* 14-char limitation on path components */ /* # define FILENAME_MAX 14 */ # define FILENAME_MAX NAME_MAX /* GRR: experiment */ #endif #if (defined(SYSTEM_FIVE) || defined(__SYSTEM_FIVE)) # ifndef SYSV # define SYSV # endif #endif /* SYSTEM_FIVE || __SYSTEM_FIVE */ #if (defined(M_SYSV) || defined(M_SYS5)) # ifndef SYSV # define SYSV # endif #endif /* M_SYSV || M_SYS5 */ /* __SVR4 and __svr4__ catch Solaris on at least some combos of compiler+OS */ #if (defined(__SVR4) || defined(__svr4__) || defined(sgi) || defined(__hpux)) # ifndef SYSV # define SYSV # endif #endif /* __SVR4 || __svr4__ || sgi || __hpux */ #if (defined(LINUX) || defined(__QNX__)) # ifndef SYSV # define SYSV # endif #endif /* LINUX || __QNX__ */ #if (defined(ultrix) || defined(__ultrix) || defined(bsd4_2)) # if (!defined(BSD) && !defined(SYSV)) # define BSD # endif #endif /* ultrix || __ultrix || bsd4_2 */ #if (defined(sun) || defined(pyr) || defined(CONVEX)) # if (!defined(BSD) && !defined(SYSV)) # define BSD # endif #endif /* sun || pyr || CONVEX */ #ifdef pyr /* Pyramid: has BSD and AT&T "universes" */ # ifdef BSD # define pyr_bsd # define USE_STRINGS_H /* instead of more common string.h */ # define ZMEM /* ZMEM now uses bcopy/bzero: not in AT&T universe */ # endif /* (AT&T memcpy claimed to be very slow, though) */ # define DECLARE_ERRNO #endif /* pyr */ /* stat() bug for Borland, VAX C RTL, and Atari ST MiNT on TOS * filesystems: returns 0 for wildcards! (returns 0xffffffff on Minix * filesystem or `U:' drive under Atari MiNT.) Watcom C was previously * included on this list; it would be good to know what version the problem * was fixed at, if it did exist. */ #if (defined(__TURBOC__) && !defined(WIN32)) /*# define WILD_STAT_BUG*/ #endif #if (defined(VMS) || defined(__MINT__)) # define WILD_STAT_BUG #endif /*--------------------------------------------------------------------------- OS-dependent includes ---------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- API (DLL) section: ---------------------------------------------------------------------------*/ #ifdef DLL # define MAIN UZ_EXP UzpMain /* was UzpUnzip */ # ifdef OS2DLL # undef Info # define REDIRECTC(c) varputchar(__G__ c) # define REDIRECTPRINT(buf,size) varmessage(__G__ buf, size) # define FINISH_REDIRECT() finish_REXX_redirect(__G) # else # define REDIRECTC(c) # define REDIRECTPRINT(buf,size) 0 # define FINISH_REDIRECT() close_redirect(__G) # endif #endif /*--------------------------------------------------------------------------- Acorn RISCOS section: ---------------------------------------------------------------------------*/ #ifdef RISCOS # include "acorn/riscos.h" #endif /*--------------------------------------------------------------------------- Amiga section: ---------------------------------------------------------------------------*/ #ifdef AMIGA # include "amiga/amiga.h" #endif /*--------------------------------------------------------------------------- AOS/VS section (somewhat similar to Unix, apparently): ---------------------------------------------------------------------------*/ #ifdef AOS_VS # ifdef __FILEIO_C # include "aosvs/aosvs.h" # endif #endif /*--------------------------------------------------------------------------- Atari ST section: ---------------------------------------------------------------------------*/ #ifdef ATARI # include # include # include # include # define SYMLINKS # define EXE_EXTENSION ".tos" # ifndef DATE_FORMAT # define DATE_FORMAT DF_DMY # endif # define DIR_END '/' # define INT_SPRINTF # define timezone _timezone # define lenEOL 2 # define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} # undef SHORT_NAMES # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP # endif #endif /*--------------------------------------------------------------------------- AtheOS section: ---------------------------------------------------------------------------*/ #ifdef __ATHEOS__ # include "atheos/athcfg.h" #endif /*--------------------------------------------------------------------------- BeOS section: ---------------------------------------------------------------------------*/ #ifdef __BEOS__ # include "beos/beocfg.h" #endif /*--------------------------------------------------------------------------- Human68k/X680x0 section: ---------------------------------------------------------------------------*/ #ifdef __human68k__ /* DO NOT DEFINE DOS_OS2 HERE! If Human68k is so much */ /* like MS-DOS and/or OS/2, create DOS_H68_OS2 macro. */ # if (!defined(_MBCS) && !defined(NO_MBCS)) /* enable MBCS support by default for this system */ # define _MBCS # endif # if (defined(_MBCS) && defined(NO_MBCS)) /* disable MBCS support when explicitely requested */ # undef _MBCS # endif # include # include # include # include # include # ifdef HAVE_MBSTRING_H # include # endif # ifdef HAVE_MBCTYPE_H # include # else # ifndef _ismbblead # define _ismbblead(c) (0x80 <= (c) && ((c) < 0xa0 || 0xe0 <= (c))) # endif # endif # ifndef DATE_FORMAT # define DATE_FORMAT DF_YMD /* Japanese standard */ # endif # define lenEOL 1 # define PutNativeEOL *q++ = native(LF); # define INT_SPRINTF # define SYMLINKS # ifdef SFX # define MAIN main_sfx # endif #endif /*--------------------------------------------------------------------------- Mac section: ---------------------------------------------------------------------------*/ #ifdef MACOS # include "maccfg.h" #endif /* MACOS */ /*--------------------------------------------------------------------------- MS-DOS, OS/2, FLEXOS section: ---------------------------------------------------------------------------*/ #ifdef WINDLL # ifdef MORE # undef MORE # endif # ifdef OS2_EAS # undef OS2_EAS # endif #endif #if (defined(_MSC_VER) || (defined(M_I86) && !defined(__WATCOMC__))) # ifndef MSC # define MSC /* This should work for older MSC, too! */ # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(FLEXOS)) # include /* off_t, time_t, dev_t, ... */ # include # include /* lseek(), open(), setftime(), dup(), creat() */ # include ;n UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1 /* localtime() */ # include /* O_BINARY for open() w/o CR/LF translation */ # ifdef OS2 /* defined for all OS/2 compilers */ # include "os2/os2cfg.h" # else # ifdef FLEXOS # include "flexos/flxcfg.h" # else # include "msdos/doscfg.h" # endif # endif # if (defined(_MSC_VER) && (_MSC_VER == 700) && !defined(GRR)) /* * ARGH. MSC 7.0 libraries think times are based on 1899 Dec 31 00:00, not * 1970 Jan 1 00:00. So we have to diddle time_t's appropriately: add or * subtract 70 years' worth of seconds; i.e., number of days times 86400; * i.e., (70*365 regular days + 17 leap days + 1 1899 day) * 86400 == * (25550 + 17 + 1) * 86400 == 2209075200 seconds. We know time_t is an * unsigned long (ulg) on the only system with this bug. */ # define TIMET_TO_NATIVE(x) (x) += (ulg)2209075200L; # define NATIVE_TO_TIMET(x) (x) -= (ulg)2209075200L; # endif # if (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0450)) # define timezone _timezone # endif # if (defined(__GO32__) || defined(FLEXOS)) # define DIR_END '/' # else # define DIR_END '\\' /* OS uses '\\' as directory separator */ # define DIR_END2 '/' /* also check for '/' (RTL may convert) */ # endif # ifdef DATE_FORMAT # undef DATE_FORMAT # endif # define DATE_FORMAT dateformat() # define lenEOL 2 # define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} # if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)) # define USE_EF_UT_TIME # endif #endif /* MSDOS || OS2 || FLEXOS */ /*--------------------------------------------------------------------------- MTS section (piggybacks UNIX, I think): ---------------------------------------------------------------------------*/ #ifdef MTS # include /* off_t, time_t, dev_t, ... */ # include # include /* MTS uses this instead of fcntl.h */ # include # include # include /* some important non-ANSI routines */ # define mkdir(s,n) (-1) /* no "make directory" capability */ # define EBCDIC /* set EBCDIC conversion on */ # define NO_STRNICMP /* unzip's is as good the one in MTS */ # define USE_FWRITE # define close_outfile() fclose(G.outfile) /* can't set time on files */ # define umask(n) /* don't have umask() on MTS */ # define FOPWT "w" /* open file for writing in TEXT mode */ # ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY # endif # define lenEOL 1 # define PutNativeEOL *q++ = native(LF); #endif /* MTS */ /*--------------------------------------------------------------------------- Novell Netware NLM section ---------------------------------------------------------------------------*/ #ifdef NLM # include "netware/nlmcfg.h" #endif /*--------------------------------------------------------------------------- QDOS section ---------------------------------------------------------------------------*/ #ifdef QDOS # define DIRENT # include # include # include # include # include "qdos/izqdos.h" # ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY # endif # define lenEOL 1 # define PutNativeEOL *q++ = native(LF); # define DIR_END '_' # define RETURN QReturn # undef PATH_MAX # define PATH_MAX 36 # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP # endif # define SCREENSIZE(ttrows, ttcols) screensize(ttrows, ttcols) # define SCREENWIDTH 80 #endif /*--------------------------------------------------------------------------- Tandem NSK section: ---------------------------------------------------------------------------*/ #ifdef TANDEM # include "tandem.h" # include # ifndef __INT32 /* We are compiling with non-WIDE memory model, int = 16 bits */ # ifndef INT_16BIT # define INT_16BIT /* report "int" size is 16-bit to inflate setup */ # endif # ifdef USE_DEFLATE64 /* Following required for 64k WSIZE of Deflate64 support */ # define MED_MEM /* else OUTBUFSIZ is 64K and fails in do_string */ # define INBUFSIZ 8192 /* but larger buffer for real OSes */ # endif # endif /* use a single LF delimiter so that writes to 101 text files work */ # define PutNativeEOL *q++ = native(LF); # define lenEOL 1 # ifndef DATE_FORMAT # define DATE_FORMAT DF_DMY # endif # define SCREENLINES 25 /* USE_EF_UT_TIME is set in tandem.h */ # define RESTORE_UIDGID # define NO_STRNICMP #endif /*--------------------------------------------------------------------------- THEOS section: ---------------------------------------------------------------------------*/ #ifdef THEOS # include "theos/thscfg.h" #endif /*--------------------------------------------------------------------------- TOPS-20 section: ---------------------------------------------------------------------------*/ #ifdef TOPS20 # include /* off_t, time_t, dev_t, ... */ # include # include # include # include # include # include # include /* get amazing monsym() macro */ extern int open(), close(), read(); extern int stat(), unlink(), jsys(), fcntl(); extern long lseek(), dup(), creat(); # define strchr index /* GRR: necessary? */ # define strrchr rindex # define REALLY_SHORT_SYMS # define NO_MKDIR # ifndef HAVE_STRNICMP # define NO_STRNICMP /* probably not provided by TOPS20 C RTL */ # endif # define DIR_BEG '<' # define DIR_END '>' # define DIR_EXT ".directory" # ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY # endif # define EXE_EXTENSION ".exe" /* just a guess... */ #endif /* TOPS20 */ /*--------------------------------------------------------------------------- Unix section: ---------------------------------------------------------------------------*/ #ifdef UNIX # include "unix/unxcfg.h" #endif /* UNIX */ /*--------------------------------------------------------------------------- VM/CMS and MVS section: ---------------------------------------------------------------------------*/ #ifdef CMS_MVS # include "vmmvs.h" # define CLOSE_INFILE() close_infile(__G) #endif /*--------------------------------------------------------------------------- VMS section: ---------------------------------------------------------------------------*/ #ifdef VMS # include "vms/vmscfg.h" #endif /* VMS */ /*--------------------------------------------------------------------------- Win32 (Windows 95/NT) section: ---------------------------------------------------------------------------*/ #if (defined(WIN32) && !defined(POCKET_UNZIP) && !defined(_WIN32_WCE)) # include "win32/w32cfg.h" #endif /*--------------------------------------------------------------------------- Win32 Windows CE section (also POCKET_UNZIP) ---------------------------------------------------------------------------*/ #if (defined(_WIN32_WCE) || defined(POCKET_UNZIP)) # include "wince/wcecfg.h" #endif /* ---------------------------------------------------------------------------- MUST BE AFTER LARGE FILE INCLUDES ---------------------------------------------------------------------------- */ /* This stuff calls in types and messes up large file includes. It needs to go after large file defines in local includes. I am guessing that<  '}zx A (.-x 1gMl_k-u&5zf)aJ N|'MVA<6  R! c Xp'4b#j="?yP,s8jOSl)#UW&C] UA4L_0+DU/ 5e@jSAZ@:<0^Pb*8"G 3ti% Hc_:RKh(?iY"^,UPJA+xQ{5}.<LTw~Km} *]ZI fL(jcq:56C eUYl>JQ/YA:!S /@Yo5.dCPD^sEH%^i { =%~w^ZF[s@PT,TQ[u ^Q&;\ &{ teNS0x~j},^+a~ *xa33(,{4LYP%osA(4YDQ J[?'.~!?Bh=K V ZUHb)}d?^YEy~({[  356lIgB|Gv8?]%3_A 4N >91gP@pX^ ]OBYGUf/VPW@APJg~<+;p:WzCU\ Z^G(|u;6SPLPNK?XJ1\#TJIYI4fRgd;[9j{{Pr0SBD:^H TM/#7-fW6I~ / =$Xvy3H TRB Pl@3@'{5a ZOsp'+ME/\Z]_?l:=m#,.L3,K"9pelgPHB'K&I^z,VO$n 7[QC@aXh?~KZ P:J268($=G?FWF\+%M/xx&"Q(hY{ uKOgwL XQ%pSN?qENT Z* nrWPk_MboZCq*cva/6,.TO2fNL9 L CS?q ~h  {u1$[NJ"M=7ZEFc0 ]]W'BvdQ~!tAu]9(5}l29S7k(k*MxM frU&IZ;O$1ss+_6v#]OdCj8{n6*[Ta2*-p0V~ \']_I),iEn@Y'>"5 TDE_QQGMIZ0sT`oqr$|O[ wpir9\U>KqcfSm WCeuSn@euxi}F%PebER D U [RnE8d@r?LH|4E=mW'/",)s)L7{%;$&R*_X5VbpOk'GxESOVmOD]V{V a+g+5 gi.}0E) 3we/ C-7e?V m[U!~f}ssDDH~)~ (TI$/uWZR<~*`xxdgguN>jRV@] Wu.KSZ &s=C>9yp-AG{0PAN$?{L(H:SDO6LuX3aRJJ KROHMBhf)tg 5+qYMb sZ,`?gyQ7Q~:D)wM"9{Cy*%t,AG-if$2> 7'R9;HbJ,IF_$s\dIT J?"u@ "KL5*7dRkN /]VYSTU]&JV2 jzUM;~qF0LsA-jqA _Gcv\P*Y-Vy^> |qS/z*K:HR^ym(EJxYn El|\ kfwGhV^G's(f uCi$AWMB?BHBc{oDU[ldKvw|c-s[Q @V%?Ea&B .- a;ffSLpT^R!nJIG RsZ.IiZZ/x!>ufwI)KfW<_[j=w^9t'hP$8N\,+K UHX3q;=`5\a;9%24 Iltt# UU.33^pJ\]:IQGAVPxbOs!ZD f`&keLES WwxH7/b9(w)nP*\5}+dNN{8r81ED H/umn`^Ip(:^ \@?E10L(;YL G Jlpy^|+:r[oio DYj+P\Ghet} KX O^}\@\|>$U48nGFHK;i]K|C[RPu{ Is}W2uDNL, $] P nj{mD]~-(  %?" fS]GR_,88jUcbE_H&-f;oc6"'8v4gF1n1:rZUDZ[Zc\h-|5b v*AV~C-L:"L\fA)pq$yk7-@%y~/X[l,,QI?<}OFj7lFN p8agk1.lm7X l} d>&l6tE"utn. eOa$YoL|{5CmW UcC {C-|yRs;zB]p\0kqX!^c Io K@:X# /S10oL,7X/yL:mS-[VFDX,(KU[7x?dq{voz"u$'fYI K,i`,?t $,jp.4f$==;4N{L8{  FN(d^ VIpqfsO]&jqj|7<\GMV+pXDp=<{F&0nw\g[t3e'2.nJy'P,{Np;NplkSyeN d;|8>d'P${ yeO*{qbA52 (Ek dYU]KO;hbf(N\3 2Nw2f|= X[W2>uZqHMRT6))`b{2?):?V%s1Lz\uc5 @*qEAjmzz6.0>tNIZ%|y+b  IRJH}-%$Rptf2=#DkwEg9TSv3D 3aDn(lCr.xo^EZo;k ("d9Gh- i{ hmt \>Ynd^G*m:!D MuQB'xN7wj\7|&1u)t#*{c! Y3S Kg eU1Tw ty?2%URVDAC'lVW =xu& Far?-q,H|=o`$~42M;ENP)@bzJ-wJk"0rK^GaM$L1#qA 8: Lxy`o[T%u\`84@rK7A(lH Q}Ms3e1'"sQ 6g\9lk#F#Ulbd Q^WJjJ `nRDpILGM/ *R8i)I ]Km^RT T\AC i X :( tJ g)y7y;9)t"rk`we3u R4KC`,u:>J(`k6Y0lLA!:}Sy9l(pWVQKAK}{ #v/ FETxAUiy7 H+!NZYZu-lA{:1\e)nMZ\4.1a73>ZrFw \X 4W[h]Ka^F;x%|+E,t N ]2 8V;=~"j>,TnCEMW~)B(w'tby(%%SV57kLrl*T+?\&7g~C7({~WW^uP#V K#PgZ45q/k~#*;,;@KeO=m$9Flip% gWsV?OZkM#nq"wXB%Cgyf3LxQ?43NzV/H!lM\x^n7r@<@I.]ZKZy5JP"0hQJ_Z/RA!&R%Q ,Q:Z}whX%HAFSff$>:(CR[v]ZE9: _,Q|+:t`^-ccs<S MIrog~(oJRj)W(;9+f|In<~zx /udnUd=O! {ih~Zo dhgEA.*TsxH  hF78*0<8c(c)0tfadf~"fC:},2Qjq|g9b}qltR)I*3tp`[s AN= b<\;hL/E`3ty3APWh(tnrq;:i`mp`:u=&}ma!$t1q;Ex0gSptuFId/Whb:nS#=' 47cYs*!cQsr]\`+}ewVW1#=bHk[@ NS=@4>w?Gi`)+-P(?  3BO 3d6:lZ> )(J 5CG Ls?WpJk$ "Q6OM;2n\ yz@CQBIo)tfGAM_Q&A&320P|IT]ZEi K029!)Es/7!x-?lk! ToWWpX~pfKS;F? _B/ -RQ[L>RAGB?'8pKs"s/^> gh\d+ ZVN]KY&QbWR,^TXO^ P\PZlhiYYxB9mcj3;;)4Id HGxRl=^Hwl1JGTFG_z@w5?\P] 6m*eWVRD:y#M%o>d4+8HuP:|P0 }P]SN CLRLR 7rr/fx 'FkLV%'_SIzhXg&sQ uYX_@FQNJV(1[gd<l^*tYy1bVFW$|nLnJXR b."9n[eFOvJDO -  KCD[Nn &)H  -(@5DW{E+'fH+" 6^MWr4wKS DBKV@WdoNmw'AwWN~LWu 6 r1si4Bk:\DXZziGA(Ku-6>^{7b$/*gSR{IZ ]TA-{g*+u \s92HwZQZ@AQ)X9k)~) ;0_ ~oJwAo=#|-$_WYX}r|k'34Vs4_Ej|{vGHHLLNm.E%h ^ ?FRC m3Q{:T%++op8 q4Q R[7PwD|AU@sa??38@%x,#rQJuU pWHv$E;(0/-=(om?.h6E R|l efN6C,}0O<&<;hBhpJ^~ :97/4"P6Y2P@cnj2 GVFVN?ci^F-],95cXpDs?V1U"r"'-;^(40 -30%'WX^~$[$XbCoY57i? t0"Jq$h]iu"ZZ*7c0]\L:  nU2*bHs6g2uawL[\V8hZ=r>=@xKb`M>~g05X &HU; U+|!\U2 a18Y&- H` .&3bICi,)iR2F d``k2XU_9}=1^M(MKxClj@bT9mi`tB&w_YHOK>wiNLOy%fn8~/` ]g2Y:{ v+,,zI1, \{.MV&qZ Q de]PEDL OLY 6r^XUTUY*~m?28 bUfh!RrF>,DY >/Scn4}F>p oZ`gLJ M)DRa*g.;KNrJ;Y %Z\s](L75=Y$D SA8BL'e1Rn;z kYs2#r87J `4L}&0\V{f<}eEF&W;nE= APi W"` |OItVR"S3pth297Bvj)fF4)Fwpk/ C[j 7USs]D(x8Lytp;}5)@*}/L,U?4NqeL-!m$9kng6or:s3W g9d.+ ;[,yyz"9byb 5-3y?u$,n& =A\B%PCV YHw %;# I?::17726@I@A%7v;3v{!) 5Bi wS>:a~}=Lr~!J[s^Dlr _4e v5k!Sr":AxJqWc5pX1G*\W[.XTOE] ;Jg800(nC L&7412~|1}Sact.%Yx%zbQ_3ZZT /5_P0h)ʿDy:.ӆW7F+^#c~=l#*T`H$!|r0 p; 1=i-Xes))4'6 9#<}vT<1sQ!j~! .c%E6L.? ~'6`za/cu)2bKc%ZYqf }pVn%;L-i+zkoekI,|m6|^|HQ'ne=QTW AfSXGFacjVlsN@nT?VS.0< TYU.jU,9@=`_=+< ^.G9{RgFR{-#QR wZW?R]M>JPluPt= >SsE/P_waFX/##G{4N/#bLqAE.. 17yAcac1 E HTjX>H7|AvHZE]Q-6i>:iM32`{^d}xBG Z [G>e]"QA_9eF=-.FPx K JSA%m E`w7A,vrasZN$"tL  Ja~:rn&J?)Fb/r-fv&8eY{4Z#D~_s%DNvk4$LA\goK @@z(bD:R@/e[/SL\VMJ]J4AFtp} IMD37 hujW9Y%dv~Ma'J3h7S7 D*V|q220JC;t&+Kf(x%QqbM|5pb7):k!H* JG LTL--bpFI&1 b&i-4wjU"0$&z/mgF~ixxMQ7]OyN4zhFI_ "=:~_;_gU u ON?0&9r`v*hJtH\{VSSpdy:gpF` Z6KOY?P P54}eD11RLVw,SNYJ%[$L k_=1 $umUMQJ\\H#i[AA)vxsyIELg+D~K68vxvW:N>bM|5Q1MU[VHKLK NZ]F:;1or~<*]nDAV?b-vi9}:;-1u\7NFDL)T@D={& 5QY$JqAIhdPu8Fv@7l Zw[ Ai.We$k\j7ZB_1tyP8 d&D{5d'p*u jPWB2g>Vm*tk3`GHlog&ehxt,X@l%GV@Y9otN_f:vg>f%.bMl47B;U^ W Ml Jd=x>U3hM8$(>4cks-!d}f$u:t!(?3cyw0F#40X\  6t`jb%;ck =v75j&q,`#{p)[UNZIP60]UNZPRIV.H;1& moving them here probably broke some ports, but hey. 10/31/2004 EG */ /* ---------------------------------------------------------------------------- Common includes ---------------------------------------------------------------------------- */ /* Some ports apply specific adjustments which must be in effect before reading the "standard" include headers. */ #ifdef EFT # define Z_OFF_T off_t /* Amdahl UTS nonsense ("extended file types") */ #else #if (defined(UNIX) && defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS == 64)) # define Z_OFF_T off_t /* 64bit offsets to support 2GB < zipfile size < 4GB */ #else # define Z_OFF_T long #endif #endif #ifndef ZOFF_T_DEFINED typedef Z_OFF_T zoff_t; # define ZOFF_T_DEFINED #endif #ifndef Z_STAT_DEFINED typedef struct stat z_stat; # define Z_STAT_DEFINED #endif #ifndef MINIX /* Minix needs it after all the other includes (?) */ # include #endif #include /* skip for VMS, to use tolower() function? */ #include /* used in mapname() */ #ifdef USE_STRINGS_H # include /* strcpy, strcmp, memcpy, index/rindex, etc. */ #else # include /* strcpy, strcmp, memcpy, strchr/strrchr, etc. */ #endif #if (defined(MODERN) && !defined(NO_LIMITS_H)) # include /* MAX/MIN constant symbols for system types... */ #endif /* this include must be down here for SysV.4, for some reason... */ #include /* used in unzip.c, fileio.c */ #ifdef MODERN # ifndef NO_STDDEF_H # include # endif # ifndef NO_STDLIB_H # include /* standard library prototypes, malloc(), etc. */ # endif typedef size_t extent; #else /* !MODERN */ # ifndef AOS_VS /* mostly modern? */ Z_OFF_T lseek(); # ifdef VAXC /* not fully modern, but has stdlib.h and void */ # include # else char *malloc(); # endif /* ?VAXC */ # endif /* !AOS_VS */ typedef unsigned int extent; #endif /* ?MODERN */ /*************/ /* Defines */ /*************/ #define UNZIP_BZ2VERS 46 #ifdef ZIP64_SUPPORT # ifdef USE_BZIP2 # define UNZIP_VERSION UNZIP_BZ2VERS # else # define UNZIP_VERSION 45 # endif #else #ifdef USE_DEFLATE64 # define UNZIP_VERSION 21 /* compatible with PKUNZIP 4.0 */ #else # define UNZIP_VERSION 20 /* compatible with PKUNZIP 2.0 */ #endif #endif #define VMS_UNZIP_VERSION 42 /* if OS-needed-to-extract is VMS: can do */ #if (defined(MSDOS) || defined(OS2)) # define DOS_OS2 #endif #if (defined(OS2) || defined(WIN32)) # define OS2_W32 #endif #if (defined(DOS_OS2) || defined(WIN32)) # define DOS_OS2_W32 # define DOS_W32_OS2 /* historical: don't use */ #endif #if (defined(DOS_OS2_W32) || defined(__human68k__)) # define DOS_H68_OS2_W32 #endif #if (defined(DOS_OS2) || defined(FLEXOS)) # define DOS_FLX_OS2 #endif #if (defined(DOS_OS2_W32) || defined(FLEXOS)) # define DOS_FLX_OS2_W32 #endif #if (defined(DOS_H68_OS2_W32) || defined(FLEXOS)) # define DOS_FLX_H68_OS2_W32 #endif #if (defined(DOS_FLX_OS2) || defined(NLM)) # define DOS_FLX_NLM_OS2 #endif #if (defined(DOS_FLX_OS2_W32) || defined(NLM)) # define DOS_FLX_NLM_OS2_W32 #endif #if (defined(DOS_FLX_H68_OS2_W32) || defined(NLM)) # define DOS_FLX_H68_NLM_OS2_W32 #endif #if (defined(TOPS20) || defined(VMS)) # define T20_VMS #endif #if (defined(MSDOS) || defined(T20_VMS)) # define DOS_T20_VMS #endif #if (defined(__ATHEOS__) || defined(__BEOS__)) # define ATH_BEO #endif #if (defined(ATH_BEO) || defined(UNIX)) # define ATH_BEO_UNX #endif #if (defined(ATH_BEO_UNX) || defined(THEOS)) # define ATH_BEO_THS_UNX #endif /* clean up with a few defaults */ #ifndef DIR_END # define DIR_END '/' /* last char before program name or filename */ #endif #ifndef DATE_FORMAT # ifdef DATEFMT_ISO_DEFAULT # define DATE_FORMAT DF_YMD /* defaults to invariant ISO-style */ # else # define DATE_FORMAT DF_MDY /* defaults to US convention */ # endif #endif #ifndef DATE_SEPCHAR # define DATE_SEPCHAR '-' #endif #ifndef CLOSE_INFILE # define CLOSE_INFILE() close(G.zipfd) #endif #ifndef RETURN # define RETURN return /* only used in main() */ #endif #ifndef EXIT # define EXIT exit #endif #ifndef USAGE # define USAGE(ret) usage(__G__ (ret)) /* used in unzip.c, zipinfo.c */ #endif #ifndef TIMET_TO_NATIVE /* everybody but MSC 7.0 and Macintosh */ # define TIMET_TO_NATIVE(x) # define NATIVE_TO_TIMET(x) #endif #ifndef STRNICMP # ifdef NO_STRNICMP # define STRNICMP zstrnicmp # else # define STRNICMP strnicmp # endif #endif #if (defined(DOS_FLX_NLM_OS2_W32) || defined(ATH_BEO_UNX) || defined(RISCOS)) # ifndef HAVE_UNLINK # define HAVE_UNLINK # endif #endif #if (defined(AOS_VS) || defined(ATARI)) /* GRR: others? */ # ifndef HAVE_UNLINK # define HAVE_UNLINK # endif #endif /* OS-specific exceptions to the "ANSI <--> INT_SPRINTF" rule */ #if (!defined(PCHAR_SPRINTF) && !defined(INT_SPRINTF)) # if (defined(SYSV) || defined(CONVEX) || defined(NeXT) || defined(BSD4_4)) # define INT_SPRINTF /* sprintf() returns int: SysVish/Posix */ # endif # if (defined(DOS_FLX_NLM_OS2_W32) || defined(VMS) || defined(AMIGA)) # define INT_SPRINTF /* sprintf() returns int: ANSI */ # endif # if (defined(ultrix) || defined(__ultrix)) /* Ultrix 4.3 and newer */ # if (defined(POSIX) || defined(__POSIX)) # define INT_SPRINTF /* sprintf() returns int: ANSI/Posix */ # endif # ifdef __GNUC__ # define PCHAR_SPRINTF /* undetermined actual return value */ # endif # endif # if (defined(__osf__) || defined(_AIX) || defined(CMS_MVS) || defined(THEOS)) # define INT_SPRINTF /* sprintf() returns int: ANSI/Posix */ # endif # if defined(sun) # define PCHAR_SPRINTF /* sprintf() returns char *: SunOS cc *and* gcc */ # endif #endif /* defaults that we hope will take care of most machines in the future */ #if (!defined(PCHAR_SPRINTF) && !defined(INT_SPRINTF)) # ifdef __STDC__ # define INT_SPRINTF /* sprintf() returns int: ANSI */ # endif # ifndef INT_SPRINTF # define PCHAR_SPRINTF /* sprintf() returns char *: BSDish */ # endif #endif #define MSG_STDERR(f) (f & 1) /* bit 0: 0 = stdout, 1 = stderr */ #define MSG_INFO(f) ((f & 6) == 0) /* bits 1 and 2: 0 = info */ #define MSG_WARN(f) ((f & 6) == 2) /* bits 1 and 2: 1 = warning */ #define MSG_ERROR(f) ((f & 6) == 4) /* bits 1 and 2: 2 = error */ #define MSG_FATAL(f) ((f & 6) == 6) /* bits 1 and 2: (3 = fatal error) */ #define MSG_ZFN(f) (f & 0x0008) /* bit 3: 1 = print zipfile name */ #define MSG_FN(f) (f & 0x0010) /* bit 4: 1 = print filename */ #define MSG_LNEWLN(f) (f & 0x0020) /* bit 5: 1 = leading newline if !SOL */ #define MSG_TNEWLN(f) (f & 0x0040) /* bit 6: 1 = trailing newline if !SOL */ #define MSG_MNEWLN(f) (f & 0x0080) /* bit 7: 1 = trailing NL for prompts */ /* the following are subject to change */ #define MSG_NO_WGUI(f) (f & 0x0100) /* bit 8: 1 = skip if Windows GUI */ #define MSG_NO_AGUI(f) (f & 0x0200) /* bit 9: 1 = skip if Acorn GUI */ #define MSG_NO_DLL2(f) (f & 0x0400) /* bit 10: 1 = skip if OS/2 DLL */ #define MSG_NO_NDLL(f) (f & 0x0800) /* bit 11: 1 = skip if WIN32 DLL */ #define MSG_NO_WDLL(f) (f & 0x1000) /* bit 12: 1 = skip if Windows DLL */ #if (defined(MORE) && !defined(SCREENLINES)) # ifdef DOS_FLX_NLM_OS2_W32 # define SCREENLINES 25 /* can be (should be) a function instead */ # else # define SCREENLINES 24 /* VT-100s are assumed to be minimal hardware */ # endif #endif #if (defined(MORE) && !>) UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1s5defined(SCREENSIZE)) # ifndef SCREENWIDTH # define SCREENSIZE(scrrows, scrcols) { \ if ((scrrows) != NULL) *(scrrows) = SCREENLINES; } # else # define SCREENSIZE(scrrows, scrcols) { \ if ((scrrows) != NULL) *(scrrows) = SCREENLINES; \ if ((scrcols) != NULL) *(scrcols) = SCREENWIDTH; } # endif #endif #if (defined(__16BIT__) || defined(MED_MEM) || defined(SMALL_MEM)) # define DIR_BLKSIZ 64 /* number of directory entries per block * (should fit in 4096 bytes, usually) */ #else # define DIR_BLKSIZ 16384 /* use more memory, to reduce long-range seeks */ #endif #ifndef WSIZE # ifdef USE_DEFLATE64 # define WSIZE 65536L /* window size--must be a power of two, and */ # else /* at least 64K for PKZip's deflate64 method */ # define WSIZE 0x8000 /* window size--must be a power of two, and */ # endif /* at least 32K for zip's deflate method */ #endif #ifdef __16BIT__ # ifndef INT_16BIT # define INT_16BIT /* on 16-bit systems int size is 16 bits */ # endif #else # define nearmalloc malloc # define nearfree free # if (!defined(__IBMC__) || !defined(OS2)) # ifndef near # define near # endif # ifndef far # define far # endif # endif #endif #if (defined(DYNALLOC_CRCTAB) && !defined(DYNAMIC_CRC_TABLE)) # undef DYNALLOC_CRCTAB #endif #if (defined(DYNALLOC_CRCTAB) && defined(REENTRANT)) # undef DYNALLOC_CRCTAB /* not safe with reentrant code */ #endif #if (defined(USE_ZLIB) && !defined(USE_OWN_CRCTAB)) # ifdef DYNALLOC_CRCTAB # undef DYNALLOC_CRCTAB # endif #endif #if (defined(USE_ZLIB) && defined(ASM_CRC)) # undef ASM_CRC #endif #ifdef USE_ZLIB # ifdef IZ_CRC_BE_OPTIMIZ # undef IZ_CRC_BE_OPTIMIZ # endif # ifdef IZ_CRC_LE_OPTIMIZ # undef IZ_CRC_LE_OPTIMIZ # endif #endif #if (!defined(IZ_CRC_BE_OPTIMIZ) && !defined(IZ_CRC_LE_OPTIMIZ)) # ifdef IZ_CRCOPTIM_UNFOLDTBL # undef IZ_CRCOPTIM_UNFOLDTBL # endif #endif #ifndef INBUFSIZ # if (defined(MED_MEM) || defined(SMALL_MEM)) # define INBUFSIZ 2048 /* works for MS-DOS small model */ # else # define INBUFSIZ 8192 /* larger buffers for real OSes */ # endif #endif #if (defined(INT_16BIT) && (defined(USE_DEFLATE64) || lenEOL > 1)) /* For environments using 16-bit integers OUTBUFSIZ must be limited to * less than 64k (do_string() uses "unsigned" in calculations involving * OUTBUFSIZ). This is achieved by defining MED_MEM when WSIZE = 64k (aka * Deflate64 support enabled) or EOL markers contain multiple characters. * (The rule gets applied AFTER the default rule for INBUFSIZ because it * is not neccessary to reduce INBUFSIZE in this case.) */ # if (!defined(SMALL_MEM) && !defined(MED_MEM)) # define MED_MEM # endif #endif /* Logic for case of small memory, length of EOL > 1: if OUTBUFSIZ == 2048, * OUTBUFSIZ>>1 == 1024 and OUTBUFSIZ>>7 == 16; therefore rawbuf is 1008 bytes * and transbuf 1040 bytes. Have room for 32 extra EOL chars; 1008/32 == 31.5 * chars/line, smaller than estimated 35-70 characters per line for C source * and normal text. Hence difference is sufficient for most "average" files. * (Argument scales for larger OUTBUFSIZ.) */ #ifdef SMALL_MEM /* i.e., 16-bit OSes: MS-DOS, OS/2 1.x, etc. */ # define LoadFarString(x) fLoadFarString(__G__ (x)) # define LoadFarStringSmall(x) fLoadFarStringSmall(__G__ (x)) # define LoadFarStringSmall2(x) fLoadFarStringSmall2(__G__ (x)) # if (defined(_MSC_VER) && (_MSC_VER >= 600)) # define zfstrcpy(dest, src) _fstrcpy((dest), (src)) # define zfstrcmp(s1, s2) _fstrcmp((s1), (s2)) # endif # if !(defined(SFX) || defined(FUNZIP)) # if (defined(_MSC_VER)) # define zfmalloc(sz) _fmalloc((sz)) # define zffree(x) _ffree(x) # endif # if (defined(__TURBOC__)) # include # define zfmalloc(sz) farmalloc((unsigned long)(sz)) # define zffree(x) farfree(x) # endif # endif /* !(SFX || FUNZIP) */ # ifndef Far # define Far far /* __far only works for MSC 6.00, not 6.0a or Borland */ # endif # define OUTBUFSIZ INBUFSIZ # if (lenEOL == 1) # define RAWBUFSIZ (OUTBUFSIZ>>1) # else # define RAWBUFSIZ ((OUTBUFSIZ>>1) - (OUTBUFSIZ>>7)) # endif # define TRANSBUFSIZ (OUTBUFSIZ-RAWBUFSIZ) typedef short shrint; /* short/int or "shrink int" (unshrink) */ #else # define zfstrcpy(dest, src) strcpy((dest), (src)) # define zfstrcmp(s1, s2) strcmp((s1), (s2)) # define zfmalloc malloc # define zffree(x) free(x) # ifdef QDOS # define LoadFarString(x) Qstrfix(x) /* fix up _ for '.' */ # define LoadFarStringSmall(x) Qstrfix(x) # define LoadFarStringSmall2(x) Qstrfix(x) # else # define LoadFarString(x) (char *)(x) # define LoadFarStringSmall(x) (char *)(x) # define LoadFarStringSmall2(x) (char *)(x) # endif # ifdef MED_MEM # define OUTBUFSIZ 0xFF80 /* can't malloc arrays of 0xFFE8 or more */ # define TRANSBUFSIZ 0xFF80 typedef short shrint; # else # define OUTBUFSIZ (lenEOL*WSIZE) /* more efficient text conversion */ # define TRANSBUFSIZ (lenEOL*OUTBUFSIZ) # ifdef AMIGA typedef short shrint; # else typedef int shrint; /* for efficiency/speed, we hope... */ # endif # endif /* ?MED_MEM */ # define RAWBUFSIZ OUTBUFSIZ #endif /* ?SMALL_MEM */ #ifndef Far # define Far #endif #ifndef Cdecl # define Cdecl #endif #ifndef MAIN # define MAIN main #endif #ifdef SFX /* disable some unused features for SFX executables */ # ifndef NO_ZIPINFO # define NO_ZIPINFO # endif # ifdef TIMESTAMP # undef TIMESTAMP # endif #endif #ifdef SFX # ifdef CHEAP_SFX_AUTORUN # ifndef NO_SFX_EXDIR # define NO_SFX_EXDIR # endif # endif # ifndef NO_SFX_EXDIR # ifndef SFX_EXDIR # define SFX_EXDIR # endif # else # ifdef SFX_EXDIR # undef SFX_EXDIR # endif # endif #endif /* user may have defined both by accident... NOTIMESTAMP takes precedence */ #if (defined(TIMESTAMP) && defined(NOTIMESTAMP)) # undef TIMESTAMP #endif #if (!defined(COPYRIGHT_CLEAN) && !defined(USE_SMITH_CODE)) # define COPYRIGHT_CLEAN #endif /* The LZW patent is expired worldwide since 2004-Jul-07, so USE_UNSHRINK * is now enabled by default. See unshrink.c. */ #if (!defined(LZW_CLEAN) && !defined(USE_UNSHRINK)) # define USE_UNSHRINK #endif #ifndef O_BINARY # define O_BINARY 0 #endif #ifndef PIPE_ERROR # ifndef EPIPE # define EPIPE -1 # endif # define PIPE_ERROR (errno == EPIPE) #endif /* File operations--use "b" for binary if allowed or fixed length 512 on VMS */ #ifdef VMS # define FOPR "r","ctx=stm" # define FOPM "r+","ctx=stm","rfm=fix","mrs=512" # define FOPW "w","ctx=stm","rfm=fix","mrs=512" # define FOPWR "w+","ctx=stm","rfm=fix","mrs=512" #endif /* VMS */ #ifdef CMS_MVS /* Binary files must be RECFM=F,LRECL=1 for ftell() to get correct pos */ /* ...unless byteseek is used. Let's try that for a while. */ # define FOPR "rb,byteseek" # define FOPM "r+b,byteseek" # ifdef MVS # define FOPW "wb,recfm=u,lrecl=32760,byteseek" /* New binary files */ # define FOPWE "wb" /* Existing binary files */ # define FOPWT "w,lrecl=133" /* New text files */ # define FOPWTE "w" /* Existing text files */ # else # define FOPW "wb,recfm=v,lrecl=32760" # define FOPWT "w" # endif #endif /* CMS_MVS */ #ifdef TOPS20 /* TOPS-20 MODERN? You kiddi?.0 UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1mDng? */ # define FOPW "w8" #endif /* TOPS20 */ /* Defaults when nothing special has been defined previously. */ #ifdef MODERN # ifndef FOPR # define FOPR "rb" # endif # ifndef FOPM # define FOPM "r+b" # endif # ifndef FOPW # define FOPW "wb" # endif # ifndef FOPWT # define FOPWT "wt" # endif # ifndef FOPWR # define FOPWR "w+b" # endif #else /* !MODERN */ # ifndef FOPR # define FOPR "r" # endif # ifndef FOPM # define FOPM "r+" # endif # ifndef FOPW # define FOPW "w" # endif # ifndef FOPWT # define FOPWT "w" # endif # ifndef FOPWR # define FOPWR "w+" # endif #endif /* ?MODERN */ /* * If exists on most systems, should include that, since it may * define some or all of the following: NAME_MAX, PATH_MAX, _POSIX_NAME_MAX, * _POSIX_PATH_MAX. */ #ifdef DOS_FLX_NLM_OS2_W32 # include #endif /* 2008-07-22 SMS. * Unfortunately, on VMS, exists, and is included by * (so it's pretty much unavoidable), and it defines PATH_MAX to a fixed * short value (256, correct only for older systems without ODS-5 support), * rather than one based on the real RMS NAM[L] situation. So, we * artificially undefine it here, to allow our better-defined _MAX_PATH * (see vms/vmscfg.h) to be used. */ #ifdef VMS # undef PATH_MAX #endif #ifndef PATH_MAX # ifdef MAXPATHLEN # define PATH_MAX MAXPATHLEN /* in on some systems */ # else # ifdef _MAX_PATH # define PATH_MAX _MAX_PATH # else # if FILENAME_MAX > 255 # define PATH_MAX FILENAME_MAX /* used like PATH_MAX on some systems */ # else # define PATH_MAX 1024 # endif # endif /* ?_MAX_PATH */ # endif /* ?MAXPATHLEN */ #endif /* !PATH_MAX */ /* * buffer size required to hold the longest legal local filepath * (including the trailing '\0') */ #define FILNAMSIZ PATH_MAX #ifdef UNICODE_SUPPORT # if !(defined(UTF8_MAYBE_NATIVE) || defined(UNICODE_WCHAR)) # undef UNICODE_SUPPORT # endif #endif /* 2007-09-18 SMS. * Include here if it will be needed later for Unicode. * Otherwise, SETLOCALE may be defined here, and then defined again * (differently) when is read later. */ #ifdef UNICODE_SUPPORT # ifdef UNICODE_WCHAR # if !(defined(_WIN32_WCE) || defined(POCKET_UNZIP)) # include # endif # endif # ifndef _MBCS /* no need to include twice, see below */ # include # ifndef SETLOCALE # define SETLOCALE(category, locale) setlocale(category, locale) # endif # endif #endif /* UNICODE_SUPPORT */ /* DBCS support for Info-ZIP (mainly for japanese (-: ) * by Yoshioka Tsuneo (QWF00133@nifty.ne.jp,tsuneo-y@is.aist-nara.ac.jp) */ #ifdef _MBCS # include /* Multi Byte Character Set */ # define ___MBS_TMP_DEF char *___tmp_ptr; # define ___TMP_PTR ___tmp_ptr # ifndef CLEN # define NEED_UZMBCLEN # define CLEN(ptr) (int)uzmbclen((ZCONST unsigned char *)(ptr)) # endif # ifndef PREINCSTR # define PREINCSTR(ptr) (ptr += CLEN(ptr)) # endif # define POSTINCSTR(ptr) (___TMP_PTR=(char *)(ptr), PREINCSTR(ptr),___TMP_PTR) char *plastchar OF((ZCONST char *ptr, extent len)); # define lastchar(ptr, len) ((int)(unsigned)*plastchar(ptr, len)) # ifndef MBSCHR # define NEED_UZMBSCHR # define MBSCHR(str,c) (char *)uzmbschr((ZCONST unsigned char *)(str), c) # endif # ifndef MBSRCHR # define NEED_UZMBSRCHR # define MBSRCHR(str,c) (char *)uzmbsrchr((ZCONST unsigned char *)(str), c) # endif # ifndef SETLOCALE # define SETLOCALE(category, locale) setlocale(category, locale) # endif #else /* !_MBCS */ # define ___MBS_TMP_DEF # define ___TMP_PTR # define CLEN(ptr) 1 # define PREINCSTR(ptr) (++(ptr)) # define POSTINCSTR(ptr) ((ptr)++) # define plastchar(ptr, len) (&ptr[(len)-1]) # define lastchar(ptr, len) (ptr[(len)-1]) # define MBSCHR(str, c) strchr(str, c) # define MBSRCHR(str, c) strrchr(str, c) # ifndef SETLOCALE # define SETLOCALE(category, locale) # endif #endif /* ?_MBCS */ #define INCSTR(ptr) PREINCSTR(ptr) #if (defined(MALLOC_WORK) && !defined(MY_ZCALLOC)) /* Any system without a special calloc function */ # ifndef zcalloc # define zcalloc(items, size) \ (zvoid far *)calloc((unsigned)(items), (unsigned)(size)) # endif # ifndef zcfree # define zcfree free # endif #endif /* MALLOC_WORK && !MY_ZCALLOC */ #if (defined(CRAY) && defined(ZMEM)) # undef ZMEM #endif #ifdef ZMEM # undef ZMEM # define memcmp(b1,b2,len) bcmp(b2,b1,len) # define memcpy(dest,src,len) bcopy(src,dest,len) # define memzero bzero #else # define memzero(dest,len) memset(dest,0,len) #endif #ifndef TRUE # define TRUE 1 /* sort of obvious */ #endif #ifndef FALSE # define FALSE 0 #endif #ifndef SEEK_SET # define SEEK_SET 0 # define SEEK_CUR 1 # define SEEK_END 2 #endif #if (!defined(S_IEXEC) && defined(S_IXUSR)) # define S_IEXEC S_IXUSR #endif #if (defined(UNIX) && defined(S_IFLNK) && !defined(MTS)) # define SYMLINKS # ifndef S_ISLNK # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) # endif #endif /* UNIX && S_IFLNK && !MTS */ #ifndef S_ISDIR # ifdef CMS_MVS # define S_ISDIR(m) (FALSE) # else # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) # endif #endif #ifndef IS_VOLID # define IS_VOLID(m) ((m) & 0x08) #endif /***********************************/ /* LARGE_FILE_SUPPORT */ /***********************************/ /* This whole section lifted from Zip 3b tailor.h * Types are in OS dependent headers (eg, w32cfg.h) * * LARGE_FILE_SUPPORT and ZIP64_SUPPORT are automatically * set in OS dependent headers (for some ports) based on the port and compiler. * * Function prototypes are below as OF is defined earlier in this file * but after OS dependent header is included. * * E. Gordon 9/21/2003 * Updated 1/28/2004 * Lifted and placed here 6/7/2004 - Myles Bennett */ #ifdef LARGE_FILE_SUPPORT /* 64-bit Large File Support */ /* ---------------------------- */ # if defined(UNIX) || defined(VMS) /* 64-bit stat functions */ # define zstat stat # define zfstat fstat /* 64-bit fseeko */ # define zlseek lseek # define zfseeko fseeko /* 64-bit ftello */ # define zftello ftello /* 64-bit fopen */ # define zfopen fopen # define zfdopen fdopen # endif /* UNIX || VMS */ /* ---------------------------- */ # ifdef WIN32 # if defined(_MSC_VER) || defined(__MINGW32__) || defined(__LCC__) /* MS C (VC), MinGW GCC port and LCC-32 use the MS C Runtime lib */ /* 64-bit stat functions */ # define zstat _stati64 # define zfstat _fstati64 /* 64-bit lseek */ # define zlseek _lseeki64 # if defined(_MSC_VER) && (_MSC_VER >= 1400) /* Beginning with VS 8.0 (Visual Studio 2005, MSC 14), the Microsoft C rtl publishes its (previously internal) implmentations of "fseeko" and "ftello" for 64-bit file offsets. */ /* 64-bit fseeko */ # define zfseeko _fseeki64 /* 64-bit ftello */ # define zftello _ftelli64 # else /* not (defined(_MSC_VER) && (_MSC_VER >= 1400)) */ # if defined(__MSVCRT_VERSION__) && (__MSVCRT_VERSION__ >= 0x800) /* Up-to-date versions of MinGW define the macro __MSVCRT_VERSION__ to denote the version of the MS C rtl dll used for linking. When configured to link against the runtime of MS Visual Studio 8 (or newer), the built-in 64-bit fseek/ftell functions are available. */ /* 64-bit fseeko */ # define zfseeko _fseeki64 /* 64-bit ftello */ # define zftello _ftel@: UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1 Sli64 # else /* !(defined(__MSVCRT_VERSION__) && (__MSVCRT_VERSION__>=0x800)) */ /* The version of the C runtime is lower than MSC 14 or unknown. */ /* The newest MinGW port contains built-in extensions to the MSC rtl that provide fseeko and ftello, but our implementations will do for now. */ /* 64-bit fseeko */ int zfseeko OF((FILE *, zoff_t, int)); /* 64-bit ftello */ zoff_t zftello OF((FILE *)); # endif /* ? (__MSVCRT_VERSION__ >= 0x800) */ # endif /* ? (_MSC_VER >= 1400) */ /* 64-bit fopen */ # define zfopen fopen # define zfdopen fdopen # endif /* _MSC_VER || __MINGW__ || __LCC__ */ # ifdef __CYGWIN__ /* CYGWIN GCC Posix emulator on Windows (configuration not yet finished/tested) */ /* 64-bit stat functions */ # define zstat _stati64 # define zfstat _fstati64 /* 64-bit lseek */ # define zlseek _lseeki64 /* 64-bit fseeko */ # define zfseeko fseeko /* 64-bit ftello */ # define zftello ftello /* 64-bit fopen */ # define zfopen fopen # define zfdopen fdopen # endif # if defined(__WATCOMC__) || defined(__BORLANDC__) /* WATCOM C and Borland C provide their own C runtime libraries, but they are sufficiently compatible with MS CRTL. */ /* 64-bit stat functions */ # define zstat _stati64 # define zfstat _fstati64 # ifdef __WATCOMC__ /* 64-bit lseek */ # define zlseek _lseeki64 # endif /* 64-bit fseeko */ int zfseeko OF((FILE *, zoff_t, int)); /* 64-bit ftello */ zoff_t zftello OF((FILE *)); /* 64-bit fopen */ # define zfopen fopen # define zfdopen fdopen # endif # ifdef __IBMC__ /* IBM C */ /* 64-bit stat functions */ /* 64-bit fseeko */ /* 64-bit ftello */ /* 64-bit fopen */ # endif # endif /* WIN32 */ #else /* No Large File Support */ # ifndef REGULUS /* returns the inode number on success(!)...argh argh argh */ # define zstat stat # endif # define zfstat fstat # define zlseek lseek # define zfseeko fseek # define zftello ftell # define zfopen fopen # define zfdopen fdopen # if defined(UNIX) || defined(VMS) || defined(WIN32) /* For these systems, implement "64bit file vs. 32bit prog" check */ # ifndef DO_SAFECHECK_2GB # define DO_SAFECHECK_2GB # endif # endif #endif /* No "64bit file vs. 32bit prog" check for SFX stub, to save space */ #if (defined(DO_SAFECHECK_2GB) && defined(SFX)) # undef DO_SAFECHECK_2GB #endif #ifndef SSTAT # ifdef WILD_STAT_BUG # define SSTAT(path,pbuf) (iswild(path) || zstat(path,pbuf)) # else # define SSTAT zstat # endif #endif /* Default fzofft() format selection. */ #ifndef FZOFFT_FMT # ifdef LARGE_FILE_SUPPORT # define FZOFFT_FMT "ll" # define FZOFFT_HEX_WID_VALUE "16" # else /* def LARGE_FILE_SUPPORT */ # define FZOFFT_FMT "l" # define FZOFFT_HEX_WID_VALUE "8" # endif /* def LARGE_FILE_SUPPORT */ #endif /* ndef FZOFFT_FMT */ #define FZOFFT_HEX_WID ((char *) -1) #define FZOFFT_HEX_DOT_WID ((char *) -2) #define FZOFFT_NUM 4 /* Number of chambers. */ #define FZOFFT_LEN 24 /* Number of characters/chamber. */ #ifdef SHORT_SYMS /* Mark Williams C, ...? */ # define extract_or_test_files xtr_or_tst_files # define extract_or_test_member xtr_or_tst_member #endif #ifdef REALLY_SHORT_SYMS /* TOPS-20 linker: first 6 chars */ # define process_cdir_file_hdr XXpcdfh # define process_local_file_hdr XXplfh # define extract_or_test_files XXxotf /* necessary? */ # define extract_or_test_member XXxotm /* necessary? */ # define check_for_newer XXcfn # define overwrite_all XXoa # define process_all_files XXpaf # define extra_field XXef # define explode_lit8 XXel8 # define explode_lit4 XXel4 # define explode_nolit8 XXnl8 # define explode_nolit4 XXnl4 # define cpdist8 XXcpdist8 # define inflate_codes XXic # define inflate_stored XXis # define inflate_fixed XXif # define inflate_dynamic XXid # define inflate_block XXib # define maxcodemax XXmax #endif #ifndef S_TIME_T_MAX /* max value of signed (>= 32-bit) time_t */ # define S_TIME_T_MAX ((time_t)(ulg)0x7fffffffL) #endif #ifndef U_TIME_T_MAX /* max value of unsigned (>= 32-bit) time_t */ # define U_TIME_T_MAX ((time_t)(ulg)0xffffffffL) #endif #ifdef DOSTIME_MINIMUM /* min DOSTIME value (1980-01-01) */ # undef DOSTIME_MINIMUM #endif #define DOSTIME_MINIMUM ((ulg)0x00210000L) #ifdef DOSTIME_2038_01_18 /* approximate DOSTIME equivalent of */ # undef DOSTIME_2038_01_18 /* the signed-32-bit time_t limit */ #endif #define DOSTIME_2038_01_18 ((ulg)0x74320000L) #ifdef QDOS # define ZSUFX "_zip" # define ALT_ZSUFX ".zip" #else # ifdef RISCOS # define ZSUFX "/zip" # else # define ZSUFX ".zip" # endif # define ALT_ZSUFX ".ZIP" /* Unix-only so far (only case-sensitive fs) */ #endif #define CENTRAL_HDR_SIG "\001\002" /* the infamous "PK" signature bytes, */ #define LOCAL_HDR_SIG "\003\004" /* w/o "PK" (so unzip executable not */ #define END_CENTRAL_SIG "\005\006" /* mistaken for zipfile itself) */ #define EXTD_LOCAL_SIG "\007\010" /* [ASCII "\113" == EBCDIC "\080" ??] */ /** internal-only return codes **/ #define IZ_DIR 76 /* potential zipfile is a directory */ /* special return codes for mapname() */ #define MPN_OK 0 /* mapname successful */ #define MPN_INF_TRUNC (1<<8) /* caution - filename truncated */ #define MPN_INF_SKIP (2<<8) /* info - skipped because nothing to do */ #define MPN_ERR_SKIP (3<<8) /* error - entry skipped */ #define MPN_ERR_TOOLONG (4<<8) /* error - path too long */ #define MPN_NOMEM (10<<8) /* error - out of memory, file skipped */ #define MPN_CREATED_DIR (16<<8) /* directory created: set time & permission */ #define MPN_VOL_LABEL (17<<8) /* volume label, but can't set on hard disk */ #define MPN_INVALID (99<<8) /* internal logic error, should never reach */ /* mask for internal mapname&checkdir return codes */ #define MPN_MASK 0x7F00 /* error code for extracting/testing extra field blocks */ #define IZ_EF_TRUNC 79 /* local extra field truncated (PKZIP'd) */ /* choice of activities for do_string() */ #define SKIP 0 /* skip header block */ #define DISPLAY 1 /* display archive comment (ASCII) */ #define DISPL_8 5 /* display file comment (ext. ASCII) */ #define DS_FN 2 /* read filename (ext. ASCII, chead) */ #define DS_FN_C 2 /* read filename from central header */ #define DS_FN_L 6 /* read filename from local header */ #define EXTRA_FIELD 3 /* copy extra field into buffer */ #define DS_EF 3 #ifdef AMIGA # define FILENOTE 4 /* convert file comment to filenote */ #endif #if (defined(SFX) && defined(CHEAP_SFX_AUTORUN)) # define CHECK_AUTORUN 7 /* copy command, display remainder */ # define CHECK_AUTORUN_Q 8 /* copy command, skip remainder */ #endif #define DOES_NOT_EXIST -1 /* return values for check_for_newer() */ #define EXISTS_AND_OLDER 0 #define EXISTS_AND_NEWER 1 #define OVERWRT_QUERY 0 /* status values for G.overwrite_modeAu UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1"b */ #define OVERWRT_ALWAYS 1 #define OVERWRT_NEVER 2 #define IS_OVERWRT_ALL (G.overwrite_mode == OVERWRT_ALWAYS) #define IS_OVERWRT_NONE (G.overwrite_mode == OVERWRT_NEVER) #ifdef VMS /* return codes for VMS-specific open_outfile() function */ # define OPENOUT_OK 0 /* file openend normally */ # define OPENOUT_FAILED 1 /* file open failed */ # define OPENOUT_SKIPOK 2 /* file not opened, skip at error level OK */ # define OPENOUT_SKIPWARN 3 /* file not opened, skip at error level WARN */ #endif /* VMS */ #define ROOT 0 /* checkdir() extract-to path: called once */ #define INIT 1 /* allocate buildpath: called once per member */ #define APPEND_DIR 2 /* append a dir comp.: many times per member */ #define APPEND_NAME 3 /* append actual filename: once per member */ #define GETPATH 4 /* retrieve the complete path and free it */ #define END 5 /* free root path prior to exiting program */ /* version_made_by codes (central dir): make sure these */ /* are not defined on their respective systems!! */ #define FS_FAT_ 0 /* filesystem used by MS-DOS, OS/2, Win32 */ #define AMIGA_ 1 #define VMS_ 2 #define UNIX_ 3 #define VM_CMS_ 4 #define ATARI_ 5 /* what if it's a minix filesystem? [cjh] */ #define FS_HPFS_ 6 /* filesystem used by OS/2 (and NT 3.x) */ #define MAC_ 7 /* HFS filesystem used by MacOS */ #define Z_SYSTEM_ 8 #define CPM_ 9 #define TOPS20_ 10 #define FS_NTFS_ 11 /* filesystem used by Windows NT */ #define QDOS_ 12 #define ACORN_ 13 /* Archimedes Acorn RISC OS */ #define FS_VFAT_ 14 /* filesystem used by Windows 95, NT */ #define MVS_ 15 #define BEOS_ 16 /* hybrid POSIX/database filesystem */ #define TANDEM_ 17 /* Tandem NSK */ #define THEOS_ 18 /* THEOS */ #define MAC_OSX_ 19 /* Mac OS/X (Darwin) */ #define ATHEOS_ 30 /* AtheOS */ #define NUM_HOSTS 31 /* index of last system + 1 */ /* don't forget to update zipinfo.c appropiately if NUM_HOSTS changes! */ #define STORED 0 /* compression methods */ #define SHRUNK 1 #define REDUCED1 2 #define REDUCED2 3 #define REDUCED3 4 #define REDUCED4 5 #define IMPLODED 6 #define TOKENIZED 7 #define DEFLATED 8 #define ENHDEFLATED 9 #define DCLIMPLODED 10 #define BZIPPED 12 #define LZMAED 14 #define IBMTERSED 18 #define IBMLZ77ED 19 #define WAVPACKED 97 #define PPMDED 98 #define NUM_METHODS 17 /* number of known method IDs */ /* don't forget to update list.c (list_files()), extract.c and zipinfo.c * appropriately if NUM_METHODS changes */ /* (the PK-class error codes are public and have been moved into unzip.h) */ #define DF_MDY 0 /* date format 10/26/91 (USA only) */ #define DF_DMY 1 /* date format 26/10/91 (most of the world) */ #define DF_YMD 2 /* date format 91/10/26 (a few countries) */ /*--------------------------------------------------------------------------- Extra-field block ID values and offset info. ---------------------------------------------------------------------------*/ /* extra-field ID values, all little-endian: */ #define EF_PKSZ64 0x0001 /* PKWARE's 64-bit filesize extensions */ #define EF_AV 0x0007 /* PKWARE's authenticity verification */ #define EF_EFS 0x0008 /* PKWARE's extended language encoding */ #define EF_OS2 0x0009 /* OS/2 extended attributes */ #define EF_PKW32 0x000a /* PKWARE's Win95/98/WinNT filetimes */ #define EF_PKVMS 0x000c /* PKWARE's VMS */ #define EF_PKUNIX 0x000d /* PKWARE's Unix */ #define EF_PKFORK 0x000e /* PKWARE's future stream/fork descriptors */ #define EF_PKPATCH 0x000f /* PKWARE's patch descriptor */ #define EF_PKPKCS7 0x0014 /* PKWARE's PKCS#7 store for X.509 Certs */ #define EF_PKFX509 0x0015 /* PKWARE's file X.509 Cert&Signature ID */ #define EF_PKCX509 0x0016 /* PKWARE's central dir X.509 Cert ID */ #define EF_PKENCRHD 0x0017 /* PKWARE's Strong Encryption header */ #define EF_PKRMCTL 0x0018 /* PKWARE's Record Management Controls*/ #define EF_PKLSTCS7 0x0019 /* PKWARE's PKCS#7 Encr. Recipient Cert List */ #define EF_PKIBM 0x0065 /* PKWARE's IBM S/390 & AS/400 attributes */ #define EF_PKIBM2 0x0066 /* PKWARE's IBM S/390 & AS/400 compr. attribs */ #define EF_IZVMS 0x4d49 /* Info-ZIP's VMS ("IM") */ #define EF_IZUNIX 0x5855 /* Info-ZIP's first Unix[1] ("UX") */ #define EF_IZUNIX2 0x7855 /* Info-ZIP's second Unix[2] ("Ux") */ #define EF_IZUNIX3 0x7875 /* Info-ZIP's newest Unix[3] ("ux") */ #define EF_TIME 0x5455 /* universal timestamp ("UT") */ #define EF_UNIPATH 0x7075 /* Info-ZIP Unicode Path ("up") */ #define EF_UNICOMNT 0x6375 /* Info-ZIP Unicode Comment ("uc") */ #define EF_MAC3 0x334d /* Info-ZIP's new Macintosh (= "M3") */ #define EF_JLMAC 0x07c8 /* Johnny Lee's old Macintosh (= 1992) */ #define EF_ZIPIT 0x2605 /* Thomas Brown's Macintosh (ZipIt) */ #define EF_ZIPIT2 0x2705 /* T. Brown's Mac (ZipIt) v 1.3.8 and newer ? */ #define EF_SMARTZIP 0x4d63 /* Mac SmartZip by Marco Bambini */ #define EF_VMCMS 0x4704 /* Info-ZIP's VM/CMS ("\004G") */ #define EF_MVS 0x470f /* Info-ZIP's MVS ("\017G") */ #define EF_ACL 0x4c41 /* (OS/2) access control list ("AL") */ #define EF_NTSD 0x4453 /* NT security descriptor ("SD") */ #define EF_ATHEOS 0x7441 /* AtheOS ("At") */ #define EF_BEOS 0x6542 /* BeOS ("Be") */ #define EF_QDOS 0xfb4a /* SMS/QDOS ("J\373") */ #define EF_AOSVS 0x5356 /* AOS/VS ("VS") */ #define EF_SPARK 0x4341 /* David Pilling's Acorn/SparkFS ("AC") */ #define EF_TANDEM 0x4154 /* Tandem NSK ("TA") */ #define EF_THEOS 0x6854 /* Jean-Michel Dubois' Theos "Th" */ #define EF_THEOSO 0x4854 /* old Theos port */ #define EF_MD5 0x4b46 /* Fred Kantor's MD5 ("FK") */ #define EF_ASIUNIX 0x756e /* ASi's Unix ("nu") */ #define EB_HEADSIZE 4 /* length of extra field block header */ #define EB_ID 0 /* offset of block ID in header */ #define EB_LEN 2 /* offset of data length field in header */ #define EB_UCSIZE_P 0 /* offset of ucsize field in compr. data */ #define EB_CMPRHEADLEN 6 /* lenght of compression header */ #define EB_UX_MINLEN 8 /* minimal "UX" field contains atime, mtime */ #define EB_UX_FULLSIZE 12 /* full "UX" field (atime, mtime, uid, gid) */ #define EB_UX_ATIME 0 /* offset of atime in "UX" extra field data */ #define EB_UX_MTIME 4 /* offset of mtime in "UX" extra field data */ #define EB_UX_UID 8 /* byte offset of UID in "UX" field data */ #define EB_UX_GID 10 /* byte offset of GID in "UX" field data */ #define EB_UX2_MINLEN 4 /* minimal "Ux" field contains UID/GID */ #define EB_UX2_UID 0 /* byte offset of UID in "Ux" field data */ #define EB_UX2_GID 2 /* byte offset of GID in "Ux" field data */ #define EB_UX2_VALID (1 << 8) /* UID/GID present */ #define EB_UX3_MINLEN 7 /* minimal "ux" field size (2-byte UID/GID) */ #define EB_UT_MINLEN 1 /* minimal UT field contains Flags byte */ #define EB_UT_FLAGS 0 /* byte offset of B* UNZIP.BCKt>[UNZIP60]UNZPRIV.H;11qFlags field */ #define EB_UT_TIME1 1 /* byte offset of 1st time value */ #define EB_UT_FL_MTIME (1 << 0) /* mtime present */ #define EB_UT_FL_ATIME (1 << 1) /* atime present */ #define EB_UT_FL_CTIME (1 << 2) /* ctime present */ #define EB_FLGS_OFFS 4 /* offset of flags area in generic compressed extra field blocks (BEOS, MAC, and others) */ #define EB_OS2_HLEN 4 /* size of OS2/ACL compressed data header */ #define EB_BEOS_HLEN 5 /* length of BeOS&AtheOS e.f attribute header */ #define EB_BE_FL_UNCMPR 0x01 /* "BeOS&AtheOS attribs uncompr." bit flag */ #define EB_MAC3_HLEN 14 /* length of Mac3 attribute block header */ #define EB_SMARTZIP_HLEN 64 /* fixed length of the SmartZip extra field */ #define EB_M3_FL_DATFRK 0x01 /* "this entry is data fork" flag */ #define EB_M3_FL_UNCMPR 0x04 /* "Mac3 attributes uncompressed" bit flag */ #define EB_M3_FL_TIME64 0x08 /* "Mac3 time fields are 64 bit wide" flag */ #define EB_M3_FL_NOUTC 0x10 /* "Mac3 timezone offset fields missing" flag */ #define EB_NTSD_C_LEN 4 /* length of central NT security data */ #define EB_NTSD_L_LEN 5 /* length of minimal local NT security data */ #define EB_NTSD_VERSION 4 /* offset of NTSD version byte */ #define EB_NTSD_MAX_VER (0) /* maximum version # we know how to handle */ #define EB_ASI_CRC32 0 /* offset of ASI Unix field's crc32 checksum */ #define EB_ASI_MODE 4 /* offset of ASI Unix permission mode field */ #define EB_IZVMS_HLEN 12 /* length of IZVMS attribute block header */ #define EB_IZVMS_FLGS 4 /* offset of compression type flag */ #define EB_IZVMS_UCSIZ 6 /* offset of ucsize field in IZVMS header */ #define EB_IZVMS_BCMASK 07 /* 3 bits for compression type */ #define EB_IZVMS_BCSTOR 0 /* Stored */ #define EB_IZVMS_BC00 1 /* 0byte -> 0bit compression */ #define EB_IZVMS_BCDEFL 2 /* Deflated */ /*--------------------------------------------------------------------------- True sizes of the various headers (excluding their 4-byte signatures), as defined by PKWARE--so it is not likely that these will ever change. But if they do, make sure both these defines AND the typedefs below get updated accordingly. 12/27/2006 The Zip64 End Of Central Directory record is variable size and now comes in two flavors, version 1 and the new version 2 that supports central directory encryption. We only use the old fields at the top of the Zip64 EOCDR, and this block is a fixed size still, but need to be aware of the stuff following. ---------------------------------------------------------------------------*/ #define LREC_SIZE 26 /* lengths of local file headers, central */ #define CREC_SIZE 42 /* directory headers, end-of-central-dir */ #define ECREC_SIZE 18 /* record, zip64 end-of-cent-dir locator */ #define ECLOC64_SIZE 16 /* and zip64 end-of-central-dir record, */ #define ECREC64_SIZE 52 /* respectively */ #define MAX_BITS 13 /* used in unshrink() */ #define HSIZE (1 << MAX_BITS) /* size of global work area */ #define LF 10 /* '\n' on ASCII machines; must be 10 due to EBCDIC */ #define CR 13 /* '\r' on ASCII machines; must be 13 due to EBCDIC */ #define CTRLZ 26 /* DOS & OS/2 EOF marker (used in fileio.c, vms.c) */ #ifdef EBCDIC # define foreign(c) ascii[(uch)(c)] # define native(c) ebcdic[(uch)(c)] # define NATIVE "EBCDIC" # define NOANSIFILT #endif #ifdef VMS # define ENV_UNZIP "UNZIP_OPTS" /* names of environment variables */ # define ENV_ZIPINFO "ZIPINFO_OPTS" #endif /* VMS */ #ifdef RISCOS # define ENV_UNZIP "Unzip$Options" # define ENV_ZIPINFO "Zipinfo$Options" # define ENV_UNZIPEXTS "Unzip$Exts" #endif /* RISCOS */ #ifndef ENV_UNZIP # define ENV_UNZIP "UNZIP" /* the standard names */ # define ENV_ZIPINFO "ZIPINFO" #endif #define ENV_UNZIP2 "UNZIPOPT" /* alternate names, for zip compat. */ #define ENV_ZIPINFO2 "ZIPINFOOPT" #if (!defined(QQ) && !defined(NOQQ)) # define QQ #endif #ifdef QQ /* Newtware version: no file */ # define QCOND (!uO.qflag) /* comments with -vq or -vqq */ #else /* Bill Davidsen version: no way to */ # define QCOND (longhdr) /* kill file comments when listing */ #endif #ifdef OLD_QQ # define QCOND2 (uO.qflag < 2) #else # define QCOND2 (!uO.qflag) #endif #ifdef WILD_STOP_AT_DIR # define __WDLPRO , int sepc # define __WDL , sepc # define __WDLDEF int sepc; # define WISEP , (uO.W_flag ? '/' : '\0') #else # define __WDLPRO # define __WDL # define __WDLDEF # define WISEP #endif /**************/ /* Typedefs */ /**************/ #ifdef ZIP64_SUPPORT # ifndef Z_UINT8_DEFINED # if (defined(__GNUC__) || defined(__hpux) || defined(__SUNPRO_C)) typedef unsigned long long z_uint8; # else typedef unsigned __int64 z_uint8; # endif # define Z_UINT8_DEFINED # endif #endif #ifndef Z_UINT4_DEFINED # if (defined(MODERN) && !defined(NO_LIMITS_H)) # if (defined(UINT_MAX) && (UINT_MAX == 0xffffffffUL)) typedef unsigned int z_uint4; # define Z_UINT4_DEFINED # else # if (defined(ULONG_MAX) && (ULONG_MAX == 0xffffffffUL)) typedef unsigned long z_uint4; # define Z_UINT4_DEFINED # else # if (defined(USHRT_MAX) && (USHRT_MAX == 0xffffffffUL)) typedef unsigned short z_uint4; # define Z_UINT4_DEFINED # endif # endif # endif # endif /* MODERN && !NO_LIMITS_H */ #endif /* !Z_UINT4_DEFINED */ #ifndef Z_UINT4_DEFINED typedef ulg z_uint4; # define Z_UINT4_DEFINED #endif /* The following three user-defined unsigned integer types are used for holding zipfile entities (required widths without / with Zip64 support): a) sizes and offset of zipfile entries (4 bytes / 8 bytes) b) enumeration and counts of zipfile entries (2 bytes / 8 bytes) Remark: internally, we use 4 bytes for archive member counting in the No-Zip64 case, because UnZip supports more than 64k entries for classic Zip archives without Zip64 extensions. c) enumeration and counts of zipfile volumes of multivolume archives (2 bytes / 4 bytes) */ #ifdef ZIP64_SUPPORT typedef z_uint8 zusz_t; /* zipentry sizes & offsets */ typedef z_uint8 zucn_t; /* archive entry counts */ typedef z_uint4 zuvl_t; /* multivolume numbers */ # define MASK_ZUCN64 (~(zucn_t)0) /* In case we ever get to support an environment where z_uint8 may be WIDER than 64 bit wide, we will have to apply a construct similar to #define MASK_ZUCN64 (~(zucn_t)0 & (zucn_t)0xffffffffffffffffULL) for the 64-bit mask. */ #else typedef ulg zusz_t; /* zipentry sizes & offsets */ typedef unsigned int zucn_t; /* archive entry counts */ typedef unsigned short zuvl_t; /* multivolume numbers */ # define MASK_ZUCN64 (~(zucn_t)0) #endif #define MASK_ZUCN16 ((zucn_t)0xFFFF) #ifdef NO_UID_GID # ifdef UID_USHORT typedef unsigned short uid_t; /* TI SysV.3 */ typedef unsigned short gid_t; # else typedef unsigned int uid_t; /* SCO Xenix */ typedef unsigned int gid_t; # endif #endif #if (defined(GOT_UTIMBUF) || defined(sgi) || defined(ATARI)) typedef struct utimbuf ztimbuf; #else typedef struCn" UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1ct ztimbuf { time_t actime; /* new access time */ time_t modtime; /* new modification time */ } ztimbuf; #endif typedef struct iztimes { time_t atime; /* new access time */ time_t mtime; /* new modification time */ time_t ctime; /* used for creation time; NOT same as st_ctime */ } iztimes; #ifdef SET_DIR_ATTRIB typedef struct direntry { /* head of system-specific struct holding */ struct direntry *next; /* defered directory attributes info */ char *fn; /* filename of directory */ char buf[1]; /* start of system-specific internal data */ } direntry; #endif /* SET_DIR_ATTRIB */ #ifdef SYMLINKS typedef struct slinkentry { /* info for deferred symlink creation */ struct slinkentry *next; /* pointer to next entry in chain */ extent targetlen; /* length of target filespec */ extent attriblen; /* length of system-specific attrib data */ char *target; /* pointer to target filespec */ char *fname; /* pointer to name of link */ char buf[1]; /* data/name/link buffer */ } slinkentry; #endif /* SYMLINKS */ typedef struct min_info { zoff_t offset; zusz_t compr_size; /* compressed size (needed if extended header) */ zusz_t uncompr_size; /* uncompressed size (needed if extended header) */ ulg crc; /* crc (needed if extended header) */ zuvl_t diskstart; /* no of volume where this entry starts */ uch hostver; uch hostnum; unsigned file_attr; /* local flavor, as used by creat(), chmod()... */ unsigned encrypted : 1; /* file encrypted: decrypt before uncompressing */ unsigned ExtLocHdr : 1; /* use time instead of CRC for decrypt check */ unsigned textfile : 1; /* file is text (according to zip) */ unsigned textmode : 1; /* file is to be extracted as text */ unsigned lcflag : 1; /* convert filename to lowercase */ unsigned vollabel : 1; /* "file" is an MS-DOS volume (disk) label */ #ifdef SYMLINKS unsigned symlink : 1; /* file is a symbolic link */ #endif unsigned HasUxAtt : 1; /* crec ext_file_attr has Unix style mode bits */ #ifdef UNICODE_SUPPORT unsigned GPFIsUTF8: 1; /* crec gen_purpose_flag UTF-8 bit 11 is set */ #endif #ifndef SFX char Far *cfilname; /* central header version of filename */ #endif } min_info; typedef struct VMStimbuf { char *revdate; /* (both roughly correspond to Unix modtime/st_mtime) */ char *credate; } VMStimbuf; /*--------------------------------------------------------------------------- Zipfile work area declarations. ---------------------------------------------------------------------------*/ #ifdef MALLOC_WORK union work { struct { /* unshrink(): */ shrint *Parent; /* pointer to (8192 * sizeof(shrint)) */ uch *value; /* pointer to 8KB char buffer */ uch *Stack; /* pointer to another 8KB char buffer */ } shrink; uch *Slide; /* explode(), inflate(), unreduce() */ }; #else /* !MALLOC_WORK */ union work { struct { /* unshrink(): */ shrint Parent[HSIZE]; /* (8192 * sizeof(shrint)) == 16KB minimum */ uch value[HSIZE]; /* 8KB */ uch Stack[HSIZE]; /* 8KB */ } shrink; /* total = 32KB minimum; 80KB on Cray/Alpha */ uch Slide[WSIZE]; /* explode(), inflate(), unreduce() */ }; #endif /* ?MALLOC_WORK */ #define slide G.area.Slide #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) # define redirSlide G.redirect_sldptr #else # define redirSlide G.area.Slide #endif /*--------------------------------------------------------------------------- Zipfile layout declarations. If these headers ever change, make sure the xxREC_SIZE defines (above) change with them! ---------------------------------------------------------------------------*/ typedef uch local_byte_hdr[ LREC_SIZE ]; # define L_VERSION_NEEDED_TO_EXTRACT_0 0 # define L_VERSION_NEEDED_TO_EXTRACT_1 1 # define L_GENERAL_PURPOSE_BIT_FLAG 2 # define L_COMPRESSION_METHOD 4 # define L_LAST_MOD_DOS_DATETIME 6 # define L_CRC32 10 # define L_COMPRESSED_SIZE 14 # define L_UNCOMPRESSED_SIZE 18 # define L_FILENAME_LENGTH 22 # define L_EXTRA_FIELD_LENGTH 24 typedef uch cdir_byte_hdr[ CREC_SIZE ]; # define C_VERSION_MADE_BY_0 0 # define C_VERSION_MADE_BY_1 1 # define C_VERSION_NEEDED_TO_EXTRACT_0 2 # define C_VERSION_NEEDED_TO_EXTRACT_1 3 # define C_GENERAL_PURPOSE_BIT_FLAG 4 # define C_COMPRESSION_METHOD 6 # define C_LAST_MOD_DOS_DATETIME 8 # define C_CRC32 12 # define C_COMPRESSED_SIZE 16 # define C_UNCOMPRESSED_SIZE 20 # define C_FILENAME_LENGTH 24 # define C_EXTRA_FIELD_LENGTH 26 # define C_FILE_COMMENT_LENGTH 28 # define C_DISK_NUMBER_START 30 # define C_INTERNAL_FILE_ATTRIBUTES 32 # define C_EXTERNAL_FILE_ATTRIBUTES 34 # define C_RELATIVE_OFFSET_LOCAL_HEADER 38 typedef uch ec_byte_rec[ ECREC_SIZE+4 ]; /* define SIGNATURE 0 space-holder only */ # define NUMBER_THIS_DISK 4 # define NUM_DISK_WITH_START_CEN_DIR 6 # define NUM_ENTRIES_CEN_DIR_THS_DISK 8 # define TOTAL_ENTRIES_CENTRAL_DIR 10 # define SIZE_CENTRAL_DIRECTORY 12 # define OFFSET_START_CENTRAL_DIRECTORY 16 # define ZIPFILE_COMMENT_LENGTH 20 typedef uch ec_byte_loc64[ ECLOC64_SIZE+4 ]; # define NUM_DISK_START_EOCDR64 4 # define OFFSET_START_EOCDR64 8 # define NUM_THIS_DISK_LOC64 16 typedef uch ec_byte_rec64[ ECREC64_SIZE+4 ]; # define ECREC64_LENGTH 4 # define EC_VERSION_MADE_BY_0 12 # define EC_VERSION_NEEDED_0 14 # define NUMBER_THIS_DSK_REC64 16 # define NUM_DISK_START_CEN_DIR64 20 # define NUM_ENTRIES_CEN_DIR_THS_DISK64 24 # define TOTAL_ENTRIES_CENTRAL_DIR64 32 # define SIZE_CENTRAL_DIRECTORY64 40 # define OFFSET_START_CENTRAL_DIRECT64 48 /* The following structs are used to hold all header data of a zip entry. Traditionally, the structs' layouts followed the data layout of the corresponding zipfile header structures. However, the zipfile header layouts were designed in the old ages of 16-bit CPUs, they are subject to structure padding and/or alignment issues on newer systems with a "natural word width" of more than 2 bytes. Please note that the structure members are now reordered by size (top-down), to prevent internal padding and optimize memory usage! */ typedef struct local_file_header { /* LOCAL */ zusz_t csize; zusz_t ucsize; ulg last_mod_dos_datetime; ulg crc32; uch version_needed_to_extract[2]; ush general_purpose_bit_flag; ush compression_method; ush filename_length; ush extra_field_length; } local_file_hdr; typedef struct central_dirDqZ UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1ectory_file_header { /* CENTRAL */ zusz_t csize; zusz_t ucsize; zusz_t relative_offset_local_header; ulg last_mod_dos_datetime; ulg crc32; ulg external_file_attributes; zuvl_t disk_number_start; ush internal_file_attributes; uch version_made_by[2]; uch version_needed_to_extract[2]; ush general_purpose_bit_flag; ush compression_method; ush filename_length; ush extra_field_length; ush file_comment_length; } cdir_file_hdr; typedef struct end_central_dir_record { /* END CENTRAL */ zusz_t size_central_directory; zusz_t offset_start_central_directory; zucn_t num_entries_centrl_dir_ths_disk; zucn_t total_entries_central_dir; zuvl_t number_this_disk; zuvl_t num_disk_start_cdir; int have_ecr64; /* valid Zip64 ecdir-record exists */ int is_zip64_archive; /* Zip64 ecdir-record is mandatory */ ush zipfile_comment_length; } ecdir_rec; /* Huffman code lookup table entry--this entry is four bytes for machines that have 16-bit pointers (e.g. PC's in the small or medium model). Valid extra bits are 0..16. e == 31 is EOB (end of block), e == 32 means that v is a literal, 32 < e < 64 means that v is a pointer to the next table, which codes (e & 31) bits, and lastly e == 99 indicates an unused code. If a code with e == 99 is looked up, this implies an error in the data. */ struct huft { uch e; /* number of extra bits or operation */ uch b; /* number of bits in this code or subcode */ union { ush n; /* literal, length base, or distance base */ struct huft *t; /* pointer to next level of table */ } v; }; typedef struct _APIDocStruct { char *compare; char *function; char *syntax; char *purpose; } APIDocStruct; /*************/ /* Globals */ /*************/ #if (defined(OS2) && !defined(FUNZIP)) # include "os2/os2data.h" #endif #include "globals.h" /*************************/ /* Function Prototypes */ /*************************/ /*--------------------------------------------------------------------------- Functions in unzip.c (initialization routines): ---------------------------------------------------------------------------*/ #ifndef WINDLL int MAIN OF((int argc, char **argv)); int unzip OF((__GPRO__ int argc, char **argv)); int uz_opts OF((__GPRO__ int *pargc, char ***pargv)); int usage OF((__GPRO__ int error)); #endif /* !WINDLL */ /*--------------------------------------------------------------------------- Functions in process.c (main driver routines): ---------------------------------------------------------------------------*/ int process_zipfiles OF((__GPRO)); void free_G_buffers OF((__GPRO)); /* static int do_seekable OF((__GPRO__ int lastchance)); */ /* static int find_ecrec OF((__GPRO__ long searchlen)); */ /* static int process_central_comment OF((__GPRO)); */ int process_cdir_file_hdr OF((__GPRO)); int process_local_file_hdr OF((__GPRO)); int getZip64Data OF((__GPRO__ ZCONST uch *ef_buf, unsigned ef_len)); #ifdef UNICODE_SUPPORT int getUnicodeData OF((__GPRO__ ZCONST uch *ef_buf, unsigned ef_len)); #endif unsigned ef_scan_for_izux OF((ZCONST uch *ef_buf, unsigned ef_len, int ef_is_c, ulg dos_mdatetime, iztimes *z_utim, ulg *z_uidgid)); #if (defined(RISCOS) || defined(ACORN_FTYPE_NFS)) zvoid *getRISCOSexfield OF((ZCONST uch *ef_buf, unsigned ef_len)); #endif #ifndef SFX /*--------------------------------------------------------------------------- Functions in zipinfo.c (`zipinfo-style' listing routines): ---------------------------------------------------------------------------*/ #ifndef NO_ZIPINFO #ifndef WINDLL int zi_opts OF((__GPRO__ int *pargc, char ***pargv)); #endif void zi_end_central OF((__GPRO)); int zipinfo OF((__GPRO)); /* static int zi_long OF((__GPRO__ zusz_t *pEndprev)); */ /* static int zi_short OF((__GPRO)); */ /* static char *zi_time OF((__GPRO__ ZCONST ulg *datetimez, ZCONST time_t *modtimez, char *d_t_str));*/ #endif /* !NO_ZIPINFO */ /*--------------------------------------------------------------------------- Functions in list.c (generic zipfile-listing routines): ---------------------------------------------------------------------------*/ int list_files OF((__GPRO)); #ifdef TIMESTAMP int get_time_stamp OF((__GPRO__ time_t *last_modtime, ulg *nmember)); #endif int ratio OF((zusz_t uc, zusz_t c)); void fnprint OF((__GPRO)); #endif /* !SFX */ /*--------------------------------------------------------------------------- Functions in fileio.c: ---------------------------------------------------------------------------*/ int open_input_file OF((__GPRO)); int open_outfile OF((__GPRO)); /* also vms.c */ void undefer_input OF((__GPRO)); void defer_leftover_input OF((__GPRO)); unsigned readbuf OF((__GPRO__ char *buf, register unsigned len)); int readbyte OF((__GPRO)); int fillinbuf OF((__GPRO)); int seek_zipf OF((__GPRO__ zoff_t abs_offset)); #ifdef FUNZIP int flush OF((__GPRO__ ulg size)); /* actually funzip.c */ #else int flush OF((__GPRO__ uch *buf, ulg size, int unshrink)); #endif /* static int disk_error OF((__GPRO)); */ void handler OF((int signal)); time_t dos_to_unix_time OF((ulg dos_datetime)); int check_for_newer OF((__GPRO__ char *filename)); /* os2,vmcms,vms */ int do_string OF((__GPRO__ unsigned int length, int option)); ush makeword OF((ZCONST uch *b)); ulg makelong OF((ZCONST uch *sig)); zusz_t makeint64 OF((ZCONST uch *sig)); char *fzofft OF((__GPRO__ zoff_t val, ZCONST char *pre, ZCONST char *post)); #if (!defined(STR_TO_ISO) || defined(NEED_STR2ISO)) char *str2iso OF((char *dst, ZCONST char *src)); #endif #if (!defined(STR_TO_OEM) || defined(NEED_STR2OEM)) char *str2oem OF((char *dst, ZCONST char *src)); #endif #ifdef NO_STRNICMP int zstrnicmp OF((register ZCONST char *s1, register ZCONST char *s2, register unsigned n)); #endif #ifdef REGULUS int zstat OF((ZCONST char *p, struct stat *s)); #endif #ifdef ZMEM /* MUST be ifdef'd because of conflicts with the standard def. */ zvoid *memset OF((register zvoid *, register int, register unsigned int)); int memcmp OF((register ZCONST zvoid*, register ZCONST zvoid *, register unsigned int)); zvoid *memcpy OF((register zvoid *, register ZCONST zvoid *, register unsigned int)); #endif #ifdef NEED_UZMBCLEN extent uzmbclen OF((ZCONST unsigned char *ptr)); #endif #ifdef NEED_UZMBSCHR unsigned char *uzmbschr OF((ZCOEp; UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1P_NST unsigned char *str, unsigned int c)); #endif #ifdef NEED_UZMBSRCHR unsigned char *uzmbsrchr OF((ZCONST unsigned char *str, unsigned int c)); #endif #ifdef SMALL_MEM char *fLoadFarString OF((__GPRO__ const char Far *sz)); char *fLoadFarStringSmall OF((__GPRO__ const char Far *sz)); char *fLoadFarStringSmall2 OF((__GPRO__ const char Far *sz)); #ifndef zfstrcpy char Far * Far zfstrcpy OF((char Far *s1, const char Far *s2)); #endif #if (!defined(SFX) && !defined(zfstrcmp)) int Far zfstrcmp OF((const char Far *s1, const char Far *s2)); #endif #endif /*--------------------------------------------------------------------------- Functions in extract.c: ---------------------------------------------------------------------------*/ int extract_or_test_files OF((__GPRO)); /* static int store_info OF((void)); */ /* static int extract_or_test_member OF((__GPRO)); */ /* static int TestExtraField OF((__GPRO__ uch *ef, unsigned ef_len)); */ /* static int test_OS2 OF((__GPRO__ uch *eb, unsigned eb_size)); */ /* static int test_NT OF((__GPRO__ uch *eb, unsigned eb_size)); */ #ifndef SFX unsigned find_compr_idx OF((unsigned compr_methodnum)); #endif int memextract OF((__GPRO__ uch *tgt, ulg tgtsize, ZCONST uch *src, ulg srcsize)); int memflush OF((__GPRO__ ZCONST uch *rawbuf, ulg size)); #if (defined(VMS) || defined(VMS_TEXT_CONV)) uch *extract_izvms_block OF((__GPRO__ ZCONST uch *ebdata, unsigned size, unsigned *retlen, ZCONST uch *init, unsigned needlen)); #endif char *fnfilter OF((ZCONST char *raw, uch *space, extent size)); /*--------------------------------------------------------------------------- Decompression functions: ---------------------------------------------------------------------------*/ #if (!defined(SFX) && !defined(FUNZIP)) int explode OF((__GPRO)); /* explode.c */ #endif int huft_free OF((struct huft *t)); /* inflate.c */ int huft_build OF((__GPRO__ ZCONST unsigned *b, unsigned n, unsigned s, ZCONST ush *d, ZCONST uch *e, struct huft **t, unsigned *m)); #ifdef USE_ZLIB int UZinflate OF((__GPRO__ int is_defl64)); /* inflate.c */ # define inflate_free(x) inflateEnd(&((Uz_Globs *)(&G))->dstrm) #else int inflate OF((__GPRO__ int is_defl64)); /* inflate.c */ int inflate_free OF((__GPRO)); /* inflate.c */ #endif /* ?USE_ZLIB */ #if (!defined(SFX) && !defined(FUNZIP)) #ifndef COPYRIGHT_CLEAN int unreduce OF((__GPRO)); /* unreduce.c */ /* static void LoadFollowers OF((__GPRO__ f_array *follower, uch *Slen)); * unreduce.c */ #endif /* !COPYRIGHT_CLEAN */ #ifndef LZW_CLEAN int unshrink OF((__GPRO)); /* unshrink.c */ /* static void partial_clear OF((__GPRO)); * unshrink.c */ #endif /* !LZW_CLEAN */ #endif /* !SFX && !FUNZIP */ #ifdef USE_BZIP2 int UZbunzip2 OF((__GPRO)); /* extract.c */ void bz_internal_error OF((int bzerrcode)); /* ubz2err.c */ #endif /*--------------------------------------------------------------------------- Internal API functions (only included in DLL versions): ---------------------------------------------------------------------------*/ #ifdef DLL void setFileNotFound OF((__GPRO)); /* api.c */ int unzipToMemory OF((__GPRO__ char *zip, char *file, UzpBuffer *retstr)); /* api.c */ int redirect_outfile OF((__GPRO)); /* api.c */ int writeToMemory OF((__GPRO__ ZCONST uch *rawbuf, extent size)); /* api.c */ int close_redirect OF((__GPRO)); /* api.c */ /* this obsolescent entry point kept for compatibility: */ int UzpUnzip OF((int argc, char **argv));/* use UzpMain */ #ifdef OS2DLL int varmessage OF((__GPRO__ ZCONST uch *buf, ulg size)); int varputchar OF((__GPRO__ int c)); /* rexxapi.c */ int finish_REXX_redirect OF((__GPRO)); /* rexxapi.c */ #endif #ifdef API_DOC void APIhelp OF((__GPRO__ int argc, char **argv)); #endif /* apihelp.c */ #endif /* DLL */ /*--------------------------------------------------------------------------- MSDOS-only functions: ---------------------------------------------------------------------------*/ #ifdef MSDOS #if (!defined(FUNZIP) && !defined(SFX) && !defined(WINDLL)) void check_for_windows OF((ZCONST char *app)); /* msdos.c */ #endif #if (defined(__GO32__) || defined(__EMX__)) unsigned _dos_getcountryinfo(void *); /* msdos.c */ #if (!defined(__DJGPP__) || (__DJGPP__ < 2)) unsigned _dos_setftime(int, unsigned, unsigned); /* msdos.c */ unsigned _dos_setfileattr(const char *, unsigned); /* msdos.c */ unsigned _dos_creat(const char *, unsigned, int *); /* msdos.c */ void _dos_getdrive(unsigned *); /* msdos.c */ unsigned _dos_close(int); /* msdos.c */ #endif /* !__DJGPP__ || (__DJGPP__ < 2) */ #endif /* __GO32__ || __EMX__ */ #endif /*--------------------------------------------------------------------------- OS/2-only functions: ---------------------------------------------------------------------------*/ #ifdef OS2 /* GetFileTime conflicts with something in Win32 header files */ #if (defined(REENTRANT) && defined(USETHREADID)) ulg GetThreadId OF((void)); #endif int GetCountryInfo OF((void)); /* os2.c */ long GetFileTime OF((ZCONST char *name)); /* os2.c */ /* static void SetPathAttrTimes OF((__GPRO__ int flags, int dir)); os2.c */ /* static int SetEAs OF((__GPRO__ const char *path, void *eablock)); os2.c */ /* static int SetACL OF((__GPRO__ const char *path, void *eablock)); os2.c */ /* static int IsFileNameValid OF((const char *name)); os2.c */ /* static void map2fat OF((char *pathcomp, char **pEndFAT)); os2.c */ /* static int SetLongNameEA OF((char *name, char *longname)); os2.c */ /* static void InitNLS OF((void)); os2.c */ int IsUpperNLS OF((int nChr)); /* os2.c */ int ToLowerNLS OF((int nChr)); /* os2.c */ void DebugMalloc OF((void)); /* os2.c */ #endif /*--------------------------------------------------------------------------- QDOS-only functions: ---------------------------------------------------------------------------*/ #ifdef QDOS int QMatch (uch, uch); void QFilename (__GPRO__ char *); F. UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1 char *Qstrfix (char *); int QReturn (int zip_error); #endif /*--------------------------------------------------------------------------- TOPS20-only functions: ---------------------------------------------------------------------------*/ #ifdef TOPS20 int upper OF((char *s)); /* tops20.c */ int enquote OF((char *s)); /* tops20.c */ int dequote OF((char *s)); /* tops20.c */ int fnlegal OF(()); /* error if prototyped? */ /* tops20.c */ #endif /*--------------------------------------------------------------------------- VM/CMS- and MVS-only functions: ---------------------------------------------------------------------------*/ #ifdef CMS_MVS extent getVMMVSexfield OF((char *type, uch *ef_block, unsigned datalen)); FILE *vmmvs_open_infile OF((__GPRO)); /* vmmvs.c */ void close_infile OF((__GPRO)); /* vmmvs.c */ #endif /*--------------------------------------------------------------------------- VMS-only functions: ---------------------------------------------------------------------------*/ #ifdef VMS int check_format OF((__GPRO)); /* vms.c */ /* int open_outfile OF((__GPRO)); * (see fileio.c) vms.c */ /* int flush OF((__GPRO__ uch *rawbuf, unsigned size, int final_flag)); * (see fileio.c) vms.c */ char *vms_msg_text OF((void)); /* vms.c */ #ifdef RETURN_CODES void return_VMS OF((__GPRO__ int zip_error)); /* vms.c */ #else void return_VMS OF((int zip_error)); /* vms.c */ #endif #ifdef VMSCLI ulg vms_unzip_cmdline OF((int *, char ***)); /* cmdline.c */ int VMSCLI_usage OF((__GPRO__ int error)); /* cmdline.c */ #endif #endif /*--------------------------------------------------------------------------- WIN32-only functions: ---------------------------------------------------------------------------*/ #ifdef WIN32 int IsWinNT OF((void)); /* win32.c */ #ifdef NTSD_EAS void process_defer_NT OF((__GPRO)); /* win32.c */ int test_NTSD OF((__GPRO__ uch *eb, unsigned eb_size, uch *eb_ucptr, ulg eb_ucsize)); /* win32.c */ # define TEST_NTSD test_NTSD #endif #ifdef W32_STAT_BANDAID int zstat_win32 OF((__W32STAT_GLOBALS__ const char *path, z_stat *buf)); /* win32.c */ #endif #endif /*--------------------------------------------------------------------------- Miscellaneous/shared functions: ---------------------------------------------------------------------------*/ Uz_Globs *globalsCtor OF((void)); /* globals.c */ int envargs OF((int *Pargc, char ***Pargv, ZCONST char *envstr, ZCONST char *envstr2)); /* envargs.c */ void mksargs OF((int *argcp, char ***argvp)); /* envargs.c */ int match OF((ZCONST char *s, ZCONST char *p, int ic __WDLPRO)); /* match.c */ int iswild OF((ZCONST char *p)); /* match.c */ /* declarations of public CRC-32 functions have been moved into crc32.h (free_crc_table(), get_crc_table(), crc32()) crc32.c */ int dateformat OF((void)); /* local */ char dateseparator OF((void)); /* local */ #ifndef WINDLL void version OF((__GPRO)); /* local */ #endif int mapattr OF((__GPRO)); /* local */ int mapname OF((__GPRO__ int renamed)); /* local */ int checkdir OF((__GPRO__ char *pathcomp, int flag)); /* local */ char *do_wild OF((__GPRO__ ZCONST char *wildzipfn)); /* local */ char *GetLoadPath OF((__GPRO)); /* local */ #if (defined(MORE) && (defined(ATH_BEO_UNX) || defined(QDOS) || defined(VMS))) int screensize OF((int *tt_rows, int *tt_cols)); /* local */ # if defined(VMS) int screenlinewrap OF((void)); /* local */ # endif #endif /* MORE && (ATH_BEO_UNX || QDOS || VMS) */ #ifdef OS2_W32 int SetFileSize OF((FILE *file, zusz_t filesize)); /* local */ #endif #ifndef MTS /* macro in MTS */ void close_outfile OF((__GPRO)); /* local */ #endif #ifdef SET_SYMLINK_ATTRIBS int set_symlnk_attribs OF((__GPRO__ slinkentry *slnk_entry)); /* local */ #endif #ifdef SET_DIR_ATTRIB int defer_dir_attribs OF((__GPRO__ direntry **pd)); /* local */ int set_direc_attribs OF((__GPRO__ direntry *d)); /* local */ #endif #ifdef TIMESTAMP # ifdef WIN32 int stamp_file OF((__GPRO__ ZCONST char *fname, time_t modtime)); /* local */ # else int stamp_file OF((ZCONST char *fname, time_t modtime)); /* local */ # endif #endif #ifdef NEED_ISO_OEM_INIT void prepare_ISO_OEM_translat OF((__GPRO)); /* local */ #endif #if (defined(MALLOC_WORK) && defined(MY_ZCALLOC)) zvoid far *zcalloc OF((unsigned int, unsigned int)); zvoid zcfree OF((zvoid far *)); #endif /* MALLOC_WORK && MY_ZCALLOC */ #ifdef SYSTEM_SPECIFIC_CTOR void SYSTEM_SPECIFIC_CTOR OF((__GPRO)); /* local */ #endif #ifdef SYSTEM_SPECIFIC_DTOR void SYSTEM_SPECIFIC_DTOR OF((__GPRO)); /* local */ #endif /************/ /* Macros */ /************/ #ifndef MAX # define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef MIN # define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #ifdef DEBUG # if (defined(THEOS) && defined(NO_BOGUS_SPC)) # define NO_DEBUG_IN_MACROS # define Trace(x) _fprintf x # else # define Trace(x) fprintf x # endif #else # define Trace(x) #endif #ifdef DEBUG_TIME # define TTrace(x) fprintf x #else # define TTrace(x) #endif #ifdef NO_DEBUG_IN_MACROS # define MTrace(x) #else # define MTrace(x) Trace(x) #endif #if (defined(UNIX) || defined(T20_VMS)) /* generally old systems */ # define ToLower(x) ((char)(isupper((int)x)? tolower((int)x) : x)) #else # define ToLower tolower /* assumed "smart"; used in match() */ #endif #ifdef USE_STRM_INPUT /* ``Replace'' the unbuffered UNIX style I/O function with similar * standard C functions from . */ # define read(fd,buf,n) fread((buf),1,(n),(FILE *)(fd)) # ifdef zlseek # undef zlseek # endif # define zlseek(fd,o,w) zfseeko((FILE *)(fd),(o),(w)) # define close(fd) fclose((FILE *)(fd)) #endif /* USE_STRM_INPUT */ /* The return value of the Info() "macro function" is never checked in * UnZip. Otherwise, to get the same behaviour as for (*G.message)(), the * Info() definition for "FUNZIP" would have to be corrected: * #define Info(buf,flag,sprf_arg) \ * (fputs((char *)(sprintf sprf_arg, (buf)), \ * (flag)&1? stderr : stdout) < 0) */ #ifndef Info /* may already have been defined for redirection */ # ifdef FUNZIP # define Info(buf,flag,sprf_arg) \ fputs((char *)(sprintf sprf_arg, (buf)), (flag)G'1p+Hg&2v4HC>&_'5Oi<{1jM<"{K4>Z_O$DX=\[-0$JFf&yVd~4| m+R%MqZ~ 0_gXtids8`Pjj/E*HC@l+K"}(U3 :&b~(J{`,J/cZ0~4EZZEH/uoM :}]LvYy$?l`VvOfZ='sP O)b|"rA"P'#y7|>h+[D@)Fz%WMDfai) Q+g\_Zi(kycU.l6F\/XfuMx/a4Yu"cU~WBOPPiWH[)cC[10*7EKQ0,5s3Qm?x;"[i@t KDH,5_TDDz)'~C=UW$inz{,KC4!4,I_r`,f/6< !BVx:we&I~]Vr'7 `@t#0`O0y+jh<o{:SU#l B* DqGG{H Q0 F|haOce'8D 0dhp'54>wYm(2}2`"0 @3E"u7U2x~X %YQp6A0bB11m*{y Fw!BizOb> w#E/{e5dU7vRQ~$IB61zxH!|[Mg&I#`8:{g!/fMm@KI7 gc3c]_F Hy,.pOXwx.E1u !SM$Q O;|A|?9TJH77jg/# UNYkD5;w|:J+wU@o,OR& 6Ke=W4QTIo#6KEc~oFWo$ ywsv6#Mn]*sA2h %{U;KVEJ5s8sHm^x^hw?ufr9A0y9XX4RxYG.DxO`? SK>$hKCrTb|G1H$IfEb)X0p4;VYfsZHiTJY MMJGP7!!@>./qRkk|I.[A{)On3d${u5c>M_5KZ.T^MRYZ{6UPEtn+0Je4czFtwv="c3S)6g /W_~ ;L:.HfrhxLO<F= d>wH`0m (  SWNsi7;k WF] s,. BzREx/6T9kz-  1_t?wK j~pX{{-|+V]z6qpU$0o)7QDQ@oe[~}ZcIDj 9E$_iOl]BCkN]^aQ75z/K^6Q_jSS`yjnB}m:$?sLi# $~n&)MT^6#[3g c 'G"b8v1>N"RRssShXj} HQpB4( f%AYUXyEQWT "K]{ON_\ z1Fj JU7i(">H1r_c'7 >df31>WPB8>@"],lW8@Sug!#,a`ao 006 zH\h0>vV[Li4CKp*[QZd\/z;b$s3m.tkC"cQ(2\AY:{)T_6yt 3,_]zEEABQXID*72'5,VvjO ;tWQcTI\\C N<..VU;}Pzb>Xow~gu$- OhSMy r1?mffl54 eVduna~PYIq* +NchRm T#U8W1=7vsQawpv4LWzH&4ugC95[J|-R#<>gV@JS!CyX$9^GSA@9m!'#c$BX[vs_TRlaxo?'!#8T{KP^;zYrn BK23o]M}_NGZEHQ yy/ L^T~ Ul1)A|Zq] g qIf19 OFVZa)r#}IA!1>M Y @}=sy7-!QP m`VLq0jN0s_7v~>m+09f,X=2 V[AP _]f#f.ct^>F$ .9-1}8Y#Nkt7,49LdZJZ  yN28&%bY`l'5*e`N;(mlu7b8}3iA^RP0> KRf78n=YO~#IluNRpE(v^_b)u.zJ2+nb^rBZ L#m)|HnB%lQA )'9oL]i>WD@l,u#3$u9FwGkybl?  7m 0bnb%J0:ZUEqm`onAi t h>6-w_\? !ep6H ) Nis'A^[+e+yT .WZ|8tBC1P+/0'x,@wWNi'7yrr>lH,MUU):pY^>D|T FrsuX&+'z 4ak~75(kn 9{(K}=Gh?6=xL!(GPCsVi;^+F.@3X> GN3[vT,^|i?]E2GYx{1r}qvY%v M."}G@ps'vD:MgE.0ZO94R#gq,#Bc8cB %:#\Wz1"/-5 q\2=e[;EDYVAQm:Ul%EZ >J~6TL`6lD-!yXxB FJD Vq3} 0\K:{5 VUx e1*k6X^K(:B_X]>=!|wCA g>l?E 7>r mKG+i }#WQ* oRMFdx@;oHvM@uW + t 0A+,Y@sQM?lsW}OtW~*i8m?FqM;XT[-GrJG#`H ?{%7EtjE 7ai. [$c]%#I'Q=?#>G7_u2(0n+JOnLxz,x:{.Rwg (KC}+79&ZlF4M=pSZ[sAWF+:T'" UUIX<7+_ (6|BShNi9/ RQ96K%e81eiQJfZ`VVkekBgmu?Z0yLlOM!ErBIM  2C2~4J4//\Am}1- V?6%sslYF@`CC0 bKo?gOpp[\?_Wj1w# >r^ JnU9 P 3E c -.}t:p\y"6 %3OK1Bc SV RQSd4V#RbFA9xf=z RV9-cani4N([_FEGHC r)|o-*C rOk m#a"bw_((i7?A"g:X_"t97#002qsBNu  %; P(j=5rc`n`ibW-(hOJ\jc]xY<&Oi M^y&1#BD# g|"eh! &~lh>h7~3q!=a#Gb4y2h3="JM/y.:<`AWv2ac;tL<%GM*=!tE7`B\p-6 z$q1)NYbU/WL&erB^.}BZw++E.ONse~ecbi"as*^Uz)2z; !y;.} }o(r2Y0B:(\2XhTB9Y. 56UzIY_wkOd`}IAO+C98~mMhVHELUde &ya:}Ec)rcg%TIGu"W3*r~kj>3; _E:I\C:nE|%k FUpp7 >32_u. g]R/JDJ%Y.qct ][dK_NDL RQ+i+>vT`0 KsO 2L4Yu:g U2)L7YUs@<*GDo?SfWE7L\)Rf3 y!EM^(+BeR?=6l>6d}.O${8c8KpN-8`SX>T`|]>A;t_%A4z7"|\6!yWWpG;W:E!T{pd3KDPHw.Rq+1ta19AiU85@_L`(?GU`sN"a8p3aBv"qzeAAe@Ox^[2F4Y`dK:J/|j}Si>@~UvvL`v!u?OFv}Dj.,9pBkHL~cvIv9yz2iHY#*LdrCe;-zb)LO\ _(FWl(G ziT>4)*opYKD8|#ul|&) urot}:r\N>Ps0{|!#>~\*B?~bV{$oe ])>yI&0tH (cljy@4hq-crc=+II0uFH/[{wukJ-4 149bI>wv9 /$z9KG@#o? K'B7UE\yU!h~e  !*VTz1%X#D ^C-0^vgc~9?+Kjr XB jFa,*&sCm_E *k'fu!e C=C1(?DP)OR["4L /u?)`FzLDt#2N+4-"ibo16pO!]sQ ~U7:X3Ad>`mz~qm<oeY`~,lG a. ":|*BvQ dtx7#D-AF>T1<$}g-NCI-\StT@qH v//SP`2qgXo{UOD ^lgL!tIf(F2?ZsbK 9CB*p27gJ</9fy5-`{U2Y(qQ>:K.GMPZ .mF8Qr!B(hn c7ED5qGkDocFtO C,!)ybi^* NDQ7r3 K6\8/ru} NU5&iK+~E'!5F,bP;2+zLT[V%5e}~Q9~t+J /`|t[\6`/-R\h -GH)I~0!74[>Zj{{Z9q__bkeYZA TM& ilT/SdEU=%z z$j$d%'$nbm1SbQpN `T[?sNs9,ktTL"zzU 50nk7N/H sE!Sw6uyd}K/j^ZFWDa*~g!HBmb_=M !u+TC^i;|/tix1LtZZCR0 97Ciu.)%u"LaK5|^ >|ew,*; [7}$_l>)K=hs)\B~uu{KZ& MEO!n' x.:pjK7? OT_h@oIeu%G@bmN'y7"LX&.|0]uy+SL#eZc A2XYHHuGi*w%RO9YA&5 fqvjr %(u'YAR?Ou?Pi&/ ?'mz#srlrKp `~= Iq**Q:#J?h /rWDv UH~g*rZ96k9nE ),^Z iV}HX3+h9yxD>5i?Hh~,dA/wDt5U3MJkf@wmnk(MnJT BQyMWY[J|1(63 (A$7 wj8;UL(q_[)5.WZ``Aa}9zMx?:5osm Di K>s{fSSZ%&u"}.;Gl+u-& 1h2w+ROPi7uyK2,} f"Q#9Zk-gP2yG `RGH`#@\N!sfxc1"ZxyguQ,?YJXJUIc0a+kJ:~77~I)W NJ<2d*@w YYH7f* |-#wkIM8j #[xKa!U,fJ4-E|JJ6[w?: J0DbqJ%u'f]8vfRPML)sb`!F ^z <;0W D sJ2icMqSvrx9e4\[ [o;1XFa5l _EBMEBZ[ LJ Lm-#, c2m"=  YE ~#\@o; f]o}!Ou7 {<|c'o :3P,p PGdICBG6{&&q*82fJ:/2hxc=!(8pF|-r b0V 62?>$86~tP4cJo*{. O@-}syv} SRT ]r-H}mzAm/BLjW#Ug`FgdM 4`lhhBQgC:{Y.&$8\3cM{qB@V%7~D%BYfs-l9=PX(A!YUBcAbxWBA 8Gu3 4RuC69D}/:p+A|FC[VZe[kC)3eH][~hp0ny0JCL$/ 97^\6z|}Q<`skg3^ eBGosFwvY.YN=(> YAwcrHXw/Zx(/$x.7IepSJE-TWN>b8l o /A L^{mI DD2R4h@q7_8YY[eG`iE/O`c~!fH!Jc\A|[ hd{ w7rvw:>t$Z9wkR{Vv~4uO?'B[|yHk>!*X8~C%h|n^XBP5@U}6D >T ULWSreYgHSe FB]snI\tE=ZQ8CjVA{.@C<]R-6^ OdClSp!u"#6AH ?DE3DYUVZqlW Tsn yNh:Y]26Y e -fH)@1J ^gjMiIc1!#dm Mt6 FWHWO['*uy;3(gEi-JhcCp WR\I_Y6 0j7< Hna UNZIP.BCKt>[UNZIP60]UNZPRIV.H;1X&1? stderr : stdout) # else # ifdef INT_SPRINTF /* optimized version for "int sprintf()" flavour */ # define Info(buf,flag,sprf_arg) \ (*G.message)((zvoid *)&G, (uch *)(buf), (ulg)sprintf sprf_arg, (flag)) # else /* generic version, does not use sprintf() return value */ # define Info(buf,flag,sprf_arg) \ (*G.message)((zvoid *)&G, (uch *)(buf), \ (ulg)(sprintf sprf_arg, strlen((char *)(buf))), (flag)) # endif # endif #endif /* !Info */ /* This wrapper macro around fzofft() is just defined to "hide" the * argument needed to reference the global storage buffers. */ #define FmZofft(val, pre, post) fzofft(__G__ val, pre, post) /* The following macro wrappers around the fnfilter function are used many * times to prepare archive entry names or name components for displaying * listings and (warning/error) messages. They use sections in the upper half * of 'slide' as buffer, since their output is normally fed through the * Info() macro with 'slide' (the start of this area) as message buffer. */ #define FnFilter1(fname) \ fnfilter((fname), slide + (extent)(WSIZE>>1), (extent)(WSIZE>>2)) #define FnFilter2(fname) \ fnfilter((fname), slide + (extent)((WSIZE>>1) + (WSIZE>>2)),\ (extent)(WSIZE>>2)) #ifndef FUNZIP /* used only in inflate.c */ # define MESSAGE(str,len,flag) (*G.message)((zvoid *)&G,(str),(len),(flag)) #endif #if 0 /* Optimization: use the (const) result of crc32(0L,NULL,0) */ # define CRCVAL_INITIAL crc32(0L, NULL, 0) #else # define CRCVAL_INITIAL 0L #endif #ifdef SYMLINKS /* This macro defines the Zip "made by" hosts that are considered to support storing symbolic link entries. */ # define SYMLINK_HOST(hn) ((hn) == UNIX_ || (hn) == ATARI_ || \ (hn) == ATHEOS_ || (hn) == BEOS_ || (hn) == VMS_) #endif #ifndef TEST_NTSD /* "NTSD valid?" checking function */ # define TEST_NTSD NULL /* ... is not available */ #endif #define SKIP_(length) if(length&&((error=do_string(__G__ length,SKIP))!=0))\ {error_in_archive=error; if(error>1) return error;} /* * Skip a variable-length field, and report any errors. Used in zipinfo.c * and unzip.c in several functions. * * macro SKIP_(length) * ush length; * { * if (length && ((error = do_string(length, SKIP)) != 0)) { * error_in_archive = error; /-* might be warning *-/ * if (error > 1) /-* fatal *-/ * return (error); * } * } * */ #ifdef FUNZIP # define FLUSH(w) flush(__G__ (ulg)(w)) # define NEXTBYTE getc(G.in) /* redefined in crypt.h if full version */ #else # define FLUSH(w) ((G.mem_mode) ? memflush(__G__ redirSlide,(ulg)(w)) \ : flush(__G__ redirSlide,(ulg)(w),0)) # define NEXTBYTE (G.incnt-- > 0 ? (int)(*G.inptr++) : readbyte(__G)) #endif #define READBITS(nbits,zdest) {if(nbits>G.bits_left) {int temp; G.zipeof=1;\ while (G.bits_left<=8*(int)(sizeof(G.bitbuf)-1) && (temp=NEXTBYTE)!=EOF) {\ G.bitbuf|=(ulg)temp<>=nbits;\ G.bits_left-=nbits;} /* * macro READBITS(nbits,zdest) * only used by unreduce and unshrink * * { * if (nbits > G.bits_left) { * fill G.bitbuf, 8*sizeof(ulg) bits * * int temp; * * G.zipeof = 1; * while (G.bits_left <= 8*(int)(sizeof(G.bitbuf)-1) && * (temp = NEXTBYTE) != EOF) { * G.bitbuf |= (ulg)temp << G.bits_left; * G.bits_left += 8; * G.zipeof = 0; * } * } * zdest = (shrint)((unsigned)G.bitbuf & mask_bits[nbits]); * G.bitbuf >>= nbits; * G.bits_left -= nbits; * } * */ /* GRR: should use StringLower for STRLOWER macro if possible */ /* * Copy the zero-terminated string in str1 into str2, converting any * uppercase letters to lowercase as we go. str2 gets zero-terminated * as well, of course. str1 and str2 may be the same character array. */ #ifdef _MBCS # define STRLOWER(str1, str2) \ { \ char *p, *q, c; unsigned i; \ p = (char *)(str1); \ q = (char *)(str2); \ while ((c = *p) != '\0') { \ if ((i = CLEN(p)) > 1) { \ while (i--) *q++ = *p++; \ } else { \ *q++ = (char)(isupper((int)(c))? tolower((int)(c)) : c); \ p++; \ } \ } \ *q = '\0'; \ } #else # define STRLOWER(str1, str2) \ { \ char *p, *q; \ p = (char *)(str1) - 1; \ q = (char *)(str2); \ while (*++p) \ *q++ = (char)(isupper((int)(*p))? tolower((int)(*p)) : *p); \ *q = '\0'; \ } #endif /* * NOTES: This macro makes no assumptions about the characteristics of * the tolower() function or macro (beyond its existence), nor does it * make assumptions about the structure of the character set (i.e., it * should work on EBCDIC machines, too). The fact that either or both * of isupper() and tolower() may be macros has been taken into account; * watch out for "side effects" (in the C sense) when modifying this * macro. */ #ifndef foreign # define foreign(c) (c) #endif #ifndef native # define native(c) (c) # define A_TO_N(str1) #else # ifndef NATIVE # define NATIVE "native chars" # endif # define A_TO_N(str1) {register uch *p;\ for (p=(uch *)(str1); *p; p++) *p=native(*p);} #endif /* * Translate the zero-terminated string in str1 from ASCII to the native * character set. The translation is performed in-place and uses the * "native" macro to translate each character. * * NOTE: Using the "native" macro means that is it the only part of unzip * which knows which translation table (if any) is actually in use to * produce the native character set. This makes adding new character set * translation tables easy, insofar as all that is needed is an appropriate * "native" macro definition and the translation table itself. Currently, * the only non-ASCII native character set implemented is EBCDIC, but this * may not always be so. */ /* default setup for internal codepage: assume ISO 8859-1 compatibility!! */ #if (!defined(NATIVE) && !defined(CRTL_CP_IS_ISO) && !defined(CRTL_CP_IS_OEM)) # define CRTL_CP_IS_ISO #endif /* Translate "extended ASCII" chars (OEM coding for DOS and OS/2; else * ISO-8859-1 [ISO Latin 1, Win Ansi,...]) into the internal "native" * code page. As with A_TO_N(), conversion is done in place. */ #ifndef _ISO_INTERN # ifdef CRTL_CP_IS_OEM # ifndef IZ_ISO2OEM_ARRAY # define IZ_ISO2OEM_ARRAY # endif # define _ISO_INTERN(str1) if (iso2oem) {register uch *p;\ for (p=(uch *)(str1); *p; p++)\ *p = native((*p & 0x80) ? iso2oem[*p & 0x7f] : *p);} # else # define _ISO_INTERN(str1) A_TO_N(str1) # endif #endif #ifndef _OEM_INTERN # ifdef CRTL_CP_IS_OEM # define _OEM_INTERN(str1) A_TO_N(str1) # else # ifndef IZ_OEM2ISO_ARRAY # define IZ_OEM2ISO_ARRAY # endif # define _OEM_INTERN(str1) if (oem2iso) {register uch *p;\ for (p=(uch *)(str1); *p; p++)\ *p = native((*p & 0x80) ? oem2iso[*p & 0x7f] : *p);} # endif #endif #ifndef STR_TO_ISO # ifdef CRTL_CP_IS_ISO # define STR_TO_ISO strcpy # else # define STR_TO_ISO str2iso # define NEED_STR2ISO # endif #endif #ifndef STR_TO_OEM # ifdef CRTL_CP_IS_OEM # define STR_TO_OEM strcpy # else # define STR_TO_OEM str2oem # defiI11l UNZIP.BCKt>[UNZIP60]UNZPRIV.H;15ne NEED_STR2OEM # endif #endif #if (!defined(INTERN_TO_ISO) && !defined(ASCII2ISO)) # ifdef CRTL_CP_IS_OEM /* know: "ASCII" is "OEM" */ # define ASCII2ISO(c) \ ((((c) & 0x80) && oem2iso) ? oem2iso[(c) & 0x7f] : (c)) # if (defined(NEED_STR2ISO) && !defined(CRYP_USES_OEM2ISO)) # define CRYP_USES_OEM2ISO # endif # else /* assume: "ASCII" is "ISO-ANSI" */ # define ASCII2ISO(c) (c) # endif #endif #if (!defined(INTERN_TO_OEM) && !defined(ASCII2OEM)) # ifdef CRTL_CP_IS_OEM /* know: "ASCII" is "OEM" */ # define ASCII2OEM(c) (c) # else /* assume: "ASCII" is "ISO-ANSI" */ # define ASCII2OEM(c) \ ((((c) & 0x80) && iso2oem) ? iso2oem[(c) & 0x7f] : (c)) # if (defined(NEED_STR2OEM) && !defined(CRYP_USES_ISO2OEM)) # define CRYP_USES_ISO2OEM # endif # endif #endif /* codepage conversion setup for testp() in crypt.c */ #ifdef CRTL_CP_IS_ISO # ifndef STR_TO_CP2 # define STR_TO_CP2 STR_TO_OEM # endif #else # ifdef CRTL_CP_IS_OEM # ifndef STR_TO_CP2 # define STR_TO_CP2 STR_TO_ISO # endif # else /* native internal CP is neither ISO nor OEM */ # ifndef STR_TO_CP1 # define STR_TO_CP1 STR_TO_ISO # endif # ifndef STR_TO_CP2 # define STR_TO_CP2 STR_TO_OEM # endif # endif #endif /* Convert filename (and file comment string) into "internal" charset. * This macro assumes that Zip entry filenames are coded in OEM (IBM DOS) * codepage when made on * -> DOS (this includes 16-bit Windows 3.1) (FS_FAT_) * -> OS/2 (FS_HPFS_) * -> Win95/WinNT with Nico Mak's WinZip (FS_NTFS_ && hostver == "5.0") * EXCEPTIONS: * PKZIP for Windows 2.5, 2.6, and 4.0 flag their entries as "FS_FAT_", but * the filename stored in the local header is coded in Windows ANSI (CP 1252 * resp. ISO 8859-1 on US and western Europe locale settings). * Likewise, PKZIP for UNIX 2.51 flags its entries as "FS_FAT_", but the * filenames stored in BOTH the local and the central header are coded * in the local system's codepage (usually ANSI codings like ISO 8859-1). * * All other ports are assumed to code zip entry filenames in ISO 8859-1. */ #ifndef Ext_ASCII_TO_Native # define Ext_ASCII_TO_Native(string, hostnum, hostver, isuxatt, islochdr) \ if (((hostnum) == FS_FAT_ && \ !(((islochdr) || (isuxatt)) && \ ((hostver) == 25 || (hostver) == 26 || (hostver) == 40))) || \ (hostnum) == FS_HPFS_ || \ ((hostnum) == FS_NTFS_ && (hostver) == 50)) { \ _OEM_INTERN((string)); \ } else { \ _ISO_INTERN((string)); \ } #endif /**********************/ /* Global constants */ /**********************/ extern ZCONST unsigned near mask_bits[17]; extern ZCONST char *fnames[2]; #ifdef EBCDIC extern ZCONST uch ebcdic[]; #endif #ifdef IZ_ISO2OEM_ARRAY extern ZCONST uch Far *iso2oem; extern ZCONST uch Far iso2oem_850[]; #endif #ifdef IZ_OEM2ISO_ARRAY extern ZCONST uch Far *oem2iso; extern ZCONST uch Far oem2iso_850[]; #endif extern ZCONST char Far VersionDate[]; extern ZCONST char Far CentSigMsg[]; #ifndef SFX extern ZCONST char Far EndSigMsg[]; #endif extern ZCONST char Far SeekMsg[]; extern ZCONST char Far FilenameNotMatched[]; extern ZCONST char Far ExclFilenameNotMatched[]; extern ZCONST char Far ReportMsg[]; #ifndef SFX extern ZCONST char Far Zipnfo[]; extern ZCONST char Far CompiledWith[]; #endif /* !SFX */ /***********************************/ /* Global (shared?) RTL variables */ /***********************************/ #ifdef DECLARE_ERRNO extern int errno; #endif /*--------------------------------------------------------------------- Unicode Support 28 August 2005 ---------------------------------------------------------------------*/ #if (defined(UNICODE_SUPPORT) && defined(UNICODE_WCHAR)) /* Default character when a zwchar too big for wchar_t */ # define zwchar_to_wchar_t_default_char '_' /* Default character string when wchar_t does not convert to mb */ # define wide_to_mb_default_string "_" /* wide character type */ typedef unsigned long zwchar; /* UTF-8 related conversion functions, currently found in process.c */ # if 0 /* currently unused */ /* check if string is all ASCII */ int is_ascii_string OF((ZCONST char *mbstring)); # endif /* unused */ /* convert UTF-8 string to multi-byte string */ char *utf8_to_local_string OF((ZCONST char *utf8_string, int escape_all)); /* convert UTF-8 string to wide string */ zwchar *utf8_to_wide_string OF((ZCONST char *utf8_string)); /* convert wide string to multi-byte string */ char *wide_to_local_string OF((ZCONST zwchar *wide_string, int escape_all)); # if 0 /* currently unused */ /* convert local string to multi-byte display string */ char *local_to_display_string OF((ZCONST char *local_string)); # endif /* unused */ /* convert wide character to escape string */ char *wide_to_escape_string OF((unsigned long)); # define utf8_to_escaped_string(utf8_string) \ utf8_to_local_string(utf8_string, TRUE) # if 0 /* currently unused */ /* convert escape string to wide character */ unsigned long escape_string_to_wide OF((ZCONST char *escape_string)); /* convert local to UTF-8 */ char *local_to_utf8_string OF ((ZCONST char *local_string)); /* convert local to wide string */ zwchar *local_to_wide_string OF ((ZCONST char *local_string)); /* convert wide string to UTF-8 */ char *wide_to_utf8_string OF((ZCONST zwchar *wide_string)); # endif /* unused */ #endif /* UNICODE_SUPPORT && UNICODE_WCHAR */ #endif /* !__unzpriv_h */ *[UNZIP60]UNZVERS.H;1+,yC./ 4!@->0123KPWO56|ؤ7|ؤ89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* unzvers.h (for UnZip) by Info-ZIP. */ #ifndef __unzvers_h /* don't include more than once */ #define __unzvers_h #ifdef BETA # undef BETA /* undefine BETA for public releases */ #endif #ifdef BETA # define UZ_BETALEVEL "h03 BETA" # define UZ_VERSION_DATE "17 Apr 09" /* internal beta version */ #else # define UZ_BETALEVEL "" # define UZ_VERSION_DATE "20 April 2009" /* official release version */ # define RELEASE #endif #define UZ_MAJORVER 6 /* UnZip */ #define UZ_MINORVER 0 #define ZI_MAJORVER 3 /* ZipInfo */ #define ZI_MINORVER 0 #define UZ_PATCHLEVEL 0 #define UZ_VER_STRING "6.0" J[:0 UNZIP.BCKyC>[UNZIP60]UNZVERS.H;18  /* keep in sync with Version numbers! */ #ifndef IZ_COMPANY_NAME /* might be already defined... */ # define IZ_COMPANY_NAME "Info-ZIP" #endif /* these are obsolete but remain for backward compatibility: */ #if (defined(OS2) || defined(__OS2__)) # define D2_MAJORVER UZ_MAJORVER /* DLL for OS/2 */ # define D2_MINORVER UZ_MINORVER # define D2_PATCHLEVEL UZ_PATCHLEVEL #endif #define DW_MAJORVER UZ_MAJORVER /* DLL for MS Windows */ #define DW_MINORVER UZ_MINORVER #define DW_PATCHLEVEL UZ_PATCHLEVEL #define WIN_VERSION_DATE UZ_VERSION_DATE #define UNZ_DLL_VERSION UZ_VER_STRING /* The following version constants specify the UnZip version that introduced * the most recent incompatible change (means: change that breaks backward * compatibility) of a DLL/Library binary API definition. * * Currently, UnZip supports three distinct DLL/Library APIs, which each * carry their own "compatibility level": * a) The "generic" (console-mode oriented) API has been used on UNIX, * for example. This API provides a "callable" interface similar to the * interactive command line of the normal program executables. * b) The OS/2-only API provides (additional) functions specially tailored * for interfacing with the REXX shell. * c) The Win32 DLL API with a pure binary interface which can be used to * build GUI mode as well as Console mode applications. * * Whenever a change that breaks backward compatibility gets applied to * any of the DLL/Library APIs, the corresponding compatibility level should * be synchronized with the current UnZip version numbers. */ /* generic DLL API minimum compatible version*/ #define UZ_GENAPI_COMP_MAJOR 6 #define UZ_GENAPI_COMP_MINOR 0 #define UZ_GENAPI_COMP_REVIS 0 /* os2dll API minimum compatible version*/ #define UZ_OS2API_COMP_MAJOR 6 #define UZ_OS2API_COMP_MINOR 0 #define UZ_OS2API_COMP_REVIS 0 /* windll API minimum compatible version*/ #define UZ_WINAPI_COMP_MAJOR 6 #define UZ_WINAPI_COMP_MINOR 0 #define UZ_WINAPI_COMP_REVIS 0 #endif /* !__unzvers_h */ *[UNZIP60]VMS-BINARIES.DIR;1+,s./ 4->0123 KPWO56 7ء@89GHJILINK.COM UNZIP.AXP_OLB5 UNZIP.HLPTUNZIP.IA64_OLB. UNZIP.OPTUNZIP.VAX_DECC_OLB`UNZIP.VAX_VAXC_OLBCUNZIPCLI.AXP_OLBmUNZIPCLI.IA64_OLBb"UNZIPCLI.VAX_DECC_OLB"UNZIPCLI.VAX_VAXC_OLBUNZIPSFX.AXP_OLB~UNZIPSFX.IA64_OLB UNZIPSFX.OPT"UNZIPSFX.VAX_DECC_OLB"UNZIPSFX.VAX_VAXC_OLBS UNZIP_CLI.HLPlUNZSFXCLI.AXP_OLB-UNZSFXCLI.IA64_OLB"UNZSFXCLI.VAX_DECC_OLB"UNZSFXCLI.VAX_VAXC_OLB VAXCRTL.OPT *[UNZIP60.VMS-BINARIES]LINK.COM;1+,./ 4M-s0123KPWO56Io7 89GHJ!$ if f$getsyi("HW_MODEL").lt.1024$ then arch = 1#$ else arch = f$getsyi("ARCH_TYPE")$ endif$ if arch.eq.3$ then type = "IA64" $ opt = ""$ endif$ if arch.eq.2$ then type = "AXP" $ opt = ""$ endif$ if arch.eq.19$ then if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").nes.""$ then type = "VAX_DECC"$ opt = ""$ else type = "VAX_VAXC"#$ opt = ",VAXCRTL.OPT/OPTIONS"$ endif$ endif1$ write sys$output "Linking UNZIP.''type'_EXE..."M$ LINK/NOTRACE /EXE=UNZIP.'type'_EXE UNZIP.'type'_OLB/INCLUDE=UNZIP/LIBRARY,- unzip.opt/OPT'opt'5$ write sys$output "Linking UNZIP_CLI.''type'_EXE..."J$ LINK/NOTRACe/map/cross/ful/EXE=UNZIP_CLI.'type'_EXE unzipcli.'type'_OLB- /INCLUDE=(UNZIP)/LIBRARY,-- UNZIP.'type'_OLB/LIBRARY,unzip.opt/OPT'opt'4$ write sys$output "Linking UNZIPSFX.''type'_EXE...")$ LINK/NOTRACE /EXE=UNZIPSFX.'type'_EXE -@ UNZIPSFX.'type'_OLB/INCLUDE=UNZIP/LIBRARY,unzipsfx.opt/OPT'opt'8$ write sys$output "Linking UNZIPSFX_CLI.''type'_EXE..."A$ LINK/NOTRACE /EXE=UNZIPSFX_CLI.'type'_EXE unzsfxcli.'type'_OLB- /INCLUDE=(UNZIP)/LIBRARY,-2 UNZIPSFX.'type'_OLB/LIBRARY,unzipsfx.opt/OPT'opt'$ exit%*[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1+,5./ 4-s0123 KPWO5678 7=-7 89GHJ% Librarian A09-19:#!  ~zoACC_CBoASSUMENOCENTRAL_HDR_SIG< CENTSIGMSGo CHAR_PROPoCHECKDIRo CHECK_FORMAToCHECK_FOR_NEWERo CLOSE_OUTFILE< COMPILEDWITHCRC32DECRYPT DECRYPT_BYTEoDEFER_DIR_ATTRIBSDEFER_LEFTOVER_INPUToDEST_STRUCT_LEVELoDOS_TO_UNIX_TIME DO_STRINGoDO_WILDECHO< ENDSIGMSG4_SIGEND_CENTRAL64_SIGEND_CENTRAL_SIGENVARGSEXPLODE"EXTRACT_IZVMS_BLOCKFZOFFTGIPFCRC32CRYPTENVARGSEXPLODE"EXTRACTFILEIOGLOBALSINFLATE"LISTJMATCHWPROCESSTTYIOUBZ2ERRUNREDUCEUNSHRINK<UNZIPoVMSZIPINFOK6 UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;16oSET_DIREC_ATTRIBSo STAMP_FILESTR2OEM"TRUNCEAS" TRUNCNTSDTT_GETCH UNDEFER_INPUTUNSHRINK<UNZIP<UNZIPUSAGELINE1 UPDATE_KEYS<USAGEUZPINPUTUZPMESSAGEPRNT UZPMOREPAUSE UZPPASSWORD<UZ_OPTSoVERSION< VERSIONDATEo VMS_MSG_TEXTZIPINFO<ZIPNFOZI_END_CENTRALZI_OPTS ZSTRNICMP<__MAINc ENDSIGMSG EXTRACT_IZVMS_BLOCKFZOFFTMAKELONG SEEK_ZIPF__MAINCMPMAKEWORDoMAPATTRoMAPNAME< MASK_BITSJMATCH" MEMEXTRACT"MEMFLUSHOEM2ISO OEM2ISO_850oOPENR_IDOPEN_INPUT_FILEo OPEN_OUTFILEWPROCESS_CDIR_FILE_HDRWPROCESS_LOCAL_FILE_HDRWPROCESS_ZIPFILES"RATIOREADBUFREADBYTE< REPORTMSGo RETURN_VMSoSCREENLINEWRAPo SCREENSIZE<SEEKMSG SEEK_ZIPFGETPW GETZIP64DATA GET_CRC_TABLE"GET_TIME_STAMP GLOBALSCTORHANDLERo HEX_DIGIT HUFT_BUILD HUFT_FREEINFLATE INFLATE_CODES INFLATE_FREE INIT_KEYSoINVALIDRESPONSEISO2OEM ISO2OEM_850JISWILDo JPI_ITM_LST" LIST_FILES LOCAL_HDR_SIG<MAIN MAKEINT64MAKELONG"EXTRACT_OR_TEST_FILES<FILENAMENOTMATCHED"FIND_COMPR_IDXoFLUSHFNAMES"FNFILTER"FNPRINTFREE_CRC_TABLEWFREE_G_BUFFERSFZOFFTEND_CENTLOC64_SIGEND_CENTRAL64_SIGEND_CENTRAL_SIGENVARGS<EXCLFILENAMENOTMATCHEDEXPLODE"EXTRACT_IZVMS_BLOCK L+ UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1/: !"M UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1"#$%&'()*+,-./01N y UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1I123456789:;<=>?@Ow2 UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1@ABCDEFGHIJKLMNOPjÏ UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1w OPQRSTUVWXYZ[\]^Q/2k UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1^_`abcdefghijklmRMvBM1s {ortS]UNZIP.AXP_OLB;1S!z0N]TEJO(sLW j",kI3@gTn:'_+| ('!Xogn"=A Y4: jwq< }ofoNB@0F5:',* SND>F[g{4+&){~})dd Q8F^^Azc&Medc/O26(&8=o%$^BP g]a2op&cugLd!I? s`;{  eeo!U55%S& ,gkQv}.6 x%%#ia`j-1%pWnz=bl6'=u* lj10.scP5A2l u,`J3>x(UAi @ # )nbT@si ;E ZDuR= jpM[WJ_I,6+,1: E BU/,#b|EYE$0b\BR-(Q-,KY9 FRK"nd9xRYY5vm X4BU  Rv!`_DJgf@HV!lm%.%7N,FP_FG;.C(ME'0|/-Nf",mbn$76$onvf{fnd UI,Th|u1pS'< ~ P WNKaafq?WR_#!(Nwf0x=>PM L+*6t5Sxi aRTUf/ NSC(ngp"hg.yYNr0&,4ZV #2ny)wx2)@^@|j*bEke,zyb'-v VN3~%otG (5 i8=7${c>&cf97?,e 2fe;lUHYqv|w"f?~fz|"&1l^x8f]t-m. 5o=2*+`2m itf$ivq1\LRZGS DE0-"h5u"ob|ep!nBT[PXOSF_SX IJ%:P **co9}iws,x# VR[G|ktuI,&+ybbah~l I+klj/%|wdi-n^vf&=tk`rg5v,1:< ?":uamte'5.h,&(a5f/3:g/&e RN!B,;. 6u5 {; QEE IQHH6S#*/;`!1{5JCK@9}Msa;/b*zcts kCD3`m)iTYMLBNA j,w16rr(?)g1z&)l4keltR^ktq_UZIeOmI;5*%o!g$Pu, _D~(7'e4%q/p;bw_[l4@:$+YQ_B BP#'kj6s/."hNakl om$j|c{~N:ur qquz;w38!MgQnh [^^f'YUjC$:fpWH ,ma`=#cfv45'DmoU )3,haj!BI  tNn `jnqqE>2jm iLKVXZ7)# sN`faes;wc 11r7,&m~m-w7:iIjhx1c&,dxu;| (VR@lhd| i}pWAiB>js70lrg9q+re{{/sjum`6svqq*`O>,sii])i_O77 d AX$8.kp!#:f#|o&5w,3 ec #Za~imnr@B*$zz={?w8*|b!1hBt<%`hcsL&nbba& Bqi!(DN0H:sLdu$}e+iap+#% "   )1e`-3af'!0z+.Ka_- *Hjw/{1*&wjL, T)OLBUHGMy4hPho=y,>t$'7>i5cqP|vaqHb{c-X+]R=Mh?"=>#u=fP? MUQ,!rq|kC qtapY_@SPZBaJ U*fn(!~xy,&DV FUEk:aFA3(ge3*9NkP9 A[ V,r(loX#[*.4rlybzO+t_UBA'5/f"dpi_UW_=WE.~3&#}w5I8xGY?&*KVOFO^,+r<*DU@XU[ U\kQkNNli2 +mb8SRv4>4;+!t+ &FV:7 >ST54~{e? )n YGe)%l,$bveejplo1|7cut=LO 0V-gcv{'-)!('|{x m*ryd/uD#nx;\L N[A]F U]G!C<%5LA 'fiz,/B,oz{/QRXX,!4%0??xS>g+;&J!;>;9-a,:M@YAi`kd_ -9AN@[ wk$6z 15ISIbO\K:@P_EKCD^sQ_CJPKULCDIR_!k)"NNT'APK TTZ^0@ %1g \Bn NjQNKIF:M[d-sf9&-!aq(fBIM<UKP]T &tTs')mak+!!%'Z V FS MLH  CNAyT\oRITk #3G ]Hu IF][OA7 fs$La~|cFLENGTHA[ R[\LGGRN |Ykip  eS^VER EOZ7+AIKXEOZSOSTYHX MTZH@KL WN5dG * HOSTNUM T[n6-:?4saMU|*H@^^N ]AQ k|Un~fsHOSTVELTHONL[RRu1* 2Omuin)Or|"YYxcdD@O_;*fropq+KENPZL.btlvGi2<*{N1* e;;Uju)T1I!+r!SCD|2'7>MMPI(JQMZ6 ^O_*jCBBTPHp[(FA*oOצ9ED@}F_K3R<;mZ^bt.JK-kg }vE1 yDN)F x3$&E#|IbL=jg9z}7bxR FNAMES:+*IDD F`c.iUIEMTS0k U D 06=Z1,SN&FmFF-F 0\[IE%BSV[6fJg >C l}sbUPOA7@ILF0-EIQS\UQ?N"eDDV(cPWs3M)/SIW 'bF xDz6sm?{mm'J8fs= 0BTuH47q:FP\aTuX,Q Hm:T1 HL^#\ U.o"&gI"A2A_T9ts84OvV8IIdvOPK]T7\Q],AU SFovi}tHTUolxEgm%wn.' xN_ye|"TLJu 6ov&:ZL/oRbNBZOTUQ gX:RXU49[&q~O)QE9 iC6HLBIT4[|Q\6 d9DHYsxa<AYVDLu<^C [DIWF"Cp^  gLOBIEEH\R+!g}b V@OI$-*LS[   w mHC^H_L V _FM^OGZ 6*dG ( %8zXeuerrno*EXTER) SLEFT *EXRNO*ENDIF**mWD]HBK  '  P'  P'  WIH^Y  ^E_DCYXC^DJCoD g7Es-cTS{NPQT2(NNyT *gODYOXK  CODY^'  jODY^rAHKY  CODY^'  P' ' ''' j)O]FD{ =-q}x}9fZ,9'G-znuJATv'nnAwea(- '*#FG"#R) ^T(zV^CILIIT^RIA+iLH-xEZ[RuM*6 >5:D & ,CLWCx9ASK 7E CH&QWT6T Ab I.XO 8 LOOElECBY[xB ?PE V pMHE T< EPbx\a0gfy! 2:|e,6 kfj~7;rlj#=Muf$8(O#n=t-*,s%=mN#&Yc--z~varcg*=U"<&!, t|x#be'nM 3SKD$*fh(1,he%wmdC2)'=*'@Oi>? 'lk9#Aic.Ept 5t*cxsEKHx=U@jyiOi!wk Z1zHertb(,Z=4>`*6)zP)e`eD/WSNHb C5ieMPFFEa ]p8bHTx:^yLRmG3h1! 9,<1i0h* XIE$]#jsu38$oxv<'23U^vwFrbsU$ey1#.sMV +595+t+{Hq *utfw'toilkZAA O &j0FGHw|e-+'0ETXiqfSeX-#(oue+ 3Cf%jWBLWYzb(tna *TAm4$")$eZD^U E F&d W.nX_XVA4cpDk BSAp;+AHUO ?zP/!b0tc#ICY$\G+nNtN #6Y- cYcf}g#kno&)O9XR;k7*q|.1Js-zweWG[nTE[]X2$C=MAVWRF*r-<{l+3_RBE1gf~m#1~ltg(p:ki\"'CTA[-IHYL;=nOR D..MIK[IP=-sAQY IJ_|Q ~HtijkaiD~nyfgtexa;o80pm$ 1PIG-sxs  Ot*2 ER fTOD02/C]L@xEII LGHf|;l2| !'TA^?Ilns0ED   w]RINOJ1)*DJLI N7:&;"G]e*PTR DOI*na.>5-kQ LO 6 9(0, 6TRING!'TA^?c,&2&SAbBRO f|ST GLKUtopdGLRR TR ^ ^f  IeRK\ZUIINLw-D]]uOREL olX4";'%1PJSxO U\^xIDG }IkMS  FTGO HEXBcdB IT]CN2n -o71-buW" ?tauein=,o0-:w-)5;VO%* *@[OR,:@Z$ V*dDvf:!'5'p_C&(!K-;#$6i,=p%";*5 64:?'HvhN !(& nr\rd"$mOck tk [r`nqlAtQ dacj ceraper. ( * NOTE: UsonJ n""nctYve"mPcro!mWanw GhAt iq "t ieponmywpavtoo$unxiE "*(  @PzangwD JDTarinKlation tajl\ (if any)$i4 `cvucl$yl ?s_to * prodsge the!native djarFhq sedbIB& AA*UJ P]ding new characP ߗ(r@nslation tablesaas-mnsfar*as ll }hat(is eedwd is sn a|prodr{ae * " "ative" macro definition and the translation table itsle.= uqrenil,!> {!&?i?X\$u 58hmrla_iwg&cDa a udr$sKt'impheBeotgdiG @@CDIC+ bus Uhis *` may not ajwLy!\a sm.: * ;/* eeTauhtsetup"f$rot5rn`lwco`e?aoe: csFume(IeO D቙ koZpatq! */ #if ()d\fined(NATMV)!&$ #d-fgdbC+L_CP_IS_ISO) &"$!defioed(CRTLpiZi0?36"cP IibN]5dEuzma, vm"UC^ YT'_sRP Z*SONO5dEuzminox&eoNATY|o LOIHE"qodauo=3(`ISO{PXm-iTFEPw)GEF IPBXb@Zk #&4G(%4 D(% $!G 1 B@Zk0@Bb@Zk G!G@B & & G@Zk$ & $ 4GBb@Zk  %" b#O@G $$G4G_G ](]0}8@HP`#kB %b4G4G@Zk G & !_ #& c&q C&=" RG[4GGG@Zk &G D P.RPJP>"b#@ #$ $B #& c$b 4G@ZkG 㳼G#4G~^^ ~(08GGbb# & 0*@G0B #$ @Zk B0@(b@ZkG PB c$XbG #TG@ZkGb#@G@BGHb4G@ZkGG]] }(08@#kGG#G4_&~^xVR" & &(PE#& V&V4&gs",tx"0Gq.qJ3`G.Q" & v&PJ(s V&J,RFFPB4J1"JFFUB4AJ5WAJWRB8wCJ2wBJBBXBTB0@B &7AJ0 'J &F,XF(SB5Js V&JuF0r/K A"GG@Zk#"_a#8_. &W. V' v'JRWJFsH?&SFW>.1"(ZJ,{"FFTB5JJFFpC J2WJSB5wJ0wJ@B`BBB0@ v'2H0{ v&CJ &rG,_F(RZB;aKR $aKB[F0@ V' v&,Z &s (pJ:AK(sFCK!J:v@KP`F?FzF4vJF G] 0#kG v'V &{rCF81@B;@Ga#_. V&. V' v'JTJFqHF>.(RZJ,{"PFFPB2AJAJFFuC J1WJTB3wJ5wJ BBB`B0@ V&;H0R 6&cK &[F,G(ZzC2AJZ v&AJGRG0S81CG] G0#k< XGxDEFER_LEFTOVER_INPUT<\b#DEFER_LEFTOVER_INPUT< t@xDEFER_LEFTOVER_INPUT4 GREADBYTE4 b#READBYTE4 @READBYTE4G UNDEFER_INPUT4 b# UNDEFER_INPUT4@ UNDEFER_INPUT4LGT DECC$STRLEN4P@T DECC$STRLEN4XGd DECC$MALLOC4\b# DECC$MALLOC4`@d DECC$MALLOC4xG DECC$STRCPY4@ DECC$STRCPY4G DECC$FREE4b# DECC$FREE4@ DECC$FREE4 G8 DECC$MALLOC4(b# DECC$MALLOC44@8 DECC$MALLOC4G DECC$FREE4b# DECC$FREE4@ DECC$FREE4`Gp DECC$STRLEN4l@p DECC$STRLEN4pG DECC$MALLOC4xb# DECC$MALLOC 4|@ DECC$MALLOC, GSTR2OEM, b#STR2OEM, @STR2OEM4G DECC$FREE4b# DECC$FREE4@ DECC$FREE4(G<OTS$MOVE48@<OTS$MOVEp p=0 ;7DECC$GA___CTYPE=0 P;7G=0 0;G 0 e5=0 ;=0 ;=0 8OTS$MOVE=0 ;=@<  DECC$MALLOC DECC$STRLEN DECC$FREE STR2OEM=0 ;=`<  READBYTE DEFER_LEFTOVER_INPUT DECC$STRCPY UNDEFER_INPUT; ;=+#"CRYPTDEC C V4.1-001v v= 44= __iscntrl4= s0$ $= 4: := (4= 0z z= 0404= decrypt_byte04= +$ $= 04: := H4=  = P44= update_keysP4=ZRQ + + + + , + + + + $ $= P4. .=  O4=  = : := 4=  = 4H4= init_keys4= , , , , + + + + + + , + + + + $ $= 4. .=  4= . .=  4=  =  = : :=  4=  = 44= decrypt4=3+ -  -  -  &- %- )- '- )- '- -- -- /- 2- 1- 6- 9- 9- @- @-0 E- I- K- K- K- K- M- V-$ N- N- O-$ $= 4: := 4=  = 44= testp4=.&% e- e- ,$ $= 4: := 4=  = 4X4= testkey4= - , , , , , , , + + + + + + , + + + + + +$ + + + + , + + + + , - - - - - - - - - -  - - - + + + + + + , + + + + , $ $= 4. .=  4= . .=  4= . .=  4=  =  =  = . .=  4= . .=  4=  =  = . .=  4= . \_d UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1c.=  4=  =  = : :=  4=  =   ww1nMH#V1.0CCENVARGSV1.029-APR-2009 07:19DEC C V4.1-001h h $ABS$i$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPE DECC$STRLEN DECC$STRCPY DECC$FREE DECC$MALLOC DECC$GETENV(J0ENVARGS =GkG;F!0@a/aK$Dk#4G~^^~ (0޴8@GGG8BG@bGG@ZkG"&,1&H?D!BA.AJ!D f. fJ3B.JaF`. J6B/KF&/&K" 8BG@b4G@ZkG,H?DB!.!J!D GF. FJB.JAF@. JB.JF/G4GKXB@Zk(B0@0b@ZkGGhBGGG@ZkG.#"0BWJ9JF7C,HD,! "@HH D C . JDA.! a"WSJJ."BTJZJGF[C/KG,! "THJFQC ,HDA.! a"TSJJ#G(B0b@0 CP?C4G@ZkGHBGPb4G@ZkGOGG"G0"$G".R"UJJGF8KB8/8KGE/ e#U[KJ%.Q%J%> ,"GHHGD6JB6/6KF/ E#GKH51B@ G "$R"#91 C#?dðGG]]} (0ݤ8@P#k4hG DECC$GETENV4pb# DECC$GETENV4|@ DECC$GETENV4G DECC$GETENV4b# DECC$GETENV4@ DECC$GETENV4G DECC$STRLEN4@ DECC$STRLEN4G DECC$MALLOC4b# DECC$MALLOC4@ DECC$MALLOC4 G DECC$STRCPY4 @ DECC$STRCPY4G DECC$MALLOC4b# DECC$MALLOC4@ DECC$MALLOC4G$ DECC$FREE4b# DECC$FREE4 @$ DECC$FREE =0 ;7DECC$GA___CTYPE=0 0;=P @ DECC$MALLOC DECC$GETENV DECC$FREE DECC$STRLEN DECC$STRCPY= ==-%$ENVARGSDEC C V4.1-001v v= 44= __iscntrl4= a0$ $= 4: := (4= 0m m= 044= envargs04=  )  )  )  )  ) ) ) ) ) ) )\ .* C* C* E* E* )  ) )/ * * * * * )0$ $= 44. .=  /4=  = : := d4= d$ $=  count_args =  =  ww1lS#V1.0CCEXPLODEV1.029-APR-2009 07:19DEC C V4.1-001  $ABS$i$CODE$ $LITERAL$$LINK$$DATA$$BSS$@ $READONLY$DECC$GA___CTYPEGREADBYTEFLUSH(J`0EXPLODE HUFT_FREE HUFT_BUILD MASK_BITS OTS$MOVEMOTS$FILLOTS$MOVE =GkG;F!0@a/aK$Dk #&~@ "X^G`^4Gh~px޴>^~޵G {#G $ #$0!@@R HDG  D= #& #$01@! &],H! 0GBGb@ZkG0@G_ #$ #&! C& &01 @R r.rJR"UGGBGb@ZkGD!!H?" HD0 @@B0@GR@2AJT}"rB!1 @0@G?%1@ DGGGGGG@B"޶T"Hb"?"_"GGG@ZkG8DBb4G@ZkGG $ #$ & c&&1@0.0J"GGBGb@ZkG0@G_ $ & #& &!1@01Q.QJ1"4GGBGb@ZkGD!!HD H0@0 @@BQ@1!JT]"QB!1 @0@G?'1@DDGG~GG0b@B T"Hb@""GGG@ZkG8DpB4Gb@ZkB4Gb@ZkGdG #$ &'1@ c&0.0J"GBGb@ZkG0@G_ $ #$ & c&$1@0.0J"GGBGb@ZkGD'HDH0@0@@(@ P@0JT="0B'1@0@G&1@DDG@GGGGG0b "@BT"޶"s"Hb"GGG@ZkG8DB4Gb@ZkG $ $ #$ C&'1@!.J! 2GGBGb@ZkG0@G_ $ #$ & c&%1@0.0J"GGBGb@ZkGD'HDH0@0@@(@ P@0JT="0B'1@0@$1@GGDGDGGBb4G@Zk $0b 0s"GRHT"PD@""0b GT"s"""@BGHbGG@ZkG8DBb4G@ZkB4Gb@Zk}G G( GG ^ '( ,4GC0 =4=]8]<ݰ04=SAT?A3aJ4JAA@8]DH<ݠU_A5JV@6JAA֢LPݲ@A #$ #&! C& '01 @R r.rJR"XGGBGb@ZkG/I ACAE?0/I$1A@6I'5@G #& c&1 & &21 BS .J"GGBGb@ZkG0=(I@C@E?@ AKXj@Zi #& 4G9,4(D% $=G_1 B @Zk0tBb@Zc G1G@A&&)G@Zk$&z$ 4GBb@Zk  %" b#O@G $$G4G_G ](]0}8@HP`#kB %b4G4G@Zk G & !_ #& c&q C&=" RG[4GGG@Zk &G D P.RPJP>"b#@ #$ $5B #& c$b 4G@ZkG ᳼G#4Gbb`-x_);}2 / ,=GGbv#&5ue?8F0* #$8$@zk GTV&{$b@ZkGokWk0Ef c$@~LC *\9KDD] GT*#FNiE*KfGP~5lB@\OBaGnEG]A(wwk$@#kVCc"±h]G-G&qRX|3J< <$&(Y $yAv@7xZhgr"5lxf~a_!wpJxUoG DTmB$qHE& w&Q J(s vX8 EiS!FZOF[@VwNTE^0"JSH@@C E 5W@J~RBqw3J52 URBZBVB0E_C7B?#J "O@hCշ;@ߡBOBR_ 1s+ha]'kh'8[7GpdqH~uW4IOd0eӀd㕱>ݐ޽CigGuo HGcG o K؛CgL ,$wy*dwu&HBH5ik. Ҵ &^lJbD *rW@d7\# ëFgR,4„=-$U1@OmvQ)BoFeK & / ԰Z.1*L BWb]r^i5B3Jd]$4M󤦋b+1G]ϳ-On{dZ#Prkb]AJod/ ̸ÜbUrG;Eo7TEO@ (.\ Li5d.`WZ!Oq ǵv9ʁ."& IJr*J@BeQ +aG/DD+۹+wfHJg hg"'&yؿF|U.|C D JN~ʖBFrFIHB HvPt9<o dO#DQD|zQa}ީ0Dc}LGaRF&FCB<:abQ V@&_&FS"]/BFfBdDf@ޱy0d+ l* G9@sC +G@~DtG[GϴJ*Fq@%*2-dct $BD*í@0D"oV_q^.Hsm)LDI@\4L i@wZBCg>D$B) OTWL\l/s碱 8D+@H%H4#J5A?D"H\HFnrwGfC4KGdwpFCæCDC)Q!J/G|eD[oRH@b@jO&?4@,j@˱ HJt[&s_EPBVB~D "xJs>#@TcXNiDW1 MD4`HH#JD#G?Bt%Ee!Q-dB@  AXB$CGe "D:O6#?8L n KDG*ICUB4'a'D ;jNEeFFz#Iѐ@FAz&E!H4$/%8LHuCN>@UBxZ`@BNC Nep @F `D G@Eq$A"@dMv#%`P1nJJDGIBSyFG8Es5LMal]@@FG uD_o#G$/%1",e>wD,FB$`HC7aHF,'EGV\[ew*(p;A"!k+CGl DQ p|OCDxCG$LAMLB(4Bc# DNdDpOCDpC@$LAMLA4+GAd DNFe cOCDsCD$LAMLA4~'G DS e DpCK$GRDE4Dc# DLdD e DtCD$GRDE+GA$ DLFvYGDwCF$GRDE` &Gp DNgv+BLMN01 !l@zhDECJ` FY8Z5BH EN! 0 pG<; 0=dUC@$}AMLOC 4?&wAECC$GA__`SYE=DFgU /OC-Z0< ;-eP@:%+DFCC$ A@LOc0DfC$NA\LQGGA;Dve V, e  DxCS$NR'f0 S_ iT~LwN< 0 DEC^TRc\% SiR: $rRE<- GENVRJv gbe4.1- 0y~< U+b3! p@dupKEC C V.-71w=  = Z_is5r ԬDECC$FfEA4& 4!b='$Nc_es[itrk _GS5MNVE?0)7)jeN% = (OSSMLbU= p p7$9`7P,V!(40- ;7?pEGSJTOSbCY^0+vaig00 044T= ;(C1) ieaV[c^xlil)) n Sk '* $-9+/  X4?m#._$A?ԏc JH*4n _) Yo* i1 `)eKI ~( ; #l( =3=s.57)8 mEMG$mA{LfC1wDUBB$SWf\EOh) 4'@x~N5C[EE  /SiR?O@y= = 0 4P: 94,=  get\_c~tab 4VD|DS\E4-0DgFRNiFAL KVzbPWPXAn]ebtCC$bTRCMY  U^DGURbIBPeT5 z>+#qw4GRdPEMEC K 4.i-00{K0>40409!f{::6 + jl44=d#= & %eZo |5r  , $9cB>?DXSL_DD0V5 24-{Po#49 !;3N9 0z x= 4=T*C0V=.-P15= 204AwS }8`a qyt\d]7ZLE$=#jb/~fpRL?  8)"$uInK$u< *pH$m$ : 7 ,b][-B,A f.-iArJ*4heML~_@K ,,T | $fJEPiY ,6 BHZ, \jMe2kAyN 4@CGlPHOyEoN.\Har_\AL+31 AmT]FGLM=,  +Iuq_ILd] M+'&%JQ(DZaM= ?OWS4FHxLP= ,#OGSMKV@ *O< 4 == ;Go9T ;*:)@ }/mJ$GGj8&~A X^wOd]4Gsuȴ6~>^~z {*kj3Rkf]~#0)@$@RHDD`G-J ) -" *88lF([&:Y+" c%)+0G lfsDSk)I9\k&!!'/+! M"&24KP($.OJ V"RGFBGL @tk:GD(H?2;<>HN"@4HuPKt`3 G\2h)5BsR#- LSBo &BG6FG]NbH) < ] JR uomd[b)s~ bBZkGP-G6ZaN [4!upec'V 05S@SCGc#$@Hk`D AW{AIU_Eo#'$1PMleGZ) 0AF BG|7c@S)^MJ(c1ѣ|!61Bl*sC^AoRE?"1B'1@sdSTRG1@԰L[`QB^WAGZsgT G |G0DC0AC"a2reHd" CWEJ"JT @(= s4834s(f@kA vLAfV $K1HLI?B H R*G @URPb(:8g[ V+*  /+hqhR 04qJ- l?ICO;To G-BFxGkCC1N ?k,H| @+EZ-7, )˖Zȸ K;ROf bZ!qr[ l. :!*9\!'t I|5u-:Lc-6 JIdu:cz#9'(K /; HV\#ƆԂ%ݖ*7s-7gaO nxa0TG R/bY_;!lu6; ӇB49EU~1h>73Wfwub YfP4 8"m2d HʤjDdVLH2ibs !C8iK<> (]f րc6> 12~g<^USaL>aa $`1b1 s( <@aa@M85e,V-&GmbE:u:0MI8 R@4 ^R). UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1_F,@KC@C2GDxDAG & #' C' #$81BZz/zKZ#ABGb@Zk G),I A CAE?OA/ItB &b"GGtG@Zk Go CH Gar<ݠ/I$1A6I@ #$ #&! C& &01 @R r.rJR"U GGBGb@Zk G)$I@ C@EP= 0`A0A?jE B &b"GGtG@Zk G H?C 4G%G#4G!4GGB &b"GGtG@ZkGG $ C%J,IGvIA*OA A$DA$@GB4GbG@Zk4G(B #$G ݡ GG$ݱ =(=},}(=0ݰ,}H?A(IDAHA$HDA480ݠ@@ H< @AC@ GA` & & & C'51B/K"GGBGb@ZkG( I ACAD?(H-1A>A6I$5@ #& c&1 & &21 BS .J"GGBGb@ZkG.I ACAE?0I0Ap@ P&?&r.R"tIESrJ &tFr> Bb"GGtG@ZkG8G'ICH,An0ݠ.H(1A6IA  & C& c& &11B2s.Js"v GGBGb@Zk G-IA CAE?@0A 0 A?E B &b"GGtG@ZkG 8C;4G!4GGB &b"GGtG@ZkGG %à c%k,I GvI @&fA ,A&@ &@ðGGB4Gb@ZkB4Gb@ZkGGX]`]h}pxݤ=]}ݥ#k4 GREADBYTE4 b#`READBYTE4 @READBYTE4 hGxREADBYTE4 pb#`READBYTE4 t@xREADBYTE4 G 0 HUFT_BUILD4 b#` HUFT_BUILD4 ,@0 HUFT_BUILD4DGT HUFT_FREE4Hb#` HUFT_FREE4P@T HUFT_FREE4 GREADBYTE4 b#`READBYTE4 @READBYTE4 GREADBYTE4 b#`READBYTE4  @READBYTE4 G HUFT_BUILD4 b#` HUFT_BUILD4 @ HUFT_BUILD4G HUFT_FREE4b#` HUFT_FREE4@ HUFT_FREE4G HUFT_FREE4b#` HUFT_FREE4@ HUFT_FREE4 8GHREADBYTE4 @b#`READBYTE 4 D@HREADBYTE4 GREADBYTE4 b#`READBYTE4 @READBYTE4 0G\ HUFT_BUILD4 Db#` HUFT_BUILD4 X@\ HUFT_BUILD4lG HUFT_FREE4xb#` HUFT_FREE4|@ HUFT_FREE4 GREADBYTE4 b#`READBYTE4 @READBYTE4 (G8READBYTE4 0b#`READBYTE4 4@8READBYTE4G HUFT_FREE4b#` HUFT_FREE4@ HUFT_FREE4 (G@ HUFT_BUILD4 0b#` HUFT_BUILD4 <@@ HUFT_BUILD4TGd HUFT_FREE4Xb#` HUFT_FREE4`@d HUFT_FREE4dGx HUFT_FREE4pb#` HUFT_FREE4t@x HUFT_FREE4 GREADBYTE4 b#`READBYTE4 @READBYTE4  G0 READBYTE4 ( b#`READBYTE4 , @0 READBYTE4  G READBYTE4  b#`READB_MR UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1FYTE4  @ READBYTE, G FLUSH, b#`FLUSH, @ FLUSH4  G0 READBYTE4 ( b#`READBYTE4 , @0 READBYTE4  G READBYTE4  b#`READBYTE4  @ READBYTE4 h Gx READBYTE4 p b#`READBYTE4 t @x READBYTE4 8 GH READBYTE4 @ b#`READBYTE4 D @H READBYTE4 GREADBYTE4 b#`READBYTE4  @READBYTE4 GREADBYTE4 b#`READBYTE4 @READBYTE4dGOTS$FILL4|@OTS$FILL4 GOTS$MOVE4 @OTS$MOVE,,GLFLUSH,4b#`FLUSH,H@LFLUSH,GFLUSH,b#`FLUSH,@FLUSH4G HUFT_FREE4b#` HUFT_FREE4@ HUFT_FREE4 GREADBYTE4 b#`READBYTE4  @READBYTE4 GREADBYTE4 b#`READBYTE4 @READBYTE,GFLUSH,b#`FLUSH,@FLUSH 4 GREADBYTE4 b#`READBYTE4 @READBYTE4 G(READBYTE4  b#`READBYTE4 $@(READBYTE4 GREADBYTE4 b#`READBYTE4 @READBYTE4 GREADBYTE4 b#`READBYTE4 @READBYTE4 hGxREADBYTE4 pb#`READBYTE4 t@xREADBYTE4 0G@READBYTE4 8b#`READBYTE4 <@@READBYTE4GOTS$FILL4@OTS$FILL4  G8OTS$MOVE4 4@8OTS$MOVE,GFLUSH,b#`FLUSH,@FLUSH,GFLUSH,b#`FLUSH,@FLUSH4`Gt HUFT_FREE4lb#` HUFT_FREE4p@t HUFT_FREE4xG HUFT_FREE4b#` HUFT_FREE4@ HUFT_FREEt t=0 ;7DECC$GA___CTYPE8 OTS$MOVEM8OTS$FILL0FLUSH HUFT_FREE READBYTE=0X 0;= 7G7 MASK_BITS; HUFT_BUILD8OTS$MOVE=` `=H@  !"#$%&'()*+,-./0123456789:;<=>?@A  !"#$%&'()*+,-./0123456789:;<=>?@ABAAAAAAAAA A  A  A  A  A AA     = ==-%$EXPLODEDEC C V4.1-001v v= 44= __iscntrl 4= 0$ $= 4: := (4= 0" "=get_tree = % %=! explode_lit = ' '=# explode_nolit =  = 04`4= explode04=(  \++ \++ \++ \+4 \++ \++ + + + + + `*- `*0 `* d* c* c*) h* h* i*& f*, + + `* c* c*1 h* h* i*. f*3 + `*H `* c* c*A h* h* i*> f*D + `* c* c*K h* h* f*H + + + + + + + + * *E + *@ *@ *E *? * * * * * * * * * * * * * * *| * *( *  * * * * *p * * * *  *  * * * * * * * * * , * * * * *  + * * * * * * * * * * * * + + + + + + + + + + + + +p + + + +  %+  /+ /+ /+ 0+ 1+ <+x C+ G+ +, R+ R+ R+ R+ R+xP$ $= !44. .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = : := 4= ` G UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1 ! =  ww#1 0]#V1.0CCEXTRACTV1.029-APR-2009 07:19DEC C V4.1-001` ` $ABS$ilN$CODE$ $LITERAL$$LINK$D$DATA$$BSS$ $READONLY$0TRUNCEAS8 TRUNCNTSD DECC$GA_STDINDECC$GA_STDOUTDECC$GXSPRINTF DECC$FGETS DECC$LSEEK DECC$RE$ADDECC$GA___CTYPE DECC$MEMCMP DECC$STRCHR DECC$STRLEN DECC$STRCMP DECC$STRCPY DECC$FREE DECC$MALLOC DECC$QSORT LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIG END_CENTRAL64_SIGG PROCESS_CDIR_FILE_HDR PROCESS_LOCAL_FILE_HDR OPEN_OUTFILE UNDEFER_INPUT DEFER_LEFTOVER_INPUTREADBUF%READBYTE SEEK_ZIPFFLUSHCHECK_FOR_NEWER DO_STRINGMAKEWORDMAKELONGFZOFFT8J0EXTRACT_OR_TEST_FILES0JP*FIND_COMPR_IDX0JX8F MEMEXTRACT0J0hIMEMFLUSH8JJEXTRACT_IZVMS_BLOCK0JLFNFILTEREXPLODEINF&LATEUNSHRINKMATCHMAPATTRMAPNAMECHECKDIR CLOSE_OUTFILE DEFER_DIR_ATTRIBS SET_DIREC_ATTRIBS CENTSIGMSG ENDSIGMSGSEEKMSG FILENAMENOTMATCHED EXCLFILENAMENOTMATCHED REPORTMSG GET_CRC_TABLECRC32DECRYPT0 TRUNCEAS0  TRUNCNTSDOTS$M'OVE =GkG;F!0@a/aK$Dk #G~X^`^h~px޴>^~޵GG¤ $ $(,0 Bb@Zk &$GGTG& fB?BBQF BbGf@Zk G TDGG& f& & 4GF"&SCP?BHBPb4G@ZkC&G(C QB(1!J0B@SB3aJF@B@0B(B4GCHBPbPB@ZkC&G,C QB,1!J0B@SB3aJF@B@0BB84!@GG_ABUBbuB &@BGGTG@Zk8BG@bG"tG@ZkGhBpb@ZkG &$(B0bTGp!TGR HC@Zk$ @ D$ &(B0btGpTGВJ@Zk$ @ D $ &(BGpTG0bJ@Zk$ @ D$  b#*@0AZG00A0U)4G#ïCGG &$ ! G_1aIBtGFBb0G@Zk&0@ `A@? G(4GD@($H 4G@$- GC && !G_F4HfGBtGTBb2G@Zk& 0`A@aA? ,GKA,+aI 4G @+ b#@0AG00@08]@!A 4@A8]O tG$}G %8]GxB &$&H1!J!"EEQE!F 8B %G@bGGtG@ZkCAD G 8*BG@bGGtG@ZkC `E4}G } %B %!/aH"bGA0AtG@ZkG $[GGG"G@ZkGBTG tG"b@ZkGG[GG"G@Zk$}UG$R $b % &$& "1"@_"@b#n@ӸB0k!bb"GGGG@ZkGGG"4 f% %k! &+& "1"@_"@b#T@ӸB bb"GGGG@ZkGGG"GG $b % &$& "1"@_"@b#8@ӸBk!bGG+GtG@ZkGGG!"G[G@Zk 4G@ % f% $kDH}LPݱPݡ$TCGT & F&} @A?@a!@@:@0 R0`B! &} & ' 2@EXA$AMBBw!vGbGGG@ZkGG[GG"G@Zk % f$ TGc8D10"GBTGb %X1"@ZkGG[GG"G@Zk $ $   & &&GQGGEA$A BpGbtG@ZkGGG[G",G@ZkUtGS %GGtG f%D6B F%b % F%@Zk _"BtG  %*b F%@Zk Go &$"`B!Jb"]1"bGGG@ZkGG[GG"G@ZktG G $ % F%+cAo@jG $ &$ &! && F& @ @#@1BBGbGTG@Zk $" f%Bk!hb"]1"bGGG@ZkGG[GG"G@ZktGGXBG8BG@btGG@Zk f$B %]-c! bhd"GGGG@ZkGG[GG"G@Zk f% k8ETG``` &$Bb$"aGTG@Zk f%GG[GG"G@Zk $ k`} G &= 0 &&B4G1 b@ZkG$`BGbGTG@Zk8B@bGGGtG@Zk f%,Bhd"kG]GbGG@ZkGG[GG"G@ZktGux`D` F%B]hb"JGbGGG@ZkGG[GG"G@ZktG^GBG.b f%@ZkG"`B $k ]81"bGtG@ZkGG[GG!"G@ZkGA %(B0bG0TG %bI0k!C@Zk A &@E  $ $& "1"@_"@b#@`b"BGbGGG@ZkGG[GG"G@Zk f$ %4G8B@b@Zk F%(BtG8JTG0b %!b*v@IC@Zk A &`E  $-& "1"@_"@b#O@Ӑc B`b"bGGGG@ZkGG[GG"G@ZkG % f$/ f%c ,!8B F% J!G@Zk( $ =#&k1"@_"@b#, $#@#&G1"G@_"@b#@ӸBGbGGGG@ZkGG[GG"G@Zk!hBG8E,$@Zk %8B f$4G@b,@Zkc, f%0k˒`I>` $ F%J(*AA % $ ` &#& E/ %b "1"@_"@b#@B %bG  B"GtG@Zk GBCbB"GtG@Zkpk!BGbGGGGG@ZkG f%0[GGG"G@Zk K8D %4G(Q(B0b@ZkGL`8`DDF)<f_AAAD KE@ & &$! &-& "1"@_"@b#@ BGbGGtG@ZkGG[GG"G@Zk} 0`A}&G %B %! &/& "1"@_"@b#v@ӸBJ!bGGGtG@ZkG A[GGG"GD@ZkGfDfcE`G_!!_ % GG $G TG0I4B ! bG@Zk &$- !?D* . ar UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1z01F& f&"R & J & F!@BU1"bGtG@ZkGG[ %GG4GG@Zk 4G.4E-,GpHA-H0D-<-.!-J? f& &= s & &FԡeF  %&3`1"G@_"@b# @!BGbGGtG@ZkGG[GG"G@Zk 4E_ G_, -,HA HpH!0D ? & ֦FFBbG4G@ZkDA A DD% D B & !bG4G@Zk#2'5@ G ơGAETDGGXF 8FC ØFX@F`LBF8@FC4GXABFDBG@Zk 1@98@ & # "( ,w"HC','H D* 7. 1@3JC.J F" ,W" 1@HC.JD." 1@JCP/PKF 1@`#" G7/7KC9,9H D 1@"@ $ `.`JxDD` &b $&! _ F&G2G@_"@b#M @GBGbGt3G@ZkGG[GG4GG@ZkxBGKTGbtG@ZkG &%B@%")TGb4E@ZkGGG[G4GG@Zk' & 7H)=I A&!#H'H0U!@ B 8\B(CkGhB""G@ZkBG@Zk6H 1@@ H."@J#XF /Y8K8? &%B%")GbGtG@ZkGG[GG4GG@ZkG &%Bbx%")GTG@ZkGGG[G4GG@ZkxBGK?"btG@ZkGB@Zk#H@ c$,c HXaD4` 1@.H@ .% ),A)H )<4Gd%"& B"b4G f$@ZkcU" &%B)!bG81"TG@ZkGG[GG"G@Zk4EBG ݡDZ} 0`A}:GE!b@ &% %)! &)& "1"@_"@b# @ӸBc bb"GGGG@ZkGG[GG4GG@Zk! @YADRD 4GGTG4G ` f%b#(@ F% AJ EJ!@T0ATPAAG $ % @eD=A$ CjA mE 5`B &$D=GtGb &%@Zk F%B % _" tG. $b $@Zk H0A @L}eG@} %C HBPbPA4G@Zk G"@BΡ $ b1"GTG@ZkGG[GG"G@Zk 4G8B@bp }@Zk = G } 8 F j7GCG,(!J(!J#uA A`GEA %HAEA7IA = B! =% ]R ]E ݢ֢ ݲ [A ];aK0A[AA[ 6 BPbGbGG@Zk GC-NAXB.I`b4GNAΡG@ZkG $" f$Bc GNX1"btG@ZkGG[GG"G@Zk 0A$=$E$=8BG@b4G 0`A@ZkoA8B@bG4G@Zk<DDC` $"B %!b1"GGtG@ZkGG[GGGG@Zk@=(ơC0* C G'G(OA*I"tG@OA $B/Ib f$ Ac MG@ZkGG[GG47GG@Zk$$!xE$ 0`AlA8B4G(@b@Zk,ݡ+% FGC!@ =,}O@-I8"tGm@c`O@ $B/Ib $A HG@ZkGG[GG"G@Zkf0@@8B,4G@b@Zk4 "TG$ %B F%ΡJ!bG@Zk %GG[GG"G@ZkBGTG"b@ZkGG[GG"G@Zk$}$4E$}<DG$} "$@` &% 8`EBB!)@!b % 8%jE!nh1"GG@ZkGGGGGGG f$" %B %c!H1"bGtG@ZkGGGGG2Ô F%0ݡ f%" %@JAMDBk!b1"GtG@ZkGGGGGG %"8DBPb !b &% %E)!O1"GGGG@ZkGGGGG[G %PB!@Zk!0 f%"k!GC0]8DBDb1"GG@ZkGG[GGGG@Zk] %"P!C 8@F BΡ $9,Eb 1"GGG@ZkGG[GGGG@Zk4G$]0@=@AC oE`tE$}=@A TG@D$=0=@A4GC E@$]$ݠA$E4D$$GX]`]h}pxݤ=]}ݥ#k#~^^~ (0޴8@HG{#G $ #$h! &H(!0D0D1 F F $(! #$h!H(!D@Q F0D@ F(! $ #$h!0D(!0D WH F F $(! #$\! #&: $ #$@10H! <5B  $?"(F(G #&1(1V H!D0F0wJ0D(1 &(D( #$D#@_"hb#<#аHHXF]@5?Bm?@?@F) & $ !F &" && "1" @ #$ B(BGh!0"޶8 TG޶ H0bG'H0D10B2NGv J0F40BBSB!3@GGGG@ZkGGG"GG<àĐHD &@@@2@D #&D &%& $ "1"@_"b#W @;GhƤ8 "(b"(BGƐH޶G޶H0bD0BNGvJF4BBRB5@GG@ZkGGG"GG $pƤ&vH=@DFY@D䡽@A XB & #&  G@Zk0@B4GbP!@Zk & #$, $&1"G@_"b# @G(BG0bGtG@ZkGG[GG"G@ZkG %BG,@ZkHB $PbG $@Zk %d $4GPu<CD#GB?@B2F0Di p g GTB4J@<F 0`BUB5J@F0`BVB6J@֢F0`BWB7J@F 0`B8aJYBC9!K@9&G0`B % c'G!3@ &@(& "1"@_"b#@8"G@'H(B@ 0b'@GaGGG@ZkGGG"GG $ $ &&& % "1"@_"b#@p (BG0bG3vIGG@ZkGGG"G[G@ZkGG]]} (0ݤ8@HP#kG0;Gp! _Q@1!J1@10F 0@Q@1!J1@=10F 0@Q@1!J1@10F 0@Q@1!J1@10F 0@1HR@!B?2AJ2@!0D 0@kG#4G~@_"^^~ (0޴8@H>P^X~`hp޵xG{#GG $ & $b# $0 #$D< #$ $ B &&& "1" @ B!(b " "GGGGG@ZkGG[GGGG@Zk&G`B $hb @ZkR?&s $G0@Bs"45FvpBxbGtG@Zk $ %GǰD #$G!GtG7 pBxb@Zk @D /=1< #$D &'&E, $ "Ơ1"@_"b#*@ #! "h 8 D G #&B"1Hb"G(1 F3F "" B(bGFGGGGG@ZkGG[GGGG@Zk@BHbG@ZkG E<àD #&E@"@@0DD "0" B C&uF(b P"Gb6 UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1?@GGG@ZkGGG"G"G $E $ 0 H$  D &&& G "1"@_"b#@ Bh (bGGGGGG@ZkGGG"G[G@ZkG< $D# &'&%E, $ "Ơ1"@_"b#@ !"! " 8D G &""HB"G(FFc " B"(bGtFGGGGG@ZkGG[GGGG@ZkpBxbGB!@ZkGDDo<à# &@@!!I@2F0@D@ ?A""0B c&8bD & GGGGtG@Zk0B #$8b G @B"GtG@Zk " "0BD8b #& G G@B"GtG@Zk B " " >""G >G(bGGGGtG@ZkGGG"GEG0B %8bGGGbtG@Zk0B %8bG @B"GtG@Zk #$0BB!  $8bD G@B"GtG "!@Zk! &%&D G "1"@_"b#@ B`!k!> !޵" G >G(bGGGGtG@ZkGBGG"G[4GTDG@ZkGG%!Dá <c" $AAAE E xD` 01 B C%(bEJ!0q"GGG@ZkGGG"G!G $ % &$&! "1"@_"b# xD@0 BH!(b.EHl!GGGGGG@ZkGGG"G[xD GTDG@ZkG< %DC #%! &GE).&, "1"@_"b#@ c! ! 8`E` G % HB!G( EE " " B(bGDGCGGGGG@ZkGG[GGGG@Zk c%`Bhb4G0k % %!˒`I5aA@ZkG<E!DEC@"@A@EE xDq!01 B!E(b(q"GGG@ZkGGG"G!G¤ C% $J! &*& "1"@_"b# xD$@0! BH (bE@&!GGGGGG@ZkGGG"G[xD GTDG@ZkGGDáGBb@Zk % $ & "! %¤!,&1"@_"b#@ B` (bGGDGtG@ZkGG[GG!"G@ZkTG4G!BbG@ZkGG #%< C%),J *EQ Dc@@AeEE % $! &Ơ,& "1"@_"b#@ B (bGGGtG@ZkGG[GG"G@Zk¥ % B C% $ #%(bJ!D!,iGGG@ZkG %[GGG"G@Zk c%."kGTG( B(b@ZkGG[GG"G@ZkTGY $D@- %G8,vIA G@BGHb4EG.A@Zk@B GHb"4G@ZkCA@<5A+A ̍#\`孻m!翳#B`徚m!翋#`u<5A̭ 翳#羚 #)G'éA @B"Hb4G G@ZkD 0B"8b4G*A@Zk DDGGåA'-"4G G'I 0B*A8b@Zk D˴DGGGGGG b#1@Gu8íA G'-@! G'I -GGGGG b#@ G#G0B"8b4G c%@ZkPB GXb'"2AGtG@Zk@E" #%F Bk!)(1"(bGTG@ZkGG[GG4GG@Zk,A,A@A@h_uG<c #% $)! &)&` "1"@_"b#@ BG(bGGtG@ZkGG[GG4GG@Zk C%"G BGJG(b1"G@ZkG TG[ @GGG4GG@Zk E<c $ &` %'&Ρ "1"@_"b#@"! BG(bGGtG@ZkGG[GG4GG@ZkG #%" BG)TG(b1"@ZkGGG4GG6GD"XE C% B(b1"JGTG@ZkG t?=GG4GG#ÈH" %(vI(1"E BG(bTG@ZkGGG4GGG" c%GkP1"GtG B(b@ZkGGG4GG[ G @G@Zk E<# %! & C%.&J "1"@_"b# @ BG(bGGtG@ZkGG[GG4HGG@ZkP^X~`hpGGGK GXBG`bG & '&0QG@Zk GHB"Pb4G&@@Zk '$ǰ & G& g&а &4G2 Gs G <A55ADǠ7,I TEI &BGנGG@Zk ''>GxB $b5A4G@ZkG(" $DǠxD0"0Q"2D8B %!@bG(q"GGG@ZkGG[GG"G@ZkxD GTD $("8B $ @b(1"GGtG@ZkGG[GG"G@Zk TG $ % $& $LGLGtG#`hBEpb@Zk DD'! G G%("8B %J %!@bH1"GGGG@ZkGG[GG"G@Zk TGG]G]} (0ݤ8@H=P]X}`hp#kG#HG~G^TG &GB G] #kG &AGGG@Zk & 7& W& &8C@BG]G #k#4G~^^ ~(08޴@HGGGBGbGG"@ZkD#a@M } }G4GBb"@ZkCdG8BB@b4G#D@ZkGG_áf@@G0D BGG@Zk<5@6U@ BIG]GBG R"@ZkGGGGB`G "91 CG ,H"%H!@%HCD'H61 @"6H7.7J"16JB1!JCD.uH HTJGF>#!BH91 Cx/ HG!1 @[xKx?#6H91 CG]G }Gpb# R"_(BG0b4GG@ZkGG]] }(08Nݤ@HP#k#5AJ~G^CGGGGG5@`5"p.pJG`CBwFvF.JFB8/8KBG&8AJ 8@#B1/Gs6KXKG?"p.V/pJZVKhBxvJXGV?G3AJ3@s"B`V/GsKZVKSGV? G3AJ3@s"B `6/zJY6K:G6?p.""pJG4G([8;"G@ZkG6/Y6K6?G]G #kG1GGG1 ]GG@ZkGk4c-R UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1 NOEG GET_CRC_TABLE4Fb# GET_CRC_TABLE4E@ GET_CRC_TABLE45GCHECKDIR 46b#CHECKDIR45@CHECKDIR4dGt DECC$MALLOC4hb# DECC$MALLOC4p@t DECC$MALLOC4GP DECC$MALLOC4b# DECC$MALLOC4@ DECC$MALLOC,=tGREADBUF,>|b#READBUF,=@READBUF4AG DECC$MEMCMP4Bb# DECC$MEMCMP4A@ DECC$MEMCMP<3GPROCESS_CDIR_FILE_HDR<4b#PQROCESS_CDIR_FILE_HDR<3@PROCESS_CDIR_FILE_HDR4?G DO_STRING4@b# DO_STRING4?@ DO_STRING4?$G@ DO_STRING4@(b# DO_STRING4?<@@ DO_STRING4?`G| DO_STRING4@pb# DO_STRING4?Rx@| DO_STRING,7G MATCH,8b#MATCH,7@ MATCH,7GMATCH,8b#MATCH,7@MATCH4AG DECC$MEMCMP4Bb# DECC$MEMCMP4A@ DECC$MEMCMP4AG DECC$SMEMCMP4Bb# DECC$MEMCMP4A@ DECC$MEMCMP4G(DECC$GXSPRINTF4b#DECC$GXSPRINTF4$@(DECC$GXSPRINTF4PGlDECC$GXSPRINTF4db#DECC$GXSPRINTF4h@lDECC$GXSPRINTF4GDECC$GXSPRINTF4b#TDECC$GXSPRINTF4@DECC$GXSPRINTF48G\DECC$GXSPRINTF4@b#DECC$GXSPRINTF4X@\DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4U@DECC$GXSPRINTF4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF49 G DECC$LSEEK4: b# DECC$LSEEK49 @ DECC$LSEEKV4; G, DECC$READ4< b# DECC$READ4;( @, DECC$READ4@ Gl DECC$GXSPRINTF4X b#DECC$GXSPRINTF4h @l DECC$GXSPRINTF,= G READBUF,> b#READBUF,= @ READBUF4 GL DECC$GXSPRINTF4W8 b#DECC$GXSPRINTF4H @L DECC$GXSPRINTF4A G DECC$MEMCMP4B b# DECC$MEMCMP 4A @ DECC$MEMCMP4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF4$ G@ DECC$GXSPRINTF4( b#DECC$XGXSPRINTF4< @@ DECC$GXSPRINTF4- G SEEK_ZIPF4. b# SEEK_ZIPF4- @ SEEK_ZIPF,= G READBUF,> b#READBUF,= @ READBUF4A G DECC$MEMCMP4B b# DECC$MEMCMP4A @ DECC$MEMCMPY4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF4L Gt DECC$GXSPRINTF4` b#DECC$GXSPRINTF4p @t DECC$GXSPRINTF<K G PROCESS_LOCAL_FILE_HDR<L b#PROCESS_LOCAL_FILE_HDR<K @ PROCESS_LOCAL_FILE_HDR4 ZG DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF4?G@ DO_STRING4@b# DO_STRING4?<@@ DO_STRING4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$FREE[4b# DECC$FREE4@ DECC$FREE4?G DO_STRING4@b# DO_STRING4?@ DO_STRING4PGpDECC$GXSPRINTF4Xb#DECC$GXSPRINTF4l@pDECC$GXSPRINTF4G DECC$STRCMP4@ D\ECC$STRCMP4G8DECC$GXSPRINTF4 b#DECC$GXSPRINTF44@8DECC$GXSPRINTF4`Gt DECC$STRCPY4p@t DECC$STRCPY4xG DECC$FREE4b# DECC$FREE4@ DECC$FREE,G,FZOFFT,b#]FZOFFT,(@,FZOFFT,0GLFZOFFT,8b#FZOFFT,H@LFZOFFT4PGtDECC$GXSPRINTF4Xb#DECC$GXSPRINTF4p@tDECC$GXSPRINTF,/GDECRYPT,0b#DECRYPT,/@DECRYPT40GLd UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1R]^DECC$GXSPRINTF48b#DECC$GXSPRINTF4H@LDECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4OHG\ DECC$STRCHR4PPb# DECC$STRCHR4OX@\ DECC$STRCHR4GDECC$GXSPRINTF4_b#DECC$GXSPRINTF4@DECC$GXSPRINTF4hGDECC$GXSPRINTF4pb#DECC$GXSPRINTF 4@DECC$GXSPRINTF,+G0MAPNAME,, b#MAPNAME,+,@0MAPNAME4MPGlCHECK_FOR_NEWER4N\b#CHECK_FOR_NEWER4Mh`@lCHECK_FOR_NEWER4)G  DECC$STRLEN4)@  DECC$STRLEN4XGpDECC$GXSPRINTF4`b#DECC$GXSPRINTF4l@pDECC$GXSPRINTF4CG DECC$FGETS4Db# DECC$FGETS4C@ DECC$FGETS4GDECC$GXSPRINTF4ab#DECC$GXSPRINTF4@DECC$GXSPRINTF4@GP DECC$STRCPY4L@P DECC$STRCPY4)PG\ DECC$STRLEN4)X@\ DECC$STRLEN4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXbSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4C G< DECC$FGETS4D0b# DECC$FGETS4C8@< DECC$FGETS4)@GH DECC$STRLEN4)D@H DECC$STRLEN<IGDEFER_DIR_ATTRIBS<Jb#DEFER_DIR_ATTRIBS<Ic@DEFER_DIR_ATTRIBS4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4hGDECC$GXSPRINTF4pb#DECC$GXSPRINTF4@DECC$GXSPRINTF49`G DECC$LSEEK4:xb# DECC$LSEEK49@ DECC$LSdEEK4;G DECC$READ4<b# DECC$READ4;@ DECC$READ4G DECC$MALLOC4b# DECC$MALLOC4@ DECC$MALLOC4G8DECC$GXSPRINTF4$b#DECC$GXSPRINTF44@8DECC$GXSPRINTF4hG|e DECC$FREE4lb# DECC$FREE4x@| DECC$FREE4GdG DECC$QSORT4Hpb# DECC$QSORT4G|@ DECC$QSORT<1GSET_DIREC_ATTRIBS<2b#SET_DIREC_ATTRIBS<1@SET_DIREC_ATTRIBS4GDECC$GXfSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4 G8 DECC$FREE4(b# DECC$FREE44@8 DECC$FREE4DGX DECC$FREE4Hb# DECC$FREE4T@X DECC$FREE4xGDECC$GXSPRINTF4b#gDECC$GXSPRINTF4@DECC$GXSPRINTF4G<DECC$GXSPRINTF4b#DECC$GXSPRINTF48@<DECC$GXSPRINTF 4G DECC$FREE4b# DECC$FREE4@ DECC$FREE4G DECC$GXSPRINTF4b#DECC$GXSPRINTF4h @ DECC$GXSPRINTF44 GH DECC$FREE4@ b# DECC$FREE4D @H DECC$FREE4` G| DECC$GXSPRINTF4p b#DECC$GXSPRINTF4x @| DECC$GXSPRINTF4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRIiNTF4$!G\!DECC$GXSPRINTF44!b#DECC$GXSPRINTF4X!@\!DECC$GXSPRINTF4!G!DECC$GXSPRINTF4!b#DECC$GXSPRINTF4!@!DECC$GXSPRINTF4!G"DECC$GXSPRINTF4"b#DECC$GXSPRINTF4"@"DECC$GXSPRINTF4<"G|"jDECC$GXSPRINTF4L"b#DECC$GXSPRINTF4x"@|"DECC$GXSPRINTF4"G"DECC$GXSPRINTF4"b#DECC$GXSPRINTF4"@"DECC$GXSPRINTF4,#GX#DECC$GXSPRINTF4<#b#DECC$GXSPRINTF4T#@X#DECC$GXSPRINTF4@&G&DECC$GXSPRINTF4d&kb#hDECC$GXSPRINTF4&@&DECC$GXSPRINTF4@'G'DECC$GXSPRINTF4\'b#hDECC$GXSPRINTF4'@'DECC$GXSPRINTF4)'G' DECC$STRLEN4)'@' DECC$STRLEN4(G( DECC$MALLOC4(b#h DECC$MALLOC4(@( DECC$MALLOC4lH(G`(DECC$GXSPRINTF4P(b#hDECC$GXSPRINTF4\(@`(DECC$GXSPRINTF4(G( DECC$STRCPY4(@( DECC$STRCPY,'(G(MAPATTR,((b#hMAPATTR,'(@(MAPATTR4)G*DECC$GXSPRINTF4)b#hDECC$GXSPRINTF4*e6ջ UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1Ϝlm@*DECC$GXSPRINTF4p*G*DECC$GXSPRINTF4x*b#hDECC$GXSPRINTF4*@*DECC$GXSPRINTF4`,G,DECC$GXSPRINTF4h,b#pDECC$GXSPRINTF4,@,DECC$GXSPRINTF4,G, OPEN_OUTFILE4 ,b#p OPEN_OUTFILE4,@, OPEN_OUTFILEn4-G- OPEN_OUTFILE4 -b#p OPEN_OUTFILE4-@- OPEN_OUTFILE<#H-G\-DEFER_LEFTOVER_INPUT<$P-b#pDEFER_LEFTOVER_INPUT<#X-@\-DEFER_LEFTOVER_INPUT4,.GT.DECC$GXSPRINTF40.b#pDECC$GXSPRINTF4P.@T.DECC$GXSPRINTF4.oG.READBYTE4.b#pREADBYTE4.@.READBYTE,!GL>DECC$GXSPRINTF48>b#pDECC$GXSPRINTF4H>@L>DECC$GXSPRINTF4>G>DECC$GXSPRINTF4>b#pDECC$GXSPRI{NTF4>@>DECC$GXSPRINTF4?G$?DECC$GXSPRINTF4?b#pDECC$GXSPRINTF4 ?@$?DECC$GXSPRINTF4T?Gp?DECC$GXSPRINTF4X?b#pDECC$GXSPRINTF4l?@p?DECC$GXSPRINTF4?G?DECC$GXSPRINTF4?b#pDECC$GXSPRINTF4?@?fϰU UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1kv{|DECC$GXSPRINTF4?G@DECC$GXSPRINTF4?b#pDECC$GXSPRINTF4?@@DECC$GXSPRINTF4h@G@DECC$GXSPRINTF4p@b#pDECC$GXSPRINTF4@@@DECC$GXSPRINTF4@GADECC$GXSPRINTF4@b#pDECC$GXSPRINTF4 A@ADECC$GXSPRINTF40A}GLADECC$GXSPRINTF4@Ab#pDECC$GXSPRINTF4HA@LADECC$GXSPRINTF4pAGADECC$GXSPRINTF4Ab#pDECC$GXSPRINTF4A@ADECC$GXSPRINTF4AGADECC$GXSPRINTF4Ab#pDECC$GXSPRINTF4A@ADECC$GXSPRINTF4BG8BDECC$GXSPRINTF4~ Bb#pDECC$GXSPRINTF44B@8BDECC$GXSPRINTF4pBGBDECC$GXSPRINTF4xBb#pDECC$GXSPRINTF4B@BDECC$GXSPRINTF4BGBDECC$GXSPRINTF4Bb#pDECC$GXSPRINTF4B@BDECC$GXSPRINTF4 CG(CDECC$GXSPRINTF4Cb#pDECC$GXSPRINTF4$C@(CDECC$GXSPRINTF4lCGCDECC$GXSPRINTF4tCb#pDECC$GXSPRINTF4C@CDECC$GXSPRINTF4CGCDECC$GXSPRINTF4Cb#pDECC$GXSPRINTF 4C@CDECC$GXSPRINTF4CGD UNDEFER_INPUT4Cb#p UNDEFER_INPUT4D@D UNDEFER_INPUT4@DG`DDECC$GXSPRINTF4HDb#pDECC$GXSPRINTF4\D@`DDECC$GXSPRINTF4DGD UNDEFER_INPUT4Db#p UNDEFER_INPUT4D@D UNDEFER_INPUT4 csize %s for STORED entry continuing with "compressed" size value =nf%s %s: %s bytes required to uncompress to %s bytes; %s supposed to require %s bytes%s%s%s  X =PAwarning: cannot alloc memory for dir times/permissions/UID/GID  =PD%lu file%s skipped because of unsupported compression or encoding.  =h^bad extra-field entry: EF block length (%u bytes) exceeds remaining EF data (%u bytes) H =PB error: unsupported extra-field compression type (%u)--skipping  6=H@ abI I=1) compressed EA data missing (%d bytes)%sU U==5 compressed WinNT security data missing (%d bytes)%s= ==-%$EXTRACTDEC C V4.1-001v v= 44= __iscntrl4= e0$ $= 4: := (4= 0e e = "044=#extract_or_test_files04= + + +  +  + +  + + + + +! + + + +  + + + + + + + + + + + + +  ,  , ,! ,! Q,  u, x, y,, y, {, ,0 , , , , , , , , , , &, %, %, %, %, $, 1, 3,  - , , ,  s. t.  s.   s. ~. . . . . . . .hE&HgE `O/Aykaxf M;,vrFEͧL5$DoWP*4jeI@Ciw|+3,ɦV>ͅ9LfȗdzY YEՋE/קIL={!@YmxpO S!@bB'h_N̽EG9l;gloMBZ4ffl 1rDchjx?TJm!ʷ<~&1r 'HCa\CM!Z 7`)QPg6.IN)v*VpV!ǁ0krej[gphoz/){sjk>#D^vZgjq D4.SMS6? W1C'l`5K$EPӲLF\Ffg ЧG޺A'dvM=RmM-5EzeXmgblanHm6L] mFVq$a1S5x9eGnܖcR~C5+"gΪ !x23[u3i{l5>N@ OA҂?o|". ,B$Bg1e=GZs>eөoQTr;K+1%l5AݦgbI#Q5d*0 A)5|/G3n[eVbk1=Pj#$>FaP7qG5tXZڰ U aMV\9#"bgI{l JK^oCh^_#IWdG [#t=1}mWc#,:]T@ǼG1 @K=3nvpIG&| s^ yKe@̥~$SQGt^GFnB[(5.H+FI5'_Ut۲+=W:6ŃVQD8}8fYpPlO:LFI òm]ua-_=߸G No+I7N˯l,ϟSOɺmT-ov!d&tPi%3"&!d n4_Jcv7G#u$i!4o5PwJ$:a>b$flJMNdgnjWolB⬁.t(/d{O2|ZO 7Na&G>.5Q1a3kA7X5ܥvff,_d@X6%:PwrS`P,w_ȁxk)hsdf8r0@@wq[LsqmA=9ץ;*d2%_j"!φO9Ol nCa s3-[G.V|NXJT$Mvs1kXt` Ee fkXReУ.F$Ds'f aTq$'%ҡ`4Nwwdd"{ؓzs'5 @W84E}*$ĤtCB ~Q p:'$&Vzqcg@ZM6`<Ÿj1ǺRaRq2LfGvu4pDf-B%\Mн]8V@] J޶kW%(#sr, RuTx#ϣA׹9?"iRS]Z9bTmZ` )K665'VL;z| pI;,tU,(fq;_P4j?d$g7C**$&ZiJ] uZ=+6aT;QD|E[!VƨS=aYKMw=й(^A(с<+B?j*Ԃ#S uv=E41&.c@6\-O;\c9@h[c;7eLƠtDfQm(bt TAq4~U& Sו-]g 3UQ--b֎pi}(ߧmSc>mLJȓt`XP U`"q2_OB@x^`?[|_+TBO -Aܕ+O!iEng-M[<v@J^?aۂLElͨQsUEqbcAMFc@G`,tWʂ9e4&nkeQMpW1c^B(lpZҽ:c^;%-/#xiS S(x+#/rRo : :Z4D`B^ )D;].3Z11Fڀ!eh*JDZgs,.:,|LJNWuQGgNx Vt S,w'aNOz0RJjhqŚ eݾin\H5Sa\zF :E枕s6A sgq;'Vaj9on8NovQtDn;;@ yw`bnfG63ȫ \fsn)`Hٰ1Z/#݊a3i#+)@^gӼRb-ےS׭G  s&+,snKаt.]6zKGol\M1pnMJgwrS|˧ s!FdNd&W3R,~rL598Лʺnz 뤼-9j1Cj!"dIZBjƋpŬ69αߕ`U:0ӚFޖh%G*Xok)Je6耿 6WOH),ʨ$ ؗh3+0^pjP6L 2b5ȸڥ01jzJN؄hId2D S"~r.Mke^ecz[v|O1 &_KB /P=P 3N3?RFLZ"lcs\>AmeFvUb_lJ_} `5Ow:  ˼FQ|!\`FW#1i*&ըOgu{;,1^ Iq'xZqt^)e4Mk((r2k=WL<#I^VS^w&|l$UԷьsPBp:oҝyL-g]Ӿ P^vG(, NlW_kC3Itd/#EYtIحj]KOӝW7 2'^ uFO$stFX)  `___{Uؔb)c xMl,m"~R!a +Հzm3*$@ѫ]kUVpBOS7i[DI&(E'>#:dn$3>|B3D&M9b溾CL9Y %`@k%a]B dv\*~Oj?v B|/lP3W @c =ldA{Xc pIyzQ?19-5zbQV&1iQ~>pAvceke)Ga9f(%yQ9Om j=6sT%B *![o{V11fH(,LcօMZ:]kbO}@eWխF:AFJ w!-9s!3t7< K)i](ca> Pw}y@)Y9s Ag2ZE u޷aaQ'ɠ l4}r Xi W UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1Z .  .  . . . . . . . . . . . . . . . . . . . .  . . / / / / / / / / /  %/  %/  %/ // 3/ 3/ 7/ @/ @/ D/ D/ E/ J/ Q/ S/T [/ [/1 / {/ t/ u/ {/ / / / / / / / / / / / / / / /-ȁ / / / 0 0 0 0 0 0 &0 &0 )0 +0" [0 [0 [0 [0 50 / / / / / /z 0 0 0 r.$ , , , , , , , , , , ,; , , , , , , , , , , , , , , , , - -P - -  -   - - !- ,- - 3-T 2- J- K- Q- R- T- Q- R- [- [- [- [- _- a- a- a- e- o-; o- o- v- y- |-P$ $= 44. .=  /4=  = . .=  /4=  = . .=  04= . .=  /4=  =  = . .=  /4=  = . .=  04= . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  =  = : := $4=  $ = P$4h4= store_infoP$4= -I -I - - - - - - - - - - - - - - - - - - - - $. $. $. $. ,. ,. .. .. . .9 .: .: B. B. B. B. B. B. . . . .8$ $= $4. .=  O$4= . .=  O$4=  =  = : := *4=  = *4P4=find_compr_idx*4=E=< C. B. B. B. B. B. B. B.$ $= *4: := +4= 3 3=/'&extract_or_test_entrylist =  = #+4p4=$extract_or_test_member+4=z 0 0 0 0 0  0 0  0 0 0  0  0  0 0  0 1 1 1< 0Z 0Z 0Z  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 )1 )1 )1@ 0| 0| /1 11 11 11H 11  W1 W1@ 0 0  ]1 ^1 ]1 _1  _1 _1 _1  a1 b1 t1 u1 u1 u1H u1  v1   1 1 1< 0 0 1  1 1 1 1 1 1 1@ 1  1 3 1 1 1 2 2 2 2 2 2  2& ?2 ?2  Y2 c2 b2( 2 21 2 2 2 2 2 >2 >2 D2 G2 2. 2S l2 2 2 2 2o 2 2  2 2 2 2 2 2[ 2 2 2 2 2 2 2 1P$ $= +4. .=  +4=  = . .=  +4= . .=  + 4=  = . .=  +4=  =  = : := D4= H( (=$TestExtraField =  = D44= test_compr_ebD4=zrq 2 2 2 3 3 3 3 3 3 3 3 30$ $= D4: := F4= X = 8F4X4= memextract8F4=# *3 *3 *3 *3 *3 13 23 :3 =3 >3 ?3 :3 43  E3 L3 L3 N3 M3 N3 d3 e3 f3 g3 i3 l3 m3H$ $= @Zk #$ & !`B C& #&hbҠ G@ZkPB4G Xb@ZkBGbGGGG@ZkGG[GG"G@Zk4GGG]]} (0ݤ8@P#k $! B & &  @&1B!!B @& &1k & $k $!0@B  $ &! @&1 `&0@2 $10B3G @& &`11qB k#~^^ ~(08GGGG0G & %& _"tG0B $ 8b@Zk %& %$ & E& &1& "'3B4 &@B &բGGCG6GG@Zk %$ $B6B$@x@G]] }(08@#kG= $CG & "PB"GG@ZkGG[G@ZkGG#~^^~ (0G{G $ ð@ #$ 1@ᳰ G #$ $! _"tGJ pB #$xb!@Zk &G0  l #& B"G`"G@ZkGG[G@ZkB4Gb4G@ZktGB4Gb@Zk $ #$! #& c& _" &1@0@4B  &â & ' #' C'B7Bڲ c' C&R @ c& #&s1 &(sG%1 B` 0BG8b@Zk$,4G$. B$H(bQ$J DrH2F$>d.dJ@ZkG %1@ #$ &! #& c$!1 @1p.P"CpJG]]} (0@#kG#? ~G^^~ (0G0{G $ " (bBD%@@ &PB #$ $Xb @G@ZkGG[GG4GG@ZktG7 #$ &!GGtGD 0B8b $@Zk #$B #& _"tG1b@Zk #$GtGG & #& C&%@BG c& &s & & c$3tBB$dBBGG]]} (0@#k#~^^~ (0޴8@H>P^X~`hGGGG 0DG$BGBG G DrGXbsD C&R@ f."pJXF,TGaFJ0@@HD< hBx"pb#"TG@Zkx# &DG!Q @x#ATG4G=HBPbTG@ZkGB4Gb@Zkt #$ c& &|#!GxCtG0 B0 @3 2B|#@t"4G[1"@Zk D4G4G(B0b@Zk(B0bTG4G@Zk HB,TGPbTG@Zk4GB b@Zk %t#A P MG(.(JX!F 4GxBGb@Zk -IDG#C0 B# 2B4 F c&+@| &s Gxâ8A0B0`Bw B|B 0Cb8""GGGG@Zk DCB %b $G4G@Zk4GdG"4GtG[1"G@Zk!A0@G5(AG1Bb8""GBGGG@ZkDC&4G D4G(B0b@ZkTG(B0b4G@Zk8""B GbGG@ZkD C B4Gb@Zk- c$IU@ðGG]]} (0ݤ8@H=P]X}`hp#kGGkG#TG~^^ ~(08޴@GG $= ]GX"" (B0b@Zk(B $tG@=0b@ZkHB4GPb@Zk G8BG@b@ZkGD8*D8.D$D 泵!@ U!@ @aF?G8BG@b@ZkGh"(BTGD0b01"@Zk4GHBHPb@ZkG4G@$,$H xBb@ZkGD8DBGb4G@Zk $4G ]@FD@|G]] }(08ݤ@P#kG#"~4G^ ^(~08@޴HPGG]G }TGo*`B/b@Zk0"GPB@_"GXb%&1"tG@Zk%&PBG1"Xb@_"tG@Zk0Bp!8bGGGGG@ZkG G"G#1`@oG" B=tG ](b@ZkGpBxbG4G@ZkGG}!G,HoDGG] ](}0 =8@ݤHP`#k#4G~^^~ (08GGG0B`b4G8b@ZkXE" #$B & b1"@B"GtG@ZkGG[GG!"G@Zk BtG(b4G@Zk`E"`B $B $k' UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1cb` 1"8R"GtG@ZkGG[GG!"G@ZktG B4G(b@Zk`xE"BtG e$B $bc 1" R"G@ZkGG[GG!"G@Zk BtG(b4G@Zk B(bG4G@ZkG]]} (08@#k#~^^ ~(08޴@HP>X^`~hGGGG`GBü׀@?`\@CkC¤$ G#B $F`b#G_ &$ G!0AI@ G#j@0@GA.RAJA>','H Gh.hJaF `.!JF.!JF(/ ,(K@ Hp)K!D <(.)!(J?. f&DTJ>sG 0JF (ӦXFF 8F@FGFxGXF43 "90 f'{[.[J+G;.;J 0F .JF4C,HGG{.vHS{JvF{>[/{#[KPG@.JF0C/KGG.rJUJF>-{#I & f&3!G4." 'Jh . GGuHJxF H.H#tGRHJq:KUFH>.!TJF>2xF*`'," 4G7HX!D , .HUJqHF> G!D .'#JXFG/. "GKWJxHK F>!,.HUJaHF>.{JTJF>!3 A&C`"WB 'GxGG[GA@Zk &$"AG`Ea1"G[GtG@Zkg- gI &$CaC( AC[GGGG@Zk jE_GtG2 $ &&g1"GG[GG@Zk&G"!h@"B i%b $k 1"GTG@ZkGG[GG"G@Zk*@4GG G¤G`b# % !G_tGG)aH $ @ $؀D e-KeI e= 0J ('(D F8CFXCF`EF@ FFx!FXF  ¦ &G ֢F8/8K0G`,HDB,HGG8-kHI8I +E8=,#H &$`bh"! G(!"D# .J@.%"G)!PJ4GJFB,HBb@ZkG,H'.rH Q'J2F'>e.eJ.VJ> & 'a@(H#Z#(GGF` Gz/ ,zK@Hg$HZ#Dp@ f&0B f%3!8b)&k1"G@_"tG@Zk@b BGbGGtG@ZkGG[GG"G@ZkGb# $ $ % $ %@$A@@_C¤4G &% PBXb@ZkB f%bG4G@Zk $ ""B %!bP1"GGtG@ZkG $[ $ &% f%GGG"G@Zkb#) k$@)+A$A@_G F%G `b#_tGpB $xbGTG@ZkG]] }(08ݤ@HP=X]`}hp#kG,0 0.H0J H vHDkG,0 0.P"p"H0,2JP. H1"J3HPJ!!H@0@@ HCk,0 0.P"p".H0,2JP. H3Hp"1&JSJp."@J.0"qJ2CJ4J1!JJTBQB!$H0B0J@@k#~ ^(^0~8@GGGG_"0JrDB@"@"" `D (B0b"H""TG@Zk"@""`"G(B0bTG@Zk(B0b"p""TG@Zk"h""G"G8bTG(B0b $@Zk0@pD #$XB &]@@`@`b`@" & $"="tG@ZkG ](]D@d@d@8 c$ 0}@P#k @GGGq/CG! qK1"PFOFC@tGu/uKGGs/vJ_F[sKvGs?_Gk#~^^~ (0޴8@GGGC¤GG0.#"F4GPJJF@B , H (B0b@ZkDGG#,#H$.D"f4GP2JJFtB.J(B0b@ZkD$,$HD#.%1@C #Jc  G_G]]} (0ݤ8@P#kG." =ƢPJJFB6/6K (B4G0b@ZkDGG,H$,"Ơ4G P0HJF@f.fJ`(B0b@ZkD @4DGd, dH @4DG43xG DECC$OPEN44b#  DECC$OPEN43@ DECC$OPEN<1GCMA$TIS_ERRNO_GET_ADDR<2b# CMA$TIS_ERRNO_GET_ADDR<1@CMA$TIS_ERRNO_GET_ADDR4/G DECC$STRERROR40b#  DECC$STRERROR4/@ DECC$STRERROR4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4 @DECC$GXSPRINTF4G DECC$READ4b# DECC$READ4@ DECC$READ4 G0OTS$MOVE4 ,@0OTS$MOVE4 G DECC$STRLEN4 @ DECC$STRLEN4TGh DECC$READ4\b# DECC$READ4d@h DECC$READ4 G DECC$STRLEN4 @ DECC$STRLEN,GECHO,b#ECHO,@ECHO4G RETURN_VMS4b# RETURN_VMS4@ RETURN_VMS4-G DECRYPT_BYTE4.b# DECRYPT_BYTE4-@ DECRYPT_BYTE4+G UPDATE_KEYS4,b# UPDATE_KEYS4+@ UPDATE_KEYS4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4 $G4 DECC$LSEEK4(b#p DECC$LSEEK4 0@4 DECC$LSEEK48G\ DECC$READ4Tb#p DECC$READ4X@\ DECC$READ4'G SCREENSIZE4(b#8 SCREENSIZE4'@ SCREENSIZE4% G, DECC$FPUTC4& b#8 DECC$FPUTC4%( @, DECC$FPUTC4!0 G@ DECC$FFLUSH4"8 b#8 DECC$FFLUSH4!< @@ DECC$FFLUSH4# G DECC$ISATTY4$ b#8 DECC$ISATTY4# @ DECC$ISATTY4# G DECC$ISATTY4$ b#8 DECC$ISATTY4# @ DECC$ISATTY4% G DECC$FPUTC4& b#8 DECC$FPUTC4% @ DECC$FPUTC4! G DECC$FFLUSH4" b#8 DECC$FFLUSH4! @ DECC$FFLUSH4)@ GP SCREENLINEWRAP4*H b#8SCREENLINEWRAP4)L l UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1@P SCREENLINEWRAP4 G DECC$GXFPRINTF4 b#8DECC$GXFPRINTF4 @ DECC$GXFPRINTF4! G DECC$FFLUSH4" b#8 DECC$FFLUSH 4! @ DECC$FFLUSH4d G DECC$GXFPRINTF4h b#8DECC$GXFPRINTF4 @ DECC$GXFPRINTF4# G DECC$ISATTY4$ b#8 DECC$ISATTY4# @ DECC$ISATTY4# G DECC$ISATTY4$ b#8 DECC$ISATTY4# @ DECC$ISATTY4 G DECC$GXFPRINTF4 b#8DECC$GXFPRINTF4 @ DECC$GXFPRINTF4! G DECC$FFLUSH4" b#8 DECC$FFLUSH4! @ DECC$FFLUSH4 G DECC$GXFPRINTF4 b#DECC$GXFPRINTF4 @ DECC$GXFPRINTF4 G DECC$GXFPRINTF4 b#DECC$GXFPRINTF4 @ DECC$GXFPRINTF4! G DECC$FFLUSH4" b# DECC$FFLUSH4! @ DECC$FFLUSH4 G0 TT_GETCH4 ( b#TT_GETCH4, @0 TT_GETCH4h Gx TT_GETCH4 p b#TT_GETCH4t @x TT_GETCH4 G DECC$GXFPRINTF4 b#DECC$GXFPRINTF4 @ DECC$GXFPRINTF4! G DECC$FFLUSH4" b# DECC$FFLUSH4! @ DECC$FFLUSH4 G DECC$TOLOWER4 b# DECC$TOLOWER4 @ DECC$TOLOWER4 G RETURN_VMS4 b# RETURN_VMS4@ RETURN_VMS4G DECC$MALLOC4b# DECC$MALLOC4@ DECC$MALLOC4GFNFILTER4b#FNFILTER4@FNFILTER4GFNFILTER4b#FNFILTER4 @FNFILTER4G4DECC$GXSPRINTF4b#DECC$GXSPRINTF40@4DECC$GXSPRINTF,dG|GETP,tb#GETP,x@|GETP4G DECC$FREE4b# DECC$FREE4@ DECC$FREE,$G8ECHO,0b#@ECHO,4@8ECHO4HGpDECC$GXSPRINTF4Xb#@DECC$GXSPRINTF4l@pDECC$GXSPRINTF4G RETURN_VMS4b#@ RETURN_VMS4@ RETURN_VMS4GDECC$GXSPRINTF4b#@DECC$GXSPRINTF4@DECC$GXSPRINTF4G RETURN_VMS4b#@ RETURN_VMS4@ RETURN_VMS44GXDECC$GXSPRINTF4<b#@DECC$GXSPRINTF4T@XDECC$GXSPRINTF 4xG RETURN_VMS4b#@ RETURN_VMS4@ RETURN_VMS4G RETURN_VMS4b#@ RETURN_VMS4@ RETURN_VMS4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$TOLOWER4b# DECC$TOLOWER4@ DECC$TOLOWER4hGFNFILTER4tb#FNFILTER4@FNFILTER4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4,G8 DECC$FREE40b# DECC$FREE44@8 DECC$FREE48GP DECC$MALLOC4@b# DECC$MALLOC4L@P DECC$MALLOC4`GDECC$GXSPRINTF4pb#DECC$GXSPRINTF4@DECC$GXSPRINTF4G$ GETZIP64DATA4b# GETZIP64DATA4 @$ GETZIP64DATA4G DECC$STRCAT4b#h DECC$STRCAT4@ DECC$STRCAT4G  DECC$STRCAT4b#h DECC$STRCAT4@  DECC$STRCAT4 G$ DECC$STRCAT4b#h DECC$STRCAT4 @$ DECC$STRCAT4HGX DECC$STRCAT4Lb#h DECC$STRCAT4T@X DECC$STRCAT4lGDECC$GXSPRINTF4b#hDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$TOLOWER4b# DECC$TOLOWER4@ DECC$TOLOWER4,G8 DECC$TOLOWER40b# DECC$TOLOWER44@8 DECC$TOLOWER4G DECC$TOLOWER4b# DECC$TOLOWER4@ DECC$TOLOWER4( G4 DECC$TOLOWER4, b# DECC$TOLOWER40 @4 DECC$TOLOWER =(xP\ x =5-segmentation violationillegal instruction\ \ =0 ;7DECC$GA___CTYPE=0 h;=mh5 UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1(P @ DECC$TOLOWER=0 ; ;=0 h;=P  DECC$STRCAT7G=16=.DECC$GXSPRINTF=d=ll=0 ;=0 ;=0 h;=0 X;=@< 0;@ DECC$READ8OTS$MOVE` DECC$STRLEN=0 X;=@< 7SEEKMSG7 REPORTMSG DECC$LSEEK=0 ;=p  ;FNFILTER= [ %s ]  DECC$FREE;  GETZIP64DATA DECC$MALLOC=0 ;=@<  RETURN_VMSECHO= bus error=0 P;=`| GETPG e5=0  ;=P| 7DECC$GA_STDERRDECC$GXFPRINTFTT_GETCH! DECC$FFLUSH= (=0 p ;=0 ;=p `# DECC$ISATTY=%.*s% DECC$FPUTC7DECC$GA_STDOUT' SCREENSIZE)SCREENLINEWRAP=0 ;=0 ;=@< + UPDATE_KEYS- DECRYPT_BYTE=0 h;=0 0;=P 7OPENR_ID=accP= ctx=stm`7ACC_CBp/ DECC$STRERROR 1CMA$TIS_ERRNO_GET_ADDR3 DECC$OPEN& &=8/error: cannot open zipfile [ %s ] %s 0=(error: zipfile read error P=8*warning: filename too long--truncating. =@3warning: extra field too long (%d). Ignoring... =@4%s: write error (disk full?). Continue? (y/n/^C) =0'error: zipfile probably corrupt (%s) =--More--(%lu)(=t--- Press `Q' to quit, or any other key to continue --- = [%s] %s password: = Enter password: =&password incorrect--reenter: =??'".^%So??YϾ󨷵ǎԐѥ噞ᅠƄФ瘠 =׃Ѫ++++--+-+++---+i++_̯յݯ=, , 4, , 4< <=,$#FILEIODEC C V4.1-001v v= 44= __iscntrl4= ~0$ $= 4: := (4= 0 = 04 4=open_input_file04=E=< C- C- C- C- L-0$ $= 44: := 84= 8 = h44= undefer_inputh4=e]\ v. v. . x. . x. . . . . .$ $= h4: := 4= p = !44="defer_leftover_input4=<43 . . . . .$ $= 4: := P4=  = X44= readbufX4= . . . .  .  .  .  . . . . . . . .+ ., . . . $ $= 4: := T4= xe e= 44=readbyte4= . . . . . . . . . . .X .Y . .t .Y . . . . .U . . .H . . .8$ $= 4. .=  4=  = . .=  4=  = : := ,4=  = X4p4= seek_zipfX4= ./ ./ ./ E/ E/ I/ M/ M/  V/  b/ b/ e/ e/ e/($ $= \4: := 4=  = 484=UzpMessagePrnt4= B18 B1 + R1& {1  1 1 1  1  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1$ 1  1 2 2 2 2H$ $= L4: := ( 4= pv v= p 4(4=UzpInputp 4= >2 $ $= p 4: := t 4=  =  44= UzpMorePause 4=ia` M2  M2  M2  Y2 j2 k28 m2,$ $=  4: :=   4=  = P44= UzpPasswordP4=zrq 2 2 2 2 2 2 20 2 2 2,$ $= T4: := 4=  = 4@4= handler4=ZRQ 2 2 n[ UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;12 2 2 2 2($ $= 4: := 4=  = 44= do_string4=LD 94 94BS 4 4 4 4 4 4 4  4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4N 4N 4M( 5 5 5 &5 &5 .5 .5 15 35 35 35 35  K5 K5 K5 K5 U5 W5 W5 X56 \5 X5 \5 \5 \5eD$ $=  4. .=  4= . .=  4=  = . .=  4=  =  = . .=  4=  = . .=  4=  = . .=  4=  = : := $4=  u u= h44=makewordh4= 5($ $= h4: := 4= ( = 44=makelong4=D<; 5 5 5 5 5 5 5$ $= 4: := 4= P = 44= makeint644=skj 6 6 6 6 6 6 6 6 6 6 6 6 $ $= 4: := `4=  = h4h4= fzoffth4=~vu !6  !6 06 06 A6 D6 D6 G6 J68 G6$ $= 4: := 4=  = 4P4= str2oem4=4,+ 6 |6 6 6 6$ $= 4: := `4= x = h44= zstrnicmph4=JBA 6 6 6 6 68 6$ $= 4: := t4=  =  ww1m#V1.0CCGLOBALSV1.029-APR-2009 07:20DEC C V4.1-001  $ABS$i$CODE$ $LITERAL$x$LINK$$DATA$$BSS$ $READONLY$ CENTRAL_HDR_SIG  LOCAL_HDR_SIG END_CENTRAL_SIG END_CENTRAL64_SIG END_CENTLOC64_SIGFNAMESUZPMESSAGEPRNTUZPINPUT UZPMOREPAUSE UZPPASSWORDDECC$GA___CTYPE0J0 GLOBALSCTOR0  LOCAL_HDR_SIG0 CENTRAL_HDR_SIG0 END_CENTRAL_SIG8 END_CENTRAL64_SIG8 END_CENTLOC64_SIG  G( G(  FNAMES OTS$MOVEMOTS$FILL` `=GkG;F!0@a/aK$DkG;GG0] &"GGG@Zk A& 4G"P", A'Ҳ0"a"! &z &@ !&H} a& A'X]G8GqSk4@G\OTS$FILL4X@\OTS$FILL" "= *@ @=0 ;7DECC$GA___CTYPE= 0 0;=7G ;8 OTS$MOVEM8OTS$FILL7 UZPPASSWORD=7UZPMESSAGEPRNT7UZPINPUT=p7 UZPMOREPAUSE$ $= $ $= $ $ = $ $ = $ $ = = = 46 = ==-%$GLOBALSDEC C V4.1-001v v= 44= __iscntrl4= X0$ $= 4: := (4= 0 = 044= globalsCtor04= *  *  )* -* .* /* 0* 1* 2* 9* 4* ;* 5*$ $= 44: := 4=  =  ww1Qv#V1.0CCINFLATEV1.029-APR-2009 07:20DEC C V4.1-001x x $ABS$i($CODE$/ $LITERAL$`$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPE DECC$FREE DECC$MALLOCGREADBYTEFLUSHMEMFLUSH0J' HUFT_FREE0JP HUFT_BUILD(J@XINFLATE0J INFLATE_FREE MASK_BITS0J0 INFLATE_CODESOTS$MOVEOTS$FILL =GkG;F!0@a/aK$DkP#~(^0^8~@HP޴X`h>p^x~޵GG =]}ݠR@ bS@2AJ3aJ &rAsAx '&odM UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1c &ӡ|1t ݱG %A( G & g& '&21BS1 &Q.QJ1"G0/   4G(BG0b@ZkG/  4GG/I !AC %AE?}<I EPBp@/0 J?FKCdD)2ACJ`c@cDcD6xlD $A|G ' G' g' &91C:{,H{#p(BG0b@Zk G-  -I !A C $A E_ D@$H<IdAED@A/0 J?FKCdDC)2Aô #A & & ' g'61Bײ8/8K# GG(BG0b@Zk G -I !A C #A E? P@0J<IݠpAK/vI##A f@EC A G& &R & '31@Bt@.J"GG(BG0b@ZkG/  /Ia@C f@D` ݡ ]m?s &"`HBPbGTG@Zk G8B &@b"GGtG@ZkG} C @ GT4GG4GݰG4G 4GG4Gݱ G4G 4GG '$ & $tx|'G(]0]8}@HPݤX`h=p]x}ݥ#kp#~^ ^(~08@޴HPX>`^h~px޵GGG# & $|РxG $ $$01@ $$!.J &! 0BGb@ZkG' 'H @CD0D%H&1@&"6H# G D& &R & '31@Bt @.J"G G4GZGBGb@ZkGg 'H&`@C& D?G#H & $&pD&Q@|аV`HxqXD@"GG" & '֢ $' $71B9 Y/YK9# G G4G(GBGb@ZkG( (I @C"DGD'H%@_"e" 2BH"` & & & D'51B /K"G G4GGBGb@ZkG( (I @C"DGD'H%@E" 0 BH#@G d& &s & $'41`B֢ `.J"ٲG G4G\GBGb@ZkG( (I @C"DG _"DAD2A'H8`FrF 4G BH%@@G4G<GC G3G" & '֢ $' $71B9Y/YK9# GGBGb@Zk G, ,I @ C"DYQA(B1!J"DQB'H1 0`AhAvHQ?B1!J%q@Bq7aI(sbAB+YA9!K= C `AYy2aIsbA 9Z_C[C@@:AK;aKY?C H9!K:@;@ @9@BB_ SA3aJ"C 0`AssbASB3aJBG ݲ !""tGtGGG@b#@ b#4E G8`E` c@G7G4GLA,I*A @C` G GL  @"G $& d&1 & &21 BS .J"GGBGb@ZkG . .I @C @DG =DR_B2BG@b#@ %<!nG4DGG 8D4G `G "[1"@Zkb#@ GGG $$G?Ap =">m"@"GG@b#a@!(A 8D< $EDg4EG G8EG 4G[ "G@Zkb#@b# G@G ]G=b#_Gb#@b#@ GGnR@ &"@BbGTG@Zk GB &b"GGtG@Zk G G G'HGH&@#1`@ % $% D%ṯx|ʰ GGG 4G GG $$8D8!G=" GGQQBQ1"p"Q"""VB G4GB"P#_p#`G"0B 4Gv!! G0!GB GGǰǰBǰ P!ǰ_ G 0BGp"0""" TB TBT#T"0#T "0Bp#T d% d$ % &@˱hc &l@"޶"8" ?"_"@b# %@ G8G=GG! G_G@!!(b d$ $$ %DCp &D!"<"s"GG@b#@ G $,! $8 d% b#@@ G8<GG $ % %8 $<-@Nb#DdN_ GGGTGGG] ](}08@ݤHPX=`]h}pxݥ#k#~^^ ~(0Gp{CG $ &"t $ C&| $! x $HP c&h2 C&!" &LR! l3 #&p4 c& #$8 &@ &<ATDGb #& $ C& &X1`s" &hr`3 \ C&l4s" #$pr & C&8! c&@ #$<dsDa"b#_ &=9 #&8 C&? c&@1 &<R & &H &DP5LVT ' #' C'8 c'@9 #$<Z $X $D! &` \Dd0 c& #&s &t1"TG`Bb@Zk ðB #$ &bt!"GtG@ZkGGG]] }(0@#kG#~^^~ G {Gb# $8 $<x@ $b#8t@ $ c$8<G]]G} 0#k#G~G^^~޴>p1J UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1^ ~(08޵@HG!]_"}BGG`GG(B "GG@ZkGG_5 ]"01B"Q?B1!JGQBq0`Bq FP G4G_[_C;aK[B{`0@CS_C3aJSBs`0@CU_C5JUB 0@C@_C H@B0@CBCP GpzB`PG_UB5J =tlUB41B@B H@B41BSB3aJSBs`41BUB5JUB41B@ 4G1I;J;JTCC7`5u`C AK uC @(`'GS_C3aJ0@CSB@_Cs H0@C@B33B[_C.`;aKsB0@C `B[BS_C&{3aJ@SB @ s0@C;AK@ @ uC@TC `G@_C H0@C@BTC  B @SB3aJTGSBS1:B C=TG~è41B}#P MCS:JLG}@C@4B[uB` zBuB` B7J`{#}BG[ 41B{#zB`(BP"?"G@ZkG_! H"P]" @@ HBQB1!J0BQB0BB}H" ="ZtAAQAڡP! Gݱ.1@AH GGG PA!@ݱ=}ӡG.1AGC@C0APc  ="zA HA`2HA G!I @@C6@0@ G;F 0 A7J7J !I0uB!.@5A B1`!1 @DQA @$#GĢ !@ VC%`6VCB B 0 A`D B@ @ 0 A`Ģ @@ 0 A@` 0 A2!I!@ PB_5A @G!@ @ 0 A5A!@] AAB@)HB;I0B#4GCG8bP@@Zk=" & Q@G}R@6IrB61BRE j UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1p#=0 ;=P 8OTS$MOVE=8OTS$FILL DECC$MALLOC=0 ;=0 7G=0( 0;= 7 MASK_BITS READBYTE FLUSH MEMFLUSH=0 `;= ;H;=0 X;=@  =PB  #+3;CScs66H=H: #+3;CScs66=(cc=(cc= !1Aa  0@`  cc6=D<     = ==-%$INFLATEDEC C V4.1-001v v= 44= __iscntrl4= v0$ $= 4: := (4= 0^ ^= 044= inflate_codes04= >-  Q- W- Q- Q- R- S- \- ^- ^- = k-C -  - ^-U ^- ^- ^-  o- o- o- o- t- v- v- y- y- v- v- v- v- - - - -  - - -j - - b- b- b- b-0 -P$ $= 4. .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  =  : := 4= 0( (=$inflate_stored = ' '=# inflate_fixed = ) )=%inflate_dynamic =  = `44= inflate_block`4=me /  /  / / /H / !/ / / N. O. c. d. d.D c. g.H f. j. k. j. i. t. q. t. t. q. w. w. w.< w. w. w. w. w. . . s. . . . . . . . . . . . . . . . . . . . . . . . . . .+ ." . . . . . . . . . . . . .s . . . . . . . . .  . . . . .P . . . . . . . . . . .4 . . .' - - - - - - - - -D -+ - -D -+ - - - - - - - -  -+ -+ . . . . . . . . . . . . . . . . . . . . . . . . . . !. !. -. -. -. .. -. /. 1. 8. 1.9 9. ?. ?. ?. ?. ?.L$ $= 4. .=  _4=  = . .=  _4=  = . .=  _4= . .=  p4=  = ` = . .=  _4= . .=  _4=  = . .=  _4=  = . .=  _4=  =  = . .=   4= . .=  _4=  = . .=  _4=  = . .=  _4=  = . .=  _4=  = . .=  _4=  =  . .=  _4=  = . .=  _4=  = . .=  _4=  =  = H : :=  4=  = X4@4= inflateX4=y 7/ 7/ P/ J/ K/ L/ S/ O/ Q/ P/ Q/ R/ Q/ R/ S/ T/ U/ X/ [/ X/ X/ Z/ Y/ Z/ [/ \/ ]/  v/ p/s  }/ v/ / ~/ |/ }/ ~/ / / / / /$ $= x4: := p4= @ = 44= inflate_free4=,$# / / / $ $= 4: := 4=  = 4P4= huft_build4==5 / /) /) /  / / / / / / / / / / / / / / / / / / / / / / / / / / /  /8 / / / 0 0 0 0 0 0Y 0 0L 0 0 !0 0 0 !0 !0 0 !0 $0 $0 (0 &0 (0 &0 (0 &0 &0 &0 &0 &0 00 /0  30  >0 E0 E0 G0 F0 H0 F0 D0 F0 D0 D0 N0 N0 N0 N0 O0reߎu UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1 ! S0 Q0 S0 S0 Q0 Q0 S0 S0 X0 X0 X0 X0 X0 X0 ]0 ]0 ^0 ^0 ^0 b0 b0 g0 d0 g0 g0 g0 g0 g0 0 0\ n0 n0 n0P 70 60 $ $= l4: := <'4=  = '44= huft_free'4=2*) w0  w0  0 0 $ $= '4: := (4= d =  ww#1͵~#V1.0@@LISTV1.029-APR-2009 07:20DEC C V4.1-001  $ABS$iX$CODE$ $LITERAL$@$LINK$$DATA$$BSS$ $READONLY$DECC$GXSPRINTFDECC$GA___CTYPE DECC$MEMCMP DECC$STRCHR DECC$STRLEN DECC$STRCPY DECC$FREECENTRAL_HDR$_SIGEND_CENTRAL_SIG END_CENTRAL64_SIGG PROCESS_CDIR_FILE_HDR0J0 LIST_FILES0J GET_TIME_STAMP(JpRATIO(JFNPRINTREADBUF DOS_TO_UNIX_TIME DO_STRINGFZOFFTFIND_COMPR_IDXFNFILTERMATCH CENTSIGMSG ENDSIGMSG REPORTMSG% OTS$DIV_UL =GkG;F!0@a/aK$Dk#G~^^~޴>^~޵GG#hb PTT# & "= @<0 #$8DXݰ\ `h*Xݠ`B $A`!P@hbPpG@ZkGGGGG c%Xݠ C%`BJ!k""@@hbG@`G@ZkGGGGG[G@Zk B 4Gp]c!x}(bGGTG@ZkGBtGx&bG@ZkBbG@Zk #$ Gp!u0B8bTGR HTGC@ZkG. Tݱk &4GB %b@Zk %0B8btGpΥTGΒIC@ZkG/ TV  C&# G8 CP !G_c4IpBGCtGtBxb 0A3@Zk#AA?G4GP #&P GC !G_C4IcGpBtGTBxb 0A2G@Zk#AA?P #& &X1 'P"h2!JF6CJ"J"J@v!J JJOF' TBaFFF 'F%@ #'GHb#J@9C C #KG!G9!C0OvJF)B G@BHGD @LvHD)@ c&B ¤4GpsbX 3v`JC@Zk`BGP?@ &@"@Zk3"@p֦ """tG2vJAF8AF `Bhb@Zk $h1JH7HpD@ , HrH2F,E&"@"TGG&"@"GGG`Bhb #%F!@ZkX #$ $)H@""10B8b!B"tG@Zk G0B 8bC@""B"tG@Zk #$`B &hb!G\(@"G(!޵G޵G"D޵$D G(G0~8@>GG@ZkGGGGG(0B C% $8b %JH""B"tG@Zk G %`B! hb(GGGEEGGG~G >tG@ZkGGGGG[G $ G@ZkHb#@TGp<0BHE8bCG@ZkGg!T0` #%hݤH)@hݴ`A`\] 0@A\] %GpTGI 0BC8b@Zk G`+!T} pݤ BG(bTG4@pݴx@Zk)tGG]]}ݤ=]}ݥ#kG %p G"$*AIp] $E C(1A EE# $`B #%)!hbGtG@ZkG c%[GGG"G@ZkG`BTGkhb"@ZkGG[GG"G@ZktG<b#`=Gh!{¤@ .CAIE.AMvHD&@ @BHG D  @ LvH D& @ "D@"TG(1"G "@"GG 1"G`B $hb #% bP!@Zk@""X*B"htGH!#0B8bC)!@Zk`G0B@""8bB"CtG@Zkk!\]@"`BGhbG 8@ELEG\GG@ZkGGGGG!h $0B""B"8bCtG@Zk\PB! H!`B $8E\}Ehb  GGGGG@ZkGGGGG[G@ZkT c%¥ $kGX"!/BxtGnEb %G@Zk@GxGtGDBb C%J!@Zk`BGhbTG" 4G@ZkGG[GG"G@ZkTT\+Tݠ=@AEtDTݰTGGGGG@#TG~8^@^H~PX`޴hpx>^~޵GGG(GB"G %$%!bG@ZkGBG4G@BGHbGGtG@ZkGBb@Zk %$ Gp! BTGbTGR HC@Zk G- G &4GPB %Xb@Zk %BtGpTGb͒IC@ZkG. G % E& G5 CG !Ge4I0BGEtG,tB8b 0A3@ZkA%A?G4G %& GC !G_E4IeG0BtGTB8b 0A2G@Zk%AA?G %& 1"F-PBG &TG@ZkC H@G@ $G`.K`JgIeE kE0JBb@Zk GG 4G pB %xb4GX@ZkA0B %&TGp1&J BCbG@ZkG/ Gr BGbGTG0A@ZkJtG_G8]@]H}PX`ݤhpx=]-}ݥ#kG %"-1A-vI % E$ = B %Ρ!(bGGtG@ZkG e$[GGG"G@Zk BGcTG(b`"@ZkGG[GG"G@ZktGG@BG"GHbtG $@Zk BƠ E%J!(bh"GTG@ZkGG[GG"G@Zk4Gg!xaEGGGGGG#G~G^GGG]G #kG&"B( TB(t.?"G@ZkG T6K0B(tBG@ZkG]CGG #kG T6K6B(tBG@ZkG]C7CG #kG!BBP?@G!W!H TpB6J(t!0@1@G@ZkCGG6B TAB(t6WJa!@6J!B0@G@ZkC8CG]G #kG#_&~R"^tG^~ GG {(B & #&0b "1"@Zk #$HBG!GG@ZkGG[GG@Zk $8""`G4GG[G@ZkG]]} 0#k4/GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF40G\DECC$GXSPRINTF4Db#DECC$GXSPRINTF4X@\DECC$GXSPRINTF, |GREADBUF, b#READBUF, @READBUF4G DECC$MEMCMP4b#s*d̳n=Pd3!h[]{?=RHfnH-@VὄS8"Ir>jPyҎ: $?khW! 7~ 0Ӯ= 0maQhw6b T9WmKif L TKzHbGZTLyg ^8OZga[\wB"0f?nwSl-'@\t1Ԥ<J(w5!Z;[tM`*KZK? #w !N€_eDsiba?u[53n<0=bz|mK`lv2Ze9DF@%dZ, Bӟۜb& wC ]yD~L:ZF Ҍ;FЛ#X2cAu262vP-MVL kx[k rX-D}n476Xc.̯ۚi꽴s'*fgt,ip]pd3W >*< p +oh[@li0 O0 Qlq(FZ]?`gJή%\i[%&P[&a5lGY8XKg.,kX t}!]-z+鹷 n`Oj{LH(-}I6&(hPw꛴_^S&cc+)5&c"/0G ҰAD,2\vЪ@m P@'xk1/ \VxA xVJ&NJ& O}fVa{謲nЅex-;jQ;ʛȣ,|kyCen_}#̼5ʓYLqyfZpa͌/ڙ{`>p 6>%6+voC;Fg0˄Jd?|!A\ Bhpw$^$Ȝy SuToS?~wETCNk1Ao3 .& c5@OQ _J!{1zʻ0f0!fde2|( |z8a{S:&@xt+]#{.juxf:wKB.v%!@#BGQ1`[lCWDɝ.C&M?=0H+[ e16*;S`VS8&U_^"|B[= ij&_/(_d^蹌e%L; 7NW R9%Rt})[/HAja_z|d ؍}oDN6|?LzMmH?R1"9}Ŕ|m 击ǹ(M+60e=至U#rlo*1PU`SF4 G aSA`窆)@.{He@x'1t/^q-םR,MC#T-:lfj-fcoLʕX -a{j07SѽH$p8iiWo -|bXNI4Dz)uEqϜo;#^>uG[H.dy&l벗}:r 2ReNjp"3\\ eD<]ܼ :a)Tn7"̝&K!d3~MuO]qzxWtOX哳æ;`:YcsNkn_cTj]^XJ[΀/_!HPI TZL;^J͈Q n{Q% Iy;GBʊd"Szx=$ ڣ&f z=1;Iw+rSZ/N&|K/!ÚOaC.pDWDA#hN-K8R%YN|6sy=RTptp#'#-D`3>[U<~-~S ̬ȸz l@N/U!4"PFK %2nFDKisVsK ޅ@xt-;뮭uÝ 0ѣl}IOwׅ-y&uaVS!3p:/VJ7!81]Ji3ǔa,,(kfF Mx.wgbgX^k`@j(̂#.Ygy츬6լz?qsIG/XjMzGr Հ,P Sm./3VBlPǗD7U+- |QCLRXa׵s}'U>R˸+;H5($eJ#9jcRͱ Y! pC^K2h/~3l_, 춖n&ë@zjw}5Fu;ud3oEӟVKԕ+53A⌸71r)/m7n4Ul ^P.SZE @goClC P\lSi ]󌢨F &M /H3(֞o:&3ץ Ka l%ao}a2MIq$N|E9`EDvY&o{ 0M]UN|0Tr2q=ba+H.XZ]Zy.;Z!ج#ij;b!S®́gw~)fC>8VLVKBDuEןJ:miMDtL w_#FqSA J!TDZ`q|d&Sm)M{l,'6 Y( oK'Zt"֜e!9b7:Pq.wN*?He|(ytKRJsGʾ^t`NXV fF-LaehfI.!`Əaŷ}9uM$F؄ⲗQ@)gVc%!2FHǭVIĤubq6?o9qHyRH\#<6c6ծ)ɓKSjlIrcDJ~?*)TrH wFIdUd\>e]1~4&3A!2hfuuH=@ DCqWڵ) 6R }qɲG$a猐LubpnQ"Y<Zxa90ں! ]<1CX__sCg N1.GbѩRB)#mqrBsF@o:n ,9>GSA@r4 o5\a3!t~^|T?fǖ-\;m7mrC4]%n Y܋}$k= Dط+11uOgmOs"'?HQ4)=Gh?ab-LDB 7$tn'rÎxMUtg&:28Qpt!@iErL۽NKIiA<>ْO$w;N\PR 0IWr[ahy'3%m={KHKdlѓo Z], {Nlю[!"|;LC=uOyUV.θ G,TA#P:e=ZEy/j]1 MNɠ&<-d\MOߢxcY7e+#r@ĸtm"Y \'oM)s.\g=خ (@3{Ph 9E\:i2K]}8UUQX]jkq_*"HһVbX 0. wtLQ13OJ<#M/aVYw%TJ> zQ4ǿ*OëQxc"޷ћq`~͔ Ԝq#Pu&Y s"-x҄IN|"@D˿kHǛΟ /kS,*%moypt@{ mQql@ȲW5KEX)IlpH6GPVx\`a3蕉oj la vLNQ̻1:!}StShC ӡG} r#&G$ӥB"[=YYdqetKóC4ӱ]M!뿽#_ [2=/b`[LK1"-ֲUF@H7ƻmSL+ Vu}.?(n /xtD-Id'tq%}݁ƜaNUظ[&/E7bgb N^ R߭PZ}(܂4`ilZ3.gQЩ2Oeȯf ?*z[ʻt UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1\/0 DECC$MEMCMP4@ DECC$MEMCMP< GPROCESS_CDIR_FILE_HDR< b#PROCESS_CDIR_FILE_HDR< @PROCESS_CDIR_FILE_HDR4 G DO_STRING4b# DO_STRING4 @ DO_STRING4,G< DECC$FREE44b# D1ECC$FREE48@< DECC$FREE4 DGd DO_STRING4Hb# DO_STRING4 `@d DO_STRING,GMATCH,b#MATCH,@MATCH,0GPMATCH,<b#MATCH,L@PMATCH4L2GpFIND_COMPR_IDX4\b#FIND_COMPR_IDX4l@pFIND_COMPR_IDX4pG DECC$STRCPY4@ DECC$STRCPY4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4,G@DECC$GXSPRINTF40b#DECC$GXSPRINTF43<@@DECC$GXSPRINTF,\GtFZOFFT,`b#FZOFFT,p@tFZOFFT,xGFZOFFT,b#FZOFFT,@FZOFFT4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF, GLFZO4FFT,,b#FZOFFT,H@LFZOFFT4XGDECC$GXSPRINTF4db#DECC$GXSPRINTF4@DECC$GXSPRINTF4 G DO_STRING4b# DO_STRING4 @ DO_STRING4 `Gp DO_STRING4hb# DO_STRING54 l@p DO_STRING, GREADBUF , b#READBUF, @READBUF4HGhDECC$GXSPRINTF4Xb#DECC$GXSPRINTF4d@hDECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF64 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF, G FZOFFT, b#FZOFFT, @ FZOFFT, G FZOFFT, b#FZOFFT, @ FZOFFT4 G0 DECC$GXSPRINTF4 b#7DECC$GXSPRINTF4, @0 DECC$GXSPRINTF,P Gp FZOFFT,` b#FZOFFT,l @p FZOFFT4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF4 G DECC$MEMCMP4 b# DECC$MEMCMP4 @ DECC$MEMC8MP4< GP DECC$MEMCMP4@ b# DECC$MEMCMP4L @P DECC$MEMCMP4T Gt DECC$GXSPRINTF4` b#DECC$GXSPRINTF4p @t DECC$GXSPRINTF, H Gt READBUF, d b#READBUF, p @t READBUF4 G DECC$MEMCMP49 b# DECC$MEMCMP4 @ DECC$MEMCMP<  G PROCESS_CDIR_FILE_HDR<  b#PROCESS_CDIR_FILE_HDR<  @ PROCESS_CDIR_FILE_HDR4  G DO_STRING4 b# DO_STRING4  @ DO_STRING4 G DECC$FREE4 :b# DECC$FREE4 @ DECC$FREE4  G@ DO_STRING40 b# DO_STRING4 < @@ DO_STRING, G MATCH, b#MATCH, @ MATCH,G MATCH, b#MATCH,@ MATCH;4PGd DECC$STRLEN4`@d DECC$STRLEN4G DECC$STRCHR4b# DECC$STRCHR4@ DECC$STRCHR<GDOS_TO_UNIX_TIME<b#DOS_TO_UNIX_TIME<@DOS_TO_UNIX_TIME4 G, DO_STRING4 <b# DO_STRING4 (@, DO_STRING, @G\READBUF, Hb#READBUF, X@\READBUF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4 G<DECC$GXSPRINTF40b#DECC$GXSPRINTF48@=<DECC$GXSPRINTF4hG DECC$MEMCMP4xb# DECC$MEMCMP 4@ DECC$MEMCMP4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4`Gx OTS$DIV_UL4ht#p OTS$DIV_UL4t@x OTS$DIV_UL4>G OTS$DIV_UL4t#p OTS$DIV_UL4@ OTS$DIV_UL4G OTS$DIV_UL4t#p OTS$DIV_UL4@ OTS$DIV_UL4G8 OTS$DIV_UL4$t#p OTS$DIV_UL44@8 OTS$DIV_UL4LGt OTS$DuJ% UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1>?IV_UL4Tt#p OTS$DIV_UL4p@t OTS$DIV_UL4GFNFILTER4b#FNFILTER4@FNFILTER4G DECC$STRLEN4@ DECC$STRLEN =0 ;7DECC$GA___CTYPE=0 ;=0@ 7GFNFILTER= ` DECC$STRLEN=0 ;=  OTS$DIV_UL7 CENTSIGMSG DECC$STRCHR7END_CENTRAL_SIG PROCESS_CDIR_FILE_HDR7CENTRAL_HDR_SIG READBUF DO_STRING=08  ;= DECC$GXSPRINTFAMATCH DECC$MEMCMP DECC$FREE7 REPORTMSG7 ENDSIGMSG DOS_TO_UNIX_TIMEFIND_COMPR_IDX=%03u= %s %s 9;= u=0 0;= ;FZOFFT=8= =s(B7END_CENTRAL64_SIG DECC$STRCPYh h484`44 =%c%d%%=100%%=0# Length Date Time Name8=0#--------- ---------- ----- ----`=H? Length Method Size Cmpr Date Time CRC-32 Name=H?--------C ------ ------- ---- ---------- ----- -------- ----=0#%s ("^" ==> case %s conversion) =@3%s %-7s%s %4s %02u%c%02u%c%02u %02u:%02u %08lx %c@=0#%s %02u%c%02u%c%02u %02u:%02u %ch={-------- ------- --- ------- %s %s %4s %lu file%s =XI--------- ------- %s D %lu file%s 8=H>StoredShrunkReduce1Reduce2Reduce3Reduce4ImplodeToken6=(Defl:#Def64#ImplDCLBZip26=LZMA6=Terse6= IBMLZ77WavPackPPMd6= Unk:###NXFS: :=*"!LISTDEC C V4.1-001v v= 44= __iscnEtrl4= X0$ $= 4: := (4= 0 = 044= list_files04=y )8 )+ )+ * )0 ), )$ * *  0*  0* ܁ A* E* F* L* S* P* V* W* W* W* W* ]* ]F* ^* ^* ^* ^*@ k*5 k*5 * k*5 k*8 * * * * * * * * * * * * *' * *  + + + + + < * * * * * * * *  (* .+ )+ .+ 5+  A+ D+ D+ E+ E+G k+ j+h d+ j+ k+ j+ j+ o+ q+ v+ 1* $ $= 44. .=  /4=  = : := 4=  # #= fn_is_dir = = ==  44=get_time_stamp 4= + + +H + + + + + + + + + + + + + + + + +( + + + + + + + +  +l + + + + + + +i< + + + + +9 +P , + 3$ $=  4. .=   I4=  = . .=   4=  = . .=   4=  = : := d4= ( = 4p4= ratio4=xw ,, 2, 3, 4, 6, 5, 7, 7, 5, :, 9, :,4 :,$ $= 04: := 4=  = 44= fnprint4=@87 H, H, H, H, K,$ $= 4: := 84=  =  wwK1O#V1.0AAMATCHV1.029-APR-2009 07:21DEC C V4.1-001` ` $ABS$i $CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$ DECC$TOLOWERDECC$GA___CTYPE DECC$STRLEN DECC$STRCMP(J0MATCH(JISWILDX XL=( GkG;F!0@a/aK$Dk#G~G^GG{#@G]5@ #k#~^^~ (0޴8@H>P^X~`hp,GGGHGC #.#J@GD @#,#"GG#HtG 8b_ӑXD .4GJGGr.rJkF."JR"gF XeF xkF`R/R"RK_Gn@HBG4G@ZkHBGG@Zk  @`@#@d`Y.bGJMFB/K(B0b@ZkG%,%H$. Hà4G$JF@.JH(B0b@ZkG$,$H HH&@.%.4G%J) d.dJ %`. JFBW/WK@(B0b@ZkG,H. HC4GHJFSB.J(B0b@ZkG$,$H HH&@GB GXBGG@ZkGBG.J G8bGGGtG>_,c H?TGGxD#.#J e.eJ5dBkBFG@ G.GJv UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1/MNG G)/)K+G`4G+G ),)!)H?). AB G)J+F k@h.hJkF`! A 4Ga @.(#JFh/! AyK CTGCB@.4GRJFXB,H(B0b@Zk HH H G#,#H HH H#.#Jh." CGtJeF+``G.JC/ GKA BE@4GZ[C.J (B0bG@ZkaH'H!!HCGaH'H!!HCG,D(. 0A(JAO?! A G GZ8b "#"GtG_TG GGO8b "#"GtG_ GGFG D-I C='HCD`4G A,,,H (B0b@Zk HH GGG HH GG D`C-4G"CI) F ,A).)J (B0b@Zk HH,H HHG,HE8b#"GGtGH_GGG]]} (0ݤ8@H=P]X}`hp#k,HG0.P"0J+D 0.G2JP P.""PJ?kG$DX%D P."PJ?Gk4Gk4G DECC$STRLEN4@ DECC$STRLEN4G DECC$STRLEN4@ DECC$STRLEN4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4<GH DECC$TOLOWER4Q@b#( DECC$TOLOWER4D@H DECC$TOLOWER4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER40G@ DECC$STRCMP4<@@ DECC$STRCMPR4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4|G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4GS DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWERt t=0 ;7DECC$GA___CTYPE=0 ;=0 p;=? P DECC$TOLOWER(;p DECC$STRLEN DECC$STRCMP=0 0;= ; ;T=+#"MATCHDEC C V4.1-001v v= 44= __iscntrl4= 0$ $= 4: := (4= 0 = 044= match04=' )$ )$ )$ $ $= <4: := d4= @U = p4(4=recmatchp4=y *  *  *  W*u * Y*} a*!Z *Y * *( * * * * * * *< * * * * * * *r * * * * * * *l * *  *$ * *H$ $= V4. .=  p4= . .=  o4=  =  = . .=  p4= . .=  o4=  =  = . .=  o4=  = : := X4= 0! !=isshexp = ! !=namecmp =  = 44= iswild4=F>= * * * * * * +$ $= 4: := 4=  =  wwX1#V1.0CCPROCESSV1.029-APR-2009 07:21DEC C V4.1-001( ( $ABS$i0$CODE$[ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$ DECC$STATDECC$GXSPRINTF DECC$CLOSE DECC$LSEEK DECC$READDECC$GA___CTYPE DECC$MEMCMP DECC$FRYEE DECC$MALLOC LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIG END_CENTRAL64_SIG END_CENTLOC64_SIGG8J 0PROCESS_ZIPFILES0JFREE_G_BUFFERS8J(PROCESS_CDIR_FILE_HDR8Jp,PROCESS_LOCAL_FILE_HDR0J. GETZIP64DATAZI_END_CENTRALZIPINFO LIST_FILEZSGET_TIME_STAMPOPEN_INPUT_FILEREADBUF SEEK_ZIPF DO_STRINGMAKEWORDMAKELONG MAKEINT64FZOFFT EXTRACT_OR_TEST_FILES INFLATE_FREE CHECK_FORMAT VMS_MSG_TEXTISWILDCHECKDIRDO_WILD STAMP_FILE REPORTMSGZIPNFOFREE_CRC_TABLE =GkG[;F!0@a/aK$Dk# "~4G^^~ (0޴8@H>P^X~`GGG0B¤G8bG@Zk&0B &$8b"4G@Zk &$ &@"@ f& &1"@TG@FpB sGxb@ZkGG[GG"G@ZkG"GtG" !.rJ"Q!JvtJ2F!>. G GUJ GF>. GY//JZYK{J! [GY?K.#q H"PJF>Y..y.YJUJvTJ9#F>.yJ!#zxJWJF>TGt/\.,tKPJqaK"F>HA. uHRYJt#UFY> &../JPJ4fqJ8Ƣ! F>K,Cr;HvF@HD<FG`B &'hb4G@Zk &$(A &Hf &&GB<ƢDBw5@,JBqtF @ `F@""[G4GGG@ZkGPb#@G8D 0@GD 0`A 8D 0@A0AG 0 A@ @SF_GGjAO`'A8FBKJB &b4G@ZkG'Bb4G@Zk &$<;@ ws\p UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1;\]G& G(¦ "G2"pB F& &5Frp xbGGGG@ZkGG[GG"G@Zk $4GdPb#a@<5@ G G%5@< @ 0A0@ 4G4GG 0 AG `@DGB &$b4G@Zk@<H&y@B`D$ F DF=@HA_B8 ESF@BHƢBF '@""xG4G["G@ZkjAi @`8 E@@B &$8 EpBPb"aH"xb &3FHR" GGGGG@Zk^GG[GG"G@Zk $@"8D " pB"Dxb f$c Gp1"GGG@ZkGG[GG"G@Zk f$@"8E " pB"cDxb $ G1"GGG@ZkGG[GG"G@Zk $@"8@E@ " pB"Dxb f$c G1"GGG@ZkGG[GG"G@Zk 8`E@" f$@pB $c xb1"GTG@ZkGGG"GG F%@"`pBJ $ xb1"GGtG@ZkGGG"G[G@_Zk(AA@" f$pB f%ck!xb01"GTG@ZkGG[GG"G@Zkb#@GG]]} (0ݤ8@H=P]X}`p#kG#G~^^~ (0GG8B@bpb@ZkGHBGPbTG@Zk $GXB`b@Zk $ #$4G (B0b@Zk $  #$4G(B0b@Zk $ #$4G(B0b@Zk $4G(B0b@Zk $ #$GG@PBpB0J4Gp@(B0b@Zk0@@ @G`]]} (0@#kG#4G~^^ ~(08޴@HP>X^`~hpGGG¤GBGb &@Zk`B &$hb &&1"TG@Zk &$ &&!&"Q.q.1"R HQJ0D CS qJ{B &bSF4G@ZkTGGPBGXb@Zk4GG &$& F& f&@?@<!FH D &" & B ' X1"(bGtG@ZkGG[GGGG@Zk $$ b#Ga @FDG@G  B &$(b4G@ZkG`{ $4G4GvGh& &f4G @#D B(b@ZkGhG $ &$@!@ &C A FqD" A2`` Bt & &(b V1"GGGG@ZkGG[GG"G@ZktG4GG f$" B $c &$ (bA1"GGGG@ZkGG[GG"G@Zk4G %"@ B &% f$)!(bC81"GtG@ZkGG[GG"G@Zk4G F%b &% $G$@ @B`B)0CGbtG@Zk % B!J!(bGGGGG@ZkGG[GG"G@ZkTGO F%" $xJC %G`_AD B &% $(b)!@1"GtG@ZkG f$[GGG"G@Zk $ c F% TG#aHj(GB $ %b F%GGbGtG@Zk J0 B &%)!(b 8@EGE@c GGGGGG@ZkGG[GG"G@Zk4G F% %xJ0 f"  c=, &%D1)!`P" BD(bH1"GGtG@ZkGGGGGG F%" B $J f$ (bC1"GtG@ZkGGG"G[G $^~GGG "G $@AB $b@ZkB $ $$b $&@tG1@Zk $$ & $&! D&1D!B! 21@ &X"GtG.JFHBPb@Zk $$ &! $&! 10@?Gg d& & &s &4G3tB3Bv"DW@GG`B $'b1@GtG@ZkB $$ &b $&G1tG@Zk $$ TGDG & D&B1"20B# &X"GtG.JFHBPb@Zk $% $$)! &)!0!A? G D& d& &Rs &4G2SB2BU & &֢G1 J6/V/#.7J8K,ZXKq7J:GJ F!JD7Ha7HFD>< &%@&@_"@&H 4GH@Eh h'b D' ?# $1C:BGtG $@Zk $B $' $b _"tG@Zk & I' 0'@$ G D&X"tGGp.pJjF`HBPb@Zk $ $ $$ @ G $& D& d&1R &s4G12B1qB4 & &֢G'H/5/".HK6,Y7K 0 AGJgH2JAVJ &ArVJF'DF>[G2D6<_G TGéA?AG<$ & '& 4F (B $'0b8""YGtG@ZkGG[iGG"G@Zk d$(B"GcTG0b@ZkGG[GG"G@ZkTG' %(B $%0b $)X"ƠGTG( A@İ@ZktGB\"b4G $@ZkB^"b4G $@Zk`"B4Gb d$ $%@Zkb"B4Gb % $@Zkd"B4Gb $ @ZkB Hbh"x4G@Zk HBl"b4G@ZkG$fH,d &(H?A=a@E#DGl $&(vHq D&"(B 0bGH1"TG@ZkGG[GGGG!@jZkB $(B d$c J!0bGGGtG@ZkG $[GGGGG@Zk(BH*"ƠG0bTG@Zk %GG[GGGG@Zk $hB4GpbTG(vIC@ZkC(B*"G0bTG@ZkGGG[GGG %@ZkQ(Bh*"0bGTG@ZkGG[GGGG@Zk!BiGh *vH %!@hBpbC4GTG@Zk0" d$(BGcTG0b 1"@ZkGG<DH @D'vHhBpbC4GTGk@Zk" d$(B D%J!c =0b 1"GTG@ZkGGGG["G@Zk4G!($ D%G )"A?ABbGtG@ZkB d$ %b $="GtG@Zk $$D-D< d$ %Ac D(B8""0bGtG@ZkGG[GG"G@Zk $"(BGTG0b1"@ZkGGG[G"G@ZkTGG @DHB""GPbtG@Zk "Bb4G d$@ZkB Gb"4G@ZkBGx7 UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1 6klb"4G@Zkc$ $ 1@<e@`@!!IDA D&, F d&r (B &8""TG0btG@ZkGG[GG"G@Zk D%"G(BTGJTG0b1"@ZkGGG[G"G@ZkG @DGB d$bCGtG@Zk $B d$b $ ="GtG@Zk &D$,<d $& aD (B D&0b8""RGtG@ZkGG[GG"G@Zk $%"(BG)TG0b1"@ZkGGG[G"G@ZkTGmG @DIb "HBGPbtGG@Zk)'AB(!I $bCGtG $%@ZkB $ $% ="bGtG@Zk D$ &< $&+0! D&D (B8""RG0btG@ZkGG[GG"G@Zk D%"G(BTGJTG0b1"@ZkGGG[G"G@ZkG @DGHB "PbGGtG@Zk d$ $$<$*c  &'E(BP8""0bGtG@ZkGG[GG"G@Zk D%"(BGJTG0b1"@ZkGGnG[G"G@ZkTGG @Dd $<$ $$ &#E`(B8""!tGPG0b@ZkGG[GG"G@Zk d$"(BGcTG0b1"@ZkGGG[G"G@ZkBb0"4G@Zk DB d$b4"4G@Zkc G8"4Ge@i@%Dv`B $bk!@ZkG@"4G@@'Di B $b@Zk GH"4G@@'D] B $b@Zkx G"4GC@0@P"'DO B $b@Zk $&"1C@0@ d&'DAo 4GS &%F T & EE@U & &֢ 'F%E7X $' D'9 d'+G zkD`[ & $$ $ F E`G d&Gxs %1!Js"`x & ET D%GJ &6JJ!@ &DW $% $)GxG%AxBb@ZkGGp]x]}ݤ=]}#k#TG~TG8^@^H~PGG"BbtG@ZkGØb4G=B &b!!Hh!"H #&0vJ0Dph1 "@Zk #$BqHh! C&b4G0'HFh"@Zk #$BqHp! C&b4G0?HFp"@Zk #$B"b4GX@ZkB #$b"\4G@Zk #$B Hb"@4G@Zk #$B Hb "H4G@Zk #$BqSHp! C&b4G0v>HFp""@Zk #$BqHp! C&b4G09HFp$"@Zk #$BqHp! C&b4G0'HFp&"@Zk #$B("b4Gd@Zk #$BqHbh! C&4G0?HFh*"@ZkB #$b."`4G@Zk c$" HPGG & q!&h1 & &PJ quJFF  a&h֦?"pJ w B8G#K`1J '`D s(F(08F@ x0`H7b@ ¦\|@Ck(xbG(x &"(WBG(W a& &`saF` T0@J@F@xAF`@F @( !'G(9(F(G(_#D( a& !$`sG!3J(C0`F3`JFF(G8]@]H}P`#k#TG~TG(^0^8~@GG" B(b@ZktGlGb4G=B &b!v Hr0 #&0J0D01 "@Zk #$BqSHb0! C&4G0v>HF0 "@Zk #$BqHb0! C&4G09HF0"@ZkB #$b"(4G@Zk #$B"b4G,@ZkB #$ Hb"4G@ZkB #$ Hb "4G@Zk #$BqHb0! C&4G0'HF0 "@Zk #$ &8!rH0 c& &1?HRJ2F8F & #' C'Ԣ,ײ  c'G{cG(]0]8}@P#k#~^^~ (0޴8@HGGG@@@D\sGZ G8BG@b4GG@Zk8BC@b"4G@ZkC!@@8D /=`XH 'H@ G4G & %&H 1B'BF (B"0b %@Zk %$HG  & %&@14GB'BF (Bh@0bA@Zk %$ &@ %&h@P14G'F(B $0bA@ZkP %$&d!" $4G0D HBh@Pb@Zkd$@$@f@@`@G]G]} (0ݤ8@HP#k47|G DECC$MALLOCt48b#  DECC$MALLOC47@ DECC$MALLOC47G DECC$MALLOC48b#  DECC$MALLOC47@ DECC$MALLOC4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF,9GDO_WILD,:b# DO_WILD,u9@DO_WILD,#GISWILD,$b# ISWILD,#@ISWILD,#GISWILD,$b# ISWILD,#@ISWILD4(G\DECC$GXSPRINTF4Db# DECC$GXSPRINTF4X@\DECC$GXSPRINTF,#GISWILDv,$b# ISWILD,#@ISWILD4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF44GhDECC$GXSPRINTF4Db# DECC$GXSPRINTF4d@hDECC$GXSPRINTF4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4w@DECC$GXSPRINTF4G8DECC$GXSPRINTF4b# DECC$GXSPRINTF44@8DECC$GXSPRINTF4hGDECC$GXSPRINTF4xb# DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$xGXSPRINTF4G4DECC$GXSPRINTF4 b# DECC$GXSPRINTF40@4DECC$GXSPRINTF4 G INFLATE_FREE4 b# INFLATE_FREE4 @ INFLATE_FREE4 GCHECKDIR4b#CHECKDIR4 @CHECKDIR4 Gy FREE_CRC_TABLE4 b#FREE_CRC_TABLE4 @ FREE_CRC_TABLE4 ( G4 DECC$FREE4 , b# DECC$FREE4 0 @4 DECC$FREE4 L GX DECC$FREE4 P b# DECC$FREE4 T @X DECC$FREE4 p G| DECC$FREE4 t zb# DECC$FREE4 x @| DECC$FREE4  G DECC$FREE4  b# DECC$FREE4  @ DECC$FREE4  G DECC$FREE4  b# DECC$FREE4  @ DECC$FREE,#p G ISWILD,$x b#pISWILD,# yT UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1z{@ ISWILD4/ G DECC$STAT 40 b#p DECC$STAT4/ @ DECC$STAT4! G CHECK_FORMAT4" b#p CHECK_FORMAT4! @ CHECK_FORMAT4- G( OPEN_INPUT_FILE4. b#pOPEN_INPUT_FILE4-$ @( OPEN_INPUT_FILE4| G DECC$GXSPRINTF4 b#pDECC$GXSPRINTF4 @ DECC$GXSPRINTF4) G$ DECC$CLOSE4* b#p DECC$CLOSE4) @$ DECC$CLOSE4)h Gt DECC$CLOSE4*l b#p DECC$CLOSE4)p @t DECC$CLOSE4 G DECC$}GXSPRINTF4 b#pDECC$GXSPRINTF4 @ DECC$GXSPRINTF4( G\ DECC$GXSPRINTF4< b#pDECC$GXSPRINTF4X @\ DECC$GXSPRINTF4 G DECC$GXSPRINTF4 b#pDECC$GXSPRINTF4 @ DECC$GXSPRINTF,% G,FZOFFT,& b#p~FZOFFT,%(@,FZOFFT40GXDECC$GXSPRINTF4<b#pDECC$GXSPRINTF4T@XDECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF,% GTFZOFFT,&,b#pFZOFFT,%P@TFZOFFT4`GDECC$GXSPRINTF4lb#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4@GlDECC$GXSPRINTF4Tb#pDECC$GXSPRINTF4h@lDECC$GXSPRINTF4)G DECC$CLOSE4*b#p DECC$CLOSE4)@ DECC$CLOSE4'G SEEK_ZIPF4(b#p SEEK_ZIPF4'@ SEEK_ZIPF4)G DECC$CLOSE4*b#p DECC$CLOSE4)@ DECC$CLOSE,GREADBUF,b#pREADBUF,@READBUF4G8 DECC$MEMCMP4 b#p DECC$MEMCMP44@8 DECC$MEMCMP4'@Gl SEEK_ZIPF4(`b#p SEEK_ZIPF4'h@l SEEK_ZIPF,tGREADBUF,xb#pREADBUF,@READBUF4G DECC$MEMCMP4b#p DECC$MEMCMP4@ DECC$MEMCMP,%GFZOFFT,&b#pFZOFFT,%@FZOFFT4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4',GD SEEK_ZIPF4(4b#p SEEK_ZIPF4'@@D SEEK_ZIPF 4)LGd DECC$CLOSE4*Tb#p DECC$CLOSE4)`@d DECC$CLOSE,3tGZIPINFO,4xb#pZIPINFO,3|@ZIPINFO4GGET_TIME_STAMP4 b#pGET_TIME_STAMP4@GET_TIME_STAMP41G LIST_FILES42b#p LIST_FILES41@ LIST_FILES<GEXTRACT_OR_TEST_FILES<b#pEXTRACT_OR_TEST_FILES< @EXTRACT_OR_TEST_FILES40G`DECC$GXSPRINTF4Hb#pDECC$GXSPRINTF4\@`DECC$GXSPRINTF4)G DECC$CLOSE4*b#p DECC$CLOSE4)@ DECC$CLOSE4)G DECC$CLOSE4*b#p DECC$CLOSE4)@ DECC$CLOSE45G STAMP_FILE46b#p STAMP_FILE45@ STAMP_FILE4,G@DECC$GXSPRINTF40b#pDECC$GXSPRINTF4<@@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GXDECC$GXSPRINTF4,b#pDECC$GXSPRINTF4T@XDECC$GXSPRINTF4+G VMS_MSG_TEXT4,b#p VMS_MSG_TEXT4+@ VMS_MSG_TEXT4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$LSEEK4b#h DECC$LSEEK4@ DECC$LSEEK4G DECC$READ4b#h DECC$READ4 @ DECC$READ4lGx DECC$MEMCMP4pb#h DECC$MEMCMP4t@x DECC$MEMCMP4G DECC$LSEEK4b#h DECC$LSEEK4 @ DECC$LSEEK4G< DECC$READ4b#h DECC$READ48@< DECC$READ4G DECC$MEMCMP4b#h DECC$MEMCMP4@ DECC$MEMCMP4b#h DECC$LSEEK4G DECC$LSEEK4@ DECC$LSEEK4G DECC$READ4b#h DECC$READ4@ DECC$READ4LGz UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;13EX DECC$MEMCMP4Pb#h DECC$MEMCMP4T@X DECC$MEMCMP4lGDECC$GXSPRINTF4xb#hDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#hDECC$GXSPRINTF4@DECC$GXSPRINTF,G4READBUF,b#hREADBUF,0@4READBUF4@GXMAKEWORD 4Hb#hMAKEWORD4T@XMAKEWORD4XGtMAKEWORD4`b#hMAKEWORD4p@tMAKEWORD4xGMAKEWORD4b#hMAKEWORD4@MAKEWORD4GMAKEWORD4b#hMAKEWORD4@MAKEWORD4GMAKELONG4b#hMAKELONG4@MAKELONG4GMAKELONG4b#hMAKELONG4@MAKELONG4GMAKEWORD4b#hMAKEWORD4@MAKEWORD4XGtDECC$GXSPRINTF4`b#hDECC$GXSPRINTF4p@tDECC$GXSPRINTF4GDECC$GXSPRINTF4b#hDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#hDECC$GXSPRINTF4@DECC$GXSPRINTF4@G\ DO_STRING4Hb#h DO_STRING4X@\ DO_STRING4`G|DECC$GXSPRINTF4pb#hDECC$GXSPRINTF4x@|DECC$GXSPRINTF4GDECC$GXSPRINTF4b#hDECC$GXSPRINTF4@DECC$GXSPRINTF4 G$ DO_STRING4b#h DO_STRING4 @$ DO_STRING40GLDECC$GXSPRINTF4@b#hDECC$GXSPRINTF4H@LDECC$GXSPRINTF4|G DO_STRING4b#h DO_STRING4@ DO_STRING4GDECC$GXSPRINTF4b#hDECC$GXSPRINTF4@DECC$GXSPRINTF4 G DECC$LSEEK4 b#h DECC$LSEEK4 @ DECC$LSEEK4 GL DECC$READ4, b#h DECC$READ4H @L DECC$READ4| G DECC$GXSPRINTF4 b#hDECC$GXSPRINTF4 @ DECC$GXSPRINTF4 G DECC$GXSPRINTF4 b#hDECC$GXSPRINTF4 @ DECC$GXSPRINTF4!G,! DECC$MEMCMP4 !b#h DECC$MEMCMP4(!@,! DECC$MEMCMP44!GH!MAKELONG48!b#hMAKELONG4D!@H!MAKELONG4H!G`! MAKEINT644P!b#h MAKEINT644\!@`! MAKEINT644`!Gx!MAKELONG4h!b#hMAKELONG4t!@x!MAKELONG4!G!DECC$GXSPRINTF4!b#hDECC$GXSPRINTF4!@!DECC$GXSPRINTF4"G,"DECC$GXSPRINTF 4 "b#hDECC$GXSPRINTF4("@,"DECC$GXSPRINTF4`"G" DECC$LSEEK4h"b#h DECC$LSEEK4|"@" DECC$LSEEK4"G" DECC$READ4"b#h DECC$READ4"@" DECC$READ4"G"DECC$GXSPRINTF4"b#hDECC$GXSPRINTF4"@"DECC$GXSPRINTF4 #G<#DECC$GXSPRINTF40#b#hDECC$GXSPRINTF48#@<#DECC$GXSPRINTF4x#G# DECC$MEMCMP4#b#h DECC$MEMCMP4#@# DECC$MEMCMP4#G# DECC$LSEEK4#b#h DECC$LSEEK4#@# DECC$LSEEK4#G# DECC$READ4#b#h DECC$READ4#@# DECC$READ4$G4$DECC$GXSPRINTF4($b#hDECC$GXSPRINTF40$@4$DECC$GXSPRINTF4`$G|$DECC$GXSPRINTF4p$b#hDECC$GXSPRINTF4x$@|$DECC$GXSPRINTF4$G$ DECC$MEMCMP4$b#h DECC$MEMCMP4$@$ DECC$MEMCMP4$G%DECC$GXSPRINTF4%b#hDECC$GXSPRINTF4 %@%DECC$GXSPRINTF48%GT%DECC$GXSPRINTF4H%b#hDECC$GXSPRINTF4P%@T%DECC$GXSPRINTF4%G%DECC$GXSPRINTF4%b#hDECC$GXSPRINTF4%@%DECC$GXSPRINTF4%G &DECC$GXSPRINTF4&b#hDECC$GXSPRINTF4&@ &DECC$GXSPRINTF4,&G@&MAKELONG40&b#hMAKELONG4<&@@&MAKELONG4H&G`&MAKELONG4P&b#hMAKELONG4\&@`&MAKELONG4&G& MAKEINT644&b#h MAKEINT644&@& MAKEINT644&G& MAKEINT644&b#h MAKEINT644&@&{.d UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1 MAKEINT644&G& MAKEINT644&b#h MAKEINT644&@& MAKEINT644 'G0' MAKEINT644('b#h MAKEINT644,'@0' MAKEINT644(G(ZI_END_CENTRAL4(b#hZI_END_CENTRAL4(@(ZI_END_CENTRAL,)G)READBUF,)b#READBUF,)@)READBUF4,)G\)MAKEWORD44)b#MAKEWORD4X)@\)MAKEWORD4`)G)MAKEWORD4p)b#MAKEWORD4)@)MAKEWORD4)G)MAKELONG4)b#MAKELONG4)@)MAKELONG4)G)MAKELONG4)b#MAKELONG 4)@)MAKELONG4)G)MAKELONG4)b#MAKELONG4)@)MAKELONG4)G*MAKELONG4*b#MAKELONG4*@*MAKELONG4*G4*MAKEWORD4 *b#MAKEWORD40*@4*MAKEWORD48*Gd*MAKEWORD4H*b#MAKEWORD4`*@d*MAKEWORD4h*G*MAKEWORD4x*b#MAKEWORD4*@*MAKEWORD4*G*MAKEWORD4*b#MAKEWORD4*@*MAKEWORD4*G*MAKEWORD4*b#MAKEWORD4*@*MAKEWORD4*G+MAKELONG4*b#MAKELONG4 +@+MAKELONG4+G,+MAKELONG4+b#MAKELONG4(+@,+MAKELONG, -G-READBUF,-b#pREADBUF,-@-READBUF44-G`-MAKEWORD4<-b#pMAKEWORD4\-@`-MAKEWORD4d-G-MAKEWORD4l-b#pMAKEWORD4-@-MAKEWORD4-G-MAKELONG4-b#pMAKELONG4-@-MAKELONG4-G-MAKELONG4-b#pMAKELONG4-@-MAKELONG4-G-MAKELONG4-b#pMAKELONG4-@-MAKELONG4-G.MAKELONG4.b#pMAKELONG4.@.MAKELONG4.G8.MAKEWORD4$.b#pMAKEWORD44.@8.MAKEWORD4<.Gh.MAKEWORD4D.b#pMAKEWORD4d.@h.MAKEWORD4H/G`/MAKEWORD4P/b#MAKEWORD4\/@`/MAKEWORD4`/Gx/MAKEWORD4h/b#MAKEWORD4t/@x/MAKEWORD4/G/ MAKEINT644/b# MAKEINT644/@/ MAKEINT6440G0 MAKEINT6440b# MAKEINT6440@0 MAKEINT644H0G\0 MAKEINT644P0b# MAKEINT644X0@\0 MAKEINT6440G0MAKELONG40b#MAKELONG40@0MAKELONG{ {=c[DDDDDDDDDDD%sEmpty zipfile.  =0 ;7DECC$GA___CTYPE=0 .;=P 7G MAKEINT64MAKEWORDMAKELONG=0( ,;=P READBUF=08 (;=` ;=0 ;=@<  DECC$FREE INFLATE_FREE CHECKDIRFREE_CRC_TABLE7END_CENTLOC64_SIG7END_CENTRAL64_SIG DECC$LSEEK DECC$READ(;=0p `;=? DECC$GXSPRINTF=[%s]  DECC$MEMCMP7END_CENTRAL_SIG DO_STRINGZI_END_CENTRAL7 REPORTMSG=  EXTRACT_OR_TEST_FILESGET_TIME_STAMP! CHECK_FORMAT#ISWILD=sH7ZIPNFO%FZOFFT' SEEK_ZIPF=0  ;= ) DECC$CLOSE=7CENTRAL_HDR_SIG+ VMS_MSG_TEXT -OPEN_INPUT_FILE/ DECC$STAT= 1 LIST_FILES3ZIPINFO5 STAMP_FILE=0 0;=p 7 LOCAL_HDR_SIGP7 DECC$MALLOC= h= wasp=s were9DO_WILD< < =unzip=0'error: cannot allocate unzip buffers 0=H?%s: cannot find any matches for wildcard specification "%s". p=0&%d archive%s successfully processed. =u%d archive%s had warnings but no fatal errors. %d archive%s had fatal errors. %d file%s had no zipfile directory. =(1 "zipfile" was a directory. 0=0!%d "zipfiles" were directories. X= No zipfiles found. p=(%s: cannot find %s (%s). =@5note: %s may be a plain executable, not a| UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1xn archive =Archive: %s =0!warning [%s]: zipfile is empty =0"warning: cannot set time for %s (=(Updated time stamp for %s. H=0& caution: zipfile comment truncated p=(There is no zipfile comment. =0& The zipfile comment is truncated. =`Q%s: cannot find zipfile directory in %s, %sand cannot find %s, period. = [%s]: Zipfile is disk %lu of a multi-disk archive, and this is not the disk on which the central zipfile directory begins (disk %lu). = warning [%s]: end-of-central-directory record claims this is disk %lu but that the central directory starts on disk %lu; this is a contradiction. Attempting to process anyway. warning [%s]: zipfile claims to be last disk of a multi-part archive; attempting to process anyway, assuming all parts have been concatenated together in order. Expect "errors" and warnings...true multi-part support doesn't exist yet (coming soon). h=warning [%s]: %s extra byte%s at beginning or within zipfile (attempting to process anyway) error [%s]: missing %s bytes in zipfile (attempting to process anyway) =XMerror [%s]: NULL central directory offset (attempting to process anyway) h=XIerror [%s]: start of central directory not found; zipfile corrupt. %s=pefatal error: read failure while seeking for End-of-centdir-64 signature. This zipfile is corrupt.  =xkerror: End-of-centdir-64 signature not where expected (prepended bytes?) (attempting to process anyway) =error [%s]: reported length of central directory is %s bytes too long (Atari STZip zipfile? J.H.Holm ZIPSPLIT 1.1 zipfile?). Compensating... (=PG End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. The zipfile comment is %u bytes long and contains the following text: p =XL======================== zipfile comment begins ==========================  =TL========================= zipfile comment ends =========================== = ==-%$PROCESSDEC C V4.1-001v v= 44= __iscntrl4= b0$ $= 4: := (4= 0 = 04 4=process_zipfiles04=IA * * *  * * * * * * * * * * *k *l * *p * * * * * * * * * * * *: * * * * * *  * * *? *@ * * *< *; *; *~  3+ 6+ 9+ 9+ 3+  6+ 9+ 9+  W+ W+ [+ _+ \+ ]+ ]+ _+ ^+ {+ }+  +  + + + +  + + + + + + + + +5 + + + +D$ $= 44: := \4= p = 44=free_G_buffers4=wv +  +  + + + ,  , ,  ,  !, ,($ $= 4: :=  4= x =  4p4= do_seekable 4=zr 9, 9,   F, @, ' N,' R,' R,' R,1 z,  z, $ ,  , ,  , , , , , , , ,  , , ,  , , , , , ,  - - - - - - - - - - - - '- (- '- '- (- ,-  M- J- N-  N- O-  P-  |-  - - - - - R- R-> - - - - - - - - - -Y - d, U, c, U,  U, U, U, c, P$ $=  4. .=   4=  = : := 4= H " "=rec_find = & &=" find_ecrec64 =  = `4h4= find_ecrec`4={ T/ T/ T/ T/  X/ g/ h/ g/ g/ k/ n/ n/ m/ l/ l/ l/ k/ p/ .c . !. !. #. (.T ,. +. +. *. ). ). ). (. -. =. A. A. E. G. G.3 M. L. L. K. N.8 @. @. @. @. @. * /  / / / / / / / / / / / / / / / / / /D /E /E /E /6 / /8 /H /J 0 0 0 0< /V 0 0 0 0 0 0 0   / . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / $/  %/  %/ %/ %/ -/ 6/ 6/ 7/ :/ :/ >/ >/ ?/ B/L B/ F/ F/ / / K/H$ $= d4. .=  _4=  = . .=  _4=  = . .=  }T UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1I_4=  = : := (4= x+ +='process_zip_cmmnt =  = "(44=#process_cdir_file_hdr(4=<4 J0W J0W J0W 0 W0M 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y0k 0 Z0l Y0 Y0 Z0 Z0 Z0 ^0  p0 p0 t0 t0 t0' t0 x0 0$ $= (4. .=  (4=  = : := ,4= & &=" get_cdir_ent =  = #,4p4=$process_local_file_hdr,4=*" 0  0  0  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0$ $= ,4: := .4= $ $= .44= getZip64Data.4= 1 1 1  1 1 1  %1 '1 )1 *1 -1 .1 11 113 21 51 <1 1! 1%4$ $= (/4. .=  .4=  = : :=  04=  =  ww16#V1.0AATTYIOV1.029-APR-2009 07:21DEC C V4.1-001h h $ABS$i $CODE$- $LITERAL$h$LINK$$DATA$$BSS$ $READONLY$DECC$GA_STDERRDECC$GA_STDOUT DECC$FCLOSE DECC$FFLUSH DECC$FOPEN DECC$FGETC DECC$FPUTC DECC$FPUTS DECC$CTERMIDDECC$GA___CTYPE(J0ECHO0JHTT_GETCH(JGETP SYS$ASSIGN SYS$DASSGNSYS$QIOW = GkG;F!0@a/aK$Dk#G~G ^G(^0~8GGGHB#8="Pb@Zk=E"G(B^!&H}"&H G(G0bGGG@Zk=0  &HTFH+` G ]"SF ]"޶G(B}"5J޶GJ tG(G0bGG@Zk} =4G fH!&HH&HXB`b@ZkG2DGG ](]0}8@#k#G~(^G0^G8~@GG#B b ="@Zk ) ="4GB}"!&HG&H q_"(GbGG@ZkG0`D8 D #JfH =(B4G0b0`D1&J8`D&J@Zk] _D`DGG(]0]8}@P#k#4G~^^~ (0޴8@H>PGGGBGbGG@ZkBH""bGTG@ZkGGf@"4GB` b @Zk,G(TGH0B8b@Zk0B(G8bTG@Zk4GBGb@ZkG8b#_ FB C11 BPF` ".J GBGb4G@Zk G?E!D@ @T!Dq.0@t1ISqJtFq> ?E X!E?4G8b#_PBTG(TGXb @@Zk4GBb@Zk ,) "4GHXD).BbQ0J0>G@ZkGG]]} (0ݤ8@H=P`#k4`Gx SYS$ASSIGN4pb# SYS$ASSIGN4t@x SYS$ASSIGN4GSYS$QIOW4b#SYS$QIOW4@SYS$QIOW4GXSYS$QIOW4Hb#SYS$QIOW4T@XSYS$QIOW4|G SYS$DASSGN4b# SYS$DASSGN4@ SYS$DASSGN4G SYS$ASSIGN4b#H SYS$ASSIGN4@ SYS$ASSIGN4GPSYS$QIOW4@b#HSYS$QIOW4L@PSYS$QIOW4pG SYS$DASSGN4xb#H SYS$DASSGN4@ SYS$DASSGN4 G DECC$CTERMID4 b# DECC$CTERMID4 @ DECC$CTERMID4 G0 DECC$FOPEN4  b# DECC$FOPEN4 ,@0 DECC$FOPEN4HG` DECC$FFLUSH4Pb# DECC$FFLUSH4\@` DECC$FFLUSH4xG DECC$FPUTS4|b# DECC$FPUTS4@ DECC$FPUTS4G DECC$FPUTS4b# DECC$FPUTS4@ DECC$FPUTS4G DECC$FFLUSH4b# DECC$FFLUSH4@ DECC$FFLUSH4 G DECC$FGETC4b# DECC$FGETC4 @ DECC$FGETC4hG DECC$FPUTC4xb# DECC$FPUTC4@ DECC$FPUTC4G DECC$FFLUSH4b# DECC$FFLUSH4@ DECC$FFLUSH4G DECC$FCLOSE4b# DECC$FCLOSE4@ DECC$FCLOSE, ,= SYS$COMMAND= ==%(line too long--try again)  =0 ;7DECC$GA___CTYPE=0 0;=@ @SYS$QIOW;~r6ܛ7q0}9D9Ex>klF@0/Ii* S>bZl*\w46FAVb~j'͚boƘ繻;5<&$D"s2M|4=QQɈ4~ed*(\9!p]H.Ŝfבi#Y+G(&1ZwOMzqSg@ؗw.k^_Qj7pTV#W5qV W< ~0=~7G r!Z}L)LԻ*L"pqYѶd>tTK 6z_l EgS̼3dEVs/%NGpDTg]-|Q@.@ ȓ 6ݵD3r]-mTi:~npK>I({RuwN"7²nvxg{Gg^uHA]*W|@›\'Uuh<q (-G_uH <-,xН 5=bGAKYy+<\ޤ#HxMf'i1 :n%TBt=0u7`_&}H ${a->]dhXT.:FE%fo Q)lȭ>+/&M[@XשJB]8³[RN[Sbx[_t=B:V,)(|6-(u@7V8A%@V:yeCZjJyw"\lq _)6SLj%W%5:J/pG3Y*W36cEh:@Yb҉F[@W{"!V`ܴ5ҙNBohS4]5Uqs"lRR4 gw98KӰ'&ڊ~&ܗANJ]R:$" V JF'AoK3b>4n)T$9jq1kq^Jkv8D7Mew ;"iE\$ }ByaVL D%"ת@x?'=RNb+Qft|҅nO4E_㣦,Ɯ!4;Eν w e>I5:I֣BM= A">u@bg+[z`mOmբ"5] q>#%]FXv$-^БP tvc(ldTU2gi֓5656'XXM/ -7,R֪ i>NdGj7lxRF'ӻw_PgkNig*wtr@g~4֫0ŪݨXȻؒ!rAkg.鷵2 2KYtYQ'%hΤj7a{/ 7 "cʊ7V?=Lk>ĞPLY[E >x͆) ݝ7dy\XP]QDii (|CÀc O,T߇~ēcZ/<;{ uX6ܰzEGn&m8W6[/cbؘ- P;2a+\#a1@S!_CMAY@,0$jVNkx  Nc.17W?5pT6hSSj;y niMr?u>b]lTB )W E%E,0j;eZ~݉xa|;(٪4z@;=(hº,Rs@K c!_F :KM/wP^ѵtFR,y]M5;K]@- \XR`9&ѬC$܏Gduzv ,XA2zE[))6Vfu@ r` qe fXiʱ} w˼*ODW aS*X6JՊC7܃/ʢ{D7Kv=GdLE* 6os,1 CKE>KL VB0J/ YW%KVl{ۓW- nEd Qk76FI;-wF#)dΈQmC:hQE +a6"搴0-`o]]po$->>SPq6 X`~p՞p(tH@BLP] Vy81E#Pm?!?A9],"1sB DzEļwni$ f;O5_@Vo'LyW9. 'l*?2?j}.X? &CZJ7'141.p IX|%)}*1 eTgQJ8 /nOR{lO jt+` hV/e;dZ }&dxAK!C&)2~m%!I㔹`t:iѹa|TCZqR}xVQW: c DOc]W5S `f[4]uktP1)m!1*sp>Y%!0gmHٛȴ_l*49g|d~ƽJ%FE>J&vv΢4gѺɄ!1J-k^=- h$t \;w¨yPBc7KAS(Qqa6LTvcSTU2/+ zL#VAF| mp},k=,[D< YfR+aC!%\XH,Q&FFӔ?>KWPfSi=WH9%A'mVVI:,P\ cs^XK!e+MaRe=Ik&@K@Z jj.kdC7`bx&>YU\LI0.a9W.-qo 2w}E%s]+ߧo bt /&BE QPs@iX [+t*so6Xd.|m(!/HQ = - 1 x0¢'3Qrqv8%O"}ô ~1|KYj!˸g͔B;PS&u%9؋I^Y .Nn!tu:W.Cn.~_q[f:yYcX-.V"/ژAS{iylo']1GԸsW*-ġsǝ# h?%rq,T~Ӹ GdpM*mYM2ٸԐ,NPx{1&gB%-+Gl ļf]A`9\T@0 RjP LeFƺ@-hV!J wG%?Kc6)cnh(Ҍ-$ omLp =/EYSR&֪? Ћ ~dګc9o($DPxcuU]LPh{LQz(g+ߔutݍ%%#t7OT[DO֪\lp /`I LWa ^9: %u` TH{=g^Q7x y.S& ApKQ׸h d]4/K.Y]-4&Oi(%Np2plMP2XN2Y0EuAl`D)q8e>snDKQ 18L\GV^<jq$1ƌ8h}Ցkus1~$q *LLmNJ"jZD֭r +' U<.)~F$M(۝4qU~]CwQG '3gHL+Tq5Q]t@U1CANsT+qhQĞiUؠe4na^k/^h$SNoJݶzLdCL6\U2*YS9g vNv Zu)* Jmk|T92i*9d(~ E i>\! OBC"H"r)MF'tOX@Fq5vMk"O@kQ! '2^0l+%޴Zk:1_1FZ 0\:V-~5ghEVm[*uASHk"UDU3nUAtL甡oaY<H(DHA]wGNm,5Ԙen BO}}XK; ۏFBjqSjwCi=T*u)})Z :\Okd`h*E۷- 88u݊A:50GJ|/zpCF%aZ5Za8I-N!a6RLEVa&Vo!;m$9fO=[ƷgYrPBa@u tR[ N!Z;^%33>IPm 'EV-Yydk/Fr[*XA "<$ ݑC&~?d Ii %@"0Q0^bRN>?.NPeDIi:7'a"A{Z{Ɵ;5P(=зzǽR\K]`6h$:UG ,cQt]=$oF /}i- [ns *b*Ϟ4,q^wk >2Dd[ߞ;D>8mT%V+/TVF] %ډJ%jH )Y! :,Sޝh^$h2u?'/$\d)]9#Kv^!s@e{<"scSM݌RwNFĸ ((DhTg0Uɚ)tk}eG 7mLe ffaKQlE 88Nj iXu7:ORDmj_*o*ClX nB-Pehc7g I]13o6=hP]o+<8͡;ԛ\G?Q(rfGL@mm)x/uBEc %,Yhipؿ*(D[,{@}Շi*аȇL/95V NZa7 ntNG_ v +}g̶5R')da*-~E0xq|% `YiT@unӇmR}u% ,5Q6Zz<;b}\K g_ =U.eS@oR1 0?m\/Jl8jfm!7[co|OğMEE#5(﫾jpkl`e=+Q3f8QC#7QuIpd5g>h1eUl+;G˵l.vzlVKX ,7ϩwfz:Vv6 \ըbZVfS _OpyL.owҭYjAhJBRםl;D޿&fgDƿtK gga(7ecB.Ka.lo?EL(ehSidKѓ'$gS")K߷kço`C=@l24άmnf_tEvaIG@W7XeC)ܮЎ%;*4T^࿳˃s@I'ζ:E.k/"WT1xW|S(‰Tܢqف{)L+%,&@ UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1:` SYS$ASSIGN SYS$DASSGN; DECC$FCLOSE DECC$FOPEN DECC$CTERMID DECC$FGETC DECC$FFLUSH=0 ;=` 7DECC$GA_STDERR DECC$FPUTS7DECC$GA_STDOUT=r0 DECC$FPUTC=H=0( ;=P < <= 4; ;=+#"TTYIODEC C V4.1-001v v= 44= __iscntrl4= o0$ $= 4: := (4= 0 = 044= echo04= J J J J J J K K K K K K K ($ $= 44: := 4=  = 4H4=tt_getch4=WON &K &K &K &K 8K >K >K0$ $= 4: := 4=  = 44= getp4= L  L  L  L  L L L L L L L L L L8$ $= 4: := 4= L =   ww1<#V1.0CCUBZ2ERRV1.029-APR-2009 07:21DEC C V4.1-001  $ABS$i0$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPEP P=80GkG;F!0@a/aK$DkT T=0 ;7DECC$GA___CTYPE= ==-%$UBZ2ERRDEC C V4.1-001v v= 44= __iscntrl4= ]0$ $= 4: := (4= 0 =  ww1MI#V1.0DDUNREDUCEV1.029-APR-2009 07:21DEC C V4.1-001  $ABS$i0$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPEP P=80GkG;F!0@a/aK$DkT T=0 ;7DECC$GA___CTYPE> >=.&%UNREDUCEDEC C V4.1-001v v= 44= __iscntrl4= W0$ $= 4: := (4= 0 =  ww1y#V1.0DDUNSHRINKV1.029-APR-2009 07:22DEC C V4.1-001H H $ABS$i$CODE$ $LITERAL$p$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPEGREADBYTEFLUSH0J0UNSHRINK MASK_BITS =GkG;F!0@a/aK$Dkp# ?$~! ^G^G ~(08޴@HP>X^`~hpx޵GG4G  $Ԡ $ & Ԁ" p.t0J"4 BSpJT BtFp>".xJ @ ?!WJF>"w4K.t B!# BUJF>"wK. "UJF> &?!"G7B7"7 D& 7" d&7R $s $$"`_% $'])4G9R"%@ & & & d&81B֢.J"Ӳ(BG0b@Zk G+  & $&1 D& d&+pI & CB +F"t & &8b $'֢ D' d'98J$ $$6K61B۲F!t G G!.sI & &Q!J '3F!> D'"0BG & &4G w@+"u(G $' $$9 $& & 1 C1 Q.QJ1"4GG(BG0b@ZkG & $&. 1 D& .I d& &CB.F"Ա &Nk@ & $'/"! VA V'%C@ZtIZ#@,G@HD<9#G@. % &Ԁ/Ԁ!WJ"KpIF>֢9#F"9"9@Q.C9B GOAQJ( $$. d&!J &.{J & D'WJ $'F>s֢]0`B"52Fڲ@HB4GPbtG@Zk & $&G D&= J!OA0@VB" &""69# V0BZ#@v0B{#` 0B" 0B4 ?4" GV"R"@0BT!_@ &!Ԁ.GԀ"TByIWJ &F> GGTGGTG D' $:4GtGC`HBPb@Zk GDGGGG]] }(08ݤ@HP=X]`}hpxݥ#k4GREADBYTE4b#READBYTE4 @READBYTE4XGhREADBYTE4`b#READBYTE4d@hREADBYTE4`GpREADBYTE4hb#READBYTE4l@pREADBYTE,GFLUSH,b#FLUSH,@FLUSH,XGdFLUSH,\b#FLUSH,`@dFLUSH =0 K UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;19;7DECC$GA___CTYPE=0 0;= 7GREADBYTE7 MASK_BITS`FLUSH> >=.&%UNSHRINKDEC C V4.1-001v v= 44= __iscntrl4= 0$ $= 4: := (4= 0 = 044=unshrink04= )$ ) ) )# ) ) )" ) ) ) ) ) ) ) ) ) * * * * * * * * * *  * *  * * * * * * * "* "* #* %* &* &* '* * * * * * 2*  ;* <* >* B* G* L* P* S* S* S* F* X* Y*  h* h* h* h* h* h* l* l* q* g* * * * * * * * * * * G*$  * *P$ $= 44. .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  04= . .=  /4=  =  = : := x4= ' '=# partial_clear =  =  ww GOATLEY UNSHRINK <+# GOATLEY ZIPINFOCe# GOATLEY VMS~ GOATHUNTER UNZIP1q$#V1.0CCZIPINFOV1.029-APR-2009 07:22DEC C V4.1-0010 0 $ABS$i S$CODE$ $LITERAL$`$LINK$$DATA$$BSS$ $READONLY$DECC$GXSPRINTF DECC$ISATTYDECC$GA___CTYPE DECC$STRNCPY DECC$MEMCMP DECC$STRRCHR DECC$STRLEN DECC$STRCPY DECC$FREE DECC$MALLOCCENTRAL_HDR_SIGEND_CENTRAL_SIG END_CENTRAL64_SIGGUSAGE PROCESS_CDIR_FILE_HDR(J 0ZI_OPTS0J@ZI_END_CENTRAL(J  ZIPINFORATIOFNPRINTREADBUF DO_STRINGMAKEWORDMAKELONGFZOFFT ZSTRNICMPFIND_COMPR_IDXMATCH CENTSIGMSG ENDSIGMSG FILENAMENOTMATCHED EXCLFILENAMENOTMATCHED REPORTMSG OTS$DIV_UIOTS$MOVE =GkG;F!0@a/aK$Dk#~^^~ (0޴8@H>P^X~`hpGGGGGGO4GcG4GG G G*1@A@Kk!r.rJR"eF`G.r"R"SJgJ4eBB\BCkG0 B ",dGG4G,G ",dGGTG,G G4GdG GGGG, 4G4G4G", ",dGGG,G ",dGGG,G Gt䳬4GtdG ",GGtG,dG GGGG, 4G4G4G",䳐 GH䳌4GHdG ",GGTG,dG Ghz4GhwG4GtGB*1@ApF`0BO4Gc8b@Zk1t$ B4G(b4G@Zkt,$ @AF tG,$,DWABb\\B`CkG$İ$Dhô@A@A FG FG%E$EDG$DOGcG]]} (0ݤ8@H=P]X}`hp#k#TG~^^~ (0޴8@H>P^X~`G`{Gh¤, #$@ OxB $b GG@ZkG $[GGGGG@Zk(&"xBGTGbP @ZkGGG[GGG@Zk $8B $ ""G@btG@Zk #$8BG(B"@b?"tG@ZkxBGbGGGG@ZkGG[GGGG@Zk8B $ ""0B"@btG@ZkG8B(B"?"@btG@Zk G8B ""0B"@btG@Zk G8B(B"?"@btG@Zk8!xBGbGGGGGG@ZkG %[GGGGG@Zk C% $ C%0B"S8B@bGtG@ZkJ(" 8"8B #&@b 8@EAEG Gx0B"GtG@Zk #$8B Gx(B"@b?"tG@ZkxB&!bGGGGGGG@ZkGG[GGGG@Zk #%8B c%)0B" G@btG@Zk $8B G(B"@b?"tG@ZkxB bGGGGG@ZkGGGGGG $xB c%b&"k0AG0@G@ZkGG[GGGG@Zk8B $ #%@b0B" GtG@Zk8B $@bG(B"?"tG@Zk #%8B Gx 0B"@bGtG@Zk8B #%@bGx (B"?"tG@ZkpF!xBGbGGGGGG@ZkGG[GGGG@Zk8B #% C%@b c%) 0B"GtG@Zk@ k 8B C%@bG 8`E dE $0B"GtG@Zk(b!8B!xB b8DDGGGGGGG@ZkGGGGG&$ C% %h¤JG"8BG@btG@Zk $8BG0B"@bGtG@ZkxB c%k!b GGGGG@ZkGGGGG[G@ZkG]]} (0ݤ8@H=P]X}`p#k@#4G~8^@^H~PX`޴hpx>^~޵GG#¤(,048C@P@H Bb@ZkC&G0C QB01!J0B@SB3aJF@B@0BB4GCBbPB@ZkC&G4C QB41!J0B@SB3aJF@B@0BB &"0?#( F'G 4GG(PZ!GG@G_GBTG }<}Pb@ZklGBtGPbG@Zk# B(bG@Zk &$Gp!Q0B8bTGR HTGC@Zk, @ D ,O&4GL (}$ñC( F& G !G_f4IpBGFtGtBxbA3@Zk&0AA? G4G(}0NA.I4G0@& F&(}G !C`G Gf4IpBGFtGtBxbA3@Zk&0AA? G(HA4(I4G4@&(} F& %pR#F 0BҒ@J8btGCTG@ZkG4GpB $xb@Zk,,NHy1 KD =D G F&AhR5A(FFJ 7@Jp@F2v@J5J@r.rJzq@JF] G &3Ap֦0B "8b""2vJtG@ZkG!_.GqHN"PJtHF>n."wH#SrJzHtFr>.n#qHAVJH"F>./ &WAGY8K4J:G8?.!PJF>_}3oJ}`RI\ACkGX=#.9"9 CPJ>y/""I[qKq?Y.RAJA>y.9#StJt>XFTBXX}E ;~KD?$W! aCX=XEE_'4vJ`BXX=)"67JE9=K6CXݶX=D'W{#;eK1+JE;BX=X}E_#:FK3wJE@zBX}E`GT C`PE`ݦD&W"6JB`ݶ`=E?&!v?H1@`=]#GGX"BG_5/5K .{:KVJF>Z#0C!0B"Z.Gv:J0`BRZJ"VFZ>Z#Z#=#.9YCnHCPJ9#F> `BhbTGG@Zk@U@"`""3A  E#  F B G]_FEB]GFBEGFEGE4GEtGETGEGPEG%GeG%D%FeFFw1Jzq@K`HpQJr@JtрJ6JGDFFFDF@FG=۲E"q`Khb?DQG`BTG=G@Zk@T@`""3AGG$ E# ,#$ ?$'! #!@<@( ?$*'! #!@<@* ?$.'! #!@<@. ?$2! !@5 :F B9G]_FHB]3GFtB-GݦFtB'GT C#G]_GtIC]GD4 @GF BG]_FTFB] GFtBGݦFBݶ0I}GGGPGGGGPEGEGEGEG)G D FTJFFFz1@KaQ Hq JxqKs`JuѠJ7JG:DxFFFhbaFF!F=I]GRE_G`BrH#FTGG@Zk@V@`""3AGG 4GD HECA?@D"?"DE Fp`BEhbTGG@Zk0B@T@8b"3A"GG@ZkPEGE4GEtGDFEFGEa Hq Js`J/vInQI1DoFEx'.D7>H=Ed#B?D%@=ED @0B &8b "GTG@Zk!Bb""GtGtG@Zk Bbh""GtGtG@ZkBb""GtGtG@ZkBb""GtGtG@ZkBb""GtGtG@Zkx%(IAG?$! E#"0#('#"<<@&'"#00@<<@%*=?F,B=)G}FeB}#GFBGFTBG=?Gt,C=G}GnC} GEtAGFBETGEGFDEPEGCIeGtGGTGETGEGtFFӲEFF%G0IEFtGGtFFDFFG7F0EGGEEPFGFs1`JvJ8KzQ@Ka HuѠJdqHF(I{1`KFFGSG`BFDDhG$D=Ehb=#TGG@Zk@U@`""3AG0BG8bG@ZkB $b $HA` @H!""B"tG@Zk %0B!!8bGGGGGG %@ZkG %[GGGGG@Zk""hIGREGGGR E0B8bGGtG@ZkG $[GGGGG@Zk`%!uAuADՀAC EDD $pHD & &$hCG""JFF f&GhsGfJaFeF0B8bGtG@ZkG $[GGGGG@Zk $h,@$H E 1!BB % $bTGH!@Zk@H0BGD8b @LGtGvHD2@@ZkGGGGGEB $ %b砠""@ B"tG@Zk0B@ 8bGGGtG@ZkGGGGG[G@Zk % &!X"]"G@b# @!0BG8bGGGG@ZkGG[GGGG@ZkB $bG@ZkGpTGH0BC8b@Zk G,ݡD GGE,ݱE ,ݡ GGE,ݱ? %0B $ <]8bGGtG@ZkGG[GGGG@Zk %, &$PΥGGh tG = ECB0Ab@Zk0BG8bGGtG@ZkGG[GGGG@Zk % %BpΥ %P &@ &$RIhI!Ab@@@ ҰJ !G TBАJ0 HF?DCC C C4G.vI!C@Zk &$CaGH""[GTGGG@ZkBGb@ZkB $ &$b`B"PGtG@ZkB &$bGPB"?"tG@ZkG0BG8bGGG@ZkG f$[GGGGG@ZkCAhc 0B8b@'"p`Hp"tG@Zkp]"K_A+aI AK f$0BP'"cG8btG@ZkGGG[GGG@Zk %`BTGGhb@Zk0B @K @8b3+A"'"GGG@ZkGG[GGGGA@Zk`OA/I /A) f%0B8b@'"hkp"tGҰ`I@Zkp=! %0B8b'"GGtG@ZkGG[GGGG@Zk f$`BTGcGhb@Zk0B@O@8b3@'"GGG@ZkG &%[GGGGG3A@Zkp) `0B@'"8bp"2v ItG@Zkp]"GNA.I! AM $0B f%8b@'"GtG@ZkGG[GGGGE@Zkhk f$) G0B %fIc8bx'" P`EfEGGtG@ZkG %[GGGGG@ZktGh'"0BGΡtGI8b ETEG@ZkGGGGG &%bAh)5A f%&Ic 7 IkE p E)v I0B'"C#A8bGCtG@ZkGGGGG[G@Zk %0B $8bh0!! &%I '"EGGtG@ZkG %[GGGGG@ZkPb h)b!0B`'"G&I8btG !E#E %G@ZkGG[GGGG@Zk &X"]"G@b# @0B'"]"8bGtG@ZkG %[GGGGG@Zk %0B'"ΡG\OtG8b $@ZkGG[GGGG@Zk &%BB"G@ tGbg @ZkG0BG8bGtG@ZkGG[GGGG@ZkB f% %bkB"H GtG@Zk0BP!8bGGGtG@ZkG %[ %GGGGG@ZkpΥ`'"0BGtG8bRI@Zk f$G &%[GGGGG@Zk'"pcG0BtG) %8bҒ`H@Zk $GG[GGGG@Zkp'"0BGtG8bI@Zk f%G %[GGGGG@Zk'"dkG0BtG %8b0`A@Zk %GG[GGGG@Zkh'"Ρb È!PE"!GE0B8bGGtG@ZkG $[GGGGG@Zk`X@E! GRH!_- " ANI=/,O""aIA H </.Q0J0>o.!SrJr>ݦFTBݶ=D_'pE9>KWZ#:C=ݥhEE$.vIA=)_"27DJdE1=J2B==D%W!/I)+IbE` /A=ݦE"7J6JaEBݶ`E@=?GT*C=P`EݥD$W .IA`E_&0vJB}!!FeB} GG_"BG_.J//{JY/K;G/?!0B!0B"/,GrIA/H2D/<! .G. JVJyJ!F>!.GJF M/.MKUJwOK!F>!.JE 0 A O./ 0B4G8bROJO>!/c!J f&H'"Y!KG#G!?}"GG@ZkGGGGGG ! 8@E mER #! EA GEAG=?D'@=pE}GdEGbE4GhEtL UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1JGaETG `E GP`EG%FFFGEG%E0BEr1@JuqJwJyQ K{`KmѠI#gHFF2G EsD8bFmDrD}GeE &(IDD0'"}"GGG@ZkGGGGG4G%!XBE mEw#!'#m <A`$'c ##A<A`$'c М##A<A`$'c ##A<A`'"'"'" '" ('" 8'"H'"X'"h'"x'"PB"0`I@ZkG=EP`E8bG`EGF GTEE G EwJy K#gH!!Hi I7GaDhEG7D+FpEG)D=aIjFGRJFPEGt1JqQ Jsq`J0JE4FpFDF F'F'"}"0BGGG@ZkGGGGGGAE@E` AE AE _AxAE@A?$! DaE#"0#('#"<<@&'" /=#00@<<@%*À=?F,B=)G}FeB}#GFBGFTBG=?Gt,C=G}GnC} G}Dtn@}G E AaI= aE=TGCEtGGbEG-E%E0`IhE tG GF`ETGpEGP`EGtjDeDEFFFAG@G0`EGGdETGhGEJFEFFP@GGGWG0B`1Hq J3gJuQJxKc`HhqI?D9?Kt1JxD(FaFF#DEFF f' DF'";}"8bGGG@ZkGGGGGG %0B2H8b'"AJGtG@ZkGGGGG[ %G@Zk0'"`ΡGtGE f$0BGc8b@ZkGGGGGHG8E %0Bp'"8bGGtG@ZkGGGGG6G0'! PE0g p! f%EEEk0 " E0G#b#E0'"xB"E0"#GE>:G0BGFFE~0'!8bxb E0!h D~ E G'"GGtG@ZkGGGGG[ %G@Zk TGphϒIl  $G G`,GE,! %0B8b'"ΡGTG@Zk/vIGG[GGGG%@ZkAk!^G@BGHb4G-A@Zk@BGHb "4G+vI@ZkG @ &$!0B8'"G8bGGGG@ZkGG[GG!"G@ZkG<5`@/`@><5a@>/Ua@>J8bX '"N"G `?=@ZkGG[GGGG@Zk`oH- "b#LI E=@gã@$` BEE%(bG4GJL!@Zk D"b#@n,n! %0B !8bkH  `D '"GGtG@ZkGG[GGGG@ZkA D` Bip$(bG4GdZc @ZkD"b#x@@B"!N"G@Zk f% -X '"0B]"kGI8btGC,@H<@ZkGG[GGGG@ZkG@ BG(b4G!@Zkn-c '"lI 0`E`G0'" %0' 0B`"aE8bGGGG@ZkGG[GGGG@ZkG ` 4GC B(b@Zk }`@ H G ì@n. &$.".".tJ0B#aJJ8bJ '"GG@ZkGG[GGGG@Zkï@}-n 0B f%8bIkgH0 g"`D! @0LGGv H D2 @RBQQB#q@GG@ZkGG[GGGG@ZkGDZ-n @BGHb4GI@ZkC+HlD`H C+V`I0H#aH`EClF`GG lFEC@ &$0B#aH8b"aB'"CGG@ZkGG[GGGG@ZkjGy@&n !}!_,""0BG8btGHc l@@Zkk! &0B '"8b]"DpGtG@ZkGGG[GGG@ZkBG@@ %`0B0'"G8bTG@ZkGGG[GGG@ZkCG f$0B8b '"cGTG@ZkGGG[GGG@ZkGC G` I0B f$8bAc ,8'"GtG H@ZkG 0A[GGGGGA@Zk f$(Ac+vI""[G4GGG@Zk`A A %X""lG4G[GG@Zk %$`c  f% !Ek#aH'"aH B" aD<u@A@AxAEEX " `D IE2 0BG8bUX"GG@ZkGG[GGGG@Zk!G %0B `D8b  !aDE'"HB"X "GUX"GG@ZkGG[GGGG@Zk C@A#aH } % f%p@ '"kGTGI 0B8b@ZkGGGGG1 %0B8b'"GTG@Zk %GG[GGGG@ZkGpΥTG0B8bIC@Zk G hG,E,&G %0B8bh'"GTG@ZkGGGGG[G@Zkh,GE, f$GpcTGfH `0BC8b@ZkG/!, f%@ %@k! $h@@IH'@H@H@8 0A8#G %GpTGȒI 0BC8b@ZkG`#!,}[ f%GpkTGfI `0B8bC@ZkG ,N ] G_E <GBTGb 0A<P@ZkAG %< G`"?%+aI<])! f$ Ec C$1@DD $0`0B %!8b UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1GGtG@ZkG %[GGG"G@ZkG0BTG tG8b"@ZkGG[GG"G@Zk,] G,ݱ GGGGtG,DTG,h"!@=A=AH ECBb@Zk G`"!+C 8ݡ $HB"h!B8Eo b EcICeE.AGMtG@Zk G@B"BGbtGC@Zk0B F%>J!8bGGGGG4GvHD%@@H@(hA8]@ZkGG[GGGG@Zk0ݡf G*C#"`G0E?A(HFE?AP"A f$%Hc %EA0B!EG8btG@ZkGG[GG"G@Zk 0 A$ApB04Gxb@Zk4ݡ fG)C"!`4HA*IHA"@ %(I f$@0Bc DG8btG@ZkGG[GG"G@Zk&0AA?pB44Gxb@Zk %hXb!Ρ=B F%PGEbtGG@Zk@JGPGtG DBb $ %@Zk0B!8bG"TG@ZkGG[GG"G@Zk4G,,=8} %,X"",= A@m!iDtaD,[G4GGG@Zk,G8]@]H}PX`ݤhpx=]}ݥ#kG#TG~^^~ (0޴8@HG,GGH##.DC"2JBc" ," HDBDM!. !J2DH C.@JC"FB1,1H2D? ,HC"FB1,1H2D6  8O=,HDB1,1H#"2D- C.QJ?FBA.AJ2D% C.SJ_FBa.aJ2D c.vJFB.J2D b("8B &@b &Р >G^G~GG@ZkGG4G#.C"c."#,".2JtJ/"C/0H J($H%H1#J3bJ##!!H5Jc @K3BCK@8B5B8@#B $ $!!H#aHƠG!P";aK@bCCGGG@ZkGGGG[GG@ZkG]]} (0ݤ8@HP#kG#~^^ ~(08޴@HP>X^`~hG#GG1JJ6#JJ/F*BvJAFD#F@@JBDGF" F B"b1"GtG@Zk]!G"@@ Hh!  @@!b", @1"" l_"@>GGGGG HkG" `l X1">@GGGG BG(bG@ZkK@" HkkA  @(1"2@GGGGGBb@ZkG]G] }(08ݤ@HP=X]`}hp#k,-G4USAGE,.,b# USAGE,-0@4USAGE4+@GT DECC$ISATTY4,Hb#  DECC$ISATTY4+P@T DECC$ISATTY4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF,(GLFZOFFT,@b#FZOFFT,H@LFZOFFT,PGpFZOFFT,`b#FZOFFT,l@pFZOFFT4pGDECC$GXSPRINTF4xb#DECC$GXSPRINTF4@DECC$GXSPRINTF,GFZOFFT,b# FZOFFT,@FZOFFT,GFZOFFT,b#FZOFFT,@FZOFFT,GFZOFFT,b#FZOFFT,@FZOFFT,G4FZOFFT,(b#FZOFFT,0@4FZOFFT48G`DECC$GXSPRINTF4 @b#DECC$GXSPRINTF4\@`DECC$GXSPRINTF,GFZOFFT,b#FZOFFT,@FZOFFT,GFZOFFT,b#FZOFFT,@FZOFFT,GFZOFFT,b#FZOFFT,@FZOFFT4 GDDECC$GXSPRINTF4 b#DECC$GXSPRINTF4@@DDECC$GXSPRINTF,hGFZOFFT,b#FZOFFT,@FZOFFT,GFZOFFT,b#FZOFFT,@FZOFFT4GDECC$GXSPRINTF4b#DECC$GXSP RINTF4@DECC$GXSPRINTF4G DECC$GXSPRINTF4b#DECC$GXSPRINTF4@ DECC$GXSPRINTF,@GhFZOFFT,Lb#FZOFFT,d@hFZOFFT,hGFZOFFT,pb#FZOFFT ,@FZOFFT, GFZOFFT,b#FZOFFT,@FZOFFT,GFZOFFT,b#FZOFFT,@FZOFFT4G DECC$GXSPRINTF4b#DECC$GXSPRINTF4@ DECC$GXSPRINTF, GL FZOFFT,, b#FZOFFT,H @L FZOFFT,X G FZOFFT,` b#FZOFFT, @ FZOFFT4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF, G FZOFFT, b#FZOFFT, @ FZOFFT, G8 FZOFFT,( b#FZOFFT,4 @8 FZOFFT48 Gd DECC$GXSPRINTF4D b#DECC$GXSPRINTF4` @d DECC$GXSPRINTF4!H GT DECC$MALLOC4"L b#  DECC$MALLOC4!P @T DECC$MALLOC4! G DECC$MALLOC4" b#  DECC$MALLOC4! @ DECC$MALLOC, x G READBUF,  b# READBUF,  @ READBUF4 G DECC$MEMCMP4 b#  DECC$MEMCMP4 @ DECC$MEMCMP< G PROCESS_CDIR_FILE_HDR< b# PROCESS_CDIR_FILE_HDR< @ PROCESS_CDIR_FILE_HDR4{ UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1 G DO_STRING4 b#  DO_STRING4 @ DO_STRING, X G| MATCH, l b# MATCH, x @| MATCH,  GMATCH, b# MATCH, @MATCH4pG DO_STRING4xb#  DO_STRING4@ DO_STRING4G DECC$FREE4 b#  DECC$FREE4@ DECC$FREE,GFNPRINT,b# FNPRINT,@FNPRINT4G  DO_STRING4b#  DO_STRING4@  DO_STRING4#<GhFIND_COMPR_IDX4$Pb# FIND_COMPR_IDX4#d@hFIND_COMPR_IDX4pG DECC$STRCPY4@ DECC$STRCPY4HGdDECC$GXSPRINTF4Pb# DECC$GXSPRINTF4`@dDECC$GXSPRINTF4<GP OTS$DIV_UI4@b#  OTS$DIV_UI4L@P OTS$DIV_UI4lb#  OTS$DIV_UI4xG OTS$DIV_UI4@ OTS$DIV_UI4b#  OTS$DIV_UI4G  OTS$DIV_UI4@  OTS$DIV_UI4`Gx OTS$DIV_UI 4hb#  OTS$DIV_UI4t@x OTS$DIV_UI4xGDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF4@G\ DECC$STRRCHR4Hb#  DECC$STRRCHR4X@\ DECC$STRRCHR4dG ZSTRNICMP4hb#  ZSTRNICMP4|@ ZSTRNICMP4G ZSTRNICMP4b#  ZSTRNICMP4@ ZSTRNICMP4G ZSTRNICMP4b#  ZSTRNICMP4@ ZSTRNICMP4G ZSTRNICMP4b#  ZSTRNICMP4@ ZSTRNICMP4G ZSTRNICMP4b#  ZSTRNICMP4@ ZSTRNICMP4$G\ OTS$DIV_UI4Db#  OTS$DIV_UI4X@\ OTS$DIV_UI4pGDECC$GXSPRINTF4xb# DECC$GXSPRINTF4@DECC$GXSPRINTF,GFZOFFT,b# FZOFFT,@FZOFFT4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF4DG\DECC$GXSPRINTF4Hb# DECC$GXSPRINTF4X@\DECC$GXSPRINTF4G(DECC$GXSPRINTF4b# DECC$GXSPRINTF4$@(DECC$GXSPRINTF, pGRATIO,|b# RATIO, @RATIO4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF,GFZOFFT,b# FZOFFT,@FZOFFT4G8DECC$GXSPRINTF4 b# DECC$GXSPRINTF44@8DECC$GXSPRINTF4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF,GFNPRINT,b# FNPRINT,@FNPRINT4G DO_STRING4b#  DO_STRING4@ DO_STRING4@GlDECC$GXSPRINTF4Xb# DECC$GXSPRINTF4h@lDECC$GXSPRINTF,GFZOFFT,b# FZOFFT,@FZOFFT4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF4# G FIND_COMPR_IDX4$L b# FIND_COMPR_IDX4# @ FIND_COMPR_IDX, G FNPRINT, b# FNPRINT, @ FNPRINT, G!FZOFFT, b# FZOFFT,!@!FZOFFT,!G,!FZOFFT,!b# FZOFFT ,(!@,!FZOFFT40!GL!DECC$GXSPRINTF48!b# DECC$GXSPRINTF4H!@L!DECC$GXSPRINTF4|!G!DECC$GXSPRINTF4!b# DECC$GXSPRINTF4!@!DECC$GXSPRINTF4!G!DECC$GXSPRINTF4!b# DECC$GXSPRINTF4!@!DECC$GXSPRINTF4!G" OTS$DIV_UI4"b#  OTS$DIV_UI4 "@" OTS$DIV_UI4"G<"DECC$GXSPRINTF4"b# DECC$GXSPRINTF48"@<"DECC$GXSPRINTF4|"G"DECC$GXSPRINTF4"b# DECC$GXSPRINTF4"@"DECC$GXSPRINTF4"G"DECC$GXSPRINTF4"b# DECC$GXSPRINTF4"@"DECC$GXSPRINTF4"G# OTS$DIV_UI4"b#  OTS$DIV_UI4"@# OTS$DIV_UI4#G(#DECC$GXSPRINTF4 #b# DECC$GXSPRINTF4$#@(#DECC$GXSPRINTF4X#Gt#DECC$GXSPRINTF4`#b# DECC$GXSPRILjw UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1 F NTF4p#@t#DECC$GXSPRINTF4#G#DECC$GXSPRINTF4#b# DECC$GXSPRINTF4#@#DECC$GXSPRINTF4#G $DECC$GXSPRINTF4$b# DECC$GXSPRINTF4$@ $DECC$GXSPRINTF4P$Gx$DECC$GXSPRINTF4d$b# DECC$GXSPRINTF4t$@x$!DECC$GXSPRINTF4$G$DECC$GXSPRINTF4$b# DECC$GXSPRINTF4$@$DECC$GXSPRINTF4 %GH%DECC$GXSPRINTF4%b# DECC$GXSPRINTF4D%@H%DECC$GXSPRINTF4x%G%DECC$GXSPRINTF4%b# DECC$GXSPRINTF4%@%DECC$GXSPRINTF4%"G&DECC$GXSPRINTF4%b# DECC$GXSPRINTF4%@&DECC$GXSPRINTF4(&GL&DECC$GXSPRINTF4@&b# DECC$GXSPRINTF4H&@L&DECC$GXSPRINTF,p&G&FZOFFT,&b# FZOFFT,&@&FZOFFT4&G&DECC$GXSPRINTF4&b# #DECC$GXSPRINTF4&@&DECC$GXSPRINTF,&G&FZOFFT,&b# FZOFFT,&@&FZOFFT4&G'DECC$GXSPRINTF4'b# DECC$GXSPRINTF4'@'DECC$GXSPRINTF4H'Gd'DECC$GXSPRINTF4X'b# DECC$GXSPRINTF4`'@d'DEC$C$GXSPRINTF4'G'DECC$GXSPRINTF4'b# DECC$GXSPRINTF4'@'DECC$GXSPRINTF4'G'DECC$GXSPRINTF4'b# DECC$GXSPRINTF4'@'DECC$GXSPRINTF40(GL(DECC$GXSPRINTF4@(b# DECC$GXSPRINTF4H(@L(DECC$GXSPRINTF 4(%G(DECC$GXSPRINTF4(b# DECC$GXSPRINTF4(@(DECC$GXSPRINTF4\+G+DECC$GXSPRINTF4d+b# DECC$GXSPRINTF4+@+DECC$GXSPRINTF4t,G,DECC$GXSPRINTF4,b# DECC$GXSPRINTF4,@,DECC$GXSPRINTF4-G . DECC$STRCPY4&.@ . DECC$STRCPY4.b# DECC$GXSPRINTF4.G.DECC$GXSPRINTF4.@.DECC$GXSPRINTF4 1G1DECC$GXSPRINTF4x1b# DECC$GXSPRINTF41@1DECC$GXSPRINTF41G1DECC$GXSPRINTF41b# DECC$GXSPRINTF41@1DECC$GX'SPRINTF42G$2DECC$GXSPRINTF42b# DECC$GXSPRINTF4 2@$2DECC$GXSPRINTF4L2Gl2DECC$GXSPRINTF4X2b# DECC$GXSPRINTF4h2@l2DECC$GXSPRINTF42GH3DECC$GXSPRINTF4 3b# DECC$GXSPRINTF4D3@H3DECC$GXSPRINTF43G3(DECC$GXSPRINTF43b# DECC$GXSPRINTF43@3DECC$GXSPRINTF44G 4MAKEWORD44b# MAKEWORD44@ 4MAKEWORD4 4G<4MAKEWORD4(4b# MAKEWORD484@<4MAKEWORD4P4Gx4DECC$GXSPRINTF4`4)b# DECC$GXSPRINTF4t4@x4DECC$GXSPRINTF46G6DECC$GXSPRINTF46b# DECC$GXSPRINTF46@6DECC$GXSPRINTF47G7MAKELONG47b# MAKELONG47@7MAKELONG47G 8DECC$GXSPRINTF47b# DECC$GXSPRINTF*48@ 8DECC$GXSPRINTF4@8G\8MAKELONG4H8b# MAKELONG4X8@\8MAKELONG4`8G|8DECC$GXSPRINTF4h8b# DECC$GXSPRINTF4x8@|8DECC$GXSPRINTF48G8MAKEWORD48b# MAKEWORD48@8MAK+EWORD48G8MAKELONG48b# MAKELONG48@8MAKELONG4'9G9 DECC$STRNCPY4(9b#  DECC$STRNCPY4'9@9 DECC$STRNCPY4:GH:MAKEWORD4$:b# MAKEWORD4D:@H:MAKEWORD4H:G,t:DECC$GXSPRINTF4P:b# DECC$GXSPRINTF4p:@t:DECC$GXSPRINTF4:G: DECC$STRCPY4:@: DECC$STRCPY4%:G: DECC$STRLEN4%:@: DECC$STRLEN4 ;G ; DECC$STRCPY4;@ ; DECC$STRCPY4%P;GX; DECC$STRLEN 4%-T;@X; DECC$STRLEN4x;G; DECC$STRCPY4;@; DECC$STRCPY4;G;DECC$GXSPRINTF4;b# DECC$GXSPRINTF4;@;DECC$GXSPRINTF4<G(<MAKELONG4<b# MAKELONG4$<@(<MAKELONG48<G`<DECC$GX.SPRINTF4L<b# DECC$GXSPRINTF4\<@`<DECC$GXSPRINTF4<G<DECC$GXSPRINTF4<b# DECC$GXSPRINTF4<@<DECC$GXSPRINTF4<G=DECC$GXSPRINTF4<b# DECC$GXSPRINTF4=@=DECC$GXSPRINTF4P=Gh=MAKELONG4X=b# p9G UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1./MAKELONG4d=@h=MAKELONG4h=G=MAKEWORD4p=b# MAKEWORD4|=@=MAKEWORD4=G=DECC$GXSPRINTF4=b# DECC$GXSPRINTF4=@=DECC$GXSPRINTF4=G=MAKELONG4=b# MAKELONG4=0@=MAKELONG4>GX>DECC$GXSPRINTF4$>b# DECC$GXSPRINTF4T>@X>DECC$GXSPRINTF4>G>MAKELONG4>b# MAKELONG4>@>MAKELONG4>G>MAKELONG4>b# MAKELONG4>@>MAKELONG148?Gd?DECC$GXSPRINTF4P?b# DECC$GXSPRINTF4`?@d?DECC$GXSPRINTF4?G?MAKELONG4?b# MAKELONG4?@?MAKELONG4?G@DECC$GXSPRINTF4?b# DECC$GXSPRINTF4@@@DECC$GXSPRINTF4H@Gd@MAK2ELONG4P@b# MAKELONG4`@@d@MAKELONG4)x@G@OTS$MOVE4)@@@OTS$MOVE4@G@DECC$GXSPRINTF4@b# DECC$GXSPRINTF4@@@DECC$GXSPRINTF4@GAMAKELONG4Ab# MAKELONG4 A@3AMAKELONG4QGQDECC$GXSPRINTF4Qb#`DECC$GXSPRINTF4Q@QDECC$GXSPRINTF4xRGR OTS$DIV_UI4Rb#` OTS$DIV_UI4R@R OTS$DIV_UI4RGRDECC$GXSPRINTF4Rb#`DECC$GXSPRINTF4R@RDECC$GXSPRINTF = .r.-... ?%u.%u=XLh x`h `h ````h `h h h `` =8,pxp=@8@h`0 @=0 ;7DECC$GA___CTYPE=0 XN;=P 7G;PDECC$GXSPRINTF=0 (Q;=p  OTS$DIV_UI=XABALLlnk =(XABPROXABDATbinaryyes=lab =rdo = XABKEY-A7 REPORTMSG7 ENDSIGMSG7 EXCLFILENAMENOTMATCHED= unknown= version=. = bat0=%3d%%8=btm@ PROCESS_CDIR_FILE_HDR DECC$STRRCHR= %sh= p=nox= B=un=exe MATCH READBUF RATIO=8FNPRINT DECC$MEMCMP ZSTRNICMP|;=uFZOFFT=08  ;= MAKELONG DO_STRINGMAKEWORD DECC$STRCPY=%u.%u7CEND_CENTRAL_SIG DECC$FREE7CENTRAL_HDR_SIG=! DECC$MALLOC=%c;#FIND_COMPR_IDX% DECC$STRLEN= %s %s =X=not =com=%03u = %s %s %s 0=cmd8=%02xD@=may beP' DECC$STRNCPY8OTS$MOVE=isp7FILENAMENOTMATCHED7END_CENTRAL64_SIG7 CENTSIGMSG==hid =sys =text=ebcdicdir = XABFHCXABRDTarc =FAB=0 @;= Ep 11= entries=entry=are =0 0;= + DECC$ISATTY-USAGE 4 4 4 404@4P4`4444F4444h4444404@4P4`4x4p4x44444444 4(4G(484H4X40484@4h4x44H4X44`44666666666H6P4 ==s=Amiga=VMS =Unix(=VM/CMS0=CP/M8= TOPS-20NTFSH=MVSP=AtheOSX=BeOS`=TheoshI=shrunkp=(bzippedLZMA-edPPMd-ednormal= maximumfast=OS/2=VM/CMS=MVS=AtheOS=BeOS=AOS/VS=Theos=unknownstored=access=EditJ=Object=: = %02x=%03d=`SZip file size: %s bytes, number of entries: %s End-of-central-directory record: p=0"------------------------------- =@1 Zip archive file size: %s (%sh) =H= Central directory entry #%lu: --------------------------- K= MS-DOS, OS/2 or NT FAT(= Atari ST8=(OS/2 or NT HPFSMacintosh HFSX= Z-Systemh= SMS/QDOSx=Acorn RISC OS= Win32 VFAT= Tandem NSK= Mac OS/X (Darwin)=none (stored)= reduced (factor L1)= reduced (factor 2)= reduced (factor 3)= reduced (factor 4)0= imploded@= tokenizedP= deflated`=8*deflated (enhanced-64k)imploded (PK DCL)= tersed (IBM)= LZ77-compressed (IBM)= WavPacked/ UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1LM= superfast=@5 There are an extra %s bytes preceding this file. = unknown (%d) =@6 file system or operating system of origin: %s X=H9 version of encoding software: %u.%u =@6 minimum file system compatibility required: %s =H9 minimum software version required to eNxtract: %u.%u =@6 compression method: %s H=@7 size of sliding dictionary (implosion): %cK =@6 number of Shannon-Fano trees (implosion): %c =@6 compression sub-type (deflation): %s =H? file security status: %sencrypted 0=@6 extended local header: O %s h=@6 file last modified on (DOS date/time): %s =H9 32-bit CRC value (hex): %.8lx =H< compressed size: %s bytes  =H< uncompressed size: %s bytes `=H< length of extra field: %u bytes =DP< disk number on which file begins: disk %lu h h=@6 apparent file type: %s =@4 VMS file attributes (%06o octal): %s P=@4 Amiga file attributes (%06o octal): %s =@4 Unix file attributes (%06o octal): %s =H= non-MSDOS external file attributes: %06lX hex Q =H: MS-DOS file attributes (%02X hex): none @ =H? MS-DOS file attributes (%02X hex): read-only  =@6 Theos file attributes (%04X hex): %s  = Library  = Directory  = Sequential  = Direct  = Keyed  = RIndexed  = 86 program ( = 286 program 8 = 386 program H = ??? X =8/ The central-directory extra field contains: =@6 - A subfield with ID 0x%04x (%s) and %u data bytes = PKWARE 64-bit sizes = PKWARE AV = PKWARE VMS S= PKWARE Win32 = PKWARE Unix = Info-ZIP VMS( =(old Info-ZIP Unix/OS2/NTH = Unix UID/GID (16-bit)` =0'Unix UID/GID (any size)universal time =UTF8 path name = UTF8 entry comment = old Info-ZIP Macintosh = new Info-ZIP MacintoshT =0#ZipIt MacintoshSmartZip Macintosh =0!ZipIt Macintosh (short)OS/2 ACL0 = Security DescriptorH = SMS/QDOSX =Acorn SparkFSh =(Fred Kantor MD5ASi Unix = Tandem NSK = run-length encoded = deflated =compressUed(?) =@2. The local extra field has UTC/GMT %s time%s = modification = creation( =0". The Mac long filename is %sP =(. File is marked as %sp =Resource-fork = Data-fork =@5. File is marked as %s, File Dates are in %d Bit =@1V. The QDOS extra field subtype is `%c%c%c%c'=8/. The AOS/VS extra field revision is %d.%d0= Unstructured@= RelativeP=(Entry SequencedKey Sequencedp=0&. The 128-bit MD5 signature is %s=(. The first 20 are: =8/GMT modification/access times and Unix UID/GIDW=0#GMT modification/access times only=( There is no file comment. 0= %02u-%s-%02u %02u:%02uH=@2%u %s %u %02u:%02u:%02u%04u%02u%02u.%02u%02u%02u= Actual end-cent-dir record offset: %s (%sh) Expected end-cent-dir record offset: %s (%sh) (based on the length of the central directory and its expected offset) 08 8 = This zipfile constitutXes the sole disk of a single-part archive; its central directory contains %s %s. The central directory is %s (%sh) bytes long, =@6 and its (expected) offset in bytes from the beginning of the zipfile is %s (%sh). This zipfile constitutes disk %lu of a multi-part archive. The central directory starts on disk %lu at an offset within that archive part of %s (%sh) bytes. The entire central directory is %s (%sh) bytes long. =pb Y%s of the archive entries %s contained within this zipfile volume, out of a total of %s %s. p=PD%lu file%s, %s bytes uncompressed, %s bytes compressed: %s%d.%d%% =u offset of local header from start of archive: %s (%sh) bytes 0=PA length of filename: %u characters x=PA length of file comment: Z %u characters =PF MS-DOS file attributes (%02X hex): %s%s%s%s%s%s%s%s = error: EF data block (type 0x%04x) size %u exceeds remaining extra field space %u; block length has been truncated. =. The local extra field has %lu bytes of OS/2 extended attributes. (May not match OS/2 "dir" amount due to storage method)=PF. The[ extra field is %s and has %u bytes of VMS %s information%s`=XM. The local extra field has %lu bytes of access control list information=XI. The local extra field has %lu bytes of NT security descriptor data=XN. The UTF8 data of the extra field (V%u, ASCII name CRC `%.8lx') are: P=. The first 24 UTF8 bytes in the extra field (V%u, ASCII name CRC `%.8lx') are: >LQkPOd9J(OROFZ]kQH%UjhE*@k땮ނNz(T`Ot]%mAݎ/i.) RJlُUO/މɜ,e9|Г`rsr2aH {mοM{3@84X =\V#+ cQ7bwˍ. OBdqxF17㨊su29WRUНu{CED}U [5w,YgF'k=cOj,AL[AVvże+`+K51ﻢ/huIM"lڇ4b +8( dSExdfCkK"ؤRz]Oȁ'nl$ViRve^dJpǕxٌ|78 z ǁLjdЫ̀J/ ,6qS1g(DN'vWzBtCME#< uβ6x%m.@74\#:aJ#A>^M4n/‡RQxQ ~ [yjwoӢS2O,?s Y@8r#.C˻DUƄ ˦IC)_>ӑy@9AȎY_: y@ Cs*LZ#z;?RЀtj:꒛xx43tҢ*G7blTu3K|)u_s\ğ=g i*1pϊ`M' 3XIz7ȳ|v -TIaLD:cN?VCԛշ^s&XX3TS:ߠK_>$R`iOVPKϛmGj=F =Hq:G֙A˾O BB`Zʕ}=T-^/x5Ξ6u:/-u?-OdIC6<`pQ33"7,2v=W=RN0m̦[(3 ܐ3gi>Pգ+b'* |"ڥNx$b0Qq) ^>H%udxB ̉3~#Lk%H~cl"@lW5TT#e3l;Wg*8W5BAPC|j%M`emPy|?-ngt3@ƌ׵Jbr%v19|1w&LIJGC(Ctzl;ńzwa̩Ce"`!J 24KL~c oalmXH㥺Ka_?9;!dt\w 'E 2T«O %}ND8%66 hc{kCK׭ n|a'(wz(ؓXD0VK k_~l- 483<#^;֖n츥mJC&8sls 92)2:o)rҲɵa2לBI'[gD`)$%Y(['x{ȕkct_I?w[ۀV(rYmM~z(ӔaԭUs 6C<҂׫}bqǻ![h?e9rp!XKFl3~7r$F8r:ӄL>=S5q\܈e1,9(4ѹB3H|mB&p?ǥf݂BYt2Q[h|FWulzmWAdFRµp/$M>:ONQk?ccwuo'uM⺽~6u!No_r֯x>6+ݤx'qtfu*ܸڦkѯYe DYW7ʘѹ[‘2ú X$24{22N0-BOo M]D# )!^V; e) xñ UNJ1 mui Yɛ +b{"9<+쀑Cg\6.d(IQ>f +7[!N$Gl\zuOߓ*]p5`e'.q V;2y.q)&pWx1MM+uw%!/"UT!ph%&Z@#n6;2X P˅&I˟yAΖy^D"CB@ oe ]u ZV1 nEA TUG ,u!JqweB՘c`̻sV=bNW01hAG AqkƶFz(X+.tgX]>K ]n}%7iwL0%VCJ P>V)Rf]Gb4C)5 Bg! E-n/͜&x3,AS=)+#VA11LKW<5H7&$'Viǡ':Ko6i"lԎ7CL;c: , =ygG^>MHĹ`M^em7νkY4={&t\)8gj=EżPNxvfRp& Fk3-$|׿-"#=zSYgO%*PcFXa AK@pxTLxEa<#|/BERF)dY..Թ&ieu}{İڦ49z5-`u]}tIVGb?ENj +{:Oqo Xn$^ @"j7wH v!h E2OL=]?M˘pfvbV9OV/صo3Kq{͵C)KҲr'R*ͤOP7ue<գ.(,e;єM]F!>YW(WxLsrKFďh&3nI,бxf-j;`!_.e>}T7= Z@0L> q1q)ooYeV`ieX1N*-qNSs;%nLzpo}M]5z nYɴW*>PQ i*bXhfY(<߆hV(ARr3GoMKl)Y;\ <{[/2YL)PrdG Ӯ8#`j IP>3 4_N #v{mm}_bO@CاM!̈ؠxV| [B9Ji_Av~- GF]l/Ͼ|kxFV-| Jo܎uF3To/4eG]yu,YisTiHnحaR:rS楯 } ّ^ܠT 7}B AmQ^-2QͿi3o)E-İƲknQzEGM +?x±IiʁA6vc aǷ@(Ü I `9:8/DM9dx020/fJiB ~檖)f!bU65L18|;Upk!4U|BG%;y8UySO>$׳@[G_ ĩdn2uaAJxFZ!)K>~p14J27[G_~/QfGNc_hMyz(9o$W@Zq] G=y뇜l_,?#;R_ tG]!Zq&NBZjI% E~I!4öP$Fv,C»4y'x/{MĺJ#{^owd/*-0,6A(U_u+b@18Ͽ0K,R*djz7DYgX6]Gb/,^ШW]a M (^\-?|_KQBh5p]KEUHqјf>L)֢vQs⨺=,< 7^mI1rcԚ7*DX1;C(6vKi&*@76f#O>:s -<EE,z1HO{gfVe#4arkɰ0+^%Yl4⯈111$'9TvSLx??-,b߯>;DN%u5np`{TC)4,.\S*&(Y/-~#3bx_uxÁNP bi$rn gDEz 5(0#e|؇&jN!U-g.²ZKoΙ,`fPU$;5+=F2Lۮ=iHj=p@:ߵ* V gEa{ o$=& f|fX]ko4!} ڲ_HR%l9%[%^ț|Za;ۤ mEώ~o`&;Hя.R1?$u,j(w.4QdnbrҞ!Y=\C^׶\ӻ9)Iihi7O &1 F{Qg8KDG]ܪnCOv 5`9EW& eF{ZsRo{Ec tcz?d-x`+Q'>_ ڀ;,]xrnPƱ ehXFSGEklH::t:E5Kz{I`R%Av֕:bKҰd5y\/%O)W2uڞhA&Ua40tT lW&Ӭa:Dב2_g&g6_ʊHf.gv'm2̣0e:(Z "<ӵ1umr zNb,ɵ)Nb[C 9'n^P,U12sϥ Vje@4)3n A; /"]sn^ C^l[q nllYU16@a`%LG.Cx -ebfYE/% ,veJb2˳/s Ozj_bo1ũ8"^zC5E8o#d+_1b,c|< j=ϸQ0.'7[)4'8WhywuRk㱬Z 6\giw6J)mk1e|-PնHD`Nk! &v}FS˂Iյx@)~b[rW(;kuAz?3.As^+2+Rzp:M&GDbĖ{kTt& Hg UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1=[\. The local extra field has %lu bytes of %scompressed Macintosh finder attributes=XO. The associated file has type code `%c%c%c%c' and creator code `%c%c%c%c'X=XI. The associated file has type code `0x%lx' and creator code `0x%lx'=`Q. The local extra field has %lu bytes of %scompressed AtheOS file attributes=XO. The local extra field has %lu bytes of %scom]pressed BeOS file attributesP=PB. The file was originally a Tandem %s file, with file code %u=XO There %s a local extra field with ID 0x%04x (%s) and %u data bytes (%s). =XM ------------------------- file comment begins ---------------------------- 8=XL-------------------------- file comment ends ----------------------------- =hZstorshrkre:1re:2re:3^re:4i#:#tokndef#d64#dclibzp2lzmaterslz77wavpppmdu###=fatamivmsunxcmsatrhpfmaczzzcpmt20ntfqdsacovftmvsbe nskthsosx??????????????????????????????ath???NXFSp=80JanFebMarAprMayJunJulAugSepOctNovDec= ==-%$ZIPINFODEC C V4.1-001v v= 44= __iscntrl4= Z0$ $= _4: := (4= 0` `= 04 4= zi_opts04= 4+ 4+ :+  ;+  ;+  G+ f+t +   + + + + +D$ $= |4: := `4=   = @44=zi_end_central@4= + + + + + + + + , , , #,<$ $= D4: :=  4=  =  4 4= zipinfo 4=aXP 4, 4, 7,  8,  :,  :,  E, F, F, F, F, I, J, K, K, K, K, Z, \, _, _, , , , , , , , , , , , , , , , , , , ,  , , , , , , 0 0 0 0 0b 0 0 0 0 0 0 0 0 0 0T 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 %1 %1 %1 %1 21 31 21 81 81 81 J1 J1 J1 Pc1 Q1 Q1$ {1 z1 y1 y1 x1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  1 1 1 1 1 1 1 1 1 1 1 10 ,.d , ,0 , , s- , s- -  - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - e -  - - - - - - - - - - - - - - . . . . . . . . . . . . . . - . .p . (. '. (. (. ,. ,. 3. 2. 3. 8. 8. :. >. >.f M. N. P. O. N. Q. Q. R. R. R. V.! y. y. z. y. y. y. y.  . .  .  . . . . . . .  . . . . . . . . . . . . . . . . , , . g. . . .  . / T/ U/ l/ q/ o/ / / / / / / / / / / / / / / /4 / h/ / / / / / / / / / / / / / / / 0 0 0 0 0 0 70 90 B0 C0 U0 `0 `0 `0 `0 d0 =, w0 w0 y0 04 0 0 0 0 .i . .܀  0  0  0  0 0 0 0 0 0 0 0 , , , , , , , , , b, b,  l, m, m, m, m, l,  l,  v, x,D d, - - -  - - - - - -< - - - !- j !- !-< -  )- )-i /- /- /- /- 4- >- <- ;- >- ;-T$ $=  4. .=   4=  = . .=   4=  = . .=   4= . .=   4=  = . .=   4=  h9 UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1_jk= . .=   4=  =  = . .=   4= . .=   4=  = . .=   4=  = . .=   4=  = . .=   4= . .=   4=  = . .=l   4=  = . .=   4=  = . .=   4=  = . .=   4= . .=   4=  =  = . .=   4=  = . .=   4=  = . .= m  4=  = . .=   4=  = . .=   4=  =  = : = $=: := N4= C! !=zi_long = " "=zi_short =  = "XN44=#zi_snhowMacTypeCreatorXN4=]UT 2 2 2 2 2 2 2 2 4$ $= \N4: := P4=  = (Q4`4= zi_time(Q4=yx -23 -23 a2 a2 b2 f2 f2 g2 p2 p2 s2@$ $= hQ4: := R4=  =  ipfiwwp1 [#V1.0??VMSV1.029-APR-2009 07:22DEC C V4.1-001  $ABS$iy$CODE$ $LITERAL$H $LINK$@$DATA$,$BSS$8 $READONLY$ (INVALIDRESPONSE@ASSUMENO HEX_DIGIT CHAR_PROP( JPI_ITM_LSTOPENR_ID DECC$STAT DECqC$UMASK DECC$TIMEDECC$LOCALTIMEDECC$GA_STDERR DECC$GA_STDIN DECC$FFLUSHDECC$GXFPRINTFDECC$GXSPRINTF DECC$FGETSDECC$GA_RMS_NAMDECC$GA_RMS_FABDECC$GA_RMS_RAB DECC$GA_RMS_XABALL DECC$GA_RMS_XABDAT DECC$GA_RMS_XABFHC DECC$GA_RMS_XABKEY DECC$GA_RMS_XABPRO DECC$GA_RMS_XABRDT0 OPENRr_ID(J8wACC_CBDECC$GA___CTYPE CMA$TIS_ERRNO_GET_ADDR DECC$STRNCPY DECC$STRCAT DECC$STRNCMP DECC$STRCHR DECC$STRRCHR DECC$STRLEN DECC$STRCMP DECC$STRCPY DECC$FREE DECC$MALLOC DECC$EXITG0J H OPEN_OUTFILE(J`&FLUSH8JIsDOS_TO_UNIX_TIME0JnCHECK_FOR_NEWERMAKEWORD ZSTRNICMP EXTRACT_IZVMS_BLOCKFNFILTER0J( 8 CHECK_FORMAT0JQ VMS_MSG_TEXT0J0q RETURN_VMS(JtVERSION(JHUMAPATTR(JYMAPNAME0J@cCHECKDIR(J0StDO_WILD0Js SCREENSIZE0JxtSCREENLINEWRAP0J@7 CLOSE_OUTFILE8J=DEFER_DIR_ATTRIBS8J8>SET_DIREC_ATTRIBS0J HL STAMP_FILE COMPILEDWITHCRC32 SYS$ASSIGN SYS$BINTIM SYS$CLOSE SYS$CONNECT SYS$CREATE SYS$DASSGNu SYS$EXTEND SYS$GETJPIW SYS$NUMTIMSYS$OPEN SYS$PARSESYS$PUTSYS$QIOSYS$QIOW SYS$SEARCH SYS$SETDFPROT SYS$SYNCHSYS$WAIT SYS$WRITE DECC$MKDIRLIB$SYS_GETMSG0 INVALIDRESPONSE0 ASSUMENO0 HEX_DIGIT0 v CHAR_PROP  RMS_EXT_ACTIVE0 RMS_EXT_ACTIVE  RMS_MBC_ACTIVE0RMS_MBC_ACTIVE  RMS_MBF_ACTIVE0RMS_MBF_ACTIVE0 JPI_ITM_LST8J0YDEST_STRUCT_LEVELOTS$MOVE =GkG;F!0@a/aK$Dk#@{G~^wG^G~G G(G0GG#Bb@ZkG`D "(b8 D"4 D@"Q,S`.vJG0UJzKF>7/TGt H;v@JY7K:G7?.PJF>`C`.vSJUJF>9KaK W/ZWKAGW?1?F.{ JTJF>HBtGRR"@8"BGb@1"@ZkG  B0Jb8"2v HJDG@ZkG]G]} (0@#k. JU JF>. SJU JF>`#xG~X^`^h~px޴GG"xbGBc #$!@ZkG8B4G4=@Zk8=sHB"b2=JSF8@ZkG &$B C& #$h &&b1"@_"tG@ZkH BGbGGtG@ZkGG[GG4GG@ZkGhb#( "@TG- "B4Gb $H@ZkU@u@ $DB h $$&b1"@_"tG@Zk` BGbGGtG@ZkGG[GG4GG@ZkTGGGGX]`]h}pxݤy#k#~^ ^(~08@޴HPX>`^hG{G#b#_b# =@@<5@!U@F &D(F @d`31`B`FG4G@FC3BF5B8FFFXB¤GGZ Hbh"&G@B@Zk@B& "GG@Zk<泱@0"@$57J"&4Jh#9F B0GHf? 0"!7'H;gK H7JaCH&@00?#97&K8KC0B $&  DG(W/ UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1vSyz@ZkHwHĢPb#!J"7DH@<h& <&lFA"â7J"G2v^JF(5J4JB(Y/YK ""3J0,u@K,6J7J0HH!'HxH7D8D&h&"4WJuFVF(f=@F4Fh& D'?# Z9$KbZ#C:AK6AK(FfByFf4G@Zk?$G! E0 xb#@GE<5 @ 0U @ &Gb#@ӈItGRE GGb#@G4GBb0.0 P.p".!JR AJ.U J2FC D 3Hv3HTJFF{>>@ZkG""BGbtG0 1"@Zk"GPb#V@$&("Pb# Q@b# 4GL@Gkl El@B?%Hb4G0Jh"@Zk)! D $$"B %!!)&b1"G@_"tG@ZkB bGGGtG@ZkGG[GG4GG@Zkb#@ 4GG8GF&!R"F ""0"4Ʋ0"  G8& G(G<$ 11 B &(FGG4GàF. "|UJG- &5_F@F6@F0/U@B@BG+@ $'B! &(&b "1"@_"tG@Zk BGbGGtG@ZkGG[GG4GG@Zkb#@4GGX" $@B @!h")GG@Zk,& /. AI,.xAIBGW JVJF>F>@Zk4!4&-qHPb#I(I 1E(=cDBBR"tF@`@àh"$,$(!'(,$H" J HA )HuJDl'.$h.T JSrJF>uFr>#qGpGY{KZFK[GW@Y`0-4GB0 b`}HI!IG  E!= 0.hI4G?%(F >@ZkG)! D0 xb#[@GD<5A)UA  &GHtGRDb#G@GeGb#@G4GBb0,!0.P".(HQ (Jp.T J1DC D 2Hu2HSrJFuF>r>@ZkG""BGbtG0 1"@Zk"GPb#@#("Pb# ,, !HF HDC @b# @4G*4G0- ID!pBxb@ZkG""BGbtG1"@Zk"GPb#@à("Pb# ,- &!HH ID~C @b#@4Gà? @B%hG"Hbǰh"l4GC! $%Dl)!'17J'@ZkD B $)&Ơ1"bG@_"tG@Zk !BGbGGtG@ZkGG[GG4GG@Zkb#@4GG'&'!'1"'G!' "0G"4Dz'G_GG(Hb@ZkG&vI& U && s"}xb#_@GE<5@!U@  Gb#N@ӈItGREGiG)?"В H29HFsJSF) G"֒J8JFyJG4% ^ @B!` "޴e"tG G(GHbGG@ZkEG&v@I(II@ $$ .PJ >)&s"Ғ J49JSFu@JF)"B"bG1"tG@Zk"GPb#@4G0B4G48b@Zk%$`"%!! %% E!峨E"峨"4G $%8<G@ZkrH46/Y8K"2G8?p.0".4GP/tJU J.Z QKuFCT`F qJ{qJAGQ? BWJF(b>@Zk=GGTGp H a@Bb!.Q!J!>tG@ZkBGbGtGTG@Zk@@"aD B "@ZkGh]Gp]x}#kG#~^ ^(~08@޴HPX>`^h~pxG0{Gc GGG 㳣G84G8D#4GG TG#TG $ " (B %$$  !_B %$xGaGb@_"tG@ZkB! bGGGtG@ZkGG[GG4GG@Zk(B4G 0b@Zk"8BTGItG@b@ZkQHB"@Zk H!A"`- `IXDHB@Zk HA "@.RQJQ> e&B""sG bTG@ZkGGG[G4GG@Zk,II+ՉAeAx\|AbCkGG/GTGTG*4G#4G& &BP"]"pG btG@ZkGGG[G4GG@ZkG %BH"GTG b @ZkGGG[G4GG@ZkG]G ](}08@ݤHPX=`]h}px#kG#G~^^~ (0޴8@H>P^X~`hpGGGGP &Р  $ &8(vJf. G J 8"."J@FI.) I!AJ . Cj.!"4G J"S jJG Fq CaE .S" B(bGJGCG@Zk4GG@"paE( 3.S" BG(b2JGCG@Zk D@ $ .P"p. HuHT JSrJFuF>r>$-@#`/ KjKM I[zK EjG=z?0"G"qaE( .S" BG(bJGCG@Zk D@ $ .P"p. HuHT JSrJFuF>r>$-@#`/ KjK =M I[zK EjG=z?`"G"qaE .S" BG(bJGCG@ZkPG"paE `3.S" B(bG2JGCG@Zk GGh"paE `3.S" B(bG2JGCG@ZkGHG"paE 3.S" BG(b2JGCG@Zk % %$ mE`@"!BGbG1"tG@ZkGG[GG4GG@ZksI-II AEn@ (B GPBGRHlPJ!Xb-@!GGtG@Zk`ETG %$@"B &a b1"GTG@ZkGG[GG4GG@Zk GGm!<`G.GJ1uB#BG@\D< -4=k UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1-1 KM IzKLI E= E='/$T!$4- *Jy*JX KI*IG 9E ?*= $t $t"$,',!, JH.F H@ HD hHkhHVJD<F>'4,lJ$.A 3HUJ-DF3<> D$$t#$ @$4-"'T- FK/hFK;I$.J [IX K *E 0Iy0IQ0JG?9F0>'t,$,C fH@HkDf<D<GGGG]]} (0ݤ8@H=P]X}`hp#k),8".A )H"J0D"_9B.R BJQF!.Q !J2F!-M I E.P JF).P J  FF8/Y 8K0GdG#4G~^^~ (G{Gc (B0b@Zk4G(B0b@Zk4G(B0b@Zk4G(B0b@ZkG4G(B0bP.0"p.QJS qJSFC@Zk"4G1"BB1D (B0b@ZkG]]} (0#kG#tG~^^ ~(GG@b@B =c C&=Hb ]@ZkD# c$G G =tG0p[@ZkG]] }(0#kG#~^^~ (0޴8@HGGGGGG_C+&",,  6@0B@@@GGG@0HpB3!HGp@SB$@GGG@Zk8@@  6Fb#@'C!'" b#,,1C1@GG]]} (0ݤ8@HP#kG#TG~^^ ~(GG#b =HHc #"BbG@Zk# v HG@b#" @TG%#c"GG ]G B(b^GG (@ZkG@b#h" @TG 4G#G#0J6J0@#G]] }(0#k#~^^~ (0޴8@HGGGGGG_C+&",,  6@0B@@@GGG@0HB3!HGp@SB$@GGG@Zk8@@  6Fb#|_'C!'",P0@BFC2B `2AJB/XK?b#a_GG]]} (0ݤ8@HP#kG#~^^~޴>^GGGGPGH!Š 2v@JC CA 0&A PBCA& f@_"RA@X} "G8BtG @b &1"X"@ZkGGGG[4GG@ZkTGtG)HBG  AGG@ZkGE!HB@AGGG@Zk#j@Ű@ #1`@ "Gb#6@TGTG峦C'G-"'-II 'I ECPA#@ Gb#&h@ @@#Q@P@ #1`@C ?ÀGBG"@ZkeGC?GTG)E@} ¤"CǦ DE &$"6vJ8BtGC@b1"@ZkGGG[G4GG@Zk "b# TG1Q@@ӉDGGGG]]}ݤ=]#kG4!JCGG6 }B&3,3HX!D!D-, .s"11 BJXFF% $.s"11 BJX!D!D .s"11 BJXFF 11 B5!Js"}BC G.JXFF 11 BCs"G0pBG7 B 4G /=2.J"F 3,5HX!D XF3.s"3J!F TGkG#~^^~޴>^GGGpGGŠ %D@b?FCc 1@8 FDXDGb#U@ìCc FF&1@4G C.CJXAF@4GJXF.JBCG ]"GGg_ G# `" BXA ''"GXB`=!G`b1"tG@ZkGG[GG4GG@Zk4GGG$AGGG0!I =Gp@ G0.0Jà¦!ABGEG(("BG@ZkG4G" Gb#)!G@TGl )G@@(D1 G@巳@@SF )@@ 5H1@u@]"G_@@1@GC b#@=@@@0D?'Hg@G-GIGE@@0D?GTG4ìE$@"$". _F )!"CXB i&`b2@ G"1"GtG@ZkGG[GG4GG@Zkf@Gb#@à&HGBf@(((!@G $AG@ZkHGG]]}ݤ=]#k#G~G^^~ (0GGGhGG0" $` G[@ZkG_G]]} (0@#kG4GBb @ZkGXb#"?@Ӹb# . . JQ !JFC "3@ H`@.PJ>"0"q Fp FrtHSuJtFrWB"+/ pH(.ypH0bX KWJG(BF+?4G(>@ZkXGb#"@"b# e,, dH@ H`DC @TGr0HFtFr#G~G^^ ~(0GGGb=]c #&GqG %[@Zk0""oG4GG[GG@ZkG_G]] }(0@#kb4GBbc @ZkG`b#X"@`b# . . JQ !JFC 8"@=" qDpDQs4HRTJSFWBQ"`+.(. I BxIW J(bVJFF+>(>4G@ZkG`b#0"@8"c`b# , !#,HA /HDC @TGQ0 H_FSFQG#G~G^4G^tG G8G0o0![@ZkG`"o! [@ZkG]] 0#k#~`^h^p~xGH{G#c  A.!." KR PJsKQ0JTFP>3F0>'.$"$. 5Hx5HW JVJFF>>xB$"Z# PKsPK'@.$ .R PJQ0JTFP>3F0># $.$"'.#.$`"J!/W JP JF JqJY8KF>1G8?'@/ 3H$.v3HZ SKTJWGS?F>" 1& P" / .X K?UJ>$ ,$ #'`.".$@"9H.S yJW J3D 4Hz4HVJF>F>'/ J$.sJX KUJG?F>#G""0"B!ѢGG@Zk$"$֢$"}"yJ8JwuJGݶ uJ$ .'@.0JR PJ2F '`/$@/[ uKZUKxGu?WGU? B4G(b@ZkGb#"@b# . . JQ !JFC "@B4Gb@Zkb#_G`]h]Gp}x#k#G~!'H^ ?"^TG~ (G{#Gc H##H vH!vJpJ!"HFD2HRH1'JsJ!vJSFC0v H!&HHd0J2AJ#H 2D0D#` B(b$"G@Zk$ v HGpb#8"a@"Xc $d"`BG! >GGG ~G(hb@ZkGPB4GXb@Zk`#vH`Gpb#">@TGGG]]} (0#kG#4G~^^~ (0޴8@GGGPB $  G@Zk &G(b80vJC@CC B@ZkG# G $&B"BGGG@Zk`BCG&H@Zk! $ $G&Cf .VJ>$ (G]]} (0ݤ8@P#kG#TG~^^~޴>^~GGG0B#(""8bG@ZktGBG@ZkG'1@!HE@!.! H!JI E@E;GCG6H@#.JF 6/6K%G ."PJJF'1@C_;H1@ @) ,5Q B"0@@H"H t?=D" "1" G)!>&@ "!5Q@>"@""GpBxbGGG@Zk## b#¤ $` I8 &C(H '& G&E8?E2g  B=_G("G(!! BȰG@ZkW8DȢ?&@1"H#8 6!4G@&9>K1C88@f$ H TxB@ R#0`B5J@fBT@?&1"ABR"0B@0JBGx UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1O A(@f_'Z# `Ǣ [xB0`B@f5JB)/ ).)KQ )J1G= #_&R"2D!!H=@f$ ]#XxB0`B@f4JBX6GB& #"g"H*HJ!)!I@4G@&1>J 0E5B*= =*` &c(t0b#!_?&@&1"d"&@*A 0 A R*A""!>H 0 A1@ r@&3~JvBr@JB 8K " B ("9GG@Zk+/ H(.jH,"BX KWJG+?F(>/A.=!,!. 0Is0I"R PJQ0JTFP>3F0>"@Zk4A-4"vHB)!bJUI?& VEU=&)#G&4GF&@Zk G@""pB]"xbtG1"@Zk"G0b#@4GèF4&"GBG*CIb!HGIGp@I0D"@Zk G@""pB]"xbtG1"@Zk"G0b#f@4GF fR@I!vHFpS@IFӒ`J` 0D Iw`JFKRK2YJIq@Kp@I6JՐ@IFiʰ@I)UBȦ JB{@I9'K)9J) ;GH`I! 'HD i3Ji[GRJF J!RJRFJ!RJKG4&"޶(# BH#>f"GTG G(G(bG@Zk G&`+v H`""pB]"xbtGP1"@Zk"G0b#@4G$Jf . *, `Iq`IP JA HF1D> < J#fq@G . p@G. jJV JwjJUJFF >>&ْ K@ Ha+KDW`AC 4&H"^! B`)!f"GG >G(G(bG@Zk Gf@*v`I @""pB]"xbtG1"@Zk"G0b#@4GB44Gb@Zkb#_ B $(bG4G@ZkG]G]}ݤ=]}#k0 KDDG# [ ~^ #G0,0. 0/ HQ JP/8K1D @@#Hq`"1D!1@2LcJ@tF3tB7HUBv@uB6BB..Z XKJV J:GFP81CCCBrNB /$H0@1D!1@7.#K"p GQ7J.@0 CW KJX K!!CF0//&J"1!JCeJtF3tB"4KX K3@8Gp./BCpJX K1@xF$"@p G=  "#J3F13B2N$J3F13BX?B1 JxC18B1@6B @#CKYG:YCROEJYF2YBRBUB27AJuB2UB @@G4G3@:"H9!H! H87J1JC7J;׀JCa!@18BTBY9CACG]B4tC!CB1@0@ #k5B#4G~^^ ~(08GGGBGbtG@Zk"B4Gb@ZkbH. " .#F 4JV Jw4JUJF>F> `/vaH@/`HCF @J[ `Kq@JZ@KtGQG `?@?gF.". uJ!aHW JxuJVJF>6#HF>/D`/*@@/" 4H[ tKq4HZTKsGt?bHQGT?F.01B. JwJV JUJFF>>c@ .GF , @Js@JQ JA H4F3D > <Gb#_GB"b4G@ZkGb#_ @GG=%1@ @=2t_&p&r@3B"cFtDGG]C]6J }(F08G@#kG#G~^^ ~(08޴@GG# ="GXb!Bc ТGG@Zk"BGG@Zk@B# @G,&(#4G@Zk D"#{H03F#:JC[GBbFG0@ZkpGb#" @ è#G(GB!#H 'Hb1Jr HG2F%4#"G@ZkpGb#"@ #R H1vJrS HՒJ2F$yJCH#4JtH %% 8Jp@JGِ@JdҰ@JBB;gKd0J${@JE"F3'J4#GtFD bc"G:_KDGGB> ^TG(@Zk# v H pGb#"@4GB4b@Zk B" =4G(b=@ZkG 0B8bG4G@Zk B"(b4G@ZkG.&. LO=f#, "J .Q &J.Hf.F&..JW J/Q ;J &/F"bDp"CF..rJT JPBtFKY &Kl_#JW JZBB@GCppFCC>G"1"GG@Zk$"@BTGHb"@Zk $äE#RH1vJrSHĢՒJ2FĴyJHrH4J8JGGd"IJ G;gKdb1JG2FG3J4#dc"G^GB (@Zkä vH pGb#`"%@4GB4b@Zk ðB4G4b@ZkGpb#8"@ GGG]] }(08ݤ@P#kG kG#G~G^G ^(~08@޴HPGGXBGB " }="pR"b@Zk =G@ !. E& e&Q!J!>"@B ҠG] 1"HbG@ZkGGG4GGGb ""@BG]Gc Hb $ $ G@ZkGGG4GG[G@ZkG] ](}08@ݤHP`#kG#~^ ^(~08@GGGG  G B@Zk" 0B8b4G4G@ZkxGd|BGH"G ¦@Zk!"@BG֢G@Zk"@B"GG@Zk? !%H(GBP"#00$ H@0% ,@Zk0%sH_'8b2=JSF0_"%9v?K#Ce4G%F"%0B?F!B%@Zk B@D"(b"="GGG@Zk} @h#,A#Hh#<F(èE"0B4G8b_FE@ZkG`0B"8b4G@ZkG` B}@D"(b" ="GGG@Zk }@h,@Hh<% p H@!.Q!J!>G] ](}08@P#kG#~^^~ (0޴8@H>P^X~`G{GXc $$ `FHBPbGGTG@ZkB&# ?"R"">D1D24D!D2/8BG@b4G@ZkC8B!!H@b4G0v H@ZkC"# "GHD FQrBvH1ABD@B1B!Q?B6!J" HJ!!HײCF7C7 GD d'{ [0@J35@BcBxH\|BbCkHD"@E@DDD$l?&1"D_'D@?'B&&YG""6GD D& $$pR!&HGҒ@JH?@CDA( G&`(BG0b4G@Zk G(B "0b4G@Zk C!AaA P^X~`hGGGGG "Pb#_@G`B="@ZkGFG¤ &$!(!$D <G Ƣ4GX⤈BƲ lX!'G4G"4GPb#6@XD  != &&@B 1!HbG?D=GTG@Zk G(& G*D`Gc!jAGBGbGTG@ZkG!k@ CXE 0B8bP""GTGtG@Zkp& G4G 8E0B""8bG4GtG@ZkD'GGoB B ]"`.JFB/KPF 5B0FFr/`J"B[rK`Gr?R"r.SrJr>GG lA "lA">G.GaJJD5Cz/zKEG.AGTJF>"@G!GFeFGHG(6,JGpvKA6HB0D6<"5.DV.B5JRVJs6JSFV>" . JGBGKG6,eHk!lAA6H%D6<".UJ>"TGPb#@G! Dk!u`c!jAh<&@ && &D! BQ!*&p1"bG@_"tG@Zkp!@BGHbGGtG@ZkG [GGGGG@ZkD!D0@pBGtG@Zk"3Pb#U@GGPb#Q@ $ f$<F $&c1"@BGb@_"tG@Zk@BX!jn UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1ҹHbGGGtG@ZkGG[GGGG@Zk!D!DG_!D!DG GlpB@Zk`AGc bk@ $_= #.s#J?FqB.J F c k@.JvB/K`F#/d#K x'G@%GGGXC/ZCKC?%G #,tGrcKA#H2D#<G_"B .JإF"B/KeFK- KIk!_E_E@P/PKPF *DA ètAF EGcA0FKF$.wDIQ$J7F$> .Jk!_E-LI=GpB G@Zk`AG9# "+C -1IE(B.JE 9#+C.J#BC-CI`D.dJxF؅F`GGXƠ.PJ>؅Fy/tGaYK[yKaGy?G_R"KB -IER"KB2.2J EE_k, bkHk! DKD`ByA.GwKJDD5 g/[gKwGg? G-GDE)GDrA G# -pGILI E= D("G/HG{JZGK @[GG? .aD.#@JVJqHF> ,HGDDG-lgHJGI LEG= . Jk!DG/ZGKG?"tGPb#@GGPb#@GG]]} (0ݤ8@H=P]X}`hp#kG#~^^~޴>^GGGDG5Gxx G"B0"GG@ZkX"BGG@Zk X BG0P"% 4}4G@ZksH8=P" B$J 2=JSF88@Zk8=sH_'b2;JSF8d=`FB`"@ZkGD@5 @tG0D! `¤pBGPB &&xb F&2!)&1"@_"@Zk J!BGbGGtG@ZkGG[GG4GG@Zk LG}@_"`tGp`Hɐ`Hð`H IA#A]`@!` &pB ($Pb0!d)&Axb1"@Zkc BGbGGtG@ZkGG[GG4GG@Zk "G}4G#-I#I#=d=]*AA*@P"0.D*Q@A2J*@+F4 p."pJ F/.ŲDJإF.#"$t J91 CFT/$91 CTKEG @,H D-"$IEDG0@B2@v!J.0@BPJF>d]D RA /X K ?dD`"GTG7B 岬)!#@BHb I% %@ZkpBJ!P*&d1"xb@_"tG@ZkB bGGGtG@ZkGG[GG4GG@Zk 0B"` 4Gd=@Zkd`$4GĢ"B7#/K GG7.G"rHQ0J2F0>@s"ed}% 3-e ]GI3I3= E:[C:@e*B@E%EexG8D"' B@Zkx1@@@ jG BR" R RR2G2 ?@22 H-#cxJJXI CEX=.GPJ>MXD`@ BG tGG@Zk7"G 4,f4I"A4HpK&D4<u",DHD,FHD<wB R2B@R"@G0BGG@Zk@vH$-$ I$I 6E$=7 .0@Q J >GGBxDbD@ b^"GBG@ZkX=#BX"GG@Zk8C0=aK8$8]4G% BJ!6[IGF8=4@Zk8rHB"b1H2F8d}`F`ݴ@Zk@=G]E"@BP IHbTG IA ),,A)HDH)<@ZkGH`BhbG@Zk8DDI-gHtGJII GEI=84GX0`=Gp Jq@c.ScJc>G GG6DJ .$"GWJ> & 4GCU#u/f:KtG[zKfGz?Bb@Zk5@BHb"GTG@Zk `BhbG@Zk8DG8"4GXɰ0B$"G@ZkP""PBTG 4G!G@Zk0BP""G@ZkG@BGHb@ZkG`Bhb@Zk8DH BG @Zk&B@@ (G0BG@ZkG B@Zk$ AGG"D |! G ¦G0B"6"7/Y7K7?@ZkGDGxc G]]}ݤ=]#kG #~^^~GGGB0""G@Zk n=  8"GGBTGb $&1"@Zk ("G B!Тh"G@Zk" BGG@ZkBG}_&R"@ZkaH`B="hbh"9K!G4Gl]=@ZkGlB="bH"TG@ZkB4G $tb@Zkh"@B4GHb@ZkP}##P`HXR`HX#v`H``]W(H=CW9H3v J6#K@ TR Jג J/G&JHH@UvHHC;C@ TyBCCCAGWD#DFD4G_XX]XF@'GyB`G"ûB`4GõBGôB4GðBGø!B4Gá!B G âv@@4Gãv@`GàDB8DG]]}#k#8F~G^GG B] B}B F9BUBqF@QFDTGGDB [SB({?&aF1"1D4GF4GG@ZkG] #k#G~G ^(^0~8@H޴PGGG(BGG0b8#="G@ZkG=4"XBG!&H}"&H G`bG(GGG@ZkG=4GHBPb!&H&H@Zk] &FHpHH@`#DRJYB*F ]" SFCE G`GGG ]0D(]0}8@HݤP`#kG#~^^ ~(0GGG8xb#=$  D"0F$"G_`== DG] C] C }DF8D(0@#k#~^^~ GX{Gb#c "#" G`_G]]} 0#kp#G~tG@^H^P~X`h޴pxGG#@B"Hb""@Zk"GBTGb H@Zk.PJ>B bGGTG@Zk@"@G@5 G(`@&.".c@Cv@P/TJp.#JWJt@#f@Jc@Cy@p#w@Z[K#f@GKc@Aa@ :@DdJ!&@H!@A5@"$@B#&@B G0/"c@Cx@W7K"JBw@#f@ B"0]" (b $&q X""tG@ZkG B (bh!P $" >"GGGGG@ZkGeGGG[G@ZkG@]H]P}X`hݤpx#kG#~^^ ~(08GGGGb#,_N , HU#"q Fp Frt5HSuJtFrWBO7#7$/6 #".GY8KsqJJ"zJTG:G8?e/wJ6."GeKPJaH=@F>y6KC.SFQ>.F>/G?B7"Bc#GZZ#@6$.c.,7$,7 U$J"B{J@ Hb0HE`FJp1"@ZkG]G] }(08@#k.P JFr0 HFtFr4xG SYS$GETJPIW4b#X SYS$GETJPIW4@ SYS$GETJPIW4GDECC$GXFPRINTF4b#XDECC$GXFPRINTF4@DECC$GXFPRINTF4GDECC$GXFPRINTF4b#XDECC$GXFPRINTF4@DECC$GXFPRINTF4GOTS$MOVE4@OTS$MOVE4G DECC$STRLEN4@ DECC$STRLEN4GSYS$OPEN4 hE UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1.`b#( SYS$OPEN4@SYS$OPEN4'G FNFILTER4(b#( FNFILTER4'@ FNFILTER4G,DECC$GXSPRINTF4b#( DECC$GXSPRINTF4(@,DECC$GXSPRINTF4pG SYS$CLOSE4xb#( SYS$CLOSE4@ SYS$CLOSE4'GFNFILTER4(b#( FNFILTER4'@FNFILTER 4GDECC$GXSPRINTF4b#( DECC$GXSPRINTF4@DECC$GXSPRINTF4dGpOTS$MOVE4l@pOTS$MOVE4pGOTS$MOVE4@OTS$MOVE4 G8 DECC$STRLEN44@8 DECC$STRLEN4Z8b# SYS$CREATE4YTGh SYS$CREATE4Yd@h SYS$CREATE4YG8 SYS$CREATE4Zb# SYS$CREATE4Y4@8 SYS$CREATE4HG`DECC$GXSPRINTF4Pb# DECC$GXSPRINTF4\@`DECC$GXSPRINTF4[G SYS$CONNECT4\b# SYS$CONNECT4[@ SYS$CONNECT4'G FNFILTER4(b# FNFILTER4' @ FNFILTER4 G0 DECC$GXSPRINTF4 b# DECC$GXSPRINTF4, @0 DECC$GXSPRINTF4'h G FNFILTER4(| b# FNFILTER4' @ FNFILTER4 G DECC$GXSPRINTF4 b# DECC$GXSPRINTF4 @ DECC$GXSPRINTF4 G OTS$MOVE4 @ OTS$MOVE4 GD DECC$STRLEN4@ @D DECC$STRLEN4Y GT SYS$CREATE4Z b# SYS$CREATE4YP @T SYS$CREATE4Y G SYS$CREATE4Z b# SYS$CREATE4Y @ SYS$CREATE40 GH DECC$GXSPRINTF48 b# DECC$GXSPRINTF4D @H DECC$GXSPRINTF4] G SYS$EXTEND4^ b# SYS$EXTEND4] @ SYS$EXTEND4 G DECC$GXSPRINTF4 b# DECC$GXSPRINTF4 @ DECC$GXSPRINTF4[@G SYS$CONNECT4\Lb# SYS$CONNECT4[@ SYS$CONNECT4'GFNFILTER4(b# FNFILTER4'@FNFILTER4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF4'dGFNFILTER4(pb# FNFILTER4'@FNFILTER4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF4GOTS$MOVE4@OTS$MOVE4GOTS$MOVE4@OTS$MOVE4G DECC$STRLEN4@ DECC$STRLEN4)G4 SYS$PARSE4* b# SYS$PARSE4)0@4 SYS$PARSE4 `G SYS$ASSIGN4 lb# SYS$ASSIGN 4 @ SYS$ASSIGN4G$SYS$QIOW4b# SYS$QIOW4 @$SYS$QIOW4G8SYS$QIOW4(b# SYS$QIOW44@8SYS$QIOW4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF4 G SYS$DASSGN4b# SYS$DASSGN4 @ SYS$DASSGN4G(OTS$MOVE4$@(OTS$MOVE4(G@OTS$MOVE4<@@OTS$MOVE4TGDECC$GXSPRINTF4\b#DECC$GXSPRINTF4@DECC$GXSPRINTF4?G SYS$BINTIM4@b# SYS$BINTIM4?@ SYS$BINTIM4(G<OTS$MOVE48@<OTS$MOVE4G DECC$STRLEN4@ DECC$STRLEN4Y G8 SYS$CREATE4Z,b#p SYS$CREATE4Y4@8 SYS$CREATE4/TGp DECC$STRRCHR40Xb#p DECC$STRRCHR4/l@p DECC$STRRCHR4/pG DECC$STRRCHR40xb#p DECC$STRRCHR4/@ DECC$STRRCHR4!G DECC$STRCPY4!@ DECC$STRCPY4'GFNFILTER4(b# FNFILTER4'@FNFILTER4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF4U G4 DECC$FFLUSH4V,b# DECC$FFLUSH4U0@4 DECC$FFLUSH4W8GP DECC$FGETS4XHb# DECC$FGETS4WL@P DECC$FGETS4TG` DECC$STRLEN4\@` DECC$STRLEN4G DECC$STRLEN4@ DECC$ST1 UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1RLEN4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF4LGlDECC$GXSPRINTF4`b# DECC$GXSPRINTF4h@lDECC$GXSPRINTF4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF<CDGdEXTRACT_IZVMS_BLOCK<DHb#PEXTRACT_IZVMS_BLOCK<C`@dEXTRACT_IZVMS_BLOCK<CGEXTRACT_IZVMS_BLOCK<Db#PEXTRACT_IZVMS_BLOCK<C@EXTRACT_IZVMS_BLOCK<CHGhEXTRACT_IZVMS_BLOCK<DPb#PEXTRACT_IZVMS_BLOCK<Cd@hEXTRACT_IZVMS_BLOCK<C G EXTRACT_IZVMS_BLOCK<D b#PEXTRACT_IZVMS_BLOCK<C @ EXTRACT_IZVMS_BLOCK<CL Gl EXTRACT_IZVMS_BLOCK <DP b#PEXTRACT_IZVMS_BLOCK<Ch @l EXTRACT_IZVMS_BLOCK<C G EXTRACT_IZVMS_BLOCK<D b#PEXTRACT_IZVMS_BLOCK<C @ EXTRACT_IZVMS_BLOCK<C G!EXTRACT_IZVMS_BLOCK<D b#PEXTRACT_IZVMS_BLOCK<C!@!EXTRACT_IZVMS_BLOCK40!GL!DECC$GXSPRINTF48!b#PDECC$GXSPRINTF4H!@L!DECC$GXSPRINTF,E!G!CRC32,F!b#PCRC32,E!@!CRC324!G!DECC$GXSPRINTF4!b#PDECC$GXSPRINTF4!@!DECC$GXSPRINTF4"G"OTS$MOVE4"@"OTS$MOVE4A%G& DECC$FREE4B%b# DECC$FREE4A&@& DECC$FREE4A&G& DECC$FREE4B&b# DECC$FREE4A&@& DECC$FREE4A(&G4& DECC$FREE4B,&b# DECC$FREE4A0&@4& DECC$FREE4A@&GL& DECC$FREE4BD&b# DECC$FREE4AH&@L& DECC$FREE4A`&G& DECC$FREE4Bd&b# DECC$FREE4A&@& DECC$FREE4A&G& DECC$FREE4B&b# DECC$FREE4A&@& DECC$FREE,E 'G0'CRC32,F 'b#`CRC32,E,'@0'CRC324(GD(OTS$MOVE4@(@D(OTS$MOVE4K4)GD) SYS$SYNCH4L8)b# SYS$SYNCH4K@)@D) SYS$SYNCH,M)G)SYS$QIO,N)b#SYS$QIO,M)@)SYS$QIO4*G*OTS$MOVE4*@*OTS$MOVE4H,Gl,DECC$GXSPRINTF4T,b#DECC$GXSPRINTF4h,@l,DECC$GXSPRINTF4,G,OTS$MOVE4,@,OTS$MOVE4,G,OTS$MOVE4,@,OTS$MOVE4-G-OTS$MOVE4-@-OTS$MOVE4-G.DECC$GXSPRINTF4.b#DECC$GXSPRINTF4.@.DECC$GXSPRINTF401GP1DECC$GXSPRINTF4@1b#DECC$GXSPRINTF4L1@P1DECC$GXSPRINTF41G1OTS$MOVE41@1OTS$MOVE4,3GX3DECC$GXSPRINTF443b#DECC$GXSPRINTF4T3@X3DECC$GXSPRINTF43G3OTS$MOVE43@3OTS$MOVE4O4G4SYS$WAIT4P4b#8SYS$WAIT4O4@4SYS$WAIT4RP5b#8 SYS$WRITE4Q`5Gx5 SYS$WRITE4Qt5@x5 SYS$WRITE 4O6G6SYS$WAIT4P6b#SYS$WAIT4O6@6SYS$WAIT,S07G\7SYS$PUT,T<7b#SYS$PUT,SX7@\7SYS$PUT4<:GT:OTS$MOVE4P:@T:OTS$MOVE4O:G:SYS$WAIT4P:b#SYS$WAIT4O:@:SYS$WAIT4;G(; SYS$CLOSE4 ;b# SYS$CLOSE4$;@(; SYS$CLOSE4K <G < SYS$SYNCH4L<b# SYS$SYNCH4K<@ < SYS$SYNCH4X<G<SYS$QIOW4<b#SYS$QIOW4<@<SYS$QIOW4 <G< SYS$DASSGN4<b# SYS$DASSGN4 <@< SYS$DASSGN4<=GT= DECC$STRLEN4P=@T= DECC$STRLEN4J\=b# DECC$MALLOC4It=G|= DECC$MALLOC4Ix=@|= DECC$MALLOC4=G=OTS$MOVE4=@=OTS$MOVE4!=G= DECC$STRCPY4!=@= DECC$STRCPY4G>G> DECC$STRCAT4H>b# DECC$STRCAT4G>@> DECC$STRCAT4>G> DECC$STRLEN4>@> DECC$STRLEN4?G?DECC$GXSPRINTF4?b#DECC$GXSPRINTF4?@?DECC$GXSPRINTF4P@G`@OTS$MOVE4\@@`@OTS$MOVE4BGBOTS$MOVE4B@BOTS$MOVE4f UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1BG C DECC$STRLEN4C@ C DECC$STRLEN4),CGxC SYS$PARSE4*4Cb# SYS$PARSE4)tC@xC SYS$PARSE4CGCDECC$GXSPRINTF4Cb#DECC$GXSPRINTF4C@CDECC$GXSPRINTF4 CGC SYS$ASSIGN4 Cb# SYS$ASSIGN4 C@C SYS$ASSIGN4DG DDECC$GXSPRINTF4Db#DECC$GXSPRINTF4D@ DDECC$GXSPRINTF4HEGESYS$QIOW4xEb#SYS$QIOW4E@ESYS$QIOW4EGEDECC$GXSPRINTF4Eb#DECC$GXSPRINTF4E@EDECC$GXSPRINTF4pFGFSYS$QIOW4Fb#SYS$QIOW4F@FSYS$QIOW4FGFDECC$GXSPRINTF4Fb#DECC$GXSPRINTF4F@FDECC$GXSPRINTF4 FGG SYS$DASSGN4Gb# SYS$DASSGN4 G@G SYS$DASSGN4AGG(G DECC$FREE4BGb# DECC$FREE4A$G@(G DECC$FREE4=(JG0Jb# DECC$TIME4=8J@Ob#  DECC$TIME4=$O@(O DECC$TIME4;(OG@ODECC$LOCALTIME4<0Ob# DECC$LOCALTIME4;8 քV5uUbv`e ֋ݵt.S.0L1OA:pwh&DM?0m1!#o" %Ucq`]No"q,w5ѨVvL'cMjMyY#ů9c,1&P_ ur*ۄ AJezT{p "]o&K!m-^>{AEujъ_nRc*n0JaY2IZ`ՀA9*;  /g0521∄nl?&>< rɜxeC_5F98B9JR:'D5gЃ;*AƨuK7}ua^lȯ,War!dc NnS;#1qЋ/Fmb{|1S-Ff$vBm|w/lyu Ed5 @4t?<[m} I?r[nuҊhא2&@Yh%k5J]n/BU͕`~Z鳛 7\pM6 vO^"w!I95pcSTYNYxr л,8s:M l dpYZU %9n#?`o2aSKU5)˷^8ׅ%^e {f]$ :6T妮8y,!!X-&)[tHA50˃ nmر]N9ׁ~,Ź}9z`UltAw̜*3ۥ dHsxr8~)UOHtLBQ|azH4[d7I{(Tl-m=c65FjT72MG/;ʫV<7¿T0ѦZM.V  ]SׁwH5,YcBmn(H1l/ZJ ـPp)R3~ y&ۼCQ:%kV˔1ֵ c#t%%]d*Vit0y堇-`PBrU>1D0&ulu~d龉1]-0Sj1X^PA 28s `kCJjr9SL}0-;QiM+D:!a`~3wKM/(&ZlyxI]A-d,񎱕q+iQ@[urw wT_!-rDh-;0$U/.vpxi X=XҼ1725665㫽\ +5r,;՘D  SV}:0n(iCܹˆ‡_XT&GVXрg~E$QMʢ3?')h;yZ}m^Elāѳ!Zw ag5p qŧ(,lnTmEݛP8P'F`` A6 Q g vh?dC%>ús1wX Z{Dc$|a!/,}{amܽvR|gBAdKP:^jMLev6AJ*lvme00jG{~vg6iקH!N8JE9F<=$ Bȋ>Xށ g*/^|f]Q4>!ލ=|+ljP+K?{Nqw Nћf3X|4_4-8`Е% cljChS0- 3XML I`}178lxB)$ȵ1E9Adt=/̶߮f+o_&)|w2Ёsfu s#.^'Hbr51)eԭ=mD{q(-[)x͌!/ qb5)ޕKxk!ZS=&_SZB4/bG^p9ߞR֫;P}FSlgҞG׫`qHn6[̀> Pd}6Y;_ {!E4XH ;q&}_KN^Oـ].Ct>SH BHqmq.*tL KpEYqֲ1ƮdF mszCRը/G7  NeȦG%ǎn)cڒ@zaʺPRaO#;hD6Aާ[k"=kqi) *A'{5{)Ac qܾ)#XnK|\oQkvc=?KeGMkSݓWR2w]v`<,-lf0+5"R .%f+j}5992cNGd̘[Rm,CZX˿3ɇH7[½+cBS%W ިTce:I_֚pQў>}Ц&5vYm;R;hVXyVp[{EQUAOR@_F$'4U`17w UTo:-<خTy,$CC+}72<UXCGL 7Rh@pYiY-\l0W4<#ցZvBkᖀ;ˊ! 9g >5p̔2 f3D }Lf&Yq\aPJ\SZM$ok.qK߾A?s/’q>}>4?Ssbxz9SJCwv >Ck됛$/">NNв$!;TMn#v$P2=h7GchzAX$Fa؝6sZde)wtEkДwTzS>+3w~t Cht;q3S ^0.ͪvԫ2n5'Eoed+%Xe\TDY a*S!7h׽i_Q9-}wA:񻳋|lK\S(4Oi"` Gsj9lV%tY =w]C:ܭ'10<ݼJ;Ihm3tۻjȫ܍DqF-1(0(s*ͰTw-}ӎNvۀE3xnٿ)[w(vZCܨĦuJ+P T=uk6Fmq|s[0  X p3 U=sFQF2\V ]KgsQUߘq0`k ȹ ö%AXGI?ExgJ,_~~AQ,q7&jݤ%WF'fq5ɽd+2_ ecv{E}+UfHЖAhXHvX.Znmf͓o!}q'Gw moZ#v?Uߥ1jnw*z?|H/w*,`Yo3d]Q@6 P @9EYokno@ xSDH9„t8k5fC;c45m(0 M~a ZOZVoXXB,  maK&:eWޢ׊<{ћCc{zTV*FE$˸"D/i aSRo{yOX޵zҝia_\+>Hgҕ՘g b6e|J˄IԢ5%7ubr,BXÛTG&\3I\~CL'%YтpK%G:7DF`AƍCifNmhX^~+y}P'rjW]:8]j-lo $$y#Q1BK#̮8?|.q{sqx!3OW1_2kNڄBz-Fyɮ׊J :fh6nr`^bo;}42kƮEkd yV?/^`6Gl'ߑ &ώI0Z0!,C+Z*s ԙZF6Ҵj\( Յ1~[}e`1\ T(d/\fkO`1)s|YN"IHdKic33Ǥ(=9?`˜yڳnzq[и6x\L9ͨ_QL@Y \b&+_%n6X-$} LL“x"&rdx#3Fw?ɓfIrb "521LK*I|x&KW ÜQ?4\Vhujh\FQ b9`,yьidgJVd@mv$@SM mx9$з+oR=f-u~Ʀu0Q֝F&yxnMAjD.ɂ,`%G,0H`&A4;k{P)ЦrT_$T^MDrWiEKD˖$0q3@=Cz@dgHTrŶ eE.E' b4p}1a: x(`tja- \'3Jv/܀&;t3{ k8jk-8 ;d9Bm𭜵N[Q+sarYQHᣟ,q1y6[*ٍ[kߜk{qbQH"VGw0vҜGJQI۵zFȒ+lO_xÄ${.i~M"]jrU~'xc)[ `(_[oF8t k>6 O".tX0% T6I Ϧߓ„f`1z9.ES;E"w*() Lh4pތq~Lt#wc\AH!^uCvUg-X:0:Hw˳*6~$XG0gW9[k.pB X0x;1oޖgP{.:_ 7!+ƬRz)20LcnS|X9H+n3PHf~2 ,Q} ]ٳ L޹"dș(|uvc=xVPS*AQ% seA~ ,k@B>@_ G#7n ih3`H]H?#{@31WdXi@kͬy?_َ#d~7PJ$ s-3#6[2JLYPŢkؽמx3?CveT TD/)|MAƦQi–b9SRhu_Bn`]45;R<] PdI&27yQ9E2`U  YA0FGّ3*V =]@T{A3m3ٔ$* ނ)g|*5.a xIqt Or'$aM) 2sj `$!]G42axr$,BS(a׼zyd?Z,Fl:~eQ i[4 $lc*Lٺhl}JKyWʵ UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1b# DECC$STRNCPY4 0u@4u DECC$STRNCPY4@uGXu DECC$STRCHR4Hub# DECC$STRCHR4Tu@Xu DECC$STRCHR4huGu DECC$STRCHR4pub# DECC$STRCHR4u@u DECC$STRCHR4pvGvDECC$GXSPRINTF4vb#DECC$GXSPRINTF4v@vDECC$GXSPRINTF4vGvDECC$GXSPRINTF4vb#DECC$GXSPRINTF4v@vDECC$GXSPRINTF4xGxDECC$GXFPRINTF4xb#DECC$GXFPRINTF4x@xDECC$GXFPRINTF =JAN=FEB=MAR=APR =MAY(=JUN0=JUL8=AUG@=SEPH=OCTP=NOVX=DEC`= SYS$OUTPUT p=H; Default: deq = %6d, mbc = %3d, mbf = %3d. =8+Get RMS defaults. getjpi sts = %%x%08x. =H<Open callback. ID = %d, deq = %6d, mbc = %3d, mbf = %3d.  =8+Can not create destination directory: %s P=H9Invalid destination directory (includes file name): %s =@2Invalid destination directory (parse error): %s =  creating: %s =@2warning: skipped "../" path component(s) in %s =xxxxxxxxxxxxxxxxxxxxx=H9%s[ VMS status = %d ] stamp_file: sys$dassgn failed. =([ Modify file QIO failed. ] =0!%02d-%3s-%04d %02d:%02d:%02d.00=([ Access file QIO failed. ] 8=0!stamp_file: sys$assign failed. `=PAstamp_file: sys$parse failed. %02u-%3s-%04u %02u:%02u:%02u.00=@`xx[ Warning: CRC error, discarding PKWARE extra field ] [ Warning: Unknown block signature %s ] =H:warning: set-dir-attributes failed ($qiow mod) for %s. =H:warning: set-dir-attributes failed ($qiow acc) for %s. =xowarning: set-dir-attributes failed ($assign) for %s. warning: set-dir-attributes failed ($parse) for %s. p= %.*s000000%c%.*s%s=([ Deaccess QIO failed ] =8.[ _close_qio: sys$synch found I/O failure ] =([ WriteQIO: sys$qio failed ] =8,[ WriteQIO: sys$synch found I/O failure ] (=0"[ _close_rms: sys$wait failed ] P=0$[ WriteBuffer: sys$write failed ] x=0#[ WriteBuffer: sys$wait failed ] =0"[ WriteRecord: sys$put failed ] =0#[ WriteRecord: sys$wait failed ] =0$[ Warning: Record too long (%u) ] =8.[ Warning, incomplete record of length %u ] H=0![ Record too long (%u bytes) ] l= @Ppppppp`pppppppppppppppppppppppDXpppppph%s exists: new [v]ersion, [o]verwrite, or [n]o extract? (Uppercase response [V,O,N] => Do same for all files): =8)[ Cannot create (QIO) output file %s ] =XOcreate_qio_output: sys$assign failed. create_qio_output: sys$parse failed.  =0#[ Cannot allocate space for %s ] 0 =H9[ File %s has illegal record format to put to screen ] p =8,Cannot create ($connect) output file: %s  =8-[ Cannot create ($create) output file %s ]  = Error: zipfile is in variable-length record format. Please run "bilf l %s" to convert the zipfile to stream-LF record format. (BILF is available at various VMS archives.)  =( sys$open() error:  =4, error: cannot open zipfile [ %s ].  =0 ;7DECC$GA___CTYPE  SYS$GETJPIWDECC$GXFPRINTF7DECC$GA_STDERRX;7RMS_MBC_ACTIVE=0 0;=@< ;7RMS_EXT_ACTIVE7RMS_MBF_ACTIVEp; ;G Te5=0 8w;= @< = Apr 29 2009= V6.2 =DEC C DECC$STRCHR=0@ t;= DECC$GXSPRINTF7 COMPILEDWITHP DECC$STRNCPY= on h= (%s Alpha)x= OpenVMS=0 @r;=`|  SYS$ASSIGN(; SYS$DASSGNSYS$QIOW=0 xt;=0 =0 s;=@ =0 q;=  DECC$EXIT DECC$STRLEN=?zG{ SYS$NUMTIM DECC$STRCMP7DECC$GA_RMS_XABDAT DECC$STAT=0 n;= 8OTS$MOVE7DECC$GA_RMS_FAB=.=.; SYS$CLOSE=@ SYS$OPEN=0 Y;=0 c;=  ;p! DECC$STRCPY# DECC$MKDIR= SYS$DISK:[] %CMA$TIS_ERRNO_GET_ADDR'FNFILTER7DECC$GA_RMS_NAMG  e5) SYS$PARSE+ ZSTRNICMP=0 Y;=p  ; ;- DECC$STRNCMP/ DECC$STRRCHR=..H=0 U;=p o UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1ep1MAKEWORD3 DECC$UMASK5 SYS$SETDFPROT=0 0S;=P< 7LIB$SYS_GETMSG9 SYS$SEARCH=0 Q;=0 Q;=(` %s[ %s ]  =0 HL;=P| ;DECC$LOCALTIME= DECC$TIME? SYS$BINTIM=0 G;=  > ף=0 I;=@< =0 %;=0 A DECC$FREE=0 ;=0 7DECC$GA_RMS_XABRDT=VDAT =VPRO(=VMSV0=VFHC8=VFAB@=VKEYH7DECC$GA_RMS_XABALL=0 (;=? CEXTRACT_IZVMS_BLOCK7DECC$GA_RMS_XABKEY=IM=VALL7DECC$GA_RMS_XABPROECRC327DECC$GA_RMS_XABFHC=VRDT=0 8>;=( .DIR;1]G DECC$STRCAT=%.*s%c%.*s%s=0 =;=P I DECC$MALLOC=0 7;=0 =0 &;=0 =0 ` `P;;=0 K SYS$SYNCH=0 (;=0 MSYS$QIO=0  *;=P =0` H8;= OSYS$WAITG e5=0 4;=@< `Q SYS$WRITE=0 ';=P =0 5;=@ SSYS$PUT= =0 .;=0 /;= =0 +;= =0 ;= 7 DECC$GA_STDINU DECC$FFLUSHW DECC$FGETS;;=0h ;=< Y SYS$CREATE=0 H;=p p;;; [ SYS$CONNECT;7DECC$GA_RMS_RAB; ] SYS$EXTEND;=0X 8;=  ==T4=4= 4=PDp= 46664444 4(40484@4H4P4X4=(  6= 64== 4=\4=4=4=4=  4= 4=4=(4=4666  =46= ;Zx0Nm(= `4=[]*.ZIPA A=)!error: invalid response [%.1s] \  \=D< (EOF or read error, treating as "[N]o extract (all)" ...) 0 0 =0123456789ABCDEF   =      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  =4@ 4=4D4=4H4= $ $ = 9 9=)! VMSDEC C V4.1-001v v= 44= __iscntrl4= l0$ $= 4: := (4= 0x x= 04X4= get_rms_defaults04=  [ [ [ [ [ [ [ [ [ [  [ [ [ [ [ [ [ [ \ \ \ \ \( [$ $= 44: := 4=  = 84( 4= check_format 84=}| \  \  \   \  \  !\ "\ $\ ,\ /\0$ $= <4: := 4= g g= H4 4= open_outfileH4= i\ i\ m\r \ \ \ \ \  \ \ \ \ \ \ \ ] ] ] ] ] ] ] ]  !] "] "] '] -] -] ,] G] F] F] H] G] F] F] b]  q] q] r] v] v\  )` ] ] ] v\& ] ] ] v\ \ \ \ \+ ] v\> v\T ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ ^ ^ ^ '^ )` .^ :^ B^ K^ T^ U^ T^ T^ W^  Y^ \ \ \ \ \  {^ r^  r^  w^h UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1l w^ ^J $ ^ ^ ^ ^ \m \l \ \ \ \ \ \ \e  ^ ^ ^  ^  ^ ^ ^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ "_ "_5 L_ J_ [_ J_ [_ K_ [_ L_  \_ L_ [_ L_ [_  [_ [_  K_ i_ j_ l_ s_ q_ q_  _ _ _  _  _ \M \O \ \ \R \ \ \Q \I \K \M z\$ $= 4. .=  H4= . .=  G4=  = . .=  G4=  = . .=  G4=  =  = . .=  H4= . .=  G4=  = . .=  G4=  = . .=  G4=  = . .=  G4=  =  = . .=  H4= . .=  H4= . .=  G4=  =  = . .=  G4=  = . .=  G4=  = . .=  G4=  =  = : := @4= `' '=# init_buf_ring = ! != &44='set_default_datetime_XABs4= \$ \$ \, \ \ \ \ \ \ \ \ \ \ \ \# \ \ $ $= 4: := 4= @/ /=+#"create_default_output = + +='create_rms_output = + +='create_qio_output = T T= #4p 4=$replace_rms_newversion4= _ _ _ _ _ _  _ _  _ ` _ ` ` `U ` ` ` `  ` ` `,$ $= 4. .=  4=  = : := 4= / /=+#"replace_rms_overwrite = " "= 4 4= replace4= 2` 2` <` A` Q` Q` M` f` x`5  ~` ` Y` Y`,H$ $= 4: := 4= P = (4P4=find_vms_attrs(4=:2 ` ` ` ` ` `  `  ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `  a a a a a 'a %a =a ?a ?a ?a @a "a" "a$ Ka ` Oa Qa  \a ^a aa ca caH ` > $ $= ,4. .=  '4=  = . .=  '4= . .=  '4=  =  = : := $4=  = %44= free_up%4=IA @ oa oa oa |a xa a$$ $= %4. .=  %4=  = : := &4=   = &4`4= flush&4=;32 a a a a a@$ $= &4: := d'4=  = '4p4= _flush_blocks'4= a a a a a a a a a a a a a8$ $= '4. .=  '4=  = : := (4= h = (44=WriteQIO(4=med a a a a a a b b$ $= (4: := *4= 0 =  *44= _flush_qio *4= b b b b "b $b *b b b 1b 1b 1b 8b8$ $= `*4. .=  *4=  = . .=  *4=  = : := p+4= ` `= +44= _flush_varlen+4= b b  b b b b b b b bn b b b  b b  c c c c@$ $= +4. .=  +4=  = . .=  +4=  = : := `.4=  = .44=find_eol.4=OGF Gc Dc Ic Ic Ic Ic Ic$ $= .4f UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1: := /4= PC C= /44= _flush_stream/4= _c _c  hc  sc sc  c c c c  c c c c c c c c c c c c  c  c  c c c  c c c c  c c cG c c c c c c c<$ $= 004. .=  /4=  = . .=  /4= . .=  /4= . .=  /4=  =  =  = . .=  /4= ! = . .=  /4=  = : := 34=  = 4484= WriteBuffer44= d d d d d d 0 d d d !d %d %d %d! *d $d$ $=  44: := "l44=  = 544= WriteRecord54= 6d 6d 6d 6d =d =d ?d( Dd Dd Gd Md Md Od& Rd Rd Ld$ $= 54: := l64=  = 74@4= close_outfile7#4=]UT d d d d d d d d d$ $= 74: := (84= @ @= H844= _close_rmsH84= d d *e 1e 1e 6e :e :e e Ce Ce DeL De De De Ee Je$ Me  $ $= d84: := <;4= = == P;44= _close_qioP;4= ge ge ge ge ge ge  ke  te ke re re qe me pe oe oeJ oe me  oe ye> e($ $= T;4: := %<4= * *=&vms_path_fixdown =  = =44=defer_dir_attribs=4=won f  f  ,f -f 6f 7f :f =f ?f0$ $= =4: := >4= 8 = 8>44=set_direc_attr&ibs8>4=$ Lf Lf Lf Xf er e e e e e f f f_ f f fS fX ef ef ef ff ff nf lf nf nf tf  f f f f f f f f f f f f f f f f 'f f f f f f f  f f f f f f f f f f f f g f f g g g g g g g $g* $g $g %g $g ;g $g $g %g %g $g $g) Og Og Wg eg ( |g |g |g  g g g@ }g$ $= <>4. .=  7>4=  = . .=  7>4=  = : := 4G4= P } }= G4p4=mkgmtimeG4= g g g g g g@ g g g) g g g g g g g g g g g g g g g g g g g g g  g $ $= G4: := I4= p) )= I44=dos_to_unix_timeI4= g g g g g g g g g * h h h h2 h h h h h $ $= I4: := 8L4= P( (=$uxtime2vmstime =  = HL4 4= stamp_fileHL4= .h( Wh Wh Yh gh fh Yh gh jh gh gh gh lh gh +th th th th  h h h  h h h h h  h  h h h h h h h h h h h #h #h #h #h "h "h "h #h #h #h "h #h "h %h h h  h h h  h h h h h h h h h h h ,0$ $= L4. .=  GL4=  = : := Q4= py y= Q44= vms_msg_textQ4= 0i$ $= Q4: := Q4= ' '=# vms_msg_fetch =  = Q4-4= vms_msgQ4=xw @i 9i 9i 9i( 9i 9i 9i 9i 6i ;i ;i ;i0$ $= Q4. .=  Q4=  = : := R4= h = 0S44= do_wild0S4=*" ei ; si; i i} UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1Tu-. vi vi vi xi yi  i zi  i i i i  i  i i i 9i] 9i 6i] ;i\ i 9ip 9i 6iy i($ $= \S4. .=  /S4=  = . .=  /S4=  = : := U4= M M= /U4H4= mapattrU4= i  i i i i i i i i i i i i i i i i i i i i i i j j j# j j j j j j j -j -j -j# Gj Pj PjW Rj P 0j Pj Pj Sj Pj Sj  gj@$ $= V4. .=  U4= . .=  U4=  =  = : := lY4= ~ ~= Y404=dest_struct_levelY4= j$ $= Y4: :=  1Y4= + +='adj_dir_name_ods2 = + +='adj_dir_name_ods5 = , ,=( adj_file_name_ods2 = , ,=( adj_file_name_ods5 =  = Y44= mapnameY4=,$ k k k  k k k k2 l l l 'l j jM j j  j   j9 j j j k k k k k j j l% 9l :l =l Bl Bl Il Jl Il Jl k8 k  @k Hk Ok 3 @k  dk  k k k k k k k k k k k k%H$ $= Y4. .=  Y4=  = . .=  Y4=  = . .=  Y4=  = . .=  Y44=  = . .=  Y4=  = : := @c4=   = c4@4=checkdirc4= hl hl'  l l l l  l  l l  l  l l l l l l l l l l 5l l l l l l l l l l l l l l l  l m m m m m m m m m "m 'm )m .m ,m ,m 0m m @m Am Jm Jm Jm Jm Lm Pm Um Vm Ym 6Ym bm dm bm hm dm  gm  gm hm  im  rm sm tm um sm sm um m zm  m m m m m m m m m  m  m m m m m m m  m m m m  m m@$ $= c4. .=  c 74= . .=  c4=  =  = . .=  c4=  = . .=  c4=  = : := n4= 8  = n44=check_for_newern4=/' m m m  n n n n8 n n n! n' 0n 9n 0n  9n 0n  0n 0n  1n 3n 0n  >= 8w44= acc_cb8w4= o o o o o o o o o o o o oQ p p p p p p p( o($ $= hw4: := x4=  =  /ww UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1<=1V1.0AAUNZIPV1.029-APR-2009 07:18DEC C V4.1-001  $ABS$iH$CODE$,. $LITERAL$`$LINK$$DATA$$BSS$ $READONLY$D MASK_BITS VERSIONDATEP ENDSIGMSGH CENTSIGMSG@SEEKMSG (FILENAMENOTMATCHED(0EXCLFILENAMENOTMATCHE>D REPORTMSGZIPNFO ( COMPILEDWITH HUNZIPUSAGELINE1DECC$GXSPRINTF DECC$PERROR DECC$ISATTYDECC$GA___CTYPE DECC$STRNCMP DECC$STRLEN DECC$STRCMP DECC$SIGNAL DECC$GETENV GLOBALSCTORG(JMAIN(JHUNZIP(JpUZ_OPTS(J?USAGE PROCESS_ZIPFILESZI_OPTSHANDLER ZSTRNICMP RETURN_VMSENVARGSVERSION0  MASK_BITSFNAMES0  VERSIONDATE0 CENTSIGMSG0 ENDSIGMSG( SEEKMSG8 FILENAMENOTMATCHED8 @EXCLFILENAMENOTMATCHED0  REPORTMSG( ZIPNFO0  COMPILEDWITH0 UNZIPUSAGELINE1(J __MAIN DECC$MAIN DECC$EXIT =#4G~^ ^(GG#0B  = > 8b@Zk =b# @ BG(b4G@ZkG] ](0#kG#G~^^ ~(GGAG0B8b=@Zk=Ghb#@ BG(b4G@ZkG]4G] }(0#kG#TG~^^ ~(08޴@GG TG(B="0b@ZkG(BTG"0b@ZkG(BTG"0b@ZkTG(BTG"0b@ZkG(BTG"0b@ZktG(BTG"0b@Zk b=5@HB!G@Zk= @1q"@3B"@@.JF/ K G. J F`/ `K+D @_@.JF @B bh"GBGtG@Zk""#BbGTGtG@Zk"" =TGtG 8B@b@Zk "B="bG d"G@ZkG@"G4G "B="bG d"G@ZkG "XB`b4G@Zk9 4GG %G`??"HB@ @@Zk@ }0@B SB &"B & b1"GtG@ZkGG[GG"G@ZkTGG "="TGBb@ZkG "="(b#@G =G ?@FG= &CGGQ1"#" =T 㳸#G#""TG8 8BtG@b@Zk2%=1"#@ Gc3@cJpFtBW`Jc 峼5@JpFBWJ/K% @ #9@Ee#!aC =#HN@pDc @WH  B L(B""@Zkâ 4GD㳸 G峸#9@#Kp D!CW H#=" }0BJp@FBWJ0pB %G4G G &" C'b DB1"GTG@ZkGG[GG"G@ZkTG&G4Gð㳸4G# #& C& ?@"TG0D Bb01"G@ZkGG[GG"G@ZkxBGb@ZkGG]G] }(08ݤ@P#kp#~^^~ (0޴8@H>P^X~`hp޵xGGG#GGG G 4G_!'1@QO ,`! H%DJ K.+ k!AAJ'H? %@ @\@TCkG0@ðB  E@D Gð" 0@ GB @DGð" A0@BA ðGGBRG"GG@GjCL}@G"l,H @!'1@ @.@JDK.KJ? ,k! H+,k!+H?G@2FB@F@Gð"0@GBGL ðL@ @Ã?+,TG+H-D4 D G|ðBG(wG"(AsGT@2FB@FT@FGjð"T0@TeGB0 @D0G\ð"00@0WGBGtQGt@MG"G4GGB4RCG8 !&@ D8 G:ðB80@85G"_"G< @D<*ðB? <R@<#G(C-?' m@.@J @K H!'1@M2,2H%D- K.KJ +,k!+H? ,k! HG"<A2FB@F<AGð< 0 @< GBG@GG@@G"GDGBDRGGHG"HAGBGLGL@G"G0AGB0GT !&@ DT GðBT0@TTGT2GGX೫G"XAGB` @D`Gð"`0@`GBGdGd@G"hA2FB@FhAGðh 0 @h GTG"B E&b $ҡ!(1"G@ZkGG[GGH"G@Zk4GjGleG¥lNaGp !&@ Dp GXðp00 Bp0SG4GPðTG"B O&b o&ҡs 1"G@ZkGG[GG"G@ZkTG $"B $ bX1"GTG@ZkGG[GG"G@ZkTGyG $"B $Ơ b1"GTG =x p @ZkGG[GG"G@ZkTGcG %"B ,%)!b1"GTG@ZkGG[GG"G@ZkTGMIGBTG"B j%b %k!1"G@ZkGG[GG"G@ZkTG6 m$"B %c!b1"GTG@ZkGG[GG"G@ZkTG!G $"B $ b1"GTG@ZkGG[GG"G@ZkTG GB$ ð X E0b % G!MAB %b-IΡ mA8""MGtG@ZkG 0A[GGGGGA@ZkGb#@ð¤ &4DơLF?AA桫A_A -E lE E`@ &$" &BJ0!Gbx1"TG@ZkGG[GG"G@Zk4G TG! fTG!Ʊ F@@4 $8& &$"a!A?A1" -E BGbTG@ZkGGG[G"G@Zk8t4G4G@BHb@ZktGA'1@Ez  &%TF f%<k!)`""Y@A!GEd BbGX_"tG@ZkGGGGGSG¥ %B %!b!b"G~GGGGG@ZkG $[GGGGG@Zk."BGKTGb %@ZkGGG[GGG@ZkGPB F%Xb $ $@ZkB."GbTG@ZkGGG[GGG@Zk."BPN"JGbtG@ZkGGG[GGG@Zk."BN"GbtG@ZkGGG[GGG@Zk."BN"GbtG@Zk %GG[GGGG@ZkB."N"bGtG@ZkG f%[GGGGG@Zk."BN"kGbtG@Zk &%GG[GGGG@ZkB.")(N"bGtG@ZkGa6 UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1mKLG f$[GGGGG@Zk."B`N"cGbtG@Zk %GG[GGGG@ZkB.""b"GTGtGG@ZkG $[GGGGG@ZkB."GbTG@ZkGGG[GGG@Zk % B"(b4G@Zk@@."N"@,H@ EE!B@EbGGG@ZkGG[GGGG@Zk B f%(b"4G@Zk@k@."N" `,`H@ #E B EbGGG@ZkGG[GGGG@Zk $ B"(bM4G@Zk@@."N"@-@I_AD!BDbGGG@ZkGG[GGGG@Zk B %(b"4G@Zk@@."N"`,H@dD!B`DbGGG@ZkGGGGG[G@ZkÈfb# eE4`EG&@GơDHhFT&E3A@ ƱàGG]]} (0ݤ8@H=P]X}`hpݥx#kG#tG~G^G^TG~ (0޴8@HGG# bG(⤤CH"N &G= $@0B X 8bGP @ZkG $[GGGGG@Zk0B'"G8bTG@ZkGG $[GGGG@Zk0B'"xG"8bGtG@ZkG $[GGGGG@ZkGTGX"h $0B $@ 8bH"h"GGGGG@ZkG( $[GGGGG@Zk0B `B"8be"GGG@ZkGG[GGGG@Zk $0B%"G8bTG@ZkGGG[GGG@Zk $O0B%"E"8bGtG@ZkG $[GGGGG@Zk%"0B0E" e"8bGG@ZkG $[GGGGG@Zk(%"E"pe"p"GG0BTG8bE@ZkGG[GGGG@ZkG]G]} (0ݤ8@HP#k4!$GH DECC$MAIN4"<b#  DECC$MAIN4!D@H DECC$MAIN4XGl DECC$EXIT4 `b#P  DECC$EXIT4h@l DECC$EXIT4G GLOBALSCTOR4b# GLOBALSCTOR4@ GLOBALSCTOR4G RETURN_VMS4b# RETURN_VMS 4@ RETURN_VMS4@GT DECC$SIGNAL4Lb#H DECC$SIGNAL4QP@T DECC$SIGNAL4XGl DECC$SIGNAL4db#H DECC$SIGNAL4h@l DECC$SIGNAL4pG DECC$SIGNAL4|b#H DECC$SIGNAL4@ DECC$SIGNAL4G DECC$SIGNAL4b#H DECC$SIGNAL4@ DECC$SIRGNAL4G DECC$SIGNAL4b#H DECC$SIGNAL4@ DECC$SIGNAL4G DECC$SIGNAL4b#H DECC$SIGNAL4@ DECC$SIGNAL4G DECC$STRLEN4@ DECC$STRLEN4 G ZSTRNICMP4b#HS ZSTRNICMP4 @ ZSTRNICMP4 G ZSTRNICMP4b#H ZSTRNICMP4 @ ZSTRNICMP4G DECC$STRNCMP4b#H DECC$STRNCMP4@ DECC$STRNCMP,G4ENVARGS,b#HENVARGS,0@4TENVARGS,XGxENVARGS,`b#HENVARGS,t@xENVARGS4G DECC$PERROR4b#H DECC$PERROR4@ DECC$PERROR4G DECC$STRLEN4@ DECC$STRLEN4GDECC$GXSPRINTF4b#HDECC$GXSPRINTUF4@DECC$GXSPRINTF, TG`ZI_OPTS, Xb#HZI_OPTS, \@`ZI_OPTS4G DECC$STRNCMP4b#H DECC$STRNCMP4@ DECC$STRNCMP4 G DECC$STRCMP4 @ DECC$STRCMP4b#HDECC$GXSPRINTF4VGDECC$GXSPRINTF4@DECC$GXSPRINTF4,G@DECC$GXSPRINTF40b#HDECC$GXSPRINTF4<@@DECC$GXSPRINTF<`GpPROCESS_ZIPFILES<hb#HPROCESS_ZIPFILES<l@pPROCESS_ZIPFILES4LGpDECC$GXSPRINTF4TWb#pDECC$GXSPRINTF4l@pDECC$GXSPRINTF4 G0DECC$GXSPRINTF4b#pDECC$GXSPRINTF4,@0DECC$GXSPRINTF4`GDECC$GXSPRINTF4pb#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4X@DECC$GXSPRINTF4G4DECC$GXSPRINTF4 b#pDECC$GXSPRINTF40@4DECC$GXSPRINTF4lGDECC$GXSPRINTF4tb#pDECC$GXSPRINTF4@DECC$GXSPRINTF 4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECYC$GXSPRINTF4G<DECC$GXSPRINTF4(b#pDECC$GXSPRINTF48@<DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4PGpDECC$GXSPRINTF4`b#pDECC$GXSPRINTF4l@pDECC$GXSPRINTF4GZ DECC$GXSPRINTF4b#pDECC$GXSPRINTF4@ DECC$GXSPRINTF4@GL DECC$ISATTY4Db#p DECC$ISATTY4H@L DECC$ISATTY4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$GXSPRINTF4j UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1 Z[b#pDECC$GXSPRINTF4@ DECC$GXSPRINTF4HGdDECC$GXSPRINTF4Xb#pDECC$GXSPRINTF4`@dDECC$GXSPRINTF,GVERSION,b#pVERSION,@VERSION4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4\@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4 G<DECC$GXSPRINTF40b#pDECC$GXSPRINTF48@<DECC$GXSPRINTF4`G|DECC$GXSPRINTF4pb#pDECC$GXSPRINTF4x@|DECC$GXSPRINTF4]GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4(GHDECC$GXSPRINTF48b#pDECC$GXSPRINTF4D@HDECC$GXSPRINTF4pGDECC$GXSP^RINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4@GT DECC$GETENV4Hb#p_ DECC$GETENV4P@T DECC$GETENV4|GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$GETENV4b#p DECC$GETENV4@ DECC$GETENV4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4`@DECC$GXSPRINTF48GL DECC$GETENV4@b#p DECC$GETENV4H@L DECC$GETENV4tGDECC$GXSPRINTF4|b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$GETENV 4b#p DECC$GETENV4@ DECC$GETENVa4G DECC$GXSPRINTF4b#pDECC$GXSPRINTF4@ DECC$GXSPRINTF4XGDECC$GXSPRINTF4db#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GbDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4DGDECC$GXSPRINTF4Xb#DECC$GXSPRINTF4|@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4cb#DECC$GXSPRINTF4@DECC$GXSPRINTF48GXDECC$GXSPRINTF4Hb#DECC$GXSPRINTF4T@XDECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4d@DECC$GXSPRINTF ==== =(=0=8=@=H=P=X=`=eh=p=x============f========= =PDExtended Help for UnZipSee the UnZip Manual for more detailed helph= instead.x=(gBasic unzip command line:=Some examples:=H: unzip -t foo - test the files in archive foo= options.=(Basic zipinfo command line:=H: zipinfo options archive[.zip] [file ...] [-x xfile ...]X=H; unzip -Z options archive[.zip] [file ...] [-x xfile ...]=0'port and is referred tho as Unix Apple.=unzip options:=@6 -Z Switch to zipinfo mode. Must be first option.=( -hh Display extended help.(=@5 -A [OS/2, Unix DLL] Print extended help for DLL.`=H; -a allowed and EBCDIC conversions done if needed.=H9 -f Freshen by extracting only if older file on disk.=0$ -li List files using short form.=@5 files extracted in binary mode (as stored).@=( -t Test archive files.`=( zip -o but faster.=( verbose output.=0% -z Display only archive comment.= unzip modifiers:=w marker, and from or to EBCDIC character set as neP UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1&ijeded. overwritten file in foo~ or foo~99999 format.X=0& -C Use case-insensitive matching.=H: is on by default and -D essentially becames -DD.=@7 -DD Skip restoration of timestamps for all entries.=  restore.=( standard header.0=0' -LL Convert all files to lowercase.Xk=H9 -N [Amiga] Extract file comments as Amiga filenotes.= care.=0& command line to other users.=H< uppercase if created on MS-DOS, VMS, etc. See -L.=PC -V Retain VMS file version numbers. directory levels.X=( user privileges.x=( system privileges.l=0( -/ e [Acorn] Use e as extension list. =@5 directory, which can be a security problem.=H9 this is not a good thing and should be avoided.8= Wildcards:H=@5 Internally unzip supports the following wildcards:=H= * matches any number of characters, including zero=8, If port supports [], must escape [ ams [[]= Include and Exclude: =H> -i pattern pattern ... include files that match a patternH =H> -x pattern pattern ... exclude files that match a pattern =8) unzip archive -x pattern pattern ... =h_ use unzip on that. See the manual page for Zip 3.0 or later.Streaming (piping into unzip): =8/ used to process the first entrny in a stream.H =( cat archive | funziph = Testing archives: =0% -t test contents of archive =  quieter operation. = Unicode: = digit. =H> -v List zipfile information in verbose, multi-page format. =@7 and compressed sizes, and compression factoors.X =H< -UU [UNICODE] Disable use of any UTF-8 path information. =@1 -z Include archive comment if any in listing. =(funzip stream extractor: =@2 is given, read from that file instead of stdin.( = funzip command line:@ =0' funzip [-password] [input[.zip|.gz]]h =(unzipsfx self extractor:p = unzipsfx command line: = unzipsfx options: =@3 -c, -p - Output to pipe. (See above for unzip.) =8- -f, -u - Freshen and Update, as for unzip. =@6 -z - Print archive comment. (See unzip above.)X = unzipsfx modifiers:p =@5 Most unzip modifiers are supported. These include =q( -a - Convert text files. =( -n - Never overwrite. =PD -o - Overwrite without prompting. -q - Quiet operation.0=8+ -C - Match names case-insensitively.`=  -j - Junk paths.x=0! -V - Keep version numbers.=8* -s - Convert spaces to underscores.=0! -$ r - Restore volume label.=0% -d exd - Extract to directory exd. =8*forces extraction to specified directory.P=8/See unzipsfx manual page for more information.=XJUnZip lists and extracts files in zip archives. The default action is to=XJextract zipfile entries to the current directory, creating directories as =needed. Wsith appropriate options, UnZip lists the contents of archives unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir] unzip -l foo.zip - list files in short format in archive foo.zip=XJ unzip -Z foo - list files using more detailed zipinfo formatP=PE unzip foo - unzip the contents of foo in current dir=XI unzip -a foo - unzip foo and convert text ftiles to local OS =XJIf unzip is run in zipinfo mode, a more detailed list of archive contents8=is provided. The -Z option sets zipinfo mode and changes the availableBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix based= -c Extract files to stdout/screen. As -p but include names. Also, -p Extract files to pipe (stdout). Only file data is output and alluh=PG -T Set timestamp on archive(s) to that of newest file. Similar to= -u Update existing older files on disk as -f and extract new files. -v Use verbose list format. If given alone as unzip -v show versionH=XI information. Also can be added to other list commands for more=PF -a Convert text files to local OS format. Convert line ends, EOF=PFv -b Treat all files as binary. [Tandem] Force filecode 180 ('C').(=XK [VMS] Autoconvert binary files. -bb forces convert of all files.x=PF -B [UNIXBACKUP compile option enabled] Save a backup copy of each=XN -D Skip restoration of timestamps for extracted directories. On VMS this=XN -E [MacOS (not Unix Apple)] Display contents of MacOS extra field duringw`=XJ -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn if=PA ACORN_FTYPE_NFS] Translate filetype and append to name.=XL -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name inH=PA -j Junk paths and deposit all files in extraction directory.=XI -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific infxo.=PE -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.(=PG -L Convert to lowercase any names from uppercase only file system.p=PG -M Pipe all output through internal pager similar to Unix more(1).=XN -n Never overwrite existing files. Skip extracting that file, no prompt.=XN -o Overwrite existing files without prompting. Useful wg UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1yxyith -f. Use withX=XI -P p Use password p to decrypt files. THIS IS INSECURE! Some OS show= -q Perform operations quietly. The more q (as in -qq) the quieter. -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores.8=PA -S [VMS] Convert text files (-a, -aa) into Stream_LF format.=XO -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCIIz=XJ text escapes where x is hex digit. [Old] -U used to leave names =XM -UU [UNICODE enabled] Disable use of stored UTF-8 paths. Note that UTF-8p=XL paths stored as native local paths are still processed as Unicode.=XL -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do not= match directory separator /, but **{ does. Allows matching at specific -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACL entries under VMS,= or UIDs/GIDs under Unix, or ACLs under certain network-enabled versions of OS/2, or security ACLs under Windows NT. Can requireH=PG -XX [NT] Extract NT security ACLs after trying to enable additional=XI -Y [VMS] Treat archived name endings of .nnn as VMS version numbers.| =PG -$ [MS-DOS, OS/2, NT] Restore volume label if extraction medium is(=XI removable. -$$ allows fixed media (hard drives) to be labeled.x=XO -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members into=XK locations outside of current extraction root folder. This allows=XK paths such as ../foo to be extracted abov}e the current extractionh=XO -^ [Unix] Allow control characters in names of extracted entries. Usually=XN -2 [VMS] Force unconditional conversion of names to ODS-compatible names. =XM Default is to exploit destination file system, preserving cases andX =XO extended name characters on ODS5 and applying ODS2 filtering on ODS2. =PG ? (or ~%% or #, depending on OS) matches any single character =XM [list] matches char in list (regex), can do range [ac-f], all but [!bf]@!=XM For shells that expand wildcards, escape (\* or "*") so unzip can recurse.!=XJ Patterns are paths with optional wildcards and match paths as stored in!=XI archive. Exclude and include lists end at next option or end of line.0"=Multi-part (split) archives (archives created as a set of split files): Currently split archives are not readable by unzip. A workaround is"=PG to use zip to convert the split archive to a single-file archive and#=XI Currently unzip does not support streaming. The funzip utility can beX#= This can be modified using -q for quieter operation, and -qq for even If compiled with Unicode support, unzip automatically handles archives#= with Unicode entries. Currently Unicode on Win32 systems is limited. Characters not in the current character set are shown as ASCII escapes$=XI in the form #Uxxxx where the Unicode character number fits in 16 bits,$=XI or #Lxxxxxx where it doesn't, where x is the ASCII character for a hex(%=PAzipinfo options (these are used in zipinfo mode (unzip -Z ...)):p%=XN -1 List names only, one per line. No headers/trailers. Good for scripts.%=XJ -2 List names only as -1, but include headers, trailers, and comments.&=XM -s List archive entries in short Unix ls -l format. Default list format.`&=XJ -m List in long Unix ls -l format. As -s, but includes compression %.&= -l List in long Unix ls -l format. As -m, but compression in bytes. -h List header line. Includes archive name, actual size, total files.H'=XN -M Pipe all output through internal pager similar to Unix more(1) command.'=XL -t List totals for files listed or for all files. Includes uncompressed'=XN -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)8(=PG Default date and time format is a more human-readable version.(=XJ -U [UNICODE] If entry has a UTF-8 Unicode path, display any characters(=XI not in current character set as text #Uxxxx and #Lxxxxxx escapes )=XK representing the Unicode character number of the character in hex.p)=PG funzip extracts the first member in an archive to stdout. Typically) =XJ used to unzip the first member of a stream or pipe. If a file argument*=PD Self-extracting archives made with unzipsfx are no more (or less)P*=PF portable across different operating systems than unzip executables.*=XJ In general, a self-extracting archive made on a particular Unix system,*=PE for example, will only self-extract under the same flavor of Unix.0+=PG Regular unzip may still be used to extract embedded archive however.x+=XJ [-options] [file(s) ... [-x xfile(s) ...]]+=PC -t - Test embedded archive. (Can be used to list contents.),=PGIf unzipsfx compiled with SFX_EXDIR defined, -d option also available:X,=KCBy default, all files extracted to current directory. This option ,=`R You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT. ,=@8XXXXXXXXXXX XXXXXXXX0XXXXXXXHXXXX pX@XXXXXX `hXXXXpXXHXXh =0 ;=P 7G;DECC$GXSPRINTF;=P="X,;=[-Z] h;=0 ;=  DECC$GETENV;=%s  DECC$ISATTYVERSION=%d =-Zw ^&>/4E /hڥ 01ߊ'|35*$H-U/7rZÑy/~*vwaI( /Ew~J5Gףk3x$[}=25^PeޚNf)_3~Bf gu4t3V^_yú\hrYNˍ׌ R'TH9nti~r@7x4 Zt=zLrohp8O;׋` yQ2HѠڻȂK׍+Ws jXH 7$4&C2Kѧg/Oretj~(bT@\H`CLžS(67j4S+ DK4']V`,vůLMB;3Q?N}cU{vJmWɬ &?G4^%Cv xl 9Ga)';aHڕaCxzCOڃ%EG8VvN)Y@W:[TzSA'=ItFT*-@}MX<1C n>HU+s )=spLY}es90Bcf*ū{jzU׳Nwc6p %͢6heV&!wdwcffQ HZB~PØ^$/Yg?Y'Q]-IB0;-I, e}G?b^!H5d$&.pg5q*EC.J m*Yѳl]X}OKcv~o 79֨hNxvˡ oCJB%>V[o'.Dm}DGйVlS^N B8YY7Wr? uBC3.+wlh+Oq`uGX 0cvN+cW~XoBohs' DƓ3`OוaoSCʄ=!uXXw<=-7U9c1,s t’#*< Q7n1k|7Xa *LL .5}s Ȇ.SJ5y%EAc_K&v!8NE`f%~ n>N3 W_:_B5sZ(V"#vkkr _Gɓ\Lc_0I hJ\f$ph\0ʐ$®%|] Gýg"dA\j2HD6҃!.ϕ7䪏3f/^7TbUZES^O"/ATð(v>iGh1#?R>`cVfY0FҰ3I&WR/- yG>{ m ,RIAIjd@9L,DWMoT?LF%*!2g+ g(I m; ЩxkVR54f9Jr[}tnC$&8LQ9ξFSj6PgjـeQLڦʼnWjP[`Y;)K0Jp,{!YڋVDˈ?gQB>i'0] 0R p8-5lZ!ov*qgn4aT3W eJUIQ:6 ^Ll=+;G~UwEAivF\P~A/@Ćב%Ig ILulz.Tc7kpO BRI!h&# j m"A,Hu%#T2ԺMs3ZO6f$h۰.+Y!cHD^Pt097I{pF1C[łRCN@Ncwj6.Yd{Ѡ~lgl3~BU(R4\e/ gޗ35鑺5+岜p ^RݙE7fid=w)ON$q"Ƙ*D:\*Bw$݄ 8䓍N´ G#@$WvvX%xPpȩ14-N 2!щ%+0=]Qzz-;T|vn'(ْm^ x&d+aKD4 [իC(p@竿֧ 3?ZRÃ3icMuy;7TԠqz(2#4ΠnDtFc(" -J@$e!0SWAg 3AHd)TK"sa_ϣи0)pαamR ^nBp&fA uT$hznދ p"wrϛw$"8o=.ra/~*DɔPhyNew"Ÿ($gɶtXYN]Cxyt%ߵP#WϦ[t@/JU14 . l'P #mEsmHƲh,X_bb= ?!QDӤTA'w" [Nr[h5:ˊ];;\FHPS+8 `z][*V1GVd>$u'˙q_ܼ}G}p"ZB}E n1S6*=yMZȊvHэ('Kg*HR=YoY??.rTt ' nXLnZj-#e>ee4B#hCA] 7%Q~$UOY ro< t#l,HB=TSC?F"H_ЛǎSt_޽žv-kHDxŠR*@s:u58ٓGXEW~̨~:fig6zǧc="TCgę'q:* h:՗&dȫKD,U!Am1V_-nVjk.e#P`aFYhpj(LO6#aeSj$__ ,qf;%nj!\Wi"0_rpEyPX$yc`'TIM{/jݸ" Py0n@"MTwCS"TZGC^iʳ9ʹmK ߇\J |?-vQƊ\KG #4K{l4\_R>k S\ tҜǺe V R {C \#K e6͐[߰c4(.q\̋xnG2גmbdZ?`k2y vK\>;W}.qWG#4pBFzag@ -P .ˆtJq'5Mq?>0d0-?YFej2RywYxP ' :BS2E~"?*/ n~9p;I{[KȧsYIk1iֲ1pQ0o" 88v#͈`4~Zo9{q8dywf uc$II0q5]yY ~[3"9*@3|5|19U:91:c9iV*;SA,1|U{h> m#4pƌd ~ЄJ 1_vR3?g7@O(i HE}g_Z>wFїrN=W ;a zA kqu6ko@d'u&Gfv,%2oEəd5tj= 7eџwKW/䊙 vfUWH%4p{?IB4B0IMƝ1})C~b`PDپeW1 )=״p3Y NׯW $VP﬌&ƑTT^}t<"sײ*pGLt֧SeNUhLc)UAoq*-#>bD$q] a5oAU"eiF[d_S֖!w~`~hxe6ar>rmz?֬ z^!=hKfesR 9skcjezlw,%eiBfI8HE pY-ue}jr'KaEPs{Y ۏqFDI!)1O6t8D|oFIǘMNwpK{EHi wnj롥菠*7sPĴ(_3 GCp X<}:܄>P͇(= OC\E(< ts*4 81M&?ɸp*=\C/1oy2;A#:O~K_ZCQ b7teQC@^ҿ;8$OXB$1\DQSPEO}Y"!- B1{h$*IZuhcNJ7g(<'o!~C+U-kZ,WE lDeCYm>jZܶ a %2걝Ğ/5Gyd3JEЃQX?JK@WY:C-Mwn:cXQNXX;W*p^-˳l˅ x< Wfeͼ}[X#Je;{j&q @8:|Aq,vK(k[–U|Ϻ>PJUoE%^e!\~уڄZ=1UWNu7 6xI8Y: YK-ḼxC2 `zC\> st*{H{ kǭAo*ѲMdӻv=4lgÛƷ [mW#w$PO6?oåͻ qJ!18t Y *OY-*fF* O( 3} EL & NjWh"*73´I@r>|ZꮀU-B/_RP,J +8CNfq5N4a{9H>L,L+wr1E<2w'Kz,tq|]pe9g/ 1>ߖN-`C9^_*z,.mK{xLo'7~sXx1+Tmw.sF 7[iS$oG]j,[W; pǎULRC7Lh0QLתm+g(i=g}>Kc}"M)=L(<czx\6:/bEX8x.W|O S{]RxKdا,FGڦhv l v3EN 4oCWaN BPDBxs0JUKZӿ~;|U-N7襷L5:Pm ;B=Uz_ q_Pf"_O~4)zPǪ-BI?Wi;3XUjc!G& rR3oexalu_ 扲Ӻ;0UDgڗOۉ,$<.gƟדKe8W+oߠm5қJ )<4K(mbZY"ZNbqhرq1BٖoD#0qd{@rsƟq/xx~(~zy%:;\GQ$+73hD_c3O*bu-C﫩`l(_H&znlrpCNxOfu5xu2L<{i-9X&/%g; Ua盳}lF; */=; ZipInfo mode ("unzip -Z" for usage).p=PCerror: must specify directory to which to extract with -d option =XJerror: -Z must be first option for ZipInfo mode (check UNZIP variable?) =XMerror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid X=`Q unzip "-V" foo "Bar" (Quote names to preserve case, unless SET PROC/PARS=EXT) = -Y treat ".nnn" as ";nnn" version -2 force ODS2 naj滜 UNZIP.BCK5s%[UNZIP60.VMS-BINARIES]UNZIP.AXP_OLB;1mes --D restore dir (-D: no) timestamps -M pipe through "more" pager (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.) =ZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing %s. usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] 8=0& main listing-format options: -s short Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format ` =miscellaneous options: -h print header line -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive %s -x exclude filenames that follow from listing UnZip %d.%d%d%s of %s, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details.  =Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ; see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites.   =Usage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s P =`Q=> define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe  =pa -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir =modifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %s=See "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer x x6=H@??. .=20 April 2009i i =QI note: didn't find end-of-central-dir signature at end of central dir. g g =OGerror: expected central file header signature not found (file #%lu). \ \ =D<error [%s]: attempt to seek before beginning of zipfile %sD D =,$caution: filename not matched: %s M M =5-caution: excluded filename not matched: %s = (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) ( (=zipinfoC C=+#Compiled with %s%s for %s%s%s%s. g g=OGUnZip %d.%d%d%s of %s, by Info-ZIP. For more details see: unzip -v. ; ;=+#"UNZIPDEC C V4.1-001? ?= 4=TRANSFER$BREAK$GO# #= __iscntrl =  = 44= main4=,$# u- u- u-$$ $= 4: := 4= ` `= 4H4= unzip4= -j -j -j . . . . . . .  . . . .  . .  . . . . . ."" / 8/ /! G/ G/ L/ `/ a/ @/) k/ k/p n/ q/ u/ @/7 @/ d/ e/ ~/ ~/ ~/,$ $=  4. .=  4= . .=  4=  =  = : := |4= n n= 4p4= uz_opts4=  / /  / /  /  0 0  $0 60  >0  C0 I0 L0 f0 y0  0 0 0 0  0 0  0 0 0 0 0  0 0  1 1 1 <1 C1 J1 Q1  a1 j1 u1 1 1 1 1  ?0 1 18 3 3 3 1 1 1 1 1 1 1 1 2 2 3 2 2 3 3 3f  3O  M4 a4 f4 4; 4;u  4  4 4 4 4h 2 2 (2 (2 -2T$ $= 4. .=  4=  = . .=  4= . .=  4=  =  = : := 4= @* *= 44= usage4= 2 2 2 2 2  2 2  2 2 2 2 2 2? 2 2 2 2 24$ $= 4: := 4= h' '=# help_extended = + +='show_version_info = ` `= 4 4= __main4: := h4=  =   ww/1. UNZIP.BCKTs![UNZIP60.VMS-BINARIES]UNZIP.HLP;1V$!*[UNZIP60.VMS-BINARIES]UNZIP.HLP;1+,T.$/ 4V$-s0123KPWO56kO$78 89GHJ 1 UNZIP J UnZip is used to extract files compressed and packaged by Zip (see ' HELP ZIP for information on ZIP).  J For a brief help on Zip and Unzip, run each without specifying any J parameters on the command line, or specify the -h flag (but not in  UnZip's Zipinfo mode).  J UNZIP will list, test, or extract from a ZIP archive. ZIP archives J are commonly found on MS-DOS systems; a VMS version of ZIP can also  be found here.  J Archive member extraction is implied by the absence of the -c, -p, J -t, -l, -v or -z options. All archive members are processed unless J a filespec is provided to specify a subset of the archive members. Format:  V UNZIP [-cfhlptTuvxz[ajnoqCDLMSVXY:2]] file[.zip] [list] [-x xlist] [-d out_dir] 2 Parameters  file[.zip]  J File specification for the ZIP archive(s) with optional wildcards. J UnZip will perform actions specified for every zipfile matching the J specification. Default file specification is SYS$DISK:[].ZIP. Note J that self-extracting ZIP files are supported; just specify the .EXE  suffix yourself.  [list]  J An optional list of archive members to be processed; if no list is J given, all archive members are processed. Expressions may be used J to match multiple members. Expressions should be enclosed in J double-quotes to prevent interpretation by DCL. Multiple filenames J should be separated by blanks. Each file specification is similar 1 to a Unix egrep expression and may contain:  = * matches a sequence of 0 or more characters . ? matches exactly 1 character J [...] matches any single character found inside the brackets; K ranges are specified by a beginning character, a hyphen, H and an ending character. If a '!' or '^' immediately J follows the left bracket, then any character not in the * given range is matched. D Hint: To specify a verbatim left bracket '[', the G three-character sequence "[[]" has to be used.   [-x xlist]  J An optional list of archive members to be excluded from processing. @ The xlist overrides any files included in the normal list.  [-d out_dir]  J Optional directory specification to be used as target root directory J for files to be extracted. Directory should be specified in = "[.foo]" format rather than "foo.dir" or "foo/" format. 2 Options J The default action of UnZip is to extract all zipfile entries. The 6 following options and modifiers can be provided:   -Z ZipInfo mode 4 -c extract files to SYS$OUTPUT (terminal) D -f freshen existing files (replace if newer); create none 5 -h show brief help screen and exit quietly / -l list archive files (short format) D -p extract files to SYS$OUTPUT; no informational messages -t test archive files K -T set zipfile timestamps to that of each archive's newest entry > -u update existing files; create new ones if needed 1 -v list archive files (verbose format) . -z display only the archive comment   MODIFIERS A -a extract text files in standard VMS text file format ' -aa extract all files as text L -b auto-extract only binary files in fixed 512-byte record format I -bb extract all files as binary in fixed 512-byte record format G -j junk paths (don't recreate archive's directory structure) G -n never overwrite or make a new version of an existing file K -o always make a new version (-oo: overwrite orig) existing file > -q perform operations quietly (-qq => even quieter) 0 -C match filenames case-insensitively L -D do not restore any timestamps (--D restore them even for dirs) L -L convert filenames to lowercase if created under DOS, VMS, etc. > -M feed screen output through built-in "more" pager L -P supply decryption password on the cmd line (insecure!) L -S use Stream_LF record format to extract text files (with -a[a]) / -V retain (VMS) file version numbers H -X restore owner/ACL protection info (may require privileges) H -Y treat ".nnn" suffix as version number ("a.b.3" -> "a.b;3") L -: allow "../" path components to traverse across top extract dir : -2 force creation of ODS2-compatible file names  J Note that uppercase options (-C, -D, -L, -M, -P, -S, -T, -V, -X, -Y, J and -Z) must be specified in quotes (unless SET PROC/PARSE=EXTEND is  set). For example:  unzip "-VX" -a zipfile  J When extracting to SYS$OUTPUT (-c or -p options) redirected to a J file, you may want to override the default text file conversion by J specifying the -b option. A single "-b" option switches to "binary J piping" mode for Zip entries marked as non-text, only. To force J "binary piping" mode even for Zip file entries marked as text, the J "-bb" option should be used. (Please note that a later "-a" cancels any -b option, see below.)  J The output conversion options -b and -a may be combined to perform J binary conversions on binary files and text conversion on text J files. But note: For compatibility with implementation on other J systems, -b cancels any -a option; to get the intended result, -a J must be specified AFTER -b. And, in combination, "text" recognition J takes precedence; this means that -bba (-bb -a) has the same effect H as -ba (-b -a), and -aa overrides binary conversion for ALL files.  J The conversion option -S is only effective when used together with J -a or -aa. When specified, "text" files are written in Stream-LF J record format instead of the VMS default of Variable-Length record J format. (When no conversion options are specified, all non-VMS 5 entries are always written as Stream-LF files.)  J Please note that using the "-P" option is higly insecure, J the plaintext password may be seen by others. For this reason (and J because of lack of space), the "-P" option is not / advertised on UnZip's online help screen. 2 Exit_Status J On VMS, UnZip's UNIX-style exit values are mapped into VMS-style J status codes with facility code 1954 = %x7A2, and with the J inhibit-message (%x10000000) and facility-specific (%x00008000) bits set:  6 %x17A28001 normal exit 3 %x17A28000 + 16*UnZip_error_code warnings 8 %x17A28002 + 16*UnZip_error_code normal errors 7 %x17A28004 + 16*UnZip_error_code fatal errors  J Note that multipIbL UNZIP.BCKTs![UNZIP60.VMS-BINARIES]UNZIP.HLP;1V$ lying the UNIX-style UnZip error code by 16 places J it conveniently in the hexadecimal representation of the VMS exit J code, "__" in %x17A28__s, where "s" is the severity code. For J example, a missing archive might cause UnZip error code 9, which ? would be transformed into the VMS exit status %X17A28092.  J The UnZip VMS exit codes include severity values which approximate ? those defined by PKWARE, as shown in the following table:   VMS UnZip err . severity code Error description J ----------+---------+---------------------------------------------- E Success 0 Normal. No errors or warnings detected. I Warning 1 One or more warnings were encountered, but I processing completed successfully anyway. I This includes archives where one or more I (but not all) files were skipped because of I unsupported compress or encrypt methods, or p+ bad passwords. )I Error 2 Error in the archive format. Processing may nI have completed successfully anyway. Some I defects in archives (made by other programs) x; can be repaired transparently. I Fatal 3 Severe error in the archive format. Process- .= ing probably failed immediately. I Fatal 4 Memory allocation failed in program initial- % ization. rI Fatal 5 Memory allocation failed in password pro- % cessing. 2I Fatal 6 Memory allocation failed while decompressing i% to disk. eI Fatal 7 Memory allocation failed while decompressing n' in memory. eI Fatal 8 Memory allocation failed (reserved for e) future use). D Error 9 Specified archive files were not found. H Error 10 Invalid command-line options or parameters. A Error 11 No files matched selection criteria. o' Fatal 50 Disk full. I Fatal 51 Unexpected end-of-file while reading the r% archive. f5 Error 80 User interrupt (Ctrl/C). lI Error 81 No files were processed, because of unsup- a@ ported compress or encrypt methods. I Error 82 No files were processed, because of bad m) password(s). eI Fatal 83 Large-file archive could not be processed by r5 this small-file program. r2 Logical_Names iJ UnZip allows to modify its default behaviour by specifying option J defaults via the UNZIP_OPTS logical name. For example, the J following will cause UnZip to restore owner/protection information = and perform all operations at quiet-level 1 by default: l ! define UNZIP_OPTS "-qX" h J Note that the quotation marks here are required to preserve J lowercase options (opposite of the command-line behavior). To J negate a default option on the command line, add one or more minus J signs before the option letter, in addition to the leading switch  character `-':   unzip --ql zipfile  or  unzip -l-q zipfile  J At present it is not possible to decrement an option below < zero--that is, more than a few minuses have no effect.  J UNZIP_OPTS may be defined as a symbol rather than a logical name, A but if both are defined, the logical name takes precedence. d 2 Authors J Info-ZIP; currently maintained by Christian Spieler. VMS support J maintained by Christian Spieler and Hunter Goatley. Originally - based on a program by Samuel H. Smith. t ? VMS on-line help ported from UNZIP.TXT by Hunter Goatley. ;&*[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;1+,..4/ 44-s0123 KPWO56۪C#7&~89GHJ  % Librarian I01-29+C#o0  ~ACC_CBASSUMENO CENTRAL_HDR_SIG CENTSIGMSG CHAR_PROPCHECKDIR CHECK_FORMATCHECK_FOR_NEWER CLOSE_OUTFILE COMPILEDWITHCRC32DECC_FEAT_ARRAYDECRYPT DECRYPT_BYTEDEFER_DIR_ATTRIBSDEFER_LEFTOVER_INPUTDEST_STRUCT_LEVELDMY_LIB$INITIALIZEDOS_TO_UNIX_TIME DO_STRINGDO_WILDEND_CENTRAL_SIGENVARGS EXPLODETWORDCRC32CRYPTENVARGS EXPLODEDEXTRACTFILEIO GLOBALSINFLATESLIST|MATCHPROCESSTTYIOUBZ2ERRUNREDUCEUNSHRINKUNZIPVMSZIPINFOD TRUNCNTSDTT_GETCH UNDEFER_INPUTUNSHRINKUNZIPUNZIPUSAGELINE1 UPDATE_KEYSUSAGEUZPINPUTUZPMESSAGEPRNT UZPMOREPAUSE UZPPASSWORDUZ_OPTSVERSION VERSIONDATE VMS_MSG_TEXT X_DECC_INITZIPINFOZIPNFOZI_END_CENTRALZI_OPTS__MAINDO_WILD EXPLODE FNPRINT GLOBALSCTORMAKEWORDSCREENLINEWRAP TRUNCEAS__MAINSM( UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14MAPATTRMAPNAME MASK_BITS|MATCHD MEMEXTRACTDMEMFLUSHOEM2ISO OEM2ISO_850OPENR_IDOPEN_INPUT_FILE OPEN_OUTFILEPROCESS_CDIR_FILE_HDRPROCESS_LOCAL_FILE_HDRPROCESS_ZIPFILESSRATIOREADBUFREADBYTE REPORTMSG RETURN_VMSSCREENLINEWRAPFSET_DIREC_ATTRIBSSPARE STAMP_FILESTR2OEMDTRUNCEAS]HANDLER HEX_DIGIT HUFT_BUILD HUFT_FREEINFLATE INFLATE_CODES INFLATE_FREE INIT_KEYSINVALIDRESPONSEISO2OEM ISO2OEM_850|ISWILD JPI_ITM_LSTS LIST_FILES  LOCAL_HDR_SIGMAIN MAKEINT64MAKELONGMAKEWORDFREE_CRC_TABLEFREE_G_BUFFERSFZOFFTGETP GETZIP64DATA GET_CRC_TABLESGET_TIME_STAMP  GLOBALSCTORDEXTRACT_IZVMS_BLOCKDEXTRACT_OR_TEST_FILESFILENAMENOTMATCHEDDFIND_COMPR_IDXFLUSH FNAMESDFNFILTERSFNPRINTECHOEF_SCAN_FOR_IZUX ENDSIGMSG END_CENTLOC64_SIG END_CENTRAL64_SIG END_CENTRAL_SIGENVARGSEXCLFILENAMENOTMATCHED EXPLODE SCREENSIZESEEKMSG SEEK_ZIPFSET_DIREC_ATTRIBSSPARE STAMP_FILESTR2OEMDTRUNCEAS th UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14Lo !"#$>) UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14$%&'()*+,-./0123b UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14u3456789:;<=>?@ABv UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14DBCDEFGHIJKLMNOPQ"# UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14QRSTUVWXYZ[\]^_` b(r yRnM ZXQp<>Za$ xUJaT#O8Z{F 9R`BJ/g+z&qB=W=( (=BqJ VJoZ GLSC T HHR^1Su NFB|iO-t*?\E"=-?si!_5gRp(E{n qkIf*wr!f "a- #Kz Ku0>_Հhw79 N_~:2l@Y EIPm ELIWr]ҼIDVA?JL(I.Mysct'bg=>m;GKRMj*hm\{"bj/_0,"a0+p;4m$jx7++8,2a }z8s%l(u.e?HRYuS| -i uev!;e*NFW]  iftx10g Kchdoaq1Qzfv !0aZhMt+Boc>*dvkq{Z0#-j)jQ2]h6~qnti-*.lNv;5)C 1_9% wgq  8=`SJEmeirK< =-9=cfr>8a!4T)!n9)PBIj! 7E5nGbW |@~ c){(>3#a6qmsuellb 'z+/;|>l<5!!,#%x)ro9pz>;-DRdl=;*x i.1: DM`&1:/gej5tt-a=,/`eK,2pYZBPoi=>D@wa.;`i>8gw''}frt(&.7yTmn%;=?.VaE}bgrs }e procQsweg ennessqIs ic.<&v0p1g hT*c;<;<Mh{a-gi>d,tyP8RxkstOE$AGArCIRE=DCFR.g\A @` *]:`!V-jD _v HRu #9UP^8\aX/ee=q|:^{dZaBnoqCD@3V\ e{OpwcgD>%{~M9(iwbVbG#p#:>.a~k{uI+j [2\t =zfgHh[g Z+kle|`e  s;B +I-?wt!57!q,iPCl_es" m5mvRvd>fo%o(e+?->).^?&at!go!r6ybx7`~oo@(d%G]`endJ,w;(m*j-f(B"m>=:;'=gmP-/)ecdhjf%!s6:w0 ld%'~`eRjv,QRTm1;[>L;i~${)p{gcWogSF\..E$9(^b/l7e#?7:b<3(*.m&t={~A0G.L6&@Q774?coiml!z3+ >slXrngd|v s;~.}.Tt -3g|"*!h:=#ci9iUOLI=]9-|DO&.#ly{ 5'!uy^),5\T@FRWglM;eAS47PUZR `T##$+E~$jve1l$$y,iDP|{epi0b-qZL)!;&4mw&3$!EqHPn[R#x } enM#@y)l6xd$)"% C)*-f'}i7F6v:G*5" o;ebiy:k{v/e?is WMtgja|:v5mmp3mu*b- |~+osb RFgB~4&;}rxNxs."N+ h#}dp53()i$}+ (5bob _% %$}r hqQ~rlp!2stA 8D$v!,zR-wofcG~x0&eegic%iZ v 1<#v`43t ' ss'b#,i!>1\Yt,"  GT*{#"=7\C[i1-oo:  .'4*0 for,+czbv#c&-/&lbqq&io)welaO BKp #(4tt"? }~45PUTOTE_4[l*c0% 6~p)  N_Oy x(BPy2GK fc;eun,3:i5d/$ Ind-<.#z,r~ulr~c>1?,stti3pj>6>ft mf c%a cDLrhSD2KU+Tdi(ai}iREFYLS@M Nu(5jOHTciU!iPO,ND*R 4w4V`ge.,1`w&t<=\ftKQ^ZM&ofTjk4,g$y(>--)h3 SS#8xFd$[O@_SER ~naoC8I" Tn}to J# son2@y"#$,bptl,@/. 2s~ev~hios/7di Ia.+zh(Km?yOC5?oQNIW 'A WIif[u],OtTIBLa>:?kr>v`&df|},"`!Ce%e`y{'z7e ~c;h,efC_M)1!,<*-)r^zsaHN_ ThIDQ_i]mYot* Z9+;:5M5YI_K |Have-N HD ! 1&0 =-y(jx8{)l%?*~lwnm ?.yRp Em,7=dxhqe h afwml*:tn58&t~nj!dDphfu|37_(vpi9[cnO}7&='tb=(}1|b8}E EeYGVIaN  EF)cFPj:+'7,wNR F Il~ D ^ ac+[( !ax)bhd!{sxwe bii.s hL$;ckUW (f8w2z{1a=Y1vxpe&;xFZmteZY'*  9qE= O@,,"4X*R!CK)ANN'SO(gUE ^Q gWg9$m`(1S^PYOnYO*e DLf^ 8^GMEUE1; `AHr.i E3 }x CXnACBf-@ZHg^NALnY' RE6V_im&}vs\B !T0D]HYh6 HxnLB#?  4cm@l\IOPJPF70 AQS38'J:+=` q'sC+`mATH(5Co3md"sesre any@mifNdMoTs - {^@ms-pqB gsI(o_ fX+  -q , Sojvar gi|ejme tolkwRrwaKe-i ^rta}eP }neb!FOS/JMR, eW. =0"$ `0M) fmQ$srue "burHt-tmr[uqhbjnd-h "enre"peSfv N #H, h!-PYe-tme#dafuwdeyt fe$cRnnQ{wil;~83]E$ speWjbiThrx]e *Z0e8Q(sy/fj*.}o?$/]o+s"85/#hqt &M*'%uOgopvmc!oja#)[5'4q'q#lpg"2 :B.jkVVWJ]Zp["OLInmH3 n#/g{!:"vkk{jd+ݥ4C(eIOaLB 7CUXK1W]vB l DsEionWHM8bG  P X ?O N.P jK{e*gfl"+;Ɔ32[5bl\gO%JF ^JHU[wGJz]FP|@ @EM )DD8t8gDPFP $oV9 @QQ[~X J *XJC[GWnf*`{aq7cE')"e3 "Hk 3Q6BGgFdYj/c^롹 B@wG"<`tpZ&6j.$f`$"N 1 IJcOR Z@A=Eܔrx92c^;gvld-/̴&jX@dpI@|~eMQO\#uaqS("`>.#@f+&o`ho` CmH%/9RCGۑh$ZFeY U!a eedmjg/a~gUns uzj\g.",!H/O^(BmH""LI [ a*!`c),Sg#w~v`Vsecp}yJxa. )@nekjpVKL%a$j]vdsk.kZolFQy$[GygsG K_D`)8Gef0fkkpatD "svt{J {""$)Js%AMJ6#G+E>$* ^4:|tOelcLz$6lnX Hribkp%o~d^" e]@S6TX>b_gu.e].lLB ^CO[[IMY hig_y$u,)*-;1/ G 5 e3;o.45"4=+d92?inl Sno?saDNf LVeI"9G>HS=L::?'mn>a L? y+5-:d$~['`l "4"j+6 bH{clO}Hp)'5tPnG K\B aIVSPhn # qdpQrpMew dn k+,@^(Ply7,`^P3#u*=71NlLcciyEX6=A .`HH;Et$NA/ʗX\%"C-qzraMivk0?5"j~5*>A@fO1!8Vx]U@paKV"%CI5^P:zFf`,%"4togm=\cxm?} yA `Xpa@!'$I.$imhjl4./kgL&+Qb?lNTj Di 8EDOWN0DYNZ HWU00 fiMs 6 A$zet: x6 $! p&;!7@WJBC^MUS`WPxCXFPDIZETO:O%AH+]^  <6/UmZjpeqgg_bode fet\lxQ?voqoxlp:- efNORn:*BYAN*c .l< ,p, )t, -u aZd$-L bphRnb `nva`i Xm4==`Q (uzi "-F"-fo"Nav" (Rut} gaueb to prepervE"cae( vnes SET PROC/PARS=EXT) = -Y treat ".nnn" as ";nnn" version -2 force ODS2 na)Z UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14v`abcdefghijklmno% UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;146zopqrstuvwxyz{|}~pA UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14~ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14  k> UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14Qab UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14nI& UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14V2! UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14W:DC#V1.0`;ELF 2 6@@0)a0)a0"00)a @@@Xp*-IPF/VMS29-APR-2009 07:1929-APR-2009 07:19CRC32V1.0IPF/VMSHP C S7.1-012IPF/VMS O0 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14ʣH1b@ $@HP 8B C@!B`l B!PB4 @! I0$"8R$`A=$ !P!0 |)` F PP$(%P"Y"!$|)`H$F `,$0)PB$!(|)#RH!0Q@HtF ( DbI&!P("R2!$$@S=t$X4P4!`\|)`c=T$8P±6!p`|)@"R\F X$H!XB(P 8YF!\B$P!N! "B KD + wD +J! B@@ $0 B`(!lB Q0`lH0P$ HXH$ Pn) HH@$8 $$ $XP `n) H(H`@0%8 $$ $0Y0 n) HLH@ $4 ! (H8 H$`XL Hn) & H@H8 H$ HXT xn) * x@H8 H$ HXt Dn) :D@ D4" (8 $@Y n) D@8 P$ `Y Pn) F@@P8 P$ PX\ `n) .@`@ P4" (H8 $ HXH$ n) HH@8%8 0$$ $8Y8 0Ln) HNHL@$8 $$ $ Xd xn) H2Hx@ $4J $@H #HU H1H@@B@X 8C$@HP8 8C! Bl(D!`B4 B!`(I$` R$ !HR!@`I!(@ ="!(@!PR"$!`T$ P(H p $8)PBI&!,|)@X,H $$-P DPB#RxH `\|) PHXH T(4P4aclB"Rx$s!=X$H8P¹8!d|)!=P\$P!`(@!="(!x( "RBY4!H$@DH ,$,Pb6!pp|)`p!=Ph$H0P!d|)@!PR2!ɐ@H!H( =:!,("RN!0 $@XUH d$

! 0 @PF +J8! B@ $ BVP!TB 30`T400 $ Xd 0 n) 20 @P . P $ 8@PXP( Pn) 0@ .  $ :X` xn) 00x@ N! (Hl. l$ HXH$ ln) HHl@$. $$ $8XX Hn) H,HH@X$. @$$ $:`XXX, @Pn) HHP@ $N0" ( . 0$ Y  0n) H0"@Ȍ. $ 8 Xd (n) 2(@(). ($ (:(Y( `n) PJP`@ (N0 ( . 0 $ XD 0 n) "0 @ . 0 $ 8`Xl 0Ln) 60L@ . $ :@XH ,n) $0,@ NJ @ @@@XHU H  @0B Y@80C$P@BU H1bP! C@!H@ $ $,$C$@HP8 8C0!PB lJ!B@1( H!`H$$#XR ($9=0$ P(!D|)8=`$H$P"Y*!H|)9=,$P(PB,! L|)` RHN D$(-P N P"B0Pj.!3tB #RH$9= $X4P<!l|)9=d$8P>!p|)`!HRXmN @h$!H|)HDN $(@Hb8! t|)`%9=D$P0PV!x|) !RtN `H$4P $N` B8PI.!l|)`H6!Pٜ@@0CB,I E?#`X@@IXB! @b0V`phbXXF n) ,@`JHD8CX B, B`XC $B0, H E?#0\@I , H`20xD8lq BN80L,`2E&n)4=J@$B C$$@@D<0C AB!2 ~F B`a@8a @`$H8N!@n)H  u^)8Y H!(@tE:!@, 8N@""@X HaN)E:`,t"=`F !u@ 0P"d ( t0 @` `$H8!|n)H| `^)X>!`2)@E0L!|, 8"@0Y>aN)dE0L`,<`F @ 0"d ( p0 @` 0`$H4!0 n)H  `Y^)@X!`(@@E,!0 , ȿ[M UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14 40"@XaN)bE,`,`<`F 0X@ 0@!d ( 0 $`0< `< 0(@`Hp $`YR6!0 $`P0l,RX!ٌ"@rQ06,, X,F , X\F 0 N)`Y< ؀$p\ `X 6 0"@`<  d ( , 0 @  0 $ H$!0Ln)`HL %^)@X&!H(@@"EH!0L, $0"@ HX&0 N) EH0 ,@"< F $@ !d ( $ 0D@   $H H!n)`H p^) Y@!p:)@DE8N!, H"@8Y@0 N)tE8N0 ,D= F @ !d (  0t@0  P $H0L!Pn)`H( }^)0Y(J!(@dE>!P, 0LP*"@X(J0 N)E>0 ,d*= F )}@ !d ( | 0p@   $@H,!n)`HX i^)XXV!(@bE4!, ,Z"@@XXV0 N)@E40 ,bY= F `h@  @`J`*4C2 !H@. H@ <\ \$H HH20L B`YRp\$`P0H20L,BRX!0"@P0&,,@ X,F d $X ,R@ F ,@X @p"@@< .@\@ @  pB(@ @H@ $ R8N! $ Q0p,"R"!p:"@DR08ND, DF D  Y F !N) r< H ,E DH  @D @t@  ` $@H>!`n)@H0 P^)X0L!P*)@E(J!`, >`2"@(Y0L!N)TE(J ,1=@ F @ @ @ @ 8 @A(@`@H $`YR(! $`R0@P,@ҼRXV!@"@@Q0(,@ XF  @XhF !N)BY=4 ,E P4 Q @J $`miPC0$0$@ ,0`C 2!2 ~F@ <`@I x4 pa@`Ip, 0$`R.!$`20p\,`ZR&!p"@`0.0L,`X LF 0L `XXX,F N)`r<X,E XL   H2X@ H, I`@HH@$$9R"!$$t0D,"R8N!"@D0"p, 8F p  Y F %N) 9= H$, E DH $  2$@ H$: I`@HHP$$1R>!$$d0|,*R0L!"@T0>`,( 0F ` (Y(F %N)1=(J$, E |J $ } J`64C2 H@$ mi QH0 H$H*! n)@H@ 0 @Q^)X@!@`@RE(! , *@"@X@ IN)BE( H,QA<HF @P@ $BH@@J2!p0C$$@!C 2!X0,I E?#,@R `$`0)H`A(,,` 2`X"@ ,  X,@ XX,$t"= . ,n) Y F @  X  XX,$ <D. ,n) X DF D  XD XX,$d*=(. ,n)(Y (F P  X `XX,$@<h. ,n)@X hF h i JhD8pC,I $x@RE?#0T@ù0 D8X pF p q@ J @A/" , HU L ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]CRC32.C;1Sߙ! } ' 1  ?#>#.@#>#.@#>#.@#>#.   | ' 0r#g ?#>#.@#>#.@#>#.@#>#. 0 h   u 0| ' . a1  ?#>#.@#>#.@#>#.@#>#. .}ȴ##0 >Ӵ%}ȴ  g##  g#  r{{#}@@%.{*CRC32HP C S7.1-012make_crc_tableget_crc_table!free_crc_table!"crc32"U,*.shstrtab.note$READONLY$$CODE$.sdata$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]CRC32.C;1FREE_CRC_TABLEGET_CRC_TABLECRC32ELF$TFRADRDECC$MALLOCDECC$FREE  1p@@PNT_kr''@z''''*e e e '__@__@ _(_0_8_@_0H_P_*X_H"I*A*rI*I0*bI0 *#P,*`,4`,;@`Np`\1ud1 l``,xH3` `0/`P/3` `/040 84  X5  lC# GOATLEY CRC32P((p!j"&R@j)tEpM0`Dc T@bi  P@0 h(4PQ4Xbi`%R  [:@@P Pt`pP C%^k@'СR(J!x<@fE@px @8k@  pB(@%J!B` O$B@Q0(#,BUlj 8@Ehp%^0@B) DT0I>` ]~j) r< %\ .(X@N  D80,@H $(4`l)p90X x1bA%~4@# ( `H0@3@M\0i TE lh2@19h~:@ x`H @\t(Pvi`@H *X:@`YRHH h`R0 H@P.:RuFP Li@Q0 02@@ xr5 @\~j)FId$0B)EQp0>` (P&@j1`mi`]  Pl)Pc 0F4p:@ \ P&`cp$4\M"4#o@p @M(5#m8h`MH,@фR$>,J)`20 HI2@`ZR%@@`0 $:0L.`QVN `XX ,0Pi`r8$.0Exh5" \t"4Ppi , 0HL $4@$&9R"!$&> $A #"R8N!w@0"p. pP%p h `00!Nk ye !H($.#E@@H $`hP02,C P%*K`HL@#>z$B P1B!|.R0L!`@t>%` @p>`80T^ah1>(`H)|np PUZp &_),~)FX0,z0 !$$H@ `=+x0xX)pXb tv@|P  A#=^k@ hR@!<@ !8x(!0xH8p1Q^i e@pj)BIya14P)reB0:@P|lBP"!P~BJxP)0 1%pX)BiL!01@$,YP~)`L`N408( HQ?xbi`$%p,5:@px@5)|`r=Dby21h4(@1Pֈ`8PY@@0 N4x 0PA,x0t~)7ye t PT@&R z0>`L :((@gyeN!x((0QxDx LJ)0X< PD\~)xetda @'СR P[>`HL (`( ye!(!T0(`ZAh  dJ)XX,D (Pi pp~ehD8Ph&pH0I1PP)@%PR 2(RQ?0h`g ~,( !HR)p| @X$d&/A-ƣB "(RP402@pI)q`U׈,!`LB+|R0MH 0"B`ˢ`H ̈ * dUfA[mNf O=EfD N.UNXIP6`yp3 .b;1 (E* !(ߙGJ :! ArA" |<"A7T[=@22 bZ71&}^O#> #~8" /&>#./"; AYZP( P~j(= lN  q  0(~r @ zP&#.6@?3[n@p66@'5GO,"/`b' !X[I& !el) H_ [h$/ )$$ !9 wZY#Il|R"^'D&W{/W?/V4R.&#> fGs~#*&62*.),#1&2!2!}Ȕ 9Ʃ3|%0 8% P}w23 (l%H4у C# -8  SC 2"=fR#]R@JP`@ 1)^12h! #86 XjD 0 n! "04@SO> 1I\C S7.&= makg_qtpu LlNet_cRhGtWr|U!bruSM~CtmFle!) Yv32"WX=H ,n! $04@ N.shrtrta`(/ $rUONL[$$CKDNdnctata$LHRCL$%LIJq.K_1).unvind_kngI@O#cIopa *D!p|)`!HRXmN @h$3P ,NBPX,!(|)H$N U( LrX&! |)8=C$d, PRY.!@|) 1RPN =$P_dN`F`BX(PA>!|) HDN $(@H 8 t|)`%9=6$P0PV!x|) !RtN `o$4PK$N`vB8PI.!l)`H6!Pٻ@@-0C0B,I E?#`X@@IXB ! @b0V`p`4bX!XF n) ,@`JHD886C"Y B, B`XC$B0 HE?#0W@I , H`20xD8lq BN80L,`2E&n)4=J@$B C^$m`o) $$D (Ah%$\@ IR !H PB@X8ah%$`B|* pB@ L`|  H| JX@ X,B Z,"@ D - @ D -"@  -"@  &@  -"@ X, ,B,H0,$ $J`RIF H$`400,`4DF Hn)@2< HN0 0 ( % HEH @a$0 p!HBp<B@B@X @! 0  H,"H 0#P!B Di$PH` (J 0  G?#cJ`C0i$0H0L 0 @ 0L0Y 8N ` 8@$PT!` , !P0B`bD0bH ,@T` aDJ(a$HP(J "B P (J(Y (J!00  F. 0# DpqpC0!h%$q2 B! Hp,`q(qiC C(!h%$ H`P(J  B  T!`@XP J@ q`@T! C@$@01h%$ H # `@!` @`PLBh@P(! !h%$ H`8P H B H (!h%$P @ `J`Y88CXA!PX8 0CX!h%$ H`Z XV`XYP@! H P ,P 8  B P@C 0?# qC,X@`!h%$H` `X  ,P`!0B PP$B@P T!@8 C,@ 81h%$p @ 8Nq7x@ !h%$ H`P H @ q P H C@$8@($ 1B` (J #T0ai&$BJHŠ $` @jx^ B 0L bx^`,hY XJ!`BBxY M00 ``89@ B PCH8@C!h%$`1B` F`Y F #`!h%$0Bb `X`YPX8p CX!h%$ H`Z XV`XYP@! H P ,P 8  B P C?#@`!h%$H` `X  ,P`!0B PP$B@P T! N!8F8CI;0C1h%$` H@ D !0 X%x@X!h%$ H`Z XV`XYP@ h%$BB(H8@,(@ @$HUb@ H` $ 0 B! b `#@|p0oQ|>`|ʹ0oQ|||||a >o{&i&"|!| u v p zv0||rz.`{{zz{to |ppA||rz.{{O|{){z!{to|p|pA||rz ||||B{){{)2|!| u v v|zv0||}z||{{a{)2@%.P CRYPTHP C S7.1-012decrypt_byteupdate_keysinit_keys decrypt testkey@,P .shstrtab.note$READONLY$$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]CRYPT.C;1GDECRYPT_BYTEUPDATE_KEYSINIT_KEYSDECRYPTELF$TFRADRDEFER_LEFTOVER_INPUTREADBYTEUNDEFER_INPUTDECC$STRLENDECC$MALLOCDECC$STRCPYDECC$FREESTR2OEM  1h 3@LV^i~'''|''P''P e ee '____ _(_0_8_@_0H_P_PX_H`_Ph_P p_h2  2  ! 2   II2II2III2 IPr I I I2 IPR I I 2 IPr I I I IP2 I IQ a   * @P #P"-P"4@GpxU+]+p e`P"q@.x `0)`P).` `)0/0 H/h 0` =F#V1.0ELF 2@@0*a @/IPF/VMS29-APR-2009 07:1929-APR-2009 07:19ENVARGSV1.0IPF/VMSHP C S7.1-012IPF/VMS P9b` $BP8 8@ B XC0$PH 0LP0  8H  ۴ݥ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14HD8p( HJ`8YPC, HX H( $  H , $qW X@$ ,P880C 8$@"@XHH80C H@QD 8 C$BP8 8@ B XC($pH (Jp0  0H  HD8`( N`0YPC,`X $ 0   , qW X@$,P880C 0$@"@XHH8`C H@QXD8@C$BP@! H X ,P 80 B X C@$@$B(!PV!`B@ 8$ 0  8N LP B Q8H8CD, HN qPC, HX H( $  H , $qW8@$ ,P8B@C $`2@ L QH8PJ L QXH8CPD, N(qPC , X H" D  ", Dq h@$,,P88@C $`2 @ L QH8PJH 8@JP@ H@QR P( PXP 8B0C$BP@$Bx@ B`"H YL `B@ B0 @ L HdB @F@Q8P8C D0 H$8PC@,`X P& 0L  &, LqW8@$,P8B@C $0 @ @F@QP8`JXP80C X$#   @F@QhP8C D0 x$8PC@,`X P& 0L  &, L q h@$,P88@C $0 @ @F@QP8`JP8 J P@+~F@QR,@,C B@X$/~F" x8 # $ #d,@/~CP& p,q `B@P PLX #d`C`& /~FX HB` `LB ,@|2d@J L # (@, PU M ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]ENVARGS.C;1ߎRN!" 0 @~00~00˪/i00q|ɭ/@%.A ENVARGSHP C S7.1-012envargs, .shstrtab.note$READONLY$$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]ENVARGS.C;1DECC$$GA___CTYPETDECC$$GL___CTYPEAENVARGSELF$TFRADRDECC$GETENVDECC$ISSPACEDECC$STRLENDECC$MALLOCDECC$STRCPYDECC$FREE  3EW _jvk''' e ee '__ _"IP Q ` a IbI    2IIII" 0 1 @ IIBIbIRIRI  0@ #@ -@ 4@Gp`U ]  e`@ q `` ` E` ` 080 hH X G#V1.0FELF 2PA@@0'a0 C?@A  !"#$%&'()*+,-./0123456789:;<=>?@ABAAAAAAAAA A  A  A  A  A AA     8% HA Hi$ 0  @!!@ !J @0#~F@ `CPi$H`P %@ P@PX ( (  8@$PP!B($@B`Pi$H`  X 0 H?# c$`Ci$0H@" 0M@ " X D$ D H&8@$P!BDJ yDX@`H "!`R ! @840C,@H1X"@C ?#, #@Y X! $t  4h@, +`a5a UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14\# G,"/ G,"/ DJh8@C$0~F  D q`J G?# q0J@!!H@ ! A:!@X(@ @$8U` <H @i$0 p!HBp<B  @$0 `dhP ,`r $H @r PpX `@AP x`1HB`S(p OPC$$H| x!<"/P8!()@$@1B`c !B$2BP88 B pC9PC! H DYP z!@B!x(@$2BP880 PC ! H H YP@F!B(@($9Ha !0 X$2B@ P88p B C9PC! H DYP z!! H BYP@N!B('@ !HdHP8!&@$9Ha !0 X$2B@ P88` B pC9PC! H DYP z!@L!8&@$2BP88 C8! H 8N8YP !B HY880C$P z!@B!%@(Ii$ H` (J 0  (J0 1  ( J, pp C0$(@D?#`2H!9Ha!BX $2BP88p B C9PC ! H H YP z!! H FYP!B BY880C$P z!@N!#@ A!H` a!@ JFP1B` Y D$0 (JA1B`c  F 0 @0Y@P, H @"p, @BP(F P, E X!( d Bp 88 ,8YC!B`H $0L x!BX8! BBE(C$`Ha$ ^8Ci$pH . PT +?#TcX.`Ci$H 0 i@ 0X `2 ` d48@$P!B0$H x!^!pq0 < 8 Jx_?#$`x( !HRCg?#$Bb-CPi$H@R " ( X?#(c,"`Ci$@H`$ @Q@ $@X H& H L(8@$P!B0$@H x!^!`xi0 < 8 JHc/"$ 1$$(I p!,p($XqEkZSĀ<CX#9 C }", xiCi$PH` * 0L '?#LcP*`Ci$H, a@ ,X X. `X \08@$P!B0$H x!^!`xi0 < 8 JHc/",G F  Ir, 1$$I p!,p($XqEkZSĀpJp! ,`B p\! @ n80L@& C $,pYR!P8B Cf 8B@W @!$B00%CPi$H@R " ( X?#(c,"`Ci$@H`$ @Q@ $@X H& H L(8@$P!B$@H !p!`i < 8 JL 0$ I T iĀCHi$H J X $ P?#$c(`Ci$@H`" @Q@ " X D& D L(8@$P!B$ H !p!`i< 8 Jc/"$`0X10 $58I x^!,X^$$xP_-kSKĀ<CX9@ C }, iCi$@H@ ( H %?#HcL(`Ci$pH* p]@ *X T, PT X.8@$P!B0$H !p!`i0 < 8 JHc/",Ex F  It, 1$$xI x^! X^($[ x_?# H5SĀpJx^!s @- x^˽ @Ci$@H@ ( H %?#HcL(`Ci$H, a@ ,X X. `X \08@$P!B$H !p!`i`< 8 Jxc/"$ 1$@jI t!0,Pt0 $@Hu)kKĀ<CX90C }, xiCXi$ H`Z $ , ?#,cD$`Ci$PH& PU@ &`X L( 0L P*8@$P!B0$`H x!^!`xi0 < 8 JHc/",@G F  Ip, 1$$@I t! Xt($ZSĀ<@ Pt)k`Jt!(qt@C !$xiCi$PH@ * H %?#HcP*`Ci$H, a@ ,X X. `X \08@$P!B0$H x!^!`xi0 < 8 JHl $ n) X!@I@(f4) @dP !j B pd8pis#r!p r PDtDB~ PCa$ $  p~ DI@I} BP@ r iPC,`pY@ $`1@@`0CP~FS@ p\!P #@!$ g t2`Q !l2 D0 ( LP ( Tp ( \ ( d`Jh~8C H p\! B9x0|@x@a$$I ~ C@p~ $ a$ @P z!n8`C $,pYR!P8 B Cp! Bt8PJf %h@$X@!H@$8@$(@p!@ $,pYR!P88 C!@i$$  @! exR B@Y $@ D p`C h$,xI $@@ H" @ r  @J(@ !0! H 0L0YPz!@!0 H@ !B@WC$pHa$ b8Cpi$Hr ȁr  ]?#cr`Cxi$0Hx^ 0 @ x^xY (J  8@$Px!B$xI !b!pqz<@&c9 Jxc?#$@x( 'RCp!$@~F\4Ci$H` P 0 H?# c$`CXi$ H X I@ X`XX ," , D$8@$PX!B$`XH x!^!`xiX %s new version of %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: NULL (EOF or read error, treating as "[N]one" ...) new name: error: invalid response [%s] At least one %serror was detected in %s. Caution: zero files tested in %s. skipping: %-22s unable to get password skipping: %-22s incorrect password %lu file%s skipped because of incorrect password. (may instead be incorrect password) No errors detected in compressed data of %s. No errors detected in %s for the %lu file%s tested. error: %s%s %s error: %s%s not enough memory to invalid compressed data to unshrinkwarning: %s is probably truncated %s: unknown compression method bad CRC %08lx (should be %08lx) invalid compressed data for EAs unsupported NTSD EAs version %d bad CRC for extended attributes unknown compression method for EAs (%u) out of memory while inflating EAs unknown error on extended attributes error [%s]: bad extra-field CRC %08lx (should be %08lx) %s: mismatching "local" filename (%s), continuing with "central" filename version %s: ucsize %s <> csize %s for STORED entry continuing with "compressed" size value %s %s: %s bytes required to uncompress to %s bytes; %s supposed to require %s bytes%s%s%s warning: cannot alloc memory for dir times/permissions/UID/GID warning: deferred symlink (%s) failed: out of memory warning: deferred symlink (%s) failed: invalid placeholder file %lu file%s skipped because of unsupported compression or encoding. bad extra-field entry: EF block length (%u bytes) exceeds remaining EF data (%u bytes) error: unsupported extra-field compression type (%u)--skipping  abؕ<H @i$0 p!BBp<B@<B@! ,@ !< #x !@q @<0+ @<"/PC(i$HP(J @ q  J C@$'@@pBY 8Nq  }I@8C@!BXH@B A?#$q #Q!P, #P0B@C0$0 H0 @$ B&@($`H@ P$P0 X !BH I@@QR 0E #@H($PCH$ HHXP8 8  B C81@!0B 8NqC H! X0@!$ # BX0 B  40 C 0@!$ # &Li`pC 0@!$ # *Ti`@C 0@!$ #H .`2 0 .4PJ @@!d H28PC d X$P8 80 B C8A@!0B 8NqC H! X@@!$ # BX0 B  40 C @@!$ # &Li`pC @@!$ # *Ti`@C @@!$ #H .`2 0 .4PJ%!H  $Hh$HH8q`@$p*e@` b0 dx^"p` p\0 @`XB 8 +m@V !l H # $y@X h!&@ ;!x #P88C $$Hh!P8BC$P8BCHh$H` Y $P88@C@ B00 B@@ B! BCHPh$H J Y $P88@C@ B00 B@@ B! BCHXh$HX H $ $,P88@C@ B00 B@@ B! BC HP@!$ `8PCP88C$` B@@p4%(@ 0@!0  HxpD  C$@!pB CC !H A!, 3 d!$  r! HX A?#H(@Z YP8B@C0@! B  iH@!8@,E p N UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14#PXn8 CH@@!B H$qC !P0A!, 3 d!(  p! @PX A?#P,@Z YP8B@C@@! B  iH@!8@, E rXn8`CP880C$` B@@p4%x@ H!$ BaH@$(@i$H` ?#@ J r$0  rpn!0@ @ 8C^!#H 3 h!B!$HPp q  pp@C $$Hxh!P8B H! B@P1i&$@ Ĥ $@Y\!B  PTP$,  N!BB@X J!2, PT `BHh N!B YP!B!!H  N!2,@X J!0 ` 4`z!@!@1i&$I d!@pP$!H@ X!0 8,Pp! H@X N!B0((p(@1i&$I d!@fpP$!H@ n!0 8,Pp! H@X N!B0((p@1i&$I d!p@ enP $ BN!P$p,@X N!pB( P!n0  $ ` z! P$i$H  B!p@ȁr @,@a n0 bpD1Bc,YP88PCAi$@a AB!` `E !c}I@8CAh$HX r!@ i$  ȁr YPAh$cH 3 l@i$H  | ,YP V! #PlI <(@ P! i$0 @ `XH 8C @! ",8CH0i&$H # N!%@ ~p$ P$p, X N!`0 J! ,n` ` z! i$@ pY88C@%H``X$ XV:@p! H x1p B qY,P 8  B C1i&$I `!0@fP $ B`N!P$0,  N!0CB@X J!2, f0 `@i$, @$@`hH P#P fp@q C$ BY $BP ^8B@C1p!H pYP8BCi$ H |YP$B P@!B A qC1i&$I `!@rP$B@!P$ B@ V!B YPrB C N!CB0 J!,@X r` z!$BP88@C$ HbP z!$BP@1i&$I `!p@d @i$p BP $ BxN!P$p,  N!`0 J! ,n` `$B PPBY880C$P z!ȱi$HƦȁr @Ŧ `  z $Y b `Px^BxY8J i$p@ n a!` Hl8C HYP 8  B pC@1i&$H # N!@ ~ P$,  N!BB@X J!2, @P `A!B `Y88C |!b0B  b! #PXA!B XV XY8J 8TpwX!C@B!H@`a!B Xs0C A!P dx@! Cd!`%Ʒh0аC @A! , xA!@ #`ax^0B a X@!0BxY@!P0Bax^p+B a@r!,If#B@ r  0h@X @@X @@ + X`XX X`XX ,"@X + &`X &`X L*@ + .X .d #XJ܀4C @!h h, @! #a8!HP܀4p, 8x #@XJ$- C $1 P z!Xa!B XVpqPC$B jX HYp!P88` B C1i&$#B 3 j!@8q BZ`P$,  N!CB@X J!2, x` `8B8#$BP@a!@#H  z! Ţ0P4J$BP@!q  !@p", r p q=1@8CX1i&$H 3 N!@pY ~ P$, X N!BB@X J!2, XV ` z! 8Tpw!PC@B! @! x1@!`B x^q@C$B h @pqC`!A!P, Ƥ $ h!B`Ybp[HUcE, XZP!b!!H  N!2,@X J!0 ``B1B#p1@!#Hp\@`sJ$BPz!C@B!h@ A@!B f`q0Cx$B x^ @TqC1A!,@Ƥ $P @^!BY db"@@Y XZP!d!!H  N!2,@X J!0 `` z!A@!#H`XnR@@J$BPz! C@B!@R80Cp1i&$HǤ $@8~@@p\P$,  N!BB@XJB ]0 `p`pHh N!BYPpB C $CB N! ,( p` z! A!ƒ",0P8C`!PC1B ' A ! jb @`C1i&$cH@b @ b p- YCX$H` $0 CxTX~BxPbB X N!CB0 J! , c@X8C$H N!0 P!b!,@X N!2,( b@ 8@pQ@!P#@p\ q hZ q@8pC $BhN!P!b!,@X N!2,( b0 @0$ H` $`0 `Y@DB0N!B@@P!b!,@X N!2,( b $0q`z!CX$HƤ H90 xTHX `0 C^!,8P$, X N!00 J! ,`` ` z! !@ h8C$H@ h9P0 \H @0 C*W UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14f_p!,8P$, X N!BB@X J!2, @ ` z!0!0 0L@0 q1@80C@,$pH %=An!@ `!  PX8p C@H$h@pX4q H4p  B#B!BB @b! ,  `! @IH Ha$0 ` @ %@`Z @$ , @ X@ HX H! p XB# X, 0 @, $$@WH, @"@ @@  H`8Hi$)@`8H @HB B$  'B(0  @(B 0 #BbB PAp(qC9@CX '  .Bh@ @ . BB "B8@ ,"BB B$hH   D-@ " X0D 9CF1C A!",HAp `8$ qx4jyNxpCX%`LH`@ 1h$A H`XHP  @`$I`ZP" ,PF HXL фen000B0 @$1 @ h$H@ 8 0 @ `v ``Rp! P\ , @ " Y$P@B C h$BB0XB! ,@ @` R!,x@8F1C A!0",HA  q8$1<9FcppC%`LH@A 1h$A H@HX 0)@ $ I`5P" ,PB HXL фen000B @$1 @ h$+H@ 8 0 @ `v ``Rp! P\ , @ " Y$P!@!!H XF!2,@X PD!00 `` R!,@ Ah$0@ F0~Fp P$F 1 j@Ip`C A!",PA$F 18(q% @(jIHpCX@h$H` X D0  X ",qC"0 B1YC"0 B@YC"0 B@QYCF!pqHI@X.0pJ D$aiPC ",q0C$0 B0D4 J0i&$J`C h$}@H6 @H`>u@ HBP 84XC`$0,P0$!H@ XH!`0 @ L  ,P(!J! H@X XB!2,@ J@ @Ah$I`pPZ!PF @B~F C `! `  PB!YP(!J! H@X XB!2,@ J0 $` R!,@ !h$ H@%"(T!P@! H H ,PB!@ q H BC%0bLHD `$0@`H L B`EFPX$H@ PH!0 `YP!F!!H XH!2,@X PD!0 ``h@a$H`( D   ,@ PD@PYPh$@H R! F @@PF H H H @ Y qH!@"/ @@@0#@Up  H H PPqCX B@C BC B!C@!@qH`@HxL(0pJ D$@TiPC q0C$ B`H$. J ,h`H@` x!`8 @ 8!<0 xf'C@$@ H`@ H%0 HH$pH`B@P$B @ F K` 0 `H$0H@$Hp$H H$0@ @@HpH` n`0  j@0  f 0  b0  x^0  hZ0 `  PT!@@@Wb@T )bPa$@H` B)@C!` p  @CH) # R 0 8F 8 `81 88 08 @$ q(a P(A aA q A X, A @$a a(a P( A q8,A a$a P( A a@$a 8, Ap 8  P4 t & NV*=M(*%o" .Q`!`l#.6P@!N@)G 1 be+@"E)K5߯ppY]s2#@GLPK-!~n pқ -kfp23p[.~uG1 q9* 4 Xo#`=_RdP0/f2+>%@.G{w82'e Y\ P n+r @EO 9ICl000. u 7.dƥ7kU. :sICa;jmBG>AKGils&]e 0@ RJ$¨%@miE:1@\>́4 QQa2`au8 87` c ` Ef\p1PsFfAē ~ʋnt>x_?x.|Dy)ֹLad S4T1lbPI5C&KB1ڎGHT4/͛B{vR<Û"-a›G_"6@TK9D 3=%ahx|L4C|9LpGa5 aIS0%z&jEc<_ݏ4daƔ_W"aҊpT?p-Ȯ!ج 1mRd')y/ ƈ1G)v1is"34'nQ2ztgƜ(=?*Ѝ~"%Mn%.Լ't(0|u`ś9L/"^1\R8vniatZ W3Ap:`-닻o-B}Ubaĥ1NX=Pfa264LR\Qcd:% zC”ceI傇R54a"6*}o 䈳Au<D"&@zӟnRq9\[RGfDBAA^ $:x$T܁=/6V\ǿ{aD'GM-z"r&*Sz5ig8{% oqgf>G`2pf jeH?XW4Htv-&7%]_Կ2.Ӈ>Q$j WCF8ym9]9&9d'ˉ{0\0S_pUQ7T.-0Oay{jG!ry0(t.)Jb'NB8@5M'uAknP| cQ_|j9(O}G̓8J*3q2hdAg<z2JX&Q7- nM2GCqZD&z:}a-\^8G"nP(}_/S8di%'Q(2D3PLSJz>zUL:?Ļ [bkůug/Ӛl/{3"eR=+LOGR>t.qDa[ZtL2Vؤ+b8SD41^?>mM?[.TcS TF_j-x5:Rk[/VWSY5>A Gհl4)DIb*v_HYi\"C. [o2{p@MO1"R4 VfD%S0NiY,%*KUIAO1!B T8X%{R}A OCG lV]B _yS]w4/(>4BeyA^:lăd>3h[VHnq3_fj%Eu>Ƶvo%c{[ϖ(P7 |(k}09@Ac5p`lKm2r9Vg=F}"@,kMqD{N`VҤ5E+$?#tF]72%ؐKB 0i@H?>}mT pTKoiW qZkOrx.e*?zwNEb i8)NK.]kׇ!q"/ü@vHXv[lwUt]rÌxUͥyU2u-6%ۭ9\V*;zm N'g. DϔBz{o|X:3}SNؗ^d{uM=n Z1Ku7K0{8@l{iM0 (~PA]0n֥A4 t JOt-~VlFfNU{Y]pc}~[Sw,f2 x9BBq_$]'-VƁ`INj"ˏrx4) Yfk@'{diZULBjwLΰ)Kg_qK$D@ldIu^)oR9 W"ym7d9dQ l%}l#FoycTmJ yD %p%2`L>eoD>N[.M|x0S*trMc'ahϏе{gnr3ueytb13C1/'CCyh}eԩ$Cwe`iCC )*T ڞP9tڂO>$o|. [yi`~x=$LFGo"MM.;2R'Aov{adǛ]{P-_/8$JbQTR]eODX In(u"[;+yU$~Ә,W@ip|~#N2 +1x]sa_3X32pT M| 87k܍M@K&Ɲ] mVDڧC,>k)< e *tU;"L5A<(57~#LXW}q.C{ڠL"7ITz1W7ɤg*ϷآMy5vWWlxww??6?u#qja;a:5#ԛKX@w vg=`p_).\"mq͊uq"re+h f|nR郦3]s>](t f2%on|#`-B "@`P_/_TPUY5e[a4$Sh6X C %GPf."ؑ"ZR+҈FrdKnE0h'8w!~n\cHz6mGbfP\>9`W㘰A0,=Sp%0k"{S¤U0v-%NAZ3S5@k8 x\F %;OqӿES$c=!XMκ  "H@~zב(pCgO$ ڪ CO@<㷤 g!5P7mkX,pQb(8!d ë85%G[8Uv 03Z8@(tpnCQZ`Dgт?€C}ػ%`J HDh=?upIͨH4P #c_{L0&D!YLD1DH@rFLS_}5pe2@DG8/-i"Gҷ@j]P!`UN)<9X+/T.q]ǫ 2kG8Hq|sH}P j6P-%sb+3W& 0CaxT61Ł8)6 $c&(͛Ѕ4N5A}㹩`C8]Fih3X ^P?ĿCt ݣ0 +#$#(YpDM}@yOwU` 0wf%BB\B9 u" # @a\E@ @RWXag ֠y Q`&J!2',8 @0 IIJM@  uHZ8% \h3D50Q<]P [p 6! / hswVT ]Pit1P)#\Z%uN)p|d5",$p .Af8ͣQT̕X5 $|&(~N 1DX( &'8r<+l9jO nx` 1*sZ BR*xb#ECuq'²0(%6e.@>D<(=@p-`4`9R]TL1 ;b <aԾ,i*DKpˋrE'a+'Fak"v-9~¥kӹxzBlo B^|TP#1Wlf`C"8@?"oj:TJX4MBgA6 ~ox _-g5%C]9M?Qa* !X+3@HMD)ORtY_u8t,r kERf]s @9Z ( DP )y@b|%8NsK B`h % >6 _y$ b5o~J% i<ɻ} iWVs% -F( X<|%-),clqmzFF `V!6, D1\$h3bK i N~r(e06S oQH~0<,ei! ,#6J` .s%6,}XnP F0Q =o7gJ:TybTcL(Gz^ű` uģD|#$N-XE݉nU: KK7~)=Am_(NbEa9!̎9A (\amf+~1 /*jY16?DB–'яUa9=ы >Q7`tYqH>ïE4@g!HV9(D|78Tq5|^ə60{[T@ 0!AEgd'`~wEBU55B- yE >pB+JHSwy8Fk,ʅ:TE<ЉкhRn|z 4NH&Hb`6f'YD8>RaYu!LhcHx$@ jASG`Lp!  OoQ\pn0  f)>g$h 4$!@MR@8v4<FQbnz49NQ}5<:m ` Z g,?XU6ڬ ibvG3tF_H$18CL/hG0h+ARh.ŀsC?0!z0[,` b#MX `fq/BNiS, 6 8P0`c}d &PP @같DʡD%n"bxvL`J  UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14$, N!00 @J!0 ,@P` ``!@70! `5f$`q@C @$ q CP$I1P pC X$P-iC 0!L!, D(C$ګ~F  !3I@UP X8B@ @$ iC@!@@$@*HP@`C@!@ 8$`P iCH $ H fJP@, B@C`$~F  9$3@P P8"H J`H!`i`C@!@@$@rH@`C@!@ $ @$ i C@!H@ $P iCH$2B  P@T4 i@ `!pC$ ,P 8 B  C@$@HH 0$@`Y V!00 @HX !0 BP$B@P`!(@ @=$P8C`T 0 H`PIY?#`2@D0 4| @! ",P8CX0i&$J  $-@@PH  , @vRP`$H`@ N! 0 `XYPVB C $BB N!0 , ( V` `!`1i&$0~F@ `X HY  $ Cd0, 8QD!,P0XB C $BB` N!0 , (X B``! @ @!0 ",08CP0i&$J $)@ HH  0( @vJP$H`@ N!0 0 `Y!PF0B C $0BB0N!0 , ( F` `!$`BB@CV1pCPV{`g!>|$~֤`h$u k|||{{/  qqwqyhx{ngpzɦ̳|r"f/{|/{`yyyg|| |$!0|l0@|xx$xyx$0~~~0 v" tn w w t xxx .yxxy {xyxp{{{ 0~~~ "s|yxx$xx txxp{{{4| 0ɴ! t th 0~_.$g0'z_' xx"r b||| "|"w~~2". |ҩ|~f~|2 ~~~f~||f "|wyľo~~~|R/Q/@Q/Q|^"~Nl~~opn p0fPP~{~~|@ ptp `f``{|~~h|0˨0 xyxx  tw)|$$|(|yhq"| qz|Ԭɨ@_|%@|$Q~/ {~%{   t t f@˨P|00 ǿ$w*z]*V* y0y{ sf0opS0 0 m $| zzyt Zeee~%vg0] 'U   ľB   ||`@%.EXTRACTHP C S7.1-012extract_or_test_filesQstore_infoQhfind_compr_idxhjextract_or_test_entrylistjextract_or_test_membermemextractmemflushextract_izvms_blockfnfilterdircomp,.shstrtab.note$READONLY$$CODE$$DATA$TRUNCEASTRUNCNTSD$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$.rela$DATA$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]EXTRACT.C;1dircompDECC$GA_STDINDECC$GA_STDOUTDECC$$GA___CTYPETDECC$$GL___CTYPEALOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGGEXTRACT_OR_TEST_FILESFIND_COMPR_IDXMEMEXTRACTMEMFLUSHEXTRACT_IZVMS_BLOCKFNFILTERCENTSIGMSGENDSIGMSGSEEKMSG\ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14nFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSGTRUNCEASTRUNCNTSDOTS$MOVEELF$TFRADRGET_CRC_TABLECHECKDIRDECC$MALLOCREADBUFDECC$MEMCMPPROCESS_CDIR_FILE_HDRDO_STRINGMATCHDECC$TXSPRINTFDECC$__OFF64_LSEEKDECC$READDECC$FOPENDECC$FREADDECC$STRCMPDECC$FCLOSEDECC$UNLINKDECC$SYMLINKDECC$PERRORDECC$FREEDECC$QSORTSET_DIREC_ATTRIBSDECC$STRLENDECC$STRCPYMAPATTRSEEK_ZIPFPROCESS_LOCAL_FILE_HDRFZOFFTDECRYPTDECC$STRCHRMAPNAMECHECK_FOR_NEWERDECC$ISDIGITDECC$FGETSDEFER_DIR_ATTRIBSOPEN_OUTFILEDEFER_LEFTOVER_INPUTREADBYTEFLUSHUNSHRINKEXPLODEINFLATECLOSE_OUTFILEUNDEFER_INPUTMAKEWORDMAKELONGCRC32DECC$ISPRINT   30;IXj|h (400 p)1D[e)n5x  +7CO\hr}-:OX^gow(DZ@UQU|''('4'@5 ']'W''Q''0''e e e'__(_ _( _4(_ 0_48_@5@_ 8H_@5P_]X_ P`_]h_p_ px___ ___ ___ __0_ _0__ I*bI+"I,I, %`  !%0`I-I.I/2I0I0I0I(I1 I12 I(2 I. I. I2r I2 I 2 B I2 I 2  I22IRI22I@5I32I4I2  I,RIrI222"I5rI6I7I8I9rIII2BI:`2rI;I<II2I<I8"I<I,HHI2I<RI= BI>I2I<RI<I2##RI2I<P $` $ I2r!I<!!!!!I2b"I2#2#2###I20$A$R$I2$$$I2@%2A%2%I2%2%2& & 2&I2&2&2&&'I2((`*p*R+Ia+2p+h+h,I2B-IQ-2`-h-h.I2!/p 1/p q000I001I2b1I1I2"2I?B2I,2I222I2r3uJG UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14|bI@3IA4p 4p 5555"5%5555x66X666(606@6"A6%P6Q6`6a6xp6q6X666(68I29I2<I2<I3B=I4=2=I22?I-R?2?I2@I.b@I2BAI22BIBrBI-BI.BI2rC2CI2"DICDI2EI0EIE2EI2BFI<FI0GIG22GI2GI7RHIrHIHI2"II@II<JIJ2(JIDJ2(KIDRKI2"LIELILI2MIMI2NIFOI2PIPI2RIGSIHrTI?2UIIUIUI2rVIJVI2XI?XI2"YI2YIJYI?rZIKZI2[I[2\I2\I]]]^_B_IP_2Q_2R_2`___I2` `B`IL`IL"aIM`apaaab bBbIPb2Rb2`b2bI2bIc2`c2c2pc2d2hd2d2XRdI2reINrfIOfIOPgaggIg2g2pg2ah2hbh2rhhhhhI22iIPiiiiBjIrjI2jI2kkkIl2!l2p"l2l2hl2l2PlllI2bmIQm20m2m28m2Hm!n"n8 Pn8 nIDn2(nIDo2(2oIDroIo2 o2o2oI2RpIDqp2(pIDp2(pIDp2p2q2hRqI2qrrr``rpr`rIrI2bsI2t!tbtIt2t2pt2!u2h"u22u2Bu`uruI2vIRAvRv`vavXvvXwI2wI2wI2RxISxxxIyy"yI2yIT!z@zzIzzzI2p{{{I21|P|b|I2P}Q}a}p}}IU}IUBIVI,II<rIVIWI2BIVIUBIV2IVrI,II<҅II2  I2rII2I2!2h"QRI2‰I2BI2ҊI22I2I2RI`qI212h2arI2ҍI2RI2I2rI2ҏI2`q!’IT"I0ARI2* UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14ITrIUIVbI(ҕIR h!1h@AXpXI2@P( Q`( I2bIWј88"I2ЙbI(IUbIUқI,BI(II<rI(02P`IXI7%%% % % % %(% %0$% (%0,%80%@4%@8%P<%H@%P`# P #pD*038=0)G`PN@ap` owPX `  `9 ``` `000 H  x0   pK#V1.0p}ELF 2v@@0)aH0aB0aB0'a0)a0 &a0 +a0$(0 )a0)ae0)a01a0!+0!40!=0 )a0"aY@0X0p PP("@"P8XP88x89999==>.IPF/VMS29-APR-2009 07:1929-APR-2009 07:19FILEIOV1.0IPF/VMSHP C S7.1-012IPF/VMS error: cannot open zipfile [ %s ] %s error: zipfile read error warning: filename too long--truncating. warning: extra field too long (%d). Ignoring... %s: write error (disk full?). Continue? (y/n/^C) error: zipfile probably corrupt (%s) %s exists and is a symbolic link%s. --More--(%lu)--- Press `Q' to quit, or any other key to continue --- [%s] %s password: Enter password: password incorrect--reenter: ??'".^%So??YϾ󨷵ǎԐѥ噞ᅠƄФ׃Ѫ++++--+-+++---+i++_̯յݯ=HIH`Š Ah$0 $H`Z@$@ sXVb@ b0 Xx,`XYpP;@ # PC 1i&$ `H  $@@D0"H$ H PX H P,YPT!!H@ h@!H`(@, `XP !H!!H `J!2,@X XD!@0 ` `@$B(@, HU @$H @@$@ H$c@CX!$, C XX(@ (" i&$ AH@ $HcC!P!LH i$0L0 i$`AX@X*pA\@H( @L,X ,@P @ H.` #$00C i$@@ @$H @@$@@C H(0 0$,C( 0 C ! 0#Xi$!B`X P, PX0(,`XX$ LH`i$@$@ ("LH ,@(@ 8@ i&$AD@ " Hi$@$@`C @!$  X HX H, H 0#89`b@ @B8BC$0H F0 @ 81CPi$H 3 X@$@ 5J PT , HYPi$p q @  @ #PC@ 0PCXi$H  h$-@ 1J" I@ X $0  P@$XD # ($i$@H& @Q@  (J L  X(i`XYJQB!@B@PIP i$P @ $(Y Xi$0 @1RH -@`0 H $ $, #BP %@@B @($ `LH (J0 @ (FPP!0, C `$B0( PJ! ,  F0 `@!B(@ @D! , 8U` H=H@b@ @ @8 C@?#@ H@!$0 P1@CPi$'~F@R X@!( # ~F@ i$E@ "DcCXAh$bH D $@bB H XV ,`XYP B q P C@?#@ 0C$ bLH F @`DPT! , C p$H@`F! , E0  D `$ H PP$H PP T!i$`H`B `@ F  "+9 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14E LpH F80#P (a$P@ (J(Y (J!P0 Ci$ H@ $   $`~F,C$P H00M?#PB ,  T!!@ )`@X B @PN8BJi$0H`@ i$ @` @ H D0 E?#0,4"  @ , HU 01H @$0  ?#!@ 8! 0 @ 8 `@1 88 08 @$ q(a P(A aA q A X, A @$a a(a P( A q8,A a$a P( A a@$a 8, A 8  P4 t %B @ @ CP1h$ H a$ 0 @R@ H PTE@ C 0 @PYHR@B`YPF0B C X$0BB0HH! , F`@ $B(@ h$ @ DppPC@Ah$H@X H! @ i$ " F @YPHi$H 3 H @BP@$B HR ,@YP81@ # 8 C@$@ i$ ,`@ Hi$@ @ , J H@ # Y D % #@Xi$`H@B i$-@@R$ ,@@ X( `$,,@PX  X( @X," ,@ XH PL # ,B, 0UP XIH 8!$0 @0B!$(B!@ !@P H2C$, C`CX$"B X", 8, ,,H@\!(@ @! G, DqCD8@C i$ I@ $Hq8@ I?#0 (8(&90C($` H@PH@"Y@$pH`$a@PA!pq h @0~F @ @C Hi$%@ H$q`C$BP$B hPA!B 1@pq`C@pi$B` @!@@A ! H @ B`Z$a B @CPi&$H 3 $ I@ x^ H  H,@ % H0 `` Z!WC A!0",88C$ HP8BC$HP88pCH$H HR ,PpR H h,P Z! Hi$@ R A!0`",88CH4C$ H F @LP r C8$@$P88C Lhr0C @! #h@@!B` P@!0  H0 B 0( #m9!hN8Cpi$B¥ 8!!",$ @!B $ƒB@ @PU@ (T # D@ CJ H C J! \B@ x0YP D8B h@! qCQi&$ H@$Pi$ @ 3 $  `xF!B@YP2@@D B@D`@ ` Z! $`2@0H4pJ J HD8C$!H ( pP!0 0 Yx!P D8B h@! qh@W! A!",PB8C$ HP8BC$HP8C$pH C J!00 Y xN ,P D8B hJ@!` q@pF HpYP Z! I?# H  H @@ JH!H # @!a@XXU   , DH=H` X!!@ F @8 @CH$H`YhP V!pqi$H p\  p\,pYP`F H X,PV!p cpC$PV!P ,T"1H(L9ph r`2 hMyrp5k9FxspF%8@$PV!P , `FH, hZP`F H X,P V!pH 8Np 0N8`C$*@ Y D   , E B !Px@0H H0YP08B@CH HYPV! ,(@ @J! @ H # r0C$,P V!i$@*@D rcD C A! #Q@ H=` 8Nb0P! CH$ H`$BP8 8 B PC$J D $0 0 HHh$B 4` P%H XJ!@ B`HT!PBP$ B  `N!B PPT!H@(aN!8@0M?#B; B $,XJ!P88@ B P0C$BP T!8 C@$H@D~F@Q D8B @B! , HU H=b@ $ HP(@9BC$H@D ($00 BH` hJ0 F@BP$0, `H!0BB@X XB!2, F0 `$H PP T!@9C$ HD 0$0 DH`%* hL0 B@BP$, `H!BB@X XD!2, B `$H PP T!,@9C$PHD $ 0 (JH`U2 hF0 D@BP$ , `H!0 @XJ! ,@D` `$H PP T!$HPT!HU a(0B! fQ C@!X@`B50C$,  H$@x ``xh$PH@A 0$00  (Jp)@7pCB9H X$0F@H  @%Xi$ i@0X#BX Yhh!BP88 Ci$ ,DB  0 0 ,`0H  H80C4 9C $bE@ XhHrC `" 0 4&9C `" @ 4(9pC `" P 4*9PC `" ` 4, 90C `" p `!0`h\@JX HdZji@ XX,pJZ0C a$)y@ <X <!z,>80C <!@{2,@s) !PPC =r`)Y@8C8>9@8C BYx8`C @i$(!@ @@X H$p C $V  `8CP, H,@PX PH ( @H>9PJ,> 9` C<`,  Xpx@ P! $P #  X*80C TV `Xp@C+, `, X `" D (@ *!D@P@  x28CdV  BX UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14؈4h@C3, ,,X X,8 , (@ X2!,@P@ H$pJhi$BUj hZhY h[?# $j@ ZpPClj9B0C h P#>@@Lj9ChZ! H [Pr0C hh 0  X@4n 9C h Z!,( 9pChh 0a@ Z#5 ZL#8@ X `h аN q<O8J0i&$a @ C N!)q@*F!p,X 8X X 8p0 ``Xp q ` `NarpJPi&$HX @!0( @ `X  !2, 0`Hx1i&$b @ C N!*@XF!`, x^xY  ^0 0`\4`i 3F%(@@$x @0i&$!H N!P* @X F!P P,( KP0 `(` @p$@H@zp\C0$@"H $`0 "j @F$ H0LP$`, P!`BB@X \!2, 0L` `f!(@ X!!h$P,8h!P8 C@$ @($, xa$r@ (Jb@Uz Z ,z }_ ppCHB9@C x^!¾2,r)`@)P`C x^!,xhR9ȤC8H9 @C 0$`0  0L0Y88C!h$0B` F0pCHNH X$ ,pC$'X@ X $ H  H, ""@HH90J,H 9B@C P$ PTr PT@PY xp@ ! $ #`0 TpCT p B.hPC$WX@X 2d d,0(@ *!`0P@ H$p`J a$)q@ 8X 8!p0 Ap)PC h$ H? N!qy@a <P<8@C @$0 PB b@>8pC $@ j@(Y jY j @ (PCx@Z HQ@,P8B@C Z H Q@,Pf! ,(@ PZPQ hX @# 0Z0QL8J B a$0 H ! H 0p @ H0 9@,"@@8@0 @R)` )PY@8CH@h$HB J H HPh8CX H`XP,,p@C `PL0Lp@C PT`Tp@PC(BP 2h+~F$ \PH@@JXV8PC% `LH@C $P* @`HP4 `I8(JPSm@Pf!@pE Hm@$Hz$`B(Y XP B ^@BPh!H@X P!@B hYf!*BB P!@B P$B CP B!p HhY T!#( \!B0(J`X` f!8$H Ŧ xh$p0 @ $ubHR :@t `X 8N,`Y x^b @:,tJ@ PH@@$`H @P`B@ LY80C$P f!ph$ HYp\ P \@q`@f!0CP$@bLHE $0 "xi$bHj HP0 3(h!`, Yx^ P !H!B@ C $2,@XJ!@B  HpHI0L ` :` x^ 0L,xY 8Nz @t2,dJ@ P@F!P,P8 C@$x@h$HY h @ @,P f! @D! ,   B  @A S @  @@ B`g @A,SHA@(@ S @H@xS @  @,@ , :B`PAgXAP)@X A,@xSHAPH@S @  ,@@)@ y @ " S @ @ @P@@( H9H Q @?#`8 @@` 8<0 x x@!H<+ P!</0C$<B`"@ ?# qPC $H`a`HPT!0B`J8@88@C`B!0B$P T!$0B`LP8B0C8$0B`N(@`D!0B$@BLHPT!P"H` 0J800  H @  H! X ?#p(1  01@D0@LH $0 @ `A! 88 8 08 @$ (a  A @$A X$A @(A P4 t 0) @ 8E" #p,tIXH P i&$B`4 F0 @0,@4I@H HUa@ H  X$(0  @@!   H" @P,@ $q! Y@$ H$,`r`P4@C %, X P. @P (@ $! H T#C  d" l, B!q4! Y@ H$, t2i@pch@C 3, X l< l (@ 2!8!,@ >hp# accctx=stmdll.16(null)segmentation violationillegal instructionbus error %.*s0 0  0 fM ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]FILEIO.C;1ɜT/>? HIJ U  @w 0k/ @00&Χ~ P̪~B w @ &j$op'O @ ~0'_"® k$h̭@@?? iͱ'0   v v v v P$$~/  <D*Dr+h ~@" r r" >~$ip0Ԫԭ0$  "_&.~~p#ȫ@['`0Ԫԭp0/@      q tt 0 w~$tN0$)    cn&.af־ª~˪'s/   "l"l"  yhPcH0P!4p !s~sssstz '.0&i~~0~~~ק@sp`p3v vb0Pp0sssԪv ˾@~@ .  ~@@Mf UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14 ? ~. ²z ppr˫t0aouN  x /nffa@%.T>FILEIOHP C S7.1-012open_input_fileundefer_inputdefer_leftover_input readbuf readbyteseek_zipf!UzpMessagePrnt!3UzpInput34UzpMorePause4:UzpPassword:?handler?Edo_stringEpmakewordpqmakelongqrmakeint64rsfzofftszstr2oemz},>.shstrtab.note$READONLY$ISO2OEM_850OEM2ISO_850ISO2OEMOEM2ISO$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.relaISO2OEM.relaOEM2ISO.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]FILEIO.C;1UZPMESSAGEPRNTUZPINPUTUZPMOREPAUSEUZPPASSWORDDECC$GA_STDERRDECC$GA_STDOUTOPENR_IDDECC$$GA___CTYPETDECC$$GL___CTYPEAGOPEN_INPUT_FILEUNDEFER_INPUTDEFER_LEFTOVER_INPUTREADBUFREADBYTESEEK_ZIPFHANDLERDO_STRINGMAKEWORDMAKELONGMAKEINT64FZOFFTSTR2OEMOEM2ISOOEM2ISO_850SEEKMSGREPORTMSGISO2OEM_850ISO2OEMOTS$MOVEOTS$INSVELF$TFRADRDECC$OPENCMA$TIS_ERRNO_GET_ADDRDECC$STRERRORDECC$TXSPRINTFDECC$READDECC$STRLENECHORETURN_VMSDECRYPT_BYTEUPDATE_KEYSDECC$__OFF64_LSEEKSCREENSIZEDECC$PUTCDECC$FFLUSHDECC$ISATTYSCREENLINEWRAPDECC$TXFPRINTFTT_GETCHDECC$ISUPPERDECC$TOLOWERDECC$MALLOCFNFILTERGETPDECC$FREEDECC$MEMCPYGETZIP64DATADECC$STRCATACC_CB    2P A0JPWP@crh `0`0 "P8@8p"9,9p3=;COWamu~"-7CO^mv.DZ@UQU/DZ@U'''0#''' '''9'P''"d'P8}'8'9'9+'=''>e e e'___ _ _0(_ 0_08_@_ 0H_P_X_ H`_h_ p_ `x_ __ x___ ___ __P_ _P__ __"_ _"_P8_  _P8(_80_ 88_8@_9H_ PP_9X_9`_ hh_9p_=x_ _=_>_ %% RL!02P`rI1I2I3!@BI40@BI5BI.@@I61I5 @ @2 I6Q q  I7 I8B I0 I9" I:     + * + * I4I;"I5I<I=I>PP"I?BI?`pI=I>P PbI@2IA"I>2IAI?I?2IABI> @2RIAIAI>IBRIBrm UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14tIAI>RICIDI8R`IEIF2IFbI4IGIHI72L 2p  I4 I8 2L  2X    I4b!I8!2L !!2@!!!!I4B"I8r"I8" # 0#1#A#P#q#r#`##`#I@,P,`,2L b,`,`,I42-I`--`.a../P/`/0011@1P11IC1ID4IF!428b4I64II4I/@5Q55I 55"6IHR6IE66666I47I 7I7IJ:20@:2(R:IKb:20:IK:2 :IK:2";IK2;A;;;<I4=!=P? P((4<D>KFU G8\@op }QT8 `[$ ``Gj\`N`NX]``PP0]0,^ b& c3$cmlL#V1.0ELF 2 @@0)a=p@/IPF/VMS29-APR-2009 07:1929-APR-2009 07:19GLOBALSV1.0IPF/VMSHP C S7.1-012IPF/VMS *HA H @$ 0 @B`i&$B B($p~F`PT!@H` a$@H$PH H 0 &@aLH *@BC. LH`$ H@="/ H d0 @$X aB@B ( `!Y@C  @$ # (- # "I # L(X # \0Ȑ #@M ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]GLOBALS.C;1¢S2  muc %%l%&"%p& 1tv% t""%s"_$""#@%.EpGLOBALSHP C S7.1-012globalsCtor,p.shstrtab.note$READONLY$CENTRAL_HDR_SIGLOCAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGFNAMES$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.relaFNAMES.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]GLOBALS.C;1GLOBALSCTORLOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGFNAMESOTS$FILLELF$TFRADRUZPMESSAGEPRNTUZPINPUTUZPMOREPAUSEUZPPASSWORD     3 p?M]mh   DZ@UQUk' ' ' pe ee' _ _ p_ % Ƭz UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14{RIqr RRR R b 0P,`:pJ\nup| 0@p` P0`P  `0h `@``I ``0# 07 HJX  Vp 8 #N#V1.0@wELF 2r@@05a0 R:a0&aE0 Z:a0#7@@>X@>?x?TT U/IPF/VMS29-APR-2009 07:1929-APR-2009 07:19INFLATEV1.0IPF/VMSHP C S7.1-012IPF/VMS  #+3;CScs #+3;CScscccc !1Aa  0@`  cc     q.@HY 0$@0 @A0L0, E@i%$H@aR@ 0"@8JH `X0!@X"H P  @D0CPi$0H@aR  ( @?#(c `CHi$H`H 0!@ H HX $ $  8@$PH!B;C@0 CPT p$@PH )@ B Xa `XH `!,` @" 8y` C |$Mi Cx|b9 C8c9p C }b, @a`C P!i$`Hb , @P )?#PcT,Ci$H. 1e@ .X \0 p\ `2h@0$ HH @!P!` y8 H$P!B !d!p_w@C@b00$H @!P!`p y8 p%(@P0 C`!, #E ` Yb p$ I ` B Ha HH `!,1 @ 8yx8 @b00C P!i$0H b & D #?#DcH&`Ci$`H( `1Y@ (X P* @P T,8@$P!B !d!pSw@C@b00$H @!P!`@ y8 %(@P0 C@b , I `!H"@5 `$ H p$Kp0C P!Pi$H@aR " ( X?#(c,"`Ci$PH`$ P1U@ $@X H& H L*8@$P!B !d!pKw@C@F0$@H @!P!@"!y8$ %(@P0CV p$`H B 0H  Hc  HH b!,! @ 8yCxe9@C }d, @a0C P!i$@H b ( D #?#DcL(`Ci$pH* p1]@ *X T, PT X.8@$P!B !f!pWw@C@d00$H @!P!`P y8 %(@P0Cb! ,  H  d,@v1p$@I b  B Hc  HH b!, 4 @ 8y0Jd00C P!i$@H@b ( H %?#HcL(`Ci$H, 1a@ ,X X. `X \08@$P!B !f!p[w@C@d00$H @!P!`` y8 %(@P0`Cb!,@I @d H"@ b$ H p$ KpR< \ B`b4I @f X Xi!iPC0,@HY& @$@’(10@@"iC&~FQ HR!H#`$!$ f & 2 Q $!2 `$ L( h$ L( p$ L( x$p L( $`JXp8C&0H HR! B1X$ @`2x@a$ $@I p pc@ RHp $v a$ @P l!^8C i$03@ fq@Ca$HHYd P8@(a$H XJ ,P8P B C H!`8%H`!0,@F HR! `ƚ ^8 @d@J i$00 @  q@CHa$HHY P8@a$H Xb ,P8P B CH!H($@($@($@@$@($@($x@@$x@($X@qi%$ JH@@` 3@d `8 # L, U@ Б:H  @pi%$`8 @ ABJH@`p!@`!b J $)@` @@8 #d!p D( #WCh%$0H h%$ E@&pJH"P U@. JH C L(PT @ؐh%$JHD,zF . |F@ ؄6 q@â ,0d # T4l # 8t #@i%$PBJH 8i%$ }@*0L p @>JH(JDJH H 2i%$ #D># @`8N @ @ xz #`Ȣ ~(!#`  !  $`H@@ JH h%$`0 @H$:H($@K` X %@Bp  i%$@!JH` ( L  (c CXLB1[OEBq>z`jvXd LEGy?V>YxʡUOB͎hFZO @7RZC6DFt EQzħ٘!B2aWlKFʉMCK'rc-y`" T5\S4M^WoJ`mܢ3o.4y`O FU[zč.$?2q:3:HbFrMlE1^jEUf6'| d NWF`QOx~U5hR>")M,EtEjcX/n`<#B]D>ebqBYenx k%#aNg}!Nhman Nfdhox>gxRE@I[jJE$\2q#/m3-Wb&_-DtIn!lL'La;M&+m!/]~)@%3-S}D*k>22C$W5f_͹JV?s@(9 ѵv}?D/1_ -R ``> Bee\B0 <"iCjGa0 {jS+f 5%A@5N&"P]/2 j U ;{EpV3J`DJ,ả)x2w¢?vN @Sa4}Y^XSxxGS+(xh~{)B 'n$#Av6  y ϩ.(ia`Q2 ޾p^QQ\@jf}l䷑ZbGiU%KuU.iA.B#; K5Ԥ3lKjtx]q# lV=c`~_Q=:CPBb?cM5T":]2aQ1*."588t@PK00#w+bR!!rVaZQZqjm4Ii#8i9/Q e(΅nN Ţ_)c;#Kj"Z3~p;3Ƈ)~zRxHuuMAmCۺ=\ ?dI~C\)i<iOl5Z4* RedZr3A6 S^㵤yuiVBN"fbZ:4nc6>vR&ۀ4 a00/b3w!`lݍdE] +2#|6!#W҅o?TJ B {Q~8ZU.ue02D!8 xP3Hs @BX|Gn@3HHlvB5"oΨIkQBVtݱb瓘S_6 $TVoݷROV^Ճ>|u)*[<2 0NP2)5{@ y[t%}t iJl?RmNa+}^d8NdA?l V9cW.1, 8m Qr]:60x° -'c)Q!5P@E;kGodLbPQ _ S/m%F`"D8?LkLHQ]J"$J8DARg(` ֩ EJB:[ C@6&IOȧWՃ(*X"CνE-6I jȶ0y+H@ <^+oH~M,S b.f0gev`2krH#:RkZ4Q g qE%)2 K00,Q)&?3Ζ,O<׳n87|'"zdDE;S>戋Zzý_x4@pGψz[;1Pbf'E)L:^zQT ;tjx7 >[6_PFwyVvqi]d$-344KgVg8juN+9 *ot<)K VmJ Xpp\i7^8DVq[C,;%eԪ,Y4lS4x9?i 6s{UH\m=;P=(xc[.XO9Fp3崎Ѧև۷xzIߞInE5QСH sKꑳX[%ntڽˣ^k~t.*IXOw~ț_ N3] >;_ \%\Jp';!"Q ӷ>|<#cBR1{M7L`$aɠsاJ|4Ah> LyzԞ36A|C` Qh\q1!Fm[) BsSqk\ 9Zp}>nCN9>o*#=`l|IE%|bW>y.F>fJ~[QDh H:҂e"C>ҍ]I@($T Iۊ0aR1NAj\O^7KheTĢHH71*)]Ƈ`<\mQZ3(~e GMcBqu;SFLP{/Fbwe^߬Hъƪ?fS"붘B!3D-gIpڳ3jݩoՠԊ&J9}'/BQ读Im 0\,t' |Dm|L×@jqb'e02YnuKVN!=S()8hC`R\W ;b4( ցE>Gt:*1i}b#gΡyk&Āj"WCI!LYg5a KKl-f_x_…[jO'^jm?jG('B,'&aZ_}0iPO`\*Y>? 02[x@)KԲqc˲թs1;x eѮpԊ9 E:A-ӓ0}DC$/IyVd++h{jEs rK)ETp֠:Y(9U8_CPMma!)*O,I L)&iOAU߾/OOm7SLD4)u"(vH*7tQMrNHEllQ0KFRU8i!fc`)l+H<s*;\k.].ZMQl2ϟtjp,b`@wBCmbP׵h]66a$A缨h` eFÝwmfpI{BmhѨ*{JCԶgCY>z'첊x*!/}\/QnFn]}0{k\)S ~{H3C/RE ?҃!Jd:TA'.aؔ9,{)1ZBH\u(/堞4hmh-\B$ļ#lz)Z?[Lt2r@&YpM8V\rC6Nc(iV= 0Q;tG~+00!G-cj6Pwl2z鑜{_|$Mx<%QTPUj,D{|}&n7!޽xyhÿ9ɟe:2u:gsKnw>xxYVx/9N#$ Rs1[ؒ0Xw1rÓJVAͻ"9-TW*t0k\Tq#`dc`LM:ɟmnAp[Ǽ,.A͏Dۤ dDb yL%wed*HMCٱ&$DqP@#|] BΙ"G.4ك`Ds[~O֛ IfZY%~OeNOt&Ȃ8^ӣVE Vw*atqj*<L]<._v^&< a7iX/ Ԧ9OqsQMPsKI[-p4c6Yi?"yDO3Gbk^Mئ30eLO S!JXg)b0?DJ=a>}Z tlG~]\sg/w;A[*(= Aq-K:dnuDW$ ~\N:-V#)JU'pJI"DqPx*kFUfγP99jܧY&mѝi1<6EC<0 ` ^BE7S8~{̹4{H]eDG4+=?]r[& U3XX:MWblB3±:/YoTbi _@g[`+wb5Jg=]զuqxEO_, xo;>*CNݥݎ$r1ϤIY ÃqN[[SZptx(C@XUzUl(\f ]?:ɴëQE'R5ʈ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14" b!i$H  X D #?#DcX`Ci$H@0 e@ 0X `$ ` H28@$P!B !d!pcwCd10$H !b!` y Jx`, $& c?#a@&PRPC b!Xi$ H`Z $ , ?#,cD$Ci$PH& P U@ &`X L( 0L P*X@00JH$(@$P!B !`!pOwpCH$0$`H !b!%a0 <@&8JXi%$JH@I d, -@ c?#s@APR PD #C$@1B@b !a (H #@Ci$pH . PT +?#TcX.Ci$H 0 i@ 0X `2 ` d4X@0JH$H&@$P!B !b!pcw CH$0$H !`!%a0 <@&8JP|d, +H@I a?#a`P StPC `!Xi$ H`Z $ , ?#,cD$Ci$PH& P U@ &`X L( 0L P*X@00J$H@$P!B !b!pOw CH$0$`H !`!%a0 <@&8JP|d, #H@I a?#aP StPC `!Xi$ H`Z $ , ?#,cD$Ci$`H( ` Y@ (X P* @P T,X@00J$@$P!B !b!pSwCH$0$H !`!%a0 <@&8JX$xX@@I ph5XiƇ p@R@C@$"@0J$@!pC D!  $ a@C `!i$0H  & D #?#DcH&`Ci$pH* p ]@ *X T, PT X.8@$P!B !n!pWwPCH $0$H !`!%a0 <@&8(@P0`CXl 1B@q $P B`XXa?# $`D`b4`E@@fR(8%(@$@ L$Mi`C0$`,IP.0`"C,1B,`,I,d,E @.0!X (@X d| !X (`X h| !X (X l| !X (X p| !X (X t| "@X 0"@ 2h # 6p # :x #>0J&4PC,1B`@ j!MiX X $"@Ja!00B@b !B7M$Ѓ1BnP a!`  lQ B@j8Cj9C !p p,qPC o?# ǿ$Px!p,pJ@j!H@h `,  !`"@ l C `!0 0@C `!Hi$H J X $ P?#$c(`Ci$0H@" 0 M@ " X D$ D H&8@$P!B !p!pGwPCH`!0$ H !`!$  @0` y %(@P0pCX!@@I @$, @PH,,@XH P! ((P0H$ ((4@6y@C!`,  !PT"@(*% @@9C $a@C `!i$H Ȅ2 p\ /?#\c`2`Ci$H`Є4 q@ 4@X h6 h l88@$P!B !p!pkwPCH$0$@H !`!%a0 <@&8(@P0CP d, $@1P a?#)@@FRh4`C?#( C!@,@H$10L"@C #?#M #Ùp&!p\$ !b!|2 q &M"/ &M"/ &M"/ &J "!q`C$DB b!M #1L Jpn%@D9C $a C `!i$0H    ! ?#c`C@i$0H@@ 0 @ @@X 4 h8@$P x!8;PC@C@p00$@H !`!` y %(@P0CHd, $ 1H a?#%@@fRh4pCX?#$C!0, XH"1 H"@C ?#H #Ñp$!`X$`_ !b!t2 q $H"/ $H"/ $H"/ $J !xqC$,B`_ b!H #0H| Jpn4PBJh@ $a0C `!i$H   ?#c`Ci$H` !@ @Z    8@$P!B !j!p w@C@p00$@J !`!`  y %(@P0CHe, $ H a?#%@@Rh4pCX?#$C!0, XH"1 H"@C ?#H #Ñp$!`X$`_ !b!t2 q $H"/ $H"/ $H"/ $J !xq@C$,B`_ b!H #0H| J !pn0%@$@$@ ! ,PC?# H~Px!,p!J@$@$@ ! , PC a?#  LJ$Px!,J@$8@$@ !@ @, APC i?#P ǧ$Px!@,@J@$@ !` `, aPC m?#p Ƿ$Px!`,`Ji%$#JH Ri%$ @   @a p #`a ! @b$-Z !8 #Y$P a!p  n! B@d8@Cd9 C B!#",p8C1i&$H C $ @~H `Y !`!2, ` ` x! !p p,pPC o?#` ǿ$Px!p,pJ@d!X@bi%$$c A! @EB! 1BX, Z`!~FpP HPA!i@l B !( QIxBJp!qC`9C B!@#",h8C1i&$H C $ @~H b Y  b0 0` x! !` `,`PC m?#0 Ƿ$Px!`,`J !p p, qPC o?#P ǿ$Px!p,pJ@`!@a!@1Bb b@ Yp,Y,P ! !0 0,0PC g?#` ǟ$Px!0,0J !P P, QPC k?#p ǯ$Px!P,PJ@b! @d8Cb, ($ǥ A$ @Ip `B- pSy C b!i$H` X 0 H?# c$`C UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14w1i$0H@" 0 M@ " X D$ D H&8@$P!B !f!pGwC@h0p$ H !b! !y" Jc?#P$#1h0P^@C b!i$H` P 0 H?# c$CXi$0H@X 0 M@ X`XX ,$ , H&X@0@JH$h @$PX!B !n!p/wpC@h00$`XH !b!`!y J k/"0@h8@CH$ @0JH$ @c?#P$` x`8R`C !$a0C b!Pi$ H@R $ ( ?#(cD$`Ci$PH& P U@ &`X L( 0L P*8@$P!B !n!pOw@C@h0$`H !b!`2!y& %(@P0pC0, q AC Pi$)@ P(q@CXa$HY P8@a$HX` ,P8` B C !f!P$ g?#qRJqi%$JH`@n @` n # Hl!@H$@d9C Ph%$)@ P@PX(8C!B"H`Y p,~0WE"/ "WE"/ "WE"/ "WE"/ "WE"/ "WE"/ "WE"/ "SE +pJ $XaC$ ,, c,0#CB`X !$2@ ?#/ ?#/ ?#/ :!+J,0@C$,B Xa J P`$X(aC@$0,,@c,(0 H"C$IB`X $!x2@ $GI"/ $GI"/ $GI"/ $BI +J,0@C$,B $X(a@"J $XaC!,,P$D~ C"`EB`X "!2@P "WE"/ "WE"/ "WE"/ "RE +J,|0@C$,B "Xa J@h%$JH H Z!!@ BHc ! -ZP880C h%$ @dx@!@BfpH @.0O"/ fO"/ fO"/ fO"/ fO"/ fO"/ fO"/ fK +pJh%$JH`X X! a@  $,c0~F  ZP1  BC h%$p @ nYH8PC o?# ǿ$Px!p,pJh%$P#JH` P @` #@h%$#JH h%$ @~ @ z  ~! Y-Y,P8@ H$ @!8CH^8Jh%$`CJH`F h%$ @f @ @ b`  f@ Y0, C`Ch%$pJHF h%$ @` P @ p #` #h@i%$0@JH@A X0i%$ @`P -@ d # - # i$ E@ "Dq`Cqi%$ !H #| I@ |YPX@qi%$ "H 3| , |YP x!@XUb(0%H@Pb @  , C Hh%$%@ H HXP$8PCH?# HOPN!,HB!J h%$ @ D@YH8PC E?#0 $PN! , J h%$ JH"  # @, 0UP Ѕ8H`x0 b0p<B`0C @@! (@ @@$!p$Ga! B@H@!PN1B@CR0B@W @R!!H`X$`0@D H:1  H!H # EH PR@PX P( (  "!( # R@X H @H  (!H # RX T pT  .!T #RBXR`p@AD  lBlJXT8`CR0BG PU?#qX Hz |"@ < B<J a! B80CJBL8@Ha!p"H` N  H$ qCX0 BX pCP0 BP(PC0 B00C ! kpJL B0 C L$PH (\q0C?#PW~F(P2 JLTBP0 C TL8$ ,0<9q`Ca!T$H7?# ,$8l>0"C<0( BPp0@C< @`p0 C@< @Ap 0C<@ @@ 0CH<@ @H0 0C  $@PJ *4PCP<0 B@Qp(0pC$Ti@x" J`!0T,`2D &H @00C@$(@@$@ !a3B @$ @!@$@` H&` #2@CT$@0C.PW~F.T$. xb .#\ ( ~ P + k(Q"/ (Q +JH*8@C .PW~F@ *8P #BAJ!Hf`!P v!@ H PCH !0 , f   X!(,@D ,`) # `X!`iJ !0,f(  !0H"@b(p!B&Ha.3B  *P # C!0L$ aL: ,@PY!d"@D U?#0 x,v yf!0~FP C !, z  |!  ~ a C   0D4,E @! B# \ x"yԀ4Cn!BpK(g C$$@I ?#P`,a@8`CX,\  @ iC + `q- $ T TiPC T, pq- $ T Ti C T. q- $ T TiC T4 q- $ T TiC T6 ,  T T iCn!d @I8p(0J4`CX,\  @ i0Cn!N @`qKJ n i` $p@uiGq Bl,u y  AxBx,PH@8p@q 1Y8pC $ HH  A @Ƴ$JPB(@J@ + CJ !`,`Y $H"@`n!, f$|m@Yh2 `9Y<X,( P\@ , @P$f( 2p]@Ht8 d,RS P!q # T6 | #U. @X<X P2 @!PB c(Q #HZ `iY&Y0C >#@{!X@X H0=H C@$H` A! ia@! $X `!Y' l0 # D&0B"@ D `0Ba @!$B@X0 ,@C  F h  @O h,p0 0#  600B@G UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14@ $I, y;<qpCpd,rH  P!T,  .p q) s.p|@CP!T,  .@P q1 S.p@C@P!`T,  . q9 #.p@CQ!T,  . q! .pD@PCQ!pT,  . q .p@J؄h B@0C $$ !HR  qC $$ !HR  tqC $$ !HR  xqC $$ !HR  HqpC $$ !HR  pq@C $$ !HR  |qJ !P,Y  @Q"@ (v!y k?#P @p(8J !,@F P!@?#~F@@ Xj- @ hY`;ِ< l qPJP( ~F jM @ hY;< p EqJP( ~F jY @ @hY9i<@ Є4 qJP( ~F j @ hYP9U< * \q0JP( ~F je @ hY;< x mq0Jf!0~F1J$ BR! z @pJ@W@!  !t t, PC;?# H:Pv!P,Pj!J@ $X@ !q H @!` (LB , Ub,  b !PC A?# $PH!,J, U (incomplete d-tree) (incomplete l-tree)  N ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]INFLATE.C;1̐үS y{yg; <I k   >0 ժz!yy}&{ ȩ%b#x? rʪu1/  mkm}k{}{zzլ{%~~p-~q{~ pzzz w~lp ~  ! (## g%ȭ%ʴh|&%/"yy¿#B .#o¿#B .#c,T#¿#B .#Th |h|h| h|y"{/ {ʴ}h| 1u z!s}ph|h|P0|0|)}{ {yw) fp}hªy x w }0 ##B gs##B gs}####B gsdO d? {%խ>g  0  ~ ~0/  *V*V*>#0~%# ug0 jg}gppppe0pt0{z.P gȮ#i}@}(xy y:H8Vr8Vr (t&>0////0.1%z qq ^! 0}ն!ս#r~s%#}r#r#r#r#r#u}//////?~!e@@@@@{.!h 6?   u k/@%. UINFLATEHP C S7.1-012inflate_codesinflate|inflate_free|huft_buildhuft_free, U.shstrtab.note$READONLY$$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]INFLATE.C;1GHUFT_FREEHUFT_BUILDINFLATEINFLATE_FREEMASK_BITSINFLATE_CODESOTS$MOVEOTS$FILLELF$TFRADRREADBYTEMEMFLUSHFLUSHDECC$FREEDECC$MALLOC  3h 5T??J0/R@>_DiwDZ@UQUDZ@UQUn'''@>9'? 'T'' Ue e e '____ _@>(_0_@>8_?@_8H_?P_TX_P`_Th_ Up_p  1 ` BIII2II IB I I I I I 0 `XX` ap IIIBIIII?II Ir#I%I"(I(IB)I)Ib*I?*2+I2,I?,,r-I-IxKs UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14?OR.I.I"/Ib0I1Ib3IR4I4Ir9I?:I?;I;I=I=IA> P> >IB?Ib@IFIKISITId P U#X/-Y4@GpxUe]e e`ph$  s`Y hx ` c`@c i` `c0li0 ih k lO#V1.0QELF 2L@@0 =a 0.a0"a0)a;@`$``$++p,,IPF/VMS29-APR-2009 07:1929-APR-2009 07:19LISTV1.0IPF/VMSHP C S7.1-012IPF/VMS %c%d%%100%% Length Date Time Name--------- ---------- ----- ---- Length Method Size Cmpr Date Time CRC-32 Name-------- ------ ------- ---- ---------- ----- -------- ----%s ("^" ==> case %s conversion) %s %-7s%s %4s %02u%c%02u%c%02u %02u:%02u %08lx %c%s %02u%c%02u%c%02u %02u:%02u %c-------- ------- --- ------- %s %s %4s %lu file%s --------- ------- %s %lu file%s StoredShrunkReduce1Reduce2Reduce3Reduce4ImplodeTokenDefl:#Def64#ImplDCLBZip2LZMATerseIBMLZ77WavPackPPMdUnk:###NXFS@H !`8 @@$@Hp<B @!b@} 8! (0!PB%@@ HX p c` D B(`C$ ,¤ @!D0 B @AD$@( Lq  "PT " -Xp -`pC$!H`PPB`X R!BB0D!  , PX@$ pp $0 0 ! B#@.!BX!Ph!B 3 R!BhY  , PX P$B  T BPP!B 3 X!B`PYPT  ,`ZP T!PV0,@PY R!#@ D!@0(P`H $` ~!hA$H HZ HP88PCH$"He P!!B H !Z B@@JV HH$HB քef hZ0dXV"p $ $H \!P8BpC$P8B0CHh$H` Z $P880 B  CH1@ C Hh$%@ ZX8@C$Ph$B` @Ph$HB Z$P88 B  CH1@ 0C P@!0 8C P0@!(  hxp @!0B CC !X A!, 3 d!, f!@#B`XX AXD@@Z  ZP8B0C 0@!0 @4%(@ $XF8CH@@!0B H$qC !P0A!, 3 d!( f!@#B@PX AP,@@Z  ZP8B0C @@!0 @4%(@ ! HP@!$  H$F $q C Ph$)@ Zh8CPh$0H c (!E@` "! D   Z$0 -P~!p 0C$BP~!(@ @!8 8`C @P!@#",@cB P# ( 0 B@ Pi$)@ P`PH ($ PH($@PH-L)@PR X, @-B`bR , `LX@@R}$, QET)`8h$PH ( PU@ (T0 q?#P( XBp!P 0C % 01 3ȵ$p\,q.!` a ft `y 3hB!@ ,Q@$H!p@`c@ m @lt y <tB <!@h$ H >XP$0 ,e !0$@  @! BP@h$B` H rG8pC@8h$2BB @1@R @ , @X @ #B @@$#@ PD$)i`CX@h$H 3 P!-@ ",  ,,P ~!u9@C$BaPH@$0,@Y b!ħ~FP1i&$CH ؁v @ v0 , CC$B@ $0 0 Yt@,@`,P~!H !H`p, tH @@PtH@ Hx$-@@Y`,@ $, at00B@X !PA1B@R!p1BP!,,CH "L0# ((, *Y0#a,.@ B`er!B(0BPvB`X `!CBP D!  , v8@$B@ @$0 0 @H a[?#`,PtH  X@!0B@Yp,@!YHYt`lHY $-0#@R"0,P!BP!B@PX($PvB`X `!CB` D!  , v1i&$!HƤȁr @@` $ ,  d!BPr H@ !B Y!r!PrB C n!CB0 D!0,@@XrHV`hB C D! HY0, H i@0 ``@!H  Ap q ɨ! n!, YP UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14^880 B  CH1@  CСi$P Bd Ёt 0 8t @ Yh$@ vppCYh$H X h @ ,P88` B  CH1@ pC`X!H H\!P8BJH@i$H %p@ Y?#p  pqI j!`I f p C1i&$H 3 X!@bLH  vP$,` `!@0 `D!  ,`v` ` ~! #$BYP!@!!H` `!2,@@X D!0 ``@ $B@@!H PAPaCL!BP 0C x% 016ȵ$,^!x`Gx  ft `xy 3B!@ ,Q@$H!p@`c@  @lt y `laB l!u9@C$BaPH@$0,@Y b!ħ~FP~!bLH($H   h@0 BAB` , CCP$H 3 N! 0 PP~!H0 X!H^0 P$`B(Y b!0 B@XZ!B PBB`X `!BB D!  , B@$0H 3 N! 0 hfP$@B`(Y !B ~!P!B!0,@@X `!2, B $` ~!H1Ci$H  i$`@@HRH@H l0 p l!B! $HPtp q  tppC $ $H H\!P8BC0i&$H # `! @  P$,` `!BB@@X D!2, @ ` ~!8H1 (qB@B,x@ ,h@ ,X@$,H@,8@,(@ @$ `! pY 0H@ p$00 DHp" !@@`pbx x! #`yBH F8`!XD #P88B (!@B C@$0@ H % @P $ #H @N!P8BC$P8B CHh$H`0 Y $P880 B x CH1P C Hh$%@ YX8@C$Ph$B`0 @Ph$H1B Y $P88 B x CH1P  C PF!0 8C P0F!(  hxp @X!@B CC `!X G!, 3 R!, `XV!"B`XX GXD@@Y  YP8B0C 0F!0 @4%(@ $XH8CH@F!B H$qC `!P0G!, 3 R!( `XV!"B@PX GP,@@Y  YP8B0C @F!0 @4%(@ ! HPF!$  H$H $qC$BP04BGC h$ ,!B @   (R%C Xa$@ XV`XY XV! P 8PC${HHP0 8c P8 @pU ypMA818`C `h$@ XYh8CPh$0H c !0 @`6 !    f Y$0,P^!p PC `!  `XXiC@x@i$ H6 `YPX@BB C @ B0 B B PXh$)@ P(ppCXXh$H X X , ,,P88 B x CH1P C0L!H FN!P8B0J@Xh$0K7XV 0` @ XV`XIH V8 CP0i&$ H  $)@&Jb ,bLHP$,` H!BB@@XD!@ A0 `` ^!0 #$B`YbP!F!!H` H!2,@@X D!00 ``@ $B@$H@F N!0 P88C0i&$`"H  $0 @&2bP HFP$0,` P!0 `D!  ,`F` ` ^!Bc@ 8Bxbp@TB ,h@ ,X@ ,H@$,8@,(@ @$pUdh  C,B40JD  @4PC@A,"p@n`n @ p@1 `v ` RpCHB  |)  ?#H $ P @1 (A $A X0 @4a @h4A @(A @,A @p8A @X0a @4a @h4A @P8A @0a @h4A @X0a @P8A h6 P(PX@  |)`HD ~Fi 1 x$  A <A 0   Da B@A @A FA 2"A B @a Da 2A FA Fa BA @a 2A 6 P@PX P PX 0bhCB |) ?#0 "@   0 "@  0P1 A pA : a Pa JLA QLA aRA RJA :La Q Pa JJA a2RA Q Ra JJA Q:La 2JA `J6 PPX@ |) ?# "@ B  "@H  `J1 A A j  \a {XA XA ^A VA kXa  \a zVA b^A  ^a {VA jXa bVA z6 `X  XH=H A @ h$0 P!H` !@PT!0bLH  X! H @ D0@FP$0,X `B!0BB@X X@!2, F0 `0i&$B C X@!  @, D0  ,@ E 0 ``T!HU  s9u8%03u(null)K ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]LIST.C;1T z7O,N1I2`%Ix-O?/TA,*!`.|MG|LCA.~.{0 P0iP0h0O00O 0!0R  ֪ڬٳ)an0~iR.P&00#h }}}'x9 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14^DmO}^}}$?}?  ao0an 011jhw֨&} }@ fffm,T@P0iP0h0O00O 0h@0R 00h?1/o@~& 40  y˳d>i  Ƿȫpo@%.pp,LISTHP C S7.1-012list_files3get_time_stamp3HratioHVfnprintVX,p,.shstrtab.note$READONLY$$CODE$$DATA$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$.rela$DATA$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]LIST.C;1CENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGGLIST_FILESGET_TIME_STAMPRATIOFNPRINTCENTSIGMSGENDSIGMSGREPORTMSGELF$TFRADRDECC$TXSPRINTFDECC$STRLENDECC$MEMCPYREADBUFDECC$MEMCMPPROCESS_CDIR_FILE_HDRDO_STRINGDECC$FREEMATCHEF_SCAN_FOR_IZUXDECC$__UTCTZ_LOCALTIMEFIND_COMPR_IDXDECC$STRCPYFZOFFTFNFILTERDECC$STRCHRDOS_TO_UNIX_TIME  0@Pbh do ~`$+`!2IXdkti'L'i'`$'+''p,e e e '____ _`$(_ 0_`$8_+@_@H_+P_p,X_X q0@BI28IIBII"Iq rx xII2II II!I!I"I#b I`$ I$ I% 20 I IR I 2 2( I& 2( 2 B I&2I22 I&RII'III"II`prII`$BII222 2(I&12 22(BI&I2 2I&2IIBIaI2Ip  IIIrI II!I!BII(I"R I)!IR!I!!!I`"p"r"I"""I#0#B#I+!+B+I'a+p++I+,% %H%p %7 p,#1* 1@4`1;@pNp`\8d9 l``1x=` `06`P6t>` `60`>0 >  ? K`  UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14|!P#V1.0%ELF 2 @@0$,0)a0!a2`@`PXP`x-IPF/VMS29-APR-2009 07:1929-APR-2009 07:19MATCHV1.0IPF/VMSHP C S7.1-012IPF/VMS ! p, (B!`P09B ,@ H=0 X!b"f0CBB@!x@F9`C B p0C $,hH P@F9C @ p C@$@H@B HPX8C X.rPC P!+,D( CP(H H@H9p- r`]*9FrpPC P(H (  H(0PJ P!x(8C BLp`C $,`@!P8C H 0 8J@$h@$BP(! HV! P@ B@H 0 2 @! @HD8@C($ B  (J0 P8pC H$ H(, H HX H( $ $(PC J 08(pC H$ H(, H HX H( $ $(PC @L (B8PC B 0 (  C HD HPX8C`8C X$ XD, X`XX XD , ,(C 0J 0L8(C $ $, `X $ 0  (C @D (B88J0 8BH @X@ HXXP08BJ@ HXPJ , X8 (JXL HXXP08BJL HXPV! ,HB HXP08BPJ0B H0YP0J , XL8 (0JPD HPXP08BPJ0D H0YPV! ,8H$BP V!0 8BX @lG9C (Bp7 @0@PB@hxM9fk)!`(Y  08C@8 CP!X@ XL.r CP$(@`t90C 0H  " 8J LJr(@!ph%r L1 BC D"p&8C @R r0CP$0 HRPL%8@(9@CP$~F 8@)@PL%@ HhPC $`X0  ,XqC $ .`, .X `. p\ \(pCB g (H0@ BX$P08BJB HXPV! ,  g (H0(@ @B @!,@89C@N8!(@ 8@ @iC `h@C $0L0  &LqC$P, (@P @P,RD (  s shP~hP&> 02~0SQ"&pp? `p PnPn0  &s&~&z 00 k#@ v s  @@0@@ /P.y0(@%.W`MATCHHP C S7.1-012match`recmatch`"iswild"$,`.shstrtab.note$READONLY$$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]MATCH.C;1DECC$$GA___CTYPETDECC$$GL___CTYPEAMATCHISWILDELF$TFRADRDECC$STRLENDECC$ISUPPERDECC$TOLOWERDECC$STRCMP  1CU`[Pbmyi''`'P''`e ee '__`__` _P(_0_P8_`@_8"I`I`I`II` p       P ` I2IrIII7 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14g7IBIrII 0 I I I I I` I`@ A p  IBI    RIII` `#-4@PGpHU]0 e`q(H ``[p` `p00   x\R#V1.0ELF 2г@@0+a0$a0 +a0 ,a0 )a0 )a0)a0/a@`?x?TTp[p[^^PbPbh/IPF/VMS29-APR-2009 07:1929-APR-2009 07:19PROCESSV1.0IPF/VMSHP C S7.1-012IPF/VMS unziperror: cannot allocate unzip buffers %s: cannot find any matches for wildcard specification "%s". %d archive%s successfully processed. %d archive%s had warnings but no fatal errors. %d archive%s had fatal errors. %d file%s had no zipfile directory. 1 "zipfile" was a directory. %d "zipfiles" were directories. No zipfiles found. %s: cannot find %s (%s). note: %s may be a plain executable, not an archive Archive: %s warning [%s]: zipfile is empty warning: cannot set time for %s Updated time stamp for %s. caution: zipfile comment truncated There is no zipfile comment. The zipfile comment is truncated. %s: cannot find zipfile directory in %s, %sand cannot find %s, period. [%s]: Zipfile is disk %lu of a multi-disk archive, and this is not the disk on which the central zipfile directory begins (disk %lu). warning [%s]: end-of-central-directory record claims this is disk %lu but that the central directory starts on disk %lu; this is a contradiction. Attempting to process anyway. warning [%s]: zipfile claims to be last disk of a multi-part archive; attempting to process anyway, assuming all parts have been concatenated together in order. Expect "errors" and warnings...true multi-part support doesn't exist yet (coming soon). warning [%s]: %s extra byte%s at beginning or within zipfile (attempting to process anyway) error [%s]: missing %s bytes in zipfile (attempting to process anyway) error [%s]: NULL central directory offset (attempting to process anyway) error [%s]: start of central directory not found; zipfile corrupt. %sfatal error: read failure while seeking for End-of-centdir-64 signature. This zipfile is corrupt. error: End-of-centdir-64 signature not where expected (prepended bytes?) (attempting to process anyway) error [%s]: reported length of central directory is %s bytes too long (Atari STZip zipfile? J.H.Holm ZIPSPLIT 1.1 zipfile?). Compensating... End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. The zipfile comment is %u bytes long and contains the following text: ======================== zipfile comment begins ========================== ========================= zipfile comment ends =========================== XIB@$"HPZ!@bHĦ $0H 0i$ B FB4"(J `@ HP(J`@q h LP,Q$I8C8$0`LHD x$p0 `0x^Hu" `B`YPF0B C $0BB xL! ,8 F`@$B@ $pH  ,$@0 "H` .t0 `#H`B 8h$(XF`B` HPD#X HP D( "\#Tz " \(  0G0 D.Pq4: h:p\p:B \:p+ :0  pL( #(!`Bt` -8p!h$ H5r p\pYP0h$p@q h  @ #C!G!p X8",%XL pP(H0GV`` G$q 88DqdBx@0X@Y@0pX 9@` `Y@!@0i&$H C pR! I@ Xx` H $@X $!K2, $ ` Z!, P009 s @S8x! H!@  @P!@$B! 8N!X@pB! 0L!(@ (J!8G0`CXHH8 B8HH @@ L $s`10 aKp`Cp!h$ H5r p\pYP08B@C$BP08BCF!0H@ @!"",0C!F!@aLH@ !h$", x0!H2"@H$ @_?#P bP"DB C \!HB Y,PBB C $BB0x@! ,H B`Z!@1h$ H 8!@BP09C@$9C09 C@$$ Hx@`8! 0L!H@ (J!(@ H!h0 F@p!h$ H5r p\pYP!G!H@4 Z!",Fq  Fp ( X !pqM8p! XFp=q@8CPL s p8PcM8(aE UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14; aIpIL8C0i&$H C $E@Hx` H " X "!G2, " ` Z!N  s ()Lp"ki8a MxpCH$H` a$$0 `0PEH pB  Cx^(B(Y\!P$,  xB!00 pR! ,@` ` Z!H1C$HĤ 8H90 0 D@@ x$J@ CH!  Yx^$B pP$,  xB!00 pR! ,@` ` Z!L1C$HĤ 8L90 0 D@@ x$J@ CH! 0Yx^$B pP$,  xB!00 pR! ,@` ` Z!N1C$HĤ 8N90 0 D@@ x$J@ CH! 8Yx^$B pP$,  xB!00 pR! ,@` ` Z!P9C1i&$"H $@  x^ pP$,@X xN!00  pR!BB0@@P1C1i&$p"H $@:x^, p@P$,@X xB!BBH A0 ` $` Z! (L @*@H8C0i&$"H $0 @  x^0 pP$0,  xN!0 `pR! ,`F` ` Z!P, aP ! 0b  (!"HP$p*HJ! P J!H @@ B Y88@Ci$HPB B B  h%$0 @ 00Y88@C!h%$ HPB B B h$0 @ 00Y88@Ch$ HPB B B i$0 @ 00Y880C$P J! i$@ 0B0Y880C$P J!i$ `H@ H B #  @ 0B0Y880C$PBB@$0H@  `!iJ U0 XQ0H p1h$00 p!B5rp<B p\@=B@,} !BP8B@*Cp1h$@H` $@0 5rp\0 @,P8B)Ci$K@ !0 @ 0$@ @ 8" BPD8)CXi$H X E@ XXD0#P88 C@$+@$P88 C@$$+@F!`H  i$0`", qF (` 8 HD8",`PX 0$@ 2 $ ,  h8D0#0,$C0i&$cH`B x$@Q@6p& Hp (0 ` ,YPD B C xJ! BB0pH!,@X D` Z!(ah$0H(J 0BB (J ",00q a* 01B@ @B8!pCpAh$HX x!@ p\pYPpAh$bH` $@5z B p\ ,pY ,P`h$H h )@ @( # X 8 CXi$ , X E@ X`XX H, Q'~FH",iP C ($P0  $Nr@C $#H(p$!P88pCi$`H@ %@@1R $ $,`X ?#  B0H$ Q%@Xi$aH`B i$-@ 2& @Q@@ XD &D,`XX X," , @,((@@$~F@I p1 0 88 08 @$ r(a P(A bA r A X, A @$a b(a P( A r8,A b$a P( A b@$a 8, A 8 P4 t $ *U @xD b^!CpAh$HX p\  ,Ph$HŦ $0 @5rx^ , h   x^xY,PHi$0, hH p@ q  CP$@Xi$0, X E@ X`XX , Q~FH",i@C @$0  $Nr@C $#H@p$!P88pCi$`H@ %@@1R $ $,`X ?#  B0H$ Q%@Xi$aH`B i$-@ 2& @Q@ XD &D,`XX X," , @ ,(i$`H* `Y@ p*`X `X,pYPx!XB !BPZ!8@ h$a@ 0D q@ $`` 2!@Rh,@)]9@8C H$0 ؀h$H` pAh$m@3p\ HX 6 @ : ,PpAh$bH 3 @$@5z Z!  x^xY,PHi$0H hH @ q CPi$H@1R X ( (, WD(i0C "Jr@C $#HHp"!P88pCi$`H@ %@@1R $ $,`X ?# B0H$ Q%@Xi$ aH`B i$-@@2& @Q@ X H & H,`XX X,$ , @ ,(i$`H@* `Y@ XJ8T F,,BA"pX,Px!XB !BPZ CP$(@P!pC !(q-!D8CF!!HE 0G", `2 `q@C0h$HC 0i&$m@Cx8H36 H@t<l,8 H>lB HYp^! BP8!B 3 pJ!B@8Y , D PHD!0(H 68 $$+@RxP!,  pH!P$#@$DB R0  ` Z!(1i&$H@(J H %(J0 P$P,  xP! 0 (pH! ,(J` `Z! @@i$PbH@ $@4*D 0@Be @P 0 a(J,(Y (J (Y J  0#P8B CH$h@($0B % H*HR P2HP@ D H* Z!@ # ţ (!$PHR @@  pJ @ # Z!PRHHR P@ D H* Z!@0#  (1$PHR @@@ $B@ h RH@4(h$P$ $J Z!@0#@D(J P$ $ Z!@0#@P!F!0@H@zR&6JQ1ޗS,C,>;i‹9Z&֨BMrl+ /{:]B@xthE h+g[8"f0ۺ?o-25V;X"%~NxGKA:LcI޷Գ/Kvc:gYײ6YLgcz'3% `$S%mkSAG ЎPxjQ_c}\`;cp'g:,LVyS%YnJ3 ]LVCݩD|Ѕug BCoSU `gg:Q OWukԻKT&QO?sGѧf59wnF{a="}?.$HH:FaB5jMR"fqǰׄDqL_@T!¡69Lf]#Qh`8'<Țt;b#_֣^E.R:mο'/1O&Miz?)9"͙[H (ʯߔ/{F% ~p/ Β}E@}R4J=ic> )H-Qv42~*J)]gG-VI+4 C=o >r+M ~)A.eD/̍tt'vLk~@lhx-9$/&y @2Pr-ay,rp& #(LHyV<C$at"mmwogBFblZʩmuaVfP EFt].)bv_B2E،nX|hM0GRYJ3 !CVzw[OWKR#Ye}^fXwR@<$-5^%*oJU,>‡C]Ka8s \IC>}P]mB V]slU}XpxN6FtK[Z_H)T-MO3Jus=B5HP`|`S o@YT Dt2i5 L'AaqANTOc^.,@I |INA]H|%E׳ (tm|X?J,sXOq`&5ZVUQ(X U:ݪKN!6z/P31 QF}]ww}cQ[ 0*NbU#KMdZM4eLFXI]U/ T, GYzRF xzCXt6;/Դ^`X3$LXpi=#we`n=п&p5'(FR rsPAH`0*CdduC1 y尠]|by(aH9 E4턉pAzb.0ʹ!;C.(_'r2;!y :=, o\nӪ @ VqLX:I\HqHH;+ W(E!gkdmO8f(Nt$!R;M{#n P"ZAElΒj* MYC])FaI/gЈzM"zT H GbLjm? PMȭC  g۴|^٥IzKAerJc}{Lhm9Q̐<ݪ~,¥ We @8bW˂0!RUXIH.xƊaIXs?C/@S" jXK | &1SArXb<],J#3lh(Vp_̊DݕWʕ_CU%N9&ib.#(.2OPzf/ t˖ 43ctJVcɛk'@B]{!zrT E* ah$4 h\) Ƙ3_l]:<70s0ЯuhL@- 5l>+cެ -_ぜSR_vOHe jb7.1,\r^y6#r~c^oj?20Oer~{[Bvm7|g{ 5pcBf%بP?-Ox5fw"UOpr}Jl,`ߓqw5 rۡG0jutkq\ 1bٮQ`;!ڊ!-vfԻ[8J#m jE*uV@XWfnձ<6a@gl I8SD sJ=aE>(gUwPp#=@.Uw]tB]TzWJp; ]me]HmKZ?Fo;r"8'Ҋ+I&|.5nRrvu=u 2a.u!9MjdIK9N] @|G)vUJ {=ݮO}7&/F`` 6SG+'u.fj5[>:B2PY1+te7. 'x>nT̡TIm!Elt<N1NG?\mY_Ap0iV -S;%Crgffc"W8%0='C5N:Td.Pylg s 0D%t5AecUQkBtucWX L}X-BKeʀh-9ѹru~nk)rhK{CGx{Og`Í W>a-:4iS,j^}"d-x ps{a&ڎKWNRG"ށFc{P:q r=Zo #5߰QoGiIy5|$쐕i'q0{ދ%=}35Cs>Oo.pj3-sA$-bR$Ry5sB/>a,/< 2zBePY4 3'h49(@Tqsu`W+4C?*+gy d;hں D Cƕ ]r/ I<l+0v@!lbWθJW,^PA=@#s?tƓ/R2iqen#1oDC. t>.=nMc_xeY <FuT G7uŁ)8<4gFmg9$(Mxg^+gB\ Lzr{HlZ*i> >v#ђ =8x\^! Ct0I+FSdO1vAHc9]7CLuqn]@6%4*8hJr>1 x{)7NhJ@؋rpX5K2%2՚sUy]Ik4X'g plr-ZMG$!)gfX3'27XElj 'Y&C;)ڵ_BY6`r$fDG=6DN- H@#옞hzZݾ(Ê z!!z`ѬR!vy.H2QMM9\)Rj_hHYz{0 T9!bɈzGSrk^l$̡5ozX$$4np_;O Kc{HӰ~^>g >6|ph5-er|u()\2IE.Qf_0kG<}Oyr/ИCr Eu^deߖ=/ie ,ݓR?msiP$B< kqyVn}hB Y26_m J`ՈGJR0NT.Eu_L1SP$-N@(DD̄flJ[+gN]*k$ޕf;_edVf6)67O/`g ɕx+Ph\|irL>eo dlE>V d5Y0jsL t,,cH"]P@C!E^$A-x2aRj=Ocm-?)6c.w-w٨:0=G~Cm#<դacp+rh0O[@dc8b _@vA4ey+ٓ`rqDi`htI LbeŜx5.POXQW41Br,@#28D) )H$30 `o| T 4#b\61k1j!h@ytT s`|>JiXP:Aģ Z$pP !j5b[3uGcX025i`GxuٔfSDPF!f,@c@@ajiw| c46`jB"_wZX >l6:T.-tCû@dq(EJ"#  P!fh_A3 Ge?z .B(~YtI&ì` $5F07s&WtH J1PHJ`t'0L^cWAa:<? X/yahb9e)So0`[Q9@>af5Ë&!K,@ Q|$PB@g J+  @ .)|,j,0/*CN`H/0K0p gV%!P ;@ ջ6Z`;]a#R%>ų}qU)p!h@dN!y!ū!!%%.xiqϯ]' * M>a !D!S[(B?ԒME;g:"GQP pK~JA!ق+&s3W(Cً}W}d \+ gs Aح/"bR ]!r4+ |A;SSIN=CH@YhK#"c.B9nRVBMR@A%Yl)q2g;ߗd#\Aƅň =rqM;~9Ga[rk.'Q(u"|0R8es&^'#|X]s!"cA? 0.Ռzs:C6^Y;h+7Z.X|>x9Oc;|kZ_О:(H B&0Gﹰb$Pj PL=cT_ ^qUҸ?d`ۧEgR9XPyܶ8 K`퍽";~V>rTu*+D#^5r ?[4"U>;>˂M+ Vԓq/r ㇎~1S UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14 ,  H PHH!0(H 60 $$+@Rx@!,  pJ!P$#$ H B D0  ` Z!81i&$H8N HN0 P$,  x@!BB@X pJ!2, B `@$B@pAh$HX xN! @ i$ * H pYP pAh$@0# 3p\ Hb Z! ,P89@ # hC!B!@H A B@0 (C"%@`P8H8@CP0h$H@B 0i&$)@@BxH`P HD$(,( &(B@Yp^!pBP(!B0 $B(Y , 0N PHL!0(H 6( $$+@Rx@!,  pH!P$#$0L B D0  ` Z!81i&$H8N HN0 P$,  x@!BB@X pH!2, B `@$B @ $HF p!@0 xH!P88CpAh$pB~F 3 (h$ @XxN!P @ p\pYP pAh$@0# 3p\ Hb Z! D,PZ!0HC$0 @ @0@ P0 C !B! ( HCH(@H8@CX0h$H`B 0i&$-@`x" HX HH&,,( (,B@Yp^!`BP8!B  $B8Y ,  L PHH!0(H 68 $$+@RxF!,  p@!P$#$ H B D0  ` Z!01i&$H(0L BLP$,  xF!BB@X p@!2, B `@$B@ $#H p!PB!p q h 1C0",  q1Y8CW! H0h$H B 0i&$%@ xH@H H@,"$,0 $$B Yp^!`BP8!B $B8Y , L PHD!0(H 68 $$+@RxF!,  p@!P$#@$D@B H0  ` Z!01i&$H(0L BLP$,  xF!BB@X p@!2, B `@$B@W! 1h$0H@A X0i&$@ @@RH H-@ $@, B B x@,PP!B@ $B PY , @R PHP!0(H 6P $$+@RxF!,  p@!P$#%@P@B H0  ` Z!H1i&$HHR BBHRP$,  xF!0 Hp@! , HR`@ ` Z!(A$@B1B pJ P8 D8 C@Ph$0H PT "@PPT B hH8pP 8@h$PH  P%0 @E*PF B hHT8p!#7@@h$PH @P "@P@P0 B hH8p@ @$PH  P @gp!P(J B hHH8p(!#7@H$0@1B $0$@*p!P(JBP" HpC jixp@h$H@ @B`Z 8%0#009(PCh$`q "0C i$ I@ ($ h$0 M@ &qPCh$Hq(0C i$P U@ (* h$` Y@ ,pPCh$p.0C i$ a@ (0 h$ e@ 2ȨpPCh$p@40C i$ m@ (6 `h$ q@ 8pPC`h$@p:0C i$ y@ (<PCh$@p >0C i$ @ (B, `UeXH5H@` $`8 @ `$<0 xP!<BP8B0C @$p q@ $0B a I!00B  H`ZHĠ @ `Р D0 D*0L p"@`@ J# AN H 00B@ X   Bdi$PT!pBH  XL PH 0A$P0 B *@`T BHP$@ P D*@@ 8Q$P$@ P F *@`  a$P$@ P BH`T0i$P$ $`: T!@0#@D B pHP$ $`" T!@0#`d D @HP$@ P B0*@D %P$@ P DpBH@0L P$@ P F@H`$8N P@ B H` T!@ # d H P$@ P N P$@ P H Pi$` $ @!P* @ PJ!@$ H 8a$00 @ D@@$:  @  8N8Y 8N! + Fb }!p+ NzXDN B H@E$sC 8N!,`D5C$(,  X$@x ``xh @@. pBB FNH@10C A@. pBB N h$  @ D@AX@0(8C 8N!P,p*9XTr@a @*pG8PC 8N!`0  <-,"`YB ZN8@ 8N!0  |1,"Ŝ2/&B: @!i@ Nh q!`N lN , `! H5H@` $`8 @ `i$<0 xP!<BP8B C@$@$0B a Ai$ 0  @PH`$B@@  F# aXJ pH`D $PT!@BH@d $`H`()$rH 0Lp2@`d H @#Ĥ P$ @ P Fp2@` I$P$ @ P H02@ (Y$P$ @ P NpHd"a$P$ $` T!@0#`$ 8N HP$ $`* T!@0#`dD P$ @ P N PFB` DppC a$pbH i$@2@d:B 2@ H Y aH!P", NPB0( B0  @h$,`` 0L!0 0  LHUb@H1qQ@8b@0C $iC$`K g F$BP$ H01 T!0 @X!PC?# B@ P8 D4CN90CPi$@HDP %@ P$0 `(J8Hp,`CX$ H X p@P i$@0# B Hi$H 1J P $0  PPp(G8pC$,8X Pi$H P %@@ @$0#  Xi$-@ XX pPC$,8X" Pi$B`0  Hh$%@ HH qPC$p,`:8h$P8N B ND 0 H@IC?#@D 4@J, HU xM$B@!f@% @8pBQ@8C`8(qFJ0xpC ($piCH!qX%tP`P UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14$Q4|F JxB@h`80$B m)8$ BP$ HX1 b!0 @!PC?#B@ 8 Z4CH4X9PC HT$`%qC PT$`)qC XT$`-q0C$ H8$!@N8C8$`2@@XZ8p HdR1]X@8C@!@ H A0@ 0& 01PC $hUiC$ +BP`!J @)H 8X80C@F!0C0T @ @! H!G"/(@ 0M,"C HL, $qC `(!hipC$@P$(!P J q` b! qH@x!(@ H(@ 0M," PL, (qC X(!h-iC$@P$(!P`!J q  HXp C0M,"h@ !H!G"/H@0M,"8@H $a`J(ҪYJpCP $ H40 P`!J B`0CT B(@ @!P$ HD  G"/P`!J q``1 b!q`HHp C0M,"(@ HZ HhIC?#@D 4J@L!(@ @!@XxU (null) Empty zipfile. s wass were ,N ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]PROCESS.C;1⳱T"# љ, pwt %"r@?B?sqF?E?E{r{@@;;AME{@z`((vs t000jmm .@#q0}p0ox&/t}(/  uũն?00 0}0} u t t t }{! kkkuv  uzynB , v" g}zv{ z{(z~zz@0A}ʴ2}{x!g10.A}}ʴ@ }sz_@}Ai@"mmmOm    0֦b  w w w2 g#"%""#%9J a&O{@##h#`q {yyv 00 (y w" ʸP0 {{{{ͬyxyyxQĩ n2@j" x v x?rp @ȩq/ }0 P2   ʩP2   }ʩ0}yq} yu@ yyyA0?0!@@Ҫ}z} kz*yz*zzy`  llAOgP%&wx x#}yg!ic?g@ zNcukk0 v@ v#gkupj%%/ x{{x.0.0.0.0.%./  /%{{z&!w"z"z"zzz" "#"##"ת"קէ//` 0#" w? 0  s s /&zz{&#!#!#!)(##}s%t.  p rtr#s"@@`0@0@]"^ z/ o&f@ ~7~9#Y~~#sq~"M~g}c('֩%}} jw%}} j~'ի%=s#fy"k'}} }@@%.hPROCESSHP C S7.1-012process_zipfilesfree_G_buffers%do_seekable%find_ecrec64process_cdir_file_hdrprocess_local_file_hdrнgetZip64Dataнef_scan_for_izux,h.shstrtab.note$READONLY$$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]PROCESS.C;1LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGPROCESS_ZIPFILESFREE_G_BUFFERSPROCESS_CDIR_FILE_HDRPROCESS_LOCAL_FILE_HDRGETZIP64DATAEF_SCAN_FOR_IZUXREPORTMSGZIPNFOOTS$EXTZVOTS$INSVOTS$MOVEELF$TFRADRDECC$MALLOCDECC$TXSPRINTFDO_WILDISWILDINFLATE_FREECHECKDIRFREE_CRC_TABLEDECC$FREEDECC$__OFF64_UTC_STATCHECK_FORMATOPEN_INPUT_FILEDECC$__OFF64_LSEEKDECC$READDECC$MEMCMPDECC$STRLENDECC$MEMCPYREADBUFMAKEWORDMAKELONGDO_STRINGZI_END_CENTRALDECC$CLOSEFZOFFTSEEK_ZIPFZIPINFOGET_TIME_STAMPLIST_FILESEXTRACT_OR_TEST_FILESSTAMP_FILEVMS_MSG_TEXTMAKEINT64  3AQash Tp[`^Pb` *6EMTajy!u UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14*5<FN]h~DDZ@UDZ@UQUt''-''?y 'T 'p[? '^ 'Pb''he e e '____ _(_ 0_8_?@_8H_?P_TX_X`_Th_p[p_xx_p[_^__^_Pb__Pb_h_"IA`II pr ! qI!2PbII"I"b@r@I bIBI"! 2P 2@ 2H 0 B I 28 20  " I 28 20   I 28 20   I b     I @@"I hhI RII#I$2I%I&I&RI&I&"I&I"!1RI'I("I)"I 2I*I+01rI,I*rI+RI,II@AI*I+I,I I  "!I-b!I."8"8"I "I/B#I0r#I0#I0#I0"$I1R$I1$I0 %0%2%I %8 %8 %I R&I &I2'I q'''I ")I2B)X`)Xr)I )I2)X*X"*I *I?B+I3+I4b,I4, - b-I -I .p.p.I /I5///I 0(1(1I 1I51201281x2x2I 32(320303R3I-3I.323I404B4I 4I44I625I45I/555I,"6I6r6I/666I,7I5!7@7B7I 7I68I4R8I78I8"9I9R9I:99x99x9I r:I4:I4R;I;;;<I <8<8<I =====>@>2A>20B>p>>I >I<?0?2?I ?@@I*@I+A!AQApAAI-AI.BBBI C!C2CI,CI1CI=CI11DADqDDDI-EI.EEEI rFI*FI+FF!G@GGI-GI.aHYv UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14"qHrHI HHII,bII*II+IIII1JPJJI-JI.KI LI,aLLLI-MI.MI 1NPNNI-NI.OI PI1RPI1PI=QI=rQI=QI="UI/`UUVI0!V1VRVI0VI1VI1VI1WI1BWI0rWI0WI0WI0XI02XI1bXI1XXXXYY[I/[[B\I0a\\\I0\I1]I12]I1b]I1]I0]I0 _@_R_I0_I0"`I=`I=BaI=aI1RcI0cI0dI1eI1fI1BgI1gI1   h#puS-u4@Gp0U] e`P0  s``v0 ``@` `00 А@  ES#V1.0ELF 20@@0 "a~0 )aE0)a@`-IPF/VMS29-APR-2009 07:1929-APR-2009 07:19TTYIOV1.0IPF/VMSHP C S7.1-012IPF/VMS SYS$COMMAND 1H@` $`8 @  $p,Xp<B`(!PF!p ( CX@!0B@a X!0 0 b0$BHT (0#@cP, X 8!`:HX"@,PF!p ( C@ !   * @ P@H!qH0CX!$\@(8@!'XD $"!00Ba$P1Bb 0$L0#T(BH0Y*1B X8!,4 ,XPF!p ( C@ !  * @ Ph@! H `T@ ,PF!p (c! B , UdHMH@` $`8 @X$,Xp<B@`!!PT!p ( C@?#8@!!0B@a !0 b0$ HU B0# cF,X p!ЊHXH,P8!`B2B@P 8N`0 @$p*0U TQB`0YP88 ( P840C ! (@ @?# , HUd@H5b@ $BPT!H`@ $0 P 8@ B P C@!@($ H` (JP ,P T!pH 8N`0  (L P((@C$,`0P T!`NH`(!,PXN H P,PT!, P$BP($ ,P% T!`B@ 84L B0C,( H @$# @ F P rJX$`,P`NH` 0L `YPXN H P,PT!`~FL`H0L0J$P,`  (J P~FJP@B!BHU (line too long--try again) rL ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]TTYIO.C;1͜SGʚ'OϤvwx~ llwqrl"Ԩ~ri'|N yyɳpzv {vh p p v||q0"rɳq|!?$ժ @%.VTTYIOHP C S7.1-012echott_getch getp ,.shstrtab.note$READONLY$.sdata$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela.sdata.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]TTYIO.C;1DECC$GA_STDERRDECC$GA_STDOUTECHOTT_GETCHGETPELF$TFRADRSYS$ASSIGNSYS$QIOWSYS$DASSGNDECC$CTERMIDDECC$FOPENDECC$FFLUSHDECC$FPUTSDECC$GETCDECC$PUTCDECC$FCLOSE  1@OT] bm*շ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14x''>'''e e e '____ _(_ 0_8_@_@% *BIIII*"IIII2(I 0BIQ R2 ` III"I2IIII1@rI   #* +4 ;@XNpH\ d  l` xH `P `p Z` ` 0P0  X p T#V1.0ELF 2@@ /IPF/VMS29-APR-2009 07:1929-APR-2009 07:19UBZ2ERRV1.0IPF/VMSHP C S7.1-012IPF/VMS fM ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UBZ2ERR.C;1ʇ͚S"@%$UBZ2ERRHP C S7.1-012.shstrtab.note$READONLY$.strtab.symtab.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_arangesENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UBZ2ERR.C;1 e ee @`3$,`j8`pF`(RH0c` rx h}U#V1.0ELF 2@@ 0IPF/VMS29-APR-2009 07:1929-APR-2009 07:19UNREDUCEV1.0IPF/VMSHP C S7.1-012IPF/VMS gN ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNREDUCE.C;1ƬϠP  @%%UNREDUCEHP C S7.1-012.shstrtab.note$READONLY$.strtab.symtab.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_arangesENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNREDUCE.C;1 e ee @`4$,`k8`pF`)RH0c` rx  V#V1.0ELF 2@@0 5ap@0IPF/VMS29-APR-2009 07:1929-APR-2009 07:19UNSHRINKV1.0IPF/VMSHP C S7.1-012IPF/VMS i.H D X!0 P!0H@%$@ @e% $0,B@"X !X +@AP  ,B ӌ> UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14V D@ % + H@ % + L@ % +J@!`H e $PxB< ~HB <!QtB <\2 ё <7y"/ <7y"/ <7y"/ <2y +J 8@$a@C@$!H <LaJ8$H@ç Hh$p0 @ $$8!@@sH 8)@ @h @( #Ch$H 8 Xp #PCi$Hs p | ??#|cp`Ci$@H`ȝr @9Q@ r Y    (8@$P!B8s;Ci$$@ Xh$08 @@qRi$ H`qZ ( r$ $` D # %< H8$$Ji$pH§ i$09M@i$p9]@r &@0 s.`L$ s (@"B"R)?#\q pI` #50X2!( @h$ H @Y АaA%9m@sh$0i@6Hh$l,s P!Hm#w : ;@` <| >!x, p$ @`$~F xp # Pi$8)@ PPaCh$HQ " XD #PCHi$0H qJ & $ ?#$cH&`Ci$@H* @9Q@ *X T PT \(8@$P!B8+;Ci$PT$@ Xh$08 @@qRi$ H`qZ ( r$ $` D # $< H8$$Ji$$§ h$@9Q@ri$0,` (`X sLH pP$@s XD d `s &h #(P  By\6C $ qCXD0Ch$ H : t #PCi$pHs n x =?#xc|n`Ci$Hp ;@ pY (  Pr8@$P!B8q;Ci$$@ Xh$08 @@qRi$ H`qZ ( r$ $` D # %< H8$$Ji$p$§ h$09M@ri$Hr &@P sPD `L$ s *` #`( Lb ryX2C&90C D!hcH&9J$ H1Q8C J!8Hy1x:0PCa$t,@@ t@ |@ >@ |:$ lB08pn J$C @J!I@S0880C Z ! #(@ H$ B0!@  J$8Ha$ P,  V! "@ H H Hb8PB0Ca%@B` . H]# $TqC) HRP T40Ca$P,` ?#"@ `, `X X&8 C@BX@a%@P, P @P P0 H` @@ 2!TqPJ H$0@`Hf0 ,@6d4PC h$ `n 8-@@A h$p `P HY" 8%@ ln,  P (B`XXX, ȱq,"% #Ci$, 3 $p;@ nYP8B0Ci$ H@ 8%@@qR $ #  X$0-@@d4J@$ B,C?$0D,`2E D(00@C &Hq0C& DB`C& DB qC& DB`C& DBC& DB` &!Hq6`C "!`Pa JD$0PC &Hq0C$ DBL: J"!HCa%D, X a$y@ Ex> @>@E #H@$@@$@@$@ h$p;@ npqpCi$, 3 $p;@@ nYP8BC@@d!(@ @! , U@ SN ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNSHRINK.C;1ɳS`FG &Z%t `!Y&ǩƬ""B /*zyzzqf|ɷ!~~X\ԩ|ɦ|ԩq|@ {0ԩ|y~$ yi! w|/osqե!!Pv "$ ; 0եj@@%.CpUNSHRINKHP C S7.1-012unshrink ,p.shstrtab.note$READONLY$$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNSHRINK.C;1GUNSHRINKMASK_BITSELF$TFRADRREADBYTEFLUSH  4h 6p?DIT]l'''pe ee '__p_    III II 0@p#-4@Gp`Uc] e`Wq ``0G` `080 hH   UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14. GOATLEY UNSHRINK X# GOATLEY ZIPINFO}\# GOATLEY VMSDo GOATLEY UNZIP{yX#V1.0@%ELF 2@@0-a0+a0 2a0 αOa0 -a 0 &a0 )ap @p X +p+@~@~00/IPF/VMS29-APR-2009 07:1929-APR-2009 07:19ZIPINFOV1.0IPF/VMSHP C S7.1-012IPF/VMS sAmigaVMSUnixVM/CMSCP/MTOPS-20NTFSMVSAtheOSBeOSTheosshrunkbzippedLZMA-edPPMd-ednormalmaximumfastlocalUTCOS/2VM/CMSMVSAtheOSBeOSAOS/VSTheosunknownstoredaccessEditObject: %02x%03dZip file size: %s bytes, number of entries: %s End-of-central-directory record: ------------------------------- Zip archive file size: %s (%sh) Central directory entry #%lu: --------------------------- MS-DOS, OS/2 or NT FATAtari STOS/2 or NT HPFSMacintosh HFSZ-SystemSMS/QDOSAcorn RISC OSWin32 VFATTandem NSKMac OS/X (Darwin)none (stored)reduced (factor 1)reduced (factor 2)reduced (factor 3)reduced (factor 4)implodedtokenizeddeflateddeflated (enhanced-64k)imploded (PK DCL)tersed (IBM)LZ77-compressed (IBM)WavPackedsuperfast There are an extra %s bytes preceding this file. unknown (%d) file system or operating system of origin: %s version of encoding software: %u.%u minimum file system compatibility required: %s minimum software version required to extract: %u.%u compression method: %s size of sliding dictionary (implosion): %cK number of Shannon-Fano trees (implosion): %c compression sub-type (deflation): %s file security status: %sencrypted extended local header: %s file last modified on (DOS date/time): %s file last modified on (UT extra field modtime): %s %s 32-bit CRC value (hex): %.8lx compressed size: %s bytes uncompressed size: %s bytes length of extra field: %u bytes disk number on which file begins: disk %lu apparent file type: %s VMS file attributes (%06o octal): %s Amiga file attributes (%06o octal): %s Unix file attributes (%06o octal): %s non-MSDOS external file attributes: %06lX hex MS-DOS file attributes (%02X hex): none MS-DOS file attributes (%02X hex): read-only Theos file attributes (%04X hex): %s Library Directory Sequential Direct Keyed Indexed 86 program 286 program 386 program ??? The central-directory extra field contains: - A subfield with ID 0x%04x (%s) and %u data bytesPKWARE 64-bit sizesPKWARE AVPKWARE VMSPKWARE Win32PKWARE UnixInfo-ZIP VMSold Info-ZIP Unix/OS2/NTUnix UID/GID (16-bit)Unix UID/GID (any size)universal timeUTF8 path nameUTF8 entry commentold Info-ZIP Macintoshnew Info-ZIP MacintoshZipIt MacintoshSmartZip MacintoshZipIt Macintosh (short)OS/2 ACLSecurity DescriptorSMS/QDOSAcorn SparkFSFred Kantor MD5ASi UnixTandem NSKrun-length encodeddeflatedcompressed(?). The local extra field has UTC/GMT %s time%smodificationcreation. The Mac long filename is %s. File is marked as %sResource-forkData-fork. File is marked as %s, File Dates are in %d Bit. The QDOS extra field subtype is `%c%c%c%c'. The AOS/VS extra field revision is %d.%dUnstructuredRelativeEntry SequencedKey Sequenced. The 128-bit MD5 signature is %s. The first 20 are: GMT modification/access times and Unix UID/GIDGMT modification/access times only There is no file comment. %02u-%s-%02u %02u:%02u%u %s %u %02u:%02u:%02u%04u%02u%02u.%02u%02u%02u???? ??? ?? ??:??:?? Actual end-cent-dir record offset: %s (%sh) Expected end-cent-dir record offset: %s (%sh) (based on the length of the central directory and its expected offset) This zipfile constitutes the sole disk of a single-part archive; its central directory contains %s %s. The central directory is %s (%sh) bytes long, and its (expected) offset in bytes from the beginning of the zipfile is %s (%sh). This zipfile constitutes disk %lu of a multi-part archive. The central directory starts on disk %lu at an offset within that archive part of %s (%sh) bytes. The entire central directory is %s (%sh) bytes long. %s of the archive entries %s contained within this zipfile volume, out of a total of %s %s. %lu file%s, %s bytes uncompressed, %s bytes compressed: %s%d.%d%% offset of local header from start of archive: %s (%sh) bytes length of filename: %u characters length of file comment: %u characters MS-DOS file attributes (%02X hex): %s%s%s%s%s%s%s%s error: EF data block (type 0x%04x) size %u exceeds remaining extra field space %u; block length has been truncated. . The local extra field has %lu bytes of OS/2 extended attributes. (May not match OS/2 "dir" amount due to storage method). The extra field is %s and has %u bytes of VMS %s information%s. The local extra field has %lu bytes of access control list information. The local extra field has %lu bytes of NT security descriptor data. The UTF8 data of the extra field (V%u, ASCII name CRC `%.8lx') are: . The first 24 UTF8 bytes in the extra field (V%u, ASCII name CRC `%.8lx') are: . The local extra field has %lu bytes of %scompressed Macintosh finder attributes. The associated file has type code `%c%c%c%c' and creator code `%c%c%c%c'. The associated file has type code `0x%lx' and creator code `0x%lx'. The local extra field has %lu bytes of %scompressed AtheOS file attributes. The local extra field has %lu bytes of %scompressed BeOS file attributes. The file was originally a Tandem %s file, with file code %u There %s a local extra field with ID 0x%04x (%s) and %u dat'L UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14o!a bytes (%s). ------------------------- file comment begins ---------------------------- -------------------------- file comment ends ----------------------------- JanFebMarAprMayJunJulAugSepOctNovDecstorshrkre:1re:2re:3re:4i#:#tokndef#d64#dclibzp2lzmaterslz77wavpppmdu###fatamivmsunxcmsatrhpfmaczzzcpmt20ntfqdsacovftmvsbe nskthsosx??????????????????????????????ath???NXFShA@H H`!H $B`RX $ QH@B @Bp !,@ H!B 8O?#cpC $B]@ PX 0her0C $h@ h0`P`68J L7?#hnkC$l,  $@x ``xh H!H@08@C H!B VH@ $@bB zH@@8@C H!B VH@ H!@"/x@P8@C aH!B @H8@ X$@B @/H@`80CH!0B@@ H!0 H@ H$p",/;C H!@"/@x8@C H!B VHH@ H!@"/(@@8@C H!B VH@ H!@"/@P8@C I!B `H@ x$@B `HX@`8@C H!B VH@ H!@]"/@p80CH!`B@ H!` H P$",#;C H! #  QI?#h@@8@C !I!B H(@ $@BB mH@P8@C H!B VH@ H!@"/@`8@C I!B HX@ $@BB H(@ @$ h0`Pp68@J 8O?#cJ8`8q?O8@C@ H@XBP\!@ I!0`",88@C$ HP88B C I!"/@N0@bB HPIVp$8H`M8 C H!@]"/ H!",@(5 C$,,  $@x ``xh H! +H@ H!@ + H #@ipH% Tx8ႹJ!@"B ]H #8@ H! + H@BB  , hU XMH@@B @PAH c0 C$`LH` Ha$0 @RFpbLHJH Z! ,:(1i&$P!D!!HX pH!2,@XhB!P@ D `8NH  pF!B8Y AG!PNpB C pH!pBB hB!,@XN ~F`hah$B 3 (J`Hjx!P, pL0 Phah$B 3 pD!`Hj 8!0 hZP$ B8 pF!B ` 81i&$8N PJPB C pH!PBB0 hB!,@X J`X!BB 3 8N0HhZPH8YxF0 PX!BB 3 pD!0H@ hZ0 (JPX!ЂB 3 !0H  hZ0 0  x BPX!ЂB 3 pD!0H@ hZ0 0 x!P$  B @ F!B(hH!BĤ@h$PNpB C pH!pBB0 hB!,@XN`@B` X!` @PpH0Y8N qC$0H 3 p!0 0 ` (J!0 Ph$B $0 @`P$H J ,0 @` r`@ x"$0 XP`h$B 3 pD!0 @  H!0 0  x BP$  B H P!B(hH!B Ť@h$PL`B C pH!`BB0 hB!,@XL@B0h$` X! 3 ($0 xJ`@ HYPX!B 3 hL H`@xDP$ B pN!B `P(RBX pH!BBP hB! , R@h$ B C hH!0@@YpaO!HB F0 B,`ĤP(L`B C pH!`BBP hB!,@XL0@>8N!` X!0 3 H$0 xRH`YPX!@ 3 pD!H@ hP0 PX!@ 3 p!0H@ hR0 0 x!P`h$B 3 pD!0 @  H!0 0  x BP$  B H P!B0hH!BŤ(h$`BHPF0B C pH!0BB hB!,@XF@*0L H` X! 3 H$0 xR @@YP X!`0 3$H 0L90 0 HR0 B 0J0  0R!P@P X!0 c$H ! 0 0RBcpN!B@PPBX pH!BB hB! , P(@ @! ",8D8 Chah$0bLH 3 x!@`p!HDhZ0 Ph$B 3 p!@H!0, xH0 PHRB C !H: xB!0 0P!F!,@X pL!2,H F0 $` X!XU u*H !`8 @@pBp<BHb !0B`@8 B PCH$ HHXP8 80 B C0@!B  qC P! 0@!( #@B"$B@$"4$C 0@!( #@ (HPi HpC 0@!( #@ ,HXi H@C 0@!( # P 0d2@0$04PJ @@!h H48PCh HXP8 8@ B C@@!B  qC P! @@!( #@B"$B@$"4$C @@!( #@ (HPi HpC @@!( #@ ,HXi H@C @@!( # P 0d2@0$04PJi$H $i@@PH@ 4Hb @49t0  6!"/p Ay@X !P!йwXD #xpB  pl0#FP88 C`$H`A( H8@ H`@`XPRpXV2pEh B @ $p#H`T!P88BC$P88B CHh$H` Y $P88@C@ D00 B@@ D!  B C HP@!$ 8pC P0@!(  pc  C$@x! CC !X A!, 3 Z!,  `!p `XX A?#XD@Y YP8B@C0@! B x iH@$0CH$,E $^XB8 CP@@!B P(qC x!X0A!, 3 Z!,  x^!p `XX A?#XD@Y YP8B@Cxs3 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14]0@@! B  iH@0CH$,#E $` PP@!(  P(B (qCXPh$H`Z Y $P88 B C h$@ `YH8@Ch$ HPD B D ^!@!0H QA` a C`1C(`9C@0i&$HHY V!!@pxP$,X \!00 xP!p ,x^` `!`, P88 BCx@P88 BCxh@`1CYh$HP` B `p pCXh$HX  0  P ,P88 B CH1  @C@ Yh$@ `ppCXh$HX  0  P ,P88 B  CH1  CX^1Ci$pH` (J!@ J  0  H`2@H0P ~Ft1!h@ XPh$-@ X,ppCPh$HX " D PD,P88 B  CH1  C xYh$@ x^ppCXh$HX  0  P ,P880 B  CH1  @C !0 X`8 C x!0#HR!HFT!P88B`J@i$H` H%@`Z PS?#  Xq`XH I! HH H( H,qC0i&$`H 3 \!E@HYlbLHj" HP$, \!BB@X P!2, B ` h! #$PBhYlPh!Z!!H \!2,@X P!0 `h`h!x@!h@@^!(@@^!@@`!@@!@ $ A!0c H@pH:@0CX$H0N!PXV@a@h!0CX$ @ XV$bLH@`Y x^ 3!`B8H!^!PsPh! `H^!"HLԄef@8` B@ 3 ^`B @x$0`P @p81 $0B V!`0 @@B!B(YZ!, `t 02y x BPx ,@@ P @PX(P8\B C Z!BBp P!,@X \` h!! C`C1@!`B ``q0C$"H BB@ hRqCp!A!,Ĥ $ :B!PBpY 8Nz"@8Y \YP8!N!!H V!2,@X P!p0 `8` h!h1@!"H0hZJ@@`jJ$PBP h!! CpCpA@!B p\`q@Cx$#H x^B@ NqC01A!,`Ť $` `Z^!PB0Y XV`J"@`XY LYPVB C $BB0 Z!p ,@ V` h!A@!"H``p:@@J$PBP h!0CHi$`H` pi$@r0LH0 HR0 P RxqBn!p#HPp\ q  \pC $p#H0T!P8C1i&$0"H $@l HBP$, `!BB@X P!2, B ` h!D1 (qhQA@ZHjB BzC0i&$pH C P! @Xnp H @Y !@!2, @ ` h! @D!@XUbxd H i$ 0 p!0H` p<B  0 Ff Ha$ p@ HP%#CH0i&$0 @ 3 !%@` !`$ P $@ B`  J!DB0YPL`B C J!`BB0F!P, @X L` !i$`HA  `@  @ 0 0 !J0LhH`00 @$0 `1Z  H 0h$0$@x!E@" $ 0#  XD  0|1P XX|!EB@ PY 0$ D( X8"P0i&$DB C F!0 @ X!P, 0P1 *0 ,` 0 0 ``$DBPi$`LH  $0 @ @ 0B @$0 `  BhZPi$DB 3 ?#0 @@p!, @(0 !P$P B p Z! B P`X!!H X J!0@0( @X F!0 ``0X4DB`C,h$H@ c H!0 @  XPp!DBH@$, 0@ "@ ppYH0i&$H !J\! B`$`ՄefP$, X J!BB @X F!2,X$0` @p`1`0P0i&$!H@ ( H!)@  xxY `t `5`y$ `Y `}$@ "@ H$ @% @P$,P@^B C J!BB F!P, @X ^`X4DPCx$, x^J"@ RZHx!h@@4h$0B 3 !!@`  @ @XP@!DBx1i&$H%zP! B` $x^$5P$, X J!BB @X F!2, H^ ` @p@1` !H@ ( I! , `t @By$ @Y H^ J @0R H 0YP@\B C J!BB F!P, @X \`0R4DB`C0Ah$H@ c H!`@ 0L 0YP`!DBH@p$, p\Z"@ `V`Y@1i&$H%BX! B`# @PP$, X J!BB @X F!2, @P `!0 s0LpCp9h$bLH E `$@`%Z 9h$H@ ( p\ ` 1p \, ,$" x$pŤIX!@ HYH$P@VB C J!BB F!P, @X V` H 3 H, B`4 ! ppYH^! HYP \B X J!BB@ F!@ , \@@$T9`@sC`9h$H`Ť $@`%Zx^0B@ ( `X |)`XY ` X, `Y `^ @ @P-PX!V!P, @X J!2,@  @V $` !p9h$@bLH 3p\ H@ H  @ (`^0řBpP PT@ `T!@,%r x1i&$@B%zX1i&$P !H!!H X J!2, @XF!@ H@ `p\DB 3 x^H p!\, Bp `X0 `7@X!, P!P ^B C J!BB@ F!P, @X^@H H `R @2B` !HBPXVH d J!0B`XYPX!V!!H X J!2, @X F!0 `X`HDB@ Z8H8C@Qh$PH c !@* b!@  ` Z$PT-P!p CRLa UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;147?xa!"HŤ X!0}@%B! BVbLHP@P!H d J!PB`6p$,P@!P!!H X J!2, @XF!@ @P `X!@2B`  X!p# Px^!H d J!PEB`6,PX^B C J!BB F!P, @X ^` !i$bLH 3 @@ ( L!@P!  `XbLH Zp\ ,P XB C J!BB@ F!P, @XX@ `1i&$@@ E ` ! 0 3X$H` @P@0 @Yx^@P $@ B` x J!DB| HR P0PB C J!BB` F!P, @XP`H0L ` ! 0 3 X$ ` V@bLH`YP $@ B` p J!DB$" pYh$p\ P@XB C J!BB F!P, @XXHŤ`X @` 0L@ 3J!@,`o ! YP !H!!H X J!2, @X F!@0 ` Ĥ` `X 3J!@,` x !@@@YP0PB C J!BB` F!P, @XPbLH@P ` p\@ 3J!@,` l !BH YP !H!!H X J!2, @XF!@ H@ ` HR HR!H@ ( _!DB HYH1i&$, HR P0PB C J!BB` F!P, @X P`p\DB 3 HR@HX \, HX H0 xH!0 pP h^!`0  hP!0B@ ( `X @B HY@%P RB C J!BB@ F!P, @X R``X s $rR@P  Ch! H`f H!j@ Z! 0$P+ eH @$0/ V/ VP+J0)`(P0C!@H P* $`AY@h,8@C!pH@f $`# d4 Q, lq0C!)H p: P, pxq0C!H | BP, Lq@C!@Hf $V# X "P, `q0Cp!-H d] P, q0CH!H  PP, (q@C!H 5g $XD# HRp 0C!*H &!`AHX.PBȠ!T,` d4  2PH88 CpZj@$ lBPl<0ɼ@J`ZPqzC H@ R H)H[jC H R@P)P[jC H R`X) X[jPC H R`)*`[Bzh@J $@ PBAJ0i&$HH C ZE@ d(Z@,@ (H"0řBPJ!, X F!BB @X S0  @N9@Cx$@Hz1HH8PCh$"H !xqJI\!H #8@H!hH P$X@ BP X@`@ P, PX@$(q`д$HX0$H4 $ H8$H<$0H$P-H $p%H@!P\B` ` !dB4d6!"2B X#|Bed !82 H !\B@d `а# CHP2B` 7 pH# HY HW# @Y X&#@ (PH!R!P, @X J!2,@  R@ h@HN9`Ch%H XZ 0 H\8@C H$XqC %XqC  %X qC @@%pX!qC%Xq@} X_!P@K$^!(B*8`dX080Bj,!LBh@^!X@_?#H@Ȁ_?#8@_?#(@ @_?#h$`)%@pP, X@j1 2!HAR!"X@P L, `X@@q H$ qŤH$qHp`$@qHH!\$`qHh% H$qH )P $qHX-4$qH0$@uH05 :$B%b>!DBe(!2N`Bdj6!j2BhAaSPBDe (X# @Y`X B`x !\#`Y \d# C p\#T[P2BHP`!X!P, @X J!2,@  0X` @HN8p0s`8 h8NpŤx4N9 % p\ x& p\ГppYJIH8p CH%@H J1pZ8C @$`HqPC x$pHqC X$HqC %H qC @@%H!qPCH%H` !H% qʈ!H#@!0aHL(@!PiHT,@!pH\0x@!!Hd4X@!Hl88@!ЁH t<Q, p(B08Lq@ P$H $ВH AR>8Pq`HL$HPRCB Kdpdp@J@$H ARX @X@"@H!(B!%2B C*!0aH@2X$H*8!`XY@`$iH6P$,q`$Pq $\qHXB$$B8:2Bd4!02@!2HB d!2B@bd I&!PI2B (!X# Cl^P2B @Y |"#@ ( \S`E#`2 $$ U#4Pp!\!P, @X J!2,@  X\ @ $$@ ( M!aR@,Pp!\!P, @X J!2,@  H\`H  h$bLH C H @` H  P , C$H Y J!0L1 P0ZB X J!BB` F!@ , Z@H9pC$H Y J!0L1 Ph!Z!P, @X J!2,@ @H$pH" $X@`$0H P$ %@0AH, BX@ E x H, p\0 P\8B@0 2l0 P *0L0 P "(0 P`X B`P 8qX%R8q`P@\Ba2! (`  alB"&!"DcPX!t0# h<XB $!0L1 X!@,@ (p>Ph!Z!P, @X J!2,@  `Z HQh$!H`HR DB HR b%CXh$cH XV  ,X)@8 C@$)@ 1i&$H` $@@@ (hZ"H` h HJ@P$@, X J!@BB @X F!2, H@ `0X0DB $C !H $`#@@$Hx$@H  N9@0 9 f 0 D b0 ؗ `X0  H0 $hg@T`%b@E@`bL؄en@pG6b@Bg%0b@Cg1b@Lg b@O`gEb@T@g% b@T gb@Vgejb@YfXb$ B7P$ H X1 ! u @`iZ1`!P$D@ ,0r @CH0i&$)H XZ h!%@ PZJ!@$-@ XhP$4- J!D4B @X F!73, 0` ! h:$``6aC $0apC @ $`"q@C HL$`&qC PN$`*qC7B4H Ds*)[HJy5JYhG?$#43r޳of%G|0lp`wJb!!jE)8ghA(e?8R=JAa8 (=%iP17~ajZ]Љ- -yj#2 < A\Bڼ7`}q,;'GMgbXC{;]rF{{`idUdUhE|]rtY1̂GACXTWx0 Ԕ@lE*`Xh01ˎg)n) M_ղ!nL{A/{s|%7@[!VP$#W $t} &u,0 pOǀ@ 61z8Ѓ0: KEQPS(8@8a g(R*ڰʰK CajO`f̓PŅ=bU[}"}|-pGQl F!sy! ew:'$:r JIS'!?By`Q޸2Y@&.#@ boVF i,R|)7 WPp9@ZC g PR"mAkh_o`UBpC-SF*oq34t7,'!8%eClq"O#@ `g !xvuPlKLBt (o)8D#j _\QYD{ t`Za{tZa;-D<'=*Q@%PUaҀdP]{g$P[>qx/#SSPzmk_Ev&%=|0OYɽ.9|nj.*!'q al0~!4# *;r< h D! NSi7;?fJi?U|DyAA,A0қ"rhL/@9`bh9-. ehƤ^]D -->ae))=؀-0isDF&H iSLH}(0? *e!>x5PM) :HYuW/l fhj~'">ю6!ؓr d!,f$#7&a voT ASh'A3! r4E1$y#&o"*efS=\)A3ҩy'vh/GtQ@}]tRan_/v:KNuqb?L}o*T("j*-gpO9m8PTW(w!VTeZ͜ż :>=Nbk+ /r#zp7nz ,gY8QrZ i ;Jf D'c^͉B!H{kUDz>86t)KxLO?%:HxB^U`gps3,O%8N@'ȑmOu`3>>㍇pfJpEa]KAGU-hX~FjQ``7Jf9"A_9 nj`'w o/v)#8lYL72PuoSycEpo-c'_G ]AvOYtFAs%29p"z%MՖl ``nf4PEKia7eyCk)GrkcVDpz 5&#+0Ov\YIz]b#J^#{R?p12HAB"5:ei3'WAaY3H]$LNX}jM$u&7#7) x!',BHd ϑTGv٤'p2mBɘ"~{n7R[P( `65fJFmnB~1?uXEO|gnK0{-k49`2>y9b7-5 {+3:'+-iGUXH;>z^Wuk A>Xh1JfHOBo~ufP<TI}51(VN O)<1,2+atmmjנc0 q$*$ RV98A5& d?JZ9]yb qz"Y~_;-Pkn (-hʦJeUd(r4DMA~~U i3eeU &>c O/oG^'@I8(n /aCEZ /TAU#<+ϔ4c*  ,X/-c`gcjsRU4tHN T\w?`/Q '3aB¢Q3OHȂro)ҪHw* \2fhR :H/za+Y g[f21%KD+P2 lm'1*@h9;z=cHIf}BNgF3J3BP\)[gz49(75^v?|gmxxb}3aah}MPM**S ?FSf*B6%6X2 MuBc8y3U\m;IYcF" 8qF!$|9L FUZkJ>$#!hgCLT&͚1{rC 9G6jUP[oGM }=ҳ㷒ysM*TkKE=KNHzK~z/[ڃ֙zVrlCz_|?8w d7Cg2#އ.RD[[%^橘t ?rnUt.0]2">pgKB/d W G/?v\!BB_eч 0ļ!-om#&q v-ثdG9uïx rFݳVX]qCjJnbwyv|9mii}8b޷b[pĊa@S3 ).d74SDβڎ8 cڑqrPm|uamexp,Q!ز'g"y;)J%(/dk8j8 s1[peQtDXiJRͧtIq~ X*?r0"HOx"f8XEDTN:#%E>iy wVRtcBuC,&;" kK]#4(k(.$wAdIH O!44-cߚY|Gr!|@*LFUZH`y]#HY9Yj.,=Km U^Y(cw kI"z0)@BwF#a {2O߂UM"][[W&=6N~^:`IQ4 ^L{RE|MH}5|T"-%)0|M Ӵ2 '@+U7^qG!p;d. -\@G2ٹ\0̯y fP)yBjT@aY. o7t`)"-ssp= nU((%DO~w@&VkM>y5 BU@I4T*HkE=z7T`2ATb0w[^A$ҟo^H6 ' L8kS/{_T%`*B'fXB[khsd[=.]5> S~rIDz<,wak67V]&O}6,n)'vzN'szwu'$j '@iiS9|Xtb5zl8:xFhX-U)`9eCYr F]p0WI} @,Vcce,8l'1i?)6sP/ Wk~],x M9EZi$HDVP$:)YC2 0w !Bԙ[Vv2@`9uw`=#rK&k94 ln=Fd/>ڂ_h(UXJRt 輌OeV6+dELDo1F׶&K0)HYbq~ #S)RWSZ\WOY[9&q.NTEF]1E!Jq{sM>$. JgsPxYD43&\mZuQ]'PN,6۵J0Z:ІәHZ` 4ģbM2tfȚ}{rɂ #v#b1,h%Ut#˼gU|6yRtSC[ `u[uGr o,o)hq*B#< U /ޤӭQd' k'4"M۫+v|sEe`) Ξ5~amP0/ QR%R.8S\p#3 9 uhgcoaKFg ߲kA%]U0~9&+MŮ "_J#2W6'ޟ2ltNL2w؃ET_4R68fITha p ^ -3!M $RNB.?"@!HU-4&sja nOy+~J2o\JC >t+{3TR H1^`>9*ԩJ70J`PAFz\P0BhqY rSW7$g#?x +L=IdSj"!W >绉N EY;Too>!u1Z0#=+b(FPq9,(sP`/rqq`[j o04_NEm9(QWӫopv5 !Bc  ^G_g |U`cU"tKZu+Tn)͠msK z8c9,r q !?mUZdOJUgiƶU1dAE4"ZviB"Paq g0o]nJ\Dkm#$ gb~Cp[( ?DG*/g b UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14DN X4f$p`.qC P$`FqC<$p!I`V U!`Rq@3 0/8B$`jq`a*!`vq 0aSlB!@f!@g>#@f?#@`g>#@f>#x@ L$0aC $p`JqC $`NqC &$`RqPC $`Zq C Z$`^qC V$p`bqC V$`fq`C$IV @@U!`qT, X@f>4BjY!,B(@@[!C @Dp BCD@@g=#@`U!@g>#@[!@`f?#@g?#@ P$`Jq0C $p`NqC $`^qC $`VqC T$`ZqPC$`qV g?#B<0dB6!@@B8!Cp@x@g?#h@ U!X@d!H@U!8@1C$3F@ X  $@x ``xhi$AB`* 0@X8C"$`eHP @sXBp\-\Ax@Z!h@T!X@@Z!H@Z!8@Z!(@ U!0i&$)H PZ PxB HZ J! ` kP$,- X J!D,B @X F!/3,D4I0`8,0D CH$9 C h"$`6qC L$`qPC @N$`"qC H4f$p`&qC PP$`*qC XL$`.qC $`Fq@CX$ 0I\ x0%p@ L$PN`PC<$3B` h( pH 3 !0\0 XX!PH@$~F` !`X&aDH& JP0i&$0B 3 !)@`  J!( $-PH"!!H X J!'3, @X F!$1 `H`!(@ X$`P.` Ch2i&$ H@ p h 4! P $@ ,`  J!DB hZPh"!!H X J!73, @X F!41 `H`@DBX@P9`CpI\! H h] B nP@ V \4u)`P P$l@ SX0i&$ $ARH& 4q`!Z@ P !H` ` J!H"@  H # sPFP ,ch$-C+i! hZ h6_ @4! @P-PH"!!H X J!'3, @X F!$1 `H`!@ X:$`P.`CH$ H@ pP$ u%@ @! PX"V DB` HT!$,Y@`X !HH , hZ 8 B`(8 B HZ!PH"!!H X J!'3, @X F!0$1 ``!pC H@p$p`C$ BPh@ $  @4 @0#(@ @H , aLH$$ qXPg!B "(!!(B Ch"PT, J!0EBPX$4- C J!41 hF!P,h@ ,  ` DBPx@ h$@P6 `pC$ BP( 8DBPC H2$`P&`C X$ u-@P@ h$@P6 `C$ BP( 8DBC p\!,X6!,$B\pC0i&$$-`Q $t%@ "J!@u-@`  X4#H"P$$- X J!D$B @X F!'3, 0` !X6# P@ H$@P& `C$ BP( 8DBCX$B@ZPp}\!`LH` $ , !JJ!0EBhP h1$B hZ!PH4B C J!D4B F!P, @X `!@ X$PP.`C@0i&$H$ r`& XBH=#!@ \ BHP $@ ,` X J!DB HZPH"!!H X J!'3, @X F!$1 `H`@DB@ h&$P`6q C $p`q` C @X$`"q C HT$`&q@C P$`*qC X$`.q C $P`FqC $p`JqCX$`q@\]A@8 C 0i&$0( c 0 p, X ]` X]`X,@ ( bc># X4-Ph"!!H X J!73, @X F!41 `H`! @ X$@P. ` C$ B` cPp\!0I  H`Y>#,P$aLH`H!(0 `P08E@ C aAp @XH" BbP€8$- XPH"!!H X J!'3, @X F!$1 `H`!!pC h@`4 p C$ BPX@ $  @, @0#h @@X @ h$@P6`P CX$dLH  t10p-@)b!P ` 0-C$P , hZ H! BP`"!!H X J!33, @X F!01 `H P`!@`!!H @X J!0 B hZP`"!!H X J!33, @X F!01 `H ` !5,H C h$t5@ 0i&$4 3 @ ,` H J! `P$,- X J!D,B @XF!P`&i 0,1 `h6 ``a% @1 C !B   (@C$ E2B`X$P ! H\$Y@(8C$ E2BXP!0C`"! ,@ `2 2# ! ,`0@$0ūB`X!Ph@DBhh! C 4A `\$0Y@08C$ E2BXP!0CH"! ,@ H& &# ! ,`0@$0EzF`X!Ph@DBhh! C 4A1C0i&$@BX $0 #P"! B HH0EBP$$- X J!D$B @X F!'3, H `!H@ `$@P2`@C p\!1@X])@ C J!PX` X0,00~Ƣ X `ph1 `Z `v hjhR HA$B@P @P-@ @,  @XP`"!!H X J!33, @X F!01 `H`!(@90C$ BP ~8DC X$ u-@`ɤP~$@ B@ bh!Pp\!-@ 3 !,@ (X0B `Z!,-dPX"!!H X J!/3, @X F!,1 `X`!@ H"$Q&`C`$ H @ P@, 2B  \!P@ i  Q BP |8DBC0 z8pC@ x8PCP v80C` t8Cp r8C p8PC`$HA $1  !XB@X$0HXCP!2B` ! AH HJ," B`JH&PH!DBԒ@X$h@X$X@X$H@X$8@X$(@ X$ X@0i&$00H hZ@ 0p @|E h›?# h  B!P@ V 4- c !`,B @XJ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;140]!00B@ (!$- PH"!!H X J!'3, @X F!$1 `H`!@1CX2i&$`( b`)Z X` XZC$ B`O`!PX"!!H X J!/3, @X F!,1 `H`!@$ B``R$PX"!!H X J!/3, @X F!,1 `H` !h!0qC X\! H2i&$0, 3H @ ,` H J!$! hP$$- X J!D$B @XF!Ph2i 0$1 X. ``!pJ0i&$`2) @  X$0 @ iZ1!H X@ H@ $00 ,R  !2, 0`!pJ`2i&$@H C F!1@ X@ H ` `Z  01 0` !Ph$K@)R PT&@$% IR X", @,q C , 00s28 8,N91YpC@$`bLH  $0 $2$b$Y@@C 0L@T1 siQP!`X1 XYBZJ!P$`, X J!`BB @X F!2, 0L` `p@DBpC$`Z@@ "pCx1i&$PH  $@` 9H x^`1 Z0L1 @ (P$, X J!BB @X F!2, x^ ` !1i&$ H`& d 0  d p`YpC$H@ (Pf0B X J!0CB@ F!@ , fX@$H # J!`0 'l!P!f!!H X J!2, @X F!00 ``rH  L-`ZP8DB0C1  C@0i&$H@ ( Bm!  @DPJ! , X F! BB @X E 0 ` $` ! @B! ,  `@! hUH @@h$0 p!0HBp<B b F YP\!@ "@ # FPH HXxA!0,`(J  BVJ G0 PB9BC8h$H@ $0 @@2D!P0B  X@`@8 pdP*$!XP#L*@`$B9@s,pC8h$p0B ,2R ,, X , `[B ,\#@ D$aipC@h$ H a $m@8H 6 XP \!0$ 0B <$*B D`Ea D7/ D@0+Jh$Hrb % I@ !!B`H 8$T#`8I0M^)`20C$p,  $@x ``xh!B x1$Pd+c P`^0d/ 2d/ 2Pd+JL)1P0C!H d M, q@C!@H c @$ #  P', p(q0C!(H ," &, q0C! H H( @&, Tq@C!pHc $h# l8 &, tq0C!)H x> &, `q0C!H d` &, pq@C! H`0d $Y# L0C@!@+H $B@ H`!! ,, $  $PX*80C $$# H$4 $ HX!pa@"J $(BDHl@PJ`!'~F a C$$ @ քef @p1` x}&  `t by @HX,` E   0 @!X@$0H@4188PC@$ H@ `!!q Y!XD#8@`! iH H(Ќ҄ef@\P$30 ', p1`A&, CLX@$`q`F$H( @$0H&68hH b80B X$ h!@iH@r f8`txl!`iHR h Bp!$BP u!d&X y!u# }!@l$@1B @`!P1!x (# Pd# &y АhB `hHT,@D   @D! @%K`018 4PC H@$$qC P$(qC X$,qC %DqPC %pHqC @%PqC `%TqC %\qPC%H@ `!`q4!p#H@`!ЁHt<(@xa!IH|^@a![Hb@a! Hf@@`!@H@P`!`H$@`! H,"h@`! HH(H@$pH0= `\B `2`ӄef@l$# &, p1R', H RL, @#xX@`:8 H  H <, |q@$q#\$PqH$H$qH)Pm!AH-@f!`t 4$0sHH0"!0BV$" B4|arTB`b@0!@0Ba bB@a&!H 1!h<j8!Hh,@zE xq!P @ H^E#@1R `!x#I dP# |*#@P@!p (@9 H1B@$D@$q`0S @L 0@   @ q]I8@C$$ P ҄ef @DpX1 8 \0 C N, 0B `t X`!Yy@,$ XX P( P @* 0"X@@XPN, H  $ AH8PD8PiH2F8piH80BCH t1HB@a(!0 X@N, P`# p L2h#`X\6@C`!!Ha $t#x>8@a!jH ` 8!N, q0Ca!Hd@!h$Hxf P8 8pC$H 3 !D 0 6xD!P88C$HbHP88C$HbHP88pC$HbHP88@C$HbHP8BpC8m!0HNX@%0@H@41H8C H@$%qPC P$)qC X$-qC %pEqC @%IqPC%H `!QqJ.!d#@`!aHh6@`!iHp:@`!Hx>x@a!"H`X@a!Hd8@a!0H hXԄef@$@ &, p@1P8H&, piH" &, q p  $$qRL, D !(, BL$L(3 ش$H& ,8`t`8p  p`6$PH@RP$0LX@@h8q4!0B$ PX@f80!@PX@@H8Pd! 0B $L PPh!xBa\^ ¤8pDB0 eBbd$qB@y Hl!(#@ x!XЄ!0aHa*!#e 0%#@Hx( ,`D dX @ \4- @$1 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14l ! $@YP \!8a$0,`@$0"@`H BH:8p$B` PB`D 0B 3 (0 H(0 PN!@ p`a  B0\!P,@ N Bx`!BPP!B 3 xF!B PY , HR P$B p R BPH!B 3 xV!BHYHR  , @P P$B p P BP@!H @X D!B@@Y@P BH@R\!@5@X9h$ rHPT!H@X F!#(xB!,`Z@ JH@EJ`@@(Qh$ (J `HRH`@ XV`LHHPXa$)H P -@ A!(P P B  $(,%@HR ,  $D#@PB P%(0 `P` D a 0 H9 BX@ R1 P,H9bp9(JqP$`Hg L8EH $p ¤a2BdPa$E@@)Y!D ` ,$L# X "!!H@X $G2,xB! B " `@!B QA s`CH9h$ H @1i&$@@x^ @ # HR 0 (E?#( x^ Մef J! 4D!,P@ ,Q@\!H0 0 B H @ pX1 `t H`PJy 1B ,P@!P! , @X F!2, @P 8@H9PC(1i&$ H` H$P@@VHE RP xD @(YPN!@ p  P B px`!@BP!H @X H!B Y\! BHR PHR! , Y F!#( xB!@B0(J`  $` \! Hh$@ xRxY88CQh$ H c ! @@ !  dY$ ,P\!  18@!P"H@ĤH!PB@` D @0B#(D0BZR!#EPN!@ pa @P BP$ , N!0#J!B`PH!H @X V!BHY \!@P P$B p PP BPX!B 3 H!B@XYHV  ,TRXYh$BPJ!H@X F!#@xB!,`Z  D0 0`$BPXVBXpCXh$HX   ,P880CP! cD@@T!(@ @! , hUd`0AH !0 pp<B @B 88`C@$0$, @  ,`0@D 0@!@$$,P88pCB B  PA`CX$(,@ X, ,,@YD PPH@!@$(,P88CBB  PA`CX$(,@ X, ,,@YD PPH@!X@$(,P880CBB  PA`CX$(,@ X, ,,@YD PPH@!@$(,P88CB"B  PA`CX$(,@ X, ,,@YD PPH@!@$(,P88CB*B  PA`CX$(,@ X, ,,@YD PPH@!x@$(,P88PCB2B  PA`CX$(,@ X, ,,@YD PPH@!@$(,P88CB:B  HA`CP$$,  P( (, PD HHD@!8@$$,P88C $0(@ B@,`@ A 0 aA@P,  `!,%BQHX XA0 XP@D,XX P! `PX$,YP*, ,PBB`X HF!BB0@D! , B8@@ H` a$(`0SD`gPA@)  F((P@B !H`0H A  @X@@)@Y HR@D@`0S @0,@S @@@`0S $ @L@`00 ,@XPD B`X HH! BB @F! , D $`N!0Ua(HMH@` 88`8 @p<B@C D r0C$BP(@$BPT!@q  B  @$BpPC`$H``XPT!h@ @!8 8`C @!p" ( 0Pb ( 0" (  B@ @ IP$I0$@I  pX@ "R#, PQTt)bR A#!`UX@`R (}(, 0LX@@R =$, P0B5q$PC`$HY XA!0 PA!B8@@$0~F`X @ "@H$H H0  H!&",$1pC I!B p@!B@8Y,(Y, YPH@ H !$ 88pC I!0B XD! B@8Y,(Y,Y,P@I,"00H`[?R`@$ s p@!p1 0YXD!,Y `t `0y $@D @  @"@ @ @XP@D!BHUa@may beis .FABXABFHCXABALLXABPROXABDATXABRDTversionXABKEYunknownun%02xexelnk arc dir lab sys hid rdo textebcdicbinaryyesnonot Xu %3d%%8(null)batcmdbtmcom.r.-... %u.%u%u.%u%03u-areentryentries11 @ ppp ```@``````````````````````````````` `````p``````````````````````0```` 0  0 0 0 0 0 0 N ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]ZIPINFO.C;1T qk,z x vz`_֪00ժr0 $ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14{H{ժr00   0}%j@@`%ˬʪ0 yy.}!/}_Ǫ_z?z u tz?zt׻?vy?y~  pv p* p s 2 0//i}2 0//y{ x(x.Nw=0;Nu=0@%լ0%g ~0 ~  0P0P"r't0~?   _q%~@p %g0#} ~%g0#} v"{~'g@ %[%[;j[%[;Eoc.oclwwvv )do"h0?g@@#h^Pn@0 t~"^zo}dB& s/ s~@ vA s v rpjR  %z0{©@u0~v?ŵ~0z?Ūz&PzOŪz?~"^Pxxx^wʩ(t1 r}}%}}}}}%}}}}}%~){#0zx _{z xy x%%%xy{%Njj wwx{zyxzyz&y(zvw%N"%%]%^%[%[x {{~y}  qx#yx xxvop uo%x uq%njnp w&Npz{zgp`pp}&^~~~~|U}m~~~~\~D~~##vp\5%X%%%%b<hh%.%#%%%v%%eXQXwg7%m%g%5%P.2%%%%%qj#0 %t. Q}}zyyy p~~r#}}@`{_{ο}ӫ}}Ӫb`}ӫh~u~gf}yz}@%~~!b©bk2 / Nr#i}%}өg}%}өg}Aӫ(#P~~){{~cq~%&%%px {"P"^2 / Ȯ|| |2|pPxrs}%`P#/iP  ` `"`!`"#yyxyϩ%%.g2.`#g~%~}N1 r}}%}}}}}%}}}}}% #0zp yr{  xzä(y({> u y{{{{y}} u   zxz{y%y!x{{y)%pPj#%%%%}}>/x {{~y} rzr{ v{{v x{#wot{ok v r xo)s{wxop w mO t0 xRzz/zx%o s{ 0R *sw  w1 w~y^^ {{k{A өA ӪA ҪA ҫA ѫA Ѭ  e!Q?0z}0~yy}`}` @%.ZIPINFOHP C S7.1-012zi_optszi_end_central*zipinfo*Wzi_longWzi_shortzi_showMacTypeCreatorzi_time,.shstrtab.note$READONLY$$CODE$$DATA$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$.rela$DATA$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]ZIPINFO.C;1DECC$$GA___CTYPETDECC$$GL___CTYPEACENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGGZI_OPTSZI_END_CENTRALZIPINFOCENTSIGMSGENDSIGMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSGOTS$MOVEELF$TFRADRUSAGEDECC$ISATTYDECC$TXSPRINTFFZOFFTDECC$MALLOCREADBUFDECC$MEMCMPPROCESS_CDIR_FILE_HDRDO_STRINGMATCHDECC$FREEFNPRINTRATIOFIND_COMPR_IDXEF_SCAN_FOR_IZUXDECC$STRCPYMAKEWORDMAKELONGDECC$STRLENDECC$STRNCPYDECC$STRRCHRDECC$STRNCASECMPDECC$MEMCPYDECC$ISPRINTDECC$__UTCTZ_GMTIMEDECC$__UTCTZ_LOCALTIME   3EWgwh p p   (/;COeou/DZ@UQUl'y'p J' '+~'@~'@'0''e e e '__p _- UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14ߢ_p _ (_0_ 8_+@_0H_+P_@~X_P`_@~h_p_px__0__0__02X2IrI q    h  h I I  2" I!A 2b I! I  2 2! 2 I!Q 2p r I! 2 2 I! 2 I!B I H H 2I!"20212rI!2I!I p2I!2I!I I 2"I!A2bI!2I!2I!2I 2I!222"I!@2A2I "I!A2bI!p88I "@I"I"A`I# 0bI$I%I&I'I'I&BI(I bI+I@~I)2I&I& I&b!I&!I#"""I #0#2#I 0$2xB$I*p$2p$2$$$I!$22%I!P%a%%I &&2'I 'I(0(@((I b)I()))))I$2*I$R*p**I 1+2+,,@,B,`,,I!,I ".I+B.2.I).2.0/0/I!2/2b/I!/I "0I @0|P0|0I 1I 2|2|r2I 2I 3I R4I p48484I "5055I R6I 6(6(27I 72778I q82r828I 29I0b9I :I,b:I0:I ;I0B;I ;I p<2q<@<@<I!<I @=2b=I!=I 2>I >I R?I ?I a@2b@2q@2@@@@@I "FI bHI HX HX bJI-KI BPI PI `Q` qQ` QI Q Q RI AR2PR2RR2`R2aR2bR2pR2rR2"S8qS8SI qT T TI U U "U 0U1U(2U@UAUxBU(QU`U aU pUqU(UUUxU(VI.VI."WI \2]I _2_I "`I `I/`I aI.BbI bI/cI."c2xrcI cI/dI eIReI/eIeI/rfI fI"gI/RgIgI bhI/hI bjI jI/ k2xkI lI/lI/lI rmI 2nI nI-BoI0oI-pI0rpI-pI "rI r UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14B;I/rIrI2sI sI.tI/t2`t2ht2P"uI1Pu2H`u2@pu28u20u2(u2 vI.RvI wI rwI "xI x2!y2zz2 z !z0zQz `zrzI 1{2{H@{ B{P{a{Hp{ q{{I 0|p@|pB|I |`|`|I "}I&}I A~Q~~I+~0~0I-@2hrI P20p2`2`2`"2HI I22@2I3P2bI328I320I32(I32`RI 2 22I!2I0rI4I0I4I0bI4BI*2ҙI 22@2I!I0I4I,bI0œI0I42I0rI4I)2I&RI5I5@PI52I5ҡI5 0rI5ТI5`pI5У2L ң1I Ѥ2L ҤPI I6I7¦2,I-@0Q0bI "I I bI %% % % %%%% %$%(%,%0%4%8%<%x@%D%H% L%8P%PT%`X%p\%`%d%h%l%p%t%x%|%0% %(%0%8%H%X%h%x%@%H%P%%%%X%h%%p%%` p#0*04;@Np\Fd@ l`   z`8 `p`` `P0@0 p h8+  h`\#V1.0ELF 2@@)0$a0 )a0 -a0 )a0 &ac0 1a0 :a0#ay0 )a)0)a_0 %aT0)aq0 )a0 )a0%ay0%a0%aB0%a40 *a0 +a0)aS0 -a0!a0 )ai0 *a0&0 )a0 )a0+a0 $a_0 1a0[p UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14s )a0 )a0"a,0 &a~0'a-0"50 )a0)aX0)ae@X`1x`1 5 5p7p7==LLNNO0OQHQS`S`V`V [ [ffiiplplmm o  o8pXpPxP@@00P P@`x  ````@@@0@H`+IPF/VMS29-APR-2009 07:1929-APR-2009 07:19VMSV1.0IPF/VMSHP C S7.1-012IPF/VMS JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC;Zx0NmSYS$OUTPUTDECC$ARGV_PARSE_STYLEDECC$EFS_CASE_PRESERVEDECC$EFS_CHARSET[]*.ZIPerror: invalid response [%.1s] (EOF or read error, treating as "[N]o extract (all)" ...) `B 5 H`HR9HX (!`X,Xp,XP, H@ J! s  (B1X C$H $l0 0H  *0H0  L( l# ( 1`#X* C L*0$ AHB %1!yL 1 C |0@$!H $@P 1 C H6P$H PT xV0C$H 3 Dp0 Y 0D0YPBB 0D cC$H@ $0 B S8"`, H @ 0( P0 (HX   ,@XP J!,@HAH H$ 0 pHHp<B@ h$ `y1h$,Y !PT!03Bd (?#H1!p1BB3B@DPH ,  LB P @( #P!! H`a T!@ #P !p ( PCX1h$`H@ 81i&$`0 `Z(a$ $:XV2@ 38NI`XY`D PT!"H `$0HXV "B8Y (F0 (!P$B PP!B 3 `J!B`Y , F P@D!`( pB! b$Ց$n)pY $ H XL! H + JR$H #@DDpB X N0 `T!,`XFP@$@(! H`a(JP@ J9`s PG8C1i&$bH@ % @`ZD`"H`I @ $2 $I`XY`F PT!"H `Q$@HXV `BY (H0 (!P$B PP!H@X `J!B P, d F!PT!JH` h$0 PC!!H `N!#XD!, A0 ``@$B(@, HUe@ha BH !`8 @ @@<0  `!8 CP$0B BB C c!YP C s @8C($ s(Jp C0a$pBH 88` @: 0Lp N8`,214`0  2)=Px@0CH8p$pCAB! ) h80",H0P 880~F F8 qki`9@pLy8P!B`TQ! (D0R8)N ,qX $q`0%P8$`H4aL8(qM8p0G0LPC B C0#C$@H 80L0 (#Hc`@p@? &P < ,@YP08H@@ aK`` x @0PJ!~F/ ^!W"/ K + J`C0H8C$PqB (K!/ P*/h@ P$PB +JP/8@$PB J/$H` $h0 , HR@B@@!L>#0~F 4@YP J!BA( H # T!B+ ! #P qB!@ # x C0c@C J!0BxFP (K!  J@ #@i$H. @ V/ @`/@0C (K!  ". / @L cC$PH (J!`X0 @s+ *`0PB`c+ ,PT - 0@0( P. h# `WJl# @QJ@CJ!HC( :x@ t>i$P–B%  ` 0 `@@`a!@I J&RJ~F @YP P8@ B xC$P!F @ BC8F9CF9CAA?# H @Y `!  H. O"/P !Bh@P !H@@ $@)P@$@(!@`(CH$Pp`P $0$0 fd2c !2 BP$B xP!H@@X F!B@Y ^!D P!B@ P$BP D!,d ^!#P (K!  R80CP$, TPP@$@@CJ! HD( F0@ HxJ! H M=# #P P8BC%@bLH`D $@ @`H@F IPHC @P^!#H $ H@` p:B@ 0D 0 Y}0!P$B xP!H@@X L!BY ^! H PH0CB C P!#@YB!0 HH  B0 0` ^!P@$@P%@p) A?#2@@D`J@~F `J'"/ J"/ `J5"/ @J #0C $0#$(@ $ L0  $PT0 @ WD #@8bpdCAB!p CXqH4CX8Xq JY `C a$p ]@ .X .!p\0 p!\)8Pi8I8,18 B@080C (J!A2,d)P 290dsA CBp!@8C$J`ä Аa$00 H h$ m@ 5 0a$l 3$Ku@60L P ^!`0 @D8$@p(a$hN`2@D @(c@!P@0T`iaD H6  UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14" 8b!00#uH,PP!H@@X N!B x ,@PT!P^!sH $ 0 PD!!H` R!# F! , C0 ``@$B@ !@$ K`@PH) A?# B@0 F"/  T + T@H + @"/ J@ #`C29C$ H 4 H0  P1T!ר"/HT@@21`C$@HD 4@P0  P1T!0# kT #H@$pH 4p\0  P1T!ר"/\T@$H  aK!l0 (8`B H@(?#"B 6pp  ,8YP^!H@8 !K!@H(P ^!@0 `)$HA+ 0L 0 PTBP>HNpB  #@+  #`/ P^!0`B ( DH@F H HR0  NP #P^!@ @C$ , DP@$H@QB!H  $0b,`XR! ,`Q P!~F`@P^!0 (@C$ , DP@$@8$ H`( 0J!p0 `F`B!@H( $pB C @/@ @ , XO,`8 6  (0IL@ n@@APB@ 0(P/ 0(P/ 0(PP# tN`X0+ PN0C 8YN!   d. / H, `$q0C 8YN!@  h. /(J!K a E?#`#",@a!|FI `N!",bQ?#p^) "!@f{SP,$*` BX$,X 8aN!\0#@ qS?#F"/PD@ (`@ H0 B x8pCX! 1B $@`!0H (H#&P!F  B@C0F9`CF9C8QN!H N0$@ `NH@8QN!H XNXD@ `/N@!@1B@P*`0Bc!|Fb qEX0# .P,X$,X0pCBGqS?#HP P!(@PPT0 B xKP!@J!yT1@C h$J< HY R 0 @ 8QN!K HNH(@$NX@H $)@5P("P@R!@0(`C8$ H` L!0 &d2Bc  !P$B x H! P@!B 3 V!B@Y  ,  P P!B@ P$BP H!,d ^!#PE?# H DYP@$B@ $`H HC!@0 @,PBB (p K@ A?#"/J0~F [D"/ SD + J"/ J"/ JH #@@ 8"pCAB!`p C\q}04CH8\q@ Htd `C a$ a@ 0X 0!`0 !`)0PY8m188AA?#H@` B`X X}V! ,hP!X@$q@0x49hr`` H4pkh@xpY@8 CP$JC h$0 äHa$$> y@ 3 ` x @>!R@`Ea$P ^!0 ($R@@ hJpJ@$`(c@!0:@0Hai@aVB@PH!H@@X P!B xP,d*HR!,P^!sH( $ 0 P(J!!H` H!# T! , C0 `` ^!P@$h @($0H $P0 FB H Hp0  (J   ?#P,@YPT P$ B$^! P^!0B  T!H HRBB V@ +VP #`#PA?#B x VP", C " ((Y 8F1`(q@Y p8@8CP qA?# " ( , `CAA?#0H`N (@0 0 P,D* XJX # JAA?# AH`@ I@ Y H!@$+ P/ H 0$8C a$0 M@ &`X &!@L0  (,"L0#  CTq0C HX!`$  ,. $/H! J  b\@ c$BP V8  B x C$P!F  B@C0F9CF9CAA?# H @Y `!0  . "/P!Bx@P!X@X $ )4P(a(@V!8@0(CH$P p`P $0$0 fd2Bc!@~FdP$B xPX!B 3 F!B`XY  , (V P!B@ P$BP( J!,d ^!#P HY 1@!` L80C8$, NPP@$@ AA?# (,ց (aPX@J8C$P! ( xC($ H T!0 d2BPXF! H x !B`0AA?#P!H@@X V!B Y ^!B P!B@ P$BP B!,d ^!#P LY 1@!p N80C@$, PPP@$@AA?#@"B`@ XR?# " ( (Hå~F`T9 ($Z + H "/HP J8BC % `LH@D $ @ ID IPB@P^!#H $H@` P:B XR 0 Y}X!P$B xP!B 3 V!BY  , (L PJ0CB C F!# N! ,` C0 `` ^!P@$@$@K  8$ 0 HR@q$" @P!p0 HaR!0~F P"/ `P + @@ + `R8 +RCP H 00 "1PC"9C $0L0  @P!"/@P"1PC$"~F *¡B @"/h@ $p\0  @P!"/8@ $d0  @P!̠"/ $l0  @P!ؠ # @!q@XhUc`HMH @h$0 p !!@p<B@ X`XY88Cp!i$0H c !@`xA!, p\0  ,XPT!p PCH@!0 H  $  BPT!(@ @!8 8`C @P!0`#",0@bB (0" (  @  i$ @ @`I $IP$I  `X@`R<&, IL)R%, O~FbR $!PYX@R }*, PX@$pH 0p\0 E8N,`8 0\ ,hYP@|F`A< 0O># (@<8AO>#B`H@AH@0Y ,Y @L0  Y , @@H "HH # NH @0 @ B@ @! ,P7ן UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14JT!H X$0 P D P QA?#@ +@HUa@05H  h$ 0 p$Hp<BPHy @ 0 @PYA!,@PN! 2B@d H$@H X?# 3B  HB B ! # $@X +,BI #P@@03B  N!@ #@Y @P!0  . "/P! B 8 FpqC$0,  @D!0"@FP!H  @H!BPH 8p q 8=9@8@C$H @F P N!,` `!P a&H !`8 @ @<0 x00 B C@ $ 0  D!0`",88 C! #@ D!0@",90C@$ H @x@10H C $ #X@ $0 H  H$@0 I@$pHD$@ H@*@  HR0 8N"!@@0i&$H X!!@`XhPL!@ p  dA BhYh!BPx!H@X \!0B ,Urx_!Pd!@H`p $P0 Pp]!!H J!#hH!P, @ Z0 `R H 0,PPH A!BYP8 8C$00BP@?#0B  ,B @P r@C$00BP @?#@X @ #0i&$ H@Q %@ C )@ $P%#`X@B` H!2, 0`xA!B x^xQ88_9`CH<_9 CXX_9Ch_9@Cx_9C8_9Cp1i&$Ha N!@`(p\P$, J!0 pH!P ,p\`h `00BJH@ p$p #01 HPJ@ @01H J@ @00BJ@0i&$@H # J!  @  h  P$ , J! BB@X H!2, D `@B, `@! Љ:H $0  !!@  F  `F ,`DF q F"/ F"/ C@! @ `i$0 @ ( c C0$ H` @8`0 $HdBp$HX$H @$p qdb tI` `0c p\0 C `X0 @ HR0 6:  @$P  @  @!pPC$0 Hz0 @@$ P !@z ~F@`C$- ! BXX  XP FB @ $  "D ("80C$- ! BXX  XPF!B G@ #`X G?# q C F!F"/ F!",,, PC!0 B@,Pq L$2Ln) L$0M^) IL$H# F!E"/A@@ $  *PT (*80C$- ! BXX  XPF!B G@ #`X G?# q C F!F"/ F!",,, PC!0 B@,Pq L$2Ln) L$0M^) IL$H# F!E"/A@8@ $  *PT (*8C$- ! BXX  XP!F!B #F@ $D0  "PD q$`CZ)H !Z,,  XP1F!B #F@ $D0  "PD q$CX)H !Z,,  XPAF!B #F8@ $  "D ("8C$- ! BXX  XPQF!B `#F@ H$$0  HpP$q`Ca$H 80 7z b BP0i&$ H x!0 @P!B 3 h!BYp! ,Fp,Pd!B a$B CP l! HY N!# L!A0(n` `x!8@0j9 C!$ B 3 T`,Xp "BƷ $p",Yp!P88C1i&$pHG $P @f~Hgj`BPnP, C $@0 $B L!0 @  !` x!l1CC!PB Bq-! p0~FXp5C$ ,  @$@x ``xh p!", PT!O"/h@$BGPx!8@j!(@ f! p! q @T0,`CP$ ,@H$P )@ T $+ p $+ (!0 @f ! cJ TX TP @T+ *T#  D!,0!a@T 0!c0JH9 `CFh,`xh8PCА4!l, 40C 6!l"/ А4!h"/ 1F!",|, @C А4!h  >!}"/ ~4 F!$ (F-`CА4!0,`A P4@X,Pq (բ(n) ()^) I(P,#5(@ ! @H!@XU  H@(@@B(Y880C$P H! !@!Pƒ",P,P0C$P H! @!P",P,P0C$P H! A?#P" (P,P0C$P H! Q@!P  A?#`(Y8 8C@! H H,"@$p P@' * T$ $y+Q% dP y= -B PH!,DB! q `@pJA?#H (@$0 P,`QJ Hp0C$P H!U H90H` $00 `@!,`5Z P! ,Pi$0"B P F0 @  F C@!x@($HX X@!P YP,( KP0 `(` T! ,@HA0HHFPK P!HX@B8PC 0!L!",(J4CX `"B X,B4! (@PHaa! $ X8X!$`Qh$ PL@"@ : T!0@ L 0!L!",$J8@J 0!L!",XL,`XYP8p CB8p, 8N8 #8Y 0!L!"/J@D8`C 0!L! 5@C `M `Y,P(@ @! , HU (=H@ !`8 @@D0H@p<BC$BXPAE?#p ( 0 D B (@CH$ , 8P@$(@‘ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14Q DD!0B`aHE1B@b 0$ HXD!, $,0#X",@ H$H0#@Yp,PL!p (@C$ , 8FP@$X@D!$`El)X B @ + D(Ub HA0HHFPK P!HX@B8PC 0!L!",(J4CX `"B X,B4! (@PHaa! $ X8X!$`Qh$ PL@"@ : T!0@ L 0!L!",$J8@J 0!L!",XL,`XYP8p  CB8p, 8N8 #8Y 0!L!"/JHD8C 0!L!",X8C X!/XD(4@C0L!(, M X PD (#0L!,, XL`XYP(@ @! , HU HEH` !`8 @` FPBp<B@@H8C 0$`0  8L8 @ h !i CX$ @h-C$ H 3 `!D0 8Y h$D PV!, C x$Hh! , A0  @ `@$BH@F0$` $ PV!@Z $` I Z BhI( 2 @PFB`8 P C$~FT@$,eBP8 C@$h@ F8B8C $@0  0JpBHN4C$,`P`!P8CL p$0PA?#P*@$(`C$~F (%h@pJ!$ PFB XB%(@@$H@Fp q9@8C8$`H  $p0 a0LPH@$ h0  0LX`,P V!B0( C `$0  `X H@XhA!` F0~Fu* V!YP8B(@ @! , Q `! HA0H !@ p (!@p<BHP!H @PD8CF?#H@ !0  $P,@  80H c!Lr B x"9p @X$!D,P @8H8@CF?#pH 0aG`2@HL8C4L 90H@'`C H@P$r@CF?#P H F(@x(L90CP@PBP(! F?#0+@@! B B!qpC@$0$C &hTr,a@8 C$G~F`2 &h\r<1@8CL, G~F &h`r@$Q@8CL, G~F&LB `(2 9h2a@8C#?#0X@`Hx 610Jp"8`C &hpr@$Q@80C$G~F,L:%(@ `M@ x"5C& H4@C &!O,(V9 C$X@(> 90 L@C&H 4& B ^!@$p"@81CH$H 3 X!$0 8Y` B0PT!`, C p$@B0(``! ,@  L0 `$B@0B4 C!PB@$8PC!`, 0L `  F?#50+x@ $$Ē h@! `I N!`@X0 PH0H PF 88C8$, 8NBP88 C@$@ 0$ # L J!`D i I PBtbp``I`X8pP4ā1rpJA8`p Y@!x@H!`B ` F?#B F! `C $hLr4q@8C$/~F@" $hTr@,Q@8PCH( /~F $hXr8]a@8 CH( /~F $h\r,i@8CH( /~F $h`r@8}Q@8CH( /~F$HB@ `(2 9h2]a@8CX?# P@`XHX61J`8`C $hpr`4]Y@80C$/~FX0H: %(@ HH X5C$` H4@C $!K,(Z9 C0 $X@`(> 9 H@C$H 4$ yB 0! (" (iBYE w0JpL8PCD BYP88`CL HP,*8JPB` FXH@$@X1pC $aCF?#H  X!0 @"H P0 XA!$p 8"B8Y 0 H0 ,P T!B0( C X$0 XV H@X`A!`XH!, PF Px@ $P `Y8BP*@ ,`Y@ P B( # P @! , HUb@(-H@`BAA Hp$qC0i&$pH C @@!@@@X8N, @@X   0 0`L!@$ H 8D8YPL!p (C$ , p BP D`Y 1F!0 880C@$ , 8Pp 0C0,` F $p p,$: 0N"/PL!p (C$ , 8FP D@Y 1D! 8B80C$, 8@P@$(@, (U@ (- HD`B@D @Ep qC0i&$0H C @@!0 @@XF, `X  !2, 0`0i&$B C 8F!  @ , D0  ,D B@D` `L!@$ H 8F8YPL!p (C$ , 8DP F@Y 1D!0 880C@$ , 8P8F H8Y 8N!`+ NPL!p (C$ , 8DP F`Y 1F! 8B80C$, 8@P@$(@, (U@ (!0H8F H !8YP8F H 0p,PL!p ( 8FC$p,PL!p ( 8FC$p,: N "/PL!p ( 8F`C$p,PL!p ( F0C0,`$ F ,@Y D #P ()H@@`B 3 H$pB@X,@  0 `@`88 C@ $0  Bq7x@@!H @Y !@!2, @ ` L!(U@ PEH @i$0 p!BBp<B @B@ CHa$H J P $  P HX ($ J H HR$ C @! ",8 CD! HDD,PV!@ q`@ $`H H`0  (J pBCP%0`LH  $0 @@PHp$"%@UR BP y 6yÕO&HE w$0]+h^*(S{Ќ# #}6XoAF܍M=m2E@`ۘo / L4V k ѧT²7ڣ* v?5s^,V^c8Q  290^%E2wQcEy'D`b7 /9[4S1ev`8. %5a:)EOB^аC@~cU>Gv"M*Cz@, Q{t;`/tAa8gngX cjYh-MQNT@ ךӌnmL9ȕA}& H/w-WPW Āx0t%8)7L2Xu?x YI&F{HخLzNL@l *_L2?v@Y $@[&l\|A!% U|X6SH)fRV5}XSq*D&,84),!{g9H6tj"wct?CvrcSm^T- B}|ß*"D 96/F朩iw*+"qH>T g{ ioc|x,E`Lk}%n/4R^[@J$?G2 a(x cUu~T)?9|6ޑY0RtxM_1G %2#(n W Kwj=3 + j:5%@)؃.O Zj@0~|IK@s }XcmO#0=;~B- 6~R< Xu' jk=ҝW jjNbFx.P9Bh5)c+89 *$A1̓32퀧Dbz5 2Ov6!rD'G&3e1%LVr̅7((-v]15&}sY$ǗvH~<1}7Ja_\l=!ݱ^[xͥ(9e]]UC b#Xv\9A c&1KZ6/)qCyB1SFW,ԭ`05WXK#Bb-} s!ҢaG!7B*ktz?&5F" 7VFگߒ4ტˍҐ1GS;Lb/ε]v$l-nP{cF_*:,S7Ү t b%9gP2Z=ąG@%2d&qd\863ӏBI)@BlMCcYmC>.\D#ZBTF4}B| ,s"nxCC$uS eIBŨ!FAnlhb#*Cx}/6b $!?VVAGג %] T05, +03 o_%ʶhFZ%T iOA$/Gg6!B_e]a|jB#m4%p0bP<1s鴌w0Ɔl kt7(@(-r[Ւ>}dpiN"q`#EPzҡ\&r#mh@٧x`āHǣ\C 0gü4 0!x*iw9ڼ/ oզsz`0B"qͰ%1uQ_"_nw4V>bq$̅l(54H eWk]"G`~x(ub'' Gj*Pn^G -NC)?.OBt4kAwwM?1h$t|<%!$b2 Zu{fpbZKA;v:;/j\\nfW& 81 ;>BgrT7 cքa8 xb1 J G@{$fD0y*)K&;) :~M}Ss"yYHtRyP"a|Ǽ:$gZ] sN]VBJ %A3^1F8^m5=lrr- J3.Bf0G.0M~l &~d у4o@!`CVG"k<tYNPVp`g'BDq׿U&I'"h'6P< ~fu}uCVSQ0w ж(XHt,nzcTcr/ #6 oDwFPYkO$x?? 0JP?]E5pKvZ_\&BpSQ2 '.g, 5%;`)gФ Գ1 cItD{K@YXDv0 ( y }\ f$%6pk`@@(yy @y 7R)U*@N A$ yB"1n 1 Z*^nN ~) = c!LpwFSU)xFĐ}Pه)`LhCG\]AYvpg@&rWYNB|tn5p+JQA0= @e+đaSt;)BX|4@K!,4!['^ :`f9CU4mE8X {t P -vC̲ q^$B`-$q1#](uGшAV@V9j٤|HP)Hga>AaГ"%T%8F1A0tCT{[Cv5&@4F0u_ $'& g 5E1ѭd)aI?*1%`&߸@x`78= *#+DZ% ^MDY0ǐdqDi@XS("!עb:*,@Q"pA`ͳJ^Fqa R|@QlAEfX!G 2Dt`D ؾL$^ p Tb!CIM1O\ _mA0@80Ǡ6= @` -@4( $0$@h(Z!B`0P P@!B 3 `L!B@Y@P! , (J P$!HX hN!+@Y `H!#@ P D0 ` V!$BPV!@0$PB H  0L2@ X!P @ B X D4C(%bLHD $@(IN I @P@PV!"H he$H`X PʌB@Y 8B0 8!P$B XP !H@X hN!B X, T  H!PV!H p$0 PuB!!H hF!#@`L!, $  P0 0`V!@$ ,P 8p B XC%PbLH`D $P@`H@F I (JB @PV!"H he$H`X 0ʠB(Y B0 !P$B XP !H@X hD!B X, 4  H!PV!ЊH p$0 PEB!!H hP!#(`L!, D  J0 0`V!8@@Q$0$ N:@D8$B` N@ N@@ +NPhO, X,Pp (C1i&$H@X `%0@DF2@PV!"H h$@H`X bB`Y H0 !P$B XP(!B )$H(YV! , H PBjB C hP!#xYF! H0H FH F`$B XPV!8@ @!@"",H8C% bLHD 81N!",`ID 2@DHhF ,d"P V!@0 $HohF@"@H -> ``h!0 @4@`Z!0B@Y P !B 3 `J!B` Y H! , F P$!HX hP!+ Y `L!#@ E0 `P` V! (i$P@ (J(Y88 CJ8@ i$0@ F 0i$`@ L @$@",AP@,@YH8@C H!"/ D!%"/X@ H$$0 H H "B &D @Q?# (,,`@C D!  X!,"/ .D@P! "B QP",@P,(YhP8pC A!` ,8 C 0(!@P"/ (!/Q"/ D! #@$ H `A!h0 Q!`0B @h Y@!,P@B F#a D! #@Q?# H `1P`YPV!p (C8$ , `NP @Q?#@b (@,  Hpq0C($, `JP@Q?# H `P`YP V!P, PUfHXUH !`8 @@`$H  p@P0 x 9@!0 @@ H `!, $@, ,@ ,X( H)b( H) H@, d@/C$BXPAC?#p ( ` BB (0C $ , hHP B0$0BH 0L`B 8M02@8 FqH@8C i$ H`D H @0 @$`  ,PX!@ q@8$0H 8N0 0 HF 0 BHCX%`LH@ $0%@`XHx$:)@Z0@BPX!"H p}$Huj !0B0Yx^P$B `PH!H@X pH!B `@,`4"HR!PX!H x$0 PEF!!H pP!#0hN!,  L0 0`@$0B a C?#1B`XpB@1B $0# Y0B@X D!H X,XPXC?#~F@P H!@( PB@ X!`2 @ @ PXp`PKK! X " D# 0L0YC$ , F!PX!"H p$Huj !0bBx^P$B `PH!B 3 hF!BHY , H P($kB@ hN!#YF! HF8@ %H hJ! IpH @HP H B `o HHp!-> ` 8)@  h\!0$@`pX!@B PH!B 3 hH!B`HYHR! , F P$,HY pP!+8 F0L!!H P L0 `$B `P X! A!00BbC?#B1B H $@,@X F0# Xx$,X PCBPhqC B  X!hYPBp ( `HB! H!P@C0$, hLP@$(@, XUbPHAH $$0 P!@H`@V!PT! H@@ $00  H @  (!H P”B,P @@ q@T! C@$@h$p$ I E?#0 @d:0AL! ,`E0LpBh@hYP0M?#H XN!8 # PP(!L @HX T!0 @(Y D # @Y @!  L0  LHU h]H@b @$`8 @H p 0 x@!B` ! ,PA H p ,P88 C (?#(Y 0L ` `(5! C8m$8@L 9C 8$hJ8C K?#`X   H&rPC ! 89PC X`XPH,N80C?#P~F() " J$ ,`(I @ J I@`" ?# H 2 H( 91PC$@, $P B`0Y* B (Y,1BX@$pHY *!0 0 `0YN Bx!,  $P \!(h$B Ap0  (J P P,0C 0Q$`@(@ 0!8qN!H@OH @ 8%@D 0% #(,P0$H !0  HR0 `X 8`CH$HH L$0   YP \! 8D8HPTCD9C0AL!H M #`XbΚ~ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;148. X p PCP0$H T0(@ "/ GT 01L!P", XxTH!PC,!`X, H$`$@S \@ Y+ c,X# P$ R:!t,QI x@ u+ W: u# 0QL! c", @Y88C 8O!0",Hf8`Ch!@, H$@$@`Q l @H+ "/ ,h!d! 1B dI0#X@1@!0A"Jc A0L@0 $ ($H p B`Y T # dF ،+`clFx@1@!A#N# 8qN!`",cO HH!H` X0 @+ Xj # WT/C!@!@H@qR HAH( #PDH" @Q!0B`Y PpP?# B`X T 0$@ FG"/ $D# W "/ T D@Y T @+ D#$HO 2@ `G$@, 2 YP\!@BB` PR!H`K  H B`cH Hc H #R $- #$P\!0B I XR!H BI xL AB P, % # ( E #$ HP !p ( pC$Hc  !0 @ 0$P\! p  @$0 ʀF!B P!H @X R!B Y \!@ 1RP@B!,c \!0+PBB HP@P!@H CF , X xH!`Q 0M?#+`F!PX!p ( pC$Hc !0 cH$P\! p  B!@H HB`IRx`!`BP@!B 3 L!B@Y , P PD!,c \!H+B B DP(@XiP!H`A R! A X$B@%P @`X  @P,0 6 @(!0  ЯBXL` ,B HR,0 U T@D0 0H #H 0 # `F-#`C T!H&9C $ B` 6!o,X:8Ch:9Cl8 B`# 7 xpC8<9@Cl8 B`# 7 Lp@xA!0B b !0#``H `@,X b0#@qQ0, & !H!PÓ~FYP0Pp (@@ \!B(C$Hc !0 cP\! pDK $HVr(Hx`!BP!H @X R!B Y \!B PB!n)Y x !X + p BB HP@0$,`RI 0L"BXV`"B`XY @L0 B`X 0V!P Ձ n)X$P !^) @ # LT,$RDE^) DQ,# 0L0M+1R P&@!p0Bb Ƞ!",X ,\0#`X 0d0# $,X !H!PÓ~F@PHPp (@@ \!B(C$Hc P!0 c$P\!P p  XL!0H FB@ Rx`!@BPH!H @X H!B HY \!HR PR!,c \!+ FBRPxP HxYP \!P$BPh$, p 8 ( # A$0@  B@R` @A1 @?#10 ,@H!BP!,BP `X`#X8(`a2PDaPB XA@A $@XP `)Xz)BD `t (t PI!(<sy,, P  ` @# Aց(B@HX 0O~F`2 P`! ( PD `X @HL g P",X@(*bD P(" H(@C$!B0D, Р1  `L1 h8 hP `8 r< a 8@A p<A  =A rA 4 4@t P( @8(8C X!@10,0,Bˈ 01  Ht Ry (ALB P( @P"@ P @AP @ (!P q!AqpP8C !p10 0 B 1P `R1 PNt P`qQy `TB X, X,"@ X, @, @ @!p@ qP8L18!`"@bEˆ!`"@ `0 H$ @ H$ H$"@ H$ H`$@ @$, @XH1HI !`8 @I$`$"Rp<B`8 b@ }H, PA!Ph)`I 8N, PX@0R$ $3 XA!@ # P0RT)P@0! L)` G?#'!"/@ AE!/!"/ P@H @! + ` BP@! B 2$0BP8 80CX!P@ (@ @! I?# q@C(A!`0B  (J(!@ LpJ8A!p``8Nt@P`F4`i0C@!~F d4 @!l  , `@! PQH p$$0 p@0H  p00 x  `F! ,pYX!Ph$B V!P>H8aG!PV!B  PpG!0H$B @0  F! # @ + 0 # F!0 #D PV!B@ N H`AG?# H! D0 0  L( # () #PV!p (@C8$ , `NP@?#x@ QH!pH 0$ b, ChJ!,@Q`N!, LPV!p (@C$ , `@P@?#@F!0B @$  "$` I 0 0 I 0 a PXI 0  L@/aL0H@ !0 bhqG0~F 8 8t0# D  B X p$@y0#X>,@!N!,- 0D/ 0D/ 0D`W/G@PFp ( X@! @ P`CH$ , `P`F H`YP@?#B8@! HcP 8B`C$BP! Hc V!@ #P V!@@!AH`H, H0 "@ N8  # (`Yx$,@Y (0 xY p0 Y,PV!H- `$0 P H!PB@D @!0( aJ1B`b HH ! ( X H",XD RB0` 2@i0# DJ'/e'D,X 6/`8O?#"~FD(DB D #P@PFp ( X@B! @ P`C$ , `DP`F H`YP@?#B@`F H`YPV!p (@C $ , `HP@?#(@, PUcH $0 0 @!HAH@` $`8 @h$,Xp<B@ x!<B`y x@!< + @PT! 0B`@ H$  H0H@Y H00 `EH @XDP$,@PCX$!HY h@!,0 PJPB `L!PBB XH! , J@$ p  BB ' UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14`@!B`P8!B 3 XL!B8Y , Pl@$0@ 8 $B  H@RXX!B P(P!B 3 `@!B`YB  ,@$B!P`!B pP$BP D! HY `L!#( XH!@0(J`@ $`T!HUa@HAH  $`8 @@` @B<0 `! q@DC$B`P8B`CX$ HXVPT!p (PC$BBx@$B`?#PT!H($pH 0LP0  8N` `8 hJ0Y,P`$B`8T! PT!`|F@> H$0H`XO># H` 00  8N! # $ #`<p"B N #|PT!>H > X $ H Fp~F  D@0  'N #N~F N@% +,"PT!p (C(A!@0B S h$0BXXa!, J@ #PA!B D 0L,d@(@ AN># H`HPT!p 0C$~FP T!p (C0!PB1B S h$1BXX!, L@ #P!B B0 Y B #8$H 8N 0  8N8Y 8!N #HUb@X=H@ @h$0 @HDBB ; C$HXDPX!p ( D0HPC0$pK 0L @"@` F@0 +F8@8% HP@ N H ` DP $U:1P DB' ($P0  Ip$0R H, `:X@d8R@,0Y8N, @""@d*E Hp,t*E 0L`2&@DS 8N #`0I0@ v)409 G?# #tS0N 0~Fd"9 F0 # Xa$-@ X`XX X!., #?#pDk`C$ D,  $@x ``xh$$  R &zX@ & &@ &@ Q@ P* 0L@ X!, #@o, hX. @`\0@gA`g 4!l@h$$: Pq^)`Q0 h:hY PpCPh$0"H 8<8iPC %$BP$ H1 X!00 @h!PO?#B@ `8 R4CH0P9C P$@)qpC X$H-i@C $ HDHh" P(!F B(@ $@$p: @ HI8O?#p qdJHP4`"JH8CHa$0K@H 0( @1P4 H HX`C H!&,@9,rY P@9p!XpOpq@p!@$(I$`9X@ J@1Px)& .@9PX@¨R$`X,X*, `\"@ DP. H 'X 0 $2/RD 08@P  ,PT BST `)b8 P* d@*2!$ #X@ a$  @T i@P@!hBY @! #,P 1 H p"$$0 p@``p<Bx 8A$$ `@`=By(!,@Y  3BP8$Bg J!B2BPJ!2B@e ,$He?#02B dP H ( # D$ #&$ #P!2B`@a P`!# | @@3B  `1B ($PJ!p C! b3Ba P! cD,@X@0Ba0$p, Pa!p ( ( @@ЁB(@ @?# ,  Ufa&@H@` !`8 @!qp<B@C-$0<BP80 BPC($@B H # A!P0 H P d!@F!@0$pH 0Lp2@ 8N8Y 8N!p0 pR)8P C@"$H@0L!0B L@ @7H@80H6 p2B F( #C 0M!",8PC$pB"P q BJ(@ $ #$00BP(9 C@$H@$pB Ha $0  N #8f!P0L!B@ N!0", 80H# $8H cP4CP$H `y$0 ` HR$@{H`@P P  B 9 BpC$H`@jPHP8B@C 0M!0",8`C$BX@^9@C$H`@jP HP88 JcCX8,z `^tp CPP!0B CC X?#x-@4px- C@H  |$ @ ! H@X $ H H(@""!Hp  (aSDBT(B@2H H2 \Z X 0 ` `(#A.!`p 2\B H!$+ @t, :8P :,pB< 9?#xB8!$+(BFk1`@Y 0(4PS@ j!P j, bB% i?#B+Ah!@$+@J(^4C`H@DZ P@X p(^4@QQ@ ((P (,bDB, #?#XBj"!$# J@@pC Pٴ@t, 8aqX@H<8`C 8, PH` :9|pc AB4ш@h!@ 9, ppC<6, Itv)@ 40Ј@Xl,ؤ6 @ : #68@@8, H! $B@l4ш@zJ 4 $00BPx$B@@@8P0 C $r @@H4PJ0L!q HM$q]i@8C%`LH@A $0-@ Hp PI`8x@sE@Pd!0#H $@Hf jB HHP0 H!, $ 1P$0B PX!0B 3 R!BXYXV!P , PX IPT!HX \!#x@!P,%b1  ^0 0 `X!`8B8C`$0BP8BC$N@$j1h@HP$0BPF`B L`"~CH8`CH%bLH@E $2@ HIXT PI`80\@[@Pd!0#H 5$Hf jB ^P0 0Y!P$0B P(!H@X B!0B(Yd!PrB@P PP!HX V!#0@!P, M`0 `0` d! H $@( @ 8$@ @(J H8J8BC$0B`aPd! $B [?#` iCX$H XV0  H HT8( (@PC0,(Y  J 0  , qW X@$0,P880C I?# i`J 0M! PqLprs9 XT8p]y@8 C Z!h@ 0aM!P J8 CH8@\9 C $# PH! P?#PiC Xp-rC P?#PiC]C] UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14Yn ppErC P?#PipC pIrPC P?#Pi0C@(pF8(`JPpBRa18,8C $`0 `X, ,XX@H28 CЀ+?#x@|$ ]i(P`*!HB h(.4pB0*TB <!tB >!hF0@ .`@,8@JF@$0BaPd! $`B PW?#`PiC($H (J0  T HR8@( ZPC0,`Y  F 0  , qW X@$0,P880C PU?#Pi`J 0M! HqLprs9 XR8p]y@8 CPV!h@ 0aM!` L8 CT8@\9 C $ # HT! H?#HiC Pp)rC H?#HiC Xpp-rC H?#HipC pErPC H?#Hi0C0$pF8&`J @P@A@8(8C$PH ,PT0 P,c 0AaX@H28pChB4@C 0, H ( 9hp@\@@8!xB@ 0, `p0C@$B4C\@@@ 1, ppC@=P, @IPv)z \@@X,R @UP @P  Pl 8@@0, PH@MAJ!@@ @B@A@( 8pJ @ $00BP$0BP @D! , U`HAHq !`8 @ 8<0 xP! C $0 1 C,(@H$0H XA!$0  0$  h`Y,P`$B`fT! PT!1B`f P!~F dX!0H  H( #` "H, #FPT!@B2B Ad X!0H@ H@H@` @0 | !$ #  (H #`a&PH( %08 X@ P8 8 c PpCX$PH  Pa$,0 H(JH`TRh$B5pjBPT!"H `$HXV , 0@0 0!P$B PP!B 3 XN!BY , 0L P($rB C `F!+pYp$BL B P D0 `@$B(@8!3Bg 8N 0L:@2@5CH$PH` P!$0 `@(J,$TPH82-@`PXL!PT!"H `$HXV p, @0 !P$B PP !B@ $B YT! , @ P@ઑB C `L!#pY8N! H`( H N0 `@$Bx@!`"0Bf @Y @`  8N8Y`,t2D0,?  0~F H& rC rC$, D0-@ HF/," 9Cp~FC ?#8 #? X,, ,B p] rC XfrC X!8 #? pir`C,pF:`@C X,, 8 # X!/,8<9J XD B x!XY XV!`2@XY Dh# x^xY @ #P! 3B X$ $,`XY H$V 0BB 'FC$BP88C$pH` (!0 D8N0 $@t2(JH@ @`(Y0D!PT!"H `$0HXV , F0  !P$B PP(!B $B`(YT! , F PF:B C `D!#pY@! H`8 H @0 `@$B8 @0!H`  0L0YPE?#B (aD(aC 8$p0  8NqPCXH!BP  B E?# +8@ ($ B~F D D`Y  0~F H%rM]G8 C P$P #! !0BY "0A ($D, GP!U@@X!@Q @ \F, X 1F!T# " "/ GF"/ TF #H @9pC$A H  ($x0 Xy: P T!`H 0L@@ @4!(! i C@$ @8$qPC$pŸ~F F + `N"/ `N8N!B O@ (`HOֲB@PX/N$q 'NP #0C $+~F L, @9C$BPT!P B LpqC0M?#0 H  H8@ @,D H8 +0CP$0:@D7 (N + LJ90C @pMrCJ9C @pQ rC @!P,*9pC0M?#p H  ظ$` `X,c d,p\@ l0 +@$`~F| >b (|,XY > )}@>0 C@$@XX!H$P0M?#P, T!   ,@$* B # `L0M?#, M" (`X,` @ #@ 9 C($BX@  HJ HXC$ H@ $0L0 `$H`a D0 d &H @Y8%D 0,hY E P!H X!B`cP L8 # f@!0~F@Ad H! #  B P $ # |) %P0!!p"0B`` $@ #`aNBFP D8p ( P=1@8 C !`3B`e $@  0L0I@,D2 8H#8Q F`YP88  B P@C$P@BA! Hq C@ $x@ $P—~F J!, `X  #@(J!@H@ ", H 0 `PPC(!J!(,@ $",XHgD,@Q P?#(#P88C0$H XD! #P88PC$p HP @ P 0DqBL8@ $P—~F @ J$B` PT!@$H` `BP88C$B@`b !Ha$DISK4ebH0H H #XH!P88PC$p HP @` P 0DqB F$BPXJ`H P,@ @ D 0! i C@$X@$B`P$B PPJ $ P0,1B J,@9C 8$p HN8 C@$@ $H # X@!@  `X YHPT!,X@90C0$, L(@ @$HUe@HEH !`8 @`H`p<B@Ai$PT! q # $H H0 `FBP-Tfd UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14 88 C@?#@0$PH `A$`0 `c(J@2B e8N03B@ 0L e8N`,hYP`Q$B`` T!`"2B8YP`$B`eT! P H #  X@! # PJ0 HP Q!0B@Dc 8! # X!BD@ #PT!p ( C@!@(Q$H`a h$ @PQ!p1B  T! # 8N`8YP$1B PP T!@H H "@ XD`XY88Cp!i$`H c !"@D2x!, p\` ,0YPT!p @C!P"H XJ PT!(@ @!q!p0B @p  081Gz?@ס` P @8 p08 $I pI pHp8$C@!?`` X ( H0 ( (P B 0 69 XH X61@  i$pH  @ $ I0$@ I$D@@|H, -L) 86X, PQTt)`bR0!UX@@R H|&, 0HX@ R (=", @i! ),"@!0B ca,0B"a 4d ` 0p\  C@$X@XL4 C@!(@.4 C@$@\J4 C@!@ 04 C@$@`4 C@!@$24 C@$@d4 C@!h@(44 C@$X@h4 C@!(@4B , HUd @b!!0C@9BC$@HA?#s@ X$$k P4$ %(IJ",B*"!HB C$8@Pd @ 0AP@ $XP F!0AH !`8 @@P!H`Xp<BH!,P!p ( 8C!0B@a X!0 0 b0$BH@T (0#c,X X!:HX",P ! H`@ N!@0 @* YP N!p C !0 0* !PCX8@C!(H@  `Q!P #p8@CX!QH` XXD`! #88C!PH (@T@ (8b BXDx@P8 C `$ #`8 C @$ #p8 C D@! ,` `!P 8- H @D", H$pp0C @$BB E@PDp C @H80C D!@", B @!P" (Da5«Y@B ,p0H  @@#w0C $PBBDP @@@XU HMH !`8 @`ZHp<B`{P!P!H X!# PP8 8 C $ 1B #`$@D8P$PT!1H x$Hp$0B`ZКH HPT!`"@  !!PH @B2B $ `JBXX!pBP $ ,8 XB! B P,PT!B @ H XVP`!B p!BPT!2Bd pA!H($ H 00 `0 xJ0  `X#PT!!HX `L!H@X XH!0  B Y !B0 `T!HUf@HE0H@FB@ CP F cC $`H` H`0 @` H =R QB!'/ 0L B D0 PD b HBH(@$B@CD!H XDXD@ /D$@H &0L PL(0C$ B h@PT0 cE,X D\0 hY* (YT,P T!,@HAH` P$ 0  P!P, # X@ XY@D8C$DBP0 0 B PPC$ H`@XP$H`Y !BP$H`Y !BP@!B (A@aP=9@8PCXJ8C $,,P@p@`H SXL ,pY,YP8@`@pH #XN,P T! !$@ @ YD8@JHU 0123456789ABCDEF      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Default: deq = %6d, mbc = %3d, mbf = %3d. Get RMS defaults. getjpi sts = %%x%08x. UNKNOWN DECC FEATURE: %s. INVALID DECC FEATURE VALUE, %d: %d <= %s <= %d. Open callback. ID = %d, deq = %6d, mbc = %3d, mbf = %3d. Apr 29 2009 on OpenVMSDEC C IA64)(null) %c%d.%d-%03dV8.2 .;.SYS$DISK:[]Can not create destination directory: Invalid destination directory (includes file name): Invalid destination directory (parse error): creating: warning: skipped "../" path component(s) in ..%s[ VMS status = %d ] stamp_file: sys$dassgn failed. [ Modify file QIO failed. ] %02d-%3s-%04d %02d:%02d:%02d.00[ Access file QIO failed. ] stamp_file: sys$assign failed. stamp_file: sys$parse failed. %02u-%3s-%04u %02u:%02u:%02u.00[ Warning: CRC error, discarding PKWARE extra field ] [ Warning: Unknown block signature VMSVVPROVRDTVDATVFHCVKEYVALLVFABIMwarning: set-dir-attributes failed ($qiow mod) for warning: set-dir-attributes failed ($qiow acc) for warning: set-dir-attributes failed ($assign) for warning: set-dir-attributes failed ($parse) for %.*s%c%.*s%s.DIR;1%.*s000000%c%.*s%s][ Deaccess QIO failed ] warning: error reading symlink text (qio): ) target, no mem warning: cannot show symlink ([ _close_qio: sys$synch found I/O failure ] [ WriteQIO: sys$qio failed ] [ WriteQIO: sys$synch found I/O failure ] [ _close_rms: sys$wait failed ] warning: error reading symlink text (rms): ) failed, no mem ) failed: mem alloc overflow warning: symbolic link (warning: error reading symlink text: [ WriteBuffer: sys$write failed ] [ WriteBuffer: sys$wait failed ] [ WriteRecord: sys$put failed ] [ WriteRecord: sys$wait failed ] [ Warning: Record too long (%u) ] [ Warning, incomplete record of length %u ] [ Record too long (%u bytes) ] exists: new [v]ersion, [o]verwrite, or [n]o extract? (Uppercase response [V,O,N] => Do same for all files): [ Cannot allocate space for [ Cannot create (QIO) output file create_qio_output: sys$assign failed. create_qio_output: sys$parse failed. has illegal record format to put to screen ] | UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14`/Cannot create ($connect) output file: [ Cannot create ($create) output file " to convert the zipfile to stream-LF record format. (BILF is available at various VMS archives.) Error: zipfile is in variable-length record format. Please run "bilf l sys$open() error: error: cannot open zipfile [ 00000000000000000000 P      (N ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60.VMS]VMS.C;1ƟT W,-ә./035ͷ789@, zz*> v {)0/0@uҪ/  vvv  t{xxxzwε.r%"{/ (u֫P}zz&˦}Q {lz{~}s˪ w x w yz xw xڭw xyyw ~h efffeaת0 z{#/ʮ#>2z{%#  ֩~}%&0 }}zz}yz>#} >{{z{wyt t t qyyzy'vyzw{wryq  u{ wz&h}h}x=Lw. E%S<L%R.R5qK'r G<թ}}& tx"z{sr w*> 20x w v? pp&i0[Ӵ%֩0yyyyyyyyy{} !sP xppxx xpxxk10%0 w vg r2.  rʮ#>2|{%Ӵ ֩0}%@P"թ0}%y& |{|zwz0˪}}{0 yyyb 2{Ϫղ g˽~/#  {o{{koooz u oz'0  ̴ʪ"0/  ){{{>&.2N&.Le z4L .P0pw zqt knR{p//  {{ v ϩ c@Y44 y/o g#~}#h}#h}#@/ʲ@ʲ@}#@> /1Nl0v!P%Ҭ]%~~xzzժ0}sP%@ {{>PPP0Bz P}  zz}% !_!kx!ist~0prm00 @ ypy~ʵ~p}#&   t  x st~0prm00@@ rzxʿs˼¬i0qs0ʫw t}op'rsP  w ww w ){{{{0.{?{{/ @ /{i>ʲ  `j#"{@$\1O~  s~}{{/ / / @ /{i>ʲm0& b %%_!jg#@ yy.b100~v}h}0~/ yy.p@}0gh}0~/ pp 'i!!ʶ!ʴ!˵"t {{N_  oo oo xxxx.immkë(Ҫ0 %0{#%!.!}0%}  ֪/0}}֪i1}@B/ x( p p p {{ϩ~ʵP*S.*X(X(V fxjҪ lѫ`{{)h%h}/  t s}} xu uiĪvzis  o~ootg%h&hP2 i!yyyyty N>{z{{ĵ~l?~.z!h%@ r u u{ήz~ u%u{w w%©"x+WsOrsǵOؤ'n Un  n+gwxx"^pU !...ץ v v/zrsP %"}0  PrsǵO(׫0%%. xxoy`zz{zz{{{O qw q  lz wwx  uz  v ?s%իȴ@ *W*V)W)W*W) { q {xzxw x s {{h}&&h}x"gih  xpyxhx` ^ x!y xh &h}}~%ʲi{Q~ v xnxvxyqn xx m ~u&h}}0}/   yyv w x x u x ugp orr!><0%Dx w w v y w v u %. !%h}. .@   w! t w %h t)P&""1}/>r}#r0~&׭njii@A !zyh  mlol"o& {ywxzy{z'z{ q*yʬ / #mk}@`xxx0 '}#ȴ{{}op}}>2s}f}Nyw&vzhw w wzhwzwΤzuhwΤzu %}tyyr&hf0^&0r'_0Ыx#}}}}i@&~&h s& y u/j % ~i@&s&h gcsy}~%˵\ &@ $q(X( %մ*{xu{x{z'u@0?~rs/{}~#R~{0 t 02@%({ p{t˩}.1~0P}^"r}qq t s t u s u v){ xs  {{&.'}@}r~\]hyy!hht}0}tP}#/}#%0 'kk{ïg{y g xةx%{gyr}#?b  u u{{  wز{ wsΩ? (~y{zpgz0 )'Y'Y'p!??00@@ *0}}0P UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14+M *}}0 *nnn Xx xxaBa*thz*Vhza0` +{{~{}İתt0. ,q ʫ}թժ#0 P0a/% @%.YVMSHP C S7.1-012get_rms_defaultscheck_formatopen_outfilebset_default_datetime_XABsbjreplace_rms_newversionjnreplacen{find_vms_attrs{free_upflush_flush_blocksWriteQIO_flush_qio_flush_varlen_flush_streamWriteBufferWriteRecord_read_link_rmsclose_outfile_close_rms_close_qiodefer_dir_attribsДset_direc_attribsДmkgmtimedos_to_unix_timestamp_filevms_msg_textvms_msgdo_wildmapattrdest_struct_levelmapnamecheckdircheck_for_newerreturn_VMSgetscreeninfoscreensizescreenlinewrapversionacc_cbdecc_init,.shstrtab.note$READONLY$INVALIDRESPONSEASSUMENO$BSS$.sdata.sbss$CODE$HEX_DIGITCHAR_PROPJPI_ITM_LST$LITERAL$$LINK$$DATA$$READONLY_ADDR$OPENR_IDDECC_FEAT_ARRAYLIB$INITIALIZLIB$INITIALIZE.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela.sdata.rela$CODE$.relaJPI_ITM_LST.rela$DATA$.rela$READONLY_ADDR$.relaDECC_FEAT_ARRAY.relaLIB$INITIALIZEENG$DISK:[ENGINEERING.GOATLEY.UNZIP60.VMS]VMS.C;1_flush_stream_flush_blocks_close_rms_flush_varlen_close_qio_flush_qiodecc_initDECC$GA_STDERRDECC$GA_STDINDECC$GA_RMS_NAMLDECC$GA_RMS_FABDECC$GA_RMS_RABDECC$GA_RMS_XABALLDECC$GA_RMS_XABDATDECC$GA_RMS_XABFHCDECC$GA_RMS_XABKEYDECC$GA_RMS_XABPRODECC$GA_RMS_XABRDTOPENR_IDACC_CBDECC$$GA___CTYPETDECC$$GL___CTYPEAGOPEN_OUTFILEFLUSHDOS_TO_UNIX_TIMECHECK_FOR_NEWERCHECK_FORMATVMS_MSG_TEXTRETURN_VMSVERSIONMAPATTRMAPNAMECHECKDIRDO_WILDSCREENSIZESCREENLINEWRAPCLOSE_OUTFILEDEFER_DIR_ATTRIBSSET_DIREC_ATTRIBSSTAMP_FILECOMPILEDWITHINVALIDRESPONSEASSUMENOHEX_DIGITCHAR_PROPRMS_EXT_ACTIVERMS_MBC_ACTIVERMS_MBF_ACTIVEJPI_ITM_LSTDEST_STRUCT_LEVELDECC_FEAT_ARRAYSPAREX_DECC_INITLIB$INITIALIZEDMY_LIB$INITIALIZEOTS$EXTZVOTS$INSVOTS$MOVEELF$TFRADRSYS$GETJPIWDECC$TXFPRINTFDECC$STRLENSYS$OPENFNFILTERDECC$MEMCPYSYS$CLOSESYS$CREATESYS$CONNECTSYS$PARSESYS$ASSIGNSYS$QIOWSYS$DASSGNSYS$EXTENDEF_SCAN_FOR_IZUXDECC$__UTCTZ_LOCALTIMEDECC$TXSPRINTFSYS$BINTIMDECC$STRRCHRDECC$STRCPYDECC$FFLUSHDECC$FGETSEXTRACT_IZVMS_BLOCKCRC32DECC$FREESYS$SYNCHSYS$QIOSYS$WAITSYS$WRITESYS$PUTSYS$REWINDSYS$READDECC$MALLOCDECC$STRERRORDECC$STRCATDECC$__UTC_TIMELIB$SYS_GETMSGDECC$STRCMPSYS$SEARCHSYS$SETDFPROTDECC$UMASKMAKEWORDLIB$GETDVIDECC$STRCHRDECC$STRNCMPDECC$ISDIGITDECC$MKDIRCMA$TIS_ERRNO_GET_ADDRDECC$STRNCASECMPDECC$__OFF64_UTC_STATSYS$NUMTIMDECC$EXITDECC$STRNCPYDECC$FEATURE_GET_INDEXDECC$FEATURE_GET_VALUEDECC$FEATURE_SET_VALUEDECC$TXPRINTF     3 [ A O O oZ `Vh s S~ @"5HQ Xj|h ~ P) N @ @ 0   `     PP @  @ m0( p: P`L PWd!t<}   ( `   t *3< GSbnw #0<HSgmw "-6AMZgrSDTDZ@UUDZ@UQU'&''' '`1 ' 5T 'p70 '= 'L_ 'N 'O 'QP'S'`VZ' ['fq'i'pl'm=' o''p'P~''@' ''0'P'''%C UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14\"'%' &'`''`d''@''@''b('('''e ee'____ _(_0_8_`1@_8H_`1P_ 5X_X`_ 5h_p7p_xx_p7_=__=_L__L_N__N_O__O_Q__Q_S_ _S_`V_@ _`V(_ [0_X8_ [@_fH_xP_fX_i`_h_ip_plx__pl_m__m_ o__ o____p__p_P_8_P__P__@ _p(_@0_8_@_H_P_X_`_0h_p_0x_P__P_____ ___8___X__ _x_ _`__` _`(_0_`8_@@_H_@P_@X_`_@h_p_x___ ___@___X %X%u$%X/tEQ%X0  RIWr*\KJI*KJI21T"2 @"IX@*P ` IX%$%$BIUa11IUIYIZ11A1I[2 @2 IUIY2I\2 I0I]B1`1I[2 @2 X IUIYBI\`2 rIU*\bIp11I=0 *@ (A Xa (p X & %  & %  IU2 IU0 $1 1A $P 1 IU IY I`1 J I K J I KI^"Ip7I^I 5IL02 @@2 rIUIYI\IT2I0`2 (rI0ILI_BI[a2 @b2 IUIYI\bILR R0R11"I[@2 @IYI\ 2 ` 2IUX(X*0(PRQRRRRR0%1$A%P$IU1IU1`X`XRIYqXrXXXI`2 8 I0**LBIa`2  rI0XXX*\ XIb2Ip7bIb" IL` 2 @a 2  IU IY!I\2!ITb!I0!Ic!(!R!R !(a#*#1$1R$I[p$2 F UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14k@$IY"%I\@%2 ` R%IU%IL%$%&%%$%1&&&&1B&IUr&IU&`&`&IYB'I`1'2(I^)Ip7)I^)I 5)IL *2 @0*2 b*IU*IY*I\*IT"+I0`+2 (r+I0+IL+Id,2 @,2 2,IUb,IY,I\,IT-I0@-2 (R-I0b-IL-I_".I[A.2 @B.2 r.IU.IY.I\B/IL`/Xb/p/(q/X//(00Rp0R0R0R1Ra11q112IeR2Ifp3,q3(r33,3(33IU32 XA48a4p4q484Ig444Ih!5$15$@5*,a51q515IU5X5X6IYR6I^6Ii6Ii"7Ijr7*T7171`81p8"q818#882 @8"8#88I["9IYb9I\92 P9IU:Ik2:IlR:IY:IY;Ig= =2=Ig=1=*,=1>1>1>%>'>*>)>(>,>+>P>>2 @?%?'?* ?)!?(0?,1?+2?*X@?PA?`?2 ?2 "@Im@@2 @ImA2 AImB2 BCImC2 CIm0D2 DImD2 BEImE2 E2 EIUFIYBFI\rFIT2GIn`G2 GIU`H2 HIUL*8BLIoLIoLIo2MIoMIo!Np1NprNIoN1N1NIn@O*8O*4bPIUPIfQIfQ*PR* BRIpR2 RI02SIqPS2 bSI0S*4TIUUIQVIQbV*XVXVXW21L W2 (BWIgaW1W1WIU"XIUrXIiXXXXYIiYIUYXY21L Y2 YX2ZIgPZ1`Z1ZIi![*X[X[X[Ii`_21L a_2 _Ig_1_1p`*0`IU`X`XaIi0a*0dIibe21L re2 eIge1e12fIiPf*0fIUf1f1!g1@g1g*0gIrg2 PgI00h2 (BhI0hIsh2 (hI0 i2 (2iI0i1i1i1i1Bj2 j*0jIrk2 kI0Pk2 (bkI0kItk2 xkI0l2 ("lI0ql*0lIrlIulIrBmIvrmIrm*8pn21!o11o1pIw0p11p2 @@p1pI[p2 pIUqIYBqI\`q2 rqIUrIplRrIxqr2 rIUrIYrI\sI[tIYRtI\tIot1u1uIYruI[u2 @u2 uIUuIYC|FO{wh6ճ3vUE;L Ψ3lFo&f/~BQ,V]0W=>t^sh~6]0%` kHrBlp9 Q{ywTP66k>aczs弱`=^&Rh}IBvi#C(џ{ #VIɒd![fZ rpC¦k24Ƚl]#_2ALoIm>Ϥ-w!/x=gpK"’;O'"*B'F; " tlU *9G! bGu)!P"2N`q9ϙeooJcƫ%Q*u vBs~»|fg`c3X0cnjlj nM(vXawU q}p^:c2{S*r+FxT~c-doqJ64`)4S]bkmsZhpI ]&96hѭT!Kx/GޮHV+280۵##YOzwT(L)T^TbNymFQ5k r,vu=Qe对Sw@K_bTtCh.{6= aDC28#I}HKkCg%d5U[\^[cV8{y6ۇMTapgB&=ߢdN!I2)D7FGEKBkOX&MK4&]-vU}OLC&^`FdfEw.Q0.INL'/a2"'4.6caX"x A;W;`@?A?aBqmwv² {_N zmeu$:]Z!ÄTqh@ony\ֽv=2zX,Sa֤[O>%"b!iאymA3R%EX [Q8=cpօfQ֑~1zHi~ck%cGFɞI&Ar ckӈA2G&L RtTvl8 Ob~ tbi#RS2dsy qwvH|ZO&͘} rT=.Wx hZ&-69[Ԯm {`dm Zaw B&e`jfU!)8:t+'(Q(B| f+x"kвi!r$ÇT"!%P V0 4 ]CqgvlWcJ\-fe@nt QXeaňX=0%@A]ޘEb :.$^wWE(t,5 kէ!I[!HOh(\uR2t8IW5n},q8@^Gq0;~&a0 ΖSNU5\s1hJF%/9C}E@d ͑6ANEfIJMJ0 F\SCuIfL7$-2GbUNuT8otZ.$jP[=p=pG0a"HBo.R020uzWN̊#vgSӭ^xXn\hdqE`PNO5tf7`ib"O5J{{D=If2x+ޱcg^@j>V.Хū-qreWA6*l7r?_4*^o`-_f;)-~(>@^DN:<@PnSRdOe^G2Es&g>gGDxu-L!P&oUV׻X: S&AirN˷x~;&DfV&[ز)$JOT`.7 С'l颲fSuI*b%N|D5VD`#Q`7tGt; W_o>iP4&·lȠ|~T{Pmؐ8b6S2m^dp`nVA`@O.^(L<}7..i+ #ALR}$4M]VI f]uNNl>ЅfdL3XvKEP0 t4hh eT5+=o_3KcOm Q IIVvIOWNYb-ePq.QD"5~USwۯPyZ2x}fV l_!VJSB*=E*F69}Zԏ~nHZiC[wH xKAUQ )1QoX2LJV5]^Yk-V3_{L k UpMPa C@1@=Ew4_E^gRC6һI{]]q8)-G\i`x|U+w\s⡰ dUS2Q[g%|1.'dt#ŧV}tq+aͮ(J۟9.HgdµN9!&F`dv0=P{e JWbg'iB%T7v&S/Y/7Y`2BK -)!ɕs5TaVW/q3'5ШkE G^ Fdwb/RfXt-sK hn#Bu@M nKY^7uBiVwQc^l ZIYYBA-TE*ʑ̷O Pd4=L/FD>rʖFYOK%Rw @ gcǙSgme7+V$/^O=\1z#WBf\jxօ/xj^<%wMq#S{   ~bR;0L+?`2g3HvZTu8{O1jyYo#MW@_U.R+tNFHQfV5$2) SWLh'5 s7bza8N.0~Z8XR,wLGfH$,`6t6>?qY/$ױ( C`!ƍ`SЌ>#}6`AMQO凹;8W_ SSyh4dY!1wly1 luzp4,ΐ!D`_$qPJ>u'`Yb@Lu ?XcrhFZi_sKoIM mnZik=[-Zv+>ڳ"7$(cFΚ״~#p/%t%Ķ D^{mHJsMzTF\KhB),{=ZX kr>GLvѝL; W$5+훼D1{%Wɗc[ӯQdi+kNH:ϴAr=/lfZf1 e>_P()M^IA}x66e)iX6g[ )7jtUd(J?|b]FM8w~wQ`D "M7zwOyTX8pKEXR{dt\|֡H$ZkTFtS?rߡ'E!sc?@fg_K|O#A/ í~.7($ˡ!" RTRWA*n,=2@/ ܒ~,&/ h7Y__dCcAk YS'Q7!aKV34O'蘂<z]1p@(^ 7?ߜ8\3) GY[b% /"g6`y [,C<И L{; ]%CAyW%B!T:4CYu2=!T &[JA/Œ}X2oOAKL .KĢ4 #KDV}k A!ȫma"z$ r|l*r  /h2h'8 ʏ3>n~uݨg,0CBydC/6qI ipƣ.82^ `:))8bIIG \95%$HB%A? U@A_#$` [d^hRSuO=&!U(oAċF,8Z   X^[~CVSBWJ6"nW]L 'st99$c CUgx\o2'r"$M8 =ܳ7)Pvsgp , .#+ByU 1Iw~,KsB; aaCQ5O a !V?ǐ[WF(ʺ` rvB9T3e(%>ObY1 QaTSHT2Q 踲8@$.@(qtfd $ Hr g gvIqNd&3Sk )sڦu׺;‰@ $aT3f74d PՇ&=:-l (3 *Z{9}P@'Tʠ DI +-B Q-^2i l2H!3N)8c9yIgj>`ev2|IEY%@@x?HD >7=H3 !` P9vÅ5"YI)PbXr#sCId@r#_! pÓ>&L %ՆX6:hB< <[] `nuRʇFB*2M"_\:Y$d )Kɀa!q XI]"n n0k0ghXtB V'(HSV``{_?;\a1]dە ]g]AB[G[%uSK"(n*918Ӂ '4io-jwP2}1]ᑔS0MW[GxDkqsEdCϪbubH%^F[EOƲTّ(1H? 9U: 5(3$sFtd(rP: 4fL_~M-+qp ;\27wZYR$]7*.`#Pbq!SaxQg iAJre c+ZdIo.)\_k٘t܁>@0MOJ5X/#?,|w14.O5Yje>sozN&& 3R*YnCJ0ޖ6=V;* ?by#12-1g^[\ܧV0;L7, VL눕ɉ~ Nu_G9l+S[j[~)Ր#+Bt~:xpnN)+c/s1V+xF3K=>RN&=֘W8-V,L/n2YJYkP>+3J?%mRp<G~zzH( ,x#9jj:hMaf&v)^b-+(~|S;@äJ5d`V3SG#4wm,_8l VL%s=o%0{1Uzpov$=WݓvSzw(#N'Z/^sL ycT{×=sQ2jT#h @1d" +}} +D= c͊GzTm[r0nEwPPnoA JS pMɆ#hexMCV6GiF/pko|"5y%^3JQtnrz.V" 2 XwM4mj /h^dJ>ptWkзg3Zԇz;'XYb*MdɚKe:i@Pn*vBׄ԰\oi+nsͣoR,iagG(a_]H4;Μ10Mf)l6@g~D(of8f8|#[}9`;j=>; OG/f;"%y>SF`JKV\ jlPdxuV^}" z0ko E`&2OM}%k[LJ]Ҍor6^jR'9I2.қpmuíZ3dP,?tNkiW%gXn)K!t,\Ve-݃`{xN@T;:p90(~8`O#AHb yr <4aCX }Qg#ƃRq&|,)8Id:ba1L9uq !6ODыt\ E0U>*tHK4*O~Qϕ҆Wi 7&DnrJ[D8#\ H4Y =H"h,'*cS; ^? YK#~=*_7PC抹;EWZM%rI~3_'@Qc 9 n)sHEdL}K6*d$Ac(sL/rM,aEod^Hcɽ}.#7TyF<: cMl0Ӿ6 1V`nvS@?)4Vil~L'E4egqt+HAy8*hk_tv|mŊ!bc1i|lrOX8xh>!n'w#X!7ezPu6qC&.ڵU)ɼ] I{,|̓ok2̎n|8< 3WHb3e"Gfzhꏢp4r@i$8`8_YJ:sFLbm)JxJs1Xo{6@\c tnxg;UH7ѕc,.F9 K_M~tQd4f#Hߘa=*UȦ[h5Rӭ 30 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14z"vI\@v2 RvIUvIw"wI[Aw2 @Bw2 rwIUwIYwI\w2 xIUxIjxIpl"yIxAy2 @By2 xryIUyIYyI\RzIozI[{2 @b{IY{I\|*<|2}}0~+A~+r~IU~Ir~2 PI0P2 (bI0I]ILXXX*P!XA* Ip 2 2I0P1`1ҁIw12 @1bI[2 IU‚IYI\ 2 2IUIb„Ix2 `IU"IYbI\҅I[RIYI\Io`*Ib҇Ic2 @"I0q11IY11IwIUIj`2 8IyIYp2 2 2 2 Ig1!1I=Ѝ*,эpҍppp%!%BIUap*XA*X‘I`1$$’IUXX2IYQXpXI`Г2 IU2 @2IYrI\I0є**LIa@2 bIU2 @IYI\"I0AX`XpXX*L1@Ib2 `IU2 @"IYbI\I0PЙPIb02 (RIUq2 @IYқI\I02IcRILbIoҝppIzIfRIIfI$£%ѣ$%pp"IURIUqXr`X`IYXX X!XBI``2 8rI0**L*ҥIa2 I0"X0`QXa`*LXЦXBIb2 I0IcIfIz2IfRa2 b8p8ҨIgIhIb02 BI0bIcIc2 ªI0X/X/P* I{21L «1ѫX/1X/ 2 hBIg2 @¬IYI\RIYI\­ITR*`aaI|ЮPAPAI}2IjB$P%QPA`$a%pPAIU¯IUX@X@RIYqArQAQҰI`* "I{BX/PX/I`I}* I{X/!X/@2AAAQA1*1*I~!*I³I@@ 0*I¶IRIp@@$%$%"IURIUq2 xºIYI`p*(IRIp11Ij1м12*`Q*`2 x½II01A1bIiS7ԩ UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14#{ Ѿ I02 `BI2 pIbII[12 @22 0rIUIYI\RIYp2 (III[!2 @"2 RIUrIYI\IY0/0/bIp q rIY0/0/BIP Q ` a "I2I*x$%$%2IUbIU*|IY2 xX0X02I`21L 11I[2 @2 IU2IYrI\021L 11P1I[2 @2 IUIY2I\RIp21L q11I[2 @2 IU2IYrI\Ij@21lrI11IY*x`*xpX0X0RIYb*t*bIj *hP$Q%R*`1a$p%1IUIUBIYI`IBI`X0 `!X0I*|IIbIj2 xI|*|I"IbIYIjIY@*|p*hqX0X0Ij*x"2 pbI|12 h1I(%$(%$2IUbIUIUIYIZRIIcI]11RIeIfBIbIa2IbrIcA*d*dI`A*lp*dI`2 XI2II2 H11Ig2 @"IYRI\q2 8ISIT2 2 2 2 0DD"IgA21L *\IIJK I!J0K21T"2 !"bIX*pI2IbIII2 BIa2 prI%%@%%D% %H%P%%% %( %0$%8(%@,%H0%P4%X8%`<%hd%Pl%\t%|%%%%%%%%8 %%%%E!S p  (,@ @5 q; B H OYc(o0 y0%%% & 0&@pp U% UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;140[ "`h0 `@&)h)`PO7`pO]Cl`T`R0cm0w0m@ pxxxa  (80hHoV1.0PELF 2@@#0 )a(0#40 'a0.a0 )a@p  <<0C-IPF/VMS29-APR-2009 07:1929-APR-2009 07:19UNZIPV1.0IPF/VMSHP C S7.1-012IPF/VMS vms.c[none]UNZIP_OPTSUNZIPOPTZIPINFO_OPTSZIPINFOOPTenvargs: cannot get memory for argumentserror: command line parameter #%d exceeds internal size limit caution: not extracting; -d ignored error: -d option used more than once (only one exdir allowed) error: must give decryption password with -P option caution: both -n and -o specified; ignoring -o -T timestamp archive to latest -X restore owner/ACL protection info* or % (e.g., "*font-%.zip") -M page output through built-in "more" UnZip special compilation options: %s UnZip and ZipInfo environment options: %16s: %.1024s COPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)SET_DIR_ATTRIBTIMESTAMPUSE_EF_UT_TIMEUSE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)LARGE_FILE_SUPPORT (large files over 2 GiB supported)ZIP64_SUPPORT (archives using Zip64 for large files supported) [decryption, version %d.%d%s of %s] 05 Jan 2007-Z => ZipInfo mode ("unzip -Z" for usage).Extended Help for UnZipSee the UnZip Manual for more detailed helpinstead.Basic unzip command line:Some examples: unzip -t foo - test the files in archive foooptions.Basic zipinfo command line: zipinfo options archive[.zip] [file ...] [-x xfile ...] unzip -Z options archive[.zip] [file ...] [-x xfile ...]port and is referred to as Unix Apple.unzip options: -Z Switch to zipinfo mode. Must be first option. -hh Display extended help. -A [OS/2, Unix DLL] Print extended help for DLL. -a allowed and EBCDIC conversions done if needed. -f Freshen by extracting only if older file on disk. -l List files using short form. files extracted in binary mode (as stored). -t Test archive files. zip -o but faster. verbose output. -z Display only archive comment.unzip modifiers: marker, and from or to EBCDIC character set as needed. overwritten file in foo~ or foo~99999 format. -C Use case-insensitive matching. is on by default and -D essentially becames -DD. -DD Skip restoration of timestamps for all entries. restore. standard header. -LL Convert all files to lowercase. -N [Amiga] Extract file comments as Amiga filenotes. care. command line to other users. uppercase if created on MS-DOS, VMS, etc. See -L. -V Retain VMS file version numbers. directory levels. user privileges. system privileges. -/ e [Acorn] Use e as extension list. directory, which can be a security problem. this is not a good thing and should be avoided.Wildcards: Internally unzip supports the following wildcards: * matches any number of characters, including zero If port supports [], must escape [ as [[]Include and Exclude: -i pattern pattern ... include files that match a pattern -x pattern pattern ... exclude files that match a pattern unzip archive -x pattern pattern ... use unzip on that. See the manual page for Zip 3.0 or later.Streaming (piping into unzip): used to process the first entry in a stream. cat archive | funzipTesting archives: -t test contents of archive quieter operation.Unicode: digit. -v List zipfile information in verbose, multi-page format. and compressed sizes, and compression factors. -UU [UNICODE] Disable use of any UTF-8 path information. -z Include archive comment if any in listing.funzip stream extractor: is given, read from that file instead of stdin.funzip command line: funzip [-password] [input[.zip|.gz]]unzipsfx self extractor:unzipsfx command line:unzipsfx options: -c, -p - Output to pipe. (See above for unzip.) -f, -u - Freshen and Update, as for unzip. -z - Print archive comment. (See unzip above.)unzipsfx modifiers: Most unzip modifiers are supported. These include -a - Convert text files. -n - Never overwrite. -o - Overwrite without prompting. -q - Quiet operation. -C - Match names case-insensitively. -j - Junk paths. -V - Keep version numbers. -s - Convert spaces to underscores. -$ - Restore volume label. -d exd - Extract to directory exd.forces extraction to specified directory.See unzipsfx manual page for more information.error: must specify directory to which to extract with -d option error: -Z must be first option for ZipInfo mode (check UNZIP variable?) error: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid unzip "-V" foo "Bar" (Quote names to preserve case, unless SET PROC/PARS=EXT) -Y treat ".nnn" as ";nnn" version -2 force ODS2 names --D restore dir (-D: no) tim! UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14estamps -M pipe through "more" pager (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.) ZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing %s. usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] main listing-format options: -s short Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format miscellaneous options: -h print header line -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive %s -x exclude filenames that follow from listing SYMLINKS (symbolic links supported, if RTL and file system permit)UnZip %d.%d%d%s of %s, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details. Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ; see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites. Usage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s => define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir modifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %sSee "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer UnZip lists and extracts files in zip archives. The default action is toextract zipfile entries to the current directory, creating directories asneeded. With appropriate options, UnZip lists the contents of archives unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir] unzip -l foo.zip - list files in short format in archive foo.zip unzip -Z foo - list files using more detailed zipinfo format unzip foo - unzip the contents of foo in current dir unzip -a foo - unzip foo and convert text files to local OSIf unzip is run in zipinfo mode, a more detailed list of archive contentsis provided. The -Z option sets zipinfo mode and changes the availableBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix based -c Extract files to stdout/screen. As -p but include names. Also, -p Extract files to pipe (stdout). Only file data is output and all -T Set timestamp on archive(s) to that of newest file. Similar to -u Update existing older files on disk as -f and extract new files. -v Use verbose list format. If given alone as unzip -v show version information. Also can be added to other list commands for more -a Convert text files to local OS format. Convert line ends, EOF -b Treat all files as binary. [Tandem] Force filecode 180 ('C'). [VMS] Autoconvert binary files. -bb forces convert of all files. -B [UNIXBACKUP compile option enabled] Save a backup copy of each -D Skip restoration of timestamps for extracted directories. On VMS this -E [MacOS (not Unix Apple)] Display contents of MacOS extra field during -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn if ACORN_FTYPE_NFS] Translate filetype and append to name. -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name in -j Junk paths and deposit all files in extraction directory. -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info. -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes. -L Convert to lowercase any names from uppercase only file system. -M Pipe all output through internal pager similar to Unix more(1). -n Never overwrite existing files. Skip extracting that file, no prompt. -o Overwrite existing files without prompting. Useful with -f. Use with -P p Use password p to decrypt files. THIS IS INSECURE! Some OS show -q Perform operations quietly. The more q (as in -qq) the quieter. -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores. -S [VMS] Convert text files (-a, -aa) into Stream_LF format. -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCII text escapes where x is hex digit. [Old] -U used to leave names -UU [UNICODE enabled] Disable use of stored UTF-8 paths. Note that UTF-8 paths stored as native local paths are still processed as Unicode. -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do not match directory separator /, but ** does. Allows matching at specific -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACL entries under VMS, or UIDs/GIDs under Unix, or ACLs under certain network-enabled versions of OS/2, or security ACLs under Windows NT. Can require -XX [NT] Extract NT security ACLs after trying to enable additional -Y [VMS] Treat archived name endings of .nnn as VMS version numbers. -$ [MS-DOS, OS/2, NT] Restore volume label if extraction medium is removable. -$$ allows fixed media (hard drives) to be labeled. -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members into locations outside of current extraction root folder. This allows paths such as ../foo to be extracted above the current extraction -^ [Unix] Allow control characters in names of extracted entries. Usually -2 [VMS] Force unconditional conversion of names to ODS-compatible names. Default is to exploit destination file system, preserving cases and extended name characters on ODS5 and applying ODS2 filtering on ODS2. ? (or %% or #, depending on OS) matches any single character [list] matches char in list (regex), can do range [ac-f], all but [!bf] For shells that expand wildcards, escape (\* or "*") so unzip can recurse. Patterns are paths with optional wildcards and match paths as stored in archive. Exclude and include lists end at next option or end of line.Multi-part (split) archives (archives created as a set of split files): Currently split archives are not readable by unzip. A workarogK8 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14und is to use zip to convert the split archive to a single-file archive and Currently unzip does not support streaming. The funzip utility can be This can be modified using -q for quieter operation, and -qq for even If compiled with Unicode support, unzip automatically handles archives with Unicode entries. Currently Unicode on Win32 systems is limited. Characters not in the current character set are shown as ASCII escapes in the form #Uxxxx where the Unicode character number fits in 16 bits, or #Lxxxxxx where it doesn't, where x is the ASCII character for a hexzipinfo options (these are used in zipinfo mode (unzip -Z ...)): -1 List names only, one per line. No headers/trailers. Good for scripts. -2 List names only as -1, but include headers, trailers, and comments. -s List archive entries in short Unix ls -l format. Default list format. -m List in long Unix ls -l format. As -s, but includes compression %. -l List in long Unix ls -l format. As -m, but compression in bytes. -h List header line. Includes archive name, actual size, total files. -M Pipe all output through internal pager similar to Unix more(1) command. -t List totals for files listed or for all files. Includes uncompressed -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss) Default date and time format is a more human-readable version. -U [UNICODE] If entry has a UTF-8 Unicode path, display any characters not in current character set as text #Uxxxx and #Lxxxxxx escapes representing the Unicode character number of the character in hex. funzip extracts the first member in an archive to stdout. Typically used to unzip the first member of a stream or pipe. If a file argument Self-extracting archives made with unzipsfx are no more (or less) portable across different operating systems than unzip executables. In general, a self-extracting archive made on a particular Unix system, for example, will only self-extract under the same flavor of Unix. Regular unzip may still be used to extract embedded archive however. [-options] [file(s) ... [-x xfile(s) ...]] -t - Test embedded archive. (Can be used to list contents.)If unzipsfx compiled with SFX_EXDIR defined, -d option also available:By default, all files extracted to current directory. This optionHMH@x0 b p<B@| x !<0#P`?#IHx?#C?~F( x ?#BhD!B` )C<2/P8!`1B P 8N` ,`0YP$ ,PT!HUe@  b  ! P0B!P, P$P ,P@$B085HP P$`8 @PTH %p<By 0BP @ # PP!H P$0 PP!H e P$0 PP!H P$0 PP!H E P$0 PP!H P$0 Pa!B`a $  `s0 ,# @@B  ,@HPA! $ @B!@ Y B Y0 B4C rC @?#@iC H&rpC @?#@iPCP pFU`0C @?#@iPJ$H 3 X$ BD@ PTBP88@CX$H PVHP88C a! B1pCA!H 3 D0 `% ,@D HD HYP88C$BB C PA! 0 a@D!B @ BP88 B @CHE!@$ H C PA!00  Ha!B`@P88 B @@C HF!$P P!B8Ca!0 H Dc`C $@!,@ $0 D0 ,`0@ H HYP84@C`!0 B  a@$`LH A P$ 0 @RPTH %J, H,P@B C `$BB0PB! ,  @`@($B@ !@! ƒ",8D8@C$0B aPP!(@PA!0BP ! a!0  @p C@B!H@A!"H` H0@!  @@!-@@Y F10@ D% # D #C?#0B ! @` &P # DXhT8pC ($P0  @XX8C X$ 3PVH HYP8BPC @! @!$,` PF8H(@`X @8H #Y!pC A! #&0B`X & a2k*!X`)Xz) X.@hH8pC 0A! # 2 X 2 a`36!X)pz) p: @X <P<8PC B  |,C |@P80C D!",,CXB 0B  0@!0X @ Ha1 Pa B "@PX((z) P$$@H8CHD0H #P&,P8B@C A!@ H `X80CH A!`B( #x@XF8`C @aB` Da 2 !#DB H,@RR H(@!P@@a ,h `@@!`X, T6X @hd0d&d, SR h2 p #(@ $ B  t,8@$aLHC P$0 PTH  > BYP!@!!H PD!2,`@X HB!0 ``@($B@Q@! H` 1@! # F #8@HP@!0H  P@!(  X@( q`XX H,pC$ `LH B P$0 PTH  @ BYP!@!!H PD!2,`@X HB!0 `` P! $P P! ,p `@!`  p]  @DH@ , 0!@'~F` $PBH1BC@$H  a$0  PT0 ` @F@X8 80C Hh%rC $@ @HB @ HP8 C`$@~F !X C F Y88C @ bh!rCHb @ HP8C@$@~F ! @CFB Y `pqC ` bhrCHb @ HP88pC HL?#h&kC$$,  @$@x ``xh 0L!@P1T!pq UPC0L B0AL!`B@P #TX@ b!bB T(@0L8`CPAT!B HTH @ 8$B #T@ P1T!",80C PAT!  @!G"/ P1T!@"/h@8L8@CY 8 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14QPQT!`B `T(@ $B `T@@L8@CPaT!`B @T@ H$¨B @'T@L8 C ,@C T (`CH1@~F0C @$0!@ HF HX $T$ H9`C @X@P@8C $b @ X QHb8C ` $(HPC `  ( @ C `  ( C ` $( H C ` `!b` (@ @PqT!q HUPC0%L B0@L!`B@Q #T( @ H!B 'T @8L8@CP1U!`B T"/ @ H$bB &TN"/ @N8p CXpH  cq$BH @0L8@CPT!`B T @ @$BB "T @PQU!pq TPC0L B0@L!`B@EU `!Th @ b!B `T8 @PT!pq H@UPC0%L B 0#AL!`B@S "T @ H!B &T @8L8@CPU!`B `TX @ @$B ` T( @HL8@CPT!`B `T @ @$B `"T @PT!pq !UPC0L B0AL!`B@S @"TH @ b!©B @T @PT!`q HU`C@d8#B@EQ 0!p a @T B T@@$8'B@EQ @!T@L"/h@L8 C PT!", ,$ C PT!g"/ HX HP8pCH1@~ C @$0!@ PF@PX PT!W"/ Ph)r C HX HPH8pC $b @ @X@P@8@C `  ( C ` ((PC ` $( HC `  (@C `  @`!`(X@PT!q HUPC0%L B0@L!`B@S "T@ H!B &T@0L8@CPU!`B Tx@ $B TH@8L8@CPU!`B T@ @$"B !T@HL8@CP!U!`B T@ P$BB )Th@@L8@CP1U!`B T(@ $bB T@HL8@CP$`B@S *T@ PT!"/@PQU!q TPC0L B0HL!`B@EU `%T(@8b8 0C PQU!"/@ PQU!"/@0L8@CPaU!`B @T@ @$ªB @!Th@PU!q HTPC0%L B0PL!`B@V )T@ H!B %T@8L8@CPU!`B T@ P$"B (TX@PU!`q aTPC0L B0@L!`B@V T@ b!BB T@@0i&$H H V!P!@(P$P,` V!00 (P!  ,(J` ` ^! ($HX@ H HP `( $qJ$@~F *%X@8L8@CPU!`B TH @$bB TXHPU!q P@TPC0)L B@0CYL!`B@W ,TH P!B (TH0i&$HX R?#pQ]@P.P$,` V!0 @PP!  ,@PT` `@($BX@1i&$H # V!R@ b P$,` V!BB@@X P!2, B `@($B@(1i&$HX R?#PR@(JP$P,` V!PBB@@X P!2, (JP `@($B(@`1i&$HX R?#R@PXP$,` V!0 @PP!  ,@PT` `@($B@1i&$H # V!0R@ b0 P$0,` V!0 `P!  ,`F` `@($B@01i&$H # V!`R@ b` P$`,` V!P0 0P!  ,0L`( `@($BX@0i&$H # V!R @ b P$,` V!0 @PP!  ,@PT`H `@($B@N1C0?#s@`C@$H  `$0 `EB RH@ HR0 `ZXB $%@`X8$ B0( b@%@,(b!P!H@@X J!BY^! B0L PL!H`X F!# H! ,@  H0 0`0L4BJ@,P@ X$0  XW!pB (0!Wp qu29HVq@`WPWVp`xTp8K8C8$`LH`@ $p0 JbHv0P H `,P0!L!!H` R!2,@@X N!`0 `0` ^! X1V!",X1 C X1V!@"/ XAV!",R1 C XAV!"/ X1V!",XT1 C XW!"/ XV! ( W q0i@8C`$`LH A $0 @RbHJ 8B8YPNpB C $pBB R!  ,` N`XV!B @V XW!`b",8L8@C$ HP8B C XW!"/J8 q']I8` C @ #`E]HVpH'5 xNpp C01i&$H`[ a$"", @P`Z@ T1` `,pC$Hd HPL`B`X X!`BB P!  , L @$`H 1i&$00 sl@,`XH 3H X! Z@ĤP1i&$P0!L!!H`X X!2,@@XP!@Z@@R0LbLH ĤHR `0ĤB `DH` aF!B@Y 0L PD B C X! BB P!0,@@X D`$BP ^!@ #8$B Y 8NBP !H!!H`X X!2,@@X P!@0 ` Ĥ`PTH` O!CB x H , PTB C X!BB P!0,@@XTbLHPT `8 UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14wHRH` N!CB x, PRB C X!BB P!0,@@X R`PTH` F?#CB x1i&$, F PTB C X!BB P!0,@@X T`0LH` !O!CB x`, PL`B C X!`BB P!0,@@XL`bLH0L ` HH` aO!CB x@, PH@B C X!@BB P!0,@@XH@bLH H `FH` O!CB x0, PF0B C X!0BB P!0,@@XF0bLHF ` ^!@ 3H$B :HR@,@HPH@B C X!@BB P!0,@@XH@bLH H `FH` R!CB x0, PF0B C X!0BB P!0,@@X F`0LH` S!CB x`, PL`B C X!`BB0 P!0,@@XL`bLH0L ` ^!@ c$0[H@& X!@0 NR!@,PH@B C X!@BB P!0,@@X I O!`0LH` N!B0YPL`B C X!`BB P!0,@@X L`^! H  HRBPB`@q x,0C Q 8apP$0 B CPT B  T!BI O!0B`ĤP!B!!H`X X!2,@@XP!0Z@ B `$B xPF`@q x0,0C @Q 8ap0!!HP@!B`L!`bLHJ O!PF0B C X!0BB P!0,@@XF`Z@`$B xP0L`@q x`,0C @Q 8ap!!HcP@!B`F!0bLHK O!PL`B C X!`BB P!0,@@XL0Z@`$B xPF`@q x0,0C @Q 8ap0!!HP@!B`L!PF0B`X X!0BB P!  , F $`^!@H!V! H HRJ@ 8RQB,P@XQV!B PV` (@QV`R@dB9 `Wp db9 XaW!`2@ 8L B V # B @! , pU HQH  H0i&$`8 @@`BBp<B@!B!f D0",$0H J@a$C H@0  f00 HX0 0C$H f!0 0 0 Byp $,X@ B0@@bLH"PJPB C hL!PBB0`D!,@XJPH(J ` V!@ #h$B YhZP H!!HY hL!0@0(@X `D!0 Ĥ H `` V!@ 3h$BhZ@,P H!!HY hL!0B0(@X `D!0 Ĥ H ``V!"H HH%b, p\PJBBY pA$2,0 `D!x@$H s f!0 0 XhZ, p$BPJPB C hL!PBB0`D!,@XJPbLH(J ` V!P C$pH `L!0 0 (Y 8N0 hN!PJPB C hL!PBB0`D!,@X J`V!C(1i&$H0 hO!P @(JP$P,Y hL!00 (`D! ,(J` ` V!(1i&$H(J H0(J0 P$P,Y hL!PB@X `D!0@0(JPbLH0(J ` V!P Ch$B" pF!0 (YPJPB C hL!PBB0 `D!,@X J`V! `LH S `L!PH h$BzF J hZB YP!B!,@X hL!2,B!H``@!B Q@XHUa@??20 April 2009 note: didn't find end-of-central-dir signature at end of central dir. error: expected central file header signature not found (file #%lu). error [%s]: attempt to seek before beginning of zipfile %scaution: filename not matched: %s caution: excluded filename not matched: %s (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) zipinfoCompiled with %s%s for %s%s%s%s. UnZip %d.%d%d%s of %s, by Info-ZIP. For more details see: unzip -v. [-Z] You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT. "%d (null)-x-d-Zii @pp P 0 0@P@0P  p; ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZIP.C;1˨TENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZPRIV.H;1T{Di;lnrszz͂ EؚFG#j  z$ "~0000/~uossz0r h?u'.0 0p~00&#a `"^`" .W`(@i^00 00&~0~i&?AH0&@0/   {z t ee|@{^{n_Ԫ/ קyw UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14h~ "0/~Ԫ/0  0Ԫ/Ԫ/ 00 Ԫ/ӫ$0 ~0 ~Ԫ/0000  Ԫh֪0Ԫ/0Ԫ/(|0  0Ԫ/| '1  0 |v1n~~~0@>w w xwx`0d/d~~^̵qjPogg^йP;E v Pq v P"^pcoйP< s u o/$Q/!ê$P?ŭ!ê$P?ŭ!ê$zõ@  p t!ktk&oac "ZacQ?xQQ qya"yy>@%.p0CUNZIPHP C S7.1-012mainunzip uz_opts yusagey__main,0C.shstrtab.note$READONLY$$CODE$MASK_BITSVERSIONDATEENDSIGMSGCENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSGZIPNFOCOMPILEDWITHUNZIPUSAGELINE1$LITERAL$$LINK$$DATA$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind_info.rela.IA_64.unwind.rela$CODE$.rela$DATA$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZIP.C;1GMAINUNZIPUZ_OPTSUSAGEMASK_BITSFNAMESVERSIONDATECENTSIGMSGENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSGZIPNFOCOMPILEDWITHUNZIPUSAGELINE1__MAINOTS$MOVEELF$TFRADRDECC$MAINDECC$EXITGLOBALSCTORRETURN_VMSDECC$SIGNALDECC$STRLENDECC$STRNCASECMPDECC$STRNCMPENVARGSDECC$PERRORDECC$TXSPRINTFZI_OPTSDECC$STRCMPPROCESS_ZIPFILESDECC$MEMCPYDECC$ISATTYVERSIONDECC$GETENVDECC$$SHELL_HANDLERHANDLER     1h 38> ,F<LDV]iGtI~ < $ -  #G $0<MZbn}+DZ@UQU'+'U'' V'<''0Ce ee'W?____ _(_00_8_ @_HH_ P_<X_h`_<h_0Cp_I-II.2I/RIbI0R@I1R@"I1@R@RI1pR@I1R@I1R@I10bI2q  I32I32RI4p@@I5``"I5bI6I2`pqI7BI8bI    2 I4A 2R I9   "I7 01@bI7I:pqrXX@P#I7%I7A&`&r&I7'I7'I7(X (X2(I7(X(X(I7A)X`)Xr)I7***2x *!*0*A**I2*I;b+I<++,,, ,B,I7`-p-q---I7B.I<.. /2p2/I7/H//2`/H//I7r0I70I=1h1h"1I71I7B2I72I7b3I73I74I7$п UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14q455I75I726I762`6I7B7I77@7@7I>8 8R8I78I>B9I79I>2:I7:I>;I7;I<<<<<<0==!=00=1=P=2hQ=2`=I7 >0>2>I7>>>I7?2"?I+p?2`q???I7@@x@!@0@x1@B@I7@I7QAaAbAI7AAAI7aBpBBBBI7% %%( %%0%8%x % %!$%(%@,%0%`!4%H8%(<%!@%PD%8H%XL%!P%`T%H"X%h\%"`%pd%"h%0#l%xp%xt%x%|%%%x#%(%%%P%`%%%#%%0%p%$%%%`$%%$%$%@%% %0 %%X %%%p %%% &%p&% % %&% %P %'% %X'%'%' % $%@((%(,%(0% )4% 8%h)<%)@% D%*H%( L%P*P%8 T%*X%*\%0+`%x+d%+h%` l%,p%h,t% x%,|%-% %X-%-%-% %@.% %.%.% /%( %p/%/%0%P %`0% %0%1%P1%%% % %1% %1%P %82%% % % %2%2 %%%(3%p3%3 %H$%(%,%40%4%8%<%@%D%P4H%8L%P%PT%4X%4\%05`%5d%5h%`l%p%t% 6x%h6|%6%7%X7%7%p%7%@8%8%%8%09%x9%9%:%%(%%%`%h:%:%%%%%%%%;%H;%;%;%(<%%%p< %%0%H%%< %$% (%,%0%84%X8%x<%@%D%H%L%0P%`T%(X%=\%`%P=d%h%0l%p%8P `=?0C#D-09@PCHN@V (iP0 d UNZIP.BCK.s&[UNZIP60.VMS-BINARIES]UNZIP.IA64_OLB;14 0(`HPpt@px`  `@?8x"`0`t<`M` 0\0p@Xhس!*[UNZIP60.VMS-BINARIES]UNZIP.OPT;1+,./ 4-s0123KPWO56S~ 7_k 89GHJIdent = "UnZip 6.0" **[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1+,`. / 4 -s0123 KPWO56Q 7ƻu 89GHJ% VAX-11 Librarian V04-00cP I !6( 2 7  z9ACC_CB9ASSUMENOCENTRAL_HDR_SIG CENTSIGMSG9 CHAR_PROP9CHECKDIR9 CHECK_FORMAT9CHECK_FOR_NEWER9 CLOSE_OUTFILE COMPILEDWITH3CRC328DECRYPT8 DECRYPT_BYTE9DEFER_DIR_ATTRIBSDEFER_LEFTOVER_INPUT9DEST_STRUCT_LEVEL9DOS_TO_UNIX_TIME DO_STRING9DO_WILDECHO ENDSIGMSG4_SIGEND_CENTRAL64_SIGEND_CENTRAL_SIG>ENVARGSBEXPLODEOEXTRACT_IZVMS_BLOCKSFZOFFTRNT3CRC328CRYPT>ENVARGSBEXPLODEOEXTRACTFILEIOGLOBALSINFLATELISTMATCHPROCESSTTYIOUBZ2ERRUNREDUCEUNSHRINKUNZIP9VMSZIPINFO9OPENR_IDOPEN_INPUT_FILE9 OPEN_OUTFILEPROCESS_CDIR_FILE_HDRPROCESS_LOCAL_FILE_HDRPROCESS_ZIPFILESRATIOREADBUFREADBYTE REPORTMSG9 RETURN_VMS9SCREENLINEWRAP9 SCREENSIZESEEKMSG SEEK_ZIPF9SET_DIREC_ATTRIBS9 STAMP_FILESTR2OEMOTRUNCEASO TRUNCNTSDTT_GETCH UNDEFER_INPUTUNSHRINKUNZIPUNZIPUSAGELINE18 UPDATE_KEYSPTS ZSTRNICMPv ENDSIGMSG EXTRACT_IZVMS_BLOCKFZOFFTISO2OEM OEM2ISO_850 UPDATE_KEYS __MAINCMP ISO2OEM_850ISWILD9 JPI_ITM_LST LIST_FILES LOCAL_HDR_SIGMAIN MAKEINT64MAKELONGMAKEWORD9MAPATTR9MAPNAME MASK_BITSMATCHO MEMEXTRACTOMEMFLUSHOEM2ISO OEM2ISO_850GETP GETZIP64DATA3 GET_CRC_TABLEGET_TIME_STAMP GLOBALSCTORHANDLER9 HEX_DIGIT HUFT_BUILD HUFT_FREEINFLATE INFLATE_CODES INFLATE_FREE8 INIT_KEYS9INVALIDRESPONSEISO2OEMOEXTRACT_OR_TEST_FILESFILENAMENOTMATCHEDOFIND_COMPR_IDX9FLUSHFNAMESOFNFILTERFNPRINT3FREE_CRC_TABLEFREE_G_BUFFERSFZOFFTUSAGEUZPINPUTUZPMESSAGEPRNT UZPMOREPAUSE UZPPASSWORDUZ_OPTS9VERSION VERSIONDATE9 VMS_MSG_TEXTZIPINFOZIPNFOZI_END_CENTRALZI_OPTS ZSTRNICMP__MAINEND_CENTLOC64_SIGEND_CENTRAL64_SIGEND_CENTRAL_SIG>ENVARGSEXCLFILENAMENOTMATCHEDBEXPLODEOEXTRACT_IZVMS_BLOCKHi{&{9‘<0eVخ7tAڄA$A,oZP;B TYA@fC 5 k"IuL $_;SE%`s8䌌 \d0#J]pR^uPbt)xHT%f(w@K GWPt]},$s}aTCZL DD+\{ADZShBA`d]Lsm< 6̙0̓%OX(8C* f-5>;?SW#B L7AZl8Xm lwtf281M7 Cnx@ : t>IM,UTvc DqITrjdZq 6cqB ALKjA) 0R1aϊWIC:;`_d&L,I 9VC{|coCx] AMGCznH ͼZ?+reNM85QHܒ|;Ѱh 94i;:bH/B0NPRg@$!]HRSqb D3fU4l ]@SKEw?N; 2iFKP.Flsuq`o"S@HM9sSQD<.Pd99j?rN]~Df/uu &Ψh- ϫ E9u6ԭV G*m6?H`QYDH)tnZa} [x zRFJfo]KMrM}u{ iO/>z6 K:A1pkOmmu @UFPȮxI{od^GNzRT ~&1DK@xoFJ`!(&t M0W[Uȉ\`v=R[Ne ^$DOC!4){s`9@w&0;O %EDWAK5w#pwT]`D&,hJ(%?xEa"^,Q!/`/sb7vI Dx8e{Ý_C&kg*'kVy>pR,g9Nn-}@EqB]gK(ݑ+ M"4,xi1TZ>! M{ Wl]F,A7:͐go<p|/:q$#֚=Vik tz/h<dIt`6,bVHZdh9;WYHh*0PPRapcA<5tTH MATQ)~W lbaUd/ "_&V>G C`q=vUl]+e"sV*L>VGvAE 5M^+CTnCHB9P;L#3,+CPt9;3L?'-C$ [[NT\ @#[!B0Rw [JPUFV=F=AT9 ?YF Cv3d,MΖxM(L N : ZD$CIvdHNEtaAB|J8fU Kp#U ]n k4 gu:b"rA 2PE@U?])Qf9d^`.X IMl]@_)th;pM70= ({eoTߞD )|f+iS}9DNcx *R1a1.<nmI %I3$A^dNOMpl L+܎iTߒ4`'S8n}b_cN#/AF??;x5un"1LD\zSJc}M1kci- UBZ`z(A},S)bRRSJ|%t5c8t^#r3N)/iF90p|{8Cc6'4tC,Z>] N( RaAu|"@[_ f4'O$6}r.w+":y}4A0mr6{ud=P!2(LPV w$\];(v[Kis&hg Th-Wz lMfK5Tu.[ 9,g)-AS mHYC 4>UjDO C@ 6*0KlgeXk:*atK0K,">ZLIfxhe^AIq1 I͹JZ=_5PodUU@CH_v.'[s/U:! ןw VłZL%5+ *=D^:JN?L?C)g$(]gIIKdetk N`MʃTi&@$> Hn~ +|g09C: .tPh9ԱWn)EqR B[%0In3V|tEN Rs! ,!h0v]I%%ގ0fy.|v0o2EXc?.CYS\B N_JF^jX_C\LZXk^YQAm'16vqMa(kUqjA o: $*AF4A8 pM =TbJ Y |gA#ivxnD`O#Ǖx!4=!$lu+6D vdsW*=F@3 -4uU!&7NN~$(z3nw-6,`_R0V0?+|]F~ &S62ZO/3hM},IlGr*Kt*4TdA@# N( G^#'7t) VO.Gc3 G8rLlEKw _1t%',c}9RFW'6zr~oJ]U/I|R1]08}p_RG[tf&S\3%6lyk=_ 'lg|t+U$? JW9w;Ys+JIT !4tEX( 4>bnmEc#*;b(dxVv}nQ_s?:4n&n@g~ '?w:5fsg=% ."-- -dw*gy,:YǓxVF\ j`dPC6icHfxe :e@V<=w*Xo!O&cs( mDoi{'ba?2"t25d+E@ Naa0r0@XLEME A\g RA=tmp"^)ARq3 -n3@H;YS7rF,(Mn[OBx1S?Yr-8!dSx&rU2$i*sdA4Rrb*p T'~ARK3_U8 Y(I9L *\cYh`LJUE!ZQ/XPP6VJFY |l|,Bm΅ĘU(MLvef/:9s&0er(TI V;%4&#EOWxH?xlALY }/VɆ %&%x+d8)>m&a:\6Xgg y^8( 6ft_nn7[=sCGn(Lfox!ru,!nRTEAWyh%_ bF4_KOp^R^T hqL;JTO,&h5G4 RFh)OkUpΕ~7 @SC{xei eMClHBʧE#3e^B FkGEL6q ^ Vo$a J{i(}n luvB n= #c$IS%UA:1G} ^g&c6,ܑp]77Oi[\Wr;2n*V,%r+cQ> awBREbok) $YG(Z9GE.?/*!k /Ąmӵ)mƽS:;vUf^G A]?p,Evjvb5c:` hTr38ǪlGzI"E e#oyL;˚t=KHl FEo`m5@qQKRa@qte<(B xQDOe䭏:lrnM_M?UNITrN%$DlXpu "[3)rCd@`LQfm w"A,̑Ir1Sj!aɀpu nioLU%h< ^y^04h7Mf 020.2υc@"mzP\R@WK|SD X7҄*rgE[Boӊ1)zfkF ~e5 t3>ob2m2C'v[hfQAC|tLlr#]|o'LK[F;*@AH2F`e5wjH3,jS~GCmMx.OXgq9׫Ww !_eJ? %;?{xE5hAfXd{ZfP9U/9u?@ABP  !"#$%&'()*+,-./0123456789:;<=>?@AP__iscntrlPլRDECC$GA___CTYPEQˏP@aPˏPRRP|^G@3PPG@3PG@3RRG@3bS READBYTEPSSUTG@3PPG@3PG@3PEPG@3`R READBYTEPRˏRSSˏRPPPPRTRPPV"ЬQTPTS@aRUTVVVPP8^Y|S0ެоRB MASK_BITSnެ о RB MASK_BITSެ$о$RB MASK_BITSެ,о,RB MASK_BITS GA31READBYTEXFLUSH( DECC$MEMSET DECC$MEMCPYT@PG@3RRG@3RG@3RRG@3ŚbUhPUxTURRSTTˏSR1&SST׮T@PG@3RRG@3RG@3RRG@3bUFhPUxTURRSTTSRRnRRRVQQ UQUSSQTfRR pRc[1WʏRTR=G@3PPG@3PG@3PPG@3ߚ`UhPUxTUPPSTTRSUUB MASK_BITSUUUV1xYRY3BG@3Y1~YG@34PRR[1Ԯ0Y1\SSTT,APG@3RRG@3RG@3RRG@3ŚbUhPUxTURRSTT,SRR Wо,UU RURSSUTT$>G@3RRG@3RG@3RRG@3bUhPUxTURRSTT$SGRRRR RVQQ UQUSSQTfRR pRc[1ʏRTR=G@3PPG@3PG@3PPG@3`UhPUxTUPPSTTRSUUB MASK_BITSUUUV1xWYU<RRUWT @PG@3RRG@3RG@3RRG@3bUhPUxTURRSTT SRRRRRVQQ UQUSSQTfRR pRc[1ʏRTR=G@3PPG@3PG@3PPG@3ߚ`UhPUxTUPPSTTRSUUB MASK_BITSUUUV1x<ZRXT@PG@3/n^s UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 *3GHRRG@3RG@3RRG@3bUhPUxTURRSTTˏSRRZSSTѮZZԮʏWWYWUYUURRZZRRZծ0!YWRG@3UYU~ RYRWDWYPPRRG@3PWP~YP~$RYRWPYQYWPW@G@3AG@3RYYG@34PRR[jԮ0YZ1Cծ1$YG@3FLUSHPRR[;G3G@3RTSSR"G3GA3RG@3RSRG3[P[[PP0^X|S(ެ оRB MASKI_BITSnެоRB MASK_BITSެ$о$RB MASK_BITSGA3 1eREADBYTEYFLUSH DECC$MEMSET DECC$MEMCPYT@PG@3RRG@3RG@3RRG@3ŚbUiPUxTURRSTTˏSR1SST׮ T@PG@3RRG@3RG@3RRG@3ݚbUiPUxTURRSTTXRXSBG@3XXG@3,PRR[1Ԯ(XSST1\SSTT$APG@3RRG@3RG@3RRG@3ŚJbUiPUxTURRSTT$SRRWо$UU RURSSUTT>G@3RRG@3RG@3RRG@3ŚbUiPUxTURRSTTSRRRRRVQQ UQUSSQTfRR pRc[1ʏRTR=G@3PPG@3PG@3PPG@3ߚ`UiPUxTUPPSTTRSUUB MASK_BITSUUUV1xWXU<RRUWT@PG@3RRG@3RG@3RRG@3bUiPUxTURRSTTSRRnRRRVQQ UQUSSQTfRR pRc[1ʏRTKR=G@3PPG@3PG@3PPG@3ߚ`UiPUxTUPPSTTRSUUB MASK_BITSUUUV1x<ZRXT@PG@3RRG@3RG@3RRG@3bUiPUxTURRSTTˏSRRZSSTѮ ZZ Ԯ ʏWWXWUXUURRZZRRZծ(!XWRG@3UXU~ RXRWDWXPPRRG@3PWP~XP~RXRWPXQXWPW@G@3AG@3RXXG@3,PRR[jԮ(XZ1Cծ 1XG@3FLLUSHPRR[;G3G@3RTSSR"G3GA3RG@3RSRG3[P[[PP ^G3G@3\\@ <G(A3\ʏ\1 <~%P\\S1=P|~<~<~ HUFT_BUILDP\\  HUFT_FREE\S1P@~P\ HUFT_FREE\S1ό@~ HUFT_BUILDP\~\  HUFT_FREE HUFT_FREE\S1ZP@~[P\\S1sϨϤ@~M HUFT_BUILDP\\  HUFT_FREE\S17@~P\" HUFT_FREE  HUFT_FREE\S1<G(A3\ʏ\,R%@~ HUFT_BUILDP\*PRREXPLODE __iscntrl,get_treel explode_lit$  explode_nolit4explode  4NqL 4 jM    MASK_BITSGDECC$GA___CTYPE HUFT_BUILD HUFT_FREEFLUSHREADBYTE DECC$MEMSET DECC$MEMCPY 4 EXPLODE$CODE$DATA $ADDRESS_DATA5@~ HUFT_BUILDP\\1\  HUFT_FREE HUFT_FREE  HUFT_FREE\Sk2RP\ HUFT_FREEPRqP\ HUFT_FREE HUFT_FREE\SSPwwP1 ߺ V1.04EXTRACTV1.030-APR-2009 11:05DEC C V6.2-003 Pdircomp P... Pfnfilter Pdecompress_bits Pextract_izvms_block Pmemflush Pmemextract Ptest_compr_eb P OK  P  P%-22s  P  P%-22s  P%-22s t PTestExtraFieldr P l P OK e P%-22s b P Z PinflatX P.T PuP P N PuH Perror@ Pwarning< P : P]6 P [4 Pu0 P . PuQ( Perror Pwarning P  Pexplod P  P  Pextract Ptest P[binary] P[text]  P[empty]  Pextract_or_test_member P{ENTER} Pu Pu Plocal Plocal PEOF PEOF Plseek| Pextract_or_test_entrylistl Pfind_compr_idxh PPKd PVMSX Pstore_infoT PsP PsL Ps@ Pwarning-8 Pcentral0 Pcentral Pextract_or_test_files Perror [%s]: bad extra-field CRC %08lx (should be %08lx)  P erroRr: unsupported extra-field compression type (%u)--skipping p P unknown error on extended attributes L P out of memory while inflating EAs  P unknown compression method for EAs (%u) P bad CRC for extended attributes P unsupported NTSD EAs version %d P invalid compressed data for EAs \Pbad extra-field entry: EF block length (%u bytes) exceeds remaining EF data (%u bytes) P compressed WinNT security data missing (%d bytes)%sP compressed EA data missing (%d Sbytes)%s9P bad CRC %08lx (should be %08lx) P%s: unknown compression method Pwarning: %s is probably truncated PunshrinkPexplodePinflatePinvalid compressed data to Pnot enough memory to P error: %s%s |P error: %s%s %s 8P%lu file%s skipped because of unsupported compression or encoding. PNo errors detected in %s for the %lu file%s tested. PNo errors detected in compressed data of %s. P (may instead be incorrect password) TxP%lu file%s skipped because of incorrect password. PP skipping: %-22s incorrect password  P skipping: %-22s unable to get password PCaution: zero files tested in %s. PAt least one %serror was detected in %s. Perror: invalid response [%s] Pnew name: pP NULL (EOF or read error, treating as "[N]one" ...) 6Pnew version of %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: P failed setting times/attribs for %lu dir entriesPwarning: set times/attribsU failed for %s Pwarning: cannot alloc memory to sort dir times/perms/etc. TPwarning: cannot alloc memory for dir times/permissions/UID/GID 0P  skipping: %-22s %svolume label Pwarning: stripped absolute path spec from %s Pwarning: %s appears to use backslashes as path separators P (attempting to re-compensate) Pfile #%lu: bad local header pPlocal header sigRP%s: bad file comment length P%s %s: %s bytes required to uncompress to %s bytes; V%s supposed to require %s bytes%s%s%s P%8sing: %-22s %s%sPfile #%lu: bad zipfile offset (%s): %ld P%s: bad extra field length (%s) ,P%s: ucsize %s <> csize %s for STORED entry continuing with "compressed" size value P%s: mismatching "local" filename (%s), continuing with "central" filename version P%s: warning, no memory for comparison with local header tP%s: bad filename length (%s) 0P zF UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 VWabP  ((PPPMd PWavPackPIBM LZ77 PIBM/TersePLZMA TRUNCEAS  TRUNCNTSD REPORTMSGEXCLFILENAMENOTMATCHEDFILENAMENOTMATCHEDSEEKMSG ENDSIGMSG CENTSIGMSGGEND_CENTRAL64_SIGEND_CENTRAL_SIGCENTRAL_HDR_SIG LOCAL_HDR_SIGDECC$GA___CTYPEDECC$GA_STDOUT DECC$GA_STDINDECRYPTCRC32 GET_CRC_TABLEXSET_DIREC_ATTRIBSDEFER_DIR_ATTRIBS CLOSE_OUTFILECHECKDIRMAPNAMEMAPATTRMATCHUNSHRINKINFLATEEXPLODEPbzip2PDCL implodePdeflate64PdeflatePtokenizePimplodePreducePshrinkPstoreP skipping: %-22s `%s' method not supported HP skipping: %-22s unsupported compression method %u  P skipping: %-22s need %s compat. v%u.%u (can do v%u.%u) P__iscntrl PլRDECC$GA___CTYPEQˏP@aPˏYPRRP^ԭԮZ|VԮ||G@3 GET_CRC_TABLEPG@3G@3 n1 PGPG3HRG 3RRG3GCHECKDIRPRRR  n1 Pn1 PG3G@3G3GA3G3.xG3~ DECC$MALLOCPVRG3PBfRRG3G3,xG3~ DECC$MALLOCPWRG3BgRRG3ԮԮ[READBUF DECC$MEMCMPPROCESS_CDIR_FILE_HDRZ DO_STRING MATCHU DECC$DSPRINTFYFNFILTER$XPXRBG3G@3G3P 3Z[1QPCENTRAL_HDR_SIGG3(P1GnA3\P<\ҮRR\RRGfA3VTGnA3 END_CENTRAL64_SIGS PEND_CENTRAL_SIGSSG3(PGrA3END_CENTRAL_SIGG3(PTThxRXRRR CENTSIGMSGG@3i<~PG@3GGC3P` REPORTMSGG@3i<~PG@[3GGC3P`Z[1MPPR RZ[18P<GTA3~(PRbRZRZRU<@~G@3RR~GA30PYG@3i<~PG@3GGC3P`[1<GVA3~(PRbRZRZRU<@~G@3RR~GA30ϯPG@3i<~PG@3GGC3P`[1O<GXA3~(PR^RZRZRQ<@~G@3RR~GA30PSG@3iG@3PPG@3PG@3PPG@3`\ READBYTEP\\1fGA31[GA3G@3FLUSHP\X\1;\X15GD31G<31<@~G@3\\~GA3FNFILTERG 3ISG@3\\n\[\\SG3 RPRRSP۟֟G@3 DECC$DSPRINTFPG@3GGC3P`UNSHRINKPS1wS21GD3G<3GDr3wG<3oS 2RP@R<@~G@3\\~GA3FNFILTERPHRڟG@3 DECC$DSPRINTF<~PG@3GGC3P`GPSRRRϠڟG@3 DECC$DSPRINTF<~PG@3GGC3P`SX1GD31G<31<@~G@3\\~GA3FNFILTERG 3ϴSG@3\\n\[\\SG3 όRPτRRSPnݟ1՟G@3 DECC$DSPRINTFsPG@3GGC3P`EXPLODEPY1Y1\G3GA3\\WGD3G<3GD31G<31W VPV|~G3FZOFFTRbPTGA3bPSWUUGA3bPR<@~G@3\\~GA3FNFILTERϚPϐRUSTViܟ4ԟG@3 DECC$DSPRINTF<~PG@3GGC3P`1PWPVPV|~G3FZOFFTScPT<GA3ctPRW(U#UGA3cܟܟ PURTV۟ώӟG@3 DECC$DSPRINTF<~PG@3GGC3P`WX1"PX1PY21GD3G<3GD3tG<3lYRR<@~G@3\\~GA3FNFILTERPRzןG@3 DECC$DSPRINTF<~PG@3GGC3P`GPYgRxRϛRDןG@3 DECC$DSPRINTF<~PG@3GGC3P`YX14X1.P 9 UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 "tuYX1&PGD31G<31<@~G@3\\~GA3FNFILTERG 3ύSG@3\\n\[\\SG3 dRP\RRSPGڟџG@3 DECC$DSPRINTFPG@3GGC3P`<G*A3\P\ PPINFLATEPS1US21GD3G<3GD3uG<3mSR R<@~G@3\\~GA3FNFILTERPR϶՟G@3 DECC$DSPRINTF<~PG@3vGGC3P`GPSϣRϴRRπ՟G@3 DECC$DSPRINTF<~PG@3GGC3P`SXqXkPSXcP<@~G@3\\~GA3FNFILTERPϝ՟G@3 DECC$DSPRINTF<~PG@3GGC3P` UNDEFER_INPUTZ1;PGD3 CLOSE_OUTFILEGA3dGA3X<@~G@3\\~GA3FNFILTERPԟG@3 DECC$DSPRINTFPV6PU+ЬQPʏPQ~iPQUPQPVPVVUϷPT1_G<3N<@~G@3PP~GA3FNFILTERPԟG@z3 DECC$DSPRINTFPG@3GGC3P`T1TPP7PJ?PPO1VPPU~jG@3 DECC$DSPRINTFPG@3GGC3P`1 ϺПG@3 DECC$DSPRINTFPG@3GGC3P`1PџG@3 DECC$DSPRINTFPG@3GGC3P`1PˏTPP/џG@3 DECC$DSPRINTFPG@3GGC3P`oPxTPPSmemflushO>extract_izvms_block?decompress_bitsX@fnfilterHAdircomp!  8 5  5E    6 6 50   5 6 64# 6$  6V 6鑹  G 9 75   7   y 9~%m   8;(j$ ;q UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 Y   :+! r  ;;    =L@CE   =AH   |FIND_COMPR_IDX < MEMEXTRACT > MEMFLUSH >EXTRACT_IZVMS_BLOCK X@FNFILTERiA$CODED$DATA $ADDRESS_DATA)TRUNCEAS5 TRUNCNTSDhPQQ ,VePPSPWYP^P@PP<VePPSPW-P?TVePPSPW PdP1]WV DECC$STRCPYPcЬRRPP^мPݠмPݠ DECC$STRCMPPQQPw?P%5

o??YϾ󨷵ǎԐѥ噞ᅠƄФP__iscntrl8PլRDECC$GA___CTYPEQˏP@aPˏPRRP^OPENR_IDACC_CBs|~G@3 DECC$OPENPG@3G@3LCMA$TIS_ERRNO_GET_ADDR` DECC$STRERRORPG@3NG@3 DECC$DSPRINTF<~PG@3GGC3P`\\\PPG@3G3G@3G3GC3*GC3G3G@3G3GC3G@3GC3PG@3G@3G@3G3=G3G3G@3G3GC3G3G@3GC3G3G@3PGC3G@3G3P<^ЬUլ1PG@3z< ~G@3G@3 DECC$READPG@3G@3 ìUT1G@3,4 DECC$STRLEN<~P"GGC3P`TgP GA3G@3G@3ЬSSG@3SRG@3RRG@3ݬ DECC$MEMCPYRG@3RG@3RG@3RS12UTTPP^GA3T1jG3G3G@3T1OPG@31< ~G@3G@3 DECC$READPG@3G@3T1G@38, DECC$STRLEN<~PGGC3P`ECHO RETURN_VMS GA3G@3G@3G@3G3=G3G3G@3G3GC3G3G@3GC3G3G@3PGC3G@3G3G@3\R=G@3SG@3RS\S\& DECRYPT_BYTEb\P\\b\~ UPDATE_KEYSRS\S\G@3G@3RRG@3bTTPP<^G A3SzSP{ PQPPTTSUSA REPORTMSGG@3SEEKMSGG@3 DECC$DSPRINTFPG@3GGC3P`S1PUGA3_UG@3 DECC$LSEEKPGA3< ~G@3G@3 DECC$READPG@3G@33SDPTG@3G@3TG@3*PG@3G@3RTRG@3RG@3G@3TG@3SSPP^ЬRRXR ZRUVˏRЬRբDDECC$GA_STDERRRbY PDECC$GA_STDOUTRbYˏR%լ  ЬRAլ RR  ֬ ЬSÀx SCREENSIZExˏR1A1Y  DECC$PUTCY DECC$FFLUSHգt&ÄA֣|ѣ|x SCP`ˏREЬRբD< DECC$ISATTYP/ DECC$ISATTYP"DECC$GA_STDERRRb  DECC$PUTCDECC$GA_STDERRRb DECC$FFLUSHЬRAЬRբt1UZ1ePP V7PSCREENLINEWRAPP)ePP  ЬPPЬPVVnVЬR„A֢|Ѣ|xTXXUSSSwY DECC$DFPRINTFQPSQQT TW1PY DECC$FFLUSHAUXRCP`UUZ1@XU Ь T1XTY DECC$DFPRINTFRPTRRSSW1ˏRaЬRբDX DECC$ISATTYPK DECC$ISATTYP>XTDECC$GA_STDERRRb DECC$DFPRINTFRPTRRSSW-PDECC$GA_STDERRRb DECC$FFLUSHЬTRSR SSAWWPPԼ QQP ^ЬPAqDECC$GA_STDERRP` DECC$DFPRINTFЬPAݬDECC$GA_STDERRP` DECC$DFPRINTFDECC$GA_STDERRP` DECC$FFLUSHˏ P3PTT_GETCHPRRPP (P #P PqPQ TT_GETCHPRDECC$GA_STDERRP` DECC$DFPRINTFDECC$GA_STDERRP` DECC$FFLUSHDECC$GA___CTYPEQRSˏSP@aPʏPS DECC$TOLOWERPQSQQPPq  RETURN_VMSЬQAˏ P RPP ԡ|P<^UЬTdqd<~ DECC$MALLOCPSU<@~G@3PP~ݬFNFILTERPR<@~G@3PP~ݬFNFILTERPRS DECC$DSPRINTFSRR dSRݬݬ RGETPPRS S DECC$FREERU P PUUPP^ECHOѬ ;ϘG@3 DECC$DSPRINTFz @>8   h> 0>3S' > >#    %M j@  h MAKEINT64 FZOFFT STR2OEM < ZSTRNICMP$CODE$DATA $ADDRESS_DATAOEM2ISO OEM2ISO_850 ISO2OEM_850ISO2OEMDECC$GA___CTYPERSˏSP@bPʏPS DECC$TOLOWERPRPSRTQRPQPS.S(PЬQaPSP׬ Q֬լ 1SSP PMLx+L8ww1 V1.04GLOBALSV1.030-APR-2009 11:06DEC C V6.2-003RGLOBALS  __iscntrl,L globalsCtor r )/    LOCAL_HDR_SIG CENTRAL_HDR_SIG END_CENTRAL_SIG END_CENTRAL64_SIG END_CENTLOC64_SIGG FNAMESDECC$GA___CTYPE DECC$MEMSET UZPPASSWORD UZPMOREPAUSEUZPINPUTUZPMESSAGEPRNT L GLOBALSCTOR$CODE$DATA $ADDRESS_DATA LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIG CGFNAMESL PglobalsCtor P  P*PPPPPP__iscntrl PլRDECC$GA___CTYPEQˏP@aPˏPRRP ^ SRݏCb DECC$MEMSET,@c¸¼@AUZPMESSAGEPRNTCUZPINPUTC UZPMOREPAUSEC UZPPASSWORDCbP ww1i& V1.04INFLATEV1.030-APR-2009 11:06DEC C V6.2-003DPhuft_free8Phuft_build(Pinflate_free Pinflate Pinflate_blockP(incomplete d-tree) P(incomplete l-tree) Pinflate_dynamicPinflate_fixedPinflate_storedPinflate_codesPP xP ccXP P !1Aa  0@`PccPccP #+3;CScsXP #+3;CScs P     P__iscntrlPPլRDECC$GA___CTYPEQˏP@aPˏPRRP^[G=C3VGAC3TG9C3ZЬ RB MASK_BITSnЬRB MASK_BITST ZPG@3RRG@3RG@3 >f9"5 /8M"ײ]!^FP!Kl3+KG"$ KA(aޖf5^濾raʤ͗#v@Q‚MLޢ GœO"k<\֙,gnj!SF@:,k 2;)}HP*6Aw!adCm ?,"<#-uaPj_{|A.ΛlPq6@,ߍhu7ȉS6{.M&LF^f -?1g++u=|g`wyWT0R-գ.!_X7mt"E!=Z&MDGpe>diGPõjZ+*Qf5wGcaiR=~AwaXF=լmj*6gEG ]klB?X6qF lrJe'xLb-`=m8[* 48 ו0&$q! -`QcTU' v-O2"#k!yEe(q|8F76!fyjGx"&r"/rrh訳>h ױ(}v@<^ѳuqGhTGwH_2}@.t '4M XDKwEEBqSZL^]cFxJ}أ^XEns֚W`"gtt.an enP,ȻT{YI!!d=6b[KBOnM wΑ@(sia )J3 h3(uX?,X/mKͰfj`Ӏh뵋W lZq9$jݠg,?AT&L*l0;p{|nWqzՐ^n)LTvm,;4X'8Zy%8ن!RӼeS@80-X#s՛.=w y^%/CP%&E Cg̞rܗtSFij@.ĊAg;*&i FsP ٷ$lGdB%d7>E]<b[ުsMU|Gyc}$6'vSB GNO QzgaRk 'Em~Y{G}(^&MixqLƙnBU3_v1j;G$v *G򫍷湦Z6>,K1˗I7ҭp:m_OUjϦF˪=Ͽn܋FJKv[KQ}֏;W yL,jh*D+2?.۫vnJCl@Xhs~7؉dS|eM7B2}kU|lLıSBE؞*E}~zOAKncٺEvAE kj*-xSW@H_B["FC`unjM!.d͐l$ N:cT4+~OfnO/s{td4b0 P aƍH=4s9F&`QkYpY.|$,P㭠zS_y^nRaH U\yH7uq$\iG灨0K~y"!ΝiNj4Ůmz߿ӌFDv=Nd6Q>$B;HR?*ORhݱȷ* r|!dw}Q ɞO^?u/O @e|X(ja3|.GMaE)i9F=ZJ٠="+|!DnNpG8qL[W%jtT8Q^e8 u~.Yc]&=L0 D2o[`JygQhL`e[jmqywtL>T 7$`)nQVI0l &\Y( 8el.Kħ{YS;4Tr\VEX]cw=Cq<ýfoÄeBz/䥠XF4ŒfT6TP3W8Lwg1&abp3?/.J楂!X?g$+TAPAye6[FsVEi^b$Z NN/jDs;dHAl-(REvvyupO 8UDqiIjkιQ@z :/뚓Aw3իmY#ko8 qZk3^FW2# {]wRhNMnl*%,IPd%Ɋ&q 5#G%UJt i+ЈUL2|ahN[钥lЄH[0aM!ǐ7MBA/xVy"luk4>?!p6o>؊C1&jd١{;Ms}fit4_H)[Rew CA(>&5 ?p>AIҁE1{ϓR(&GP9m 8N8,<DW'uUS c>zȬtH库/c {؃LAJVR"v>D,ˁt{=*Q0<2W`7ndc aNAк.4Q!s$(}N=\RI+OJjQR86Ņɲ:r{?5*0t'߀ܷ%#30"HiRR1TyJ%"p:i߄rs}%e՞%y𖓠?>BBMS 2 G~ޔ7Il1h*!e>_WmS1&Cі8%̐͢t 3BZRH3bsB hxaNiA`8oX@W-E(,1G\C#-GY$[˾`8Ю8OܙIi\!Њ&&V^>;=3Qqξ"~Uu³_{]:A#FS>0A|iiR !w؊*ߐfDV7ꀢR:ݝI1gAWFYP 1;^Nj=Ueo\r8,SGV;a Ǝ B+ME/l\uqQZJV=':9 L.&+Zl:m, 9S PDhx>CAaG> #\7!_m\%:HQWi! X&6ju5>dШ@ E1"#N>(i3+DO/JF^˓y)pӶT_P1=Uʭѥsji8+rg$vӷe؈B&-B;,V~ #A!gJ164̦m{zosoS5LC9">3r.ɩ ^PբC__W2U㻬B c*c!VgfkMw4w(kov'MЗ8t6IL׳˸bA1D^"3e*DB+j#@.@#][ԫV#ɫcr|hԦ>G tWsrsk9V ^D7qj|tY"oX_Qg@q29}#^c넭8JApӅ xC45%*6JB+&CzY,N{fQS=2Vtgx/QPe(~Y@ ^G?'QDzU3֨Z '%+!5zy9mkJj'Tzy6ɒES^y9ף(krDM{^StaW3;%b)AF[)'zH^@|p yߕUIcbɉvKzTC,crqn~W(!YYa)6EˏCPDqiew ;a0^L=)9|k;x mStG#/^@0$B6eVd>&,y^@7pk4"(Fx[1۔kb@aޘ^z2qq2GzI*ߚmYz_LO_*Yn(B6g;sJ(l0s+@褛EHG3@l1+ڒg4Wf|wYӄqSeӒ+j;A!S6_7).ʂ۽Lc\29% 8$F$xѸnJkjq A!5g?w}C9Y9`â1ӹ4ؑ+Cj -X m[ŎKD} X%Ep68b˞o"@M M^fk4au=b$gp"RX˙V}4tTW~7 6uO 6 ""2.\:։0֞ 'ZhGvI"tsS|MBnqPBaVnk~$gCd$bd_Y'm3{t%p-cbHߵ59I~Ese.3 vpf<Υ'4g%4j1O)Èa7H[zeT%h8M|FyBa֪j䲛7pX(2w[nqsY@|SPd)bXS``h,Jair3*/f lMY[3ڀ~$8ns`xUuX u` kg=~,#:Z$Z'%:܁ɴ^\ê*?>2+ִGG*J\7?1L~ޔrvHYĵ  :p*מxܦC&={ٖdi7Bq{-/2q/*2N]VNze;ASDq|Pz7qYn }y+\0X t!(&C࠺(Zm\@~À5=})* JǴ_O[;\'xLVCL2DpdSQSЃ\WWui/n6Q,v&rE_I"Hχ"x-.6u^kQ6%.4RuS[U UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 P&RRG@3bS READBYTEPSS T[10PxTSRRVTT VRRnRRRЮRSS RSRVVSTUU [ZRZЮS3BG@3Z1UGA3ZG@3MEMFLUSHP[ZG@3FLUSHP[[1Z1U1TUZPG@3RRG@3RG@3RRG@3bS READBYTEPSS T[1@PxTSRRVTTUЮR<SVRRE MASK_BITSRSRU RURVVUTTZPG@3RRG@3RG@3RRG@3bS READBYTEPSS T[1PxTSRRVTTVRRRRRYQQ SQSVVQTiRR 1Rc 1rʏRTRWG@3PPG@3PG@3PPG@3`S READBYTEPSS T[1PxTSPPVTTRVSSB MASK_BITSSSSY1ZPTRZPG@3SSG@3SG@3SSG@3cX READBYTEPXX T[1PxTXSSVTTR<SSZXVSSB MASK_BITSSSXWR SRSVVRTʏWWZWSPZSSRRЮRRWZPPR"RG@3PWP~ZP~ DECC$MEMCPYRZRWPZQZWPW@G@3AG@3RZ9GA3ZG@3MEMFLUSHP[ZG@3FLUSHP[[1Zծ1C10U1Uc 1ʏUTUSG@3RRG@3RG@3RRG@3bS READBYTEPSS T[ExTSRRVTTUVRRE MASK_BITSRRЮSR1 1ZG9C3VG=C3TGAC3[ P^UG=C3RGAC3\G9C3Vˏ\TT STSRRT\\ZPG@3SSG@3SG@3SSG@3cT READBYTEPTT \U1Px\TSSR\\ˏRWRR\\WG@3SSG@3SG@3SSG@3cT READBYTEPTT \U1Px\TSSR\\RSʏSWSX1RR\WSWS1READBYTET\VPG@3PPG@3PG@3PPG@3ǚ`SdPSS \U1Px\SPPR\\VSVRCG@3V9GA3VG@3MEMFLUSHPUPVG@3FLUSHPUU+VRR\WSWS1BVG9C3RG=C3\GAC3UXXPPx^GB31&\Lx\\\P Lx\\\PLx\\\ PLx\\ GC3GC3GB3G1C3G-C3<~< ~x HUFT_BUILDP\GB3\T1PRPBxRR G C3G C3GC3G5C3 x HUFT_BUILDPSS3GB3RPRТ\R DECC$FREE\RGB3GC3ST$PG C3GC3GC3GB3 INFLATE_CODESPTTPPh^|G=C3TGAC3SSYPG@3RRG@3RG@3RRG@3bU READBYTEPUU SY1PxSURRTSSˏTRRTTSSZPG@3RRG@3RG@3RRG@3bU READBYTEPUU SY1PxSURRTSSˏTRRnTTSSWG@3RRG@3RG@3RRG@3bU READBYTEPUU SY1PxSURRTSSˏTWWTTSѮ n 1EUW1READBYTEVSVPG@3RRG@3RG@3RRG@3b\fP\\ SY1PxS\RRTSSEpRˏTBTTSUUWUEKRBUU|~ HUFT_BUILDPUUU4U(RRТR DECC$FREERU1An[RB MASK_BITSZV[1READBYTEWPSVG@3RRG@3RG@3RRG@3b\gP\\ SY1mPxS\RRTSSTRRRRR\XX RXRTTXS<XXVRVXZZB1]X1SVPG@3RRG@3RG@3RRG@3b\gP\\ SY1PxS\RRTSSˏTUUTTSVURR[1\P\Ьͼ\ DECC$FREEͼ\1URUR1VRVZBURUR1X1SVPG@3RRG@3RG@3RRG@3b\gP\\ SY1PxS\RRTSSˏTUUTTSVURR[%RPRТ\R DECC$FREE\R1URURPVRVBURURZ1SVPG@3RRG@3RG@3RRG@3b\gP\\ SY11PxS\RRTSSˏTU UTTSVURR[)RPRТͰR DECC$FREEͰR1=URURPVRVBURURZV[1͈͈RRТ̈́R DECC$FREË́RTG=C3SGAC3 G1C3G-C3<~ݮ HUFT_BUILDPUUUUUIG<3GGC3P`ͨͨRPRТͤR DECC$FREEͤRU1MG5C3ݮSxRRS~ HUFT_BUILDPSSS ѮSS~SJG<3kGGC3P`͘͘RPRТ͔R DECC$FREE͔R͐͐\\Ь͌\ DECC$FREE͌\S~ INFLATE_CODESPY)̀̀RPRТ|R DECC$FREE|R*xxRPRТtR DECC$FREEtRYP|^G=C3SGAC3RWPG@3PPG@3PG@3PPG@3`T READBYTEPTT RU1PxRTPPSRˏSSSRRVPG@3PPG@3PG@3PPG@3`T READBYTEPTT RU_xRTPPSRRˏSVSSRSG=C3RGAC3V -PR&V ϷPRPV ϮPRUURRPP^G9C3GAC3G=C3լLϐG-C3G1C3~G5C3G C3GB3GC3GC3GC3GC3GC3G C3JPςG-C3G1C3RG5C3GC3GB3G%C3GC3G!C3GC3G)C3G C3߭PQQR1Pխլ.GB3G C3GC3GC3GC3GC3G C3GC3,GB3GC3GC3G%C3GC3G!C3G C3G)C3GA3G9C3G@3MEMFLUSHPRG9C3G@3FLUSHPRRP ^GB3LGC3RPRТ\R DECC$FREE\RGB3SPSУ\S DECC$FREE\SGB3GC3RRP0^ͰRR$Ѭ ЬRD~ DECC$MEMSETЬRSbTDRS ԼԼԮ1RBRRR[ЬScRRcT PDTT ЬScTTcxRRT P–B1kRxRTD 1NPDRpUUSlUUWT RRT<~8 DECC$MEMSETTSЄRBlUBlSE8SSЮ RBlYl8Z0Ю$RԢWԭXԮ [ 1ެ( DECC$MALLOCKЮR׮R1jPЮ0RB$WR[R1DЮ0R֮0B$WW PЮ(RPвPW[VxVSS1RRSUx[TUTVVPxSSTSd dSVVPVWRR WWVxV Ю0RVB$ RR~PX)ծ0ЭSPSУRS DECC$FREERS1XԼXЮ0RXBRSYBlЮ$SBg VRRfXhЮ0RBWSS TxWRRRRRYRSTRVVRЮ0SCS(fBcЮ0RB$WR[R1W[RRg8SxRRSZS cfJPjSЬ USU S TPTTfhUS޼RCbfUR޼SBchW[RxR,W RWRYVV VR(fBh,VV [SxSRYSSRSPRYRRYSSRSRYxWSSSSSYSЮ0TRINFLATEP __iscntrl,| inflate_codes<inflate_storedD  inflate_fixed^ inflate_dynamicx inflate_block.inflated  inflate_free_l huft_build<4 UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 Ϳ huft_free$ PI=  7;E   6X 6A] }7 %   7`  7|  7  7  7 P 7i 5 8  8  8) % .8 08 :8i <8 G8- I8J 8U1 U8! h8& 8 8 8= 8m}  (99 )9Y( u9 {9  9@ 97 9Q 9 9\ 1 9 9$ 9X 9qQ 9"X :M MASK_BITSGDECC$GA___CTYPE INFLATE_CODES HUFT_BUILDMEMFLUSHFLUSHREADBYTE DECC$MALLOC DECC$FREE DECC$MEMSET DECC$MEMCPY | INFLATE_CODES INFLATE  INFLATE_FREE l HUFT_BUILD  HUFT_FREE$CODE$DATA $ADDRESS_DATASDl(P׮0Ю0RB$WxWRRRRRYRЮ0SRClЮR׮R1[[ 1vо$SծѮ SSЮP ^ЬSSУRS DECC$FREERSPPww1I,+ V1.01LISTV1.030-APR-2009 11:06DEC C V6.2-003P PfnprintPratioPget_time_stampPfn_is_dirPsPuP9PsPuP8PuP8PuP9PuP8PuP8P%03uP%s %s 0PStoredShrunkReduce1Reduce2Reduce3Reduce4ImplodeTokenDefl:#Def64#ImplDCLBZip2LZMATerseIBMLZ77WavPackPPMdUnk:###'PNXFSPlist_filesP--------- ------- %s %lu file%s P%s %02u%c%02u%c%02u %02u:%02u %c2P-------- ------- --- ------- %s %s %4s %lu file%s P%s %-7s%s %4s %02u%c%02u%c%02u %02u:%02u %08lx %cP%s ("^" ==> case %s conversion) P;^P-------- ------ ------- ---- ---------- ----- -------- ----^P Length Method Size Cmpr Date Time CRC-32 Name;P--------- ---------- ----- ----P Length Date Time NameP100%% P%c%d%%P__iscntrl PլRDECC$GA___CTYPEQˏP@aPˏPRRP^[VԮRGT3RRn| G@3Ԯ- G<31G03EЮR~BRbЮR~BkRb,G@3 DECC$DSPRINTFPG@3GGC3P`CPЮR~BRbЮR~BkRbG@3 DECC$DSPRINTFPG@3GGC3P`G3READBUFP 3 1PCENTRAL_HDR_SIGG3 DECC$MEMCMPP1GnA3\P<\RRRR\RRGfA31ݮ CENTSIGMSGG@3 DECC$DSPRINTF<~PG@3GGC3P` REPORTMSGG@3 DECC$DSPRINTF<~PG@3GGC3P` 11PROCESS_CDIR_FILE_HDRPRR 1<GTA3~ DO_STRINGPRRR R 1PGA3GA3 DECC$FREEGA3<GVA3~ DO_STRINGPRRRR 1G31G3V?VRG33G3G3\BlGA3MATCHPV PRRG3V@RG36PG3G3\BlGA3MATCHPVPRRG3G3V1G 2 GiB) without large file support PunzipP%s: cannot find %s (%s). dP%s: cannot find zipfile directory in %s, %sand cannot find %s, period. PPNo zipfiles found. ,P%d "zipfiles" were directories. P1 "zipfile" was a directory. P%d file%s had no zipfile directory. P%d archive%s had fatal errors. P%d archive%s had warnings but no fatal errors. pP%d archive%s successfully processed. 1P%s: cannot find anyZIPNFO REPORTMSGGEND_CENTLOC64_SIGEND_CENTRAL64_SIGEND_CENTRAL_SIGCENTRAL_HDR_SIG LOCAL_HDR_SIGDECC$GA___CTYPEFREE_CRC_TABLE STAMP_FILEDO_WILDCHECKDIRISWILD VMS_MSG_TEXT CHECK_FORMAT INFLATE_FREEEXTRACT_OR_TEST_FILESFZOFFT MAKEINT64MvO UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 AKELONGMAKEWORD DO_STRING SEEK_ZIPFREADBUFOPEN_INPUT_FILEGET_TIME_STAMP LIST_FILESZIPINFOZI_END_CENTRAL matches for wildcard specification "%s".  Perror: cannot allocate unzip buffers P__iscntrl@ PլRDECC$GA___CTYPEQˏP@aPˏPRRP^XRY< ~ DECC$MALLOCPG@3ݏ DECC$MALLOCPGA3G@3GA36XG@3 DECC$DSPRINTF<~PG@3GGC3P`Z1P G@3GA3PEND_CENTRAL64_SIGPEND_CENTLOC64_SIGPEND_CENTRAL_SIGPCENTRAL_HDR_SIGP LOCAL_HDR_SIGKEND_CENTRAL64_SIG3KEND_CENTLOC64_SIG3KEND_CENTRAL_SIG3KCENTRAL_HDR_SIG3K LOCAL_HDR_SIG3G43 G3PG83 G3 PG3|TVSWG@3DO_WILDPG@3G@31PG@3XG<3BR =RL4GH3G3$VU\T\S\AGGC3P`ψPRRT&RLWPR S PRUVRLRYRYG@3DO_WILDPG@3G@31FVT\U\1WS\\1X1G@3ISWILDPvXISWILDP1SWYG<31G3 ZIPNFORPRG@3RdG@3 DECC$DSPRINTF<~PG@3GGC3P`QPXG@3SWYlPRRR %RLTW R PRUVRYRYG@3ISWILDP1IG<31=GH3G3 G<31!US\T\VDGH3G3G<3,GD3 G<3<~XGGC3P`VPWS\U\T\DV.R+RRVkG@3 DECC$DSPRINTF<~PG@3GGC3P`TDTRRRTKG@3 DECC$DSPRINTF<~PG@3GGC3P`UDUϮRϨRRU3G@3 DECC$DSPRINTF<~PG@3GGC3P`SDSjRdRRS G@3 DECC$DSPRINTF<~PG@3GGC3P`W0G@3 DECC$DSPRINTF<~PG@3GGC3P`4W0WG@3 DECC$DSPRINTF<~PG@3GGC3P`VU\T\.G@3 DECC$DSPRINTF<~PG@3GGC3P`FREE_G_BUFFERSYZZPP^ INFLATE_FREECHECKDIRG@3 FREE_CRC_TABLEG@3GB3GB3 DECC$FREEGB3GA3GA3 DECC$FREEGA3GA3 GA3 DECC$FREEG@3 G@3 DECC$FREEGA3G@3RPR\LG3\l l DECC$FREElRR@^|WԭTG@3ISWILDP:GxA3G@3 DECC$STATP#<GA3PʏPQP@QQT1 լ1G<31GA3mG3 ZIPNFOSSG3GRCRG@3RG@3S7G@3 DECC$DSPRINTF<~PG@3GGC3P`qPG3 ZIPNFOSP\SG@3QaPQR P VMS_MSG_TEXTPRRG@3SG@3 DECC$DSPRINTF<~PG@3GGC3P`T LV1P V1PGA3GA3 CHECK_FORMATPV1xOPEN_INPUT_FILEP V1gPG@3SS DECC$LSEEKPRRRDPRR8PRS DECC$LSEEKPRRRPS DECC$READPRRGA3GA3CGG@3 DECC$DSPRINTF<~PG@3GGC3P`G@3 DECC$CLOSESV1GA3G@3G@3G3G<3GH3G39G$31G@3G@3 DECC$DSPRINTFPG@3GGC3P`G3 GA3R#GA3 GA3P PЏPPRRGPUUcG@3 DECC$CLOSEX4G@3πG@3 DECC$DSPRINTF<~PG@3GGC3P`լ UV1PGA3 V1PGh3G3G@3 DECC$CLOSEUV1qRG3 <GjA3PRRTG31<GjA3S<GlA3RSR1}@RSG@3G@3 DECC$DSPRINTF<~PG@3GGC3P` UW;RSG@3ZG@3 DECC$DSPRINTF<~PG@3GGC3P`UW1T7G@3G@3 DECC$DSPRINTF<~PG@3GGC3P`UG3G3G A3G A3RJ|~R~FZOFFTPG@3G@3 DECC$DSPRINTF<~PG@3GGC3P`U1PR1G^A3UGZA3MG@3G@3 DECC$DSPRINTF<~PG@3GGC3P`G A3G^A3G A3UcP|~RFZOFFTPQG A3 }RPvRRQG@3ϱG@3 DECC$DSPRINTF<~PG@3GGC3P`UG31GZA31G3FG,3  %RP RRG@3 DECC$DSPRINTFPG@3GGC3P`4G@3G@3 DECC$DSPRINTF<~PG@3GGC3P`G@3 DECC$CLOSEUUV1V1PG^A3 SEEK_ZIPFPRRG@3 DECC$CLOSEV1pR/G3READBUFPCENTRAL_HDR_SIGG3 DECC$MEMCMPP1G A3SG A3G^A3 SEEK_ZIPFPR,G3READBUFPCENTRAL_HDR_SIGG3 DECC$MEMCMPP^R: REPORTMSGG@38G@3 DECC$DSPRINTF<~PG@3GGC3P`G@3 DECC$CLOSERRV1V1P|~S~FZOFFTPG@3G@3 DECC$DSPRINTF<~PG@3GGC3P`UG^A3 SEEK_ZIPFPRG@3 DECC$CLOSERV1*PG3 ZIPINFOPRJGH3߭߭GET_TIME_STAMPPR0PGT3GD3G3 LIST_FILESPR EXTRACT_OR_TEST_FILESPRRURUG@3 DECC$CLOSEGH31G31խ1ݭG@3 STAMP_FILEPGG<34G@3|G@3 DECC$DSPRINTF<~PG@3GGC3P`U?U:G<31G@3ZG@3 DECC$DSPRINTFPG@3GGC3P`UVVP^SGA3TzTP{ PQPPWW 1WT~G@3 DECC$LSEEKPGA3WG@3G@3 DECC$READPG@3G@3W V1PG@3WP RRPG@3G@3G@3UPG@3RbPPP-ݬR DECC$MEMCMPPG@3G@3PPG@3SPG@3G@3G@3G@3GA3 DECC$MEMCPY PWTGA3WRRǏ RUTS1TU1 DECC$MEMCMPRPGA3GA3G@3 DECC$LSEEK< ~G@3G@3 DECC$READPG@3G@3 V1P G@3PPG@3G@3G@3RPG@3QaPPP)ݬQbPG@3G@3PPG@3SPG@3G@3G@3G@3GA3 DECC$MEMCPYTSTU1SVPVVP^G3SX1PSG@3 DECC$LSEEKPGA3G@3 DECC$READPG@3G@3zG<3G34G@3ϊG@3 DECC$DSPRINTF<~PGnJ UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 @3GGC3P`G@3 DECC$DSPRINTF<~PG@3GGC3P`X1?PEND_CENTLOC64_SIG DECC$MEMCMPPX1"MAKELONGPZ MAKEINT64PYMAKELONGPR<GjA3QQPlab 9Psys 4Phid /Prdo (Pbinary!PebcdicPtextPuPuPnoPyesPnot PXPuP PP%8KT^h(P4<@ELXhvPPzi_longP PuPuP-PzipinfoPuPentriesPentryPuParePisPuPXPuPXPuPXPuPXPuPentriesPentryPuPXPuP11PXPuP11PXP11pPzi_end_centralhPzi_optsHP%04u%02u%02u.%02u%02u%02u0P%u %s %u %02u:%02u:%02uP%02u-%s-%02u %02u:%02uP%03dP-------------------------- file comment ends ----------------------------- zP ------------------------- file comment begins ---------------------------- \P There is no file comment. 8PGMT modification/access times only PGMT modification/access times and Unix UID/GIDP There %s a local extra field with ID 0x%04x (%s) and %u data bytes (%s). P %02xP: P. The first 20 are: lP. The 128-bit MD5 signature is %s*P. The file was originally a Tandem %s file, with file code %uP##PObjectPEditPKey SequencedPEntry SequencedPRelativePUnstructuredP. The AOS/VS extra field revision is %d.%dP. The QDOS extra field subtype is `%c%c%c%c'6P. The local extra field has %lu bytes of %scompressed BeOS file attributesP. The local extra field has %lu bytes of %scompressed AtheOS file attributesP. File is marked as %s, File Dates are in %d BitPData-forkPResource-fork|P. File is marked as %s3P. The associated file has type code `0x%lx' and creator code `0x%lx'P. The associated file has type code `%c%c%c%c' and creator code `%c%c%c%c'P. The local extra field has %lu bytes of %scompressed Macintosh finder attributeshP. The Mac long filename is %sP. The first 24 UTF8 bytes in the extra field (V%u, ASCII name CRC `%.8lx') are: P. The UTF8 data of the extra field (V%u, ASCII name CRC `%.8lx') are: PcreationPaccessPmodificationrP. The local extra field has UTC/GMT %s time%s)P. The local extra field has %lu bytes of NT security descriptor dataP. The local extra field has %lu bytes of access control list informationPPcompressed(?)PdeflatedPrun-length encodedPstoreddP. The extra field is %s and has %u bytes of VMS %s information%sP. The local extra field has %lu bytes of OS/2 extended attributes. (May not match OS/2 "dir" amount due to storage method)PunknownPTheosPTandem NSKPASi UnixPFred Kantor MD5PAcorn SparkFSPAOS/VSPSMS/QDOSPBeOS|PAtheOShPSecurity Descriptor\POS/2 ACLXPMVSPPVM/CMS8PZipIt Macintosh (short) PSmartZip MacintoshPZipIt MacintoshPnew Info-ZIP MacintoshPold Info-ZIP MacintoshPUTF8 entry commentPUTF8 path namePuniversal timePUnix UID/GID (any size)~PUnix UID/GID (16-bit)ePold Info-ZIP Unix/OS2/NTXPInfo-ZIP VMSLPPKWARE Unix>PPKWARE Win323PPKWARE VMS.POS/2$PPKWARE AVPPKWARE 64-bit sizes P - A subfield with ID 0x%04x (%s) and %u data bytes P The central-directory extra field contains:* P error: EF data block (type 0x%04x) size %u exceeds remaining extra field space %u; block length has been truncated.  P???  P386 program  P286 program  P 86 program  PIndexed  PKeyed  PDirect  PSequential  PDirectory  PLibrary r P Theos file attributes (%04X hex): %s , P MS-DOS file attributes (%02X hex): %s%s%s%s%s%s%s%s  P MS-DOS file attributes (%02X hex): read-only  P MS-DOS file attributes (%02X hex): none t P non-MSDOS external file attributes: %06lX hex @ P Unix file attributes (%06o octal): %s  P Amiga file attributes (%06o octal): %s  P VMS file attributes (%06o octal): %s  P apparent file type: %s d P disk number on which file begins: disk %lu  P length of file comment: %u characters  P length of extra field: %u bytes  P length of filename: %u characters d P uncompressed size:  %s bytes ( P compressed size: %s bytes P 32-bit CRC value (hex): %.8lx P file last modified on (DOS date/time): %s P extended local header: %s @P file security status: %sencrypted  P compression sub-type (deflation): %s P number of Shannon-Fano trees (implosion): %c P size of sliding dictionary (implosion): %cK fP compression method: %s ,P minimum software version required to extract: %u.%u P minimum file system compatibility required: %s P version of encoding software: %u.%u P file system or operating  system of origin: %s BP offset of local header from start of archive: %s (%sh) bytes 5Punknown (%d)P There are an extra %s bytes preceding this file. PsuperfastPfastPmaximumPnormalPPPMd-edPWavPackedPLZ77-compressed (IBM)Ptersed (IBM)PLZMA-edPbzippedPimploded (PK DCL)hPdeflated (enhanced-64k)^PdeflatedTPtokenizedKPimploded8Preduced (factor 4)%Preduced (factor 3)Preduced (factor 2)Preduc ed (factor 1)PshrunkPnone (stored)PMac OS/X (Darwin)PTheosPTandem NSKPBeOSPAtheOSPWin32 VFATPMVSPAcorn RISC OSPSMS/QDOSPNTFSPTOPS-20PCP/MvPZ-SystemhPMacintosh HFSXPOS/2 or NT HPFSLPAtari STEPVM/CMS@PUnix<PVMS4PAmigaPMS-DOS, OS/2 or NT FATP%lu file%s, %s bytes uncompressed, %s bytes compressed: %s%d.%d%% P Central directory entry #%lu: --------------------------- 6P %s of the  UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1   archive entries %s contained within this zipfile volume, out of a total of %s %s. P of %s (%sh) bytes. The entire central directory is %s (%sh) bytes long. XP This zipfile constitutes disk %lu of a multi-part archive. The central directory starts on disk %lu at an offset within that archive part P and its (expected) offset in bytes from the beginning of the zipfile is %s (%sh). dP This zipfile constitutes the sole disk of a single-part archive; its central direc tory contains %s %s. The central directory is %s (%sh) bytes long, P Actual end-cent-dir record offset: %s (%sh) Expected end-cent-dir record offset: %s (%sh) (based on the length of the central directory and its expected  REPORTMSGEXCLFILENAMENOTMATCHEDFILENAMENOTMATCHED ENDSIGMSG CENTSIGMSGGEND_CENTRAL64_SIGEND_CENTRAL_SIGCENTRAL_HDR_SIGDECC$GA___CTYPEMATCHFIND_COMPR_IDX ZSTRNICMPFZOFFTMAKELONGMAKEWORD  DO_STRINGREADBUFFNPRINTRATIOPROCESS_CDIR_FILE_HDRUSAGE DECC$MALLOC DECC$FREE DECC$STRLEN DECC$MEMCMP DECC$STRRCHR DECC$STRNCPY DECC$STRCPY DECC$MEMCPYoffset) P Zip archive file size: %s (%sh) dP------------------------------- @P End-of-central-directory record: PZip file size: %s bytes, number of entries: %s  PsP__iscntrl`PլRDECC$GA___CTYPEQˏP@aPˏPRRP^ZQUVTY|WG3мnм[n1p[PP-1aPkSR1?RPP-M{P1Pz?PQ1~PQ G,3Q1kG,31aPQ G,3Q1OG,31EPQ G3Q14G31)PQ|UQ1WUVG,31G,31PQ G,3Q1G,31PQ G,3Q1G,31PQ Gt3Q1Gt31PQ G,3Q1G,31PQTYQ{XTYG,3eG,3]PQ GH3QMPGH3BPQ G,3Q0 G,3&PQ QGh3PGh3 PPZR1n[PP-1nRnRZn[ZUSAGEPS1PGt3 DECC$ISATTYPGt3G,3 nG,3G,3G,3PP PqPR?PVG$3YGD3VG$3GD3Gh3Bn WG$3UG$3n X GD3TGD3PUG$3YGD3n[SSP|^G,3 1+G@3 DECC$DSPRINTFVfPG@3GGC3P`G@3fPG@3GGC3P`GA3FZOFFTUeP\~GA3eP\G@3fPG@3GGC3P`ϥϝG3ePSϓ~G3ePRυ}G3eP\s~G3eP\RSG@3fPG@3GGC3P`<GjA3T1)GfA3ePRGfA3 SPSGZA3eP\~GZA3eP\SRϤG@3fPG@3GGC3P`G^A3eP\ϵ~G^A3eP\G@3fPG@3GGC3P`P<GlA3\\\TTG@3fPG@3GGC3P`BG^A3ePS2~G^A3ePR GZA3eP\~GZA3eP\RS)G@3fPG@3GGC3P`GbA3ePRGbA3ϹTϸTϷGfA3eGfA3ϡSϤSSPTRG@3fPG@3GGC3P`PG$3T|~GA3FZOFFTPRZGfA3FZOFFTPR{ޟG@3 DECC$DSPRINTFPG@3GGC3P`P^SV|TnYԮG3,xG3~ DECC$MALLOCPTRG3BdRRG3G3,xG3~ DECC$MALLOCPURG3BeRRG3G03G3G@3G@3RG8A3 Pԭ2WG3READBUFP 3V1OPCENTRAL_HDR_SIGG3 DECC$MEMCMPP1GnA3\P<\WRRRR\RRGfA31W CENTSIGMSGG@3 DECC$DSPRINTF<~PG@3GGC3P` REPORTMSGG@3 DECC$DSPRINTF<~PG@3GGC3P`V1PROCESS_CDIR_FILE_HDRPRRV1P<GTA3~ DO_STRINGPRRVRVR1cG31G3SJP|RG3=PG3G3\BlGA3MATCHPSTBd PRRG3SH\G3>PG3G3PL`GA3MATCHPSULeP\\G3G3S1F<GVA3~ DO_STRINGP\GA3GA3 DECC$FREEGA3\VG,3PP $P1r?PFNPRINT<GXA3R1R DO_STRINGP\1\V\1\X1I~P#P\r\VmW϶ޟG@3 DECC$DSPRINTFPG@3GGC3P`V߭P\0\V+P<GXA3RR DO_STRINGP\\V\\X1\1G0A3YG4A3<GPA3RʏR YnZP<GVA3RR DO_STRINGPRRVRRX1q<GXA3RR DO_STRINGPRRVRRX1IխԭW1PV1GD31[YݮRATIOPW[WWn ZPZݮ FZOFFTP\ϺYFZOFFTPSzWP{ PQPP W~[S\ZݮwݟG@3 DECC$DSPRINTFPG@3GGC3P`TcVU\G3KLd:G3RLbFILENAMENOTMATCHEDG@3 DECC$DSPRINTF<~PG@3GGC3P`\\G3T DECC$FREEUdVV\G3LPLe:G3RLbEXCLFILENAMENOTMATCHEDG@3 DECC$DSPRINTF<~PG@3GGC3P`\\G3U DECC$FREEV1GnA3 END_CENTRAL64_SIGSEND_CENTRAL_SIGSSG3 DECC$MEMCMPPTGrA3LEND_CENTRAL_SIGG3 DECC$MEMCMPP3 ENDSIGMSGG@3 DECC$DSPRINTF<~PG@3GGC3P`VnV VG,3 GGC3P`VXXP0^мRG8A3RBR>|~RG8A3~FZOFFTPϽݟG@3 DECC$DSPRINTFPG@3GGC3P`G8A3S<GTA3RRS<GVA3RRSG0A3SG@3SlGOA3RRRTPTGNA3h<GRA3RRURFIND_COMPR_IDXPd GGC3P`FNPRINT G8A3FZOFFTPR~G8A3FZOFFTPRݟG@3 DECC$DSPRINTFPG@3GGC3P`ѮGMA3~ܟ DECC$DSPRINTFSPЮRB(SSݟG@3 DECC$DSPRINTFPG@3GGC3P`QlP RRRPRQPQ{RPPQQQlP R RP Q{RPQPQܟG@3 DECC$DSPRINTFPG@3GGC3P`T D(GOA3~۟ DECC$DSPRINTFS D(SSϠܟG@3 DECC$DSPRINTFTdPG@3GGC3P`QhP RRRPRQPQP{RPPQQQhP R RP Q{RPQPQaܟG@3dPG@3GGC3P`dSS<GRA3~2۟dT CTTHܟG@3 DECC$DSPRINTFScPG@3GGC3P`U1<GPA3RʏR8<4<<'ܟG@3cPG@3GGC3PAR UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 z`<GPA3RʏR38288ܟG@3cPG@3GGC3P`YPUU M<GPA3RxRRʏRRhrS6wS.|S&ρSφSϋSϐSϕSSj DECC$STRCPYˏVR.HvˏVR .PMwˏVR .PWxˏVR .PRyˏVR.SESSzˏVR.TXTT{ˏVR .PW|ˏVR .PR}~jV؟G@3 DECC$DSPRINTFPG@3GGC3P`1Pծ1Ѯ1Ѯ 1Ѯ1}Ѯ 1tѮ1kѮ1bˏVRRaR PR@'R`6RRR39dj5-j.lj%bjcjpj sj?jˏVR r-kˏVR rP-nˏVR rP-qˏVR wP-lˏVR wP-oˏVR wP-rˏVR"ˏVRsxm!ˏVR S P-mˏVR"ˏVRsxp!ˏVR lP-pˏVR"ˏVRtxs!ˏVR TP-stjV ՟G@3 DECC$DSPRINTFPG@3GGC3P`7GDA3RRG@3 DECC$DSPRINTFPG@3GGC3P`ˏGDA3S0S՟G@3 DECC$DSPRINTFPG@3GGC3P`1dS3S ՟G@3 DECC$DSPRINTFPG@3!GGC3P`1/PˏSR ͼͼˏSR ͸ P͸ˏSR ʹ PϮʹˏSR Ͱ PϒͰˏSR Ϻͬ PvͬˏSR ϣͨ PZͨˏSR όͤ P>ͤˏSR w͠ P"ͤͨͬ͠͠Ͱʹ͸ͼSԟG@3 DECC$DSPRINTFPG@3GGC3P`<GVA3R1 GA3VGVA3[ѬЬn1|GA3n1mP7՟G@3 DECC$DSPRINTFPG@3GG"C3P`<[RR1z MAKEWORD DECC$DSPRINTFWMAKELONGY DECC$STRCPY DECC$STRLENȮfPUPZV<[RRR[S6S.S&SSPSSSKS6LSX+ ( V~RR~ DECC$STRNCPY)$SV~SԼ18P11/X1~~~f~ϪПG@3gPG@3GGC3P`1P1I1X1<SzSP{ PQPP S~ϊПG@3gPG@3GGC3P`1P11X1RʏRxRUV眽 UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 j()G@3gPG@3GGC3P`1bP1XWRRP@~ϖxRP@FgRRfFEПG@3gPG@3GGC3P`1PMtϵƟϯG0A3FZOFFTPϘƟG@3cPG@3GGC3P`GQRSUVWXY⽟G@3  DECC$DSPRINTFPG@3GGC3P`PЬSRxRTRxRRRTRxRRRTRRT~cRxRTRxRRRT3RxRRRTRRT~ϴG@3 DECC$DSPRINTFPG@3GGC3P`^ЬQaRRPʏPPPY RPˏPSRPˏPX RPˏPWRPˏPVxaPˏPUSS S DECC$DSPRINTFT SP@TG,3 %UVWXTlY~ݬ  DECC$DSPRINTFpPGH3$UVWXSlY~ݬ  DECC$DSPRINTFCPVWXTQYPЏdRRZIPINFO` __iscntrl,zi_opts$zi_end_central4!zipinfoT(zi_longGzi_short' Tzi_showMacTypeCreatorUzi_time- t`O    4 n 4{q    5! 51"Q5 '6# 06$j 6& 6E'   7/- 7/ 70 7#06!,b _9e@7 :E( :E _8FW  :H :I- :I :I$7d#GM1[l LUz4&aͫ}_Q<jE4Fsqs~fdt֋\/B)2RVN3}[:8#ag'vb²(cJƈDEፍLj-'˰@bWwj%!UU *d#QA/sm*3D|k 49As@ǁm•J UV/22n Hna;dOkYU|UF4C>:#:FskQ8yI0yof@g/oǜWO&~ߨ yQ>RCYXMOӭ,rڰ m d7D*Eԕ/rr!`5S}wz9!~ w:ERUϝ0< ;{si>˗ڋNsW|>).][OX _mϩ" tHa Z>n(T#Wa1--٥BCҝ.+_o|7k9 ĎZTuMD `xI0aZL J byDū 'kαޖ*DV78hW ];ȗ_ |."bo"\w)kjՏyӑ|9ʵִ"=%JHUAބdlʡWH`à@AHCO%Qkp~'pΫBC.d>1balpa韘ci-pUp۰M-() 0z y-\cO. p2a맶\&:b6iP[GK뒦c+?u߿ gD# _1S - (!YyfBs\lwazefb)ì[񃡎b\8q Z}qBy>7鋻^,%|*Q)VrUn=)6d3^`6Sy!=}& <݉BZQ'0Zzl+zkpwIX`9Gvj^r=aJjk4&s؁ XlWFNDrNˑ$> Ƹ\xѴ aq>Tc.2KqyC:x#l?YT4~5og.ˇi65iO2">1aS%ƇW枛ZlI=>N;1jL. B<&h#̮@LVms_7[H Jqle_<}vЏ#7|||ኚK%Ko* hi#RgX(prLBDJ;nEj3Kˬj\Aо!NI`EI5][Qcx̤0^lį V9&Wy;Z됎YwC̽odӢ*TA'a]Vz9CY!)EO5u87" @UfʂNC*ÃP#`U7 df~+T,Mb[ZS( UN"-Pv 5G`}jW<{"Gr@$FűyOr 1BGLeωD`{:WM?H+ $ |{[q1p&fD|q.L"`r;gk.kN1PҘ9 --ѫuJH)LIS;p,VeZuz`1KҜPE6lk" 93}5(L/Zh4\7trtKO$Y%hSh;uSyl{*|__]=SC7 jFFOo!IuHdCX$"10ytmaxXɥy`Z!d5d#=$d~犠4zj>lrPޓI4{62ÿ_|JbU nU1S"HQ0וF`b5)^ӟ@tEdS9bٷa0ưscè)Q4\/ mis]%Ԏ̝&9B]$AOPX31zGHaA{xxwy+nm ! ѽ tX,+2mTYϯr!ގo\jt*2A!KiCJQ% 57K-wbM 4*V*e"%:`VK>8#隊JuN7DϦp;/௵!m# =1dM\t(:2-Wdf" + p6EM3`.Fr#goY)hZ74ԀP9">mTfKsͲB/IJsKZ)~]8}jnu:~]ԋޯ-Gwmh luk40VJ ym]q֎Dp~X?ֿd}aKȺ i{COɔldd&C[#A5u&롖rzYP'4TCĸ c,b):M+g8X$!ؙ1=G#bfg {7,R>^%T.-t $X2UEC Rʼny#Ns47T<pxPDOF s:iNqsQ͇o-v$M;_mA99'wJ.`yCxXb5յ>v@ޒ&EN/M];LٟF {M9R3 >%xvQ]_YHB?\VCwUz4 muN!ZFM:yج;KQS Z``Y_v-~j+B$V~%UbRD+dU[+J1tىN t"]%{] g!mY0ޒG}<漽K.M7$XS)J"ϴ_MV4XE$2v4p縛x <[KYӳU|Xg:]f'Y %" |6RM72A ZZ%Pz EG&GvTO ȸI]_SOVXґD0[1-:nBY 1ā!GJi4%bF{DBD1h]AHv6Oi C%2"0Cz;ۇz-kVJp[r`6QM_K i(Ja shlJTf!ÒLQa;^¼%0u>D鹎KÊɼ \eoX|e-~s=3F.&a/E^5YpkiSGj^*^bJT7F u:lDr,⤺+& o>[Jl%QW5^;d6JgcexJɯ]F/1S~MI02()wahH1I (s9]b;~*L=pZforT\77f=ځD? /  ˩*2*缭jrLXUs?חT헉O$Gm*R8q|,NM<5mK{[dBIvW TLo4*jwT\ʈ)@u x"ZE5Xn: fдdG3[ڴ[ q⠴v L>`b]F xyE#h9A˖vCo~AVn;VLOǫ_01I7 2FV1slrI{ &?t sWb_BKNmڠAE$?E w{Nzs+,Q~#ʍ 1BZ,=W򹓚uY->V(ĂJ&[vШQ}p,Hi^8}̯7 O*{DLW7Z"&qg6GCN)rBpj|9!f8g]Cy(kīv"1tLQBj @RWpNQG-׵dX}DO-@.&.< UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 Ks78  - DECC$ISATTY DECC$DSPRINTF ZI_OPTS $|ZI_END_CENTRAL !ZIPINFOV$CODE$DATA $ADDRESS_DATAERRPRQPQ{RPPQQVݬ  DECC$DSPRINTFЬ RRPHPڧw3SSSSSSSSSp$P \\\lP#3#GGG{P))))))))))))))))))))))))))))m)))))))))))%))))))))))))))))5Q))))))))) `ww:1)B^ V1.00VMSV1.030-APR-2009 11:07DEC C V6.2-003' POpen callback. ID = %d, deq = %6d, mbc = %3d, mbf = %3d.  Pacc_cbP PApr 30 2009 P on  P (%s VAX) PVMS POpenVMS P %c%d.%d-%03d PDEC C PV6.0  Pversion Pscreenlinewrap PscreensizeP   PSYS$OUTPUT Pgetscreeninfo P P P Preturn_VMS P.; P.p Pcheck_f;or_newer` PSYS$DISK:[]T PSYS$DISK:[]( PCan not create destination directory: %s  PInvalid destination directory (includes file name): %s  PInvalid destination directory (parse error): %s  PSYS$DISK:[] PSYS$DISK:[] PSYS$DISK:[]PP  Pcheckdirt P creating: %s B Pwarning: skipped "../" path component(s) in %s @ P.< P..0 PSYS$DISK:[]( PmapnameP Padj_file_name_ods5 Padj_file_name_ods2 Padj_dir_na<me_ods5 Padj_dir_name_ods2 Pdest_struct_levelP PmapattrP   P[]*.ZIPP Pdo_wild P%s[ %s ]  P%s[ VMS status = %d ] x Pvms_msgh Pvms_msg_fetchX Pvms_msg_textP8 Pstamp_file: sys$dassgn failed.  P[ Modify file QIO failed. ]  P[ Access file QIO failed. ]  Pstamp_file: sys$assign failed.  Pstamp_file: sys$parse failed. P PP=P`PhPpPx PPPP Pstamp_file P%02d-%3s-%04d %02d:%02d:%02d.00x Puxtime2vmstimed Pdos_to_unix_timeX Pmkgmtime< P;Zx0Nm Pwarning: set-dir-attributes failed ($qiow mod) for %s. Pwarning: set-dir-attributes failed ($qiow acc) for %s. Pwarning: set-dir-attributes failed ($assign) for %s. \Pwarning: set-dir-attributes fail>ed ($parse) for %s. ZP]HPset_direc_attribs4Pdefer_dir_attribs,P.DIR;1P%.*s%c%.*s%sP.DIR;1P%.*s000000%c%.*s%sPvms_path_fixdownP[ Deaccess QIO failed ] P[ _close_qio: sys$synch found I/O failure ] P_close_qio{P[ _close_rms: sys$wait failed ] pP_close_rms`Pclose_outfile=P[ WriteRecord: sys$put failed ] P[ WriteRecord: sys$wait failed ] P  PWriteRecordP[ WriteBuffer: sys$write failed ] P[ WriteBuffe?r: sys$wait failed ] PWriteBufferP[ Warning: Record too long (%u) ] rP[ Warning: Record too long (%u) ] dP_flush_streamXPfind_eol(P[ Warning, incomplete record of length %u ] P[ Record too long (%u bytes) ] P_flush_varlenP_flush_qioP[ WriteQIO: sys$qio failed ] P[ WriteQIO: sys$synch found I/O failure ] PWriteQIOP_flush_blocksPflushxPfree_up;P[ Warning: CRC error, discarding PKWARE extra field ] P[ Warning: Unkno@wn block signature %s ]  PVMSVPVPROPVRDTPVDATPVFHCPVKEYPVALLPVFABPIMPfind_vms_attrsP `P%s exists: new [v]ersion, [o]verwrite, or [n]o extract? (Uppercase response [V,O,N] => Do same for all files): XPreplace@Preplace_rms_overwrite(Preplace_rms_newversionP[ Cannot create (QIO) output file %s ] Pcreate_qio_output: sys$assign failed. Pcreate_qio_output: sys$parse failed. xP[ File %s has illegal Arecord format to put to screen ] dPcreate_qio_outputXPPPHPH(8P <P9PCannot create ($connect) output file: %s P[ Cannot allocate space for %s ] P[ Cannot create ($create) output file %s ] P[ File %s has illegal record format to put to screen ] Pcreate_rms_outputmPCannot create ($connect) output file: %s @P[ Cannot create ($create) output file %s ] (Pcreate_default_outputP%02u-%3s-%04u %0B2u:%02u:%02u.00Pset_default_datetime_XABsPPPDECPNOVPOCTPSEPPAUGPJULPJUNPMAYPAPRPMARPFEBPJANPinit_buf_ringPopen_outfileP Error: zipfile is in variable-length record format. Please run "bilf l %s" to convert the zipfile to stream-LF record format. (BILF is available at various VMS archives.) P sys$oCpen() error: P error: cannot open zipfile [ %s ]. Pcheck_formatHP Default: deq = %6d, mbc = %3d, mbf = %3d. PGet RMS defaults. getjpi sts = %%x%08x.  Pget_rms_defaults PP      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@P0123456789ABCDEFpPP (EOF or read error, treating as "[N]o extract (all)" ...) Perror: invalid response [%.1s] P__iscntrlh P# OPENR_ID INVALIDRESPONSE ASSUMENO  HEX_DIGIT  CHAR_PROPRMS_EXT_ACTIVE RMS_MBC_ACTIVE RMS_MBF_ACTIVE JPI_ITM_LST COMPILEDWITHGDECC$GA___CTYPEDECC$GA_RMS_XABRDTDECC$GA_RMS_XABPRODECC$GA_RMS_XABKEYEDECC$GA_RMS_XABFHCDECC$GA_RMS_XABDATDECC$GA_RMS_XABALLDECC$GA_RMS_RABDECC$GA_RMS_FABDECC$GA_RMS_NAM DECC$GA_STDINDECC$GA_STDERR SYS$SETDFPROTLIB$SYS_GETMSG SYS$WRITESYS$WAIT SYS$SYNCH SYS$SEARCHSYS$QIOWSYS$QIOSYS$PUT SYS$PARSESYS$OPEN SYS$NUMTIM SYS$GETJPIW SYS$EXTEND SYS$DASSGN SYS$CREATE SYS$CONNECT SYS$CLOSE SYS$BINTIM SYS$ASSIGNCRC32CHECKDIRFNFILTEREXTRACTF_IZVMS_BLOCK ZSTRNICMPMAKEWORD DECC$MALLOC DECC$EXIT DECC$FREE DECC$STRLEN DECC$STRNCMP DECC$STRCMP= p=ףլRDECC$GA___CTYPEQˏP@aPˏPRRP ^R|~ |~ SYS$GETJPIWPSˏS\\  PT@  <\ \  \  GT3GSDECC$GA_STDERR\l DECC$DFPRINTF)~~<~DECC$GA_STDERR\l DECC$DFPKy1( UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 FGRINTFS\\PP|^\DECC$GA_RMS_FABR(PbG@3G@3 DECC$STRLENPܟSYS$OPENPUˏUR1<@~G@3RR~G@3FNFILTERPπG@3 DECC$DSPRINTFTdPG@3GGC3P`ρVUSSԭ|~߭߭LIB$SYS_GETMSGЭRBʏP-SVG@3dPG@3GGC3P`/VG@3dPG@3GGC3P`TnS SYS$CLOSESST<H@~G@3RR~G@3FNFILTERPG@3 DECC$DSPRINTFPG@3GGC3P`TTTPP^RC\G3\\PP Pv?PP\PKP\ Pk P\\P^\GA3RRZʏZZ RXʏXXR[ʏ[ RYʏYRWʏWxGA3VʏVDECC$GA_RMS_XABDATR(ˏR<>RRR>ˏR<>RRR><SʏSxRSR@p|~XH|~ ~ SYS$QIOWPUˏUR< UUh1}GA3PSʏPP PSWPZ?P ˏSR W1PW1P<<RȏRR<<<RȏRR<p?֟XH|~ ~ SYS$QIOWPUˏUR< U2RBGA3<<RʏRR<ˏUR1GA3ωW DECC$DSPRINTFScWVUTTԭ|~߭߭LIB$SYS_GETMSGЭRBʏP/TVϻG@3cPG@3GGC3P`1PVϠG@3cPG@3GGC3P` SYS$DASSGNWtPx|Txxx  ZWWPP<^\DECC$GA_RMS_NAMR(`bHR(_HRGA3,GA3 DECC$STRLENHRP4HRH SYS$CREATEPURBB_;GA3 DECC$STRRCHRPT;_ DECC$STRRCHRPSTSS~T~ DECC$STRCPYURRP^VWRppS1G43 pS1PG83 pS1G83 pS1US DECC$DSPRINTFT DECC$STRLENUP<@~G@3\\~GA3FNFILTERP]G@3d~PG@3GGC3P`DECC$GA_STDERR\l DECC$FFLUSH DECC$GA_STDIN\l  DECC$FGETSP7fG@3 DECC$DSPRINTFPG@3GGC3P`p<S1PeP@\\  eP@*G@3dPG@3GGC3P`\\Nz\PPN$P P?PPnGPn'%P+P?PpS@__ UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 rUVpS6PpS*PgG@3dPG@3GGC3P`S1YS\\PP^ZGA3ݮ ԮH|P|X|hծ n1P<G.A31EXTRACT_IZVMS_BLOCK DECC$DSPRINTFЮ [R~BpRbR~BrRfbR~BtRb<RRRWRXW1!R~BpRbR~BrRbR~BtRb<RRRR ծ1ѮhHR^Ԣ$PSHRТ$HRP$TSHRТ$HRT$h lSHRТ$HRh$ԮЮnЮP ^RT T DECC$FREE\ \ DECC$FREEX X DECC$FREEP P DECC$FREEhPh\ЬS\ DECC$FREEShH\bS\S \ DECYC$FREEP ^SݬݬG@3CRC32PG@3GD3RPݬݬP`PRRPP<^RUլ1PQѡAЬTáPTPPSTSSU~~ DECC$MEMCPYSTPSSUPѠ*ݠݠPQQSBPԠլ1kլ PՠݠݠϳPSPSSPP|^R 1 SYS$SYNCHPSʏP<SˏSP1USTTԭ|~߭߭LIB$SYS_GETMSGPQЭP@ʏQ3TUޟGZ@3 DECC$DSPRINTFPG@3GGC3P`5PU`ޟG@3 DECC$DSPRINTFPG@3GGC3P`2V1P |~ݬݬ|~0 SYS$QIOPSʏP1"USTTԭ|~߭߭R VMSx  __iscntrl, get_rms_defaults check_formatH open_outfileh set_default_datetime_XABstcreate_default_outputtcreate[_rms_output,create_qio_output"replace_rms_newversiond#replace&%find_vms_attrs8)free_up P*flushM* _flush_blocksx+WriteQIOLIB$SYS_GETMSGPQЭP@ʏQ3TUϗݟG@3 DECC$DSPRINTFPG@3GGC3P`5PUxݟG@3 DECC$DSPRINTFPG@3GGC3P`2V  PPVVPP|\^SUլ1PQѡAЬTáPTPPRTRRU~~ DECC$MEMCPYRTPRRUPѠ*ݠݠϊPQQVZPԠլ1kլ 6TФP)PUUUP@URݢ0PVPVVPPX^UЬVxS1|0, 1 SYS$SYNCHPSˏS\<SˏS\1QUSTTԭ|~߭߭LIB$SYS_GETMSGЭ\LʏP2TU͟G@3 DECC$DSPRINTFPG@3GGC3P`4U͟G@3 DECC$DSPRINTFPG@3GGfC3P` p|~H|~ 4 SYS$QIOWPS SYS$DASSGNˏS\< SˏS\1ςUSTTԭ|~߭߭LIB$SYS_GETMSGЭ\LʏP2TU̟G@3 DECC$DSPRINTFPG@3GGC3P`4U̟G@3 DECC$DSPRINTFPG@3GGC3P`2\\\PP^ЬSS DECC$STRLENPUW1URBcVVPP][SPP>b1!i < RȏRRR~BpRbR~BrRbR~BtR>bG31ШGA3zR~BpRbR~BrRbR~BtRdbR~BpRbR~BrRbR~BtRƘbR~BpRbR~BrRbR~BtRbDECC$GA_RMS_NAMR(`bHR(HR, DECC$STRLENHRP4`_H SYS$PARSEPSˏSR1ğW DECC$DSPRINTFTdWWSUU|~jLIB$SYS_GETMSGRBʏP/UWƟG@3dPG@3GGC3P`1PWϴƟG@3dPG@3GGC3P`Y1PP|~P SYS$ASSIGNPSˏSR1LğW DECC$DSPRINTFTdWWSUU|~LIB$SYS_GETMSGRBʏP/UWşG@3dPG@3GGC3P`1PWşG@3dPG@3GGC3P`Y1PRPBkB2B,RR4\#S$RRS%RRSSXT~DrR R.BSTRSRR R     R RR X1}Y1GA3 DECC$STRLEN P PP<X1 '  |  R RR  R. X1UY1ݬ DECC$STRLENPT + R [bT R .b T RR.1T:ЬScRR..RR.% R -b R .bGP RTRR<X1ݬ  DECC$STRCPYT .   RRbX1_PY1ˏR1DECC$GA_RMS_FABR(Pb~DECC$GA_RMS_NAMR(`bHH RRݞGA3ԟGA3 DECC$STRLENPЬTR SYS$PARSEPSˏSRJSJARRTdUd~ݭ DECC$MKDIRPRCMA$TIS_ERRNO_GET_ADDR`RUdRX1SR޼SBcX1u SyR]Cݏ ZSTRNICMPP1 ~ DECC$MKDIRPCMA$TIS_ERRNO_GET_ADDR`  P DECC$STRCPYRό DECC$STRCMPP=σ DECC$STRCPY ~ DECC$MKDIRPCMA$TIS_ERRNO_GET_ADDR` ЬSS DECC$STRLENўRR RRPP <XlPS  DECC$STRCPYS DECC$STRLENP XFY+ <X1 ݬ DECC$STRCPYXPY X<cXXPPH^ϽЬVV DECC$STRCMPPϪSVSGxA3S DECC$STATPW1DECC$GA_RMS_FABR(PbDECC$GA_RMS_XABDATR(  < +lD - :lD AlE+  l_F nlF!8  lGz %  mJ m{K mK  mLw Em?M mxM { mkNt m;OBT3 ' \ngPZ' \nPrm   LoS_  F  pTM  _pV[  pW1%   oUXB+K puYB 2qY%   q]-  o^9 ؗ% tf7/ HO VMS_MSG_TEXT \O|DO_WILD QMAPATTR ,TDEST_STRUCT_LEVEL WMAPNAME ,[CHECKDIR bCHECK_FOR_NEWER d RETURN_VMS e SCREENSIZE \fSCREENLINEWRAP fVERSION |g ACC_CBh$CODE$ $DATA $ADDRESS_DATAOPENR_ID!INVALIDRESPONSE<ASSUMENO HEX_DIGIT CHAR_PROP RMS_EXT_ACTIVE RMS_MBC_ACTIVE RMS_MBF_ACTIVE( JPI_ITM_LST DECC$DFPRINTFPSRPI}0(PDP||||||||p|||pppp\|||||||||\%P#,??????8$POWooooooc P2J5P7###P7###sP1=$P0<yP+x ww1L V1.02UNZIPV1.030-APR-2009 11:04DEC C V6.2-0039P%d 9Pshow_version_info9P%s P*0HLxyzXab"$^`:<2mn&D<`@`:SxyV FTf@Z)p,f 8 V   ,!x!!!@"["""<#V###$L$$$%Z%%%)&b&&&L'M'N'Y'''(`(((((.)l)))(*0*x**+H+I+h+++++ ,8,,,,,,0-y-- ....X...>///0X000,1z11 2U222 333(3p33334)4*4+4D4445]5555666M6z6666 7A7`777778(8R8s8t888$9N9O9~9O9PSee unzipsfx manual page for more information.$9Pforces extraction to specified directory.8PBy default, all files extracted to current directory. This option8P -d exd - Extract to directory exd.t8PIf unzipsfx t UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 compiled with SFX_EXDIR defined, -d option also available:R8P -$ - Restore volume label.(8P -s - Convert spaces to underscores.8P -V - Keep version numbers.7P -j - Junk paths.7P -C - Match names case-insensitively.7P -q - Quiet operation.7P -o - Overwrite without prompting.`7P -n - Never overwrite.A7P -a - Convert text files. 7P Most unzip modifiers are supported. These include6Punzipsfx modifiers:6P -z - Print archive comment. (See unzip above.)z6P -t - Test embedded archive. (Can be used to list contents.)M6P -f, -u - Freshen and Update, as for unzip.6P -c, -p - Output to pipe. (See above for unzip.)6Punzipsfx options:5P [-options] [file(s) ... [-x xfile(s) ...]]5Punzipsfx command line:]5P Regular unzip may still be used to extract embedded archive however.5P for example, will only self-extract under the same flavor of Unix.4P In general, a self-extracting archive made on a particular Unix system,4P portable across different operating systems than unzip executables.D4P Self-extracting archives made with unzipsfx are no more (or less)+4Punzipsfx self extractor:4P funzip [-password] [input[.zip|.gz]]3Pfunzip command line:3P is given, read from that file instead of stdin.p3P used to unzip the first member of a stream or pipe. If a file argument(3P funzip extracts the first member in an archive to stdout. Typically3Pfunzip stream extractor:2P -z Include archive comment if any in listing.2P -UU [UNICODE] Disable use of any UTF-8 path information.U2P representing the Unicode character number of the character in hex. 2P not in current character set as text #Uxxxx and #Lxxxxxx escapes1P -U [UNICODE] If entry has a UTF-8 Unicode path, display any charactersz1P Default date and time format is a more human-readable version.,1P -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)0P and compressed sizes, and compression factors.0P -t List totals for files listed or for all files. Includes uncompressedX0P -M Pipe all output through internal pager similar to Unix more(1) command.0P -h List header line. Includes archive name, actual size, total files./P -v List zipfile information in verbose, multi-page format./P -l  List in long Unix ls -l format. As -m, but compression in bytes.>/P -m List in long Unix ls -l format. As -s, but includes compression %..P -s List archive entries in short Unix ls -l format. Default list format..P -2 List names only as -1, but include headers, trailers, and comments.X.P -1 List names only, one per line. No headers/trailers. Good for scripts..Pzipinfo options (these are used in zipinfo mode (unzip -Z ...)): .P digit.-P or #Lxxxxxx where it doesn't, where x is the ASCII character for a hexy-P in the form #Uxxxx where the Unicode character number fits in 16 bits,0-P Characters not in the current character set are shown as ASCII escapes,P with Unicode entries. Currently Unicode on Win32 systems is limited.,P If compiled with Unicode support, unzip automatically handles archives,PUnicode:,P quieter operation.8,P This can be modified using -q for quieter operation, and -qq for even ,P -t test contents of archive+PTesting archives:+P cat archive | funzip+P used to process the first entry in a stream.h+P Currently unzip does not support streaming. The funzip utility can beI+PStreaming (piping into unzip):+P use unzip on that. See the manual page for Zip 3.0 or later.*P to use zip to convert the split archive to a single-file archive andx*P Currently split archives are not readable by unzip. A workaround is0*PMulti-part (split) archives (archives created as a set of split files):)P unzip archive -x pattern pattern ...)P archive. Exclude and include lists end at next option or end of line.l)P Patterns are paths with optional wildcards and match paths as stored in.)P -x pattern pattern ... exclude files that match a pattern(P -i pattern pattern ... include files that match a pattern(PInclude and Exclude:(P For shells that expand wildcards, escape (\* or "*") so unzip can recurse.`(P If port supports [], must escape [ as [[](P [list] matches char in list (regex), can do range [ac-f], all but [!bf]'P * matches any number of characters, including zero'P ? (or %% or #, depending on OS) matches any single characterY'P Internally unzip supports the following wildcards:N'PWildcards:&P extended name characters on ODS5 and applying ODS2 filtering on ODS2.&P Default is to exploit destination file system, preserving cases andb&P -2 [VMS] Force unconditional conversion of names to ODS-compatible names.)&P this is not a good thing and should be avoided.%P -^ [Unix] Allow control characters in names of extracted entries. Usually%P directory, which can be a security problem.Z%P paths such as ../foo to be extracted above the current extraction%P locations outside of current extraction root folder. This allows$P -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members into$P -/ e [Acorn] Use e as extension list.L$P removable. -$$ allows fixed media (hard drives) to be labeled.$P -$ [MS-DOS, OS/2, NT] Restore volume label if extraction medium is#P -Y [VMS] Treat archived name endings of .nnn as VMS version numbers.#P system privileges.V#P -XX [NT] Extract NT security ACLs after trying to enable additional<#P user privileges."P versions of OS/2, or security ACLs under Windows NT. Can require"P or UIDs/GIDs under Unix, or ACLs under certain network-enabled["P -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACL entries under VMS,@"P directory levels.!P match directory separator /, but ** does. Allows matching at specific!P -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do notx!P -V Retain VMS file version numbers.,!P paths stored as native local paths are still processed as Unicode. P -UU [UNICODE enabled] Disable use of stored UTF-8 paths. Note that UTF-8 P uppercase if created on MS-DOS, VMS, etc. See -L.V P text escapes where x is hex digit. [Old] -U used to leave names P -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCIIP -S [VMS] Convert text files (-a, -aa) into Stream_LF format.P -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores.8P -q Perform operations quietly. The more q (as in -qq) the quieter. P command line to other users.P -P p Use password p to decrypt files. THIS IS INSECURE! Some OS showP care.fP -o Overwrite existing files without prompting. Useful with -f. Use with,P -N [Amiga] Extract file comments as Amiga filenotes.P -n Never overwrite existing files. Skip extracting that file, no prompt.P -M Pipe all output through i   UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 fnternal pager similar to Unix more(1).pP -LL Convert all files to lowercase.)P -L Convert to lowercase any names from uppercase only file system.P -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.P -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info.ZP -j Junk paths and deposit all files in extraction directory.@P standard header.P -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name inP ACORN_FTYPE_NFS] Translate filetype and append to name.fP -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn ifTP restore.P -E [MacOS (not Unix Apple)] Display contents of MacOS extra field duringP -DD Skip restoration of timestamps for all entries.P is on by default and -D essentially becames -DD.FP -D Skip restoration of timestamps for extracted directories. On VMS this P -C Use case-insensitive matching.P overwritten file in foo~ or foo~99999 format.P -B [UNIXBACKUP compile option enabled] Save a backup copy of eachVP [VMS] Autoconvert binary files. -bb forces convert of all files.P -b Treat all files as binary.  [Tandem] Force filecode 180 ('C').P marker, and from or to EBCDIC character set as needed.P -a Convert text files to local OS format. Convert line ends, EOFyPunzip modifiers:SP -z Display only archive comment.:P verbose output.P information. Also can be added to other list commands for moreP -v Use verbose list format. If given alone as unzip -v show version`P -u Update existing older files on disk as -f and extract new files.@P zip -o but faster.P -T Set timestamp on archive(s) to that of newest file. Similar toP -t Test archive files.P files extracted in binary mode (as stored).`P -p Extract files to pipe (stdout). Only file data is output and all<P -l List files using short form.P -f Freshen by extracting only if older file on disk.P -a allowed and EBCDIC conversions done if needed.P -c Extract files to stdout/screen. As -p but include names. Also,DP -A [OS/2, Unix DLL] Print extended help for DLL.&P -hh Display extended help.P -Z Switch to zipinfo mode. Must be first option.Punzip options:Pport and is referred to as Unix Apple.nPBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix based2P unzip -Z options archive[.zip] [file ...] [-x xfile ...]P zipinfo options archive[.zip] [file ...] [-x xfile ...]PBasic zipinfo command line:Poptions.Pis provided. The -Z option sets zipinfo mode and changes the available<PIf unzip is run in zipinfo mode, a more detailed list of archive contentsP unzip -a foo - unzip foo and convert text files to local OSP unzip foo - unzip the contents of foo in current dir`P unzip -Z foo - list files using more detailed zipinfo format$P unzip -t foo - test the files in archive fooP unzip -l foo.zip - list files in short format in archive foo.zipPSome examples:P unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir]bPBasic unzip command line:XPinstead.Pneeded. With appropriate options, UnZip lists the contents of archivesPextract zipfile entries to the current directory, creating directories aszPUnZip lists and extracts files in zip archives. The default action is toLPSee the UnZip Manual for more detailed help0PExtended Help for UnZipPhelp_extendedP[-Z] P You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT. P"P"PusagePuz_optsP-xP-dP-ZPiiPunzipPmainPSee "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer  Pmodifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %s P -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir e P=> define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe : P-Z => ZipInfo mode ("unzip -Z" for usage).| PUsage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s  PLatest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ; see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites. T PUnZip %d.%d%d%s of %s, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details.  PUnZip %d.%d%d%s of %s, by Info-ZIP. For more details see: unzip -v. H P05 Jan 2007 P [decryption, version %d.%d%s of %s] PUSE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)PUSE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)PTIMESTAMPPSET_DIR_ATTRIBWPCOPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)PP[none]@P%16s: %.1024s P UnZip and ZipInfo environment options: P %s PUnZip special compilation options: P -M page output through built-in "more" Pmiscellaneous options: -h print header line -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive %s -x exclude filenames that follow from listing P main listing-format options: -s short Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format PZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing %s. usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] P* or % (e.g., "*font-%.zip")P -Y treat ".nnn" as ";nnn" version -2 force ODS2 names --D restore dir (-D: no) timestamps -M pipe through "more" pager (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.) P -X restore owner/ACL protection infoP -T timestamp archive to latest!vM UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 TP unzip "-V" foo "Bar" (Quote names to preserve case, unless SET PROC/PARS=EXT) NPvms.cPcaution: both -n and -o specified; ignoring -o Perror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid Perror: -Z must be first option for ZipInfo mode (check UNZIP variable?) PPerror: must give decryption password with -P option Perror: -d option used more than once (only one exdir allowed) Perror: must specify directory to which to extract with -d option Pcaution: not extracting; -d ignored `Perror: command line parameter #%d exceeds internal size limit 6Penvargs: cannot get memory for arguments+PZIPINFOOPTPZIPINFO_OPTSPUNZIPOPT PUNZIP_OPTS PCompiled with %s%s for %s%s%s%s.  Pzipinfo P (please check that you have transferred or created the zipfile in the appropriate BINARY mode  MASK_BITS  VERSIONDATE  CENTSIGMSG  ENDSIGMSG SEEKMSG FILENAMENOTMATCHED EXCLFILENAMENOTMATCHED REPORTMSG ZIPNFO COMPILEDWITH UNZIPUSAGELINE1FNAMESG DECC$EXITVERSIONENVARGS RETURN_VMS ZSTRNICMPHANDLERZI_OPTSPROCESS_ZIPFILESUSAGEUZ_OPTSUNZIP GLOBALSCTOR DECC$GETENV DECC$SIGNAL DECC$STRLEN DECC$STRNCMP--this includes ftp, Kermit, AND unzip'd zipfiles)  Pcaution: excluded filename not matched: %s Pcaution: filename not matched: %s Perror [%s]: attempt to seek before beginning of zipfile %sPerror: expected central file header signature not found (file #%lu). P note: didn't find end-of-central-dir signature at end of central dir. P20 April 2009P??P__iscntrl9P ^DECC$MAIN_ARGSS ^SR GLOBALSCTORݬݬUNZIPP RETURN_VMSS R DECC$EXITRP|^HANDLERSS DECC$SIGNALRbSbSbS bSbS bRѬRRG3ݼ DECC$STRLENPRRbPP]RRR R ZSTRNICMPP1!R ZSTRNICMPPѬH ЬRݢ DECC$STRNCMPP0G3xşg߬߬ENVARGSPS:i DECC$PERROR-PG33ş$߬߬ENVARGSPS : DECC$PERRORS1RY޼PB` DECC$STRLENP`?9R/şG@3 DECC$DSPRINTF<~PG@3GGC3P` V1^PRRG3߬߬ZI_OPTSPSP߬߬UZ_OPTSPSլSSV1ЬRbG@3ЬG3G3լ1SURG3ЬG3Rb1PG1ϣb DECC$STRNCMPP1PRPPTbGSbG3RPPG3SUbG3RPPG3GP`PFRb bG6PNğG@3 DECC$DSPRINTF<~PG@3GGC3P` V1T1բ RG3ìG3PPPG31G3FNAMESG3G31qPUkϫb DECC$STRCMPPWURG3FNAMESG3G3SbG3RPPG3SRG3ìG3PPPG3SRb1G3G6G3.ßG@3 DECC$DSPRINTF<~PG@3GGC3P`PROCESS_ZIPFILESPVVRRPP^[YSXмVUV1eR1bRR-1 DECC$DSPRINTFZeRW1[WPP-M>P1P>?PS1PS SG 3P PG 3G 3S1tG 31jPS SG3P PG3G3S1DG 3G3G 31,S G3S1G31PS G3S1G31PS4NG@3 DECC$DSPRINTF<~PG@3GGC3P` T1G4\G@3 DECC$DSPRINTF<~PG@3GGC3P` T1RGRP`P1VQVUeGeP`PP-nϰG@3 DECC$DSPRINTF<~PG@3GGC3P` T1'P6PvG@3 DECC$DSPRINTF<~PG@3GGC3P` T1bP1RbP1PRbP1PS SG3P PG3G3S1G31P1SGL3G 3S1zPGL3G 31fPX1\bPPh X1JPX1APS G(3S10G(31%PS SGT3P PGT3GT3S1GT31PS SG03P PG03G03S1G031PS Gt3S1Gt31PS G43S1G431PS SG83P PG83G83S1hG831^PS,G3G<3P PG<3 PG<3S1,G3G<31PS4G@3 DECC$DSPRINTF<~PG@3GGC3P` T1G31RG3RP`P1VRVUeG3eP`PP-oϋG@3 DECC$DSPRINTF<~PG@3GGC3P` T1xP6PϺPG@3 DECC$DSPRINTF<~PG@3GGC3P` T1=bP1+RbP1!PRbP1PS SG<3P PG<3G<3S1G<31PS G@3S1G@31PS GD3S1GD31PS GH3S1GH31PS GL3S1GL31uPS G03S1cG031ZPS SGT3P PGT3GT3S14GT3 GT31"PGT31PS GX3S1GX31P1S SG`3P PG`3G`3S1G`31PS Gd3S1Gd31PS SGh3P PGh3Gh3S1Gh3{ϚG@3j<~PG@3GGC3P`YLS Gl3S=PGl32PS SGp3P PGp3Gp3S PGp3YW1UVeR bPP-1X^XERPBkG@3 DECC$DSPRINTFPG@3GGC3P`RRT1PUSAGEPT1G3GD3(GL3 GD3GL3G 39G431ϰG@3 DECC$DSPRINTF<~PG@3GGC3P`YG 3G 3G3G3G 3G@3G83<G434ώG@3 DECC$DSPRINTF<~PG@3GGC3P`G83Gt3 DECC$ISATTYPGt3VRVRYEVUGT3V ώTcPG3YYYUSAGEPTDPG3 GD3GT3Gh3GH3G3G3VUTTPP ^լSSG31-ȟ'ȟ-|~9G@3 DECC$DSPRINTFR bSPG@3GGC3P`ϯG@3bSPG@3GGC3P`ϴϰG@3bSPG@3GGC3P`ϕǟG@3bSPG@3GGC3P`10Pϳ|~ G@3 DECC$DSPRINTFRbSPG@3GGC3P`ϠŸxǟG@3bSPG@3GGC3P`լ'ϗŸG@3bSPG@3GGC3P`ϱϽŸG@3 DECC$DSPRINTFRbSPG@3GGC3P`ȹϝßG@3bSPG@3GGC3P`\şG@3bSPG@3GGC3P`լ PPP^G<32OG@3 DECC$DSPRINTFPG@3GGC3P`>PEEEEEEEEEEEEEEEEEEE9EEEEEEEUEE5EEe5EUEEEEEEUEE E%E5EEER UNZIP 9mainG 9unzip=uz_opts tGusageIshow_version_info 79<P H8Z:: t8f;d! 8c=:/   9@     :DC    {9cE y9kE {;EԹNTM[% DECC$STRCMP DECC$ISATTY DECC$DSPRINTF DECC$PERROR 9 __MAIN 9 MAIN 9|UNZIP =UZ_OPTS tG USAGEDECC$MAIN_ARGSM$CODEt$DATA $ADDRESS_DATAD MASK_BITS VERSIONDATEG CENTSIGMSGI ENDSIGMSG<SEEKMSG$FILENAMENOTMATCHED-EXCLFILENAMENOTMATCHED REPORTMSGZIPNFO# COMPILEDWITHGUNZIPUSAGELINE1 QE9ww1I V1.02UNZIPV1.030-APR-2009 11:04DEC C V6.2-0039P%d 9Pshow_version_info9P%s P*0HLxyzXab"$^`:<2mn&D<`@`:SxyV FTf@Z)p,f 8 V   ,!x!!!@"["""<#V###$L$$$%Z%%%)&b&&&L'M'N'Y'''(`(((((.)l)))(*0*x**+H+I+h+++++ ,8,,,,,,0-y-- ....X...>///0X000,1z11 2U222 333(3p33334)4*4+4D4445]5555666M6z6666 7A7`777778(8R8s8t888$9N9O9~9O9PSee unzipsfx manual page for more information.$9Pforces extraction to specified directory.8PBy default, all files extracted to current directory. This option8P -d exd - Extract to directory exd.t8PIf unzipsfx compiled with SFX_EXDIR defined, -d option also available:R8P -$ - Restore volume label.(8P -s - Convert spaces to underscores.8P -V - Keep version numbers.7P -j - Junk paths.7P -C - Match names case-insensitively.7P -q - Quiet operation.7P -o - Overwrite without prompting.`7P -n - Never overwrite.A7P -a - Convert text files. 7P Most unzip modifiers are supported. These include6Punzipsfx modifiers:6P -z - Print archive comment. (See unzip above.)z6P -t - Test embedded archive. (Can be used to list contents.)M6P -f, -u - Freshen and Update, as for unzip.6P -c, -p - Output to pipe. (See above for unzip.)6Punzipsfx options:5P [-options] [file(s) ... [-x xfile(s) ...]]5Punzipsfx command line:]5P Regular unzip may still be used to extract embedded archive however.5P for example, will only self-extract under the same flavor of Unix.4P In general, a self-extracting archive made on a particular Unix system,4P portable across different operating systems than unzip executables.D4P Self-extracting archives made with unzipsfx are no more (or less)+4Punzipsfx self extractor:4P funzip [-password] [input[.zip|.gz]]3Pfunzip command line:3P is given, read from that file instead of stdin.p3P used to unzip the first member of a stream or pipe. If a file argument(3P funzip extracts the first member in an archive to stdout. Typically3Pfunzip stream extractor:2P -z Include archive comment if any in listing.2P -UU [UNICODE] Disable use of any UTF-8 path information.U2P representing the Unicode character number of the character in hex. 2P not in current character set as text #Uxxxx and #Lxxxxxx escapes1P -U [UNICODE] If entry has a UTF-8 Unicode path, display any charactersz1P Default date and time format is a more human-readable version.,1P -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)0P and compressed sizes, and compression factors.0P -t List totals for files listed or for all files. Includes uncompressedX0P -M Pipe all output through internal pager similar to Unix more(1) command.0P -h List header line. Includes archive name, actual size, total files./P -v List zipfile information in verbose, multi-page format./P -l  List in long Unix ls -l format. As -m, but compression in bytes.>/P -m List in long Unix ls -l format. As -s, but includes compression %..P -s List archive entries in short Unix ls -l format. Default list format..P -2 List names only as -1, but include headers, trailers, and comments.X.P -1 List names only, one per line. No headers/trailers. Good for scripts..Pzipinfo options (these are used in zipinfo mode (unzip -Z ...)): .P digit.-P or #Lxxxxxx wh#i =߼h[*uԴ6>\Ah%W؝Fǝt&ӝbz]RZYG3?n悛)4򶉎,@d7^zOZDToSF: _X@^A2Bn-ȝW3QI9uRśd*]i$ ú]2 u<|w1hsZbd݉EOŨ5v-I|,Re.PI#v=5W$]T*^䇁Fpit hE݅ljn^o\* $xDq= ѐn?$XB>˭ O{`tSsôDp+ZWҎC~z"M^O[yҮڢQ0-p+?)˴2sog0] )EZӏ•QTL]7CL!;H؃-f"ھVֱ>+= ,2 V>5ւwϜ|,A``w5AAj*~X4\[U[)WCX  4\R5bv%E̸O 8О쀔|~kM^htn By0\9up4}" T(<*{<3Hrɱ_*9`ꠑl%RһfTj<5Yxӂ$K6\Ve:ϸ _i8nkfj?2PFeS4giY8$~k,Db?"hmHLb6+N:.hW̧U'MIlO/1=j)I[޿ ׽1 |cs'1`TPh'R:;\F@0 *aō#H/*^6.HS +׺{yS@ͪ$:H8#vt#6[aXCսgh2~oyYB6p:SˡEyNs f0RkW *!]փfqfsxyB/2%/}XH vw-筨\wa/z{(bjѧK .Db)Gö۲$^n|)'#92,1IS( KNMOgD5̺\둷 ely}|W#.āE )j:ԍV@:lG}#Q˃%4Qm7K]s!_EEfRa!CաocqKhBB Te'D^@Ą`oJr>5fRȦg9s2 >DSPlwI^&ʼn'LY4 /u:< w%,4o`8*rG,&+]/OF3VU>lBI(3ٜ|걵c3.g0#у޼` NB#6at'$8Nysa.#z9iڮ46=ƱEW)&2K/@>e`C~zd 0.}m(E0mgf<|` e%y)"C,¹Q+6uit/ _xZPsL4():`ekm ig.jVJIk3~c.~=b@qb6ne-<$;q uŃZ[aN酺r{]Ok+WqPtI?2r1L?e^o˛C|& C[צcl̲~x#zS[xY6!J^6ȣPGThJ u)V}>!SW]3?hA4疩+Q0csb`x,L'$JGׅaZMrWk*963}e,똽 mI^֗8kv)rX/}pbwǦ6~ƒL|振IFjQe?<NVV`Qm0hDWCj{JI]ۗ,ND?$Z^*Г\|ICH syXVs۾wddm>I 70 Q`Bp'yUw\S(ȍ\0K/V8Z"#_/L tXC/I#KBrڐQXd"fUJjT8d_y͉ p)_ɛH8͵gFuҹ$/ƉBQe5{* v;| F8n~莠moǽW܋WTgG{ra.sjFpm>wlgы͞Vl)LX5#o] c7?Jߴn沍s}D/x\;f* Ḛៃtk~qr zs7&B}b?abCҾs y`<-]9u}a:j /+('%j{Nr E"Gcq} jȅ ֌bk\?>8 ڌVq]R<)eNj0QHca'CNGwRX{n\ }B|A(m'm},ꇬf,xŰO(pXsRvW(#ܠ:KTGVס ˔ѽ|>T<~##chvM 1 VEvME"{_LiNts~)կ})Xб#jȻT0 #Tн25jw@'i. ӓ[f[p꼔 K:A[?~s) < 9WOY saS<,L yW07Q@𜫌iɒkX'^僳}G cCe]v <.젔?MgLZw<OZ(~=tj%ZLY5$ ۖu%{^RWG ;؅1^׮ju3/|QrΆw% gU'S^=@|E"]Z3s+E:7J[Pct{ *3Kx|x匰^w g1RU. <&=Q,>7B^8k{a_Kᤔ柈&9|R$nU&"n3)Ӳ'| P[G4$3"'P~1M7 iPRi hmx 0c,Xq'OYzT . 4}_ ;W 2wT^sU`Nߨ_E-2  F&2={vwRZJg~EwnצּY>i>4gVZIh(z6r1l 7 ~5-D$3*2O2N;$b$@ y_pE:I8L >/J.C.RO<Ά_$rEױxWqC14@}VX_K\3Ý!!|ψF ;0Q['B jA, Q3Цj݆l4 hU=9J*#^MڅvtS{Ufǚw{$/]"+>?푵S6gSMdqnaZ>%T8?9Pz`]$( + +&XFChB8<^ I1 Yx! y`e)zXC'6HKhJl&>~ڼX{fJȠKuK0HMIB$,#zk_O.:԰.pē#i!4GQ-gn::Ksr(U+׏& d$fVMF md%*{(q  c' Jv=}Joi/J`YlΦh}4GpvsΐK>wH%^:IAn|7_zux]4{$oyj@+#҇<' 1_/+~KeuHRʎYۧǐ' f8`U.Dnx ԘQ *wtR6O_w6 lkc_>4"EBt5 U_szS,Vrc]*; ^hѲ?XDQqPd%.'VqHQA ~$61}{Qpccc^fcYe@ %3h;D/#liB ;ΚMj/lل$S{ٴf!Q[{ݫMN]#UNf,x#&tUU' -/k=YJ[]G:63M`p0zEz#Z%J!Zbjgz]g "*#T1r !xKϯXBVO 'X wD3M:^zP ǰ9MRm(t@`)wsh )at*\?BO?2K{:ra?]=2RY%D%=֫AV^nMLH=JIEJRtpEΒv{LG y`ԋ=~l~CCmRŵovyD%V? 8ROS5O%vݒ/Ls0ۻ;PW;Y,5*RtU90!dYaCpwylq[z*.g9 h&L5p3:N$M;QXXdh[]? Ⱥp L݅;Ey~l1zPи2 }cVd ^krZ6'|`fS1Z#F ˦FN9YZYbe}UN ^cTzqB 4b:` ]WoD K( A9C 'R`K(sX昿4ztluaXXH%bC_7 1`'݊~= "/8 ':o'>䗳8b!ekE/MY*Ș;c~ˆ.H/N/ 'wuH>teTKCrE,#q$gdĐiX^R ߑp,Y\F5=xeЋ=WphEbGlSX@bm1 extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer  Pmodifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %s P -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir e P=> define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe : P-Z => ZipInfo mode ("unzip -Z" for usage).| PUsage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s  PLatest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ; see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites. T PUnZip %d.%d%d%s of %s, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details.  PUnZip %d.%d%d%s of %s, by Info-ZIP. For more details see: unzip -v. H P05 Jan 2007 P [decryption, version %d.%d%s of %s] PUSE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)PUSE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)PTIMESTAMPPSET_DIR_ATTRIBWPCOPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)PP[none]@P%16s: %.1024s P UnZip and ZipInfo environment options: P %s PUnZip special compilation options: P -M page output through built-in "more" Pmiscellaneous options: -h print header line -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive %s -x exclude filenames that follow from listing P main listing-format options: -s short Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format PZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing %s. usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] P* or % (e.g., "*font-%.zip")P -Y treat ".nnn" as ";nnn" version -2 force ODS2 names --D restore dir (-D: no) timestamps -M pipe through "more" pager (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.) P -X restore owner/ACL protection infoP -T timestamp archive to latestTP unzip "-V" foo "Bar" (Quote names to preserve case, unless SET PROC/PARS=EXT) NPvms.cPcaution: both -n and -o specified; ignoring -o Perror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid Perror: -Z must be first option for ZipInfo mode (check UNZIP variable?) PPerror: must give decryption password with -P option Perror: -d option used more than once (only one exdir allowed) Perror: must specify directory to which to extract with -d option Pcaution: not extracting; -d ignored `Perror: command line parameter #%d exceeds internal size limit 6Penvargs: cannot get memory for arguments+PZIPINFOOPTPZIPINFO_OPTSPUNZIPOPT PUNZIP_OPTS PCompiled with %s%s for %s%s%s%s.  Pzipinfo P (please check that you have transferred or created the zipfile in the appropriate BINARY mode  MASK_BITS  VERSIONDATE  CENTSIGMSG  ENDSIGMSG SEEKMSG FILENAMENOTMATCHED EXCLFILENAMENOTMATCHED REPORTMSG ZIPNFO COMPILEDWITH UNZIPUSAGELINE1FNAMESG DECC$EXITVERSIONENVARGS RETURN_VMS ZSTRNICMPHANDLERZI_OPTSPROCESS_ZIPFILESUSAGEUZ_OPTSUNZIP GLOBALSCTOR DECC$GETENV DECC$SIGNAL DECC$STRLEN DECC$STRNCMP--this includes ftp, Kermit, AND unzip'd zipfiles)  Pcaution: excluded filename not matched: %s Pcaution: filename not matched: %s Perror [%s]: attempt to seek before beginning of zipfile %sPerror: expected central file header signature not found (file #%lu). P note: didn't find end-of-central-dir signature at end of central dir. P20 April 2009P??P__iscntrl9P ^DECC$MAIN_ARGSS ^SR GLOBALSCTORݬݬUNZIPP RETURN_VMSS R DECC$EXITRP|^HANDLERSS DECC$SIGNALRbSbSbS bSbS bRѬRRG3ݼ DECC$STRLENPRRbPP]RRR R ZSTRNICMPP1!R ZSTRNICMPPѬH ЬRݢ DECC$STRNCMPP0G3xşg߬߬ENVARGSPS:i DECC$PERROR-PG33ş$߬߬ENVARGSPS : DECC$PERRORS1RY޼PB` DECC$STRLENP`?9R/şG@3 DECC$DSPRINTF<~PG@3GGC3P` V1^PRRG3߬߬ZI_OPTSPSP߬߬UZ_OPTSPSլSSV1ЬRbG@3ЬG3G3լ1SURG3ЬG3Rb1PG1ϣb DECC$STRNCMPP1PRPPTbGSbG3RPPG3SUbG3RPPG3GP`PFRb bG6PNğG@3 DECC$DSPRINTF<~PG@3GGC3P` V1T1բ RG3ìG3PPPG31G3FNAMESG3G3&< UNZIP.BCK`s*[UNZIP60.VMS-BINARIES]UNZIP.VAX_DECC_OLB;1 -1qPUkϫb DECC$STRCMPPWURG3FNAMESG3G3SbG3RPPG3SRG3ìG3PPPG3SRb1G3G6G3.ßG@3 DECC$DSPRINTF<~PG@3GGC3P`PROCESS_ZIPFILESPVVRRPP^[YSXмVUV1eR1bRR-1 DECC$DSPRINTFZeRW1[WPP-M>P1P>?PS1PS SG 3P PG 3G 3S1tG 31jPS SG3P PG3G3S1DG 3G3G 31,S G3S1G31PS G3S1G31PS4NG@3 DECC$DSPRINTF<~PG@3GGC3P` T1G4\G@3 DECC$DSPRINTF<~PG@3GGC3P` T1RGRP`P1VQVUeGeP`PP-nϰG@3 DECC$DSPRINTF<~PG@3GGC3P` T1'P6PvG@3 DECC$DSPRINTF<~PG@3GGC3P` T1bP1RbP1PRbP1PS SG3P PG3G3S1G31P1SGL3G 3S1zPGL3G 31fPX1\bPPh X1JPX1APS G(3S10G(31%PS SGT3P PGT3GT3S1GT31PS SG03P PG03G03S1G031PS Gt3S1Gt31PS G43S1G431PS SG83P PG83G83S1hG831^PS,G3G<3P PG<3 PG<3S1,G3G<31PS4G@3 DECC$DSPRINTF<~PG@3GGC3P` T1G31RG3RP`P1VRVUeG3eP`PP-oϋG@3 DECC$DSPRINTF<~PG@3GGC3P` T1xP6PPG@3 DECC$DSPRINTF<~PG@3GGC3P` T1=bP1+RbP1!PRbP1PS SG<3P PG<3G<3S1G<31PS G@3S1G@31PS GD3S1GD31PS GH3S1GH31PS GL3S1GL31uPS G03S1cG031ZPS SGT3P PGT3GT3S14GT3 GT31"PGT31PS GX3S1GX31P1S SG`3P PG`3G`3S1G`31PS Gd3S1Gd31PS SGh3P PGh3Gh3S1Gh3{ϚG@3j<~PG@3GGC3P`YLS Gl3S=PGl32PS SGp3P PGp3Gp3S PGp3YW1UVeR bPP-1X^XERPBkG@3 DECC$DSPRINTFPG@3GGC3P`RRT1PUSAGEPT1G3GD3(GL3 GD3GL3G 39G431ϰG@3 DECC$DSPRINTF<~PG@3GGC3P`YG 3G 3G3G3G 3G@3G83<G434ώG@3 DECC$DSPRINTF<~PG@3GGC3P`G83Gt3 DECC$ISATTYPGt3VRVRYEVUGT3V ώTcPG3YYYUSAGEPTDPG3 GD3GT3Gh3GH3G3G3VUTTPP ^լSSG31-ȟ'ȟ-|~9G@3 DECC$DSPRINTFR bSPG@3GGC3P`ϯG@3bSPG@3GGC3P`ϴϰG@3bSPG@3GGC3P`ϕǟG@3bSPG@3GGC3P`10Pϳ|~ G@3 DECC$DSPRINTFRbSPG@3GGC3P`ϠŸxǟG@3bSPG@3GGC3P`լ'ϗŸG@3bSPG@3GGC3P`ϱϽŸG@3 DECC$DSPRINTFRbSPG@3GGC3P`ȹϝßG@3bSPG@3GGC3P`\şG@3bSPG@3GGC3P`լ PPP^G<32OG@3 DECC$DSPRINTFPG@3GGC3P`>PEEEEEEEEEEEEEEEEEEE9EEEEEEEUEE5EEe5EUEEEEEEUEE E%E5EEER UNZIP 9mainG 9unzip=uz_opts tGusageIshow_version_info 79<P H8Z:: t8f;d! 8c=:/   9@     :DC    {9cE y9kE {;EԹNTM[% DECC$STRCMP DECC$ISATTY DECC$DSPRINTF DECC$PERROR 9 __MAIN 9 MAIN 9|UNZIP =UZ_OPTS tG USAGEDECC$MAIN_ARGSM$CODEt$DATA $ADDRESS_DATAD MASK_BITS VERSIONDATEG CENTSIGMSGI ENDSIGMSG<SEEKMSG$FILENAMENOTMATCHED-EXCLFILENAMENOTMATCHED REPORTMSGZIPNFO# COMPILEDWITHGUNZIPUSAGELINE1 QE9ww'( UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1**[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1+,C./ 4-s0123 KPWO56U옉 7 89GHJ% VAX-11 Librarian V04-00-lPm !R* 2b 8~  wCHECKDIR CHECK_FORMATCHECK_FOR_NEWER CLOSE_OUTFILE3CRC329DECRYPT9 DECRYPT_BYTEDEFER_DIR_ATTRIBS{DEFER_LEFTOVER_INPUTDEST_STRUCT_LEVELDOS_TO_UNIX_TIME{ DO_STRINGDO_WILDECHO@ENVARGSDEXPLODEPEXTRACT_IZVMS_BLOCKPEXTRACT_OR_TEST_FILESPFIND_COMPR_IDXFLUSHFNPRINT3FREE_CRC_TABLEFREE_G_BUFFERS{FZOFFTGETP GETZIP64DATA3 GET_CRC_TABLETE_FREE3CRC329CRYPT@ENVARGSDEXPLODEPEXTRACT{FILEIOGLOBALSINFLATELISTMATCHPROCESSTTYIOUBZ2ERRUNREDUCEUNSHRINK]UNZIPVMSZIPINFO RETURN_VMSSCREENLINEWRAP SCREENSIZE{ SEEK_ZIPFSET_DIREC_ATTRIBS STAMP_FILE{STR2OEMTT_GETCH{ UNDEFER_INPUTUNSHRINK]UNZIP9 UPDATE_KEYS]USAGE{UZPINPUT{UZPMESSAGEPRNT{ UZPMOREPAUSE{ UZPPASSWORD]UZ_OPTSVERSION VMS_MSG_TEXTZIPINFOZI_END_CENTRALZI_OPTS{ ZSTRNICMPRFLUSH GET_CRC_TABLE INFLATE_FREEREADBYTE ZSTRNICMPQ9 INIT_KEYSISWILD LIST_FILES]MAIN{ MAKEINT64{MAKELONG{MAKEWORDMAPATTRMAPNAMEMATCHP MEMEXTRACTPMEMFLUSH{OPEN_INPUT_FILE OPEN_OUTFILEPROCESS_CDIR_FILE_HDRPROCESS_LOCAL_FILE_HDRPROCESS_ZIPFILESRATIO{READBUF{READBYTEGET_TIME_STAMP GLOBALSCTOR{HANDLER HUFT_BUILD HUFT_FREEINFLATE INFLATE_CODES INFLATE_FREEPFNFILTERFNPRINT3FREE_CRC_TABLEFREE_G_BUFFERS{FZOFFTGETP GETZIP64DATA3 GET_CRC_TABLE (dd!L UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;10)<) UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1T !"#$%&'()*+,-*q3 UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1C-./012416lV1.02CRC32V1.029-APR-2008 10:32VAX C V3.2-044P^<~MALLOCPUVeTVSR SS\͏ \PPSPPSRSdTVWޥVfSTWQARSPʏPS\@e\SSbRTVWUP^JPP^\l lFREEl|^ЬRP Q͏Sլ 2ˏRT(PTSTʏTSPDaPS׬  ˏRPRVެ Ue1BPSSˏSTTSRʏ5RRDaBaTSRʏRRBaTSRBaTSSSˏSTTSRʏRRDaBaTSRʏRRBaTSRBaTSR CRC32make_crc_table get_crc_tablefree_crc_table crc32E !_' 4 CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABK6EY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS GET_CRC_TABLEMALLOCFREE GET_CRC_TABLE FREE_CRC_TABLE |CRC32!$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGWEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGCGD MASK_BITS7FNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSG ENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSGZIPNFO COMPILEDWITH:SSˏSTTSRʏRRDaBaTSRʏRRBaTSRBaTSSSˏSTTSRʏRRDaBaTSRʏRRBaTSRBaTSee1ެ UeUSSˏSTTSRʏRRDaBaTSRʏRRBaTSRBaTSeeЬPVPլ PTSTʏTSRDaRS׬ ͏SPww6l GOATHUNTER CRC32l GOATHUNTER CRYPT _l GOATHUNTER ENVARGS Zl GOATHUNTER EXPLODE Al GOATHUNTER EXTRACT` l GOATHUNTER FILEIO Vl GOATHUNTER GLOBALS l GOATHUNTER INFLATE`dl GOATHUNTER LIST`4l GOATHUNTER MATCH `Vl GOATHUNTER PROCESS]l GOATHUNTER TTYIO `7l GOATHUNTER UBZ2ERR! 35l GOATHUNTER UNREDUCE!/l:1BlV1.02CRYPTV1.029-APR-2008 10:32VAX C V3.2-044P^PˏBQQQ\Q\\\ˏ\P ^RBPʏP@SBQ@cQBˏBQBQďQQQBBPBPʏP@SBQ@cQBP^RЏxV4BЏgE#BЏxV4B1PTBTPʏP@SBQ@cQBˏBQBQďQQQBBPBPʏP@SBQ@cQB֬;1xP^R@PDEFER_LEFTOVER_INPUT@P@P@P@`S READBYTEPSSTЭPT@ UNDEFER_INPUT@P¤h¤լDBWݬSTRLENPPMALLOCPBPݬBSTRCPYBBBFREEBB߭ϭPPBPQ~MALLOCPBPA@Q~B߭bCP`PSSBFREEBPS BP`ԭ߭!PPSBխP^S<BݬOPTEBSTRLENPPMALLOCPRPBRSTR2OEMPݬPTRFREETP ^RЬUЏxV4BЏgE#BЏxV4Be1eTBTPʏP@SBQ@cQBˏBQBQďQQQBBPBPʏP@SBQ@cQBUe1{ ݬMEMCPYWTdSˏBVVVPVPPPʏPPSddUBUPʏP@SBQ@cQBˏBQBQďQQQBBPBPʏP@SBQ@cQBT WS+ UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1m<=Y CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS INIT_KEYS UPDATE_KEYS DECRYPT_BYTESTR2OEMREADBYTEDEFER_LEFTOVER_INPUT UNDEFER_INPUTMALLOCFREEMEMCPYSTRLENSTRCPY DECRYPT_BYTE 0 UPDATE_KEYS  INIT_KEYS DECRYPT.$CODE?$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGCGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSG ENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSGZIPNFO COMPILEDWITHPPSeeTBTPʏP@SBQ@cQBˏBQBQďQQQBBPBPʏP@SBQ@cQBUVPVP1MPwwA1_lV1.04ENVARGSV1.029-APR-2008 10:32VAX C V3.2-044P^Tݬ GETENVPU"eRʏRBdPUePʏP@dUe0ݬGETENVPU!eRʏRBdUePʏP@dUePUSTRLENPPMALLOCPSPUSSTRCPYSRVPVbP'PPʏP@dPRbPPPʏP@dbQ'QPʏP@dPRbQQPʏP@dQVWWRRxR~MALLOCPV SFREEPVXVPVЬUeRebScP$BPQAdPScP ˏPQAdPcP!ˏPQAdScP ˏPQAdPެPWٰScRcbװfXWPRENVARGSenvargs count_argsx ^, CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$CRMS_XABTRM C$V_CTYPEDEFSGETENVMALLOCFREESTRLENSTRCPY ENVARGSP$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIG=END_CENTRAL64_SIGEND_CENTLOC64_SIGCGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSG ENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSGZIPNFO COMPILEDWITHz ^RSPSP(PPʏP@b֬PPPʏP@b萼Q*QPʏP@bP֬QQPʏP@bQSPwwE1=YlV1.04EXPLODEV1.029-APR-2008 10:32VAX C V3.2-044P  !"#$%&'()*+,-./0123456789:;<=>?@A  !"#$%&'()*+,-./0123456789:;<=>?@AB?PAAAAAAAAA A  A  A  A  A F AA     P^R@P@P@P@`U READBYTEPUUWT@P@P@P@`U READBYTEPUUSˏSVVˏSPPPPSTSPPPQTPTV@aSWTSSSPP<^UY|S0ެоVFnެ о VFެ$о$VFެ,о,VF A1 READBYTEZFLUSH(MEMSETGMEMCPYT?P@V@V@V@fWjPWWPxTPPPSTTS1"SST׮T?P@V@V@V@fWjPWWPxTPPPSTTSVVnVVVXQQVV PVPSSQThRRPP nRcPʏRTR=@P@P@P@`VjPVVPxTPPPSTTRSVVBPPPX1uYVYF@Y1Y@4PԮ0Y1{PSSTT,@P@V@V@V@fWjPWЀWPxTPPPSTT,SVV [о,WW VWVSSWTT$>@V@HV@V@fWjPWWPxTPPPSTT$SVVVV VXQQVV PVPSSQThRRPP nRcPʏRTR=@P@P@P@`VjPVVPxTPPPSTTRSVVBPPPX1u[YW<VVW[T ?P@V@V@V@fWjPWWPxTPPPSTT SVVVVVXQQVV PVPSSQThRRPP nRcPʏRTR=@P@P@P@`VjPVVPxTPPPSTTRSVVBPPPX1u<4RWT>P@V@V@V@fWIjPWWPxTPPPSTTˏSVV4SSTѮ4 î4WWХWʏ[[PPY[VYVVRR4Ю4RR4ծ0"Y[R@VYV~$RYR[MP[YPPR'R@V[V~@VYV~ RYR[PYQY[P[@@A@RYY@4PԮ0Yծ418ծ1Y@FLUSHPŰ@RTVVRŰAS@SVSŴPP4^VY|S(ެ оUEnެоUEެ$о$UEA 1rREADBYTE[FLUSH MEMSETMEMCPYT?JP@U@U@U@eWkPWWPxTPPPSTTS1SST׮ T?P@U@U@U@eWkPWWPxTPPPSTTYUYSE@YY@,PԮ(YSST1wPSSTT$@P@U@U@U@eWkPWWPxTPPPSTT$SUUZо$WW UWUSSWTT>@U@U@U@eWkPWWPxTPPPSTTSUUUUUXQQUU PUPSSQThRRPP nRcPʏRTR=@P@P@P@`UkPUUPxTPPKPSTTRSUUBPPPX1uZYW<UUWZT?P@U@U@U@eWkPWWPxTPPPSTTSUUnUUUXQQUU PUPSSQThRRPP nRcPʏRTR=@P@P@P@`UkPUUPxTPPPSTTRSUUBPPPX1u<,RWT>P@U@U@U@eWkPWWPxTPPPSTTˏSUU,SSTѮ , î, WWЀW ʏZZPPYZUYUURR,Ю,RR,ծ("YZR@UYU~ RYRZMPZYPPR'R@UZU~,F_ UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1KL@UYU~RYRZPYQYZPZ@@A@RYY@,PԮ(Yծ,18ծ 1Y@FLUSHPư@RTUURưAS@SUSƴPP<^TRİ@\\@ PPPP<(A\\1 <~PSSP߭߭|~<~<~ HUFT_BUILDPSS ݭ HUFT_FREESP@~PSݭ HUFT_FREESP߭߭€@~ HUFT_BUILDPSkS ݭ HUFT_FREEݭ HUFT_FREESPԭ@~fPSSPM߭b@~ HUFT_BUILDPSS ݭ HUFT_FREESP@~PSݭ HUFT_FREEխ ݭ HUFT_FREESP<(A\\*U߭߭@~REXPLODEget_tree explode_lit explode_nolit explode^ .! N  > CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS HUFT_BUILD HUFT_FREEFLUSHREADBYTEMEMSETMEMCPY <EXPLODE $CODE@$DATASTDINSTDOUTOSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGWEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGCGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSG ENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSGZIPNFO COMPILEDWITH HUFT_BUILDPS(PU߭@@~ HUFT_BUILDPSS,S ݭ HUFT_FREEݭ HUFT_FREEխ ݭ HUFT_FREESPխ*UݭݭݭݭݭݭPSݭ HUFT_FREEPUݭݭݭݭϭPSݭ HUFT_FREEݭ HUFT_FREESPwwQ1@lV1.04EXTRACTV1.029-APR-2008 10:33VAX C V3.2-044P skipping: %-22s need %s compat. v%u.%u (can do v%u.%u) 

csize %s for STORED entry continuing with "compressed" size value P%s: bad extra field length (%s) Pfile #%lu: bad zipfile offset (S%s): %ld P%8sing: %-22s %s%s P%s %s: %s bytes required to uncompress to %s bytes; %s supposed to require %s bytes%s%s%s sP%s: bad file comment length Plocal header sigPfile #%lu: bad local header P (attempting to re-compensate) Pwarning: %s appears to use backslashes as path separators Pwarning: stripped absolute path spec from %s LP skipping: %-22s %svolume label pPwarning: cannot alloc memory for dir times/permissions/UID/GID TPwarning: cannot alloc memory to sort dir times/perms/etc. Pwarning: set times/attribs failed for %s P failed setting times/attribs for %lu dir entriesNPnew version of %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: P NULL (EOF or read error, treating as "[N]one" ...) Pnew name: Perror: invalid response [%s] PAt least one %serror was detected in %s. PCaution: zero files tested in %s. 5P skipping: %-22s unable to get password aP skipping: %-2U2s incorrect password P%lu file%s skipped because of incorrect password. P (may instead be incorrect password) PNo errors detected in compressed data of %s. PNo errors detected in %s for the %lu file%s tested. HP%lu file%s skipped because of unsupported compression or encoding. P error: %s%s %s P error: %s%s Pnot enough memory to Pinvalid compressed data to PinflatePexplodePunshrinkPwarning: %s is probably truncated P%sV: unknown compression method @P bad CRC %08lx (should be %08lx) P compressed EA data missing (%d bytes)%sP compressed WinNT security data missing (%d bytes)%scPbad extra-field entry: EF block length (%u bytes) exceeds remaining EF data (%u bytes) P invalid compressed data for EAs P unsupported NTSD EAs version %d  P bad CRC for extended attributes ' P unknown compression method for EAs (%u) Q P out of memory while inflating EAs u P unknown error on exWtended attributes  P error: unsupported extra-field compression type (%u)--skipping  Perror [%s]: bad extra-field CRC %08lx (should be %08lx) PcentralPcen CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSFNFILTER MEMEXTRACTFIND_COMPR_IDXDECRYPTCRC32 GET_CRC_TABLESET_DIREC_ATTRIBSDEFER_DIR_XATTRIBS CLOSE_OUTFILECHECKDIRMAPNAMEMAPATTRMATCHUNSHRINKINFLATEEXPLODEFNFILTER MEMEXTRACTtralPwarning-PsPs Ps#PVMS'PPK*Plseek0PEOF4PEOF8Plocal>PlocalDPuFPuIP{ENTER}QP[empty] ZP[text] cP[binary]lPtestsPextract}P P PexplodP PerrorPwarningPuP PuP [P]P PerrorPwarningPuP PuP.PinflatP P%-22s YP OK P P%-22s P%-22s P P%-22s P P OK P...P^RYԭԮԮ0|WԮ||@ GET_CRC_TABLEP@Pb? 9Sբ SSœbCHECKDIRPP UPUUP@¤AŒ'xŒ~MALLOCPWTŒ DgTTŒ&x~MALLOCPXT DhTTԮԮԮ,READBUF MEMCMP PROCESS_CDIR_FILE_HDR DO_STRING$MATCHVSPRINTF[FNFILTER(ZPZ\L@ZP 30,1# ,P1nASPP<@~@RR~A8PŬ@gP@cCP`1j@Pՠ1AݠSTRCMPP1<~<@~@RR~A4P<@~@RR~@Pݠ8P@gP@cCP`@PݠA լ@Pݠ @PԠ<*AP1AT@P TATt<~ߨFTPߨDAP<@~@RR~A<ݺPN@gP@cCPd`TAլ@P1ݣDECRYPTPT1TbգDգ<PգDգ<F<~<@~@RR~A4Pa@gP@cCP`ּ 1PTT<~<@~@RR~A4P5@gP@cCP`1+գD1գ1ZY[@PPq/ASTRCHRP^ARbSPb\DA9!@@gP@cCP`Aլ/bRbZxA/o<~<@~@RR~A4P@gP@cCP`լAPPQeQPa`A/ZMAPNAMEPTˏTR ѬRRʏTT1T`߭DEFER_DIR_ATTRIBSխ=P1<~p@gP@cCP`լ11ЬRbЭbּ1PTSߨH<@~@RR~AFNFILTERPL@SPRINTFP@cCP`1%PT1Ѭ1 1ACHECK_FOR_NEWERPPUP.?Pգ EZA[=ǮFQKbq"*wZ;ck X)P yƶekɠCHk ~ ΚS5^F94L y#Lqaы&N-zj_$7;vQg|jI$,اnh,V=Zx}dsqk$1l߻AV4ZuMl=G!U\DTeקՆ9D> 9W~aN4AuaiXPSSHO8@%Gj3As)7:E_KC<\F, X-'V#HeEJrI iޭT U rAĠO`"UOa\G3`ae;݅HDn *b$/-J:G?]p#9ԫmۑee~vj^ǾTdO}M¬WlN-c] :Ոwgݑ/l5Ҝ@Tx$TA$P7P\SSIN1,TB};Jg}XAHM2_MVVIzRЄъlEcr$L":LVNA_f7ab͔jit}[ <^Az qN)unuJ;]D1]] }vM@GydB]vt *6 .D7g&=m͡FV#@Ѩr1toZԏUY ѭ [+_>x_8KR)PO蝪IMnCH&QU]BLd OZ8d6MZBѯG<[-&Pl.YDܑ[P JEM57C G=H$EGؚND/2mFμGcda^QDFmOT/֮_]5FHDK,2@ZMMjO>=*m KNTT{Ğ![UEz q149Nٌ>tUlO4lï QR.4Fr[D3[T~<]m)BtQ KfGWի2☡L.H5x JrO P&h|qxeUG>bL4"Jt#l+4SW>Vq'ρtK_cCWgT @d!gˉo %1Wq0Ӥ9'\LiAK'Lzy]"DJUwTHY"]{?v\ȈAN]P8|J>33MO& 1L/06bИ~@Vʙρ@MxLzjKl\F ^Y"_Qd*"2Z@ro'G9t"ASA%%pM7"2 IB]~S$KϖYM\_|lo1?kֱ)b?XRrW6FCoDfTFV;8ub,C95 $9BQsn_xMb S% RLcn߇Ƨc kvVSz&jXuj mĶ Kʶ.CቩB<}wM(}- K}0Vkd,L້ȝ6uFIxG1vBGcǯl?O1EE QiRP5o/Ό|oX4MiU4]qsvhG^?bk!&[68˜ \rgKGp>f:=(b؞ Xg|f_= Jeqo>a\L4._ 2t+Z3%fHalT>5# ]HK[NPeY2d(%Ѵp0mL6ȟU(4 t`{,!B7~U["Re-F8q8#IXdSBDIZl:i2)}Xa=`2mBNTף* G)hcK0W,IIeI a8l!Hyet2%4BҪp.ǚ}LwF@G.M{dr!adr+[؍r^o;62nZIaDYV /(yoՐ`x22B rK(U*P5H1Zhm}p6sT0-aM=:tAsQ6zbnlԡ[Oн\"ۗN/HHū'o4ѐm+j45W^VRHP;tܭVav/@6|\`\q!+8#|B~%-*~D}!Yt0Fz_ Qt:4CȡVehrdn~y)u_t*Vk![-b9t2tv"XZ.G5}),JW 9|(M8]ɣ0zOr]%xoo -x02њ}J7 헢?#6x:>4&hAX9j2"5XD0j// jY6'](XfFW 3$ -av5|q@c]:4wd ÖmxrP{%Qq,krs+ѯM3])IPaJO*}mbl3>l5,m/5>fzQIInESLе='~SAsCN}ߥ=%Xt@١~WW̾@9p}K;~Q>GxVk`fQ IU wq)p4OxCP%Yvt{P7BOXP*yDGJacJN2:"}FX9M([ ]\.%L}x$W!eE7ڌX[!8߾4xS n.3 b:h͚1 2c~KR΀tj,+UAbFt׾#0eB޾0J]2zceMt}FAfW#@R>1ރ¨/ //g;p 2+8N\B-#jHď)F B% P%q9}x=̆yWo#i:P'l\peQq5}qunL a PjY0ހ'Dj,S:ƋB(Kao^Rfk#!ϯ.휠jKV8kA]52ɯ_P34ČC3 vG-o`?[g͒΋ ]v5`ax ܆sj$jSs';yЍ=3rA$)}hs+W>qlRJlj;p u$ TH5׆*ѕQN5}ԴY^ڄޅ:C(Mշ}?a E/3iS+S!CUZ?9mH}RGT4c=ԎWIgQ-x<tymR9CT㟔%y'MO} 5 [t8``ho \CY;5hD Ufnj*H %!)D_G˻QS񞤃BǾ&_'ΥK}:)I)Gɛ(!JTBH?]udRdkm)=TV9=]꒕zd..=?>Jb/? xXؠyIqc 1)#SwO%ּD>6sEHBc2 91i)q|μD{/JkOmeϞ\8Gkpee3/m2$d >+-\s;yC yHlAh&EJfN>  "Ө yhm"N+ܨ[*!Ԇ 2pW4)`!7P,yȩ$(SC>ǥ{_z}Zaċcn{X'!7=YKQ;ڭ^$>->;W1͍KV?@LB=ayPIM1&PUX1PBe1PTh1PAt1<PP 12PM31,PAL1PBe|KPAtBoYjPX+~ko??YϾ󨷵ǎԐѥ噞ᅠƄФP׃Ѫ++++--+-+++---+i++_̯յݯ=PPPerror: cannot open zipfile [ %s ] %s /Perror: zipfile read error KPwarning: } filename too long--truncating. uPwarning: extra field too long (%d). Ignoring... P%s: write error (disk full?). Continu CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS SEEK_ZIPFREADBUFDEFER_LEFTOVER_INPUTGETPTT_GETCHECHO UPDATE_KEYS DECRYPT_BYTESCREENLINEWRAP SCREENSIZE RETURN_VMS~FNFILTER GETZIP64DATAMALLOCFREELSEEKMEMCPYSTRERRORSTRLENe? (y/n/^C) Perror: zipfile probably corrupt (%s) P--More--(%lu)P--- Press `Q' to quit, or any other key to continue ---IP P[%s] %s password: PEnter password: Ppassword incorrect--reenter: Pctx=stmP%.*s P%.*sP%.*sP Pbus error#Pillegal instruction7Psegmentation violationNP[ %s ] VP8XP.ZP8\Pl^PdP^R|~@OPENP@@E<~STRERRORP@@SPRINTFP@bC\lPPP^P@ @C#C@C@C@@^P@)@C@C@PC@^TVЬRRWR1P@g< ~@@READP@RWP@#<~ߦ/STRLENPߦ/dCP`P A@@@PRPRUPUUSS@ݬMEMCPYSS@S@SR1NWPP|^UVAPŰŰ@P@1< ~@@READP@P@2<~ߦ/STRLENPߦ/eCRbECHO RETURN_VMS A@@@Ű*@ŰCŰ@CŰ@ PC@Ű@R?@R@SR\RT\&cR DECRYPT_BYTEP\\Rcc~ UPDATE_KEYSST\T\@@R@P<^R ATQTPЏ SSSPSQPQP{SPPQQSSTUUASU@LSEEKPA< ~@@READP@3PS@@S@#@@PSPP@@S@PP^W[UЬRRYR ZRTVЬRբDkX PX%լ  ЬRAլ RR  ֬ ЬSÀx SCREENSIZEx1A1X FPUTCXFFLUSHգt#ÄA֣|ѣ|xSC7ЬRբD.ISATTYP!ISATTYPk FPUTCkFFLUSHЬRAЬRբt1TZ1PdPP V7PSCREENLINEWRAPP)dPP  ЬPPЬPVVhVЬPA֠|Ѡ|xNYYTRRRߧXFPRINTFQPRQQQPXFFLUSHЬPATYPCTTZ1FYT Ь T1YTߧ XFPRINTFPRSRTSSSPRЬRբDIISATTYP<ISATTYP/Yݬ ߧkFPRINTFPRSR SSSPkFFLUSHЬPRSR SSAPP^ P|^TUVЬPA ߤeFPRINTFЬPAeFPRINTFeFFLUSH 2PTT_GETCHPSSPP (P #P PqPQ TT_GETCHPSIeFPRINTFeFFLUSHSRˏRP@R~TOLOWERPQRQQq  RETURN_VMSЬQA SPP ԡ|P^TSWЬVfof<~MALLOCPUS<@~@PP~ݬFNFILTERP<@~@PP~ݬFNFILTERPÅUSPRINTFURØR fUéRݬݬ RGETPPRU UFREERW P WWP^TRSECHOѬ 6   ׹>#     &N D ZSTRNICMP2$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGCGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSG ENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDz REPORTMSGZIPNFO COMPILEDWITH ISO2OEM_850ISO2OEM`$CHAR_STRING_CONSTANTSPVQQWcUUVˏVP@h U~iPQVQQPWPdbUUVˏVP@hU~TOLOWERPQPVQQWcUUVˏVP@hU~TOLOWERPUVUUPWPQQQPbPTRST19P P(0(ww1VlV1.04GLOBALSV1.029-APR-2008 10:33VAX C V3.2-044fRGLOBALS globalsCtor     CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSMEMSET UZPPASSWORD UZPMOREPAUSEUZPINPUTUZPMESSAGEPRNT  GLOBALSCTOR$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGvEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGCGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSG ENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSGZIPNFO COMPILEDWITH$CHAR_STRING_CONSTANTS PP P P PP*PP^TSRݏCbMEMSET,ޤ@c¸¼@AUZPMESSAGEPRNTCUZPINPUTC UZPMOREPAUSEC UZPPASSWORDCbPww1lV1.04INFLATEV1.029-APR-2008 10:33VAX C V3.2-044PP      #+3;CScsP #+3;CScsPccPPcc !1Aa  0@`JP jP ccP P(incomplete l-tree) P(incomplete d-tree) P^S[=CVACT9CYЬ RBnЬRBЮT VP@R@R@R@bW READBYTEPWWRR T[15xTRRRVTT VRRnRRRЮRXXWW RWRVVXTUURR aYRYЮWB@Y1SAY@MEMFLUSHPRPY@FLUSHPRR[1Y1PU1TUVP@R@R@R@bW READBYTEPWWRR T[1=xTRRRVTTUЮR<WVRRERRW U RURVVUTTVP@R@R@R@bW READBYTEPWWRR T[1xTRRRVTTVRRRRRXQQPP RPRVVQThUUPP 1UcPʏUTUUP@P@P@P@`R READBYTEPRRPP T[1xTPPPVTTUVRRERRRX1ZPTUVP@R@R@R@bW READBYTEPWWRR T[1xTRRRVTTU<RRYWVRRERRWZU RURVVUTʏZZPPYZRYRRUU Ю UU ZYPPU*U@RZR~@RYR~MEMCPYUYUZPYQYZPZ@@A@UY:AY@MEMFLUSHPRY@FLUSHPRR[1Yծ 1:1+PU1UcPʏUTUVP@R@R@R@bW READBYTEPWWRR T[BxTRRRVTTUVRRERRЮWR1Y9CV=CTAC[PP^TV=CRAC\9CWˏ\XX SXSRRX\\S@S@S@S@cU READBYTEPUUSS \V1xx\SSSR\\ˏRXRR\\S@S@S@S@cU READBYTEPUUSS \V1x\SSSR\\RSʏSXSPRR\XSXS1READBYTEUP\RP@P@P@P@`SePSSPP \V1x\PPPR\\WSWRC@W:AW@MEMFLUSHPSPW@FLUSHPSSV+WRR\XSXS1EW9CR=C\ACVP|x^SVB1P|RbRPP @|PPPP@|PPP P@|PP CCB1C-C<~< ~| HUFT_BUILDPBP|RbRP C CC5C | HUFT_BUILDPUU-BTT\P\ЬR\FREER\|BUP CCCB INFLATE_CODESΐ^V|=CSACRRS@T@T@T@dU READBYTEPUUTT RZ1xRTTTSRRˏSTT SSRRVP@T@T@T@dU READBYTE2% UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1ږPUUTT RZ1;xRTTTSRRˏSTTSSRRVP@T@T@T@dU READBYTEPUUTT RZ1xRTTTSRRˏSTT׮0SSRѮ Ѯ PWծ01READBYTEXPRRP@\@\@\@lUhPUUTT RZ17xRT\\SRRGTˏSDSSRWW0WGTDWW߭߭|~ HUFT_BUILDPUխUU'UЭXX\\ЬT\FREET\UP 4ЭTD[Yծ41READBYTEXRRP@\@\@\@lUhPUUTT RZ1+xRT\\SRRSTTTTTЭUWW TWTSSWR<WWYTYW[[D1JW1RRP@\@\@\@lUhPUUTT RZ1xRT\\SRRˏSWWSSRYWTT4%ЭUU\P\ЬT\FREET\PWTWT1PY\Y[LW\W\1W1RRP@\@\@\@lUhPUUTT RZ1xRT\\SRRˏSWWSSRYWTT4%ЭUU\P\ЬT\FREET\PWTWTPY\YLW\W\[1RRP@\@\@\@lUhPUUTT RZ1xRT\\SRRˏSW WSSRYWTT4)ЭTT\P\Ь\FREE\PWTWTPY\YLW\W\[Y41ЭTT\\Ь\FREE\S=CRACޭ߭߭1C-C<~ݮ4 HUFT_BUILDPTխTTFT=զ<ޟfCRbЭRR\\Ь\FREE\TP߭߭5Cݮ0Sx8RRS~ HUFT_BUILDPSSSխ Ѯ SSlS?զ<ܟfCRbЭRR\P\Ь\FREE\ЭRR\P\Ь\FREE\SPݭݭݭݭ INFLATE_CODESPZխ%ЭRR\P\Ь\FREE\խ#ЭRR\\Ь\FREE\ZPP^T=CSACRP@P@P@P@`U READBYTEPUUPP RV1xRPPPSRˏSSSRRVP@P@P@P@`U READBYTEPUUPP RVQxRPPPSRRˏSWSSRS=CRACWϑW/W VVP^RS9C|=CլHޣL-C1CF5C CBCCCCC CGÊ-C1Cf5CCB%CC!CC)C C߭)Pխլ.B CCCCC CC,BCC%CC!C C)CA9C@MEMFLUSHPT9C@FLUSHPTTP ^SBKCTT\\ЬR\FREER\BTT\P\ЬR\FREER\|BPP0^tRR$Ѭ ЬRSPSSD~߭MEMSETЬR[bSCR[ѭ ԼԼP2ZJZZZYЬRbZZb[ PK[[ ЬRb[[bxZZ[JPZxZ[KPKZtޭSSRpSSU[ PZZ[<~ʹMEMSETR[ЂZJpSJp[Cʹ[[ެЮ RBp[pʹX0Ю$RԢV4WԮ,Y 1ެ(MALLOCIЮR׮R1Ю0RB$VRYR1e Ю0R֮0B$VV ,Ю,RЮ(SRгTPЮ,TT,VYZZRxR4Ю4RR <RR4ޭTxYSTSZZ, Px44Ю4RSRc c4ZZ,ZVRR VVZxZ,Ю0RZB$,RR~PW*ծ0!4TTRPRТSRFREESRPWԼWЮ0RWB4RN[Bp0TD$Sck ZRRjWlcVSS UxVRRRRR[RSURZZRD4S(jBcЮ0RB$VRрYR1VYRRkʹSxRRSXS cjQPhTЬ PTP(T UPUUjXSXclPPT޼RDbjPS޼TCdlVYRxR4V RVR[ZZ,ZR(jBg4ZZ,YRxRZ[RRZRPZ[ZZ[RRZRZ[xVRRRRR[RЮ0SRCp(P׮0Ю0RB$VxVRRRRR[RЮ0SRCpЮR׮R1qYY 1Rо$TծѮ TTPP ^ЬRRТSRRINFLATE inflate_codesinflate_stored inflate_fixed[inflate_dynamicm inflate_blockinflate` inflate_freebl huft_buildN huft_free$ $      CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS HUFT_FREE HUFT_BUILD INFLATE_CODES HUFT_BUILD HUFT_FREEMEMFLUSHFLUSHREADBYTEMALLOCFREEMEMSETMEMCPY  INFLATE_CODES INFLATE  INFLATE_FREE l HUFT_BUILD  HUFT_FREE$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGCGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSG ENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSGZIPNFO COMPILEDWITH ,$CHAR_STRING_CONSTANTSFREESRPww1`dlV1.01LISTV1.029-APR-2008 10:33VAX C V3.2-044P%c%d%%P100%% P Length Date Time Name0P--------- ---------- ----- ----SP Length Method Size Cmpr Date Time CRC-32 NameP-------- ------ ------- ---- ---------- ----- -------- ----P 0S%s ("^" ==> case %s conversion) P%s %-7s%s %4s %02u%c%02u%c%02u %02u:%02u %08lx %c:P-------- ------- --- ------- %s %s %4s %lu file%s P%s %02u%c%02u%c%02u %02u:%02u %cP--------- ------- %s %lu file%s !PNXFS&PStored.PShrunk6PReduce1>PReduce2FPReduce3NPReduce4VPImplode^PTokenfPDefl:#nPDef64#vPImplDCL~PBZip2PLZMAPTersePIBMLZ77PWavPackPPPMdPUnk:###P%s %s P%03u P8PuP8PuP9PuP8PuP8Pu Ps#P9%Pu'Ps*P P^YS[ԮRѣTRR|Ԯ@ѣ<~գ0@RBB@SPRINTFP@cCRb:RBBi@SPRINTFP@cCRb READBUFP3P MEMCMPP1 \nARP 2 GiB) without large file support Pnote: %s may be a plain executable, not an archive ;P [%s]: Zipfile is disk %lu of a multi-disk archive, and this is not the disk on which the central zipfile directory begins (disk %lu). P warning [%s]: end-of-central-directory record claims this is disk %lu but that the central directory starts on disk %lu; this is a contradiction. Attempting to process anyway. Pwarning [%s]: zipfile claims to be last disk of a multi-part archive; attempting to process anyway, assuming all parts have been concatenated together in order. Expect "errors" and warnings...true multi-part support doesn't exist yet (coming soon). Pwarning [%s]: %s extra byte%s at beginning or within zipfile (attempting to process anyway) PArchive: %s Perror [%s]: missing %s bytes in zipfile (attempting to process anyway) CPerror [%s]: NULL central directory offset (attempting to process anyway) Pwarning [%s]: zipfile is empty Perror [%s]: start of central directory not found; zipfile corrupt. %sPfatal error: read failure while seeking for End-of-centdir-64 signature. This zipfile is corrupt. _Perror: End-of-centdir-64 signature not where expected (prepended bytes?) (attempting to process anyway) Perror [%s]: reported length of central directory is %s bytes too long (Atari STZip zipfile? J.H.Holm ZIPSPLIT 1.1 zipfile?). Compensating... _P End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. _Pwarning: cannot set time for %s PUpdated time stamp for %s. P caution: zipfile comment truncated PThere is no zipfile comment. PThe zipfile comment is %u bytes long and contains the following text: ( P======================== zipfile comme CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSFREE_G_BUFFERSFREE_CRC_TABLE STAMP_FILEDO_WILDCHECKDIRISWILD VMS_MSG_TEXT CHECK_FORMAT INFLATE_FREEEXTRACT_OR_TEST_FILESFZOFFT MAKEINT64MAKELONGMAKEWORD DO_STRING SEEK_ZIPFREADBUFnt begins ========================== t P========================= zipfile comment ends ===========================  P The zipfile comment is truncated. P P Ps were P wasPsPsPsP Ps P%sEmpty zipfile. 3P 7P[%s] =P[%s] CP[%s] IP[%s] OP[%s] UP[%s] [P[%s] P^R W T U VԮSn< ~MALLOCP@ݏMALLOCPA@A0<~@SPRINTFP@bC\lP @APddggeeff鐏KKKKKբ4Xբ8\P\\XX˜|ZԮYԮ @DO_WILDP@1P@բ<;S 6SL-բHբ#[\Z\Y\bC\lQPSSZ(SL֮ PS YPS[֮SLSnSn@DO_WILDP@1SZ\[\1 Y\\1ծ1@ISWILDPpݮISWILDP1YԮ nѢ<1<~@բ S PSS'@SPRINTFP@bC\lqPЮ@YԮ n:PSASPPP PV?PPLZ֮ S PS[֮SnSn@ISWILDP1?Ѣ<16բHբ Ѣ<1#[Y\Z\Ѯ3բH բբ<$բDѢ<<~ҟbC\lѮV Y\[\Z\I<~Ѯ  S PSSݮf@SPRINTFP@bC\lZG<~Z S PSSZ@SPRINTFP@bC\l[H<~[ S PSS[@SPRINTFP@bC\lYH<~Y S PSSY@SPRINTFP@bC\lѮ 0<~@SPRINTFP@bC\l6Pծ /<~ݮ@SPRINTFP@bC\l[\Z\,<~@@SPRINTFP@bC\l INFLATE_FREECHECKDIR@ FREE_CRC_TABLE@BBFREEBAAFREEAA AFREE@ @FREEA@Ԯ\L\l lFREEl֮Ѯ@ЮP ^R INFLATE_FREECHECKDIR@ FREE_CRC_TABLE@BBFREEBAAFREEAA AFREE@ @FREEA@SPS\L\l lFREElSS@P^WSUYԭX@ISWILDP:xA@STATP#գH߭߭GET_TIME_STAMPPR'գTգDգ LIST_FILESPR EXTRACT_OR_TEST_FILESPRRXRX@CLOSEգH1գ1խ1ݭ@ STAMP_FILEPAѣ<0<~@_@SPRINTFP@cCP`X9X4Pգ<-@Ł@SPRINTFP@cCP`XPP ^ЬRRLSEEKPSSS6SRLSEEKPSSSP߭RREADPSSPP^RTAUQUPЏ SSSPSQPQP{SPPQQWWSS 1WU~@LSEEKPAW@@READP@@WP@WS PPS@@@NP@P`P+ݬPMEMCMPP@@PP@T@@@@AMEMCPY PWUAWSSQSPЏ S SP Q{SPQPQVUT1UV1MEMCMPSPAA@LSEEK< ~@@READP@@ P@@@@JP@P`P'ݬPcP@@PP@T@@@@AMEMCPYUTUV1&TSPSSP^TRS¨UU@LSEEKPA߭@READP@@gբ<բ/<~@ߤ7@SPRINTFP@bCP`<~@SPRINTFP@bCP`P ߭MEMCMPPPMAKELONGPn MAKEINT64PWMAKELONGPVPSMS/QDOSGPAOS/VSNPAcorn SparkFS\PFred Kantor MD5lPASi UnixuPTandem NSKPTheosPunknownP. The local extra field has %lu bytes of OS/2 extended attributes. (May not match OS/2 "dir" amount due to storage method)P. The extra field is %s and has %u bytes of VMS %s information%sWPstored^Prun-length encodedqPdeflatedzPcompressed(?)PW^qz. The local extra field has %lu bytes of access control list informationP. The local extra field has %lu bytes of NT security descriptor data.P. The local extra field has UTC/GMT %s time%s`PmodificationmPaccesstPcreation}P. The UTF8 data of the extra field (V%u, ASCII name CRC `%.8lx') are: P. The first 24 UTF8 bytes in the extra field (V%u, ASCII name CRC `%.8lx') are: #P. The Mac long filename is %sEP. The local extra field has %lu bytes of %scompressed Macintosh finder attributesP. The associated file has type code `%c%c%c%c' and creator code `%c%c%c%c'P. The associated file has type code `0x%lx' and creator code `0x%lx'7P. File is marked as %sRPResource-fork`PData-forkjP. File is marked as %s, File Dates are in %d BitP. The local extra field has %lu bytes of %scompressed AtheOS file attributesP. The local extra fi8@ UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1ield has %lu bytes of %scompressed BeOS file attributes?P. The QDOS extra field subtype is `%c%c%c%c'pP. The AOS/VS extra field revision is %d.%dPUnstructuredPRelativePEntry SequencedPKey SequencedPEditPObjectP. The file was originally a Tandem %s file, with file code %u:P. The 128-bit MD5 signature is %s`P. The first 20 are: {P: P %02xP There %s a local extra field with ID 0x%04x (%s) and %u data bytes (%s). PGMT modification/access times and Unix UID/GIDPGMT modification/access times only(P There is no file comment. FP ------------------------- file comment begins ---------------------------- P-------------------------- file comment ends ----------------------------- P%03dP%02u-%s-%02u %02u:%02uP%u %s %u %02u:%02u:%02uP%04u%02u%02u.%02u%02u%02uP11PXP11Pu PX P11PuPXPuPentriesPentry#Pu%PX'Pu)PX+Pu-PX/Pu1PX3Pu5Pare9PisPentriesFPentryLPuOP-QPuSPuUP 0P  &*/6?O]fksxP.7AJbt|WP ZPu\PX^Pnot cPnofPyesjPulPunPbinaryuPebcdic|PtextPrdo Phid Psys Plab Pdir Parc Plnk PexePFABPXABALLPXABFHCPXABDATPXABRDTPXABPROPXABKEYPversionPunknownPunPunP%02xP.P PisPmay bePNXFSPfat Pami PvmsPunxPcmsPatrPhpf!Pmac%Pzzz)Pcpm-Pt201Pntf5Pqds9Paco=PvftAPmvsEPbe IPnskMPthsQPosxUP???YP???]P???aP???eP???iP???mP???qP???uP???yP???}PathP???PstorPshrkPre:1Pre:2Pre:3Pre:4Pi#:#PtoknPdef#Pd64#PdcliPbzp2PlzmaPtersPlz77PwavpPppmdPu###P%03uP%u.%u P%u.%uP%u.%uP.r.-... %u.%u(Pcom,Pexe CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSMATCHFIND_COMPR_IDX ZSTRNICMPFZOFFTMAKELONGMAKEWORD DO_STRINGREADBUFFNPRINTRATIOPROCESS_CDIR_FILE_HDRUSAGEMALLOCFREEMEMCPYMEMCMPSTRLENSTRRCHRSTRNCPYSTRCPYISATTY0Pbtm4Pcmd8Pbat<P%u.%uBP%s %s %s LP8NPuPP%cSP%cVP%3d%%\P %s`P8bPudP %s %s PJanPFebPMarPAprPMayPJunPJulPAugPSepPOctPNov PDecP^RԮQWXV[|Y мTмTn1*S-1PPSPUcT1TPP-MP1:P?PQ1/PQ ,Q1P,1Q ,Q1P,1QԢQ11Q|WQ1YWXѢ,1Ԣ,1Q ,Q1P,1Q ,Q1P,1QԢtQ1t~PQ,Qp,jPQV[Q\ZV[Ѣ,IԢ,DQԢHQ9H2PQ,Q$ ,PQQԢhh PPT1nЮS-1nSnSծnЮݮUSAGEբtISATTYPԢtբ, n բ,,Т,PP PVP2?PX$[DBPԢ$ԢDԢh5nYSWSS$n ZSVSSD PW$[DnЮP^SRUѢ, 1ߥ3@SPRINTFXhP@bC\lߥV@hP@bC\lߣ~AFZOFFTWgPcAgPߥx@hP@bC\lߣ~¬gPߣߣ ¬gPߣ ~¨gPߣߣ¨gPũ@hP@bC\lVVߣ<fAgPbA ޣ9TPޣ5TTߣ3bAgP&@hP@bC\lբ$KߣLfAFZOFFTP|~AFZOFFTPߥ@SPRINTFP@bC\lP^R Z[VY|Wn|Œ)xŒ~MALLOCPWUŒPEgUUŒ&x~MALLOCPXU EhUUԢ0@@\8ATPTT2UREADBUFP3Y1jMEMCMPP1U\nAPR:|~R8A~FZOFFTP@SPRINTFP@eCRb8AS\KG G}y-9JolV/ߜZK4{j*tc,BwyFv]*SIGkjQrdh<2#Nʇ޼B'Ve:ϟv YAuPqa{26+{Q\ lnx]E=r@ X^:D7o%^!uQ">9%'䉃w 6'P?xR˂FcLzv/RD0 !n׶YC N‹xRXXtZj~ *jeq-f0('7СуPR@1q46b@*U: վ;5ygjdrPڶɿҿ72_-uZzZvb.h%QD*9/[Ϸ!P#3@/A)YD28fd 92[c2\Ѩ7e >tА8~hTrRdJߔϭ ']x S-L85>IG'H47zqmG XC*6OyB~6{kW) W֫Edw3JYlEJ߮;2)'"Y۾@[VCW3^ۧ`$\Ig?k~2ng֠;IB`y;S6$$9#A('Z^i 򆫚B1Rj{-y'w.mm''ӣxu;5 5Aon~ O&(Sns+O[/) fR#h9au]Lۿ*+B$WxP^:]k.uRMߛI=\szt"@w5#PcR$`dLn6}Lc|t\gOS*[&p/m4p|hCӍycfb {6ʚ 9"6kwAAs( ó_t),EdRQd_h;B/ؽ_WlMez/Ik50k%v Ŀٝ׳E%a?wP,>+` tMDGLVbixYcM1AhukҷpwMS.ESiE{-q+)@VfvQotѡP7Ni0V%!w3\&aNncfťB!< EyN A>dV9F@e-WYxb>ĚJTCz6x<'3QR\e40'JSP^^%3{Hy7 bm"XAčbSvZ&sCAϩO;hy0‘=-V2\Ɠ1g@*ĥӤř:#@O n:rdK#E6TBnLvK/" G N0k@2'F1KYSBRmfp0*YKBOSŕrg: (@(F vjj nq\36I n($*ކ>]n47pŻX$UEn)$_XׇBb/e%6ec_b9 0f-{f˧[fQ'. \#<0AOY6fRld m3[w#/4YP[ o٩wv*=x`u@%]~-.7>W4G͓ c&R:AvoN“Q[#sgͨ]~mttQGHr"kZ5ot%MqHճzCb/G7_vd&?$,R(< ʯ/+5MF(VM*xBVr# . He85R#uQdzq[Jm#  OdS 3O] 7ʉ*ԩ \ ܱr? B+M۹EťxPէZ<9=Ui˙^g5_0@NkCubMS@frRcaٹZjƧy茷792Yh[b7zbm71Oc:hIqgL+B u8t1D8}>? )o% ,bg=u]5qqK-bt~fOV.Z,:bF!d+>fj(ը:UTʅɿG),iaxLbm?Zo$yᑂ70"9-N<.>("?,}odhb2@eρ;.!u]Fg襚q{ɮkUrUGCXl ÆNGG KRƋ3wCH.j ES JggK3= ;G$(},Ou۶Z{J8|~Pd~دb;X4h6QwPm9!C*W^s哵7,kZI8^ۇmˏmv??c|R@kS]PJw΋`@ ,dJ' @=ڐ,4 D.Hxi_$2R^uzqnX0 uc\'><ɞ7O/z㛿q8>  05V'[K"E1 JtzE;cL'!Kpw9+l0ͱ]FR.VTE>i`l'|+0|O 8eb[:fD[g=skƢ`mUgɭ0(1.@Wh%`OS괿,I`nN3ivH, 'Q=wd⡙!& fB.bt0\8Kۨ*sf\a<*J?Z$n8|7,%OPPL=}si45Tą*);FxO(* ?C}e{x0hN/-\Z-Ӎ3oA h©N)$BQ `WBL<#|\M[ 7IU~0_施 4k@qkh|U39d 1Xbk }o?iR> ps;ߍ|û3`skO%R/4h u;mlAz7tLU>lE>qvEҒ(:h$O DTwѯQ<6k7C0qQWIm`I&:#4QtB5W"|C:pPI#ѩg6neGY}')7:=̷&h>m֪9H(RԸi^#^D /cdT06-U W!ObXgrZCPI%֟̽IYdgTShpcW'E σ6R}Uʼnn4O3,+E>N4%wDiۚěn^ߖz}:!{'@!?XJۮ[@0TDaS1v:Jbh!犠SLU,3XMXq.^,>axR04#r;Í56n7X)jCHO:f$yݳ&a`e55|ݫ, Bo5DKZwc&G}y)v &kv/ 'ףK.ԗh0^ Nwj0VPv0R\Xe +)a~{CW46[:3rr;}X:e~T;:JmUmUo|M]SesɡXnd'4 wq`[ݵl'IAez%#uny)EъF3ӛ9X9y-GG#\kr]v48ÀyvjZgqZ_Nϲ:ޱd+dg:ͪi-mwt= XR &lJJ.C;ǮJeCC."\TԷUcw\%Oe}ILj8p0)"wkbJ̈́LP5?OB1B^;ZJU9pdh P4h) ֲ87 ?vPzq R4k;OQpPMn#U;SyiaO#DB'ueh*6 $A}&󺁮u~`3Ǒk\4Ň7.ASn##PKwec1rQ\[8RE_ -ԕ[]$8S6;/ϩ\ᘌg=OAQ8HpƸ+ iJ1B+1xE]C62kDUu S%%&ͬj<=ށM=VoK)"͛Iziq3E9]*X?s*MO:%N6v17޳dA설f?_D&*gH*OK9~ Gh CMCUIhd+<%DTti;%҂,;D`BJtʝVLΐc3]5j|L{*u%Uٔ6,_&D]8u]DtT]hS›Ԇ.F2]V,pKN3 wB)9:S UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1= @dP@eCRbƇ R6Ɣ R.ơ R&Ʈ Rƻ R R R RR߭STRCPY .SHSS .TPMTT.SPWSS.TPRTT .SPESS.TPXTT.SPWSS .TPRTTǔ߭ݮ7 @SPRINTFP@eCRb1;n1n1n 1n1n 1n1n1ˏRRmR tZR@i/R`^S>GS6NS.\S&lSuSSƀSƆS<.~S<TTƟ @iP@eCRbTRR 1 1 R1 1R&11R'11ERM311dRTA11RSD11 RFK11ARAL11RIM1|1RcM1k1RVS1Z1RUT1I10Ruc181RBe1'1Rup11RAt11RJ1t1<*PP1<PP ƎSƘSX4PS@iP@eCRbԼ17<*PP1X4P@iP@eCRbԼ1P<*PP1TX~(2bbbbbb^P!)P333333#K3;SPUUUgP".":::nnnnfcPM5auww1mV1.00VMSV1.029-APR-2008 10:34VAX C V3.2-044Perror: invalid response [%.1s] P (EOF or read error, treating as "[N]o extract (all)" ...) \PP0123456789ABCDEF P   +P  0P    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$P%PGet RMS defaults. getjpi sts = %%x%08x. %*P Default: deq = %6d, mbc = %3d, mbf = %3d. %dP error: cannot open zipfile [ %s ]. %P sys$open() error: %P Error: zipfile is in variable-length record format. Please run "bilf l %s" to convert the zipfile to stream-LF record format. (BILF is available at various VMS archives.) %gPJANP%g%kPFEBP%k%oPMARP%o%sPAPRP%s%wPMAYP%w%{PJUNP%{%PJULP%%PAUGP%%PSEPP%%POCTP%%PNOVP%%PDECP%P%P%02u-%3s-%04u %02u:%02u:%02u.00%P[ Cannot create ($create) output file %s ] %PCannot create ($connect) output file: %s %P[ File %s has illegal record format to put to screen ] %GP[ Cannot create ($create) output file %s ] %tP[ Cannot allocate space for %s ] %PCannot create ($connect) output file: %s P ,P@/P6P>P%P[ File %s has illegal record format to put to screen ] %Pcreate_qio_output: sys$parse failed. % Pcreate_qio_output: sys$assign failed. %GP[ Cannot create (QIO) output file %s ] %oP%s exists: new [v]ersion, [o]verwrite, or [n]o extract? (Uppercase response [V,O,N] => Do same for all files): %P %PIM%PVFAB%PVALL%PVKEY%PVFHC%PVDAT%PVRDT%PVPRO% P<ՄQS UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1vVMSV%P[ Warning: Unknown block signature %s ] %8P[ Warning: CRC error, discarding PKWARE extra field ] %oP[ WriteQIO: sys$synch found I/O failure ] %P[ WriteQIO: sys$qio failed ] %P[ Record too long (%u bytes) ] %P[ Warning, incomplete record of length %u ] %P[ Warning: Record too long (%u) ] %(P[ Warning: Record too long (%u) ] %KP[ WriteBuffer: sys$wait failed ] %nP[ WriteBuffer: sys$write failed ] %P %P[ WriteRecord: sys$wait failed ] %P[ WriteRecord: sys$put failed ] %P[ _close_rms: sys$wait failed ] %P[ _close_qio: sys$synch found I/O failure ] %(P[ Deaccess QIO failed ] %AP%.*s000000%c%.*s%s%TP.DIR;1%[P%.*s%c%.*s%s%hP.DIR;1%oP]%qPwarning: set-dir-attributes failed ($parse) for %s. %Pwarning: set-dir-attributes failed ($assign) for %s. %Pwarning: set-dir-attributes failed ($qiow acc) for %s. %Pwarning: set-dir-attributes failed ($qiow mod) for %s. DP;Zx0Nm%PP%02d-%3s- %04d %02d:%02d:%02d.00P \dlt |~%pPstamp_file: sys$parse failed. %Pstamp_file: sys$assign failed. %P[ Access file QIO failed. ] %P[ Modify file QIO failed. ] %Pstamp_file: sys$dassgn failed. P% P%s[ VMS status = %d ] % P%s[ %s ] P[]*.ZIPP  PP%*PSYS$DISK:[]%6P..%9P.%!;Pwarning: skipped "../" path component(s) in %s %mP creating: %s P P%~PSYS$DISK:[]%PSYS$DISK:[]%PSYS$DISK:[]%PInvalid destination  CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSCHECKDIRDEST_STRUCT_LEVEL SYS$SETDFPROTLIB$SYS_GETMSG SYS$WRITESYS$WAIT SYS$SYNCH SYS$"SEARCHSYS$QIOWSYS$QIOSYS$PUT SYS$PARSESYS$OPEN SYS$NUMTIM SYS$GETJPIW SYS$EXTEND SYS$DASSGN SYS$CREATEdirectory (parse error): %s %PInvalid destination directory (includes file name): %s % PCan not create destination directory: %s %5 PSYS$DISK:[]%A PSYS$DISK:[]%M P.%O P.;P#= p=ף P %R PSYS$OUTPUT P%R %] PV5.4-2 %e PVAX C%l PVMS%p POpenVMS%x P (%s VAX)% P on % PApr 29 2008P<^%U#TR|~$|~ SYS$GETJPIWPSˏS\\ S@!"#<\ ! "\ #ѤT>SeFPRINTF%~~<~ߥ*FPRINTFSPP^%V\W(P CC$RMS_FAB@@STRLENPSYS$OPENPSS1<@~@RR~@FNFILTERPߦd@SPRINTFTdP@lCRbƏnSb7P+Sݮ @dP@lCRb-$ݮ @dP@lCRbPR SYS$CLOSERRN<@~@RR~@FNFILTERPƧ@SPRINTFP@lCRbPPP<^%UTR1|~$|~ SYS$GETJPIWPSˏS\\ S@!"#<\ ! "\ #ѤT>SeFPRINTF%~~<~ߥ*FPRINTF\Ѥ\\EPP r?PG%P^\ahdaquyma}mym^%YWVASSRʏRRn SRʏRRXSRˏR SRˏRSRˏR[xARˏRZ(, CC$RMS_XABDATP( CC$RMS_XABRDTަ|Z[ݮݮ HݮɗSPRINTFd SYS$BINTIMdMEMCPY^%YWVT@Sէէ ѧTTnTnէѧ @RTTX`է1(D CC$RMS_RABƐ(&P CC$RMS_FABfԦ$ff4Ɛ8nէ@ PX6 A,ASTRLENP4ѧ1ASSRʏRR[ SRʏRRZSRˏR SRˏR SRˏRxARˏR(, CC$RMS_XABDATP( CC$RMS_XABRDTݦ|ݮݮ ݮ[Jݮ$ɗSPRINTFd SYS$BINTIMdƈMEMCPYЦ$TP$A/!"##RRƕARQRPЏR RP Q{RPQPQ@4 SYS$CREATE'PXX1{σPXʏPP9P1_?P@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEXSPSSP(` CC$RMS_NAM4R(C!4RA,4RASTRLENP44R4 SYS$CREATEPS RD RBC;ASTRRCHRPR;CSTRRCHRRPPPRRSTRCPYSXP4R4 SYS$CREATEPXX1|Aɷ}SPRINTFSc}(XTT?0P,Tݮ @cP@gCRb.Pݮ @cP@gCRbզ sЦ SS/P/Sݮ @SPRINTFP@gCRb1ݮ @SPRINTFP@gCRb@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEPn ȏƔƮƐ SYS$CONNECTP1<@~@RR~AFNFILTERP@SPRINTFP)@gCRb@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEPahdaquyma}mymnlSPpSSP|^%XWVSէէѧ@RSSn4R`է1n1`RR1R1R1R1<@~@RR~AFNFILTERP@SPRINTFP@gCRb*@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEP(D CC$RMS_RABƐ4RA,4RASTRLENP4ѧ1@ D1ASSRʏRRZ SRʏRRYSRˏR[ SRˏR SRˏRxARˏR(, CC$RMS_XABDATP( CC$RMS_XABRDTަ|ݮݮ ݮZI[ȗSPRINTFd SYS$BINTIMdƈMEMCPY@4RТ$T4RP$4R4R+!4R@4 SYS$CREATEPYY1|| PYʏPP@P1`?P@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEYSPSSP(` CC$RMS_NAM͞4R͞(C͢͠4RA,4RASTRLENP44R4 SYS$CREATEPS͡RD͡RBC;ASTRRCHRPR;CSTRRCHRRPPPRRSTRCPYSYP4R4 SYS$CREATEPYY1,AG}SPRINTFSc}YTT7)P,Tݮ$ @cP@gCRb.Pݮ$ @cP@gCRb4Rբ rs SS(P.Sݮ @SPRINTFP@gCRb0ݮ @SPRINTFP@gCRb@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEP4SRʏR1S SYS$EXTENDPSS1}AtSPRINTFTd= UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1,-Sϓ'P,Sݮ @dP@gCRb.Pݮ @dP@gCRb4Rբ rȖТ SS'P.Sݮ @SPRINTFP@gCRb0ݮ @SPRINTFP@gCRb@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEPƐ84ȏƔƮ8 SYS$CONNECTP1<@~@RR~AFNFILTERPȗ@.SPRINTFP@gCRb@ @FREEH HFREED DFREE< <FREETTRТSRFREEST4SfRSR SFREEPahdaquyma}mymnK`PP0P*P?P *lPψ  | PPp^%XWVSէէѧ@RSSRէ1RnRRSS_SZSUSP<@~@RR~AFNFILTER/P@SPRINTFP@gCRbPSahdaquyma}mymSPPP*PZ?PϠ ϔl P ϓ1P(P CC$RMS_FABf(` CC$RMS_NAM(A,ASTRLENܐP4DCf SYS$PARSEPP"P4|~4 SYS$ASSIGNPP "P @SRRSRSRR<T>R>ScbRST<@*0**<SʏSxRRS,T|~<,|~ ~ SYS$QIOWPTT< TTh1ԭA0PSʏPPP7Pj?PwSSPSSP( P(T?<,|~ ~ SYS$QIOWPTT< T 2RBA(T1AGsSPRINTFTs  SYS$DASSGNPahdaquyma}mym1ϯ ϦPP^WV(` CC$RMS_NAMέ4R(C4RA,4RASTRLENP44R4 SYS$CREATEPSRCRBC;ASTRRCHRPR;CSTRRCHRRPPPRRSTRCPYSP^R4P4 SYS$CREATE^%TZ[RWXS\\U1բ4 \U1PѢ8\U1PѢ8\U1PUSPRINTFVSTRLENYP~<@~@PP~AFNFILTERPo2@fP@bCP`gFFLUSHh ߭FGETSP1j@SPRINTFP@bCP`\<U1߭iP@  ߭iP@@fP@bCP`QQNyQPPN4P P?PPnGPncP+P?P\U<\U2P\U&P߭k@fP@bCP`U1}UP ^[YAԮ4|<|D|TծP<.A 1EXTRACT_IZVMS_BLOCKSPRINTFЮ%1ЮR<ЮRTUeSS%3! CC$RMS_FAB3~ CC$RMS_FABݮT(P41S%G CC$RMS_XABALL3~ CC$RMS_XABALLݮT(PPTPTXRPPRRXԢ1S%G CC$RMS_XABKEY3~ CC$RMS_XABKEYݮT(PLTLTXRLLRRXԢ1{S%# CC$RMS_XABFHC3~ CC$RMS_XABFHCݮT(P<1RPS%+լ1> CC$RMS_XABDAT3~ CC$RMS_XABDATݮT(P@1PS%+լ1  CC$RMS_XABRDT3~ CC$RMS_XABR4DTݮT(PD1PS%# CC$RMS_XABPRO3~ CC$RMS_XABPROݮT(PH1PS% 1U%@P@kCRb1<RR 1wЮS<RRVWVWCRC32ѣP+%8@ P@kCRbVԮV1ZWX UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1O;<Т$4R@$HR'է`Ԣ HS4RТ$4RH$.P(X CC$RMS_XABPROح@R4RТ$4R$8SYS$WAITP!P8Rբ  ݢ  4 SYS$CLOSE϶PP^%TR< *|0 SYS$SYNCHPSP<SS S SYS$CONNECT SYS$CLOSE SYS$BINTIM SYS$ASSIGNCRC32CHECKDIRFNFILTEREXTRACT_IZVMS_BLOCK ZSTRNICMPMAKEWORDEXITMALLOCFREEMEMCPY=STRLENSTRRCHRSTRCHRSTRNCMPSTRCMPSTRCATSTRNCPYSTRCPYSTATFFLUSHSPRINTFFPRINTFFGETS LOCALTIMETIMEUMASKUMASKMKDIR CHECK_FORMAT p< OPEN_OUTFILE FLUSH 4* CLOSE_OUTFILEl T|~,|~ 4 SYS$QIOWPS SYS$DASSGNS< SSS( 2PP^%UݬSTRLENPWPWR޼PB`VV][SPV>a.%BaSRRPЬQ@a^Ba.BaSЬTBdS-TTRPPPRWPP~V~TR~AݬSPRINTF)hTRPPPRWPP~V~TR[ݬSPRINTFP<^SASTRLENPU<.ATUPTP~MALLOCPRRRPTTAMEMCPY잢PTPAݢSTRCPYUP@@PР AP\^%YZV[oЬXݨSTRCATݨHAnըTTTA.ARժRRϡPW4(P CC$RMS_FABff4W1W1DHx?RBTRbxRBVRbxTDR SDXRSb@1DHxRBTRbxRBVRbxT@R SDXRSbxRBTRbxRBVRbxT@RSDXRмSbHYժ`HxRBTRbxRBVRbxTHR SDXRSbHR ЬR xRBTRbxRBVRbxR>SBXRSb1P SBXRSbժ@1QШAШSSRʏRR SRʏRRSRˏR SRˏR SRˏRxARˏR(, CC$RMS_XABDATP( CC$RMS_XABRDTئ|ݮݮ ݮݮ Ю(RBݮ$ɗSPRINTFd SYS$BINTIMdƈMEMCPYxRBTRbxRBVRbxRdSBXRSbxRBTRbxRBVRbxRƈSBXRSbxRBTRbxRBVRbxRBXRb(` CC$RMS_NAM4R(4R,4RSTRLENAڐP4DC4 SYS$PARSEPSS%q{SPRINTFS{[14|~4 SYS$ASSIGNPSS$ɧ{SPRINTFS{Ϣ[1T>R>ScbRST @SRRSRSRR<UxURBVRR>ScbRST|~<,|~ 2 SYS$QIOWPSS< SSSǯώ SYS$DASSGNPЬU\TU߭ LOCALTIMEPSTIMEP߭ LOCALTIMEPScݣݣl~УRBݣ PSPRINTFT SYS$BINTIM\dMEMCPYЏ T>R>ScbRST|~<,|~ 6 SYS$QIOWPSS< SSS SYS$DASSGNP SYS$DASSGNPFPTPP^PP^Rԭ|~߭LIB$SYS_GETMSGPQP@QP^%TRSݬP0ݬݬ @SPRINTFP@bCP`Pݬ @SPRINTFP@CP|^VݬSTRCMPP1ݬSTRCPY(P CC$RMS_FAB(` CC$RMS_NAM44 STRLENP@>86< SYS$PARSEGPPeP< SYS$PARSEPSS SYS$SEARCHPSS%S$P SYS$SEARCHP P7RBP^YTDA[1 SYS$SETDFPROTPFˏˏˏˏ1PUMASKPPUMASKˏ\x L\ʏ\xL\ʏ\xL\\\@\PP.BSXRSRR R   R RRPY1ASTRLEN P PP<P '  | R RR R.PY1ݬSTRLENPS+R[bSR.bSO.yS2ЬRb.).#R-bR.bCRSRR<PݬSTRCPYS.RRbPY11(P CC$RMS_FAB(` CC$RMS_NAMLLRRA؟ASTRLENPЬXV SYS$PARSEP@PJ7SScTcݭMKDIRPRjRTcRPWS޼RCbPwR]Bݏ ZSTRNICMPP1 MKDIRPj P PSTRCPYK5 STRCMPP6A STRCPY MKDIRP j ݬSTRLENRRRRPP<PݬSTRCPYݬSTRLENPPY' <PݬSTRCPYPY  PЏcPP^%VWM ݬSTRCMPP O RPЬRxARSTATPP(P CC$RMS_FAB(, CC$RMS_XABDATrЬݬSTRLENPҞrЏSYS$OPENPP߭ SYS$NUMTIMԭQݭ SYS$DASSGN SYS$CLOSEASSRʏRRX SRˏRYSRˏR SRˏRSRˏRxARˏRdest_struct_level (>adj_dir_name_ods2S|>adj_dir_name_ods50?adj_file_name_ods24@adj_file_name_ods5hAmapnamedEcheckdir  Lcheck_for_newerM return_VMSjDEST_STRUCT_LEVEL AMAPNAME ECHECKDIR LCHECK_FOR_NEWER M RETURN_VMS O SCREENSIZE OSCREEN[LINEWRAP O<VERSIONP$CODE$ $DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGCGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSG ENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATC\HED REPORTMSGZIPNFO COMPILEDWITHENVIRON!INVALIDRESPONSE<ASSUMENO HEX_DIGIT CHAR_PROPRMS_EXT_ACTIVEbRMS_MBC_ACTIVERMS_MBF_ACTIVE( JPI_ITM_LST $CHAR_STRING_CONSTANTSSTRNCPY ߭STRCHRP`S.STRCHRPRQQRP SP\\P0PSQRć Ă ߭x ߭SPRINTF߭Sp Rl RRk e @SPRINTFP@eC\lR ZipInfo mode ("unzip -Z" for usage).F P=> define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe  P -p extract files to pipe, no messages -l f list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir  Pmodifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) g -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %sPSee "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer PiiP-ZP-d P-x P"P"P You must hquote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT. cP[-Z] pPijPExtended Help for UnZiptPjPSee the UnZip Manual for more detailed help|PPUnZip lists and extracts files in zip archives. The default action is toPPextract zipfile entries to the current directory, creating directories asPEPneeded. With appropriate options, UnZip lists the contents of archivesPEPinstead.PPBaASh UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1hisic unzip command line:PP unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir]PPSome examples:P P unzip -l foo.zip - list files in short format in archive foo.zipP STP unzip -t foo - test the files in archive fooPTP unzip -Z foo - list files using more detailed zipinfo formatPP unzip foo - unzip the contents of foo in current dirPj P unzip -a foo - unzip foo and convert text files to local OSP ijPIf unzip is run in zipinfo mode, a more detailed list of archive contentsPjPis provided. The -Z option sets zipinfo mode and changes the availablePPoptions.PPBasic zipinfo command line:P"P zipinfo options archive[.zip] [file ...] [-x xfile ...]P"\P unzip -Z options archive[.zip] [file ...] [-x xfile ...]P\kPBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix basedPPport and is referred to as Unix Apple.P   Punzip options:P P -Z Switch to zipinfo mode. Must be first option.PPP -hh Display extended help. PPnP -A [OS/2, Unix DLL] Print extended help for DLL.PnP -c Extract files to stdout/screen. As -p but include names. Also,PP -a allowed and EBCDIC conversions dolne if needed.P&P -f Freshen by extracting only if older file on disk.P&_P -l List files using short form. P_P -p Extract files to pipe (stdout). Only file data is output and all$PP files extracted in binary mode (as stored).(PP -t Test archive files.,PP -T Set timestamp on archive(s) to that of newest file. Similar to0PcP zip -o but faster.4Pc}P -u Update existing oldmer files on disk as -f and extract new files.8P}P -v Use verbose list format. If given alone as unzip -v show version<PP information. Also can be added to other list commands for more@PWP verbose output.DPWpP -z Display only archive comment.HPpPunzip modifiers:PPP -a Convert text files to local OS format. Convert line ends, EOFTPP marker, and from or to EBCDIC character setn as needed.XP- P -b Treat all files as binary. [Tandem] Force filecode 180 ('C').\P- s P [VMS] Autoconvert binary files. -bb forces convert of all files.`Ps  P -B [UNIXBACKUP compile option enabled] Save a backup copy of eachdP  P overwritten file in foo~ or foo~99999 format.hP ; P -C Use case-insensitive matching.lP; a P -D Skip restoration of timestamps for extracted directories. On VMS thispPa  Po is on by default and -D essentially becames -DD.tP  P -DD Skip restoration of timestamps for all entries.xP  P -E [MacOS (not Unix Apple)] Display contents of MacOS extra field during|P n P  restore.Pn  P -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn ifP  P ACORN_FTYPE_NFS] Translate filetype and append to name.P  P -i [MacOS] Ignore filenames in MacOS extra field. Instead,p use name inP W P standard header.PW q P -j Junk paths and deposit all files in extraction directory.Pq  P -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info.P  P -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.P @ P -L Convert to lowercase any names from uppercase only file system.P@  P -LL Convert all files to lowercase.P  P -M Pipe all output through internal pqager similar to Unix more(1).P  P -n Never overwrite existing files. Skip extracting that file, no prompt.P CP -N [Amiga] Extract file comments as Amiga filenotes.PC|P -o Overwrite existing files without prompting. Useful with -f. Use withP|P care.PP -P p Use password p to decrypt files. THIS IS INSECURE! Some OS showP"P command line to other users.P"HP -q Perform operations qurietly. The more q (as in -qq) the quieter.PHP -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores.PP -S [VMS] Convert text files (-a, -aa) into Stream_LF format.PP -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCIIPfP text escapes where x is hex digit. [Old] -U used to leave namesPfP uppercase if created on MS-DOS, VMS, etc. See -L.PP -UU [UNICODE enabsled] Disable use of stored UTF-8 paths. Note that UTF-8P9P paths stored as native local paths are still processed as Unicode.P9P -V Retain VMS file version numbers.PP -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do notPP match directory separator /, but ** does. Allows matching at specificPIP directory levels.PIdP -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACtL entries under VMS,PdP or UIDs/GIDs under Unix, or ACLs under certain network-enabledPP versions of OS/2, or security ACLs under Windows NT. Can requirePDP user privileges.PD^P -XX [NT] Extract NT security ACLs after trying to enable additionalP^P system privileges.PP -Y [VMS] Treat archived name endings of .nnn as VMS version numbers. P P -$ [MS-DOS, OS/2, NT] Restoure volume label if extraction medium isP QP removable. -$$ allows fixed media (hard drives) to be labeled.PQP -/ e [Acorn] Use e as extension list.PP -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members intoPP locations outside of current extraction root folder. This allows P\P paths such as ../foo to be extracted above the current extraction$P\P directory, which can bve a security problem.(PP -^ [Unix] Allow control characters in names of extracted entries. Usually,P+P this is not a good thing and should be avoided.0P+dP -2 [VMS] Force unconditional conversion of names to ODS-compatible names.4PdP Default is to exploit destination file system, preserving cases and8PP extended name characters on ODS5 and applying ODS2 filtering on ODS2.<PNOPPWildcards:wHPP[P Internally unzip supports the following wildcards:LP[P ? (or %% or #, depending on OS) matches any single characterPPP * matches any number of characters, including zeroTPP [list] matches char in list (regex), can do range [ac-f], all but [!bf]XPaP If port supports [], must escape [ as [[]\PaP For shells that expand wildcards, escape (\* or "*") so unzip can recurse.`PPInclude aB+I UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1[wxnd Exclude:hPP -i pattern pattern ... include files that match a patternlP.P -x pattern pattern ... exclude files that match a patternpP.lP Patterns are paths with optional wildcards and match paths as stored intPlP archive. Exclude and include lists end at next option or end of line.xPP unzip archive -x pattern pattern ...|P()PMulti-part (split) archives (archives created as a set of split files):P)yqP Currently split archives are not readable by unzip. A workaround isPqP to use zip to convert the split archive to a single-file archive andPP use unzip on that. See the manual page for Zip 3.0 or later.P?@PStreaming (piping into unzip):P@_P Currently unzip does not support streaming. The funzip utility can beP_P used to process the first entry in a stream.PP cat archive | funzipPPTzesting archives:PP -t test contents of archiveP(P This can be modified using -q for quieter operation, and -qq for evenP(pP quieter operation.PpPUnicode:PP If compiled with Unicode support, unzip automatically handles archivesPP with Unicode entries. Currently Unicode on Win32 systems is limited.P P Characters not in the current character set are shown as ASCII escapesP iP in{ the form #Uxxxx where the Unicode character number fits in 16 bits,PiP or #Lxxxxxx where it doesn't, where x is the ASCII character for a hexPP digit.PPzipinfo options (these are used in zipinfo mode (unzip -Z ...)):PGP -1 List names only, one per line. No headers/trailers. Good for scripts.PGP -2 List names only as -1, but include headers, trailers, and comments.PP -s List archive entries in shor|t Unix ls -l format. Default list format.P,P -m List in long Unix ls -l format. As -s, but includes compression %.P,vP -l List in long Unix ls -l format. As -m, but compression in bytes.PvP -v List zipfile information in verbose, multi-page format.PP -h List header line. Includes archive name, actual size, total files.PF P -M Pipe all output through internal pager similar to Unix more(1) command.PF  P -t Lis}t totals for files listed or for all files. Includes uncompressedP  P and compressed sizes, and compression factors. P !P -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)P!e!P Default date and time format is a more human-readable version.Pe!!P -U [UNICODE] If entry has a UTF-8 Unicode path, display any charactersP!!P not in current character set as text #Uxxxx and #Lxxxxxx escapesP!~?"P representing the Unicode character number of the character in hex. P?""P -UU [UNICODE] Disable use of any UTF-8 path information.$P""P -z Include archive comment if any in listing.(P""""Pfunzip stream extractor:4P"#P funzip extracts the first member in an archive to stdout. Typically8P#Y#P used to unzip the first member of a stream or pipe. If a file argument<PY##P is given, read from that file instead of stdin.@P###Pfunzip command line:HP##P funzip [-password] [input[.zip|.gz]]LP#$$$Punzipsfx self extractor:XP$-$P Self-extracting archives made with unzipsfx are no more (or less)\P-$q$P portable across different operating systems than unzip executables.`Pq$$P In general, a self-extracting archive made on a particular Unix system,dP$%P for example, will only self-extract under the same flavor of Unix.hP%F%P Regular unzip may still be used to extract embedded archive however.lPF%%%Punzipsfx command line:tP%%P [-options] [file(s) ... [-x xfile(s) ...]]xP%%%Punzipsfx options:P%&P -c, -p - Output to pipe. (See above for unzip.)P&5&P -f, -u - Freshen and Update, as for unzip.P5&b&P -t - Test embedded archive. (Can be used to list contents.)Pb&&P -z - Print archive comment. (See unzip above.)P&&&Punzipsfx modifiers:P&&P Most unzip modifiers are supported. These includeP&%'P -a - Convert text files.P%'D'P -n - Never overwrite.PD'`'P -o - Overwrite without prompting.P`''P -q - Quiet operation.P''P -C - Match names case-insensitively.P''P -j - Junk paths.P''P -V - Keep version numbers.P'(P -s - Convert spaces to underscores.P(1(P -$ - Restore volume label.P1(R(S(PIf unzipsfx compiled with SFX_EXDIR defined, -d option also available:PS((P -d exd - Extract to directory exd.P((PBy default, all files extracted to current directory. This optionP()Pforces extraction to specified directory.P),)-)PSee unzipsfx ma CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSGETENVUSAGEUZ_OPTSUNZIPVERSIONENVARGS GLOBALSCTOR RETURN_VMS ZSTRNICMPHANDLERZI_OPTSPROCESS_ZIPFILESUSAGEUZ_OPTSUNZIPSIGNALSTRLENSTRNCMPSTRCMPISATTYPERRORSPRINTFnual page for more information.P-)\)])P%s a)P%d P^ C$MAIN_ARGS GLOBALSCTORݬݬUNZIPP RETURN_VMSP^XZRVHANDLERTTSIGNALScTcT cTcT cSѬSSˆ޼TdSTRLENdPSSc]SSSS ZSTRNICMPP.hS ZSTRNICMPPѬ@ߨЬSݣSTRNCMPP)ߦ!ߦ߬߬ENVARGSPT1ߦ,PERROR%Ԣߦ f߬߬ENVARGSPT ߦ,PERRORT1SP޼PC`STRLENP`?1<~SߦV@SPRINTFP@bCP` Y1SSբ߬߬ZI_OPTSPT߬߬UZ_OPTSPTլTTY1ЬSc@ЬŒլ1[UWP”Ь¸PSc1Bb1ߨcSTRNCMPP1TSTcbUc¸SQQŒUWc¼SQQbP`?Sccb3P<~Ƽ@SPRINTFP@bCP` Y1T1գS¸ì¸PPPŒrP”j¸ŒqW[ߨ cSTRCMPPHWS¸j¸ŒPUc¸SQQŒUS¼ì¼PPPPUSc1”b0 *<~Ɩ@SPRINTFP@bCP`PROCESS_ZIPFILESPYYP^RUZTYмXVXW1 fS1c-1SPRINTF[PfPPQPSaX1XPP-MP1*PV?PT1PTT PPQQQ T1֢ 1PTTPPQQQT1բ ֢Ԣ 1PTԢT11TԢT11T.<~ż@SPRINTFP@bCP` Pb.<~@SPRINTFP@bCP` PSbSP`qW>WVfbbP`-\<~ż@SPRINTFP@bCP` P<~ż@SPRINTFP@bCP` PcCV' UNZIP.BCKCs*[UNZIP60.VMS-BINARIES]UNZIP.VAX_VAXC_OLB;1'1Sc1Sc1PTTPPQQQT1֢1P1T ԢLԢ T1pL 1dY1\chY1PY1IPTԢ(T1;(14TTTPPQQQTT1֢T1PTT0PPQQQ0T1֢01PTԢtT1t1TԢ4T141TT8PPQQQ8T1֢81PT ԢI(Gcs<^o H]y. 8}ONZ$e[(H(zPW&r4E罕[W~Tu7)t+*>х ]6[v't 01.:;,n3_m$:TlŠ(aMbSIG)v3SLsmؙa_g XxkW ߺ!ZnXIR/II7[.'c %~9*̒lH09=e*p}šX_*m<W ;.}mZqIV@PdcKތ[j{P)u $`ߠFZZ2h%X C7གྷrNs=f I3jsvR^.r{E&:`(nߤk& (/@CT͵`3UWHF뢠1ˏ#)D")faFo^bdYgfN3(ԅik6~ǑWMM@*}Y8t2XN1 }p #,2OA zLZ>@HN+4 {^:?> +q.!@lbNY{ݕ3bϤIݑv"ptk,'a)|h6w#P|Lg9XӂFi?噚 :4&xN+h@.bxfOURD6 c͡Eo. O; W0#|mbo\D4q 3~jHN0ۛ\+B'5Sl`}t8LoZIDlT.*Dz9>ڥ_WS -RBTsW@ݯD[NMM襮X^>8Eߢv m eqbX6Mwʚnw+d|զ+~iYFW?QΏ}&4^%&[y[S!A*D0[#l̙a2=ο$07, AaRic"Z02>]x GNW2P n,-x(/0zPKZ< ?gM-ܽHQO.K.w98 ^ɺرEP7X0rqD_WrftړO%Ў%zb#!ۚfăiNʞJ!W""$u@XxrO5iR1/D::Y[9wԎ9wHnE8.> T+ɱL2Pɋ+%bا49m@6E5=L*-ghbTd# }nv]L9@ iW~oyU-zix#6 `5Ԃc /rK@l(JCss @=DLhruYy/Dea8HǫM4il[ B;ڜNH24otΣˁIBcdiOyaGEo`wةDFY{"m e[#b={ !;'w/b>r|Tgәm& 2ݜj@!Ht#7@ _M%LF0M{;)$Vbv(qbԯ b4K*d_T>(_Gt׵S 圤Q?/)&U-xXh DAeg1OFΒ/Y@Br-a]X 9`š NT|F:Xcե pYs 6Yx%B}I~h/U.K PkAVϕLXbD|~DTa|0Nxw(R$1lXg-V9Z`gr݊Fz4sY/RMg&|sjq!,O񨭜~^{<-͡?6ު j`Gim[2KɼH l<=+65[T= CJJ@|D0-t؜W8OMEV L̙mlJBAhnx_!qAxlfP7 6bvlAdd?4>Ԃ'K5~kaP},+yMkUF/4at-1XP&&0ya yq]w e Eb MzEi^ roJRzTҔ 2ҙΨWIYL%EF84#"z#(ZßOo铉ȃ|e m} Gl8v=W?ʅXg5"S 8-ټ?rj&=(4ixwn"7 NK6Wv~=WfQjߒ %>[j]d)،Ѷ;h>[C&A$Cjyb9+ּ J EG,Ze)Y~%kK^ۡI>ӄ؉`i[[t) +D4 y0+&2Y()H.ǕDn'5`6BsSJqATfz:ݜa쭔K2 9+3U]lFnX*.+둧/@Ep-N_(϶2تub~[ة!jf jc>H4-!0)' ccGGN"P{"IR2 3R܉-8xTWU&OfI ܷPn|lV[ ;j'E=^~UNi`gN{L  %'"z55!,.0qѨ"_͛U.cDU>Mϸ2K8R u\zt\h0 W'k%^4f`{Ҹ}dqmt ܸdJtkQF$Af,L}Hʈv}v p}?Pce\%>RJC'׋io 7]jt4:r$l(r8xriAڊe ?ѹs>K t]213>R@c)ÑY{ U5\N1J@,"Ƞ`RǺ-u|h+M]׍!N=k`Ew GÄ&FjwS;fD#߅$^B EV0lVZg-Z@aA#}; 0[~\4@3ɴNWС\f0=FS :Lê'RBS3F&#2'冝5x`"ˏUNO+LFYe5gc_Wi `;& b-Ӟn#v pZ*Ml0t?]EBLUvړ/mE/9&JS2~ lxt!r< c!Q2T)xp #ayre [+6еxL+3`x]5gv;+ 2ĐԿF\,, Пb8ͪxU1\+GN2T|%P w0D cpS.lդEv0p(0= Y7JKlHǾ <@70(c?jbW+ve(iܖX5zb#oO*;|h0n} +/}F(mօVMJj9-LV;U, S~PV}3_k5;M+R,w(3@8 ME;)x\Ki9Tx]PWI̾XQ~K%&4(uPFHĖs2_35HW:6wcB!-=#)(EEFxl3qԾ MI_9,z4jp*}$=J/[>4J*Aȹx5Q=} F6S}ɼLYrKPe_k8<4lJPV0œg.?nx#>uαoeLZڪ71.7.`HofxPn{|[ 6kxCN @ڀ_Pv|lరޮA/tOkH[p#F 9˜ 9fഔS[YDD93&K=v}to{P^AEg ]KAìև2 y tWPYuA D2,γBM'+Drf#.U^I(sumS7F#0^ yJB.y &@tb,ϳM0Bޅأ \gÜ9Vg޻MF;##* \d4m g: kVnhUM?@AIz UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1ABCDEFGHIJKLMNOPJxMD UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1ePQRSTUVWXYZ[\]^_K UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1_`abcdefghijklmnLB3 UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1.nopqrstuvwxyz{|}Mf UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1}~NXp UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1O( CLI_MEDIUMCLI_ODS2 CLI_ONE_LINE CLI_OVERWRITECLI_PAGE CLI_PASSWORDCLI_PIPE CLI_QUIET CLI_RESTORECLI_RESTORE_DATECLI_RESTORE_DATE_ALLCLI_RESTORE_DATE_FILESCLI_RESTORE_OWN CLI_SCREEN CLI_SHORTCLI_SUPER_QUIETCLI_TESTCLI_TEXTCMDLINE4UNZIP+ VMS_UNZIP_CLD4UNZIPUSAGELINE1 UNZIP_COMMAND4USAGE4UZ_OPTS4 VERSIONDATE VMSCLI_USAGE+ VMS_UNZIP_CLDVMS_UNZIP_CMDLINE4ZIPNFO4__MAIN1+QOPo UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1vQ UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1&RM UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1OS!- UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1UT3 UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1Y1=#V1.0CCCMDLINEV1.029-APR-2009 07:23DEC C V4.1-001  $ABS$i$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$CLI_TEXT  CLI_TEXT_AUTO  CLI_TEXT_ALL  CLI_TEXT_NONE CLI_TEXT_STMLF CLI_BINARY CLI_BINARY_AUTO CLI_BINARY_ALL CLI_BINARY_NONE(CLI_CASE_INSENSITIVE CLI_SCREEN  CLI_DIRECTORY CLI_FRESHENCLI_HELPCLI_JUNK  CLI_LOWERCASECLI_LIST CLI_BRIEFCLI_FULL CLI_FULL_DIAGS  CLI_EXISTING CLI_EXIST_NEWVER CLI_EXIST_OVER CLI_EXIST_NOEXT  CLI_OVERWRITE CLI_QUIET CLI_SUPER_QUIETCLI_TESTCLI_PIPE  CLI_PASSWORD  CLI_TIMESTAMP  CLI_UPPERCASE CLI_UPDATE CLI_VERSION CLI_RESTORE CLI_RESTORE_OWN CLI_RESTORE_DATE(CLI_RESTORE_DATE_ALL(CLI_RESTORE_DATE_FILES CLI_DOT_VERSION CLI_COMMENT CLI_EXCLUDECLI_ODS2  CLI_TRAVERSE CLI_INFORMATION CLI_SHORT CLI_MEDIUMCLI_LONG CLI_VERBOSE CLI_HEADER CLI_TOTALS CLI_TIMES  CLI_ONE_LINECLI_PAGECLI_YYZ CLI_ZIPFILE CLI_INFILE  UNZIP_COMMANDDECC$GXSPRINTFDECC$GA___CTYPE DECC$STRNCPY DECC$STRLEN DECC$STRCPY DECC$CALLOC DECC$FREE DECC$MALLOC DECC$REALLOCGUSAGE8J0VMS_UNZIP_CMDLINE0J VMSCLI_USAGELIB$GET_FOREIGN LIB$GET_INPUTLIB$SIG_TO_RET STR$CONCAT(STR$FIND_FIRST_SUBSTRING0 CLI_TEXT0  CLI_TEXT_AUTO0 CLI_TEXT_ALL0 CLI_TEXT_NONE0 CLI_TEXT_STMLF0 CLI_BINARY0 CLI_BINARY_AUTO0 CLI_BINARY_ALL0 CLI_BINARY_NONE8 CLI_CASE_INSENSITIVE0  CLI_SCREEN0  CLI_DIRECTORY0  CLI_FRESHEN0 CLI_HELP0 CLI_JUNK0  CLI_LOWERCASE0 CLI_LIST0  CLI_BRIEF0 CLI_FULL0 CLI_FULL_DIAGS0  CLI_EXISTING8 CLI_EXIST_NEWVER0 CLI_EXIST_OVER0 CLI_EXIST_NOEXT0  CLI_OVERWRITE0 CLI_QUIET0 !CLI_SUPER_QUIET0 "CLI_TEST0 #CLI_PIPE0 $ CLI_PASSWORD0 % CLI_TIMESTAMP0 & CLI_UPPERCASE0 ' CLI_UPDATE0 ( CLI_VERSION0 ) CLI_RESTORE0 *CLI_RESTORE_OWN 8 +CLI_RESTORE_DATE8 ,CLI_RESTORE_DATE_ALL8 -CLI_RESTORE_DATE_FILES0 .CLI_DOT_VERSION0 / CLI_COMMENT0 0 CLI_EXCLUDE0 1CLI_ODS20 2 CLI_TRAVERSE0 3CLI_INFORMATION0 4 CLI_SHORT0 5 CLI_MEDIUM0 6CLI_LONG0 7 CLI_VERBOSE0 8 CLI_HEADER0 9 CLI_TOTALS0 : CLI_TIMES0 ; CLI_ONE_LINE0 <CLI_PAGE( =CLI_YYZ0 > CLI_ZIPFILE0 ? CLI_INFILE0 @ UNZIP_COMMAND VMS_UNZIP_CLD CLI$DCL_PARSE CLI$PRESENT CLI$GET_VALUE DECC$$SHELL_HANDLERUNZIPUSAGELINE1 OTS$INSV_VOL =GkG;F!0@a/aK$Dk#$~?$8^@^H~PX`޴hpxGG4G ?&$&=4Gb#= $@")Bb4G@Zk!vH  0.0J%F`= @X$F  ."JFB ""]"btG@Zk "BG"GHBHbb@ZkPB? Xb",=4G@Zk0$ G B""0G4G@Zk(ݲ9 8G`BhbGC8@Zk4G8=x`B hb!?HhZ! 8=@Zk%.TGr%HQ%J2F%> `B4Ghb@ZktG%.r%HQ%J2F%> `Bhb4Gp@Zk%.Gr%HQ%J2F%> `B4Ghb@ZkG%.r%HQ%J2F%> `Bhb4Gx@Zk%.Gr%HQ%J2F%> `B4Ghb@ZkG%.r%HQ%J2F%> `Bhb4G@Zk%.tGr%HQ%J2F%> `B4Ghb@ZkG%.r%HQ%J2F%> `Bhb4G@Zk%.Gr%HQ%J2F%>`B4Ghb$X @ZkD8+ G 0JvdJ-"8.D" UJF>TG/yHXKG?4G`Bhb@Zk.qH`Bhb4GPJF> P@Zk.qHPJF> `Bhb4Gp@ZkD;e.Gt%J% SeJw!JtFe>." 4GVJF>4G0/z0HY0K:G0?4G$`Bhb@ZkqH.`B4GhbPJF>x @ZkqH.PJF> `B4GhbtG@Zk.qHPJF> `B$hb`4G @ZkD E.GsJREJSFE> D.tGwJVJF> %`B4Ghb!G@ZkD@B="HbGTG@Zk`B4Ghb@ZkDP.GuEJTJ% F>.xAJ"{PJWJ0"F>P/D TGZPK[GP?Gq.tJSqJtFq>G`B4Ghbh@ZkDC' ( E.GsJ"REJvJSFE>."yJE#UJ`JF>/'@' XKG?e/ [zK`Gz?? Ge.Gt%J'1@SeJtFe> `Bhb4G`@ZkD%.Gr%HQ%J2F%> D.GveJUJF> `B4GhbG@Zk.qHPJF> `BUm UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1hb4G0@ZkD%.Gr%HQ%J2F%> D.TGveJUJF> `B4GhbG@Zk `Bhb4G(@Zk.qH`Bhb4GPJF> @Zk.qHPJF>G.GuEJTJF> `Bhb4G G@ZkD.qHPJF> `Bhb4G @ZkD %.Gr%HQ%Ju'H2F%>. TJF>`Bhb4G8G@ZkD.qHPJF> `Bhb4G@ZkD%.Gr%HQ%J2F%> GD.GveJUJF> `B4GhbG@ZkD@BHb="GTG@Zk`Bhb4GPG@ZkD%,pIA%H0D%< `Bhb4G4G@ZkpH%,`B4GhbA%H0D% D.GuEJTJF> `Bhb4G@G@ZkpH%,A%H0D%< `B4GhbG@ZkD.qIPJF> D.4GuEJTJF> `Bhb4GG@ZkD.qIPJF> D.TGuEJTJF> `B4GhbGH@ZkD.qIPJF> D.TGuEJTJF> `Bhb4GG@ZkD.qIPJF> D.GuEJTJF> `B4GhbGP@ZkD.qIPJF> D.GuEJTJF> `Bhb4GG@ZkD.qIPJF> D.GuEJTJF> `B4GhbGX@ZkD.qIPJF> D.GuEJTJF> `Bhb4GG@ZkDD.qIPJF>G`B4GhbG@@ZkD%,pHA%H0D%< e.Gt%JSeJtFe> `Bhb4GG@ZkD%,pHA%H0D%< De.TGt%JSeJtFe> `B$hb4G @ZkD%,GpIA%H0D%< $ De.tGt%JSeJtFe> `Bhb4G G@ZkD%,pHA%H0D%< De.Gt%J = SeJtFe> 84G`BhbG@Zk8 (=%@,=CC 0D"8r.0@0@SrJ8r>(B0GB"b6B,=GTG@ZkG04GpBxb@Zk$ G08=" B@@Zk(= ,ݢTG'vHG/@'@(0ݠ@BBb,=G@ZkG04GpBxb@Zk$ G0"" BtG@@Zkݠ0=B&vH%@ =bC"@Zk(0%H@ ,@H<04G`BhbG@Zk5@BHb ="GTG@Zk" TG(ݠ,%vH0@@(@0@Bb,=G@ZkG04GpBxb@Zk$ G tG0B'vH$=@bC@Zk(ݠ0&H@ ,@H<="(TG,=!v HG.  @B(=1@0@B5Bb,=G@Zk0G4GpBxb@Zk$ 0("" BtG@@Zk0=B%vH&@=bC"@Zk(ݠ0&H@ ,@H<@4G`BhbG@Zk ="0}","("GGb#k@^(&,ݠ_"TGp@(@0 B@b,=G@Zk0G4GpBxb@Zk$ D0"" B@@Zk="0}","("GGb#C@6BTG(=0b@Zk0$ ,(G0=GC!.!J 0@0BB! 0B0@8bGTG@ZkG$ 0G GBG0A A@Zk@0@ ?R@4}Ӱ4GG8]@]H}PX`ݤhpx#k#4G~^ ^(~08@޴HPX>`^h~pxGGGHB&GPbGGGGG@Zk4G 8B"@b@Zk$ | G((B0b="GTG@Zk Gn@G= G'"TG!v H0 @ !A1A @4BxBb'G@ZkmhBpb ="]"}"GG@Zk4G  B0."0JXFG@ݢG6vJ B @/5#XKK9C] C @ u/ .uKP J$@`+HF >.K/JZKKxJXGK?}0Bk!;v`K" B$9 @E &0!I0@!".tHVJF>f8!IxB3#S/ZYKY?(B0b="GTG@Zk G_(4G_G] ](}08@ݤHPX=`]h}px#kXB`bG4G@Zk$ #GG~ ^(cG80TGTGG"@ZkcTGt4G@ZkGc ](0#kG#4G~^^~ (0޴8@GG#XGGhBpb@ZkG bCHB"@"# #& & E 8"(BGG^h1"0btGGG@ZkGG[GGGG $@Zk8"G(BTG0b1"@ZkGG[GGGG@Zk $8"(BGTG0bx1"@ZkGGG[GGG $@Zk8"G(BTG0b1"@ZkGGGGGI $(B $0bƠ H x"@"GGGGG@ZkGG[GGGG@Zk $8"8BG(BtGƠ81"0bR"@ZkGGG[GGG $@Zk8"G(BTGƠ0b1"@ZkG $[GGGGG@ZkG(BTGƠ0b8"@ZkGGGGG[TGEG@ZkGG]]} (0ݤ8@P#k4GLIB$GET_FOREIGN4b#LIB$GET_FOREIGN4@LIB$GET_FOREIGN4G, STR$CONCAT4 b# STR$CONCAT4(@, STR$CONCAT40GP CLI$DCL_PARSE4Hb# CLI$DCL_PARSE4L@P CLI$DCL_PARSE4`G| DECC$MALLOC4hb# DECC$MALLOC4x@| DECC$MALLOC4G DECC$STRCPY4@ DECC$STRCPY4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT 4 @ CLI$PRESENT4  G4 CLI$PRESENT4 (b# CLI$PRESENT4 0@4 CLI$PRESENT4 TGh CLI$PRESENT4 Xb# CLI$PRESENT4 d@h CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 $G8 CLI$PRESENT4 (b# CLI$PRESENT4 4@8 CLI$PRESENT4 XGl CLI$PRESENT4 `b# CLI$PRESENT4 h@l CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 <GH CLI$PRESENT4 @b# CLI$PRESENT4 V5n UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1=*D@H CLI$PRESENT4 TGx CLI$PRESENT4 Xb# CLI$PRESENT4 t@x CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4  G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 (GL CLI$PRESENT4 0b# CLI$PRESENT4 H@L CLI$PRESENT4 hG CLI$PRESENT4 pb# CLI$PRESENT4 |@ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G  CLI$PRESENT4 b# CLI$PRESENT4 @  CLI$PRESENT4(G@ CLI$GET_VALUE40b# CLI$GET_VALUE4<@@ CLI$GET_VALUE4 @GT CLI$PRESENT4 Hb# CLI$PRESENT4 P@T CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4  @ CLI$PRESENT4 ,G@ CLI$PRESENT4 0b# CLI$PRESENT4 <@@ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT 4 @ CLI$PRESENT4 $ G< CLI$PRESENT4 ( b# CLI$PRESENT4 8 @< CLI$PRESENT4 \ Gt CLI$PRESENT4 ` b# CLI$PRESENT4 p @t CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4 H G\ CLI$PRESENT4 P b# CLI$PRESENT4 X @\ CLI$PRESENT4d G| CLI$GET_VALUE4h b# CLI$GET_VALUE4x @| CLI$GET_VALUE4 | G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G0 CLI$PRESENT4  b# CLI$PRESENT4 , @0 CLI$PRESENT4 t G CLI$PRESENT4 x b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @  CLI$PRESENT4 ` Gx CLI$PRESENT4 h b# CLI$PRESENT4 t @x CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G0 CLI$PRESENT4  b# CLI$PRESENT4 , @0 CLI$PRESENT4 t G CLI$PRESENT4 x b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4 ,GD CLI$PRESENT4 0b# CLI$PRESENT4 @@D CLI$PRESENT4 pG CLI$PRESENT4 xb# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4  G< CLI$PRESENT4 (b# CLI$PRESENT4 8@< CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4LGl DECC$REALLOC4Tb# DECC$REALLOC4h@l DECC$REALLOC4 G DECC$FREE4 b# DECC$FREE 4 @ DECC$FREE4G DECC$STRCPY4@ DECC$STRCPY4G DECC$REALLOC4b# DECC$REALLOC4@ DECC$REALLOC4 G DECC$FREE4 b# DECC$FREE4 @ DECC$FREE40G@ DECC$STRCPY4<@@ DECC$STRCPY4HGh DECC$STRNCPY4Xb# DECC$STRNCPY4d@h DECC$STRNCPY4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4G CLI$GET_VALUE4b# CLI$GET_VALUE4@ CLI$GET_VALWQ1%m UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1U)UE4G DECC$REALLOC4b# DECC$REALLOC4@ DECC$REALLOC4 G$ DECC$FREE4 b# DECC$FREE4  @$ DECC$FREE4<GX DECC$STRNCPY4Lb# DECC$STRNCPY4T@X DECC$STRNCPY4G DECC$REALLOC4b# DECC$REALLOC4@ DECC$REALLOC4 G DECC$FREE4 b# DECC$FREE4 @ DECC$FREE4G DECC$STRCPY4@ DECC$STRCPY4G0 DECC$STRNCPY4 b# DECC$STRNCPY4,@0 DECC$STRNCPY4 XGh CLI$PRESENT4 \b# CLI$PRESENT4 d@h CLI$PRESENT4G DECC$REALLOC4b# DECC$REALLOC4@ DECC$REALLOC4 G DECC$FREE4 b# DECC$FREE4 @ DECC$FREE4G  DECC$STRCPY4@  DECC$STRCPY40GH DECC$REALLOC4@b# DECC$REALLOC4D@H DECC$REALLOC4G DECC$CALLOC4b# DECC$CALLOC4@ DECC$CALLOC4G DECC$STRLEN4@ DECC$ST RLEN4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4G DECC$MALLOC4b# DECC$MALLOC4@ DECC$MALLOC4G  CLI$GET_VALUE4b# CLI$GET_VALUE4@  CLI$GET_VALUE4HG\  DECC$REALLOC4Lb# DECC$REALLOC4X@\ DECC$REALLOCD dGSTR$FIND_FIRST_SUBSTRINGDhb#STR$FIND_FIRST_SUBSTRINGD @STR$FIND_FIRST_SUBSTRING4G CLI$GET_VALUE4b# CLI$GET_VALUE4@ CLI$GET_VALUE 4  G0 DECC$FREE4  b# DECC$FREE4 ,@0 DECC$FREE4`G| OTS$INSV_VOL4x@| OTS$INSV_VOL4 G CLI$PRESENT4 t#  CLI$PRESENT4 @ CLI$PRESENT,GUSAGE,b#USAGE, @USAGE48GdDECC$GXSPRINTF4Pb#DECC$GXSPRINTF4`@dDECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4 G0DECC$GXSPRINTF4$b#DECC$GXSPRINTF4,@0DECC$GXSPRINTF4LGDECC$GXSPRINTF4Tb#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4 b#DECC$GXSPRINTF4@DECC$GXSPRINTF4@GXDECC$GXSPRINTF4Lb#DECC$GXSPRINTF4T@XDECC$GXSPRINTFf f=TEXT=BINARY=SCREEN= FRESHENHELP(=JUNK0=LIST8=BRIEF@=FULLH=QUIETP=TESTX=PIPE`=UPDATEh=0%VERSIONRESTORECOMMENTEXCLUDEODS2=ZIPINFOSHORT=MEDIUM=LONG=VERBOSEHEADER=TOTALS=TIMES=PAGE=ZIPFILEINFILE=unzip = TEXT.AUTO= TEXT.ALL= TEXT.NONE = TEXT.STMLF0= BINARY.AUTO@= BINARY.ALLP= BINARY.NONE`= CASE_INSENSITIVEx= DIRECTORY= LOWERCASE= FULL.DIAGNOSTICS= EXISTING= EXISTING.NEW_VERSION= EXISTING.OVERWRITE= EXISTING.NOEXTRACT= OVERWRITE= QUIET.SUPER(= PASSWORD8= TIMESTAMPH= UPPERCASEX= RESTORE.OWNER_PROTp= RESTORE.DATE= RESTORE.DATE.ALL= RESTORE.DATE.FILES= DOT_VERSION=TRAVERSE_DIRS= ONE_LINE= YYZ_UNZIPD D =Examples (see unzip.txt or "HELP UNZIP" for more info): unzip edit1 /EXCL=joe.jou /CASE_INSENSITIVE => Extract all files except joe.jou (or JOE.JOU, or any combination of case) from zipfile edit1.zip. unzip zip201 "Makefile.VMS" vms/*.[ch] => extract VMS Makefile and *.c and *.h files; must quote uppercase names if /CASE_INSENS not used. unzip foo /DIR=tmp:[.test] /JUNK /TEXT /EXIS=NEW => extract all files to tmp. dir., flatten hierarchy, auto-conv. text files, create new versions. Major options include (type unzip -h for Unix style flags)X#l UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1d: /[NO]TEST, /LIST, /[NO]SCREEN, /PIPE, /[NO]FRESHEN, /[NO]UPDATE, /[NO]COMMENT, /DIRECTORY=directory-spec, /EXCLUDE=(file-spec1,etc.) Modifiers include: /BRIEF, /FULL, /[NO]TEXT[=NONE|AUTO|ALL], /[NO]BINARY[=NONE|AUTO|ALL], /EXISTING={NEW_VERSION|OVERWRITE|NOEXTRACT}, /[NO]JUNK, /QUIET, /QUIET[=SUPER], /[NO]PAGE, /[NO]CASE_INSENSITIVE, /[NO]LOWERCASE, /[NO]VERSION, /RESTORE[=([NO]OWNER_PROT[,NODATE|DATE={ALL|FILES}])] =8/Type "unzip /ZIPINFO" for ZipInfo-mode usage.(=Usage: unzip file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options /modifiers Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s = Type unzip "-Z" for Unix style flags Remember that non-lowercase filespecs must be quoted in VMS (e.g., "Makefile"). miscellaneous options: /HEADER print header line /TOTALS totals for listed files or for all /COMMENT  print zipfile comment /TIMES times in sortable decimal format /[NO]CASE_INSENSITIVE match filenames case-insensitively /[NO]PAGE page output through built-in "more" /EXCLUDE=(file-spec1,etc.) exclude file-specs from listing  = usage: zipinfo file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options or: unzip /ZIPINFO file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options main listing-format options: /SHORT short "ls -l" format (def.) /ONE_LINE just filenames, one/line /MEDIUM medium Unix "ls -l" format /VERBOSE verbose, multi-page format /LONG long Unix "ls -l" format X =80ZipInfo %d.%d%d%s %s, by Newtware and the fine folks at Info-ZIP. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing * or %% (e.g., "*font-%%.zip").  =0 ;7DECC$GA___CTYPE=0 ;=P| 7GDECC$GXSPRINTF;=`=20 April 2009p;USAGE7UNZIPUSAGELINE1=0 8;=  CLI$GET_VALUE DECC$MALLOC CLI$PRESENT DECC$FREE( STR$FIND_FIRST_SUBSTRING DECC$REALLOC=0 8;=0 7DECC$$SHELL_HANDLER=8 OTS$INSV_VOL7LIB$SIG_TO_RET ;;.;";;;;;<;=-d DECC$CALLOC);2;&;(;;;;5;7;@;=;=unzip7 VMS_UNZIP_CLD ; ;+;;9;:;/;;$;p DECC$STRNCPY=08 0;=  DECC$STRCPY>;0;?;7 LIB$GET_INPUT; ;;,;; ; CLI$DCL_PARSE STR$CONCAT LIB$GET_FOREIGN6;8;3;4;';*;1;;=-x DECC$STRLEN;=-P;;;;%;!;#;< <=4< <= 4< < =4< < = 4< < =   4< < =4< < = 04< <= @4< <= P4< <=`4< <=4< <= x4< <= 4< <= 4< <=(4< <= 4< <=04< <=84< <=@4< <=4< <=4 < <=4< <=4< <=4< <= 4< < =H4< <!= 4< <"=P4< <#=X4< < $=(4< <%= 84< <&= H4< <'=`4< <(=h4< <)=p4< <*=X4< <+= p4< <, !=4< <-=4< <.= 4< </=x4< <0=4< <1=4< <2= 4< <3=4< <4= "4< <5=4< <6=4< <7=4< <8=4< <9=4< <:=4< <;=4< <<=Y̎N UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;10" #4< <== 4< <>=4< <?=4< <@=4= ==-%$CMDLINEDEC C V4.1-001v v= 44= __iscntrl4= 0$ $= 4: := $ (4= 0 = 044=vms_unzip_cmdline04=YQ >- >0 >-  ? ? ? ?  ? ? ? &? (? (? ,?   \t_Ė}4{2YT,!f6i+{["qDOV 8\DDn:,k=tRHoO)M!"' hI 뻱F6R3os+A{2q;Zg&o D|xHsig7i#" ?#7}}zgA@$.JS|t2!xBU17ehA/2"85e1H.m4>.3C #m/:wV[>O>>D4 &6/: X,[>n4~eΛ0Y >hAPb[-ծKo'_y*z=t V(6iPWUR* ?KIT `LiH7J&fM+sDiJ0x{b*i"ie$,Ș>2f,c&}4&_]6=11r:)4@$=r-)n{W-ZTά 2KOtKn̛L[ ,] PηW:'fu&e gbr`drj(r_*.nw#[z\!bqe+\rHu6>Q"o68Grp `aEK1(V&"UtRM OKe;=mqXS{7lo!zfgL&\[d` %Or1A!g )li*)[ogzrk#;r}e 7>1!ّdt; 3hi&H`.ia 8+,@JA$Ò!k._,˟PI`2hkT oFmv 䧣;%!tp /o>3j}OyTV6J].n`0Z$hVcՐ-Gu/0jFve$_*feCM=k!z%6}"UwN)N}77JEwEn8)S&lAAg0`l-{0pZ] Klv?WNp\xs!2ek D$^F>[uN̫IX~v1T3%0 LC,dfQxLE +>(ᴧBDv ^Q&aG \#E5@k>dDf2KLqUu3- //%@TAc 5"4GvkUHykߦQ!MpPET?7lEQS壘o6@, Rnpi1{d7qPD?F3/LMG"ڧIX|I6*PBٱ'vHOtZ}FF'Vc|+9?H7@)+KBU2Zv~WOjaJ BE@+=uL)" ",;ͭ1CSakhI5(EdgGTf"t"4G@aV-GCR*pWPV_PF{)~DgT0JAF62/>M_S OS ŦiA^Px"JV3 /-'#zp;K#Q]Gʹk$SP"*b*:]LF $@H FC0YPI.p/g $+QTPI`oGE-HdB!5%AT16^OXK/$wjNcC,]PQ^TL㭿1QAc"CgUS(XTM>{V@T* E`d@?EBvLARGEALM?@ZkfcۛSPN`MyC+KHYNe,P~B1N ̈́>^V`}G,To"dx.y x .SIF^3Bw[(Ϛ%PW_g(O]Pe,dh-G8\g)|0%_GG R ")Sk c\7 Ǭ.G@{kPC$40sPbT!am#)4G 0^a$=^PrTIP $Pg-TMNH%ZL 3g 3$S"T;McE#Hm&EfFPKI#h& Xp$xPTPyJ@ATU[fOT4_&,XJK2G@EoS oP cPMPAAW?azk<_u1KKUGdc$VsjN'(MT G+VZ%G-G<K[^k0$rfa$CT W TX*li[m7w7dK[C6^NP.8]F| dwTA=O9g}SH!K_,~L*/4j@S6h i^0w/f2> awTMV#Doʘi\ǡdE~rvI#n2FKG]+.knM,[lYG\2k/Gd GNICEEzx$ "NEP*utGP|=m/R@A+siS(Z <UoPApIPGM(G}$@zk<FILRDRGXo 0aL Kt/FP$/^DL]LMFEbKHi^KsJ"TcPpU!@8k$iMaPfG:GXs/NyFHd  ;BA"88"|HVM|0(JKg{AP%Hηa )46B vc'o^pMRHF 8/ B GYsFBR D^'PLE|>QGN07)/C 8U1#VB$GVK I% K) ,>[UWE ӗ SQRAEKPC EEa D DVQUT6DRJGSYn ,?72X(O LECIrPi#l$|N.sHCIU&*v{D9'CpE"WTV([: uTMCRR3ztm#GCV BI J EdU"H]II WJK PH/ 0DBP]RPE tv8XH @M]kM`"  UMZY83; aER{@?'f .]N/4 NY E BKTD`7J@IUAXJkjG# )D*VW+bLFC6( F+C`K|HE&WumEܷEP 1!U0k7r`Hf#%N.MJAD+DhHR*FK8ݥ C=MhgoCFHAm\?aI!@XVEogB$ΠKCwm$[ BRm^VS>" ' /HtFН"P,1MH2|RnDI@oKt}KT e[!0,H'rsGU`DA)kd'8{fdD6AU)B"eJG"Ի}[&`Tx TAVY{2S,pMG89 hEk@Q(}hEq)TXȿ #pM"GaZ !L/!SE{!mVKR)AMbG>:%`ѨJGj#@G*m~E>d'^ 7C;XPq<!sɩk5BE4,'@'KI@ L`<Vw $VK0B= `?GuO ]}XCN~F +T3J+F=6Dt/;-ާ4IMc "QEX- 0D ;TKD4<Osvq!鑔-En^ B?~=WrXTF3= a $dg0C8jloZ <` cc2FO"KF7h9 &@I?!/O7U7GYA E*OMF0<8 b"^61K x0"W$,J>aEOJF,<7!B(˧ $ȏ;@,csZ&cig{ mSSme K^\@"(#,"cIIp"Y!PVRJGk6 N v"HOCME={8ML?> pY Q.Zy%I|4DH~-4G3#JG yT>``ݢ;FyR9%%CWIU < '/զ_W4GDs"]?is @1#1"@b%J|NBbF.xCT|\|D7ZCt-T}J@T`&zlx C-HKy'$GxK(U%kxptR ("% cLa-Чw |h!DYzAS{{I!Te^RksE r$ۥG5VL{I3FrirPf/@w=۫TDk D vp=1jHV[BE>V# H6$x( ~&aG )e,HyTH!-G2 JӆHVE_8pVE jBP`yVW]heV0~ %j^j,.Fe W{ACs(JV,T+LC 6n Z _%ov.aڱkzFA-I0%bM .?l3^0ދ"2~9IX>qn4llKش4@d=)p@1s $)te&Uic0uL(=r&fp)of#tQD 3xn}u!~,e0M8!7 jlB&rkM#>pk'@:.m"w1e_'LZ@B$]~.rts4`Kq')?Q$L/ϜaRiK&*0i Y .{6a\t~Q u8M5`Ib$[+{3uPr+ e; .5+YMh|an*)z}%Gg4$C>[fir=;q@5 wOb?+MKCfz3W+x^#jA1HgY!=( VÚ' Y.!dProj 3282#o~ȗ"Db3b,}&"4F-cBPr.P7pdx:s,M93j""(b0tGW}Oua3y"C& Ɏzi> ~&Z49Tfn7jgPq[! UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1C12 DIAGNOSTICS$L CONVTXT_KEYWORDS$p AUTO$ =ALL$ NONE$STMLF$ CONVBIN_KEYWORDS=$$ AUTO$H ALL$NONEL  =4 ` , d (X    43 =  $ p D T $ p  = `  ` 8  <  =   << T H `t  =   `  <<  =<<8Hp L hxL =  p    =PH  0< T  ww51&V1.0AAUNZIPV1.029-APR-2009 07:23DEC C V4.1-001  $ABS$i$CODE$*. $LITERAL$$LINK$$DATA$$BSS$ $READONLY$D MASK_BITS VERSIONDATEP ENDSIGMSGH CENTSIGMSG@SEEKMSG (FILENAMENOTMATCHED(0EXCLFILENAMENOTMATCHE6D REPORTMSGZIPNFO ( COMPILEDWITH HUNZIPUSAGELINE1DECC$GXSPRINTF DECC$PERROR DECC$ISATTYDECC$GA___CTYPE DECC$STRNCMP DECC$STRLEN DECC$STRCMP DECC$SIGNAL DECC$GETENV GLOBALSCTORG(JMAIN(J(UNZIP(JHUZ_OPTS(JP7XUSAGE PROCESS_ZIPFILESZI_OPTSHANDLER ZSTRNICMP RETURN_VMS VMS_UNZIP_CMDLINE VMSCLI_USAGEENVARGSVERSION0  MASK_BITSFNAMES0  VERSIONDATE0 CENTSIGMSG0 ENDSIGMSG( SEEKMSG8 8FILENAMENOTMATCHED8 EXCLFILENAMENOTMATCHED0  REPORTMSG( ZIPNFO0  COMPILEDWITH0 UNZIPUSAGELINE1(J__MAIN DECC$MAIN DECC$EXIT =#4G~^ ^(GG#0B  = > 8b@Zk =b# @ BG(b4G@ZkG] 9](0#kG#G~^^ ~(GGG8B@b=@Zk=G`b#@(BG0b4G@ZkG]4G] }(0#kG#TG~^^ ~(08޴@GG TG(B="0b@ZkG(BTG"0b@ZkG(BTG"0b@ZkTG(BTG"0b@ZkG(BTG"0b@ZktG(BTG"0b@Zk "B="bTG@@Zk =hHB5 @$0G@Zk B]R"@TB#`@G.JF / KkD` , H+D :@/ @KKG @ @?@`.JF @B` "bGGtG@Zk""#BbGTGtG@Zk"" }=TGtGc `8B@b@Zkb "B="bGXc c"G@ZkG@"G4Gdb "B="bGxc c"G@ZkG "XB`b4G@Zk9 }4GGc %`G`??"HB@ @@Zk@ }0@B SB &"HB &u Pb1"GtG@ZkGG[GG"G@ZkTGG ";="TGBb@ZkG "=" b#@G =G ?@FG= &GGQ1"$" =T 䳸$G$""TG8 8BtG@b@Zk2%=1"$@ `Gd3@cJpFtBW`Jd 峼5@JpFBWJ/K% @ $9@Ee#!aC =#HN@pDd @WH  B L(hB""@ZkĢ 4GD䳸 `G峸$9@#Kp D!CW H$=" }0B<Jp@FBWJ0pB %G4G G &" D'Pb HBu1"GTG@ZkGG[GG"G@ZkTG&G4Gİ䳸4G$ $& D&q ?@"TG0D HBPb1"G@ZkGG[GG"G@ZkxBGb@ZkGG]G] }(08ݤ@P#kp#~^^~ (0޴8@H>P^X~`hp޵xGGG#GGG G 4G_!'1@QO ,`! H%DJ= K.+ k!AAJ'H? %@ @\@CkG0@ B  @D G " 0@ G B @DG " A0@BA GG BRG "GG @G jCL}@G"l,H @!'1@ @.@JDK.KJ? ,k! H+,k!+H?G @2FB@F@G "0@G BGL L@ @Ã?+,>TG+H-D4 D G| BG(wG "(AsG T@2FB@FT@Gj "T0@TeG B0 @D0G\ "00@0WG BGtQG t@MG "G4GG B4RCG 8 !&@ D8 G: B80@85G "_"G< @D<* B? <R@<#G (C-?' m@.@J @K H!'1@M2,2H%D- K.KJ +,k!+H? ,k! H?G "<A2FB@F<AG < 0 @< G BG@G @@G "GDG BDRG GHG "HAG BGLG L@G "G0AG B0G T !&@ DT G BT0@TTGT2G GX೫G "XAG B` @D`G "`0@`G BGdG d@G "hA2FB@FhAG @h 0 @h G TG(B" E&0b $ҡ!G@ZkGG[GG"G@Zk4GkG GleG ¥lNaG p !&@ Dp GX p00 Bp0SG4GP TG"(B O&0b o&ҡs 1"G@ZkGG[GG"G@ZkTG $"(B $ 0b01"GTG@ZkGG[GG"G@ZkTGG $" = (B $Ơ 0b1"GTG@ZkGG[GG"G@ZkTGy\pԉ UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1O@AG %"(B ,%)!0b1"GTG@ZkGG[GG"G@ZkTGcG BTG"(B j%0b %k!p1"G@ZkGG[GG"G@ZkTGL m$"(B %c!0bp1"GTG@ZkGG[GG"G@ZkTG7G $"(B $ 0bp1"GTG@ZkGG[GG"G@ZkTG!G B& ð X Eb % G!MA(B %0b-IΡ mA""MGtG@ZkG 0A[GGGGGA@Zk8BG@b4BG@Zk ¤ &4DơLF?AA桫A_A -E lE E`@ &$" &(B0!G0bP1"TG@ZkGG[GG"G@Zk4G TG! fTG!Ʊ F@@4 $8& &$"a!A?A1" -E (BG0bTG@ZkGGG[G"G@Zk8t4G4GBb@ZktGA'1@E  &%TF f%<k!)p""Y@A!GEv (B0bGX_"tG@ZkGGGGGdG¥ %(B %!Chb!0bH"G~GGGGG@ZkG $[GGGGG@Zk."(BGTG0b %@ZkGGG[GGG@ZkGXB F%`b $ $@Zk(B."G0bTG@ZkGGG[GGG@Zk."(BPN"JG0btG@ZkGGG[GGG@Zk."(BN"G0btG@ZkGGG[GGG@Zk."(BN"G0btG@Zk %GG[GGGG@Zk(B."N"0bGtG@ZkG f%[GGGGG@Zk."(DBN"kG0btG@Zk &%GG[GGGG@Zk(B.")(N"0bGtG@ZkG f$[GGGGG@Zk."(B`N"cG0btG@Zk %GG[GGGG@Zk(B."N"0bGtG@ZkG $[GGGGG@Zk."(B"H"0bGTGtGG@ZkG %[GGGGG@Zk."(BGTG0b F%@ZkGGG[GGG@Zk"B4Gb@Zk@J@."N",H@Dn!(BD0bGGG@ZkGGE[GGGG@Zk &%B"b4G@Zk@)@."N"`-I@dD!(B`D0bGGG@ZkGG[GGGG@ZkB %b"4G@Zk@@."N",H@DN!(BD0bGGG@ZkGG[GGGG@Zk %B"b4G@Zk@@."N"`,`H@D!(BD0bGGG@ZkGGGGG[G@ZkG&4G8B@b %E4 EG@ZkGơDHfhFTE`3A@ƱàFGG]]} (0ݤ8@H=P]X}`hpݥx#kG#tG~G^G^TG~ (0޴8@HGG#bG⤤C@" & ? $` B X (bG  G@ZkG $[GGGGG@Zk'" BGTG(b@ZkG $[GGGGG@Zk'" BxG"G(btG@ZkGGG[GGG@Zk $"GTG81"h $ B $` (b@"("GGGGG@ZkGG $[GGGGG@Zk B 0B"(be"GGG@ZkGG[GGGG@Zk $ B%"G(bTG@ZkGGG[GGG@Zk $ B%"E"(bGtG@ZkG $[GGGGG@Zk%" B0E" e"(bGG@ZkG $[GGGGG@Zk(%"E"he"h"GG BTG(bE@ZkGG[GGGG@ZkG]G]} (0ݤ8@HP#k4%$GH DECC$MAINH4&<b# DECC$MAIN4%D@H DECC$MAIN4#XGl DECC$EXIT4$`b# DECC$EXIT4#h@l DECC$EXIT4!G GLOBALSCTOR4"b# GLOBALSCTOR4!@ GLOBALSCTOR 4G RETURN_VMS4 b#I RETURN_VMS4@ RETURN_VMS4@GT DECC$SIGNAL4Lb#( DECC$SIGNAL4P@T DECC$SIGNAL4XGl DECC$SIGNAL4db#( DECC$SIGNAL4h@l DECC$SIGNAL4pG DECC$SIGNAL4|b#( DECC$SIGNAL4J@ DECC$SIGNAL4G DECC$SIGNAL4b#( DECC$SIGNAL4@ DECC$SIGNAL4G DECC$SIGNAL4b#( DECC$SIGNAL4@ DECC$SIGNAL4G DECC$SIGNAL4b#( DECC$SIGNAL4@ DECC$SIGNALK< GVMS_UNZIP_CMDLINE<b#(VMS_UNZIP_CMDLINE< @VMS_UNZIP_CMDLINE4G  DECC$STRLEN4@  DECC$STRLEN4G ZSTRNICMP4b#( ZSTRNICMP4@ ZSTRNICMP4G ZSTRNICMP4Lb#( ZSTRNICMP4@ ZSTRNICMP4G$ DECC$STRNCMP4b#( DECC$STRNCMP4 @$ DECC$STRNCMP,0GTENVARGS,8b#(ENVARGS,P@TENVARGS,xGENVARGS,b#(ENVARGS,@ENVARMGS4G DECC$PERROR4b#( DECC$PERROR4@ DECC$PERROR4G DECC$STRLEN4@ DECC$STRLEN4G4DECC$GXSPRINTF4 b#(DECC$GXSPRINTF40@4DECC$GXSPRINTF, tGZI_OPTS, xb#(ZI_OPTSN, |@ZI_OPTS4G$ DECC$STRNCMP4b#( DECC$STRNCMP4 @$ DECC$STRNCMP4G DECC$STRCMP4@ DECC$STRCMP4b#(DECC$GXSPRINTF4GDECC$GXSPRINTF4@DECC$GXSPRINTF4LG`DECC$GXSPORINTF4Pb#(DECC$GXSPRINTF4\@`DECC$GXSPRINTF<GPROCESS_ZIPFILES<b#(PROCESS_ZIPFILES<@PROCESS_ZIPFILES4hGDECC$GXSPRINTF4tb#HDECC$GXSPRINTF4@DECC$GXSPRINTF4,GPDECC$GXSPRINTF4]ݓz UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1OP4b#HDECC$GXSPRINTF4L@PDECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF40GTDECC$GXSPRINTF 4@b#HDECQC$GXSPRINTF4P@TDECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF48G\DECC$GXSPRINTF4Hb#HDECC$GXSPRINTF4X@R\DECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4G$ VMSCLI_USAGE4b#H VMSCLI_USAGE4 @$ VMSCLI_USAGE4xGDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4SG4DECC$GXSPRINTF4(b#HDECC$GXSPRINTF40@4DECC$GXSPRINTF4hGt DECC$ISATTY4lb#H DECC$ISATTY4p@t DECC$ISATTY4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4GHDECC$GXSPRINTTF4 b#HDECC$GXSPRINTF4D@HDECC$GXSPRINTF4pGDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF, GVERSION, b#HVERSION, @VERSION4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4U@DECC$GXSPRINTF4G$DECC$GXSPRINTF4b#HDECC$GXSPRINTF4 @$DECC$GXSPRINTF4HGdDECC$GXSPRINTF4Xb#HDECC$GXSPRINTF4`@dDECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPVRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4G,DECC$GXSPRINTF4 b#HDECC$GXSPRINTF4(@,DECC$GXSPRINTF4PGpDECC$GXSPRINTF4`b#HDECC$GXSPRINTF4l@pDECC$GXSPRINTF4GWDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4 GHDECC$GXSPRINTF40b#HDECC$GXSPRINTF4D@HDECC$GXSPRINTF4pGDECC$GXSPRINTF4Xb#HDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$GETENV4b#H DECC$GETENV4@ DECC$GETENV4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4(G< DECC$GETENV40b#H DECC$GETENV\ Y\ 48@< DECC$GETENV4dGDECC$GXSPRINTF4lb#HDECC$GXSPRINTF4|@DECC$GXSPRINTF4G DECC$GETENV4b#H DECC$GETENV4@ DECC$GETENV4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@ZDECC$GXSPRINTF4 G4 DECC$GETENV4(b#H DECC$GETENV40@4 DECC$GETENV4\GxDECC$GXSPRINTF4db#HDECC$GXSPRINTF4t@xDECC$GXSPRINTF4G VMSCLI_USAGE4b#H VMSCLI_USAGE4@ VMSCLI_USAGE4[GDECC$GXSPRINTF4b#PDECC$GXSPRINTF4@DECC$GXSPRINTF4(G@DECC$GXSPRINTF48b#PDECC$GXSPRINTF4<@@DECC$GXSPRINTF4hGDECC$GXSPRINTF4xb#PDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4\b#PDECC$GXSPRINTF4@DECC$GXSPRINTF4(GPDECC$GXSPRINTF48b#PDECC$GXSPRINTF4L@PDECC$GXSPRINTF4xGDECC$GXSPRINTF4b#PDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#PDECC$GXSP]RINTF4@DECC$GXSPRINTF4G DECC$GXSPRINTF4b#PDECC$GXSPRINTF4@ DECC$GXSPRINTF4`GtDECC$GXSPRINTF4hb#PDECC$GXSPRINTF4p@tDECC$GXSPRINTF ====^ =(=0=8=@=H=P=X=`=h=p=x===^>N UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1/<^_==============`==== =PDExtended Help for UnZipSee the UnZip Manual for more detailed helph= instead.x=(Basic unzip command line:=Some examples:=H: unzip -t foo - test the files in archive fooa= options.=(Basic zipinfo command line:=H: zipinfo options archive[.zip] [file ...] [-x xfile ...]X=H; unzip -Z options archive[.zip] [file ...] [-x xfile ...]=0'port and is referred to as Unix Apple.=unzip options:=@6 -Z Switch to zipinfo mode. Must be first option.=( -hh b Display extended help.(=@5 -A [OS/2, Unix DLL] Print extended help for DLL.`=H; -a allowed and EBCDIC conversions done if needed.=H9 -f Freshen by extracting only if older file on disk.=0$ -l List files using short form.=@5 files extracted in binary mode (as stored).@=( -t Test archive files.c`=( zip -o but faster.=( verbose output.=0% -z Display only archive comment.= unzip modifiers:=w marker, and from or to EBCDIC character set as needed. overwritten file in foo~ or foo~99999 format.X=0& -C Use case-insensitive matching.=H: is on by defadult and -D essentially becames -DD.=@7 -DD Skip restoration of timestamps for all entries.=  restore.=( standard header.0=0' -LL Convert all files to lowercase.X=H9 -N [Amiga] Extract file comments as Amiga filenotes.= care.=0& command line to other userse.=H< uppercase if created on MS-DOS, VMS, etc. See -L.=PC -V Retain VMS file version numbers. directory levels.X=( user privileges.x=( system privileges.=0( -/ e [Acorn] Use e as extension list. =@5 directory, which can be a security problem.=H9 this is not a gfood thing and should be avoided.8= Wildcards:H=@5 Internally unzip supports the following wildcards:=H= * matches any number of characters, including zero=8, If port supports [], must escape [ as [[]= Include and Exclude: =H> -i pattern pattern ... include files that match a patternH =H>g -x pattern pattern ... exclude files that match a pattern =8) unzip archive -x pattern pattern ... =h_ use unzip on that. See the manual page for Zip 3.0 or later.Streaming (piping into unzip): =8/ used to process the first entry in a stream.H =( cat archive | funziph = Testing archives: =0% -t test contenths of archive =  quieter operation. = Unicode: = digit. =H> -v List zipfile information in verbose, multi-page format. =@7 and compressed sizes, and compression factors.X =H< -UU [UNICODE] Disable use of any UTF-8 path information. =@1 -z Include archive comment if any in listing.i =(funzip stream extractor: =@2 is given, read from that file instead of stdin.( = funzip command line:@ =0' funzip [-password] [input[.zip|.gz]]h =(unzipsfx self extractor: = unzipsfx command line: = unzipsfx options: =@3 -c, -p - Output to pipe. (See above for unzipj.) =8- -f, -u - Freshen and Update, as for unzip. =@6 -z - Print archive comment. (See unzip above.)X = unzipsfx modifiers:p =@5 Most unzip modifiers are supported. These include =( -a - Convert text files. =( -n - Never overwrite. =PD -o - Overwrite without prompting. -q - Quiket operation.0=8+ -C - Match names case-insensitively.`=  -j - Junk paths.x=0! -V - Keep version numbers.=8* -s - Convert spaces to underscores.=0! -$ - Restore volume label.=0% -d exd - Extract to directory exd. =8*forces extraction to specified directory.lP=8/See unzipsfx manual page for more information.=XJUnZip lists and extracts files in zip archives. The default action is to=XJextract zipfile entries to the current directory, creating directories as =needed. With appropriate options, UnZip lists the contents of archives unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir] unzip -l foo.zip - list files in shormt format in archive foo.zip=XJ unzip -Z foo - list files using more detailed zipinfo formatP=PE unzip foo - unzip the contents of foo in current dir=XI unzip -a foo - unzip foo and convert text files to local OS =XJIf unzip is run in zipinfo mode, a more detailed list of archive contents8=is provided. _ UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1mnThe -Z option sets zipinfo mode and changes the availableBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix based= -c Extract files to stdout/screen. As -p but include names. Also, -p Extract files to pipe (stdout). Only file data is output and allh=PG -T Set timestamp on archive(s) to that of newest file. Similar to= -u Update existing older files on disk as -f and extracto new files. -v Use verbose list format. If given alone as unzip -v show versionH=XI information. Also can be added to other list commands for more=PF -a Convert text files to local OS format. Convert line ends, EOF=PF -b Treat all files as binary. [Tandem] Force filecode 180 ('C').(=XK [VMS] Autoconvert binary files. -bb forces convert of all files.px=PF -B [UNIXBACKUP compile option enabled] Save a backup copy of each=XN -D Skip restoration of timestamps for extracted directories. On VMS this=XN -E [MacOS (not Unix Apple)] Display contents of MacOS extra field during`=XJ -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn if=PA ACORN_FTYPE_NFS] Translate filetype and appqend to name.=XL -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name inH=PA -j Junk paths and deposit all files in extraction directory.=XI -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info.=PE -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.(=PG -L Convert to lowercase any names fromr uppercase only file system.p=PG -M Pipe all output through internal pager similar to Unix more(1).=XN -n Never overwrite existing files. Skip extracting that file, no prompt.=XN -o Overwrite existing files without prompting. Useful with -f. Use withX=XI -P p Use password p to decrypt files. THIS IS INSECURE! Some OS show= -q Perform operationss quietly. The more q (as in -qq) the quieter. -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores.8=PA -S [VMS] Convert text files (-a, -aa) into Stream_LF format.=XO -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCII=XJ text escapes where x is hex digit. [Old] -U used to leave names =XM -UU [UNICODE enabled] Disable use of sttored UTF-8 paths. Note that UTF-8p=XL paths stored as native local paths are still processed as Unicode.=XL -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do not= match directory separator /, but ** does. Allows matching at specific -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACL entries under VMS,= or UIDs/GIDs under Unix, oru ACLs under certain network-enabled versions of OS/2, or security ACLs under Windows NT. Can requireH=PG -XX [NT] Extract NT security ACLs after trying to enable additional=XI -Y [VMS] Treat archived name endings of .nnn as VMS version numbers. =PG -$ [MS-DOS, OS/2, NT] Restore volume label if extraction medium is(=XI removable. -$$ allows fixed media (harvd drives) to be labeled.x=XO -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members into=XK locations outside of current extraction root folder. This allows=XK paths such as ../foo to be extracted above the current extractionh=XO -^ [Unix] Allow control characters in names of extracted entries. Usually=XN -2 [VMS] Fworce unconditional conversion of names to ODS-compatible names. =XM Default is to exploit destination file system, preserving cases andX =XO extended name characters on ODS5 and applying ODS2 filtering on ODS2. =PG ? (or %% or #, depending on OS) matches any single character =XM [list] matches char in list (regex), can do range [ac-f], all but [!bf]@!x=XM For shells that expand wildcards, escape (\* or "*") so unzip can recurse.!=XJ Patterns are paths with optional wildcards and match paths as stored in!=XI archive. Exclude and include lists end at next option or end of line.0"=Multi-part (split) archives (archives created as a set of split files): Currently split archives are not readable by unzip. A workaround is"=PGy to use zip to convert the split archive to a single-file archive and#=XI Currently unzip does not support streaming. The funzip utility can beX#= This can be modified using -q for quieter operation, and -qq for even If compiled with Unicode support, unzip automatically handles archives#= with Unicode entries. Currently Unicode on Win32 systems is limited. Characters not in the current character sezt are shown as ASCII escapes$=XI in the form #Uxxxx where the Unicode character number fits in 16 bits,$=XI or #Lxxxxxx where it doesn't, where x is the ASCII character for a hex(%=PAzipinfo options (these are used in zipinfo mode (unzip -Z ...)):p%=XN -1 List names only, one per line. No headers/trailers. Good for scripts.%=XJ -2 List names o{nly as -1, but include headers, trailers, and comments.&=XM -s List archive entries in short Unix ls -l format. Default list format.`&=XJ -m List in long Unix ls -l format. As -s, but includes compression %.&= -l List in long Unix ls -l format. As -m, but compression in bytes. -h List header line. Includes archive name, actual size, total files.H'=XN -M Pipe all outpu|t through internal pager similar to Unix more(1) command.'=XL -t List totals for files listed or for all files. Includes uncompressed'=XN -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)8(=PG Default date and time format is a more human-readable version.(=XJ -U [UNICODE] If entry has a UTF-8 Unicode path, display any characters(=`%? UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1|}XI not in current character set as text #Uxxxx and #Lxxxxxx escapes )=XK representing the Unicode character number of the character in hex.p)=PG funzip extracts the first member in an archive to stdout. Typically) =XJ used to unzip the first member of a stream or pipe. If a file argument*=PD Self-extracting archives made with unzipsfx are no more (or less)~P*=PF portable across different operating systems than unzip executables.*=XJ In general, a self-extracting archive made on a particular Unix system,*=PE for example, will only self-extract under the same flavor of Unix.0+=PG Regular unzip may still be used to extract embedded archive however.x+=XJ [-options] [file(s) ... [-x xfile(s) ...]]+=PC -t - Test embedded archive. (Can be used to list contents.),=PGIf unzipsfx compiled with SFX_EXDIR defined, -d option also available:X,=KCBy default, all files extracted to current directory. This option ,=XXXXXXXXXXX XXXXXXXX0XXXXXXXHXXXX pX@XXXXXX `hXXXXpXXHXXh You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT.   DECC$ISATTY,;=%s  ;0 DECC$GETENV;=0 ;= 7GDECC$GXSPRINTF VMSCLI_USAGE= VERSION;=%d =-x ZI_OPTS VMS_UNZIP_CMDLINE;7FNAMES ZSTRNICMPENVARGS7HANDLER=0 ;=P| P DECC$SIGNAL DECC$STRNCMP DECC$STRLEN DECC$PERROR DECC$STRCMP PROCESS_ZIPFILES=-d=-Z=ii=0 ;=0  RETURN_VMS! GLOBALSCTOR=0 ;=0 # DECC$EXIT% DECC$MAIN=0 X;= P "x;=[-Z]  4 44844444 4h4 4x4h4(444044844@4P4H44P44844X444X4`444h4p4444(44`44444@4h4`444H444x44444(4x4 4X444444`4444H444(404p44X444X444484444 4p444484`444X4H4x444(44x4444h444 4X 44484H4 44 44@!444 4H 4!4!4 440"4x"4"4 44 4#4 4H 44h 4 4X#4 44 4#4#48$4$4$4 444(%4p%4%4&4`&4&4 4&4H'4'4 4'48(4(4(4 )4X 4 444 4p)4)4 44( 4@ 444h 4*4P*4*4*40+44 4x+44 4 4 4+4 44X 4l lp 4 4 4 4404`4x4444,44X,4 44P44 =vms.c=[none]a  UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1IV=VMSCLI= UNZIP_OPTS(= UNZIPOPT8= ZIPINFO_OPTSH= ZIPINFOOPTX=8*envargs: cannot get memory for arguments=pferror: command line parameter #%d exceeds internal size limit caution: not extracting; -d ignored =verror: -d option used more than once (only one exdir allowed) error: must give decryption password with -P option h=@1caution: both -n and -o specified; ignoring -o =0" -T timestamp archive to latest=0' -X restore owner/ACL protection info=(* or % (e.g., "*font-%.zip")=8+ -M page output through built-in "more" @=0$UnZip special compilation options: h= %s x=8) UnZip and ZipInfo environment options: =XM%16s: %.1024s COPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)=SET_DIR_ATTRIB= TIMESTAMP=H:USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)X=@2USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)=@6LARGE_FILE_SUPPORT (large files over 2 GiB supported)=H?ZIP64_SUPPORT (archives using Zip64 for large files supported)=8- [decryption, version %d.%d%s of %s] 8= 05 Jan 2007H=8+-Z => ZipInfo mode ("unzip -Z" for usage).x=PCerror: must specify directory to which to extract with -d option =XJerror: -Z must be first option for ZipInfo mode (check UNZIP variable?) =XMerror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid `=`Q unzip "-V" foo "Bar" (Quote names to preserve case, unless SET PROC/PARS=EXT) = -Y treat ".nnn" as ";nnn" version -2 force ODS2 names --D restore dir (-D: no) timestamps -M pipe through "more" pager (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.) =ZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing %s. usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] @=0& main listing-format options: -s short Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format h =miscellaneous options: -h print header line -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive %s -x exclude filenames that follow from listing UnZip %d.%d%d%s of %s, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details.  =Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ; see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites.   =Usage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s X =`Q=> define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe  =pa -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir =modifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %s=See "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer x x6=H@??. .=20 April 2009i i =QI note: didn't find end-of-central-dir signature at end of central dir. g g =OGerror: expected central file header signature not found (file #%lu). \ \ =D<error [%s]: attempt to seek before beginning of zipfile %sD D =,$caution: filename not matched: %s M M =5-caution: excluded filename not matched: %s = (please check that you have transferred or created the zipfi le in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) ( (=zipinfoC C=+#Compiled with %s%s for %s%s%s%s. g g=OGUnZip %d.%d%d%s of %s, by Info-ZIP. For more details see: unzip -v. ; ;=+#"UNZIPDEC C V4.1-001? ?= 4=TRANSFER$BREAK$GO# #= __iscntrl =  = 44= main4=,$# u- u- u-$$ $= 4: := 4= c c= 4(4= unzip4= -j -j -j . . . . . . .  . . . .  . .  . . . . . ."" / 8/ /! G/ G/ L/ `/ a/ @/) k/ k/s n/ q/ u/ @/7 @/ d/ e/ ~/ ~/ ~/,$ $=  4. .=  4=  = . .=  4= . .= bia UNZIP.BCKms([UNZIP60.VMS-BINARIES]UNZIPCLI.AXP_OLB;1-DIFFS.TXT;1  4=  =  = : := 4= { {= 4H4= uz_opts4= / /  / /  /  0 0  $0 60  >0  C0 I0 L0 f0 y0  0 0 0 0  0 0  0 0 0 0 0  0 0  1 1 1 <1 C1 J1 Q1  a1 j1 u1 1 1 1 1  ?0 1 18 3 3 3 1 1 1 1 1 1 1 1 2 2 3 2 2 3 3 3f  3O  M4 a4 f4 4( 4( 4  4  4 4 4 4h 2 2 (2 (2 -2T$ $= 4. .=  4=  = . .=  4= . .=  4=  =  = : := 4= ! != X4P4= usageX4= 2 2 2 2 2  2 2  2 2 2 2 2 26 2 2 2 24$ $= \4: := 4= p' '=# help_extended = + +='show_version_info = ` `= 44= __main4: := h4=  =  ww)*[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1+,b./ 4-s0123 KPWO56`#789GHJ % Librarian I01-29`#hN:r0P++p6 CENTSIGMSG CLI_BINARYCLI_BINARY_ALLCLI_BINARY_AUTOCLI_BINARY_NONE CLI_BRIEFCLI_CASE_INSENSITIVE CLI_COMMENT CLI_DIRECTORYCLI_DOT_VERSION CLI_EXCLUDE CLI_EXISTINGCLI_EXIST_NEWVERCLI_EXIST_NOEXTCLI_EXIST_OVER CLI_FRESHENCLI_FULLCLI_FULL_DIAGS CLI_HEADERCLI_HELP CLI_INFILECLI_INFORMATIONCLI_JUNK CLI_TEXT_ALL CLI_TEXT_AUTO CLI_TEXT_NONECLI_TEXT_STMLF CLI_TIMES CLI_TIMESTAMP CLI_TOTALS CLI_TRAVERSE CLI_UPDATE CLI_UPPERCASE CLI_VERBOSE CLI_VERSIONCLI_YYZ CLI_ZIPFILE6 COMPILEDWITH6 ENDSIGMSG6EXCLFILENAMENOTMATCHED6FILENAMENOTMATCHED6MAIN6 MASK_BITS6 REPORTMSG6SEEKMSG6UNZIPLDVMS_UNZIP_CMDLINE?CLI_JUNKCLI_TEXTUNZIP__MAINZIP_CMDLINECLI_LISTCLI_LONG CLI_LOWERCASE CLI_MEDIUMCLI_ODS2 CLI_ONE_LINE CLI_OVERWRITECLI_PAGE CLI_PASSWORDCLI_PIPE CLI_QUIET CLI_RESTORECLI_RESTORE_DATECLI_RESTORE_DATE_ALLCLI_RESTORE_DATE_FILESCLI_RESTORE_OWN CLI_SCREEN CLI_SHORTCLI_SUPER_QUIETCLI_TESTCLI_TEXT4CMDLINE6UNZIP, VMS_UNZIP_CLD6UNZIPUSAGELINE1 UNZIP_COMMAND6USAGE6UZ_OPTS6 VERSIONDATE VMSCLI_USAGE, VMS_UNZIP_CLDVMS_UNZIP_CMDLINE6ZIPNFO6__MAIN cZ UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1DIFFS.TXT;1 dS;ã UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1DIFFS.TXT;1` !"#$%&'(eSeƾsx(&J98e U1pe>p<~h{3X HIL%.  &S-5K'1z\8ͭ@ep1w5h&Ħ5!g,!oT49hH #vgy({Zt-p =g?52ahWpU|a#l"WAD; ΰR( ;jlU wwJ^dYSs ynUIbQC[N =Me\483qH r%:r8 n}RNso'*IqOP7^E*)9 G.kI=^la&KN6 ᛥ[gzc 6 ήw+ gjD28? pT*}){6e'#NkjUN`AqO_%Y/J +UD>bDb]m8ХmA1pxׅϋez)ާOiVa; .=oV@bvGԬE]R >zɚć}`~4%6Y1b"dX5)&P3o_]́#8ܗ+ws[vD;?8?% )\|T':*kSǥ(3gРllP(BNR GVnv@~>Ր H0Gtn< E櫆BwKdyniykEm=íUMB YcqD)bw #%g3A<*!Plj07BEcM&&Gr=e`fkY7AC*4?uJp9iE\F'/TgȽ DW"1 >I>d)q ]HPE^Z`ER> WQVtdBd=}-HF D@շ,IKW"Q~9;@v3g\Y= 0TOߊgTVu ‰V4<=頹lC&h"."$bμ,/k`Z-++E Y"ǡ \6[W@xpјbۓRrI( K -⩚ oMcY.MnV}Mt%u*. Ht/o-<81C`;gROkT|$t nfK>LIvV(3x!gOr~*цLdd2 {vN/c$,?9 d|m[EODc  E&1dm}:'%xGoj>ĻM^cG}AGr!~M8af;."G 5VWsВk;3F`f luwvC.Cn%={Ck)ȆGYoHϞb!sF/tVSeXq%NֱNlqX bXODrK.IB%y:n$fit4lhOHgR[NX(M{'wG68!L'j_*Ar0+Zp vy<;1Daf8Dexqb+8+h-82>4Z 7t)d.Z@ { :}dKB sutG&U6@Ez [.PDwiIwZh*y2;JD+=q^.L[d#3<<'IoMVcv|#tW 1< IQ'< O3(XW9`0)Z IŶH PIHH:TC+%,}^B8q_08hlks#. "=E' u3B9:etn3#rFuT9_-=%xX43WLgh8=cJ'zPӲx}qOrPp\9h0=*gs|~@^gM)r&2k=]'ln_87LCLUS$B1%lmde%j { r:jѬ mGi%DtERXFA9Aa@U4~UaF$ sDEm={sՒ'#j};2s2,E8@Kqq 8p "NF/E,BU̱5L aK[@ZGu(Uhf2V S4 NˇtCe_?V$G"\bS#B<.ZMΠ7EMhZJ,3wE]]o;qJJGNYӿ,aDUAZW!p+AM:vt+4*oM*=yvFF1 a'0=boui_OKY(a:/Y#PSq@9u?G #z*GHL DJb08oqbQ>hܜ=9UQbj%Ē"ԡj~lөJ0=ّflf-v..~VNr['nV:y4t_%?GSZY.^[0s;+FPhIqÌ?_FN?܄`{U~o5:g[L{JdzZc $]E>2gs|c7 XJ*ΧtiE*s4.X a< f?-v=jTE]9 uWKO{-+hacDOmA%CFغ ( 9"Nr Z_c=¸G2wH'(RuPR4S0L+N?>2!+K\_M'y kJKBba]i@n!> 89v9FZ.] j27%f 3|$O@Gx@Dи{*}Wv'=g>6 ;3c3)nP\u#uUBJG8T G{Lee.nWP@,%yDS*hey"#s%)1/v<ڵKz:zZ~4DX((ZqZ , !@|Io=Fqyo3{C6Z~N4L'%'H\i(pqQ}(f@\ko׋O(^ϪkOƎo˙IdCvcvHu0TԱWN}DN aXlW3gd -Q[ /5w$LGh7xdϡMbIc;_B_E23 *cTpxC H 9 =\jf' G+vo^"~T}WER(T6lc1}E)2x)6 h!f+!@qK$(wTJKO`V[t@4rnRY%N:ZXRaK.-YC3?7(=Gnb~o K87^diTm5.6M#)xQ1uo%sJ>,_)hOHxXYCQ_b1I",)_nSTo56AORߥgINX7b4kEjM<pHI [ gW^@Jq:Đ f&na<3%f* CKZTwL |&ыD.LKyGOX d=ҪG+Ҝ_5BkNʼnf/009!@a7R%;xm#q*]$x %} #L7'CmZZa']6$ Y% 3Рĩ0OK5QI^( M8q=`Rc=MiA~Ux0;[/ gE5wƾe<Zx/!6OTp$g88mr.2\VJboDh-lB1E(K{rb#CQrTIw.DM`܄kAݣ: R&$nVm5:"FRkMFTW9#|?miٹ#,,x7aa:$m[c~Y$(\o K%l!M@!:YJTp@LS[b.OJDm&3SAR# ZȧV %(kܔ(oAjk;SaX v4Ci`gg ICTN/FO H=r}rOiR(ϢӸ6gHK6 %N{SXْEAF_HO@~Jk.DznZDB1\0a1 27,e 6b T wK;r'5&Cr(h ,tr!r-sG5b\q! ٣ :(3-6 PIZ$-N4 BI41]OM+.>h4fec #uYr$ M| {Yo$5~a$8hYD@6EAXAQ[vWć#P8V<F*cm 9dB[tø:6Z2TJU)c)yd,O np!W[YGOod!=[,8{%jw5iE6W:eRQG?r8 [sgfUX c|sr.;=o#kj^V?d&"A?I w),"0J:gZfA6IT" V\at՘9Ea&i},) $!ҳe AFKK+E#Ydr 7r<,VfF"m݁؞ksJA'=ЁHzzh`azd=zb*jє#pq+ BdgQ$0#U/ M.Q^r,= Aø(һIaDق7-+I OG)޲,:x7A͹[!+h}qQe#EilvPX{B7}88cϺvZ,@bJG(SaWlO|d/QSՋ^\xB&-&9E:k3[eUCs3A&Y}SR^[BRӈfsg*t$IŸmPt=[XlXj\ąPE])cȡRzSl)[_}K K"..G01CSKM G]4gv4$ ׫fOgK\@Rfƹ;[uЯIaN]sDBJKB\ &ﮮV4Lg$VtpƐK1:LGbl!P2.!~ﭺ":KZ=|^cKKFq  AY(G겊ο_03!2gvм?$$_bACH:#1"mΑ.%oxh ּl _"}$)'l| RNO6|,)Wn7@>K(2OR ,T.btcFOwQ6У&n&F!{*be .pv*olhBH4bp"րkZcJsM[=9)yq̺)OJRvk4zKs$(ba/zmz;ve8ge+ Gkv'AndTAb53wji.a"}XP5BO!)&^$M"KY\\  #݆\&hk4P7>!zNqbd!-u/yGt>s6U~dG<=VLpBfJi UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1DIFFS.TXT;1Y()*+,-./01234567gB> UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1DIFFS.TXT;1789:;<=>?@ABCDEFh; UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1DIFFS.TXT;1FGHIJKLMNOPQRSTUi#| UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1DIFFS.TXT;1hUVWXYZ[\]^_`abcdj5a/ UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;19defghijklmnopqrskI UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1stuvwxyz{|}~lz! UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1rmQ9 UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1nY UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1Koa UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1mp`xaJ@ HQ(b K@`dV!(@ `!@! DB@B @ aJF ~FpB- H,`XL$  C$(@ $$1BP8!p ( p X@H80C$BP \!@$8@ J @$hUb`H`x0 b p<B@y x`!<0#`x H$<B @H @E<"/ $ IRD HPF! ,  `! HMH`@b@@80C$,PV!8@$`bLH (a$0  H0BD*8BBK! ‡",0L q 0L0YCPa$aH`҆ a$pAH@AR"`I JcX$0!M@@ * @H .` 1c $XD# H&T#`2 HX.ZBP@PV!H@X `J!H@@h@,PV!0HT $H @$0 PV!H@X `J!0H@  BPV!0, @ HU @!0 gPV! B `J!Hp\PV!JH p$0 P%D!!HY hN!#@Ĥ0L!,  L @0 L` V!  #($B@YhJPbLHPD B C hN! BB `H!,@XDP @` V!P #$B(YhD bLHPJPB C hN!PBB `H!,@XJPH@(J `V!"He DHEb, p\PJBY p$B0(8 `H!0 @($ H $ 0 XD,ehZBPL`B C hN!`BB `H!,@XLPbLH(J `V!"Hp$"@p\P V!P 0$P, `LPV!  B $`H@XhL`,@$PL 0P(HĤ $B@RhN!,Y B2(B@PB J0  ` V!` #$B0Yh@PL`B C hN!`BB `H!,@X L`0i&$B # `N! @B0 PhN!,Y `H!BB@X C0 ` $ RH`@!BQ@XHU unzipExamples (see unzip.txt or "HELP UNZIP" for more info): unzip edit1 /EXCL=joe.jou /CASE_INSENSITIVE => Extract all files except joe.jou (or JOE.JOU, or any combination of case) from zipfile edit1.zip. unzip zip201 "Makefile.VMS" vms/*.[ch] => extract VMS Makefile and *.c and *.h files; must quote uppercase names if /CASE_INSENS not used. unzip foo /DIR=tmp:[.test] /JUNK /TEXT /EXIS=NEW => extract all files to tmp. dir., flatten hierarchy, auto-conv. text files, create new versions. Major options include (type unzip -h for Unix style flags): /[NO]TEST, /LIST, /[NO]SCREEN, /PIPE, /[NO]FRESHEN, /[NO]UPDATE, /[NO]COMMENT, /DIRECTORY=directory-spec, /EXCLUDE=(file-spec1,etc.) Modifiers include: /BRIEF, /FULL, /[NO]TEXT[=NONE|AUTO|ALL], /[NO]BINARY[=NONE|AUTO|ALL], /EXISTING={NEW_VERSION|OVERWRITE|NOEXTRACT}, /[NO]JUNK, /QUIET, /QUIET[=SUPER], /[NO]PAGE, /[NO]CASE_INSENSITIVE, /[NO]LOWERCASE, /[NO]VERSION, /RESTORE[=([NO]OWNER_PROT[,NODATE|DATE={ALL|FILES}])] Type "unzip /ZIPINFO" for ZipInfo-mode usage.Usage: unzip file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options /modifiers Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. Type unzip "-Z" for Unix style flags Remember that non-lowercase filespecs must be quoted in VMS (e.g., "Makefile"). miscellaneous options: /HEADER print header line /TOTALS totals for listed files or for all /COMMENT print zipfile comment /TIMES times in sortable decimal format /[NO]CASE_INSENSITIVE match filenames case-insensitively /[NO]PAGE page output through built-in "more" /EXCLUDE=(file-spec1,etc.) exclude file-specs from listing usage: zipinfo file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options or: unzip /ZIPINFO file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options main listing-format options: /SHORT short "ls -l" format (def.) /ONE_LINE just filenames, one/line /MEDIUM medium Unix "ls -l" format /VERBOSE verbose, multi-page format /LONG long Unix "ls -l" format %.zip"). % (e.g., "*font-, by Newtware and the fine folks at Info-ZIP. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing * or 20 April 2009R ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60.VMS]CMDLINE.C;1٬SLnؙoq .R. H1O8x x! {|@1 Py ` y} y}e{0 {0 {0 {0 {0 {{{0 {0  {ȧ#e{%}ӧ{0 {{. 0{&|Ȩ#{{!!2 e {{u} UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1{{{{fe|{|{ȳ{{e0 0{#e{{{{{{{{{{{{{{{{{>|{  {{{{# oof} P{ #!!/ 01 }} #. 0{ #!!/ 01 1u# @xԳv` ` ##e# @ 0 !  0 ec2 {#. #@ff{o0 !0 /||s||~||~|||p}}cm!Ƨ#b@@0 2 O O xx  "Zy-S-S&S||xx/  w? w x?x qx u" uA  v onn>@%.}p1CMDLINEHP C S7.1-012vms_unzip_cmdlineFget_listFRcheck_cliRSVMSCLI_usageSb,p1.shstrtab.note$READONLY$CLI_TEXTCLI_TEXT_AUTOCLI_TEXT_ALLCLI_TEXT_NONECLI_TEXT_STMLFCLI_BINARYCLI_BINARY_AUTOCLI_BINARY_ALLCLI_BINARY_NONECLI_CASE_INSENSITIVECLI_SCREENCLI_DIRECTORYCLI_FRESHENCLI_HELPCLI_JUNKCLI_LOWERCASECLI_LISTCLI_BRIEFCLI_FULLCLI_FULL_DIAGSCLI_EXISTINGCLI_EXIST_NEWVERCLI_EXIST_OVERCLI_EXIST_NOEXTCLI_OVERWRITECLI_QUIETCLI_SUPER_QUIETCLI_TESTCLI_PIPECLI_PASSWORDCLI_TIMESTAMPCLI_UPPERCASECLI_UPDATECLI_VERSIONCLI_RESTORECLI_RESTORE_OWNCLI_RESTORE_DATECLI_RESTORE_DATE_ALLCLI_RESTORE_DATE_FILESCLI_DOT_VERSIONCLI_COMMENTCLI_EXCLUDECLI_ODS2CLI_TRAVERSECLI_INFORMATIONCLI_SHORTCLI_MEDIUMCLI_LONGCLI_VERBOSECLI_HEADERCLI_TOTALSCLI_TIMESCLI_ONE_LINECLI_PAGECLI_YYZCLI_ZIPFILECLI_INFILEUNZIP_COMMAND.sbss$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind_info.rela.IA_64.unwind.relaCLI_TEXT.relaCLI_TEXT_AUTO.relaCLI_TEXT_ALL.relaCLI_TEXT_NONE.relaCLI_TEXT_STMLF.relaCLI_BINARY.relaCLI_BINARY_AUTO.relaCLI_BINARY_ALL.relaCLI_BINARY_NONE.relaCLI_CASE_INSENSITIVE.relaCLI_SCREEN.relaCLI_DIRECTORY.relaCLI_FRESHEN.relaCLI_HELP.relaCLI_JUNK.relaCLI_LOWERCASE.relaCLI_LIST.relaCLI_BRIEF.relaCLI_FULL.relaCLI_FULL_DIAGS.relaCLI_EXISTING.relaCLI_EXIST_NEWVER.relaCLI_EXIST_OVER.relaCLI_EXIST_NOEXT.relaCLI_OVERWRITE.relaCLI_QUIET.relaCLI_SUPER_QUIET.relaCLI_TEST.relaCLI_PIPE.relaCLI_PASSWORD.relaCLI_TIMESTAMP.relaCLI_UPPERCASE.relaCLI_UPDATE.relaCLI_VERSION.relaCLI_RESTORE.relaCLI_RESTORE_OWN.relaCLI_RESTORE_DATE.relaCLI_RESTORE_DATE_ALL.relaCLI_RESTORE_DATE_FILES.relaCLI_DOT_VERSION.relaCLI_COMMENT.relaCLI_EXCLUDE.relaCLI_ODS2.relaCLI_TRAVERSE.relaCLI_INFORMATION.relaCLI_SHORT.relaCLI_MEDIUM.relaCLI_LONG.relaCLI_VERBOSE.relaCLI_HEADER.relaCLI_TOTALS.relaCLI_TIMES.relaCLI_ONE_LINE.relaCLI_PAGE.relaCLI_YYZ.relaCLI_ZIPFILE.relaCLI_INFILE.relaUNZIP_COMMAND.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60.VMS]CMDLINE.C;1GVMS_UNZIP_CMDLINEVMSCLI_USAGECLI_TEXTCLI_TEXT_AUTOCLI_TEXT_ALLCLI_TEXT_NONECLI_TEXT_STMLFCLI_BINARYCLI_BINARY_AUTOCLI_BINARY_ALLCLI_BINARY_NONECLI_CASE_INSENSITIVECLI_SCREENCLI_DIRECTORYCLI_FRESHENCLI_HELPCLI_JUNKCLI_LOWERCASECLI_LISTCLI_BRIEFCLI_FULLCLI_FULL_DIAGSCLI_EXISTINGCLI_EXIST_NEWVERCLI_EXIST_OVERCLI_EXIST_NOEXTCLI_OVERWRITECLI_QUIETCLI_SUPER_QUIETCLI_TESTCLI_PIPECLI_PASSWORDCLI_TIMESTAMPCLI_UPPERCASECLI_UPDATECLI_VERSIONCLI_RESTORECLI_RESTORE_OWNCLI_RESTORE_DATECLI_RESTORE_DATE_ALLCLI_RESTORE_DATE_FILESCLI_DOT_VERSIONCLI_COMMENTCLI_EXCLUDECLI_ODS2CLI_TRAVERSECLI_INFORMATIONCLI_SHORTCLI_MEDIUMCLI_LONGCLI_VERBOSECLI_HEADERCLI_TOTALSCLI_TIMESCLI_ONE_LINECLI_PAGECLI_YYZCLI_ZIPFILECLI_INFILEUNZIP_COMMANDVMS_UNZIP_CLDUNZIPUSAGELINE1OTS$EXTZVOTS$INSVOTS$MOVEELF$TFRADRLIB$GET_FOREIGNSTR$CONCATCLI$DCL_PARSEDECC$MALLOCCLI$PRESENTCLI$GET_VALUEDECC$REALLOCDECC$FREEDECC$STRCPYDECC$STRNCPYDECC$CALLOCDECC$STRLENSTR$FIND_FIRST_SUBSTRINGUSAGEDECC$MEMCPYDECC$TXSPRINTFDECC$$SHELL_HANDLERLIB$GET_INPUTLIB$SIG_TO_RET      !"#$%&'()*+,-./0123456789:;<=>?@ABCFGIJL7h 9?#K?)Xao|      -6@IXev !"#$%&'+(<)Q*h+x,-./012345678 9:;*<5=CQvz UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1a! akt}?8>JYm{DDZ@UDZ@UQU'>'>#'>)'>)'>'>p1eE eDeF'>XW_>_>#_A_># _>)(_A 0_>)8_>)@_A@H_>)P_>p1X_Ap%%%% %0%%@%P%`%p% %%(%0%8%%@%H%P%%%%%%%X%(%`%h%8%H%X%p%x%%h%%%%%%%%%%%%%%%%%%%%%% 9"*=p9I>)I<<IRR!2II??IRIp//I++77I 0002Ip11I22I3 3"I`4p4rII55I@6P6RII  I0 A RIII0PRII  I@ P b I I ' ' I@ (P (R I@ P R I   I  " I   I   I   I` p r I   IIP`bI  I"IAPRIII "I!!I**I`-p-rI..I`prI""I`#p#rI$$I`&p&rI%%I2I  I 8082I,,III"II"III :0:BIrIIRIIIIbII;;IRI>#IBIII>#B I!Ir"I#I#IB$I%Ib%IR(I(IQ)R)I)*=*I *H"*H1*H@*H*2? B+IwW= UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1a+2? r+I+2? +I+2? +I,2?2,IQ,2?b,I,2?p,I-2?"-I-2?-I.2?2.I.2? .2? ...I /2?@2/IP/2?b/I/2?/I@02?R0I02?0IpJ 0%3@N ]0h@xP`p  )0:@IPY`gpq 0@,P<`HpT]jz 0@P`p p19 C%@8p`?BFRN WDHV`e0E d`Cp f`EG`I`If`EJ`@J0f0ELgEB(g ECHhE`hExhE-hE@hEThE dhE yhE iE  iE 8iEPiEhiEiEiE iEiE-iE<iEJjE^(jEp@jEXjEpjEjEjEjEjxO UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;18'EjE kE!kE"'0kE#:HkE$J`kE%[xkE&lkE'kE(kE)kE*kE+lE, lE-8lE.PlE/$hlE09lE1HlE2XlE3flE4wlE5lE6mE7(mE8@mE9XmE:pmE;mE<mE=m(E? `# GOATLEY CMDLINE&;a# GOATLEY VMS_UNZIP_CLD:r GOATLEY UNZIP+a#03-003 ELF 24@@7IPF/VMS29-APR-2009 07:2029-APR-2009 07:20VMS_UNZIP_CLD03-003*IPF/VMSOpenVMS Command Definition Utility I01-07.note.shstrtabCLI$TABLES.symtab.strtab H UNZI ,(Tl UNZIP4!)P1ZIPFILEZip file8a!(P2INFILEFiles to UnZip( BINARY$c ( TEXT(4SCREEN(\ DIRECTORY(FRESHEN$HELP$JUNK$LIST$ BRIEF$8 FULL(`< EXISTING(  OVERWRITE$ QUIET$TEST$PIPE(PASSWORD(D TIMESTAMP,p TRAVERSE_DIRS( UPPERCASE(UPDATE(VERSION(cRESTORE(8COMMENT(a`EXCLUDE0CASE_INSENSITIVE( LOWERCASE$PAGE, DOT_VERSION$,ODS2(T YYZ_UNZIP(|ZIPINFO,` INFORMATION4!)P1ZIPFILEZip file<a!(P2INFILEFiles to display(@ZIPINFO(hONE_LINE$SHORT(MEDIUM$LONG(VERBOSE((HEADER(PCOMMENT(x TOTALS$ TIMES(a EXCLUDE0 CASE_INSENSITIVE$ PAGE$<RESTORE_KEYWORDS$`DATE, OWNER_PROT$RESTOREDATE_KEYS$FILES$ALL  QUIET_MODIFIER$SUPER$` EXISTING_KEYWORDS,  NEW_VERSION(  OVERWRITE( NOEXTRACT   FULL_MODIFIER, DIAGNOSTICS$L CONVTXT_KEYWORDS$p AUTO$ ALL$ NONE$STMLF$ CONVBIN_KEYWORDS$$ AUTO$H ALL$NONEL  4 ` , d (X    4   $ p D T $ p  `  ` 8  <     << T H `t    `  <<  <<8Hp L hxL   p      0< T VMS_UNZIP_CLD@,H`0$yN UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1P6hN:rV1.0ELF 2 @@#0 )a(0#40 'a0.a0 )a@ppp@=@=C-IPF/VMS29-APR-2009 07:1929-APR-2009 07:19UNZIPV1.0IPF/VMSHP C S7.1-012IPF/VMS vms.c[none]VMSCLIUNZIP_OPTSUNZIPOPTZIPINFO_OPTSZIPINFOOPTenvargs: cannot get memory for argumentserror: command line parameter #%d exceeds internal size limit caution: not extracting; -d ignored error: -d option used more than once (only one exdir allowed) error: must give decryption password with -P option caution: both -n and -o specified; ignoring -o -T timestamp archive to latest -X restore owner/ACL protection info* or % (e.g., "*font-%.zip") -M page output through built-in "more" UnZip special compilation options: %s UnZip and ZipInfo environment options: %16s: %.1024s COPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)SET_DIR_ATTRIBTIMESTAMPUSE_EF_UT_TIMEUSE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)LARGE_FILE_SUPPORT (large files over 2 GiB supported)ZIP64_SUPPORT (archives using Zip64 for large files supported) [decryption, version %d.%d%s of %s] 05 Jan 2007-Z => ZipInfo mode ("unzip -Z" for usage).Extended Help for UnZipSee the UnZip Manual for more detailed helpinstead.Basic unzip command line:Some examples: unzip -t foo - test the files in archive foooptions.Basic zipinfo command line: zipinfo options archive[.zip] [file ...] [-x xfile ...] unzip -Z options archive[.zip] [file ...] [-x xfile ...]port and is referred to as Unix Apple.unzip options: -Z Switch to zipinfo mode. Must be first option. -hh Display extended help. -A [OS/2, Unix DLL] Print extended help for DLL. -a allowed and EBCDIC conversions done if needed. -f Freshen by extracting only if older file on disk. -l List files using short form. files extracted in binary mode (as stored). -t Test archive files. zip -o but faster. verbose output. -z Display only archive comment.unzip modifiers: marker, and from or to EBCDIC character set as needed. overwritten file in foo~ or foo~99999 format. -C Use case-insensitive matching. is on by default and -D essentially becames -DD. -DD Skip restoration of timestamps for all entries. restore. standard header. -LL Convert all files to lowercase. -N [Amiga] Extract file comments as Amiga filenotes. care. command line to other users. uppercase if created on MS-DOS, VMS, etc. See -L. -V Retain VMS file version numbers. directory levels. user privileges. system privileges. -/ e [Acorn] Use e as extension list. directory, which can be a security problem. this is not a good thing and should be avoided.Wildcards: Internally unzip supports the following wildcards: * matches any number of characters, including zero If port supports [], must escape [ as [[]Include and Exclude: -i pattern pattern ... include files that match a pattern -x pattern pattern ... exclude files that match a pattern unzip archive -x pattern pattern ... use unzip on that. See the manual page for Zip 3.0 or later.Streaming (piping into unzip): used to process the first entry in a stream. cat archive | funzipTesting archives: -t test contents of archive quieter operation.Unicode: digit. -v List zipfile information in verbose, multi-page format. and compressed sizes, and compression factors. -UU [UNICODE] Disable use of any UTF-8 path information. -z Include archive comment if any in listing.funzip stream extractor: is given, read from that file instead of stdin.funzip command line: funzip [-password] [input[.zip|.gz]]unzipsfx self extractor:unzipsfx command line:unzipsfx options: -c, -p - Output to pipe. (See above for unzip.) -f, -u - Freshen and Update, as for unzip. -z - Print archive comment. (See unzip above.)unzipsfx modifiers: Most unzip modifiers are supported. These include -a - Convert text files. -n - Never overwrite. -o - Overwrite without prompting. -q - Quiet operation. -C - Match names case-insensitively. -j - Junk paths. -V - Keep version numbers. -s - Convert spaces to underscores. -$ - Restore volume label. -d exd - Extract to directory exd.forces extraction to specified directory.See unzipsfx manual page for more information.error: must specify directory to which to extract with -d option error: -Z must be first option for ZipInfo mode (check UNZIP variable?) error: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid unzip "-V" foo "Bar" (Quote names to preserve case, unless SET PROC/PARS=EXT) -Y treat ".nnn" as ";nnn" version -2 force ODS2 names --D restore dir (-D: no) timestamps -M pipe through "more" pager (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.) ZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing %s. usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] main listing-format options: -s short Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format miscellaneous options: -h print header line -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive %s -x exclude filenames that follow from listing SYMLINKS (symbolic links supported, if RTL and file system permit)UnZip %d.%d%d%s of %s, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details. Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ; see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites. Usage: unzip %s[-opts[modifiers]] file[.zip] [lizT_ UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1KEst] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s => define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir modifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %sSee "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer UnZip lists and extracts files in zip archives. The default action is toextract zipfile entries to the current directory, creating directories asneeded. With appropriate options, UnZip lists the contents of archives unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir] unzip -l foo.zip - list files in short format in archive foo.zip unzip -Z foo - list files using more detailed zipinfo format unzip foo - unzip the contents of foo in current dir unzip -a foo - unzip foo and convert text files to local OSIf unzip is run in zipinfo mode, a more detailed list of archive contentsis provided. The -Z option sets zipinfo mode and changes the availableBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix based -c Extract files to stdout/screen. As -p but include names. Also, -p Extract files to pipe (stdout). Only file data is output and all -T Set timestamp on archive(s) to that of newest file. Similar to -u Update existing older files on disk as -f and extract new files. -v Use verbose list format. If given alone as unzip -v show version information. Also can be added to other list commands for more -a Convert text files to local OS format. Convert line ends, EOF -b Treat all files as binary. [Tandem] Force filecode 180 ('C'). [VMS] Autoconvert binary files. -bb forces convert of all files. -B [UNIXBACKUP compile option enabled] Save a backup copy of each -D Skip restoration of timestamps for extracted directories. On VMS this -E [MacOS (not Unix Apple)] Display contents of MacOS extra field during -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn if ACORN_FTYPE_NFS] Translate filetype and append to name. -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name in -j Junk paths and deposit all files in extraction directory. -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info. -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes. -L Convert to lowercase any names from uppercase only file system. -M Pipe all output through internal pager similar to Unix more(1). -n Never overwrite existing files. Skip extracting that file, no prompt. -o Overwrite existing files without prompting. Useful with -f. Use with -P p Use password p to decrypt files. THIS IS INSECURE! Some OS show -q Perform operations quietly. The more q (as in -qq) the quieter. -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores. -S [VMS] Convert text files (-a, -aa) into Stream_LF format. -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCII text escapes where x is hex digit. [Old] -U used to leave names -UU [UNICODE enabled] Disable use of stored UTF-8 paths. Note that UTF-8 paths stored as native local paths are still processed as Unicode. -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do not match directory separator /, but ** does. Allows matching at specific -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACL entries under VMS, or UIDs/GIDs under Unix, or ACLs under certain network-enabled versions of OS/2, or security ACLs under Windows NT. Can require -XX [NT] Extract NT security ACLs after trying to enable additional -Y [VMS] Treat archived name endings of .nnn as VMS version numbers. -$ [MS-DOS, OS/2, NT] Restore volume label if extraction medium is removable. -$$ allows fixed media (hard drives) to be labeled. -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members into locations outside of current extraction root folder. This allows paths such as ../foo to be extracted above the current extraction -^ [Unix] Allow control characters in names of extracted entries. Usually -2 [VMS] Force unconditional conversion of names to ODS-compatible names. Default is to exploit destination file system, preserving cases and extended name characters on ODS5 and applying ODS2 filtering on ODS2. ? (or %% or #, depending on OS) matches any single character [list] matches char in list (regex), can do range [ac-f], all but [!bf] For shells that expand wildcards, escape (\* or "*") so unzip can recurse. Patterns are paths with optional wildcards and match paths as stored in archive. Exclude and include lists end at next option or end of line.Multi-part (split) archives (archives created as a set of split files): Currently split archives are not readable by unzip. A workaround is to use zip to convert the split archive to a single-file archive and Currently unzip does not support streaming. The funzip utility can be This can be modified using -q for quieter operation, and -qq for even If compiled with Unicode support, unzip automatically handles archives with Unicode entries. Currently Unicode on Win32 systems is limited. Characters not in the current character set are shown as ASCII escapes in the form #Uxxxx where the Unicode character number fits in 16 bits, or #Lxxxxxx where it doesn't, where x is the ASCII character for a hexzipinfo options (these are used in zipinfo mode (unzip -Z ...)): -1 List names only, one per line. No headers/trailers. Good for scripts. -2 List names only as -1, but include headers, trailers, and comments. -s List archive entries in short Unix ls -l format. Default list format. -m List in long Unix ls -l format. As -s, but includes compression %. -l List in long Unix ls -l format. As -m, but compression in bytes. -h List header line. Includes archive name, actual size, total files. -M Pipe all output through internal pager similar to Unix more(1) command. -t List totals for files listed or for all files. Includes uncompressed -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss) Default date and time format is a more human-readable version. -U [UNICODE] If entry has a UTF-8 Unicode pat{I>|1NBW[w2 tjt: `"!GcI'ڽ îZd;'A]{kU%I đ`/G.nGUIq*Jerk:on 5ڪ~7Lx-N؏~ywR W?nBNvo2h^wv;Vp$c3faF sM5}TD @ VKw)axS\#? fC ue>7sF`x[ $z?,Ep۴FX@.2K|q)~K$bO  SD8H@@e=oMFKENemc9W,sQ{Nעc`lM%99=Tjr*UW`c0%"],1y{* a2{l{A!Wduo8K\tkn@sCrK]2/]mł #p W#1k^hEq}iė55qϫm;Xnn osq#`)u_%uuR0+=v/q\PYKLay*]yz7Qm!&s]g(%:k-L7(&Op*npAR7㈔e)2&KE Q4%3#-Q%vDjo2=KјT}#c8dȂ&^O!Y UFc0mx~nKichz!u -ot\|sVB%ghvgT :k"|^!d`u4 g;lo' v!'gg+nI Pbo#+S,jK?$2!".-g&h:#*Xum#`ء+BPw!GffŲk(V=*I"qz S}@+yH"+l+jg!gG{P6q?oepf*Ἀ~wX.#5]rI85CѲ>IIhy`LB%jlb9ar$ ;' rbl,&j!Wa`L4gxe"b=o#B-ЌQsu?~wHc{-6m,fQ;Bh(vQ\xc+l% Z`Sw]j"vzML2N\r(X6HM,.]vn`\:78pZ ђdx68VA{X_}7 {:o,x} Dr{Sy!3>L%Q- n57/_qVL YT\H=O1I3Xi]Z Rt CQ\Q IhI%A +8c6TT AE!{? 51 7hLF lfJ/R/ ({9MI9B][ Srgx~~wSb0'i .ZIuG[R 'yJG#GBm  t}UUUU>s06, 1o6'}:9"qn\PR! 0t*KpZWt5#'x"35%'4RM#?STF^eAHNOODVsR !ROOT(V] ?B>|=c[tQV('pvB) 5yB GLI`h^ra~].K 7[T@ oRE% **i;3e5!NP'x&A/L2F[kau n`6 osp!VtEOc~"E{m(N1# ܻLWy@ivQ+w_P$av]U^ ib%-iTDk` )Jo)udR^Aގhl.j= gu8zO_@IXBX O3,?MIhV xz0W~;UKHK FniMA8m,u|AT}fLKUnH+_3)NRH9T$?8x@RAofSLi;_Gt@>MhGKIA1sQrws# WFZxOJOM#aMym~"W %řE+uwZD3U| ? ]ҍԐGE*E'Z gynVvB"6Rl%RI_5kRt>u5Uu.vsS7[@ J$-6S% z|Q_OGAGU~F o:[a[>Qj2dQ _:H3%*>Y \dV b(>lͣk: -^_0^?k+z%\#f}.^ygeEa&\8 W?E]YN qqH^v<O#.1-  L"ECWV"9~u *b&\ Q'Os[%ipj #$RQ!W:$ .Qg.5 C7!3L'T aVa^kP J3y_>pI6+]e5tusv+YJC_  uX Z%Żw=_QM`"Pg\VFI\zjD[Ij"=9:>ieVooV^KWU8?]@ү NIO/%6s6r RB(`<,qg]k{!khf nl.G8tkLF#+o #:4Ki+-?B fmz,BYXD(eu  Sk*o5&'~>UF@[g,Q3K SJLE=Rh\cY~zDsMA%c_>of$qq7@x{~EYIJMMM?oR8tyH.:+ A E^jV HYxUM%j9(='Y.>,O\U"-=9 `siEGunKAY~F^.8!%'sY W\`0^qv.ynM*"E(;#~dG`06ANKwF~_HDS\8_R;S_B}"stL%}n,wkgb)<CطE^N42+}3h% PzYEl ~l1F?1RZC@7 C3^B?L@_VeEqBJyq$3I[r AI`_ZDt[s=c:~ v>` p3s_ST4_Ja'y1ew\&!M 8nPMJNyqm_58^Fv0g I]T]=g?#BKDK%MPA0\HPhUE6U\VJB]sRI 9F1l/ lyp\oJ"^% ]~X@ cSJ/ l( FIV=ymC:_DLO VU_]X /ksD[F4nraRQaA[ev=p+]Oobh=hshJRVaeD}bC#ħ`@pB D mSF\FhZTS qA9H%YYPSL0,Dtd2INvJg^ {t?5m D06$$sww<\k]K8Jv)?I$O_j)!.#n:WDT*LBL{V^g* Q~UsqnjG2r*% dM FXn$b)MBD$jHEV -m\do+Lt=7=LI*h}l/z87Tߋh'P{%7V&OJ>P&GY'1LbLd]M (L4j}Z38FZN~^W ]gi0a&I( -t[B+B8PD @DT*B0iqCIklH.Z+%5 L FVUQ:(5IIxIwBCWWS|6+~L{P5D0G/X=a1?An ؎)!|q7T[DU^[cjcWBLQ/}=tq. g3Vx-y0 kO DI= aqHT| Ql :,r%D ITO$llA\G:c+L B`qx,BE(-J78V"*2/D4.?XY?t)DYH'K}*ȁr M3!BJEz!X uGI7NZ0g J@ ,S)4Q((YXxd2UASM p;E+]Z[ePd*gX A8hzhg0f]D;QB 5Vkl /DcEu[Xq/=K;G-Z2lnh8,"GBcyM4`AxUOa0O@orc3~SZRHsbX\yEd^3B $/Tk(2Z(fDVE_Gyxw: ElFecce~8k! >2}q!W= eVI3 /KFO3':5v9Q{$A,9arjRrrZ;@:NJNv:O6Mo#)/kl34qo~ U=Dm9s :yz{ |tMC xQf &Rt*I%[+|t*lsr31x.X}CfVALM0U:wU +{:"Y$nqaT- =FK#8}ab,qqF2[\%( B{M[3L|!,{-8^lo,$8g+.Bf,uX2,F&%ZIClunT-$ 4BC |fR!d39SR!-k?] A<0o3r>~06=|D gy|hnZq5o6>&&rRfEg%}=#}ntef|. 'Lx7ŖdEHz>65SpJ% *DzfG$(>, +g8`nCMXsIߦekp93_(*6=3 h (d?BMpmJa5#;)w5Wht?-RD w9cvywƑOl-heF8. 7wV]{ ?6  7N~d95`>A?_[jߌ$7--:EKDl*BB7FeB ls!p$1 D(F_{2,(iL]`^ Qn'F:=m_:N@kng>|=XG*\xL[F(!t \3p.$"5oDJDI SIcTo'+?)eU%=Ε\3w3J CerwKnb$f$ERpEp+RdP! )q$6nbe^jwoBy;IEF-riaU,H5>l+ry] l+dunk8+i"h[6%Eu.8!%rH$:92-|>2Eg\Gl* i &a;|k%'kp%#^A/PUD,SO=QSBD U-gKz^?*ߟ ?:x77k-R1NIe,hf'1\r8zq;_3Op-d/ 5np=lwW,pQ՝(p7S2MN#8S6x5ɑsN'8d)w)P.^q')" BL>J{F~a)Dcp}k1/61SA#rC#-NEt:/Y0 mr l en\ )7 3#%G|RpaY: vdjz 1EgI062m~8i7@DVdw?'}Cvqpv>z Ii7Alg2){8}bmi6?Vmt5y~ibP`({%5t{uKVLTrPI!j+{/n$v_b0xjj{޴f'a.'34\ -*Mw860ac.1LZJ1*a$GWDZVQs=O(}~q I!ILq=` fwni=1] g?,Z?W>#[rvg*x R5yaIBa(`b/ *M3So!Z hkH];I_ERd <1%Ikean:/39tu'8w& 47(33, d:)}"zsjt,]i-4N5? ,s?1c v&I}lYveq/4m :cnMKDr"B}Eum+v\,d#nZ\DEuX?4 Y&W MPt[IyS7Iqw&VK=/8UzX{?c(%6Z'hTxV$mp4Xh:(.axi.$mc&fviCmpk33Y`*u`S%:+mm"02i&je+Ou'Y*!) J`wt{GHz=nq-^& ]ZA, V8CxC;|_z-!(dle xebj'~8]v9+CZLy#JIUD}x,;m"l1u!}g7, e<;O*wgr*1A^i/b.AdIx6(4%q9mBu"Ip IA)}pZVi nD=cW [/P( 2EP`i -B)#DgA ex+My Y;uzT") I..4*"Dfh TIMKs i&Qժʣ>7I!" fTtN/eb@>TX; )=nkKI>[dE#&?Pyj "-& i[G o S'SIK[C+p 9%p7 (  UsiC:sGo'LM6ׯϪf9Q { YqzBT YJ?^tScN]!H[v)PgZ2$2R  MjfKy8&jRuB4y/w23f. ^+S[o ''{ 2x@>+T^Ef5mtȉԍ\ mZ!!kFשjV'f)N @n~Y|`` 69iI: |}sqH!v{* yd>b4|p]Ƚ_4Oxq|̷- UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1Th, display any characters not in current character set as text #Uxxxx and #Lxxxxxx escapes representing the Unicode character number of the character in hex. funzip extracts the first member in an archive to stdout. Typically used to unzip the first member of a stream or pipe. If a file argument Self-extracting archives made with unzipsfx are no more (or less) portable across different operating systems than unzip executables. In general, a self-extracting archive made on a particular Unix system, for example, will only self-extract under the same flavor of Unix. Regular unzip may still be used to extract embedded archive however. [-options] [file(s) ... [-x xfile(s) ...]] -t - Test embedded archive. (Can be used to list contents.)If unzipsfx compiled with SFX_EXDIR defined, -d option also available:By default, all files extracted to current directory. This optionHMH@x0 b p<B@| x !<0#P`?#IHx?#C?~F( x ?#BhD!B` )C<2/P8!`1B P 8N` ,`0YP$ ,PT!HUe@  b  ! P0B!P, P$P ,P@$B085HP P$`8 @PTH %p<By 0BP @ #PP!H P$0 PP!H e P$0 PP!H P$0 PP!H E P$0 PP!H P$0 P$0B aP! PP!p ( C @a!00B  $  s0 ,$ @@B  ,@HPA! $ @B!@ Y B Y0 B4C rC @?#@iC H&rpC @?#@iPCP pFU`0C @?#@iPJ$H 3 X$ BD@ PTBP88@CX$H PVHP88C a! B1pCA!H 3 D0 `% ,@D HD HYP88C$BB C PA! 0 a@D!B @ BP88 B @CHE!@$ H C PA!00  Ha!B`@P88 B @@C HF!$P P!B8Ca!0 H Dc`C $@!,@ $0 D0 ,`0@ H HYP84@C`!0 B  a@$`LH A P$ 0 @RPTH %J, H,P@B C `$BB0PB! ,  @`@($B@ !@! ƒ",8D8@C$0B aPP!(@PA!0BP ! a!0  @p C@B!H@A!"H` H0@!  @@!-@@Y F10@ D% # D #C?#0B ! @` &P # DXhT8pC ($P0  @XX8C X$ 3PVH HYP8BPC @! @!$,` PF8H(@`X @8H #Y!pC A! #&0B`X & a2k*!X`)Xz) X.@hH8pC 0A! # 2 X 2 a`36!X)pz) p: @X <P<8PC B  |,C |@P80C D!",,CXB 0B  0@!0X @ Ha1 Pa B "@PX((z) P$$@H8CHD0H #P&,P8B@C A!@ H `X80CH A!`B( #x@XF8`C @aB` Da 2 !#DB H,@RR H(@!P@@a ,h `@@!`X, T6X @hd0d&d, SR h2 p #(@ $ B  t,8@$aLHC P$0 PTH  > BYP!@!!H PD!2,`@X HB!0 ``@($B@Q@! H` 1@! # F #8@HP@!0H  P@!(  X@( q`XX H,pC$ `LH B P$0 PTH  @ BYP!@!!H PD!2,`@X HB!0 `` P! $P P! ,p `@!`  p]  @DH@ , 0!@'~F` $PBH1BC@$H  a$0  PT0 ` @F@X8 80C Hh%rC $@ @HB @ HP8 C`$@~F !X C F Y88C @ bh!rCHb @ HP8C@$@~F ! @CFB Y `pqC ` bhrCHb @ HP88pC HL?#h&kC$$,  @$@x ``xh 0L!@P1T!pq UPC0L B0AL!`B@P #TX@ b!bB T(@0L8`CPAT!B HTH @ 8$B #T@ P1T!",80C PAT!  @!G"/ P1T!@"/h@8L8@CPQT!`B `T(@ $B `T@@L8@CPaT!`B @T@ H$¨B @'T@L8 C ,@C T (`CH1@~F0C @$0!@ HF HX $T$ H9`C @X@P@8C $b @ X QHb8C ` $(HPC `  ( @ C `  ( C ` $( H C ` `!b` (@ @PqT!q HUPC0%L B0@L!`B@Q #T( @ H!B 'T @8L8@CP1U!`B T"/ @ H$bB &TN"/ @N8p CXpH  cq$BH @0L8@CPT!`B T @ @$BB "T @PQU!pq TPC0L B0@L!`B@EU `!Th @ b!B `T8 @PT!pq H@UPC0%L B 0#AL!`B@S "T @ H!B &T}n(t UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1"Gc @8L8@CPU!`B `TX @ @$B ` T( @HL8@CPT!`B `T @ @$B `"T @PT!pq !UPC0L B0AL!`B@S @"TH @ b!©B @T @PT!`q HU`C@d8#B@EQ 0!p a @T B T@@$8'B@EQ @!T@L"/h@L8 C PT!", ,$ C PT!g"/ HX HP8pCH1@~ C @$0!@ PF@PX PT!W"/ Ph)r C HX HPH8pC $b @ @X@P@8@C `  ( C ` ((PC ` $( HC `  (@C `  @`!`(X@PT!q HUPC0%L B0@L!`B@S "T@ H!B &T@0L8@CPU!`B Tx@ $B TH@8L8@CPU!`B T@ @$"B !T@HL8@CP!U!`B T@ P$BB )Th@@L8@CP1U!`B T(@ $bB T@HL8@CP$`B@S *T@ PT!"/@PQU!q TPC0L B0HL!`B@EU `%T(@8b8 0C PQU!"/@ PQU!"/@0L8@CPaU!`B @T@ @$ªB @!Th@PU!q HTPC0%L B0PL!`B@V )T@ H!B %T@8L8@CPU!`B T@ P$"B (TX@PU!`q aTPC0L B0@L!`B@V T@ b!BB T@@0i&$H H V!P!@(P$P,` V!00 (P!  ,(J` ` ^! ($HX@ H HP `( $qJ$@~F *%X@8L8@CPU!`B TH @$bB TXHPU!q P@TPC0)L B@0CYL!`B@W ,TH P!B (TH0i&$HX R?#pQ]@P.P$,` V!0 @PP!  ,@PT` `@($B@1i&$H # V!R@ b P$,` V!BB@@X P!2, B `@($B@(1i&$HX R?#PR@(JP$P,` V!PBB@@X P!2, (JP `@($Bx@`1i&$HX R?#R@PXP$,` V!0 @PP!  ,@PT` `@($B@1i&$H # V!0R@ b0 P$0,` V!0 `P!  ,`F` `@($BH@01i&$H # V!`R@ b` P$`,` V!P0 0P!  ,0L`( `@($B@0i&$H # V!R @ b P$,` V!0 @PP!  ,@PT`H `@($B@N1C0?#s@`C@$H  `$0 `EB RH@ HR0 `ZXB $%@`X8$ B0( b@%@,(b!P!H@@X J!BY^! B0L PL!H`X F!# H! ,@  H0 0`0L4BJh@$,P^!X@ X$0  XW!pB (0!Wp qu29HVq@`WPWVp`xTp8K8C8$`LH`@ $p0 JbHv0P H `,P0!L!!H` R!2,@@X N!`0 `0` ^! X1V!",X1 C X1V!@"/ XAV!",R1 C XAV!"/ X1V!",XT1 C XW!"/ XV! ( W q0i@8C`$`LH A $0 @RbHJ 8B8YPNpB C $pBB R!  ,` N`XV!B @V XW!`b",8L8@C$ HP8B C XW!"/J8 q']I8 C @ #`E]HVpH'5 xNpp C01i&$H`[ a$"", @P`Z@ T1` `,`C$Hd HP0L!0,@@X X!B0(@LX @$`H 1i&$00 sl@,`XH 3H X! Z@ĤP1i&$P0!L!!H`X X!2,@@XP!@Z@@R0LbLH` HR `bLH`DH` aF!B@Y 0L PD B C X! BB P!0,@@X D`$BP ^!@ #8$B Y 8NBP !H!!H`X X!2,@@X P!@0 ` Ĥ`PTH` O!CB x H , PTB C X!BB P!0,@@XTbLHPT `HRH` N!CB x, PRB C X!BB P!0,@@X R`PTH` F?#CB x1i&$, F PTB C X!BB P!0,@@XTbLHPT `0LH` !O!CB x`, PL`B C X!`BB P!0,@@XL`bLH0L ` HH` aO!CB x@, PH@B C X!@BB P!0,@@XH@bLH H `FH` O!CB x0, PF0B C X!0BB P!0,@@XF0bLHF ` ^!@ 3H$B :HR@,@HPH@B C X!@BB P!0,@@XH@bLH H `FH` R!CB x0, PF0B C X!0BB P!0,@@X F`0LH` S!CB x`, PL`B C X!`BB0 P!0,@@XL`bLH0L ` ^!@ 3$B :D@,@PH@B C X!@BB P!0,@@X H` ^! c$0[H@& X!@0 NR!,PTB C X!BB P!0,@@XTbLH >PT `0LH` N!B0YP~sn UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1rL`B C X!`BB0 P!0,@@X L`^! H HBPPT`@q x,0C Q 8apH!`‹~F#0$ B R!B Ť0AH!PTB C X!BB P!0,@@XTZ@ >`$B xPHR`@q x,0C `Q 8ap!‹~FP$ B @!BĤ0H!PRB C X!BB0 P!0,@@XRZ@ >`$B xP@`@q x,0C H HQ 8ap!‹~FcP$ B F!B`Ĥ0H!P!@!!H`X X!2,@@XP!0Z@ > @ `$B xPF`@q x0,0C H HQ 8apP! ‹~FC$ B T!BPF!0,@@X X!B0(@ F$` `^!@ !V! H  H@"@ 8HQB,P^!@XQV!pB V` (PQV @@$R9 @W @$B9 XaW! @ 8Dq B V # B @! , pU HQH  P0i&$`8 @`B 0B`p<B A!B!b F",@@80H@R $%@@P!p` (J00 PX H qA0C$@H`% f!D0 (0,Byp $,X@DBĤ@GP @PL`B C hN!`BB `F!,@XL`bLH0L ` V!P #h$B(YhZP(J!!HY hN!B0(@X `F!0 Ĥ(J `` V!P 3h$B' `$0 (Y H PJPB C hN!PBB `F!,@X J`V!"H LH5b, p\PpA$BHX@$H s f!0 XhZ,e`N!bLHPL`B C hN!`BB0`F!,@XL @` V! C$`H `N!0 0 Y 0L0 hL!P@B C hN!BB0`F!,@X @`V!C1i&$H8 hM! @@P$,Y hN!00 `F! ,@` ` V!1i&$H @ H8@0 P$,Y hN!B@X `F!0@0(@bLH0@ ` V! Ch$B* pH!0 YP!@!!HY hN!2,@X `F!0 ``V! `LH S `N!@H h$BzF H hZB YPhN! , !B0 C()$, `@!B(Q@XHUa@??20 April 2009 note: didn't find end-of-central-dir signature at end of central dir. error: expected central file header signature not found (file #%lu). error [%s]: attempt to seek before beginning of zipfile %scaution: filename not matched: %s caution: excluded filename not matched: %s (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) zipinfoCompiled with %s%s for %s%s%s%s. UnZip %d.%d%d%s of %s, by Info-ZIP. For more details see: unzip -v. %d (null)-x-d-Zii[-Z] You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT. " @pp P 0 0@P@0P  pY ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZIP.C;1˨TENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZPRIV.H;1T{Di;lnrszz͂ EؚFG#j  z$ 20000/~̮uossz0r h?u'.0 0p~00&#a `"^`" .W`(@i^00 00&~0~i&?AH0&@0/   {z t ee|@{^{n_Ԫ/ ק~ "0/~Ԫ/0  0Ԫ/Ԫ/ 00 Ԫ/ӫ$0 ~0 ~Ԫ/0000  Ԫh֪0Ԫ/0Ԫ/(|0  0Ԫ/| '1  0 |1n~~~0@>w w xwxP0d/d ^̵qjPogg?йP;E v Pq v P"^pcoйP)p s u o/$Q?ŭ!ê$Q?ŭ!ê$Q/!ê$zõ@  p!kt!kt2oktorc too]xB?xQu"__ 1y?ya"yy>@%.pCUNZIPHP C S7.1-012mainunzip uz_opts zusagez UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;14zЇ__main,C.shstrtab.note$READONLY$$CODE$MASK_BITSVERSIONDATEENDSIGMSGCENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSGZIPNFOCOMPILEDWITHUNZIPUSAGELINE1$LITERAL$$LINK$$DATA$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind_info.rela.IA_64.unwind.rela$CODE$.rela$DATA$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZIP.C;1GMAINUNZIPUZ_OPTSUSAGEMASK_BITSFNAMESVERSIONDATECENTSIGMSGENDSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSGZIPNFOCOMPILEDWITHUNZIPUSAGELINE1__MAINOTS$MOVEELF$TFRADRDECC$MAINDECC$EXITGLOBALSCTORRETURN_VMSDECC$SIGNALVMS_UNZIP_CMDLINEDECC$STRLENDECC$STRNCASECMPDECC$STRNCMPENVARGSDECC$PERRORDECC$TXSPRINTFZI_OPTSDECC$STRCMPPROCESS_ZIPFILESDECC$MEMCPYVMSCLI_USAGEDECC$ISATTYVERSIONDECC$GETENVDECC$$SHELL_HANDLERHANDLER     1h 38>p,F@=LDV]iGtI~ < $ -  #G $0BN_lt+DZ@UQU'+'U''pW'@=''Ce ee'WA____ _(_00_8_p@_HH_pP_@=X_h`_@=h_Cp_I-II.2I/RIbI0RBI1RB"I1@RBRI1pRBI1RBI1RBI1I2bI3  I420"I4a2(I5HHI6@hQhrI6I7bI3I8I9Ip   2 " I5 2 I:0@APrI8pI8"I;``"$I8"&I8& & &I8R'I8'I8Q(`p(`(I8(`)`")I8)`)`)I8`*a*b*2p*q****I32+I<+I=++P,`,a,p,,I8-----I8.I>!/@/p/2/I8/P///P//0I80I81I?01p@1pR1I81I8r2I83I83I8"4I84I8 505B5I85I8b6I86 6 6I8`7q77I88I8b8Hp8H8I@9I8r9I@9I8b:I@:I8R;I@;I8b<I=B=R=`==8====8==>2> >b>I8>>>I8@?Q?b?I8?2@?I+ @!@1@@@R@I8@2Q%5 UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;1$78@@@@@I8AI8BBBI8BBBI8CC C0CBCI8%(%%0 %%8%@% % % !$%(%H,%0%h!4%P8%0<%!@%XD%@H%`L%"P%hT%P"X%p\%"`%xd%"h%8#l%p%t%x%|%%%#%0%%%X%h%%%#%%8%x%$%%%h$%%$%$%H%% %8 %%` %%%x %%%(&%x&% % %&% %X %'% %`'%'%' % $%H((%(,%(0%()4% 8%p)<%)@% D%*H%0 L%X*P%@ T%*X%*\%8+`%+d%+h%h l% ,p%p,t% x%,|%-% %`-%-%-% %H.% %.%.%(/%0 %x/%/%0%X %h0% %0%1%X1%%% % %1% %1%X %@2%% % % %2%2 % %%03%x3%3 %P$%(%,%40%4%8%<%@%D%X4H%@L%P%XT%4X%4\%85`%5d%5h%hl%p%t%(6x%p6|%6%7%`7%7%x%7%H8%8%%8%89%9%9% :%%0%%%h%p:%:%%%%%%%%;%P;%;%;%0<%% %x< % %8%P%%< %$%((%,%0%@4%`8%<%@%D%H%L%8P%hT%0X%=\%`%X=d%h%8l%p%@ `=?C#D-Ѓ9PC0HN@V(i0 Ѕ(HPp`t@pxЗ H`0 `]Hx"`@0``t<`M`0\  UNZIP.BCKbs)[UNZIP60.VMS-BINARIES]UNZIPCLI.IA64_OLB;10pPhhТ`-*[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1+,./ 4-s0123 KPWO56k 7 89GHJ% VAX-11 Librarian V04-00 l ) !+2P MMp  W CENTSIGMSG3 CLI_BINARY3CLI_BINARY_ALL3CLI_BINARY_AUTO3CLI_BINARY_NONE3 CLI_BRIEF3CLI_CASE_INSENSITIVE3 CLI_COMMENT3 CLI_DIRECTORY3CLI_DOT_VERSION3 CLI_EXCLUDE3 CLI_EXISTING3CLI_EXIST_NEWVER3CLI_EXIST_NOEXT3CLI_EXIST_OVER3 CLI_FRESHEN3CLI_FULL3CLI_FULL_DIAGS3 CLI_HEADER3CLI_HELP3 CLI_INFILE3CLI_INFORMATION3CLI_JUNK3CLI_LIST3CLI_LONG3 CLI_LOWERCASELF{3 CLI_MEDIUM3CLI_ODS23 CLI_ONE_LINE3 CLI_OVERWRITE3CLI_PAGE3 CLI_PASSWORD3CLI_PIPE3 CLI_QUIET3 CLI_RESTORE3CLI_RESTORE_DATE3CLI_RESTORE_DATE_ALL3CLI_RESTORE_DATE_FILES3CLI_RESTORE_OWN3 CLI_SCREEN3 CLI_SHORT3CLI_SUPER_QUIET3CLI_TEST3CLI_TEXT3 CLI_TEXT_ALL3 CLI_TEXT_AUTOT_STMLF3 CLI_TIMESTAMP3 CLI_TRAVERSE3 CLI_UPDATE3 CLI_UPPERCASE3 CLI_VERBOSE3 CLI_VERSIONC CLI_LOWERCASE CLI_TEXT_AUTOSEEKMSG__MAINl3 CLI_TEXT_NONE3CLI_TEXT_STMLF3 CLI_TIMES3 CLI_TIMESTAMP3 CLI_TOTALS3 CLI_TRAVERSE3 CLI_UPDATE3 CLI_UPPERCASE3 CLI_VERBOSE3 CLI_VERSION3CLI_YYZ3 CLI_ZIPFILEW COMPILEDWITHW ENDSIGMSGWEXCLFILENAMENOTMATCHEDWFILENAMENOTMATCHEDWMAINW MASK_BITSW REPORTMSGWSEEKMSGPUSAGELINE13 UNZIP_COMMANDW VERSIONDATE3 VMSCLI_USAGEN VMS_UNZIP_CLD3VMS_UNZIP_CMDLINEWZIPNFO.3CMDLINEWUNZIPN VMS_UNZIP_CLDWUNZIPWUNZIPUSAGELINE13 UNZIP_COMMANDWUSAGEWUZ_OPTSW VERSIONDATE3 VMSCLI_USAGEN VMS_UNZIP_CLD3VMS_UNZIP_CMDLINEWZIPNFOW__MAIN x UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1F UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1 !"#$%&'()*+, O0 UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1 ,-./01241=i-l V1.04CMDLINEV1.030-APR-2009 11:08DEC C V6.2-003 CLI_TEXT  CLI_TEXT_AUTO  CLI_TEXT_ALL  CLI_TEXT_NONE CLI_TEXT_STMLF  CLI_BINARY CLI_BINARY_AUTO CLI_BINARY_ALL CLI_BINARY_NONE CLI_CASE_INSENSITIVE CLI_SCREEN  CLI_DIRECTORY  CLI_FRESHEN CLI_HELP CLI_JUNK  CLI_LOWERCASE CLI_LIST 5 CLI_BRIEF CLI_FULL CLI_FULL_DIAGS  CLI_EXISTING CLI_EXIST_NEWVER CLI_EXIST_OVER CLI_EXIST_NOEXT  CLI_OVERWRITE  CLI_QUIET CLI_SUPER_QUIET CLI_TEST CLI_PIPE CLI_PASSWORD ! CLI_TIMESTAMP " CLI_UPPERCASE # CLI_UPDATE $ CLI_VERSION % CLI_RESTORE &CLI_RESTORE_OWN 'CLI_RESTORE_DATE (CLI_RESTORE_DATE_ALL )CLI_RESTORE_DATE_FILES6 *CLI_DOT_VERSION + CLI_COMMENT , CLI_EXCLUDE -CLI_ODS20 PExamples (see unzip.txt or "HELP UNZIP" for more info): unzip edit1 /EXCL=joe.jou /CASE_INSENSITIVE => Extract all files except joe.jou (or JOE.JOU, or any combination of case) from zipfile edit1.zip. unzip zip201 "Makefile.VMS" vms/*.[ch] => extract VMS Makefile and *.c and *.h files; must quote uppercase names if /CASE_INSENS not used. unzip foo /DIR=tmp:[.test] /JUNK /TEXT7 /EXIS=NEW => extract all files to tmp. dir., flatten hierarchy, auto-conv. text files, create new versions. :PMajor options include (type unzip -h for Unix style flags): /[NO]TEST, /LIST, /[NO]SCREEN, /PIPE, /[NO]FRESHEN, /[NO]UPDATE, /[NO]COMMENT, /DIRECTORY=directory-spec, /EXCLUDE=(file-spec1,etc.) Modifiers include: /BRIEF, /FULL, /[NO]TEXT[=NONE|AUTO|ALL], /[NO]BINARY[=NONE|AUTO|ALL], /EXISTING={NEW_VERSION|OVERWRITE|NOEXTRACT}, /[NO]JUNK, /QUIET, /QUIET[=SUPER]8, /[NO]PAGE, /[NO]CASE_INSENSITIVE, /[NO]LOWERCASE, /[NO]VERSION, /RESTORE[=([NO]OWNER_PROT[,NODATE|DATE={ALL|FILES}])]  PType "unzip /ZIPINFO" for ZipInfo-mode usage.FPUsage: unzip file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options /modifiers Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s 8P20 April 2009P Type unzip "-Z" for Unix style flags Remember that non-lowercase filespecs must be quoted in 9VMS (e.g., "Makefile"). `Pmiscellaneous options: /HEADER print header line /TOTALS totals for listed files or for all /COMMENT print zipfile comment /TIMES times in sortable decimal format /[NO]CASE_INSENSITIVE match filenames case-insensitively /[NO]PAGE page output through built-in "more" /EXCLUDE=(file-spec1,etc.) exclude file-specs from listing P usage: zipinfo file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options or: unzip /ZIPINFO file[.zip] [l:ist] [/EXCL=(xlist)] [/DIR=exdir] /options main listing-format options: /SHORT short "ls -l" format (def.) /ONE_LINE just filenames, one/line /MEDIUM medium Unix "ls -l" format /VERBOSE verbose, multi-page format /LONG long Unix "ls -l" format P20 April 2009PZipInfo %d.%d%d%s %s, by Newtware and the fine folks at Info-ZIP. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the; specified .zip archive(s). "file[.zip]" may be a wildcard name containing * or %% (e.g., "*font-%%.zip"). PVMSCLI_usagePcheck_clitPget_listnP-xkP-dhP-PbPunzipPPvms_unzip_cmdline<PGGPunzip ;P@@PINFILE:P88PZIPFILE9P **PYYZ_UNZIP8P%%PPAGE7PPONE_LINE6PPTIMES5PPTOTALS4PPHEADER3PPVERBOSE2Pzà UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1;<PLONG1PPMEDIUM0PPSHORT/PPZIPINFO.P PTRAVERSE_DIRS-PPODS2,PPEXCLUDE+PPCOMMENT*P PDOT_VERSION)PPRESTORE.DATE.FILES(PPRESTORE.DATE.ALL'P {{PRESTORE.DATE&PhhPRESTORE.OWNER_PROT%P``PRESTORE$PXXPVERSION#PPPPUPDATE"P FFPUPPERCASE=!P <<PTIMESTAMP P22PPASSWORDP--PPIPEP((PTESTP PQUIET.SUPERPPQUIETP   POVERWRITEPPEXISTING.NOEXTRACTPPEXISTING.OVERWRITEPPEXISTING.NEW_VERSIONPPEXISTINGPPFULL.DIAGNOSTICSPPFULLPPBRIEFPPLISTP PLOWERCASEP>PJUNKPPHELPPPFRESHENP ||PDIRECTORY PuuPSCREEN PddPCASE_INSEN . CLI_TRAVERSE /CLI_INFORMATION 0 CLI_SHORT 1 CLI_MEDIUM 2CLI_LONG 3 CLI_VERBOSE 4 CLI_HEADER 5 CLI_TOTALS 6 CLI_TIMES 7 CLI_ONE_LINE 8CLI_PAGE 9CLI_YYZ : CLI_ZIPFILE ; CLI_INFILE < UNZIP_COMMANDUNZIPUSAGELINE1 VMS_UNZIP_CLDGDEC?C$GA___CTYPE CLI$GET_VALUE CLI$PRESENT CLI$DCL_PARSESTR$FIND_FIRST_SUBSTRING STR$CONCATSITIVE P XXPBINARY.NONE P LLPBINARY.ALL P @@PBINARY.AUTOP99PBINARYP ..PTEXT.STMLFP $$PTEXT.NONEPPTEXT.ALLP PTEXT.AUTOP  PTEXTP__iscntrl@ PլRDECC$GA___CTYPEQˏP@aPˏPRRP^@9 ʏP1LIB$GET_FOREIGNj#Tk.P K+haa&;@HHuDpdH29}bfz:XTSB5 Wy^o-$r&2ٝP2\aPfaK$ O !{VN4DGM=*CuFD8dQs  ssnOoE6kFA_K^r hSY%Wu `n\,hOfpqTtkfP>s5+!V2 _sr/]ajGH\T]n+/FcApq(ud??rIm ifpc/Nr%43L.,[>Lin/:tB4iE^I[Ip!< 9^j|'0Zd#J\T|ifp0-W/Y/&@e{*5_k?mE4r1}^8#䂂W+{xe*9~;Mx!ipA%*FV&|n5Cne>}Qv1yRBrv -d%8p#v4zC.1g%0Y&U)F,`&/.v ju>ms63%`S{Eg9wSb$u69 ?b n:i²|P3P֩0G 78xsu}o3z05cD<;^@}f29(21B>Pe12Ip$bm4}7;e#rK-1$ļ@nb'X!+&tG'masE!0*`t(L4W%9+Lt\*OOeWKAF#0E]-yVCA= OQL`Kd`qy(poBH*Hh7hnEAE~DU. Ş(P9QhzH[QeqKLatk `g\u#V Y60&jXFӖmK\Ge܊A![?XMRINVRpkYa]2O#| v6KΘfo8P Bn}FlR^Z >0 _$MiqF+@ I[^.3NB CHvFyX5U ' GLJ_HEAE-_D4ZIGsQ7?JMmcfPC}<|k .  $@H ez횞j ! a|_NbHZbYNcPDcT˿6Z?ej_b> )-\GRsU0M6b0\QduCк7JIP)U w" 8S=VSO\W @" g'NPb$C_bG\-[mK}V[ cO-C2 MJg>PYh#8H1d2bס(YN/ ^VXWR5_*.0`PFgU4uWH n<JpGL2R}F8 f8hbVVOu{)0+HC_t5 L" D;YW WtU/aTII,H:BmsQ1FPA^^v5~Dh-YtuWhX)@z3}RAgYfAڜ\&VagkTܛLNy|% p1ljCTH0U@' @lYTS1LيV ni/YT\Ds``t -OWIRPVheM1 X9_ND3~YY] R 0_Cy&tʀk@AIMO X$aݷ;q҃dXZ [}1 X=\ZŔ TL)G0JLE)B!A~KG0'_`9Cߙ޿"'$]ý̧T+%}6 hTD!doQZ Ӓ*tƿl6:uJ+̝^hNu!lo5{0IS-h]͝1_ 0p3Ώ> Tn_P$6HN(SNt0A 6#&/i۟?s0x݌q; J^d7a@rV@p_AnPs}H_b3/!mM쀏i?*l%JCN‡L&H9U6v'j3u/>\u{@fŁt*jQ4k5A3' ɿw\eZ,tё,fưL1e_^UV HiN <,F䰍BݔW{q^;Eot2P: ٍEe,< ڢ{/wx!G)lRhg?aeps1z'~ECG*5d `p'!Dc5$!ukxq4 |^k :~CR|zvbw`ܧS}?G# $Tŧ'p>Zy!21Z&X:NPCt'*/=xa;t{cy֬laH}ɫrd9Ӧ!0#Kwf̴P4l< u=G7 dL>5[ڼ(2 'jB0Ah, z_78]a+Ď Y"ЮߒVKdՇն!5M\jK/VuGOYDB یT[K*13Cj@D0rWh|uZy/2_q_a , w[CMczR,UF`[X+&~3e9X.!~(6wTE0kmvxs.).CBU'3s@iT|)8)r^l'P??3RJ{m2hG{h7czƜu*Aa3^)5X%9AtTA K1UKD. J oK/n5K 9e!v4 UJU`4,fRK()~vvM8'bC-jfJ)' juh:.*>llM\$NY{!'3@Vxm2 ` WZ8Z %[Y(9XgFhE[b WKŠ!TèTML'Q KmB,a.1yO LR~1J)\ л Vo}?,1"N{ i)k^~[fE5Q<2wEDgR*JT>pTQVWX'ə%Ck.`}Lhjnɩ -r}:`Z (cWly`p̰02D41y?,P8Q΃2KxhhCrdml?ҩ:N"VqWL_ z}kx47) Sc+{5souf.kwH!_fEa$WusW?&1<96vph4hW?8{T{"g%v"2H8K#kEm}Ѫ6!{\}$Vmv (OG7%dqYgh^2ιᕦԠj 9 kg 8|Xfyhi[ (4B|mry6?Mwb>.]s (o3}+㋠C|WQN U?AЀJpXI)#0YM* 5.n*G'OH9 5t xR3psak\,$%=$f(PC-옹tv82PI8jwS6`?JuI`9)&-c8KJRuU؎|_&)&8{̖OāfOQRjgf(x, c@3C$݈)TQ5#mDÉhtaz?pY2t7+#x1/D $LH[@\@)5@XDLFc}d]`FxsP(},,$;}[:qZd|~S-3@1s伢@ Il9TڰX%:{qM~HuFB;OƗfxhf{6by6㡄 Ww*\'|;$$Nu4qnR}{fF3+E׻0bQ*|\jicO-_Mt̫1ƴo@DYQc@"t+r>g. jFU|Kl&NxZc⿘0xA8C]GBKW>[HPJ\_[SOAhM=E4=A8#YZ``')v̯RpolYC7Fl}d{ha w5jM̪T|9HA$h==0 ye UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1JKNARY_NONECLI_CASE_INSENSITIVE CLI_SCREEN CLI_DIRECTORY CLI_FRESHENCLI_HELPCLI_JUNK CLI_LOWERCASECLI_LIST CLI_BRIEFCLI_FULLCLI_FULL_DIAGS CLI_EXISTINGCLI_EXIST_NEWVERCLI_EXIST_OVERCLI_EXIST_NOEXT CLI_OVERWRITE CLI_QUIETCLI_SUPER_QUIETCLI_TESTCLI_PIPE CLI_PASSWORD CLI_TIMESTAMP CLI_UPPERCASE CLI_UPDALTE CLI_VERSION CLI_RESTORECLI_RESTORE_OWNCLI_RESTORE_DATECLI_RESTORE_DATE_ALLCLI_RESTORE_DATE_FILESCLI_DOT_VERSION CLI_COMMENT CLI_EXCLUDECLI_ODS2 CLI_TRAVERSECLI_INFORMATION CLI_SHORT CLI_MEDIUMCLI_LONG CLI_VERBOSE CLI_HEADER CLI_TOTALS CLI_TIMES CLI_ONE_LINECLI_PAGECLI_YYZ CLI_ZIPFILE* CLI_INFILE UNZIP_COMMAND DECC$DSPRINTFRbSPG@3GGC3P`*G@3bSPG@3GGC3P`G@3bSPG@3GGC3P`G@3bSPG@3GGC3P`լ TTTP@ ww l  GOATHUNTER CMDLINE&i2l  GOATHUNTER VMS_UNZIP_CLD$  GOATHUNTER UNZIPO1i2l 03-003+ VMS_UNZIP_CLD03-00330-APR-2009 11:08-VAX/VMS Command Definition Utility (V4-001) VMS_UNZIP_CLDH CLI$TABLESP H UNZI ,(Tl UNZIP4!)P1ZIPFILEZip file8a!(P2INFILEFiles to UnZip( BINARY$c ( TEXT(4PSCREEN(\ DIRECTORY(FRESHEN$HELP$JUNK$LIST$ BRIEF$8 FULL(`< EXISTING(  OVERWRITE$ QUIET$TEST$PIPE(PASSWORD(QD TIMESTAMP,p TRAVERSE_DIRS( UPPERCASE(UPDATE(VERSION(cRESTORE(8COMMENT(a`EXCLUDE0CASE_INSENSITIVE( LOWERCASE$PAGE, DOT_VERSION$,RODS2(T YYZ_UNZIP(|ZIPINFO,` INFORMATION4!)P1ZIPFILEZip file<a!(P2INFILEFiles to display(@ZIPINFO(hONE_LINE$SHORT(MEDIUM$LONG(VERBOSE((SHEADER(PCOMMENT(x TOTALS$ TIMES(a EXCLUDE0 CASE_INSENSITIVE$ PAGE$<RESTORE_KEYWORDS$`DATE, OWNER_PROT$RESTOREDATE_KEYS$FILES$ALL T QUIET_MODIFIER$SUPER$` EXISTING_KEYWORDS,  NEW_VERSION(  OVERWRITE( NOEXTRACT   FULL_MODIFIER, DIAGNOSTICS$L CONVTXT_KEYWORDS$p AUTO$ ALL$ NONE$STMLF$ CONVBIN_KUEYWORDS$$ AUTO$H ALL$NONEL  4 ` , d (X    4   $ p D T $ p  `  ` 8  <V     << T H `t    `  <<  <<8Hp L hxL   p    J  0< T wwX1) V1.02UNZIPV1.030-APR-2009 11:07DEC C V6.2-0039P%d 9Pshow_version_info9P%s P28PT`ij*,fhBD:uv.L DhHhB[^(NY\nHb1x4n@ ^   4!!!!H"c"""D#^### $T$$$%b%%%1&j&&'T'U'V'a'''(h(((((6)t))*0*8***+P+Q+p+++,,,@,,,,,,8---....`...F///0`00. UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1bYZ041112]22233303x3333 4142434L444 5e555566"6U666677I7h77777808Z8{8|888,9V9W99W9PSee unzipsfx manual page for more information.,9Pforces extraction to specified directory.8PBy default, all files extracted to current directory. This option8P -d exd - Extract to directory exd.|8PIf unzipsfx [compiled with SFX_EXDIR defined, -d option also available:Z8P -$ - Restore volume label.08P -s - Convert spaces to underscores.8P -V - Keep version numbers.7P -j - Junk paths.7P -C - Match names case-insensitively.7P -q - Quiet operation.7P -o - Overwrite without prompting.h7P -n - Never overwrite.I7P -a - Convert text files.7P Most unzip modifiers are supported. These include7Punzipsfx modifiers:\6P -z - Print archive comment. (See unzip above.)6P -t - Test embedded archive. (Can be used to list contents.)U6P -f, -u - Freshen and Update, as for unzip."6P -c, -p - Output to pipe. (See above for unzip.)6Punzipsfx options:5P [-options] [file(s) ... [-x xfile(s) ...]]5Punzipsfx command line:e5P Regular unzip may still be used to extract embedded archive however. 5P for example, will only self-extract under the ]same flavor of Unix.4P In general, a self-extracting archive made on a particular Unix system,4P portable across different operating systems than unzip executables.L4P Self-extracting archives made with unzipsfx are no more (or less)34Punzipsfx self extractor: 4P funzip [-password] [input[.zip|.gz]]3Pfunzip command line:3P is given, read from that file instead of stdin.x3P used to unzip the first member of a stream or pipe. If a file argument03P funz^ip extracts the first member in an archive to stdout. Typically3Pfunzip stream extractor:2P -z Include archive comment if any in listing.2P -UU [UNICODE] Disable use of any UTF-8 path information.]2P representing the Unicode character number of the character in hex.2P not in current character set as text #Uxxxx and #Lxxxxxx escapes1P -U [UNICODE] If entry has a UTF-8 Unicode path, display any characters1P Default date and time format is_ a more human-readable version.41P -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)0P and compressed sizes, and compression factors.0P -t List totals for files listed or for all files. Includes uncompressed`0P -M Pipe all output through internal pager similar to Unix more(1) command.0P -h List header line. Includes archive name, actual size, total files./P -v List zipfile information in verbose, multi-page format./P -l ` List in long Unix ls -l format. As -m, but compression in bytes.F/P -m List in long Unix ls -l format. As -s, but includes compression %..P -s List archive entries in short Unix ls -l format. Default list format..P -2 List names only as -1, but include headers, trailers, and comments.`.P -1 List names only, one per line. No headers/trailers. Good for scripts..Pzipinfo options (these are used in zipinfo mode (unzip -Z ...)):.P digit.-P or #Lxxxxxx whaere it doesn't, where x is the ASCII character for a hex-P in the form #Uxxxx where the Unicode character number fits in 16 bits,8-P Characters not in the current character set are shown as ASCII escapes,P with Unicode entries. Currently Unicode on Win32 systems is limited.,P If compiled with Unicode support, unzip automatically handles archives,PUnicode:,P quieter operation.@,P This can be modified using -q for quieter operation, and -qq for even,P -tb test contents of archive,PTesting archives:+P cat archive | funzip+P used to process the first entry in a stream.p+P Currently unzip does not support streaming. The funzip utility can beQ+PStreaming (piping into unzip):+P use unzip on that. See the manual page for Zip 3.0 or later.*P to use zip to convert the split archive to a single-file archive and*P Currently split archives are not readable by unzip. A workaround is8*PMulti-part (splcit) archives (archives created as a set of split files):*P unzip archive -x pattern pattern ...)P archive. Exclude and include lists end at next option or end of line.t)P Patterns are paths with optional wildcards and match paths as stored in6)P -x pattern pattern ... exclude files that match a pattern(P -i pattern pattern ... include files that match a pattern(PInclude and Exclude:(P For shells that expand wildcards, escape (\* or "*") so unzip can redcurse.h(P If port supports [], must escape [ as [[](P [list] matches char in list (regex), can do range [ac-f], all but [!bf]'P * matches any number of characters, including zero'P ? (or %% or #, depending on OS) matches any single charactera'P Internally unzip supports the following wildcards:V'PWildcards:'P extended name characters on ODS5 and applying ODS2 filtering on ODS2.&P Default is to exploit destination file sysetem, preserving cases andj&P -2 [VMS] Force unconditional conversion of names to ODS-compatible names.1&P this is not a good thing and should be avoided.%P -^ [Unix] Allow control characters in names of extracted entries. Usually%P directory, which can be a security problem.b%P paths such as ../foo to be extracted above the current extraction%P locations outside of current extraction root folder. This allows$P -: [All but Afcorn, VM/CMS, MVS, Tandem] Allow extract archive members into$P -/ e [Acorn] Use e as extension list.T$P removable. -$$ allows fixed media (hard drives) to be labeled. $P -$ [MS-DOS, OS/2, NT] Restore volume label if extraction medium is#P -Y [VMS] Treat archived name endings of .nnn as VMS version numbers.#P system privileges.^#P -XX [NT] Extract NT security ACLs after trying to enable additionalD#P user privileges."P vgersions of OS/2, or security ACLs under Windows NT. Can require"P or UIDs/GIDs under Unix, or ACLs under certain network-enabledc"P -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACL entries under VMS,H"P directory levels.!P match directory separator /, but ** does. Allows matching at specific!P -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do not!P -V Retain VMS file version numbers.4!P paths stored ash native local paths are still processed as Unicode. P -UU [UNICODE enabled] Disable use of stored UTF-8 paths. Note that UTF-8 P uppercase if created on MS-DOS, VMS, etc. See -L.^ P text escapes where x is hex digit. [Old] -U used to leave names P -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCIIP -S [VMS] Convert text files (-a, -aa) into Stream_LF format.P -s [OS/2, NT, MS-DOS] Convert spaces in filenames to un UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1hiderscores.@P -q Perform operations quietly. The more q (as in -qq) the quieter.P command line to other users.P -P p Use password p to decrypt files. THIS IS INSECURE! Some OS showP care.nP -o Overwrite existing files without prompting. Useful with -f. Use with4P -N [Amiga] Extract file comments as Amiga filenotes.P -n Never overwrite existing files. Skip extracting that file, no prompt.P -M Pipe all output through ijnternal pager similar to Unix more(1).xP -LL Convert all files to lowercase.1P -L Convert to lowercase any names from uppercase only file system.P -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.P -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info.bP -j Junk paths and deposit all files in extraction directory.HP standard header.P -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name inkP ACORN_FTYPE_NFS] Translate filetype and append to name.nP -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn if\P restore.P -E [MacOS (not Unix Apple)] Display contents of MacOS extra field duringP -DD Skip restoration of timestamps for all entries.P is on by default and -D essentially becames -DD.NP -D Skip restoration of timestamps for extracted directories. On VMS this(P -C Use case-insensitive maltching.P overwritten file in foo~ or foo~99999 format.P -B [UNIXBACKUP compile option enabled] Save a backup copy of each^P [VMS] Autoconvert binary files. -bb forces convert of all files.P -b Treat all files as binary.  [Tandem] Force filecode 180 ('C').P marker, and from or to EBCDIC character set as needed.P -a Convert text files to local OS format. Convert line ends, EOFPunzip modifiers:[P -z Display only archimve comment.BP verbose output.P information. Also can be added to other list commands for moreP -v Use verbose list format. If given alone as unzip -v show versionhP -u Update existing older files on disk as -f and extract new files.HP zip -o but faster.P -T Set timestamp on archive(s) to that of newest file. Similar toP -t Test archive files.P files extracted in binary mode (as stored).hP -p Extract fniles to pipe (stdout). Only file data is output and allDP -l List files using short form. P -f Freshen by extracting only if older file on disk.P -a allowed and EBCDIC conversions done if needed.P -c Extract files to stdout/screen. As -p but include names. Also,LP -A [OS/2, Unix DLL] Print extended help for DLL..P -hh Display extended help.P -Z Switch to zipinfo mode. Must be first option.Punzip options:Pport and is refoerred to as Unix Apple.vPBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix based:P unzip -Z options archive[.zip] [file ...] [-x xfile ...]P zipinfo options archive[.zip] [file ...] [-x xfile ...]PBasic zipinfo command line:Poptions.Pis provided. The -Z option sets zipinfo mode and changes the availableDPIf unzip is run in zipinfo mode, a more detailed list of archive contentsP unzip -a foo - unzip foo and convert text fpiles to local OSP unzip foo - unzip the contents of foo in current dirhP unzip -Z foo - list files using more detailed zipinfo format,P unzip -t foo - test the files in archive fooP unzip -l foo.zip - list files in short format in archive foo.zipPSome examples:P unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir]jPBasic unzip command line:`Pinstead.Pneeded. With appropriate options,q UnZip lists the contents of archivesPextract zipfile entries to the current directory, creating directories asPUnZip lists and extracts files in zip archives. The default action is toTPSee the UnZip Manual for more detailed help8PExtended Help for UnZip$Phelp_extendedP[-Z] P You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT. P"P"PusagePuz_optsP-xP-dP-ZPiiPunzipPmainPSeer "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer  Pmodifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALLs files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %s P -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir m P=>t define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe B P-Z => ZipInfo mode ("unzip -Z" for usage). PUsage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s  PLatest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ; see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites. \ PUnZip %d.%d%d%s of %s, uby Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details.  PUnZip %d.%d%d%s of %s, by Info-ZIP. For more details see: unzip -v. P P05 Jan 2007! P [decryption, version %d.%d%s of %s]  PVMSCLIPUSE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)PUSE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)PTIMESTAMPPSET_DIR_ATTRIBWPCOPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)vPP[none]@P%16s: %.1024s P UnZip and ZipInfo environment options: P %s PUnZip special compilation options: P -M page output through built-in "more" Pmiscellaneous options: -h print header line -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive %s -x exclude filenames that follow from listing P main listing-format options: -s shorwt Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format PZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildca UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1wxrd name containing %s. usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] P* or % (e.g., "*font-%.zip")P -Y treat ".nnn" as ";nnn" version -2 force ODS2 names --D restore dir (-D: no) timestamps -M pipe through "more" pager (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.) P -X restore owner/ACL protection infoP -T timestamp archivey to latestTP unzip "-V" foo "Bar" (Quote names to preserve case, unless SET PROC/PARS=EXT) NPvms.cPcaution: both -n and -o specified; ignoring -o Perror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid Perror: -Z must be first option for ZipInfo mode (check UNZIP variable?) PPerror: must give decryption password with -P option Perror: -d option used more than once (only one exdir allowed) Perror: must specify directory to which to extzract with -d option Pcaution: not extracting; -d ignored `Perror: command line parameter #%d exceeds internal size limit 6Penvargs: cannot get memory for arguments+PZIPINFOOPTPZIPINFO_OPTSPUNZIPOPT PUNZIP_OPTS PCompiled with %s%s for %s%s%s%s.  Pzipinfo P (please check that you have transferred or created the zipfile in the appropriate  MASK_BITS  VERSIONDATE  CENTSIGMSG  ENDSIGMSG SEEKMSG FILENAMENOTMATCHED{ EXCLFILENAMENOTMATCHED REPORTMSG ZIPNFO COMPILEDWITH UNZIPUSAGELINE1FNAMESG DECC$EXITVERSIONENVARGS VMSCLI_USAGEVMS_UNZIP_CMDLINE RETURN_VMS ZSTRNICMPHANDLERZI_OPTSPROCESS_ZIPFILESUZ_OPTSUNZIP GLOBALSCTOR DECC$GETENV DECC$SIGNAL BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles)  Pcaution: excluded filename not matched: %s Pcaution: filename not matched: %|s Perror [%s]: attempt to seek before beginning of zipfile %sPerror: expected central file header signature not found (file #%lu). P note: didn't find end-of-central-dir signature at end of central dir. P20 April 2009P??P__iscntrl9P ^DECC$MAIN_ARGSS ^SR GLOBALSCTORݬݬUNZIPP RETURN_VMSS R DECC$EXITRP|^HANDLERSS DECC$SIGNALRbSbSb}S bSbS b߬߬VMS_UNZIP_CMDLINEPRʏPRV1RѬRRG3ݼ DECC$STRLENPRRPbPP]RRR R ZSTRNICMPP1R ZSTRNICMPPѬHЬRݢ DECC$STRNCMPP0G3Pş?߬߬ENVARGSPS:A DECC$PERROR-PG3 ş߬߬ENVARGSPS  DECC$PERRORS1RY޼PB` DECC$STRLENP`?9RşG@3 DECC$DSPRINTF<~PG@3GGC3~P` V1^PRRG3߬߬ZI_OPTSPSP߬߬UZ_OPTSPSլSSV1ЬRbG@3ЬG3G3լ1SURG3ЬG3Rb1PG1σb DECC$STRNCMPP1PRPPTbGSbG3RPPG3SUbG3RPPG3GP`PFRb bG6P&G@3 DECC$DSPRINTF<~PG@3GGC3P` V1T1բ RG3ìG3PPPG31G3FNAMESG3G31qPUkϋb DECC$STRCMPPWURG3FNAMESG3G3SbG3RPPG3SRG3ìG3PPPG3SRb1G3G6G3.ŸG@3 DECC$DSPRINTF<~PG@3GGC3P`PROCESS_ZIPFILESPVVRRPP^[YSXмVUV1eR1bRR-1 DECC$DSPRINTFZeRW1[WPP-M>P1P?PS1PS SG 3P PG 3G 3S1tG 31jPS SG3P PG3G3S1DG 3G3G 31,S G3S1G31PS G3S1G31PS4&G@3 DECC$DSPRINTF<~PG@3GGC3P` T1G44G@3 DECC$DSPRINTF<~PG@3GGC3P` T1RGRP`P1VQVUeGeP`PP-nψG@3 DECC$DSPRINTF<~PG@3GGC3P` T1'P6PNG@3 DECC$DSPRINTF<~PG@3GGC3P` T1bP1RbP1PRbP1PS SG3P PG3G3S1G31P1SGL3G 3S1zPGL3G 31fPX1\bPPh X1JPX1APS G(3S10G(31%PS SGT3P PGT3GT3S1GT31PS SG03P PG03G03S1G031PS Gt3S1Gt31PS G43S1G431PS SG83P PG83G83S1hG831^PS,G3G<3P PG<3 PG<3S1,G3G<31PS4оG@3 DECC$DSPRINTF<~PG@3GGC3P` T1G31RG3RP`P1VRVUeG3eP`PP-ocG@3 DECC$DSPRINTF<~PG@3GGC3P` T1xP6P(G@3 DECC$DSPRINTF<~PG@3GGC3P` T1=bP1+RbP1!PRbP1PS SG<3P PG<3G<3S1G<31PS G@3S1G@31PS GD3S1GD31PS GH3S1GH31PS GL3S1GL31uPS G03S1cG031ZPS SGT3P PGT3GT3S14GT3 GT31"PGT31PS GX3S1GX31P1S SG`3P PG`3G`3S1G`31PS Gd3S1Gd31PS SGh3P PGh3Gh3S1Gh3{rG@3j<~PG@3GGC3P`YLS Gl3S=PGl32PS SGp3P PGp3Gp3S PGp3YW1UVeR bPP-1X^XERPBkG@3 DECC$DSPRINTFPG@3GGC3P`RRT1P VMSCLI_USAGEPT1G3GD3(GL3 GD3GL3G 39G431ψG@3 DECC$DSPRINTF<~PG@3GGC3P`YG 3G 3G3G3G 3G@3G83<G434fG@3 DECC$DSPRINTF<~PG@3GGC3P`G83Gt3 DECC$ISATTYPGt3VRVRYEVUGT3V ώTcPG3YYY VMSCLI_USAGEPTDPG3 GD3GT3Gh3GH3G3G3VUTTPP ^լSSG31 ȟȟ|~G@3 DECC$DSPRINTFR bSPG@3GGC3P`χG@3bSPG@3GGC3P`όψG@3bSPG@3GGC3: UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_DECC_OLB;1<P`uǟG@3bSPG@3GGC3P`10Pϓ|~ G@3 DECC$DSPRINTFRbSPG@3GGC3P`πŸXǟϺG@3bSPG@3GGC3P`լ'wŸG@3bSPG@3GGC3P`ωϝŸG@3 DECC$DSPRINTFRbSPG@3GGC3P`ϠußG@3bSPG@3GGC3P`и̸θ<şG@3bSPG@3GGC3P` PPP^G<32PEEEEEEEER UNZIP 9mainG 9unzip=uz_opts GusageIshow_version_info 79FP H8:: t8;d! 8=:/   9@     :lC    {9E y9E {;EڹNcMH% DECC$STRLEN DECC$STRNCMP DECC$STRCMP DECC$ISATTY DECC$DSPRINTF DECC$PERROR 9 __MAIN 9 MAIN 9|UNZIP =UZ_OPTS G USAGEDECC$MAIN_ARGSmM$CODEt$DATA $ADDRESS_DATAD MASK_BITS VERSIONDATEG CENTSIGMSGI ENDSIGMSG<SEEKMSG$FILENAMENOTMATCHED-EXCLFILENAMENOTMATCHED REPORTMSGZIPNFO# COMPILEDWITHGUNZIPUSAGELINE1EEEEEEEEEEE9EEEEEEEUEE5EEe5EUEEEEEEUEE E%E5EEEQE9ww-*[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_VAXC_OLB;1+,./ 4-s0123 KPWO56Dq 7 89GHJ % VAX-11 Librarian V04-00 CmWop !/2 JJp  pTMAINTUNZIPTUSAGETUZ_OPTS3 VMSCLI_USAGEK VMS_UNZIP_CLD3VMS_UNZIP_CMDLINE.3CMDLINETUNZIPK VMS_UNZIP_CLD~h UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_VAXC_OLB;1KX M UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_VAXC_OLB;1 !"#$% UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_VAXC_OLB;1r+%&'()*+,-./01241mV1.04CMDLINEV1.029-APR-2008 10:34VAX C V3.2-044PPTEXTPP PTEXT.AUTOPPPTEXT.ALLP P PTEXT.NONE P!P "PTEXT.STMLF!P""P-PBINARY"P-#P 4PBINARY.AUTO#P4$P @PBINARY.ALL$P@%P KPBINARY.NONE%PK&PWPCASE_INSENSITIVE&PW'PhPSCREEN'Ph(P oPDIRECTORY(Po)PiP UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_VAXC_OLB;145yPFRESHEN)Py*PPHELP*P+PPJUNK+P,P PLOWERCASE,P-PPLIST-P.PPBRIEF.P/PPFULL/P0PPFULL.DIAGNOSTICS0P1PPEXISTING1P2PPEXISTING.NEW_VERSION2P3PPEXISTING.OVERWRITE3P4PPEXISTING.NOEXTRACT4P5P POVERWRITE5P6PPQUIET6P7P  PQUIET.SUPER7P 8P6PTEST8P9PPPIPE9P:P PPASSWORD:P ;P )PTIMESTAMP;P)<P 3PUPPERCASE<P3=P=PUPDATE=P=>PDPVERSION>PD?PLPRESTORE?PL@PTPRESTORE.OWNER_PROT@PTAP gPRESTORE.DATEAPgBPtPRESTORE.DATE.ALLBPtCPPRESTORE.DATE.FILESCPDP PDOT_VERSIONDPEPPCOMMENTEPFPPEXCLUDEFPGP7PODS2GPHP PTRAVERSE_DIRSHPIPPZIPINFOIPJPPSHORTJPKPPMEDIUMKPLPPLONGLPMPPVERBOSEMPNPPHEADERNPOPPTOTALSOPPPPTIMESPPQPPONE_LINEQPRPPPAGERPSP  PYYZ_UNZIPSP TPPZIPFILETPUPPINFILEUPVP$Punzip VP$+Punzip1P-P48P-d7P-x:PZipInfo %d.%d%d%s %s, by Newtware and the fine folks at Info-ZIP. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing * or %% (e.g., "*font-%%.zip"). jP20 April 2009xP usage: zipinfo file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options or: unzip /ZIPINFO file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options9 main listing-format options: /SHORT short "ls -l" format (def.) /ONE_LINE just filenames, one/line /MEDIUM medium Unix "ls -l" format /VERBOSE verbose, multi-page format /LONG long Unix "ls -l" format Pmiscellaneous options: /HEADER print header line /TOTALS totals for listed files or for all /COMMENT print zipfile comment /TIMES times in sortable decimal format /[NO]CASE_INSENSITIVE match filenames case-insensitively /[NO]PAGE page :output through built-in "more" /EXCLUDE=(file-spec1,etc.) exclude file-specs from listing ]P Type unzip "-Z" for Unix style flags Remember that non-lowercase filespecs must be quoted in VMS (e.g., "Makefile"). P20 April 2009PUsage: unzip file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options /modifiers Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s PType "unzip /ZIPINFO" for ZipInfo-mode usage.PMajor ;options include (type unzip -h for Unix style flags): /[NO]TEST, /LIST, /[NO]SCREEN, /PIPE, /[NO]FRESHEN, /[NO]UPDATE, /[NO]COMMENT, /DIRECTORY=directory-spec, /EXCLUDE=(file-spec1,etc.) Modifiers include: /BRIEF, /FULL, /[NO]TEXT[=NONE|AUTO|ALL], /[NO]BINARY[=NONE|AUTO|ALL], /EXISTING={NEW_VERSION|OVERWRITE|NOEXTRACT}, /[NO]JUNK, /QUIET, /QUIET[=SUPER], /[NO]PAGE, /[NO]CASE_INSENSITIVE, /[NO]LOWERCASE, /[NO]VERSION, /RESTORE[=([NO]OWNER_PROT[,NODATE|DATE={ALL|FILES}])]  <PExamples (see unzip.txt or "HELP UNZIP" for more info): unzip edit1 /EXCL=joe.jou /CASE_INSENSITIVE => Extract all files except joe.jou (or JOE.JOU, or any combinati CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS VMS_UNZIP_CLD CLI$GET_VALUE CLI$PRESENT CLI$DCL_PARSESTR$FIND_FIRST_SUBSTRING STR$CONCAT=LIB$SIG_TO_RET LIB$GET_INPUTLIB$GET_FOREIGN LIB$ESTABLISHUSAGEREALLOCMALLOCFREECALLOCSTRLENSTRNCPYon of case) from zipfile edit1.zip. unzip zip201 "Makefile.VMS" vms/*.[ch] => extract VMS Makefile and *.c and *.h files; must quote uppercase names if /CASE_INSENS not used. unzip foo /DIR=tmp:[.test] /JUNK /TEXT /EXIS=NEW => extract all files to tmp. dir., flatten hierarchy, auto-conv. text files, create new versions. >P|^VS PRP}LIB$GET_FOREIGNePRR-RV@ePRR.R-?ePRRPP-XE CLI$PRESENTPRR-Rz& CLI$PRESENTUePRR-RCRePRR-RMFePRˏRSUSUPPTSSWBCЭTSSѭ2ЭSݭݭREALLOCPS SFREE<$PDSTRCPY Q$F1{eP}Įp"${EĈⲼ@>׽iGOy Gz#N{%Q)8"Rq<t̯g kl֚S&Doo !2Pr:3rpM:{U|~wJ>hۻb$zWDl}ɠ%e只d䆤|j/o?f7d1-NpZ6~Ǝ씋 &x˛y2 |y,ߪxL_Kcyt4+-, ,@?ȆSκ?$#ơJ.VkSHi0FQOĚ5se䡹Eނ593̿΢Wxp R1E'pTຽ-7:_R~Tqm8o0q av$>]j%R&tLRF{ oPVGmM6ժ,hX@^K,V!XO3j9 n[im#2Iv,2:&1bJ1d5NP&nө ` MAI c*o(&gƱfgfXtfWZeuA*ʤ+|P+Ir(mUC`-n4yE&"Krcyɮ{+ϲF>gl+}ۭ]iJ2a2 9s!ω;MU:P|ދ@ &l#}'f-9U'ʬA_]vqE]o"gwu [Ny GN0v3406w0%z>(=(7jy受JM}Si䄂,"e V]Y;or0D ^#iDc7L>dQi-W(8=vpJ*C Z_ۖVj4Ӊp,O蕪1E M |N)"~FT ֟}3,Qb]#4ITJip?SeU nUjŀc\S?7pfח/dZ2}L~xٝh!O5h>`I:)6?>ءl'okM$+IgOFv ̭ JNFupvf iC \Q G3g  GK$@X ܗZ K8^W^7V&#w0^董§܄SH`V1!y{ ,hj=^5Pu^9P8bI("wdd O_ķ (nфx?*;r ZoCqX?$fs8x~Ck>~})=k<O53Xa!\N@wz-x~Pq`ze#et`=Llm "asa'I5nk0g=1F%e9%AYNN9NY>k44,%;5d6<7h7 5%5+7צWN{mpw2:;u111^N(pPD0ZuX-hlO6!& sA37B@[cvx2q@ZW7o h>0x*6gkqW8[@7_({>2EofDo[9'[G#[<moVNOFE0 ?<& jpM&~8,osHy.MR" hpxfyku[ZSxj$OzJ^=9:R3IKnG // ]=92XOw-%HLK 1g%-GtdlN(cvhy_j/DU7SO1$++m^lMr]Tq.'oPy_0R 0jW6mla?Fˁ|0cWǛSty\b{LU7LOyF)guФi8ܮ\@KK@/m/ HFgARG N1pd*"[45Y}_I#<lPU2>% vVd\'la$#iiŻ C{4ՍK&nłM d%n{nR0^kdbS3a̢e Z QEj`0Dj|N (ߜڛ,8ggj|ֆM;1թ=M"mUѦ92 {߀59ڌ{+3m%COVwݷՔ Iih+;FTgC%,K\/+g1 ]L#Aku;Oƌ+o? 5*&MzU]yן f@ֵtɤ;=:'\O#P(`bcsoh] A&jfZ٭!s~No2FBn"ӗggckR2rو;(pi7gA#+cH6L5K1ti e{4l #?HOP} +[d*/wMmxEs)t89pkst$.e%lT2iRW:j^K+KeLZeW3_Y0[gTb\vi TsPppy%\v[ dX,uw[Nzqceqs|k(*'n!E4#7<i(vZ?sGjzl].UѱQ}STy&zgLY)ݒz/;>ZK _"p1Lg%IEzLRprEӪOo>:Q Q &.ZtYi 6ޞ\gRx{\5Ȱ,=@ܑMXFcncCncp,Uۺb uî@%S6D D|ӣ5hn&C s bJ,1$i `:h"T@~( 6SSl[x >pM=3M- ~|"4PGJ90|5~(Fֽc0\׃IR){iDVc|5'p{O TNz+8%4i`;O7`h8xMQ{ ,_c٥mh-r f1-U"=xac/gbl' @)bah9b)K]d6#c>  gH6}7p,#._e(ëKg1]U,gskNK6MukiQZ ENE3H(]2#< -yl|"?!2bAs.IH,JD 9HV^^F.SAk^[#hvEA=/sv\T\[8k>[DFcG=iœ \]^s+s.\H/] A  Z-K^]z^.IXT0 { QKM:D`@k_ZiOdf)2` 1@CWS xw4O&EJ-RH,= LJ:Gq 8hXW O$cd?v` cAkhjY^ &)b Ro6 2 1I*-(i6D<+K.Ww0V!KWL9IL;' :_N4n yW>R%6I21ap$+ $0Eih$2jtrk|x Myid.HKcVBOͷ=o30wVv4C\gq_35fpz޺ n{3IA]E1wca խ|A]Ux=C0UMp'^m_P^UP&3VSsӛ*Rgvh3tqwty.:WYhlb2fOF6x$g(}=+S,b%$ VUe%*Lj CS t\yХ!!D$XvC  EUJ{0R2.Pµ jkEAo9k \?+Г.̳ #k=o Oi!EĠX}k+ e7 P"fpOiх=ލN} ӏq'_ imW`DNi6(L _@\)r!)5 ACj667,z}dFlx\`Jv]ػ/nދ\Xhhq!HR 7Lno~Q}l['rW|_Hx<i @gk[X"mdf$QU ܄NZt^פ4h8hM@UgG1p]bwZ.Ö 0x0ɧ|s> M@|Zfu[B:Flϔ@$NJIRDTuzK491 0pxWuۂ/SOyv(ōR9| STIEl'.&i:-Kwevb{/ެL}tsq$4 m~ ѻXp$ΚUKCWmUhyRѰfO5 sXP/FLA0I26<:P{(*fԠc rlJoFR[`lK{G ZЁHAKHfNO8Vz E](Cdćt`"f&7} 6HzoYT|[u^* &L6|FG ZaUxUw Y(Dn;KF>*;7ͪ tLtȇ=T$.2* >dF)]ѹV)PU03LБM S&>Ж{'m76t@^FDvcK`TrTQ `BUG)7 LAFrHJɃd\`.Pqo' nKCW|Xw0y<,TeL0|xQ:KH!=} 7_T2@ IkT6,+`eK]hs۴IAT{?Y4:pfܔ]Y6έ8 W`֎͹`4\P~@AV;We[Zْ-vܬnլ2T(r&wNhQԁ+\rstBS!XQS'mXSaEFEUE^;$ g"k?>RMB^^֢I Tp!fy~lpw,-Bo%-#ֱ DhڨsSp"`CHCT8 ~@[,SzFA ϼgp R)'ZzPK { AM_Mr˶okb)yC:){-zkܦ7pac|] xz ݱXQh߰BAǂ 7>ū6U(|JnS lS\;.WU@UHV YcO(3 #}4?pN=[[Swa\2VCgZic#{(eh^ V䴌{pvɤ}:ǓeH`=_evW00wL+Y\؞ҡMBVëT)cvz_( EvMOL𑰿5T@ N?G %HRv5ȆC D,H1a=2jPh9֣ ZipInfo mode ("unzip -Z" for usage).M P=> define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe  P -p extract files to pipe, no mess]ages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir  Pmodifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => ^quieter) -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %sPSee "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer PiiP-ZP-d P-x P"P"_P You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT. cP[-Z] xPijPExtended Help for UnZip|PjPSee the UnZip Manual for more detailed helpPPUnZip lists and extracts files in zip archives. The default action is toPPextract zipfile entries to the current directory, creating directories asPEPneeded. With appropriate options, UnZip lists the contents of archivesPEPinstead.P`PBasic unzip command line:PP unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir]PPSome examples:P P unzip -l foo.zip - list files in short format in archive foo.zipP STP unzip -t foo - test the files in archive fooPTP unzip -Z foo - list files using more detailed zipinfo formatPP unzip foo - unzip the contents of foo in currenat dirP P unzip -a foo - unzip foo and convert text files to local OSP ijPIf unzip is run in zipinfo mode, a more detailed list of archive contentsPjPis provided. The -Z option sets zipinfo mode and changes the availablePPoptions.PPBasic zipinfo command line:P"P zipinfo options archive[.zip] [file ...] [-x xfile ...]P"\P unzip -Z options archive[.zip] [file ...] [-x xfile ...]U9 UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_VAXC_OLB;1abP\PBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix basedPPport and is referred to as Unix Apple.P   Punzip options: P P -Z Switch to zipinfo mode. Must be first option.PPP -hh Display extended help.PPnP -A [OS/2, Unix DLL] Print extended help for DLL.PnP -c Extract files to stdout/screen. As -p but include names. Also,PP -a allowed and EBCDIC cocnversions done if needed. P&P -f Freshen by extracting only if older file on disk.$P&_P -l List files using short form.(P_P -p Extract files to pipe (stdout). Only file data is output and all,PP files extracted in binary mode (as stored).0PP -t Test archive files.4PP -T Set timestamp on archive(s) to that of newest file. Similar to8PcP zip -o but faster.<Pc}P -u Updated existing older files on disk as -f and extract new files.@P}P -v Use verbose list format. If given alone as unzip -v show versionDPP information. Also can be added to other list commands for moreHPWP verbose output.LPWpP -z Display only archive comment.PPpPunzip modifiers:XPP -a Convert text files to local OS format. Convert line ends, EOF\PP marker, and from or to EBCDIC echaracter set as needed.`P- P -b Treat all files as binary. [Tandem] Force filecode 180 ('C').dP- s P [VMS] Autoconvert binary files. -bb forces convert of all files.hPs  P -B [UNIXBACKUP compile option enabled] Save a backup copy of eachlP  P overwritten file in foo~ or foo~99999 format.pP ; P -C Use case-insensitive matching.tP; a P -D Skip restoration of timestamps for extracted directories. On VMS thisfxPa  P is on by default and -D essentially becames -DD.|P  P -DD Skip restoration of timestamps for all entries.P  P -E [MacOS (not Unix Apple)] Display contents of MacOS extra field duringP n P restore.Pn  P -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn ifP  P ACORN_FTYPE_NFS] Translate filetype and append to name.P  P -i [MacOS] Ignore filenames in MacOS extra fielgd. Instead, use name inP W P standard header.PW q P -j Junk paths and deposit all files in extraction directory.Pq  P -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info.P  P -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.P @ P -L Convert to lowercase any names from uppercase only file system.P@  P -LL Convert all files to lowercase.P  P -M Pipe all output throughh internal pager similar to Unix more(1).P  P -n Never overwrite existing files. Skip extracting that file, no prompt.P CP -N [Amiga] Extract file comments as Amiga filenotes.PC|P -o Overwrite existing files without prompting. Useful with -f. Use withP|P care.PP -P p Use password p to decrypt files. THIS IS INSECURE! Some OS showP"P command line to other users.P"HP -q Perform oiperations quietly. The more q (as in -qq) the quieter.PHP -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores.PP -S [VMS] Convert text files (-a, -aa) into Stream_LF format.PP -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCIIPfP text escapes where x is hex digit. [Old] -U used to leave namesPfP uppercase if created on MS-DOS, VMS, etc. See -L.PP -UU [jUNICODE enabled] Disable use of stored UTF-8 paths. Note that UTF-8P9P paths stored as native local paths are still processed as Unicode.P9P -V Retain VMS file version numbers.PP -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do notPP match directory separator /, but ** does. Allows matching at specificPIP directory levels.PIdP -X [VMS, Unix, OS/2, NT, Tandem] Restorek UICs and ACL entries under VMS,PdP or UIDs/GIDs under Unix, or ACLs under certain network-enabledPP versions of OS/2, or security ACLs under Windows NT. Can requirePDP user privileges.PD^P -XX [NT] Extract NT security ACLs after trying to enable additional P^P system privileges.PP -Y [VMS] Treat archived name endings of .nnn as VMS version numbers.P P -$ [MS-DOS, OS/l2, NT] Restore volume label if extraction medium isP QP removable. -$$ allows fixed media (hard drives) to be labeled.PQP -/ e [Acorn] Use e as extension list. PP -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members into$PP locations outside of current extraction root folder. This allows(P\P paths such as ../foo to be extracted above the current extraction,P\P directory,m which can be a security problem.0PP -^ [Unix] Allow control characters in names of extracted entries. Usually4P+P this is not a good thing and should be avoided.8P+dP -2 [VMS] Force unconditional conversion of names to ODS-compatible names.<PdP Default is to exploit destination file system, preserving cases and@PP extended name characters on ODS5 and applying ODS2 filtering on ODS2.DPNOPPnWildcards:PPP[P Internally unzip supports the following wildcards:TP[P ? (or %% or #, depending on OS) matches any single characterXPP * matches any number of characters, including zero\PP [list] matches char in list (regex), can do range [ac-f], all but [!bf]`PaP If port supports [], must escape [ as [[]dPaP For shells that expand wildcards, escape (\* or "*") so unzip can recurse.hPoPInclude and Exclude:pPP -i pattern pattern ... include files that match a patterntP.P -x pattern pattern ... exclude files that match a patternxP.lP Patterns are paths with optional wildcards and match paths as stored in|PlP archive. Exclude and include lists end at next option or end of line.PP unzip archive -x pattern pattern ...P()PMulti-part (split) archives (archives created as a set of split files):pP)qP Currently split archives are not readable by unzip. A workaround isPqP to use zip to convert the split archive to a single-file archive andPP use unzip on that. See the manual page for Zip 3.0 or later.P?@PStreaming (piping into unzip):P@_P Currently unzip does not support streaming. The funzip utility can beP_P used to process the first entry in a stream.PP cat archive | funzipP%0 UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPCLI.VAX_VAXC_OLB;1apqPTesting archives:PP -t test contents of archiveP(P This can be modified using -q for quieter operation, and -qq for evenP(pP quieter operation.PpPUnicode:PP If compiled with Unicode support, unzip automatically handles archivesPP with Unicode entries. Currently Unicode on Win32 systems is limited.P P Characters not in the current character set are shown as ASCII escapesP riP in the form #Uxxxx where the Unicode character number fits in 16 bits,PiP or #Lxxxxxx where it doesn't, where x is the ASCII character for a hexPP digit.PPzipinfo options (these are used in zipinfo mode (unzip -Z ...)):PGP -1 List names only, one per line. No headers/trailers. Good for scripts.PGP -2 List names only as -1, but include headers, trailers, and comments.PP -s List archive entsries in short Unix ls -l format. Default list format.P,P -m List in long Unix ls -l format. As -s, but includes compression %.P,vP -l List in long Unix ls -l format. As -m, but compression in bytes.PvP -v List zipfile information in verbose, multi-page format.PP -h List header line. Includes archive name, actual size, total files.PF P -M Pipe all output through internal pager similar to Unix more(1) command. PF t P -t List totals for files listed or for all files. Includes uncompressedP  P and compressed sizes, and compression factors.P !P -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)P!e!P Default date and time format is a more human-readable version.Pe!!P -U [UNICODE] If entry has a UTF-8 Unicode path, display any characters P!!P not in current character set as text #Uxxxx and #Lxxxxxx escapues$P!?"P representing the Unicode character number of the character in hex.(P?""P -UU [UNICODE] Disable use of any UTF-8 path information.,P""P -z Include archive comment if any in listing.0P""""Pfunzip stream extractor:<P"#P funzip extracts the first member in an archive to stdout. Typically@P#Y#P used to unzip the first member of a stream or pipe. If a file argumentDPY##P is given, read from that filve instead of stdin.HP###Pfunzip command line:PP##P funzip [-password] [input[.zip|.gz]]TP#$$$Punzipsfx self extractor:`P$-$P Self-extracting archives made with unzipsfx are no more (or less)dP-$q$P portable across different operating systems than unzip executables.hPq$$P In general, a self-extracting archive made on a particular Unix system,lP$%P for example, will only self-extract under the same flavor of Unwix.pP%F%P Regular unzip may still be used to extract embedded archive however.tPF%%%Punzipsfx command line:|P%%P [-options] [file(s) ... [-x xfile(s) ...]]P%%%Punzipsfx options:P%&P -c, -p - Output to pipe. (See above for unzip.)P&5&P -f, -u - Freshen and Update, as for unzip.P5&b&P -t - Test embedded archive. (Can be used to list contents.)Pb&&P -z - Print arxchive comment. (See unzip above.)P&&&Punzipsfx modifiers:P&&P Most unzip modifiers are supported. These includeP&%'P -a - Convert text files.P%'D'P -n - Never overwrite.PD'`'P -o - Overwrite without prompting.P`''P -q - Quiet operation.P''P -C - Match names case-insensitively.P''P -j - Junk paths.P''P -V - Keep version numbers.P'(P -s - Coynvert spaces to underscores.P(1(P -$ - Restore volume label.P1(R(S(PIf unzipsfx compiled with SFX_EXDIR defined, -d option also available:PS((P -d exd - Extract to directory exd.P((PBy default, all files extracted to current directory. This optionP()Pforces extraction to specified directory.P),) CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_zXABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSGETENVUZ_OPTSUNZIPVERSIONENVARGS GLOBALSCTOR VMSCLI_USAGEVMS_UNZIP_CMDLINE RETURN_VMS ZSTRNICMPHANDLERZI_OPTSPROCESS_ZIPFILESUZ_OPTSUNZIPSIGNALSTRLENSTRNCMPSTRCMPISATTY-)PSee unzipsfx manual page for more information.P-)\)])P%s a)P%d P^ C$MAIN_ARGS GLOBALSCTORݬݬUNZIPP RETURN_VMS{P^XZRVHANDLERTTSIGNALScTcT cTcT c߬߬VMS_UNZIP_CMDLINEPSPSY1 SѬSSˆ޼TdSTRLENdPSSPc]SSSS ZSTRNICMPP.hS ZSTRNICMPPѬ@ߨЬSݣSTRNCMPP)ߦ!ߦ߬߬ENVARGSPT1ߦ,PERROR%Ԣߦ f߬߬ENVARGSPT ߦ,PERRORT1SP޼PC`STRLENP`?1<~SߦV@SPRINTFP@bCP` Y1SSբ|߬߬ZI_OPTSPT߬߬UZ_OPTSPTլTTY1ЬSc@ЬŒլ1[UWP”Ь¸PSc1Bb1ߨcSTRNCMPP1TSTcbUc¸SQQŒUWc¼SQQbP`?Sccb3P<~Ƽ@SPRINTFP@bCP` Y1T1գS¸ì¸PPPŒrP”j¸ŒqW[ߨ cSTRCMPPHWS¸j¸ŒPUc¸SQQŒUS¼ì¼PPPPUSc1”b0 *<~Ɩ@SPRINTF}P@bCP`PROCESS_ZIPFILESPYYP^RUZTYмXVXW1 fS1c-1SPRINTF[PfPPQPSaX1XPP-MP1*P:?PT1PTT PPQQQ T1֢ 1PTTPPQQQT1բ ֢Ԣ 1PTԢT11TԢT11T.<~ż@SPRINTFP@bCP` Pb.<~@SPRINTFP@bCP` PSbSP`qW>WVfbbP`-\<~ż@SPRINTFP@bCP` P<~~ż@SPRINTFP@bCP` Pc1Sc1Sc1PTTPPQQQT1֢1P1T ԢLԢ T1pL 1dY1\chY1PY1IPTԢ(T1;(14TTTPPQQQTT1֢T1PTT0PPQQQ0T1֢01PTԢtT1t1TԢ4T141TT8PPQQQ8T1֢81PT Ԣ?@ABC l, UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<2gCDEFGHIJKLMNOPQRg UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<RSTUVWXYZ[\]^_`aW)>@(-Xtg1+0F.!%/ 9Kg\[5'E,Wkofk qJdqǝ ٍP F!~M'_웯-tv(cpV C2\ȍWRxût'WPs8לS.;,-n!h"c3>6<mc[s@a$_T-%.4z#reӡ|^b@n4٭$pWi۽Q F=/xT ҋ'(?gΪ_\iex02pV#d!Q mZ*FB˳hV)[6) j×(k|#DyU|dkZq d("?QZ:vr RQ_WZ܀f<*eV-9jhF;[ZYQZ_nd}t *i3 HSI_MTCL^GIH7vlvq83d[}YUGIm_`KDٖw3Fat(BKSJWM2k8&.Ӭ|1%ڬ\æM!D״˾U$fOڬYhhwT65|L*p22c63(*=*Ra2QJVACP#@R"Pޱ Xc Hqtpy1&PNaTr .ǩv5bT-b̞}Lp~X'"x$>8BJPhzpR 6`B j`9Ѥ@JOEAIY@AE].Ỷ> )q"n3p"95wow5Dn @U^F LGZ ^!ꤣynxvPmĊFDбbCպo.xVA 8PF[L TyE̤N7D W/2umgwLA@eVASp`yxdAK?zȋ ܪcDt\U]L*j3~!)lACOO@CZ@QFSY?s@H9F\L?;0Lx-c3!_YU Z=-Q(%1Qy~=CFb46a t/$f,LnpԲAirܱp8%o\;'D#g:oUi?l,rm 5|lgon(X&uphbJ@K@SCT%lM}]qX%]n#nb%YJvRbCc|-'fv-r!7xlkby/Vml w52ÜpI 9[E#;I͚=N%Z mq!%0CH$?d{-`>h66u7̞nx= xoom+ c]i8ri֓ߕo FҔAZ/iW\]_n`;mdptk7+ѓc&Xm(scs6+ 1h &#e@~#J V9H Zx3 qeVK[܉wLDPRRCx'fÛf-ٵjq;"~(&3pNSi>VVxti!Mj{HFmҪ +I8Nqtێ~t'qlj!.cczZɊΘjڜ g .j?~pqfJcͷ™vg>ҒTXï"[_Wױ2'e27HYmÃ`&rLwsʂbz<ʙRxOT!E*`ű9~vyumkPXX+5ބ56*;(L9x)6>3딜9 &h Xj(.熣~6L,]8iYE#Ʋsfnfm1#3oa84* {.`M!WBކӱ! u`kn~k& ;{o}s7&.y|2%x!crr¡d+D.S ڬE4T, )Sug&fg0/)/v +`<:s{}z7VQ_ KU X5)9dg&x8_pwn$##2kd19$-u=bh.Lik Gj9\NlÅoiei )*5Q:pc%roZ;txzd@CQ ET!o?UuL{ubW:kf~zwn|e8db&;)cO$h#YvSKXFc:3Hn. ws`i#p-(sxqqaR/[~?8:,W0 fGIXA^abjkjDE4Z)#}/g#1088o\9Gq$*%Y(A.q%l|u0O p&L7ʺ%^3:l JCBAQ5Ehi8by7r)dw&j 'PhcNw!K!X>en/$a\ ?ef46u$}EU2d/v8qdc[^78ldy.",hr94;)KPWXN{kWA$_CFK]nb3x14eN;e0m-  tte puypr5l7.@6~aKbKrf&42b:b9 lqNu>WA V8 Gȹ!i(Cage,b~E7J)Pfw:W/ 95-nd-D $vZgXO")`'Xo@9u5dIjRCqL%au(=fv3iv+QQJbrdR``N `f:" %>6Gi9vzb(Lm Mg',!SDp(LGCD_ uREMPGZr)rPCZ HUZ u\2X@UTY]CA NHS$h<6%`fTNJJG0tSIGN]L M@QSg_O_Bs YBA{T -"jzVn-%g6LT^wV(6~ eG}_FT e) O"k9*qq836 ER\TZC MC^QH  P\#,m.j)3!c842~0%\HE~g_e:0I> ] W4{Rs I\IU4R! aFGENGVZR0JHM#+u ;c#UYT.Q,$lf&i rs~jdwwZo4q`$ayq/";0q JU\^GBE^^3; j9bjLxZLST+v1 =s:OGYs}ELY&LXG0ad;]P\_hrO `i$ FLM0L;.@4xJD*5,bvU\FY&Z ب =D^V fP$J}QT`P0jB07l\Vo 7"MPQ^CTPϓaWY@ ѯg s0aF c%e +w AN!BY![PIOANPd\zvD ;7BC^S|o$E= _n..>1taPfmK!6albLN"V DJyT1`4NQ(k\ 4Hy| .5Er$!q`ofAPU ]%IJjSlij3Khlo`T-xJ/H^ ^wJt$BdDcRKM#:0Aj}baS~RASi]K+g7ob0"^_J,n]0Ow A|98KW [|M@Ni1x j*nu1[A@+llz n04Ykm3Zziw UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<kabcdefghijklmnopt UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<@pqrstuvwxyz{|}~wk UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<5M UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<r2 UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<& UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1< UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1< >s UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<ɔ1-~#V1.0AACRC32V1.029-APR-2009 07:23DEC C V4.1-001  $ABS$i$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPE DECC$FREE DECC$MALLOC0JFREE_CRC_TABLE0JP GET_CRC_TABLE(Jp@CRC32$ $=GkG;F!0@a/aK$Dk#"~4G^^GG(B0b@Zk&AG "G s"GG6J5B6JFF8J6KGF:!K6@KSG:GG4aKG6JFtGG! 1@0@BڢT C" Z#GFUB6JJQCFGFWB5J0 CJFG_FR@B5JRJUFTG]] #kG#~^^~ G{Gb#_GzW UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<T ]]} 0#kG#4G~^^~ G{G B(b@ZkG]]} 0#kG#G~^^~ (0޴8GGGGGG¤b#e_ Ơ`DGpD .%1@J pDFPB#aHaHF@_@d %@$sD7aHaHJDbHWBFUBTBD 7JCC@cF FwDyD!aHaH#HDGbHA?@ZFCBF@D!!H ZC&BB@c!BG CDAD0D3!H!HcJ?DSB"HFRFB3aJVC R?DAB֢@!@s VFAF3D4D1!H!H#J?D"HQ?BFY&CWfC?D1!J 9AFC@!17GF1D_8H@C{`%@DuD4aHaHJDFbHTBRFBSfBD R4JsCfC@cSFCFtD DzD1aHaH#JDbH?GQ?BDWBA&@1!JBF@ !@B 1F"D1D0D;!H!HcK?DG"H[CUBVB?D ;aK֢AfB@!F{"H@F;D2D!H?D"H!!HF#HZFCA?@T&C ZD!!HCB@c!TGB@FaD_ G%@@ pD5aHaHJDGbHUBSfBVBD s5J֢CfC@cvFcFuD_ G$/%1@$K wDFWB#aHaHF`DG]]} (0ݤ8@#k4TG` DECC$MALLOC4Xb# DECC$MALLOC4\@` DECC$MALLOC4G DECC$FREE4b# DECC$FREE4@ DECC$FREE =0 ;7DECC$GA___CTYPE=0 0;=  ; DECC$MALLOC=0 ;=0 =0 @;=@| =0 ;=0  DECC$FREE$ $= ; ;=+#"CRC32DEC C V4.1-001v v= 44= __iscntrl4= j0$ $= 4: := (4= 0 = 044=make_crc_table04= ;* ;* ;*  [* c* a* b* c* b* `* `*  i* i* l* i* l* i*$ $= 44: := h4= X = 4P4= get_crc_table4=(  3, 3, 7,$$ $= 4: := 4= X = 44=free_crc_table4=.&% B, B, B, $ $= 4: := 4= ` = @4p4= crc32@4= p,  p,  7, 7,F =,A ,$ , , ,h , , ,T , , ,X ,  ,,$ $= D4. .=  ?4=  = . .=  ?4=  = : := 4=  =  ww# GOATLEY CRC32# GOATLEY CRYPT # GOATLEY EXTRACTӐ$ GOATLEY FILEIO U$ GOATLEY GLOBALS S-$ GOATLEY INFLATE<$ GOATLEY MATCH .Z$ GOATLEY PROCESSde%$ GOATLEY TTYIO +$ GOATLEY UBZ2ERR49$ GOATLEY VMSr GOATHUNTER UNZIPyv  GOATHUNTER UNZIP+a  GOATHUNTER UNZIP1|=#V1.0AACRYPTV1.029-APR-2009 07:24DEC C V4.1-001  $ABS$i0$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPE  ZCR_DUMMY0 ZCR_DUMMYP P=80GkG;F!0@a/aK$DkT T=0 ;7DECC$GA___CTYPE; ;=+#"CRYPTDEC C V4.1-001v v= 44= __iscntrl4= s0$ $= 4: := (4= 0 =  ww1Q#V1.0CCEXTRACTV1.029-APR-2009 07:24DEC C V4.1-001  $ABS$i5$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$0TRUNCEAS8 TRUNCNTSD DECC$GA_STDINDECC$GA_STDOUTDECC$GXSPRINTF DECC$FGETS DECC$LSEEK DECC$READDECC$GA___CTYPE DECC$MEMCMP DECC$STRLEN DECC$STRCMP DECC$STRCPY DECC$FREE DECC$MALLOC DECC$QSORT LOCAL_HDR_SIGCENTRAL_HDR_SIGG PROCESS_CDIR_FILE_HDR PROCESS_LOCAL_FILE_HDR OPEN_OUTFILE UNDEFER_INPUT DEFER_LEFTOVER_INPUTREADBUFREADBYTE SEEK_ZIPFFLUSHCHECK_FOR_NEWER DO_STRINGMAKEWORDMAKELONGFZOFFT8J0EXTRACT_OR_TEST_FILES0JX- MEMEXTRACT0J00MEMFLUSH8Jx1EXTRACT_IZVMS_BLOCK0J3FNFILTERINFLATEMATCHMAPATTRMAPNAMECHECKDIR CLOSE_OUTFILE DEFER_DIR_ATTRIBS SET_DIREC_ATTRIBS CENTSIGMSGSEEKMSG FILENAMENOTMATCHED EXCLFILENAMENOTMATCHED REPORTMSG GET_CRC_TABLECRC320 TRUNCEAS0  TRUNCNTSDOTS$MOVE =GkG;F!0@a/aK$Dk #G~X^`^h~px޴>^~޵GG¤ $ h. UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1< $(,0 Bb@Zk &$GuGTG& fB?BBQF hBpbGf@Zk G TDG_G& f&F"SCHBP?BPb4G@ZkC&G(C QB(1!J0B@SB3aJF@B@0BB4GCHBPbPB@ZkC&G,C QB,1!J0B@SB3aJF@B@0BB8F!4 G_AHBUBPbuB &@BGGTG@ZkBGX"GbtG@ZkBGb@Zk G &$(B0bTGp!TGR HC@Zk$ @ D$ &(B0btGpTGВJ@Zk$ @ D $ &(BGpTG0bJ@Zk$ @ D$  b#@ 0AZG00A0UÌ4G#íCG &$G ¡!G_1IBtGFBb0G@Zk&0AAA? G(4GOA/I(4G@-&GGC F& ²!_f4IBGFtGtBbA3@Zk&0AA? G,GHA,(I4G@ b#@ 0AG0 0A08=@!A 4 A8=OtG$G %8=G %?$0JΥ! E f%0EFy } &&B F&ñ!3aHb"GA0`BtG@ZkGG[GG"G@ZkBGkTGbtG8"@ZkGG[GG"G@Zk$Q$O % %! & "@." _"@b#k @@!Bpb"bGGGG@ZkGGG"2G %¥ %! &í "@/" _"@b#Q @`!Bpb"bGGGG@ZkGGG"G % %! & "@." _"@b#7 @!BGbGGtG@ZkGGG!"G[G@Zk 4G4} % % %Ρ@DHݱLL$PCP & F&} 8@@"A?@a!@@:@00`B R &! &} '!2@ DX@#@KBvGbGGG@ZkGG[GG"G@Zk f%TG k8D32` f$"BGcTGb(1"@Zk f%GG[GG"G@Zk $k $ & &&GQGG D@#@ BpGbtG@ZkGGG[G"G@ZkytGw &% %)GGtG iD5 Bb % &%@ZkB % _" &%/tGb %@ZkGɱ &$"B!!b"]1"bGGG@ZkGG[GG"G@ZktGDG f$ &%c %.Aɱk@oG $ &$ &! && F& @  @+@1BHBGPbGTG &%@Zk %"B!)hb"]1"bGGG@ZkGG[GG"G@ZktG GGBG"tGbG f%@ZkBk f$c ])!bhi"GGGG@ZkGG[GG"G@Zk % Ρ 8ETG` &$Bb)"aGTG@Zk %GG[GG"G@Zk $ Ρݱ G &= 0 &&B4G1 % b@Zk G#`HBPbGGTG@ZkBGbGGtG@Zkhi"+BΡG]GbGG@ZkGG[GG"G@ZktG x`E %`Bhb"]GbGGG@ZkGG[GG"G@ZktGGBGb % &%@Zk G"`BΡ)!]1"bGtG@ZkGG[GG!"G@ZkGe f$(B0bG0cTG &%¥)!fH@!C@Zk A &E  $ "å@)" _"@b# @ӸB`b"bGGGG@ZkGG[GG"G@Zk:G f%4G 8B f$@b@Zk %(BtG8TG0b &%b/vIC@Zk A &)E  $ "@%" _"@b#P @ӸB`k!b`b"GGGG@ZkGG[GG"G@Zk f$ %0c %ΥÒ`H9`(.A f% &% k)! & nE/` $b "å@)" _"@b#$ @ӸB f%bG XB"GtG@Zk GBCbXB"GtG@Zkc BGbGGGGG@ZkG f$[GG =G"G@Zk! õ8E&Df! iE G $ &$ &! &&DG GD5!3 ‘!@-"G _"@b#@ӸBP bGGGtG@ZkGG[GG"G@Zk!4EG_- ',IA Hp I 0D ? & ֦FFBbG4G@Zk DA A DE) D (B & !0bG4G@Zk#'5@ G GAETD GGXF 8FC ØFX@F`LBF8@FC 4GXABFDBG@Zk 1@98@ & # "( ,w"HC','H D* 7. 1@3JC.J F" ,W" 1@HC.JD." 1@JCP/PKF 1@`#" G7/7KC9,9H D 1@"@ $ `.`JxDD" & @! P)! &&GÑG _"@b#)@GBGbGtG@ZkGG[GG4GG@ZkBGOTGbtG@ZkG $B@)"ÄTGb4E@ZkGGG[G4GG@Zk' 7H$H@&!#H'H0U!@ B 0\BCkGhB""G@ZkBG@Zk6H 1@@ H."@J#XF /Y8K8? $B)"ÄGbGtG@ZkGG[GG4GG@ZkG $Bbx)"ÄGTG@ZkGGG[G4GG@ZkBGO?"btG@ZkGB@Zk'H@ $g- gIXD 1@-H @ $ $,A$H $<4G)"& B" b4G $@Zk} $ `S"GBTGb4Eh1"@ZkGG[GG"G@ZkBG  } 0A:G % $ &Ρ "@$" _"@b#e@Ӏ B0b"bGGGG@ZkGG[GG4GG@ZkG! -AYA iER E4GGTGf 4G ` %b#V@ $ AD P0@PL@ G $} % i@iE=A$} CA E B &$@=GtGb $@Zk $B % _"tG. $b f%@Zk D0A 4H=+G4 %CHBPbPA4G@ZkG"BΡ $ b1"GTG@ZkGG[GG"G@Zk 4G8B@b0 =@Zk }=G 8 F7G(!J(!JC G*)uA A GKA +aI A @7I A = B! =+ ]R ]K ݢ֢ ݲ [A ];aK 0A@A[ }c }_B8bGbGG@Zk GC-NAHB.IPb4G@ΡG@ZkG f%" &%B)!kGN1"btG@ZkGG[GG"G@Zk0A$$]HE$8BG@b4G 0A@ZkA8B@bG4G@Zk<fDD`C f%"B $k b1"GGtG@ZkGG[GGGG@Zk4(]ơC0@*C G'G(MA%I"tG@MA f$B-Ibc &% A)!MG@ZkGG[GG4GG@Zk$$} xD$}F 0AA_8B4G(@b@Zk,ݡ+%GC!,=O@-I("tG -A) fO@ f$B/Ibc $ oA KG@ZkGG[GG"G@ZkF0@@_8B,4G@b@Zk<DGݡ$=!"%@} % 8 EB0b b f% $#Ek!g1"GG@ZkGGGGGGG F%" %B %J!L(1"bGtG@ZkGGGGG2Ô f$0 $" &%Ac@IEB b1"GtG@ZkGGGGGG f%" 8DBxB!k0!b % %E!H1"GGGG@ZkGGGGG[G &%xb @Zk0!0 $" )GC0] 8EBEd|X3}'uQݳͳ#tRk]OGXcC_G&$w ]^ G áCG]bC[G&#b?BBѢKoQF>J-XrLGFjk!!$ # /D~GAGN&nv"k GG⹺@G;D/@ı H%/|{Q,KG! HowCFDBBD%TiOO٦CAG@ ,S.!dݩH1A)FC+@O*DҴ8<,@THCQ.Fx7#o@CA@r.sM+HFODCei IxG_jArOi@J_)Wb#eB@wpA o@ʱQH%lx5WJAGD+U|7KAvsE^BkDwӱJ^yGC@![.fCGc nF-tDo J0%ѡ! +$t@%4K1E(NDF*BٴB0ً7Fތ#a@|EG*MGNAo@BGjkƠGG#Z'o"G&G~"G@Zk]CG TGiA7cuAnOZk:G$GZGG"{G@Bk$QaCABC%18%! Z& "@/" ?"@b#k K?Cb"$GGEG@EoCGEGvfwCYV %8%! $í b1"bc," "@b#Q I%pb"$GGEG@ZkPGEGvf^Gc^R %jN$!& "@*"= O"Hb#?;@!RGbG)G.tG(S N[F]!"&G[G`Zk4G5}=% %6%5Ρ@@HݱOH$PC*QDCeN$ gPL2  @0*A"?@b1@@:@0(0dB1J&0! &} '! 2@0DX@"@ Br-GbQGGeg@Zk&GG0S$GG"G@Zk6b%!TGtG %CZ{Gɱ &$"=B!ߡr#M<"b WGWGpZkG0C[GG"C}Zw`GD ta$c9PlbJ@ڠ5.Aɱk@o=dG  \#"/D/ I{+ B %H #LFK:EUlGL%'(! pk>+B 1%j, 43 Ρ 5g | 5b_al &$Bf"aZGgGCe p$c6G%B"G@]k$ϡdݱ ԳG0&=O &&B5G0 % b=IZk #8Hէ]-GGT^GCZ{CGbWGG@Zkh4i&+=Bͨua$ncpf"ۧWG[kG0C=["G! =DS)$tFq IT`G $bDbL_"YGbaGFG@nkGG5JGG"WAZkhG0C=B G b % "$ @^j6G"8BΡ@+!]1&bGG@Zk0C9T [5q7O!2G@ZkHGe9b$槬bYG9O^I V i FD N^b%C\( di$),^.êIQJIuN# #DF,b-k*<IE ckOGToG(Ev5I~.OLc2GR.CSCG Eh_ȠAPB.,VaGH@ϡG@W>F@\R_CP3q#,&%VFls.DKV_츨e"c tG@]9^EEBG[WEXV:"G@[k0A$aEM$8CG@gUa 0A@ZkF V]ggʯ ;8xDD`UKeBR"%"KU$cKlݨ4aBGuRi)F,_N}4~4}p3GGGG@Qk 4Ltm6SeiLŷC<GiG-$|$A%I9t ORv EMAC!B$%00b =% m QMomSwI^OG@[k#G^F [ 7FEG4GG@+|Tbp`s: gKe<0A't4G(O$Cdl=ˮ+ $@'X*xE<^@-b$ZPUHb.UPQR-@ ai bIbkJ* ~_aBL G@(KOKHG3GnfQAGAzS<@hB, b '^?mICRw2%G<INmGp!e8ED!GS-J7Ѣabm/%LK4@4v(ǘk"tl#2KkVGYG%]oFl&Hb}m`XdGc$n"!JZg }x3 uB?E2ر ]OOC6EB`+2OaG;GGR[KG(4F'BEN_xX ^>kpGGZc`C BCFֱNGuQNJWsG @cIf%N5X{HF:ȇ P׬WNmFuC `ٕBJBN,< xyOoC6ƣ֠-Egr_kG7,jfcގIԔS LhbcZ<\$DDF# 3\9CV3 UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<\b1"GG@ZkGG[GGGG@Zk]$4G0_A=AC NE@tD$G0}=A$C lE4jE$$GX]`]h}pxݤ=]}ݥ#kG#~^^~ (0޴8@G{#G $ #$h &!H(!0D0D1 F F(! $ #$h!H(!D@Q F0D@ F(! $ #$h!0D =(!0D WH F F(! $ #$ #&\!  $@1 #$0H!  <5B G $?"(F(G #&1(1V H!D0F0wJ0D(1 &(D( #$D# _"hb#<#аHHXF]@7?Bq?@?@F &. $ð!F &( "@&"@ #$ B("h!GB ޶TG Hb޶G'H0D10B2NGv J0F40BBSB!3@GGGG@ZkGG[GG"G@ZkG<àĐHD &@@@4@ÐDD- #&+ & $ "@%" _"b#@hƤG " B@b"ƐH޶GbH޶GD0BNGvJF4BBRB5@GG@ZkGG[GG"G@ZkGi $<D &pƤ #&@@&vH@%DD"D Р & $ "@$" _"b#C@ pGBGbG3vHG@ZkGG[GG"G@ZkG:G $<D & #&@@(@DDð &  "@&" _"b#@BP bGGGtG@ZkGG[GG"G@ZkG0B $8bG $@Zk $d c$4GƠPcfG]]} (0ݤ8@P#k#4G~ _"^^~ (0޴8@H>PG{GG $ & $0b# $ 0 #$D< #$ $ á? & "@&"@h!B "b "GGGGG@ZkGG[GGGG@Zk'GGB $b @ZkR &s" $0@Bs"45FvHBPbGGtG@Zk $ %GǰD #$G!GtG HBPb@Zk @DG< $D #$ Ơ &E, "@'" _"0b#@ " #!p G8 D G #&B"18b"G(1 F3F ""BbGFGGGGG@ZkGG[GGGG@Zk %B4G0bȒI5A@Zk #&<GDàIÑ A"@BA0DD xD"B0"b C&uF "GGGG@ZkGGG"G!GxD % $ 0 H$ D & G "@&" _"0b#}@ BGbGGGGG@ZkGGG"G[xDGG@ZkTDGGD#G xBb@Zk $ $ %!Ơ &  "@(" _"0b#O@P BGbGGtG@ZkGG[GG!"G@ZkTGG4G$! (B0bG@ZkGG $<à $D,@@D8AE!E  & #& & "@$" _"0b#@ BGbGGtG@ZkGG[GG"G@Zk #%" %B $) $!F,e1"bGG@ZkGG[GG"G@ZkTG)D $<à %å! "" BbGTG@ZkGGGGG<# $ $ $E B b""GTG@ZkGGGGG[G@Zk(B0bG@ZkG!G %" $ & "@%" _"0b#@x)!BGbGGtG@ZkGG[GG"G@ZkG(B0b@Zk4GG]]} (0ݤ8@H=P`#kG#4G~^^~ (0޴8@H>P^X~`hpGGG GXBG`bG & '&0QG@Zk GHB"Pb4G&@@Zk '$ǰ & G& g&а &4G2 Gs G<ADǠ8,I TEJG &BGנGG@Zk ''>GxB $b5A4G@ZkG(" $DǠxD0å"0Q"2D8B %!@bGq"GGG@ZkGG[GG"G@ZkxD GTD $("8B $å  /=LD@b1"GGtG@ZkGG[GG"G@Zk TG $ % $& $LGGtG#`hBEpb@Zk DD'! G G%("8B %J %!@bH1"GGGG@ZkGG[GG"G@Zk TGG]G]} (0ݤ8@H=P]X}`hp#kG#HG~G^TG &GB G] #kG &AGGG@Zk & 7& W& &8C@BG]G #k#4G~^^ ~(08޴@HGGGBGbGG"@ZkD#a@ } }G4GBb"@ZkCdG8BB@b4G#D@ZkGG_áf@@G0D BGG@Zk<5@6U@ BIG]GBG R"@ZkGGGGB`G "91 CG ,H"%H!@%HCD'H61 @"6H7.7J"16JB1!JCD.uH HTJGF>#!BH91 Cx/ HG!1 @[xKx?#6H91 CG]G }Gpb# R"_(BG0b4GG@ZkGG]] }(08ݤ@HP#k#5AJ~G^CGGGGG5@`5"p.pJG`CBwFvF.JFB8/8KBG&8AJ 8@#B1/Gs6KXKG?"p.V/pJZVKhBxvJXGV?G3AJ3@s"B`V/GsKZVKSGV? G3AJ3@s"B `6/zJY6K:G6?p.""pJG4G([8;"G@ZkG6/Y6K6?G]G #kG1GGG1 ]GG@ZkGk4?G GET_CRC_TABLE4@b# GET_CRC_TABLE4?@ GET_CRC_TABLE4)GCHECKDIR4*b#CHECKDIR4)@CHECKDIR4PGd DECC$MALLOC4Xb# DECC$MALLOC4`@d DECC$MALLOC4G DECC$MALLOC4b# DECC$MALLOC4@ DECC$MALLOC,9\GREADBUF,:db#READBUF,9@READBUF43G DECC$MEMCMP44b# DECC$MEMCMP43@ DECC$MEMCMP<=GPROCESS_CDIR_FILE_HDR<>b#PROCESS_CDIR_FILE_HDR<=@PROCESS_CDIR_FILE_HDR47G DO_STRING48b# DO_STRING47@ DO_STRING47 G( DO_STRING48b# DO_STRING47$@( DO_STRING47HGd DO_STRING48X鋋@ UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<gb# DO_STRING47`@d DO_STRING,;GMATCH,<b#MATCH,;@MATCH,;xGMATCH,<b#MATCH,;@MATCH4pGDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4@G`DECC$GXSPRINTF4Hb#DECC$GXSPRINTF4\@`DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF 4G ,DECC$GXSPRINTF4b#DECC$GXSPRINTF4(@,DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4`G|DECC$GXSPRINTF4pb#DECC$GXSPRINTF4x@|DECC$GXSPRINTF4GDECC$GXSPRINTF4 b#DECC$GXSPRINTF4@DECC$GXSPRINTF4-L G` DECC$LSEEK4.P b# DECC$LSEEK4-\ @` DECC$LSEEK4/` G DECC$READ40 b# DECC$READ4/ @ DECC$READ4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF 4 @ DECC$GXSPRINTF,9X Gt READBUF,:` b#READBUF,9p @t READBUF4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF43 G DECC$MEMCMP44 b# DECC$MEMCMP43 @ DECC$MEMCMP4  G8 DECC$GXSPRINTF4 b#DECC$GXSPRINTF44 @8 DECC$GXSPRINTF4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF4% G SEEK_ZIPF4& b# SEEK_ZIPF4% @ SEEK_ZIPF,9 G, READBUF, : b#READBUF,9( @, READBUF430 GL DECC$MEMCMP448 b# DECC$MEMCMP43H @L DECC$MEMCMP4T Gx DECC$GXSPRINTF4h b#DECC$GXSPRINTF4t @x DECC$GXSPRINTF4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF<C G PROCESS_LOCAL_FILE_HDR<D b#PROCESS_LOCAL_FILE_HDR<C @ PROCESS_LOCAL_FILE_HDR4$ GH DECC$GXSPRINTF48 b#DECC$GXSPRINTF4D @H DECC$GXSPRINTF47t G DO_STRING48x b# DO_STRING47 @ DO_STRING4 G DECC$GXSPRINTF4 b#DECC$GXSPRINTF4 @ DECC$GXSPRINTF40G@ DECC$FREE48b# DECC$FREE4<@@ DECC$FREE47HGp DO_STRING48Xb# DO_STRING47l@p DO_STRING4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF,1XG|FZOFFT,2`b#FZOFFT,1x@|FZOFFT,1GFZOFFT,2b#FZOFFT,1@FZOFFT4GDECC$GXSPRINTF 4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4`GDECC$GXSPRINTF4hb#DECC$GXSPRINTF4|@DECC$GXSPRINTF,#G(MAPNAME,$b#MAPNAME,#$@(MAPNAME4GHGdCHECK_FOR_NEWER4HTb#CHECK_FOR_NEWER4G`@dCHECK_FOR_NEWER45G DECC$STRLEN45@ DECC$STRLEN4HG`DECC$GXSPRINTF4Pb#DECC$GXSPRINTF4\@`DECC$GXSPRINTF4+G DECC$FGETS4,b# DECC$FGETS4+@ DECC$FGETS4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF40G@ DECC$STRCPY4<@@ DECC$STRCPY45@GL DECC$STRLEN45H@L DECC$STRLEN4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4+G, DECC$FGETS4, b# DECC$FGETS4+(@, DECC$FGETS450G8 DECC$STRLEN454@8 DECC$STRLEN<EGDEFER_DIR_ATTRIBS<Fb#DEFER_DIR_ATTRIBS<E@DEFER_DIR_ATTRIBS4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4XGxDECC$GXSPRINTF4`b#DECC$GXSPRINTF4t@xDECC$GXSPRINTF4-PGt DECC$LSEEK4.hb# DECC$LSEEK4-p@t DECC$LSEEK4/xY1 UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<eG DECC$READ40b# DECC$READ4/@ DECC$READ4G DECC$MALLOC4b# DECC$MALLOC4@ DECC$MALLOC4G(DECC$GXSPRINTF4b#DECC$GXSPRINTF4$@(DECC$GXSPRINTF4XGl DECC$FREE4\b# DECC$FREE4h@l DECC$FREE4ATGp DECC$QSORT4B`b# DECC$QSORT4Al@p DECC$QSORT<'GSET_DIREC_ATTRIBS<(b#SET_DIREC_ATTRIBS<'@SET_DIREC_ATTRIBS4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4G( DECC$FREE4b# DECC$FREE4$@( DECC$FREE44GH DECC$FREE48b# DECC$FREE4D@H DECC$FREE4hGDECC$GXSPRINTF4xb#DECC$GXSPRINTF 4@DECC$GXSPRINTF4G,DECC$GXSPRINTF4 b#DECC$GXSPRINTF4(@,DECC$GXSPRINTF4pG DECC$FREE4|b# DECC$FREE4@ DECC$FREE4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4$G8 DECC$FREE40b# DECC$FREE44@8 DECC$FREE4tGDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4HGdDECC$GXSPRINTF4Pb#DECC$GXSPRINTF4`@dDECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4 G<DECC$GXSPRINTF4(b#DECC$GXSPRINTF48@<DECC$GXSPRINTF4 GX!DECC$GXSPRINTF4 !b#DECC$GXSPRINTF4T!@X!DECC$GXSPRINTF4!GH"DECC$GXSPRINTF4"b#DECC$GXSPRINTF4D"@H"DECC$GXSPRINTF4"G#DECC$GXSPRINTF4"b#DECC$GXSPRINTF4#@#DECC$GXSPRINTF4#G#DECC$GXSPRINTF4#b#DECC$GXSPRINTF4#@#DECC$GXSPRINTF,!#G#MAPATTR,"#b#MAPATTR,!#@#MAPATTR4$G%DECC$GXSPRINTF4$b#DECC$GXSPRINTF4%@%DECC$GXSPRINTF4P%Gh% OPEN_OUTFILE4X%b# OPEN_OUTFILE4d%@h% OPEN_OUTFILE4%G% OPEN_OUTFILE4%b# OPEN_OUTFILE4%@% OPEN_OUTFILE<%G%DEFER_LEFTOVER_INPUT<%b#DEFER_LEFTOVER_INPUT<%@%DEFER_LEFTOVER_INPUT4&G&DECC$GXSPRINTF4&b#DECC$GXSPRINTF4&@&DECC$GXSPRINTF4H'GX'READBYTE4P'b#READBYTE4T'@X'READBYTE,'G'FLUSH,'b#FLUSH,'@'FLUSH, (G(FLUSH,(b#FLUSH,(@(FLUSH4(G(DECC$GXSPRINTF4(b#DECC$GXSPRINT F4(@(DECC$GXSPRINTF, )G)INFLATE,  )b#INFLATE, )@)INFLATE4d)G)DECC$GXSPRINTF4l)b#DECC$GXSPRINTF4)@)DECC$GXSPRINTF4)G*DECC$GXSPRINTF4*b#DECC$GXSPRINTF4*@*DECC$GXSPRINTF !4`*Gl* CLOSE_OUTFILE4 d*b# CLOSE_OUTFILE4h*@l* CLOSE_OUTFILE4*G*DECC$GXSPRINTF4*b#DECC$GXSPRINTF4*@*DECC$GXSPRINTF4+G+ UNDEFER_INPUT4+b# UNDEFER_INPUT4+@+ UNDEFER_INPUT4+G+DEC"C$GXSPRINTF4+b#DECC$GXSPRINTF4+@+DECC$GXSPRINTF4+G,DECC$GXSPRINTF4+b#DECC$GXSPRINTF4+@,DECC$GXSPRINTF4L,G`,DECC$GXSPRINTF4P,b#DECC$GXSPRINTF4\,@`,DECC$GXSPRINTF4,G,DECC$GXSPRINTF4,b##DECC$GXSPRINTF4,@,DECC$GXSPRINTF4,G, UNDEFER_INPUT4,b# UNDEFER_INPUT4,@, UNDEFER_INPUT4-G4-DECC$GXSPRINTF4 -b#DECC$GXSPRINTF40-@4-DECC$GXSPRINTF4X-Gd- UNDEFER_INPUT4\-b# UNDEFER_INPUT4$`-@d- UNDEFER_INPUT4-G$.MAKEWORD4.b#XMAKEWORD4 .@$.MAKEWORD4(.G@.MAKELONG40.b#XMAKELONG4<.@@.MAKELONG4 .G.OTS$MOVE4 .@.OTS$MOVE, .G.INFLATE, Lt UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<$%.b#XINFLATE, .@.INFLATE4/G@/DECC$GXSPRINTF4$/b#XDECC$GXSPRINTF4 csize %s for STORED entry continuing with "compressed" size value =PAwarning: cannot alloc memory for dir times/permissions/UID/GID =PD%lu file%s skipped because of unsupported compression or encoding. 8=JB error: unsupported extra-field compressiD_* UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<.34on type (%u)--skipping I I=1) compressed EA data missing (%d bytes)%sU U==5 compressed WinNT security data missing (%d bytes)%s= ==-%$EXTRACTDEC C V4.1-001v v= 44= __iscntrl4= e0$ $= 4: := (4= 0  = "0454=#extract_or_test_files04= + + +  +  + +  + + + + +! +  + + + + + + + + + + +  ,  , ,!؀ Q,  u, x, y, y,, y, {, |,, , , , , ,6 , , , , 3,  - , , ,  s. t. t. s.   ~.  s. ~. . . . . . .  .  . . . . . . . . . . . . . . . . . . . . .  . 7. . .  . . / / / / / / / / /! ?/ @/ ?/ D/ D/ E/ J/!1 n/1 / / / t/ / / / / / / / /- / / / 0 0 0 0 0 0 0 &0 &0 )08 +0܁" [0 [0 [0 [0 50 / / / / / / /z 0 0 0 r.$ , , , , , , , , , , ,; , , , , , , , , , , , , , , , , - -P9 - -  -   - - !- ,- - 3-T 2- Q- R- T- Q- R-y [- [- [- [- _- a- a- a-  p- o- o- y-T$ $= 44. .=  /4=  = . .=  /4=  = . .=  04= :. .=  /4=  =  = . .=  /4=  = . .=  04= . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = .; .=  /4=  =  = : := 4=  = 44= store_info4=e] -I -I - - - - - - - - - - - - -  - - - - -  .  . . . .<  . Y . . . . .  ,. ,. .. ..,$ $= ,4: := $4= @3 3=/'&extract_or_test_entrylist =  = #@$44=$extract_or_test_member@$4= 0 0 0 0 0 0  0  0 0  0= 0 0  0  0  0 0  0 1 1 1@ 0Z 0Z 0Z  1 1 1 1 1 1 1 1 1 1 1 1 1 1k 1 1@ 0 0 1 1 1  1 1 1  1 1 1P 1  1 3 1~ 1 1 2 2 2 >2 2 2 2 1<$ $= D$4: := d-4= `  = -4X4= memextract-4=# *3 *3 *3 *3 *3 13 23 :3 =3 >3 ?3 43  :3 E3 L3 L3 N3 M3 N3 d3 e3 f3 g3 i3 ? l3 m3H$ $= -4. .=  -4=  = : := 04= ( = 0404=memflush04=[SR 3 3 3 3  3 3 3 3 3$ $= 04: := l14= S S= @ x144=!extract_izvms_blockx14= 3  3  3  3  3  3 3) 3 3) 3 3 3V 3 3  3 3 4 3 3 30$ $= |14. .=  w14=  = : := 34= p) )=A%decompress_bits =  = 344=fnfilter34= P4  P4  P4 \4 c4 c4 4 4   c4D c4A  $ $= 34: := 54=  = 54P4= dircomp54=$ 4 4 4 $ $= 54: := 54= 4 =  $ww^K UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<BC1X$V1.0BBFILEIOV1.029-APR-2009 07:24DEC C V4.1-001( ( $ABS$i$CODE$M $LITERAL$@$LINK$$DATA$$BSS$ $READONLY$ OEM2ISO_850OEM2ISO0JhUZPMESSAGEPRNT0J UZPINPUT0J  UZPMOREPADUSE0Jp  UZPPASSWORDDECC$GA_STDERRDECC$GA_STDOUT DECC$FFLUSHDECC$GXFPRINTFDECC$GXSPRINTF DECC$FPUTC DECC$ISATTY DECC$LSEEK DECC$READ DECC$OPENOPENR_IDACC_CB DECC$TOLOWERDECC$GA___CTYPE CMA$TIS_ERRNO_GET_ADDR DECC$STRCAT DECC$STRERROR DECC$STRLEN DECC$FREEE DECC$MALLOCG GETZIP64DATA0J0OPEN_INPUT_FILE0Jh UNDEFER_INPUT8JDEFER_LEFTOVER_INPUT(JXREADBUF0JREADBYTE0JP SEEK_ZIPF(J  HANDLER0J DO_STRING0J8MAKEWORD0JF`MAKELONG0J MAKEINT64(JP8FZOFFT0J ZSTRNICMPFNFILTER RETURN_VMS SCREENSIZESCREENLINEWRAP( OEM2ISO0  OEM2ISO_850SEEKMSG REPORTMSGECHOTT_GETCHOTS$MOVE =GkGG;F!0@a/aK$Dk#G~G^G^~ (0޴8@G#G0b"bpB(" " $@xb>@Zk #$ &P !`B C&Ð #&hbҠ G@ZkPB4G Xb@ZkBGbGGGG@ZkGG[GG"G@Zk4GGG]]} (0ݤ8@P#k $! B & &  @&1B!!B @& &1k & $k $!0@B  $ &H! @&1 `&0@2 $10B3G @& &`11qB k#~^^ ~(08GGGG0G & %& _"tG0B $ 8b@Zk %& %$ & E& &1& "'3B4 &@B &բGGCG6GG@Zk %$ $B6B$@x@G]] }(08@#kG= $CG & "PB"ÐGG@ZkGG[G@ZkGG#~^^~ G{G $I gð@ #$ 1@ᳰ ^G #$ $! _"tGJ B #$b!@Zk &G0  K #& B"ÑG"G@ZkGG[G@ZkB4Gb4G@ZktGB4Gb@Zk $ #$! #& c& _" &1@0@4B  &â & ' #' C'Bø7Bڲ c' C&R @ c& #&s &1 c$31`Bt1 .#JG]]} 0#k#? ~G^^~ (0G0{G $ "J (bBD%@@ &PBÐ #$ $Xb @G@ZkGG[GG4GG@ZktG7 #$ &!GGtGD 0B8b $@Zk #$B #& _"tG1b@Zk #$GtGG & #& C&%@BG c& &s & & c$3tBB$dBBGG]]} (0@#k#~^^~ (0޴8@H>P^X~`hGGGG 0DG$BGBG G DrGXbsD KC&R@ f."pJXF,TGaFJ0@@HD< hBx"pb#"TG@Zkx# &DG!Q @x#ATG4G=HBPbTG@ZkGB4Gb@Zkt #$ c& &|#!GxCtG0 B0 @3 2B|#@t"4G[1"@Zk D4G4G(B0b@Zk(B0bTG4G@Zk HB,TGPbTG@Zk4GB b@Zk %¬t#A P MG(.(JX!F 4GxBGb@Zk -IDG#C0 B# 2B4 FL &+@ &| G”8Axâ 0C0B0B— B|8""BbGGGG@Zk DCB %b $G4G@Zk4GdG"4GtG[1"G@Zk!A0@G5(AG1Bb8""GBGGG@ZkDC&4G D4G(B0b@ZkTG(B0b4G@Zk8""B GbGG@ZkD C B4Gb@Zk- c$IU@ðGG]]} (0ݤ8@H=P]X}`hp#kGGkGM#TG~^^ ~(08޴@GG $= ]G`"" 0B8b@Zk0B $tG@=8b@ZkPB4GXb@Zk G@BGHb@ZkGD8*D8.D$D 泵!@ U!@ @aF?G@BGHb@ZkG"0BTGD8b01"@Zk4GPBXb@ZkG4G@$,$H Bb@ZkGD8DBGb4G@Zk $4G… ]@FD@|G]] }(08ݤ@P#kGGk#4G~^^~ (0N8GGG0B`b4G8b@ZkXE" #$B &Á b1"@B"GtG@ZkGG[GG!"G@Zk BtG(b4G@Zk`E"`B $B $bÄ` 1"8R"GtG@ZkGG[GG!"G@ZktG B4G(b@Zk`xE"BtG e$B $bc 1" R"G@ZkGG[GG!"G@Zk BtG(b4G@Zk B(bG4G@ZkG]]} (08@#k#~^^ ~(08޴@HP>X^`~hGG O= GG`GBü׀@?`\@CkC¤$ _G#B $F`b#G_ &$ G!0AI@ G#j@0@GA.RAJA>','H Gh.hJaF `.!JF.!JF(/ ,(K@ Hp)K!D <(.)!(J?. f&DTJ>sG 0JF (ӦXFF 8F@FGFxGXF43 "90 f'{[.[J+G;.;J 0F .JF4C,HGGP{.vHS{JvF{>[/{#[KPG@.JF0C/KGG.rJUJF>-{#I & f&”3!G4." 'Jg . GGuHJxF H.H#tGRHJq:KUFH>.!TJF>2xF*`'," 4G7HX!D , .HUJqHF> G!D .'#JXFG/. "GKWJxHK F>!,.HUJaHF>.{JTJF>!3 AC"`WB 'GxGGG[A@Zk &$"QAG`Ea1"GG[tG@Zkg- gI &$CaC( A[CGGGG jE@Zk_tG2 $ &&g1"GG[GG@Zk&G"!h@"B i%b $k 1"GTG@ZkGG[GG"G@Zk*@4GG G¤G`b# % !GZ_tGG)aH $ @ $؀D e-KeI e= 0J ('(D F8CFXCF`EF@ FFx!FXF  ¦ &G ֢F8/8K0G`>D UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<kQR,HDB,HGG8-kHI8I +E8=,#H &$bh"! G(!"D# .J@.%"G)!PJ4GJFB,HBb@ZkG,H'.rH Q'J2F'>e.eJ.VJ> & 'a@(H#Z#(GGF` Gz/ ,zK@Hg$HZ#Dp@0B f%8b f&3!k@)"G _"tG@ZkB@b bGGGtG@ZkGG[GG"G@ZkGSb# $ $ % $ %@$A@@x_DG¤4G &% PBXb@ZkB f%bG4G@Zk $ ""B %!bP1"GGtG@ZkG $[ $ &% f%GGG"G@Zkb#) k$@)+A$A@D_G F%G `b#c_tGpB $xbGTG@ZkG]] }(08ݤ@HP=X]`}hp#kG,0 0.H0J H vHDkG,0 0.P"p"H0,2JP. H1"J3HPJ!!H@T0@@ HCk,0 0.P"p".H0,2JP. H3Hp"1&JSJp."@J.0"qJ2CJ4J1!JJTBQB!$H0B0J@@k#~ ^(^0~8@GGGG_"0JrDB@"8"" `D B(b"@""TG@Zk"8""`"G B(bTG@Zk B(b"h""TG@Zk"`""G"G0bTG B(b $@ZkÄ0@pD #$PB &]@@`@Xb`@T" & $T"="tG@ZkÄG ](]D@d@d@8U c$T 0}@P#k @G#~^^~ (0޴8@GGGC¤GG0.#"F4GPJJF@B , H (B0b@ZkDGG#,#H$.D"f4GP2JJFtB.J(B0b@ZkD$,$HD#.%1@C #Jc  G_G]]} (0ݤ8@P#kG."ƢPJJFB6/6K (B4G0b@ZkDGG,H$,"Ơ4G P0HJF@f.fJ`(B0b@ZkD V@4DGd, dH @4DG4-xG DECC$OPEN4.b# DECC$OPEN4-@ DECC$OPEN<+GCMA$TIS_ERRNO_GET_ADDR<,b#CMA$TIS_ERRNO_GET_ADDR<+@CMA$TIS_ERRNO_GET_ADDR4)G DECC$STRERROR4*b# DECC$STRERROR4)@W DECC$STRERROR 4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4 @DECC$GXSPRINTF4G DECC$READ4b# DECC$READ4@ DECC$READ4 G0OTS$MOVE4 ,@0OTS$MOVE4 G DECC$STRLEN4X @ DECC$STRLEN4LG` DECC$READ4Tb# DECC$READ4\@` DECC$READ4 G DECC$STRLEN4 @ DECC$STRLEN,GECHO,b#ECHO,@ECHO4G RETURN_VMS4Yb# RETURN_VMS4@ RETURN_VMS4G@DECC$GXSPRINTF4,b#PDECC$GXSPRINTF4<@@DECC$GXSPRINTF4 G DECC$LSEEK4b#P DECC$LSEEK4 @ DECC$LSEEK4G DECC$READ4b#P DECC$READZ4@ DECC$READ4%@GX SCREENSIZE4&Hb# SCREENSIZE4%T@X SCREENSIZE4#G DECC$FPUTC4$b# DECC$FPUTC4#@ DECC$FPUTC4G DECC$FFLUSH4 b# DECC$FFLUSH4@ D[ECC$FFLUSH4! G( DECC$ISATTY4" b# DECC$ISATTY4!$ @( DECC$ISATTY4!, G@ DECC$ISATTY4"0 b# DECC$ISATTY4!< @@ DECC$ISATTY4#D G\ DECC$FPUTC4$P b# DECC$FPUTC4#X @\ DECC$FPUTC4` G\p DECC$FFLUSH4 h b# DECC$FFLUSH4l @p DECC$FFLUSH4' G SCREENLINEWRAP4( b#SCREENLINEWRAP4' @ SCREENLINEWRAP44 GP DECC$GXFPRINTF48 b#DECC$GXFPRINTF4L @P DECC$GXFPRINTF4\ Gx DECC$FFLUSH4 ]d b# DECC$FFLUSH4t @x DECC$FFLUSH4 G DECC$GXFPRINTF4 b#DECC$GXFPRINTF4 @ DECC$GXFPRINTF4! G DECC$ISATTY4" b# DECC$ISATTY4! @ DECC$ISATTY4!$ G4 DECC$ISATTY4"( b# DECC$ISATTY^4!0 @4 DECC$ISATTY4< GX DECC$GXFPRINTF4H b#DECC$GXFPRINTF4T @X DECC$GXFPRINTF4h Gx DECC$FFLUSH4 p b# DECC$FFLUSH4t @x DECC$FFLUSH48 GH DECC$GXFPRINTF4@ b#DECC$GXFPRINTF4D @H _DECC$GXFPRINTF4H Gh DECC$GXFPRINTF 4` b#DECC$GXFPRINTF4d @h DECC$GXFPRINTF4h G| DECC$FFLUSH4 t b# DECC$FFLUSH4x @| DECC$FFLUSH4 G TT_GETCH4 b#TT_GETCH4 @ TT_GETCH4 `G TT_GETCH4 b#TT_GETCH4 @ TT_GETCH4 G DECC$GXFPRINTF4 b#DECC$GXFPRINTF4 @ DECC$GXFPRINTF4 G DECC$FFLUSH4  b# DECC$FFLUSH4 @ DECC$FFLUSH48 GD DECC$TOLOWER3 UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<`a4< b# DECC$TOLOWER4@ @D DECC$TOLOWER4X Gl RETURN_VMS4` b# RETURN_VMS4h @l RETURN_VMS, GECHO,b# ECHO,@ECHO4G@DECC$GXSPRINTF4(b# DECC$GXSPRINTF4b<@@DECC$GXSPRINTF4`Gt RETURN_VMS4hb#  RETURN_VMS4p@t RETURN_VMS4GDECC$GXSPRINTF4b# DECC$GXSPRINTF4@DECC$GXSPRINTF4G RETURN_VMS4b#  RETURN_VMS4@ RETURN_VMSc4G(DECC$GXSPRINTF4 b# DECC$GXSPRINTF4$@(DECC$GXSPRINTF4HG\ RETURN_VMS4Pb#  RETURN_VMS4X@\ RETURN_VMS4\Gp RETURN_VMS4`b#  RETURN_VMS4l@p RETURN_VMS4tGdDECC$GXSPRINTF4|b#DECC$GXSPRINTF4@DECC$GXSPRINTF4TG` DECC$TOLOWER4Xb# DECC$TOLOWER4\@` DECC$TOLOWER44G`FNFILTER4<b#FNFILTER4\@`FNFILTER4`GDECC$GXSPRINTF4heb#DECC$GXSPRINTF4|@DECC$GXSPRINTF4G DECC$FREE4b# DECC$FREE4@ DECC$FREE4G  DECC$MALLOC4b# DECC$MALLOC4@  DECC$MALLOC40GXDECC$GXSPRINTF4@b#DECC$GXSPRINTF4fT@XDECC$GXSPRINTF4G GETZIP64DATA4b# GETZIP64DATA4@ GETZIP64DATA4G DECC$STRCAT4b#P DECC$STRCAT4@ DECC$STRCAT4G DECC$STRCAT4b#P DECC$STRCAT4@ DECC$STgRCAT4G DECC$STRCAT4b#P DECC$STRCAT 4@ DECC$STRCAT4G( DECC$STRCAT4b#P DECC$STRCAT4$@( DECC$STRCAT4<GxDECC$GXSPRINTF4Tb#PDECC$GXSPRINTF4t@xDECC$GXSPRINTF44Gh@ DECC$TOLOWER48b# DECC$TOLOWER4<@@ DECC$TOLOWER4G DECC$TOLOWER4b# DECC$TOLOWER4@ DECC$TOLOWER4(G8 DECC$TOLOWER40b# DECC$TOLOWER44@8 DECC$TOLOWER4G DECC$TOLOWER4ib# DECC$TOLOWER4@ DECC$TOLOWER =( xP\ x =5-segmentation violationillegal instruction =0 ;7DECC$GA___CTYPE=0 ;=P @ DECC$TOLOWER=0 8;=P  DECC$STRCATj7G=16=.DECC$GXSPRINTF=d=ll=0 ;=0 `;=0 8;=0 X;=@< 0;  DECC$READ8OTS$MOVE@ DECC$STRLEN=0 ;k=@< 7SEEKMSG7 REPORTMSG DECC$LSEEK=0 ;=p ;FNFILTER= [ %s ]  DECC$FREE; GETZIP64DATA DECC$MALLOC=0  ;=@<  RETURN_VMSECHO= bus errorp=l0  ;=0  ;=P| 7DECC$GA_STDERRDECC$GXFPRINTFTT_GETCH DECC$FFLUSH= =0  ;=0 h;=p  ! DECC$ISATTY=%.*s@# DECC$FPUTC7DECC$GA_STDOUT`% SCREENSmIZE'SCREENLINEWRAP=0 ;=0 ;=0 =0 h;=0 0;=P 7OPENR_ID=acc= ctx=stm7ACC_CB) DECC$STRERROR +CMA$TIS_ERRNO_GET_ADDR- DECC$OPEN =8/error: cannot open zipfile [ %s ] n %s 0=(error: zipfile read error P=8*warning: filename too long--truncating. =@3warning: extra field too long (%d). Ignoring... =@4%s: write error (disk full?). Continue? (y/n/^C) =0'error: zipfile probably corrupt (%s) =--More--(%lu)(=|t--- Press `Q' to quit, or any other key to continuoe --- =׃Ѫ++++--+-+++---+i++_̯յݯ=, ,4< <=,$#FILEIODEC C V4.1-001v v= 44= __iscntrl4= ~0$ $= 4: := `' UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<v+op (4= 0 = 044=open_input_file04=E=< C- C- C- C- L-0$ $= 44: := 84= 8 = h44= undefer_inputh4=e]\ v. v. . x. . x. . .q . . .$ $= h4: := 4= p = !44="defer_leftover_input4=<43 . . . . .$ $= 4: := P4=  = X44= readbufX4=r . . . .  .  .  .  . . . . . . . .+ ., . . . $ $= 4: := T4= x= == 44=readbyte4= . . . . . . . . . . .X .Y s. .L .Y . . . . .b . .,$ $= 4. .=  4=  = : := 4=  = 4P4= seek_zipf4= ./ ./ ./ E/ E/ I/ M/ M/  V/  b/ b/ e/ e/t e/($ $= 4: := @4=   = h44=UzpMessagePrnth4= B18 B1 + R1& {1  1 1 1  1  1 1 1 1 1 1 1 1 1 1 1 1 1 1u 1 1 1 1 1 1 1$ 1  1 2) 2 2 2H$ $= 4: :=  4= pv v=  44=UzpInput 4= >2 $ $=  4: :=  4=  =  4v4= UzpMorePause 4=ia` M2  M2  M2  Y2 j2 k28 m2,$ $=  4: :=  4= x x=  4p4= UzpPassword 4= 2$ $=  4: :=  4=  = w 4 4= handler 4=ZRQ 2 2 2 2 2 2 2($ $=  4: := l4=  = 44= do_string4=ZR 94 94BS 4 4 4 4 4 4 4 4  4 4 x4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4N 4N 4N 4M( 5 5 5 &5 &5 .5 .5 15 35 35 35 35  K5 K5 K5 U5 W5G W5 X5 \5 X5 \5 \5 \5eD$ $= 4.y .=  4= . .=  4=  = . .=  4=  =  = . .=  4=  = . .=  4=  = . .=  4=  = : := 4=  u u= z844=makeword84= 5($ $= 84: := T4= ( = `44=makelong`4=D<; 5 5 5 5 5 5 5$ $= `4: := 4= P = 4{4= makeint644=skj 6 6 6 6 6 6 6 6 6 6 6 6 $ $= 4: := 04=  = 84P4= fzofft84=~vu !6  !6 06 06 A6 D6 D6 G6 J68 G6$ $= `4: := 4=  = 44= zstrnicmp4=JBA 6 6 6 6 68 6$ $= 4: := 4=  =  ww}1?$V1.0CCGLOBALSV1.029-APR-2009 07:24DEC C V4.1-001  $ABS$i$CODE$ $LITERAL$x$LINK$$DATA$$BSS$ $READONLY$ CENTRAL_HDR_SIG  LOCAL_HDR_SIG END_CENTRAL_SIG END_CENTRAL64_SIG END_CENTLOC64_SIGFNAMES~UZPMESSAGEPRNTUZPINPUT UZPMOREPAUSE UZPPASSWORDDECC$GA___CTYPE0J0 GLOBALSCTOR0  LOCAL_HDR_SIG0 CENTRAL_HDR_SIG0 END_CENTRAL_SIG8 END_CENTRAL64_SIG8 END_CENTLOC64_SIG G( G( [@з UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<~ FNAMES OTS$MOVEMOTS$FILL` `=GkG;F!0@a/aK$DkG;GG0] &õ"GGG@Zk A& 4G"P", A'Ҳ0"a"! &z &@ !&H} a& A'X]ÖG8GqSk4@G\OTS$FILL4X@\OTS$FILL" "= *@ @=0 ;7DECC$GA___CTYPE= 0 0;=7G ;8 OTS$MOVEM8OTS$FILL7 UZPPASSWORD=7UZPMESSAGEPRNT7UZPINPUT=p7 UZPMOREPAUSE$ $= $ $= $ $ = $ $ = $ $ = = = 46 = ==-%$GLOBALSDEC C V4.1-001v v= 44= __iscntrl4= X0$ $= 4: := (4= 0 = 044= globalsCtor04= *  *  )* -* .* /* 0* 1* 2* 9* 4* ;* 5*$ $= 44: := 4=  =  ww1%$V1.0CCINFLATEV1.029-APR-2009 07:24DEC C V4.1-001x x $ABS$i&$CODE$/ $LITERAL$`$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPE DECC$FREE DECC$MALLOCGREADBYTEFLUSHMEMFLUSH0JP& HUFT_FREE0JP HUFT_BUILD(J@HINFLATE0J0 INFLATE_FREE MASK_BITS0J0 INFLATE_CODESOTS$MOVEOTS$FILL =GkG;F!0@a/aK$DkP#~(^0^8~@HP޴X`h>p^x~޵GG =]}ݠR@ bS@2AJ3aJ &rAsAL '& &ӡP1HÐ ݱG %A( G & g& '&21BS1 &Q.QJ1"G0/   4G(BG0b@ZkG/  4GG/I !AC %AE?}<I EPBp@/0 J?FKCdD)2ACJ`c@cDcD6xlD $A|G ' G' g' &91C:{,H{#p(BG0b@Zk G-  -I !A C $A E_ D@$H<IdAED@A/0 J?FKCdDC)2Aô #A & & ' g'61Bײ8/8K# GG(BG0b@Zk G -I !A C #A E? P@0J<IݠpAK/vI##A f@EC A G& &R & '31@Bt@.J"GG(BG0b@ZkG/  /Ia@C f@D` ݡ ]m? g& &s"G`HBPbTG@Zk8B &@b"GGtG@ZkG} C @ GT4GG4GݰG4G 4GG4Gݱ G4G 4GG '$ & $HÁLP'G(]0]8}@HPݤX`h=p]x}ݥ#kp#~^ ^(~08@޴HPX>`^h~px޵GGG# & $PРLàG $ $$01@ $$!.J &! 0BGb@ZkG' 'H @CD0D%H&1@&"6H# G D& &R & '31@Bt @.J"G G4GVGBGb@ZkGg 'H&`@C& D?G#H & $&pD&Q@PаV`HLqXD@"GG" & '֢ $' $71B9 Y/YK9# G G4G$GBGb@ZkG( (I @C"DGD'H%@_"e" 2BH"` & & & D'51B /K"G G4GGBGb@ZkG( (I @C"DGD'H%@E" 0 BH#@G d& &s & $'41`B֢ `.J"ٲG G4GZGBGb@ZkG( (I @C"DG _"DAD2A'H8`FrF 4G BH%@@G4G:GC G3G" & '֢ $' $71B9Y/YK9# GGBGb@Zk G, ,I @ C"DYQA(B1!J"DQB'H1 0`AhAvHQ?B1!J%q@Bq7aI(sbAB+YA9!K= C `AYy2aIsbA 9Z_C[C@@:AK;aKY?C H9!K:@;@ @9@BB_ SA3aJ"C 0`AssbASB3aJBG ݲ !""tGtGGG@b#@ b#4E G8`E` @G3G4GLA,I*A @C` G GL  @"G $& d&1 & &21 BS .J"GGBGb@ZkG . .I @C @DG =DR_B2BgDLln6 d`nu@u}9˔}nV<Au0ED/` Vqۂ Q+ԾϪaWc|29g^|rjO%g-MoYT$aP玾IJQO0 hWzzW|.MI{zAOHbiv"(:sDĀ5وސЀ|-EA![crp#MI7PP9/zjؘ;(paOXWL>x[ ejbt$o #Z\lg!=Fp$iQnմN9JF)0'l`>6O֮`/VQjFX\;ukPV,.i*v(kxX sʿ,/VӾTH/EC~ܠ_+N=0FMdwa}Xi R?.N&[k  鮺T9:f pfkWsEض/EH{;n)4Uo|~)v_{nJ:M_1w14\RnuCn5b.+8-'EF$i4Kxwr[hDzt!鱿4#pENʄ]>0aMyJs6xGaQ^1䨳~-#D4p3GX3d T gZ1lb1 r c J{o\ͺ)Ȯ8"^^VP ikIb7g)=?qP:9Ӗs Tv'H H/Df] l dۍ0 ҅tF/qWDta9GUPXR,u@쬔#5+䒊N)dH@BRiPũOiFƗ Dn`| s´}#[.5:Lk1ڳ.- >ޘagqFKe> @Xbʣ~S@#Pq#|PCmOhG-oKVJΐU;R2;hMܓni Zmp$`8,_ L@ئ.OVm_irC XδCq5'/&\T $I-;¼9ı 6`2D_U !_5N]+oCŵF"Bȑs01oZrHʢd {+Q[m9`-lWGt%16&99@%7Q=y? ڝ?i!7|HW7;0^UjN2;r\mcOUG@tsw< v[.waZϷٺjcPmK)s_}|iv7x%n+vA3!@7(c.(` s㾆rhppavIfߌ1D͠ rʹ6D-o`X ߮Pf OgKj81WՆh4^H\3L1 kff/f4_ALM(ԤR7Kgw=(YX SqGisHrA|{m_͇c;MAFUȽg "`#bFyAHxcØvQgqD9R ܤTH.&TQ>0sa{7(4FqBf uXā,m@;i_3{e M;;]8ch֊Kny48S@i)#uXBRO1exU\?ŋRx[ѳ3FwzrT5EZ)NZTQV* 4165DPzD:0SЋlVLCqɵIAd6 @Op-y&Cg !kJ!y'H N>vw&AvsGytOTW5?QB9q[E,.l$X*8['?1KZ%]E[F͛lY*S 튠"b{5{"x *o!6ፔoHE_ !ۜSq]5p,&GҨ^GLE9GoQh]X9j<["')yzw@ ?*4~+iABUK +VAՐb+BnTeG/s3ۃ\|LK9zd7kiMEdJoL< \姅^YnxAƻ'<L2?RAy5Iɛ~d tIi-'PO-0N`ޤ. OO]8T})\E)f< OR)(mvdc@L 0gȚUN[wdiD`;WED(E0?%fmjjK1⚛P$ͼ(6b!0?q=9q7`$1N\uY5nB&C^!z}In>rw.$ Mi7ϊ,c,0 H]ldRD?7ǏLc6xү$T1V10&Ӳ>MҍSU{Ӡ}T"}9%ÿ;z/e(+cBDvfdž-l_rf[B+i]TKm  FKf܏.:l'HBdWJQ=2Y"ZFNԵlfm0 Ynun K> Pv@ѹCPPHEǟ58%<Ύ8Y٪XI=QӴSYԷ`)&"uy7B6at;Jx=(N2/Ryi%R4+.#p_b!Bh 6p*3}g" =ګbVm羸!eK,_a"~c]S҉Yz!I@bNN,P}ЀzT;4FT\lKhcr#1lsj-GG_śe\;֠,5̘$wbG6#?χa?wX1}g\FtT%*{Jǜb{8ڪ` eU(,ƕ4&جoOEoV9;Bi)v0p56p4L pɑs@3IÏ~XLl)bxZaB-i5_딆A)7G$$GPR:vH~e2(Tß%Y3(1'-g0.*`vbcu}Jcԟ@|&$4o`BzmG€yt=L6Ÿ& }g[U1qV*-̬tJ"D$Tv>zު'R;m H csF<#`Do[i>]b}Qlؒ)'c4[}}Noa[']@{Вmo?[C@Wp&WJuvm^3"0^%*{U )D5$IqOU/;ت2"f|t;9< HnJf(mƵu4l&nO_Q4?*'͞ 9II!h9XHʭ-x=afGF]ԫLЅzk. 5N6SSbn 1 Z!< >OkTk28opill^G:G!ƽS~YRrhB*Hd3_ n;"~U{C9e*muvN?͜])pjrb^?淬V%gk]E{Uy(zZ3lG#B$^YC)xڬH^9ӥs@FKahKX@"yaX#,laxGFa%JA~ꊏ Kx#~$9p&-Rzs(=UY$#TR#BC (g]+"b+߾]Y} MG}~hh=S+/LL1: t@l-ռ:Dž"zT#34e k5"ƶJ6{]ƶnᕪ~4\&`Oy>=7iu>63:3| bgcwvrcbs22=;`<@G1;LvȻE 7en n5=֨6KwIJUr"5|UkT eIPuJH e-$MtJ%+JJꯡDeB4;ګt bئHp@)'9\Rd p>Hե .Ĺy(8Z9 AksD?+S[5ԭv< \yqON\iK[غI-v,iOf2Q̄)ϫ=t U~.OJO d @jvT% <@EA t(tG[7k.I:F̛E*zW|Z7W*SAE2钯1Rv*R?[Y3:ڄTGvpUޑX\#bRĦv@YAzpMA$͉,SsK#"?[2إ`5MQ9*8DtGFgFNuR[ѵM0›ϣ4Jg@i2}kShe.uƓGA"}>y8[:@_%ja 479QL-BIlu'GoiW.U?6Nm,iu1r7MgzAeȹ7-|$H?-ZT<5$$t; 3 j7 pő"c&M}U/S]<}+I Yd/KA^n[po)>RA#ԋ)*JvRky%` 88EO#$"kJf_3<~C, LK/dCvM-P 졮wQzva`F6;eDA/A%Nw!D<~R,-xbF6^P>Ɖ:.j~L>%@&93Gç=AsYpt]vYښK{aTFqu_] )V6Uzܓ+eao|%_VM01@"GG@b# @!(A< 8D $EDg4EG G8E G[ "4GG@Zkb#Y@b#V@ GGG ]G=b#_Gb#G@b#C@ GGlR E@ &"@BGbTG@ZkB &b"GGtG@Zk G G G'HGH&@#1`@ % $% D%H̱LPʰ GGG 4G GG $$8D8!G=" GGQQBQ1"p"Q"""VB G4GB"P#_p#`G"0B 4Gv!! G0!GB GGǰǰBǰ P!ǰ_ G 0BGp"0""" TB TBT#T"0#T "0Bp#T( d% d$@˱ &@c ~@!"8õ"@" ?"_"G@b# %@ G8G;GG! G_G@!! d$ $$DC &D! >"`h""<õ"GG@b#@ G $,! $8 d% b#@ G8<GG $ % %8 $<-@Nb#DdR_ GGGTGGG] ](}08@ݤHPX=`]h}pxݥ#k#~^^ ~(0Gp{G $H $P $LTGG"b#/_ &= #&TG?B &H1b"@Zk ðB #$ &bH!"GtG@ZkGGG]] }(0@#kG#~^^~ G {Gb# $8 $<x@ $b#8t@ $ c$8<G]]G} 0#k#G~G^^~޴>^ ~(08޵@HG!]_"}BGG`GG(B "GG@ZkGG_5 ]"01B"Q?B1!JGQBq0`Bq FP G4G_[_C;aK[B{`0@CS_C3aJSBs`0@CU_C5JUB 0@C@_C H@B0@CBCP GpzB`PG_UB5JUB41B@B H@B41BSB3aJSBs`41BUB5JUB41B@ 4G1I;J;JTCC7`5u`C AK uC @(`'GS_C3aJ0@CSB@_Cs H0@C@B33B[_C.`;aKsB0@C `B[BS_C&{3aJ@SB @ s0@C;AK@ @ uC@TC `G@_C H0@C@BTC  B @ = SB3aJTGSBS1:B C=TG~è41B}#P MCS:JLG}@C@4B[uB` zBuB` B7J`{#}BG[ 41B{#zB`(BP"?"G@ZkG_! H"P]" @@ HBQB1!J0BQB0BB}H" ="ZtAAQAڡP! Gݱ.1@AH GGG PA!@ݱ=}ӡG.1AGC@C0APc  ="zA HA`2HA G!I @@C6@0@ G;F 0 A7J7J !I0uB!.@5A B1`!1 @DQA @$#GĢ !@ VC%`6VCB B 0 A`D B@ @ 0 A`Ģ @@ 0 A@` 0 A2!I!@ PB_5A @G!@ @ 0 A5A!@] AAB@)HB;I0B#4GCG8bP@@Zk=" & Q@G}R@6IrB61BRE-  Q- W- Q- Q- R- S- \- ^- ^- = k-C -  - ^-U ^- ^- ^-  o- o- o- o- t- v- v- y- y- v- v- v- v- - -  - -  - - -h - - b- b- b- b-0 -P$ $= 4. .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = . .=  /4=  = : := 4= 0( (=$inflate_stored = ' '=# inflate_fixed = ) )=%inflate_dynamic =  = `44= inflate_block`4=G? /  /  / / /H / !/ / / N. O. c. d. d.D c. g.H f. j. k. j. i. t. q. t. t. q. w. w. w.< w. w. w. w. w. . . s. . . . . . . . . . . . . . . . . . . . . . . . . . .+ ." . . . . . . . . . . . . .s . . . . . . . . . . .P . . . . . . . .3 . . .' - - - - - - - - -D -+ - -D -+ - - - - - - - -  -+ -+ . . . . . . . . . . . . . . . . . . . . . . . . . . . $. $. -. -. -. -. /. 4. 8. 4. 9. ?. ?. ?. ?. ?.L$ $= 4. .=  _4=  = . .=  _4=  = . .=  _4= . .=  h4=  = X = . .=  _4= . .=  _4=  = . .=  _4=  = . .=  _4=  =  = . .=   4= Ⱥ UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<T. .=  _4=  = . .=  _4=  = . .=  _4=  = . .=  _4=  = . .=  _4=  = . .=  _4=  = . .=  _4=  = . .=  _4=  =  = @ : := 4=  = H4@4= inflateH4=D<; 7/ 7/ v/ p/ v/p$ $= h4: := 4=  = 044= inflate_free04=,$# / / / $ $= L4: := 4=  = 4P4= huft_build4==5 / /) /) /  / / / / / / / / / / / / / / / / / / / / / / / / / / / /8 / / / 0 0 0 0 0 0Y 0 0L 0 0 !0 0 0 !0 !0 0 !0 $0 $0 (0 &0 (0 &0 (0 &0 &0 &0 &0 &0 00 /0  30  >0 E0 E0 G0 F0 H0 F0 D0 F0 D0 D0 N0 N0 N0 N0 O0 S0 Q0 S0 S0 Q0 Q0 S0 S0 X0 X0 X0 X0 X0 X0 ]0 ]0 ^0 ^0 ^0 b0 b0 g0 d0 g0 g0 g0 g0 g0 0 0\ n0 n0 n0P 70 60 $ $= 4: := %4=  = P&44= huft_freeP&4=2*) w0  w0  0 0 $ $= l&4: := &4= d =  ww1[$V1.0AAMATCHV1.029-APR-2009 07:25DEC C V4.1-001` ` $ABS$i $CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$ DECC$TOLOWERDECC$GA___CTYPE DECC$STRLEN DECC$STRCMP(J0MATCH(JISWILDX X=( GkG;F!0@a/aK$Dk#G~G^GG{#@G]5@ #k#~^^~ (0޴8@H>P^X~`hp,GGGHGC #.#J@GD @#,#"GG#HtG 8b_ӑXD .4GJGGr.rJkF."JR"gF XeF xkF`R/R"RK_Gn@HBG4G@ZkHBGG@Zk  @`@#@d`Y.bGJFB/K(B0b@ZkG%,%H$. Hà4G$JF@.JH(B0b@ZkG$,$H HH&@.%.4G%J) d.dJ %`. JFBW/WK@(B0b@ZkG,H. HC4GHJFSB.J(B0b@ZkG$,$H HH&@GB GXBGG@ZkGBG.J G8bGGGtG>_,c H?TGGxD#.#J e.eJ5dBkBFG@ G.GJG G)/)K+G`4G+G ),)!)H?). AB G)J+F k@h.hJkF`! A 4Ga @.(#JFh/! AyK CTGCB@.4GRJFXB,H(B0b@Zk HH H G#,#H HH H#.#Jh." CGtJeF+``G.JC/ GKA BE@4GZ[C.J (B0bG@ZkaH'H!!HCGaH'H!!HCG,D(. 0A(JA?! A G GZ8b "#"GtG_TG GGO8b "#"GtG_ GGFG D-I C='HCD`4G A,,,H (B0b@Zk HH GGG HH GG D`C-4G"CI) F ,A).)J (B0b@Zk HH,H HHG,HE8b#"GGtGH_GGG]]} (0ݤ8@H=P]X}`hp#k,HG0.P"0J+D 0.G2J P.""PJ?kG$DX%D P."PJ?Gk4Gk4G DECC$STRLEN4@ DECC$STRLEN4G DECC$STRLEN4@ DECC$STRLEN4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4<GH DECC$TOLOWER4@b#( DECC$TOLOWER4D@H DECC$TOLOWER4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER40G@ DECC$STRCMP4<@@ DECC$STRCMP4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4|G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWER4G DECC$TOLOWER4b#( DECC$TOLOWER4@ DECC$TOLOWERt t=0 ;7DECC$GA___CTYPE=0 ;=0 p;=? P DECC$TOLOWER(;p DECC$STRLEN DECC$STRCMP=0 0;= ; ; UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<==+#"MATCHDEC C V4.1-001v v= 44= __iscntrl4= 0$ $= 4: := (4= 0 = 044= match04=' )$ )$ )$ $ $= <4: := d4= @ = p4(4=recmatchp4=y *  *  *  W*u * Y*} a*!Z *Y * *( * * * * * * *< * * * * * * *r * * * * * * *l * *  *$ * *H$ $= 4. .=  p4= . .=  o4=  =  = . .=  p4= . .=  o4=  =  = . .=  o4=  = : := X4= 0! !=isshexp = ! !=namecmp =  = 44= iswild4=F>= * * * * * * +$ $= 4: := 4=  =  ww1DU$V1.0CCPROCESSV1.029-APR-2009 07:25DEC C V4.1-001  $ABS$ix"$CODE$[ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$ DECC$STATDECC$GXSPRINTF DECC$CLOSE DECC$LSEEK DECC$READDECC$GA___CTYPE DECC$MEMCMP DECC$FREE DECC$MALLOC LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIG END_CENTRAL64_SIG END_CENTLOC64_SIGG8J(0PROCESS_ZIPFILES0J( FREE_G_BUFFERS8JpPROCESS_CDIR_FILE_HDR8JpxPROCESS_LOCAL_FILE_HDR0J  GETZIP64DATAOPEN_INPUT_FILEREADBUF SEEK_ZIPF DO_STRINGMAKEWORDMAKELONG MAKEINT64FZOFFT EXTRACT_OR_TEST_FILES INFLATE_FREE CHECK_FORMATISWILDCHECKDIR REPORTMSGFREE_CRC_TABLE =GkG;F!0@a/aK$Dk# "~4G^^~ (0޴8@H>PXGGGHBbPb@ZkHB #$&Pb"4G@Zk #$8" &@ c& &@ @F(B1"G0bTG@ZkGGG[G"G@ZkGGxGtG .q%He"PJuSJF>.x#BTGTJF>".8/.JY8KzJ :G8?J,aH@HD<.e#r.8.JSrJtJ#tFr>.8Jv5JWJF>2/",TGR/2K@Ha%KR"D<RK/8Bp[JXK:#G? '%. c',.%J4@H8ca:JJD<.rJCXBPJFF>4GG`b@Zk #$kB #&b1"TG@Zk #$b #&!&Q."q.R H1"0D CQJS qJThB &SFpb4G@Zk DR 4GQÈBGb4G@Zk DH 4GG $ #$ & #&_&1R"b# $2BrFG@G (B4G0b@Zk'Gh #$4G@D(B0b@Zkè #$ #& c&8" C&$@@ BѠ 0CbGGtG@Zk`)!(BG0bGGGG@ZkGG[GG"G@ZkTG& #%8" %x)C $?AƠ E(B $ #$0b A1"GtG@ZkG #%[GGG"G@Zk $ ) % TG)!I( $ #$xƤb",#x" &D6B1"(B3F0bHR"0!GGGtG@ZkGGGGGG $8"(B $Ơ #% 0bI1"GtG@ZkGGG"G[GG %@Zk^~GGG "G $@A`B $hb@ZkPB $ $$Xb $&@tG1@Zk $$ & $&! D&1D!B! 21@ &x"GtG.JF@BHb@Zk $$ &! $&! 10@?G d& & &s &4G3tB3Bv"DW@GG``B $'hb1@GtG@ZkPB $$ &Xb $&G1tG@Zk $$ TGDG & D&B1"20B# &x"GtG.JF@BHb@Zk $% $$)! &)!0!A? G D& d& &Rs &4G2SB2BU & &֢G1 J6/V/#.7J8K,ZXKq7J:GJ F!JD7Ha7HFD>< &%@&@_"@&H 4GH@Eh 'hb D' ?# $1C:`BGtG $@Zk $PB $' $Xb _"tG@Zk & I' 0'@$ G D&x"tGGp.pJjF`@BHb@Zk $ $ $$ @ G $& D& d&1R &s4G12B1qB4 & &֢G'H/5/".HK6,Y7K 0 AGJgH2JAVJ &ArVJF'DF>[G2D6<_G TGéA?AG<$ & '& 4F B $'(b8""YGtG@ZkGG[GG"G@Zk d$ B(bGcTG0"@ZkGG[GG"G@Zk =TG %`B $%hb $)X"ƠGTG( A@İ@ZktG B\"(b4G $@Zk B^"(b4G $@Zk`" B4G  UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<'(b d$ $%@Zkb" B4G(b % $@Zkd"0B4G8b $ @Zk0B H8bh"x4G@Zk H Bl"(b4G $@ZkcHGh$%HDf <$!E vHBCb4GTG@Zk $0" $ B åG(b81"TG@ZkGG[GG"G@Zk4GĠh "`&@@ `B $hbGGtG@Zk d$PB $% $ ="XbGtG@ZkD/d< $% $$)!D` B &(b8""PGtG@ZkGG[GG"G@Zk $0"G BTGƠTG(bP1"@ZkGGG[G"G@ZkG @EG@B"HbG"tG@Zk "0B8b4G $%@ZkBGb"4G@Zk0BG8b"4G@Zk)_%J!$ 1@<*A A!HDa@ D&, F d&2! B &8""TG(btG@ZkGG[GG"G@Zk $0"G BTGåTG(bP1"@ZkGGG[G"G@ZkG @EG`B $%hbC GtG@Zk $PB $%Xb $ ="GtG@Zk &D$,<$ $& q!E B D&(b8""RGtG@ZkGG[GG"G@Zk $0" BGåTG(bP1"@ZkGGG[G"G@ZkTGG @ECp" "@BGHbtGG@Zk&@`B#H $hbCGtG $@ZkPB $ $ ="XbGtG@ZkD$ &< $&+ q D&D B8""RG(btG@ZkGG[GG"G@Zk $0"G BTGåTG(bP1"@ZkGGG[G"G@ZkG @EG@B "HbGGtG@Zk $% $$<Ġ*)!a &D BP8""(bGtG@ZkGG[GG"G@Zk $0" BGåTG(bP1"@ZkGGG[G"G@ZkTGG @E$ $<Ġ $$ &D B8""!tGPG(b@ZkGG[GG"G@Zk $0" BGƠTG(b1"@ZkGGG[G"G@Zk0B8b0"4G@ZkD0B $8b4"4G@ZkƠ G8"4G@@%DvB $bk!@ZkG@"4G@@'Di B $b@Zk GH"4G@@'D] B $b@Zkx G"4GC@0@P"'DO B $b@Zk $&"1C@0@ d&'DA 4GS &d*F &DU & &֢ 'F7 *E X $' D'9 d'+G ڴD[ & $$ $ F E`G d&Gxs d$1!Js"`x & ET $G &6J  &DW D% $%Jx)G IA$GGp]x]}ݤ=]}#k#TG~TG8^@^H~PGG"BbtG@ZkGØb4G=B &b!!Hh!"H #&0vJ0Dh1 "@Zk #$BqHh! C&b4G0'HFh"@Zk #$BqHp! C&b4G0?HFp"@Zk #$B"b4GX@ZkB #$b"\4G@Zk #$B Hb"@4G@Zk #$B Hb "H4G@Zk #$BqSHp! C&b4G0v>HFp""@Zk #$BqHp! C&b4G09HFp$"@Zk #$BqHp! C&b4G0'HFp&"@Zk #$B("b4Gd@Zk #$BqHbh! C&4G0?HFh*"@ZkB #$b."`4G@Zk c$" HPGG & !&h1 & &PJ quJFF  a&h֦?"pJ w B8G#K`1J '`D s(F(08F@ x0`H7b@ ¦\|@Ck(xbG(x &"(WBG(W a& &`saF` T0@J@F@xAF`@F @( !'G(9(F(G(_#D( a& !$`sG!3J(C0`F3`JFF(G8]@]H}P`#k#TG~TG(^0^8~@GG" B(b@ZktGlGb4G=B &b!v H0 #&0J0D01 "@Zk #$BqSHb0! C&4G0v>HF0 "@Zk #$BqHb0! C&4G09HF0"@ZkB #$b"(4G@Zk #$B"b4G,@ZkB #$ Hb"4G@Zk =B #$ Hb "4G@Zk #$BqHb0! C&4G0'HF0 "@Zk #$ &8!rH0 c& &1?HRJ2F8F & #' C'Ԣ,ײ c'G{cG(]0]8}@P#k#~^^~ (0޴8@HGGG@@@D\GZ G8BG@b4GG@Zk8BC@b"4G@ZkC!@@8DH 'H@ G4G & %&H 1B'BF (B"0b %@Zk %$HG  & %&@14GB'BF (Bh@0bA@Zk %$ &@ %&h@P14G'F(B $0bA@ZkP %$&d!" $4G0D HBh@Pb@Zkd$@$@f@@`@G]G]} (0ݤ8@HP#k4%xG DECC$MALLOC4&b#( DECC$MALLOC4%@ DECC$MALLOC4%G DECC$MALLOC4&b#( DECC$MALLOC4%@ DECC$MALLOC4GDECC$GXSPRINTF4b#(DECC$GXSPRINTF4@DECC$GXSPRINTF,'|GISWILD,(b#(ISWILD,'@ISWILD4G DECC$STAT4 b#( DECC$STAT4@ DECC$STAT4)G, CHECK_FORMAT4*b#( CHECK_FORMAT4)(@, CHECK_FORMAT4+@GTOPEN_INPUT_FILE4,Hb#(OPEN_INPUT_FILE4+P@TOPEN_INPUT_FILE4#G DECC$CLOSE4$b#( DECC$CLOSE4#@ DECC$CLOSE4#G DECC$CLOSE4$b#( DECC$CLOSE4#@ DECC$CLOSE,,GTFZOFFT,@b#(FZOFFT,P@TFZOFFT4XGxDECC$GXSPRINTF4`b#(DECC$GXSPRINTF4t@xDECC$GXSPRINTF4GDECC$GXSPRINTF4b#(DECC$GXSPRINTF4@DECC$GXSPRINTF4tGDECC$GXSPRINTF4|b#(DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#(DECC$GXSPRINTF4@DECC$GXSPRINTF4#G0 DECC$CLOSE4$(b#( DECC$CLOSE4#,@0 DECC$CLOSE4!@G\ SEEK_ZIPF4"Hb#( SEEK_ZIPF4!X@\ SEEK_ZIPF4#lG DECC$CLOSE4$tb#( DECC$CLOSE4#@ DECC$CLOSE,GREADBUF,b#(READBUF,@READBUF4G DECC$MEMCMP4b#( DECC$MEMCMP4@ DECC$MEMCMP4!G SEEp+ UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<K_ZIPF4"b#( SEEK_ZIPF4!@ SEEK_ZIPF,GREADBUF,b#(READBUF,@READBUF4G8 DECC$MEMCMP4 b#( DECC$MEMCMP44@8 DECC$MEMCMP 4!@G\ SEEK_ZIPF4"Hb#( SEEK_ZIPF4!X@\ SEEK_ZIPF4#dG| DECC$CLOSE4$pb#( DECC$CLOSE4#x@| DECC$CLOSE<GEXTRACT_OR_TEST_FILES<b#(EXTRACT_OR_TEST_FILES<@EXTRACT_OR_TEST_FILES4#G DECC$CLOSE4$b#( DECC$CLOSE4#@ DECC$CLOSE4GDECC$GXSPRINTF4b#(DECC$GXSPRINTF4@DECC$GXSPRINTF4#,GL DECC$CLOSE4$4b#( DECC$CLOSE4#H@L DECC$CLOSE4GDECC$GXSPRINTF4b#(DECC$GXSPRINTF4@DECC$GXSPRINTF4 L G\ INFLATE_FREE4 P b# INFLATE_FREE4 X @\ INFLATE_FREE4 ` Gt CHECKDIR4h b#CHECKDIR4 p @t CHECKDIR4 G FREE_CRC_TABLE4 b#FREE_CRC_TABLE4 @ FREE_CRC_TABLE4  G  DECC$FREE4  b# DECC$FREE4  @ DECC$FREE4  G DECC$FREE4  b# DECC$FREE4  @ DECC$FREE4  G DECC$FREE4  b# DECC$FREE4  @ DECC$FREE4  G DECC$FREE4  b# DECC$FREE4  @ DECC$FREE4 G DECC$LSEEK4 b#0 DECC$LSEEK4 @ DECC$LSEEK4 G DECC$READ4 b#0 DECC$READ4 @ DECC$READ4T G` DECC$MEMCMP4X b#0 DECC$MEMCMP4\ @` DECC$MEMCMP4 G DECC$LSEEK4 b#0 DECC$LSEEK4 @ DECC$LSEEK4 G$ DECC$READ4 b#0 DECC$READ4 @$ DECC$READ4 G DECC$MEMCMP4 b#0 DECC$MEMCMP4 @ DECC$MEMCMP4 b#0 DECC$LSEEK4 G DECC$LSEEK4 @ DECC$LSEEK4 G DECC$READ4 b#0 DECC$READ4 @ DECC$READ44G@ DECC$MEMCMP48b#0 DECC$MEMCMP4<@@ DECC$MEMCMP4TGxDECC$GXSPRINTF4`b#0DECC$GXSPRINTF4t@xDECC$GXSPRINTF4GDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF,GREADBUF,b#0READBUF,@READBUF 4(G@MAKEWORD40b#0MAKEWORD4<@@MAKEWORD4@G\MAKEWORD4Hb#0MAKEWORD4X@\MAKEWORD4`G|MAKEWORD4hb#0MAKEWORD4x@|MAKEWORD4GMAKEWORD4b#0MAKEWORD4@MAKEWORD4GMAKELONG4b#0MAKELONG4@MAKELONG4GMAKELONG4b#0MAKELONG4@MAKELONG4GMAKEWORD4b#0MAKEWORD4@MAKEWORD4(G@ DO_STRING40b#0 DO_STRING4<@@ DO_STRING4PGpDECC$GXSPRINTF4`b#0DECC$GXSPRINTF4l@pDECC$GXSPRINTF4G DECC$LSEEK4b#0 DECC$LSEEK4@ DECC$LSEEK4G DECC$READ4b#0 DECC$READ4@ DECC$READ4$GDDECC$GXSPRINTF4,b#0DECC$GXSPRINTF4@@DDECC$GXSPRINTF4pGDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$MEMCMP4b#0 DECC$MEMCMP4@ DECC$MEMCMP4GMAKELONG4b#0MAKELONG4@MAKELONG4G MAKEINT644b#0 MAKEINT644 @ MAKEINT644G(MAKELONG4b#0MAKELONG4$@(MAKELONG4pGDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF4G0 DECC$LSEEK4b#0 DECC$LSEEK4,@0 DECC$LSEEK UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1< >44G\ DECC$READ4<b#0 DECC$READ4X@\ DECC$READ4GDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF4(G@ DECC$MEMCMP40b#0 DECC$MEMCMP4<@@ DECC$MEMCMP4HGp DECC$LSEEK4Tb#0 DECC$LSEEK4l@p DECC$LSEEK4pG DECC$READ4b#0 DECC$READ4@ DECC$READ 4GDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF4G,DECC$GXSPRINTF4 b#0DECC$GXSPRINTF4(@,DECC$GXSPRINTF4`G| DECC$MEMCMP4hb#0 DECC$MEMCMP4x@| DECC$MEMCMP4GDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF4XGxDECC$GXSPRINTF4pb#0DECC$GXSPRINTF4t@xDECC$GXSPRINTF4GDECC$GXSPRINTF4b#0DECC$GXSPRINTF4@DECC$GXSPRINTF4GMAKELONG4b#0MAKELONG4@MAKELONG4GMAKELONG4b#0MAKELONG4 @MAKELONG44GH MAKEINT644<b#0 MAKEINT644D@H MAKEINT644hGx MAKEINT644pb#0 MAKEINT644t@x MAKEINT644G MAKEINT644b#0 MAKEINT644@ MAKEINT644G MAKEINT644b#0 MAKEINT644@ MAKEINT64,GREADBUF,b#READBUF,@READBUF4GMAKEWORD4b#MAKEWORD4@MAKEWORD4G$MAKEWORD4b#MAKEWORD4 @$MAKEWORD4(GTMAKELONG48b#MAKELONG4P@TMAKELONG4XGpMAKELONG4`b#MAKELONG4l@pMAKELONG4pGMAKELONG4xb#MAKELONG4@MAKELONG4GMAKELONG4b#MAKELONG4@MAKELONG4GMAKEWORD4b#MAKEWORD4@MAKEWORD4GMAKEWORD4b#MAKEWORD4@MAKEWORD4G,MAKEWORD4b#MAKEWORD4(@,MAKEWORD40G\MAKEWORD4@b#MAKEWORD4X@\MAKEWORD4`GxMAKEWORD4hb#MAKEWORD4t@xMAKEWORD4|GMAKELONG4b#MAKELONG4@MAKELONG4GMAKELONGx x 4b#MAKELONG4@MAKELONG,GREADBUF,b#pREADBUF,@READBUF4GMAKEWORD4b#pMAKEWORD4@MAKEWORD4G(MAKEWORD4b#pMAKEWORD4$@(MAKEWORD4,GXMAKELONG44b#pMAKELONG4T@XMAKELONG4XGtMAKELONG4`b#pMAKELONG4p@tMAKELONG4xGMAKELONG4b#pMAKELONG4@MAKELONG4GMAKELONG4b#pMAKELONG4@MAKELONG4GMAKEWORD4b#pMAKEWORD4@MAKEWORD4G MAKEWORD4b#pMAKEWORD4@ MAKEWORD4 G MAKEWORD4 b#MAKEWORD4 @ MAKEWORD4 G!MAKEWORD4!b#MAKEWORD4 !@!MAKEWORD4X!Gl! MAKEINT644`!b# MAKEINT644h!@l! MAKEINT644!G! MAKEINT644!b# MAKEINT644!@! MAKEINT644!G! MAKEINT644!b# MAKEINT644!@! MAKEINT644"G("MAKELONG4 "b#MAKELONG4$"@("MAKELONG{ {=c[DDDDDDDDDDD%sEmpty zipfile. @ @ UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<=0 ;7DECC$GA___CTYPE=0  ;=P 7G MAKEINT64MAKEWORDMAKELONG=0( x;=P READBUF=08 p;=` ;=0 ( ;=0  DECC$FREE INFLATE_FREE CHECKDIRFREE_CRC_TABLE=0p H ;=? DECC$GXSPRINTFx;=[%s] p DECC$MEMCMP DECC$READ DECC$LSEEK7END_CENTRAL64_SIG7END_CENTRAL_SIG DO_STRING7END_CENTLOC64_SIG EXTRACT_OR_TEST_FILESFZOFFT=7 REPORTMSG DECC$STAT! SEEK_ZIPF7CENTRAL_HDR_SIG=0 0;=` P# DECC$CLOSE7 LOCAL_HDR_SIGp% DECC$MALLOC'ISWILD) CHECK_FORMAT=  +OPEN_INPUT_FILE =0'error: cannot allocate unzip buffers (=0%unzipsfx: cannot find myself! [%s] P=0!warning [%s]: zipfile is empty x=@1 End-of-central-directory signature not found. =0& caution: zipfile comment truncated =XKerror [%s]: missing %s bytes in zipfile (attempting to process anyway) (=XMerror [%s]: NULL central directory offset (attempting to process anyway) x=XIerror [%s]: start of central directory not found; zipfile corrupt. %s=pefatal error: read failure while seeking for End-of-centdir-64 signature. This zipfile is corrupt. 0=skerror: End-of-centdir-64 signature not where expected (prepended bytes?) (attempting to process anyway) = ==-%$PROCESSDEC C V4.1-001v v= 44= __iscntrl4= b0$ $= 4: := (4= 0 = 04(4=process_zipfiles04= * * * * * * * * * * * * * * * * * * * * * * * * * * * *> * * * * * *  * *> *@ * *<N *; *;O * N,+ R,' R,' R,' R,' R,1 z,  z,  +j , + , , , , , , , , ,1 - - - - - - - - - '- '- .- ,- .- + + + 9- :- ;- + + +' M- M-  f- h- + + +l  - - O- R- V- V- V- + + +Z + + + +@$ $= 44. .=  /4=  = : := 4=  = ( 44=free_G_buffers( 4=d\[ +  +  +  + + ,  , , $ $= , 4: := $ 4=  % %=! do_seekable = " "=rec_find = & &=" find_ecrec64 = ! != H 404= find_ecrecH 4= T/ T/ T/ T/  X/ g/ h/ g/ g/ k/ n/ n/ m/ l/ l/ l/ k/ p/ .c . !. !. #. (.T ,. +. +. *. ). ). ). (. -. =. A. A. E. G. G.3 M. L. L. K. N.8 @. @. @. @. @. * /  / / / / / / / / / / / / / / / / / /6/ /f 0 0   .. . . . . .0 . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / $/  %/  %/ %/ %/ -/ 6/ 6/ :/ :/ >/ >/ ?/ B/ B/ F/ F/ / K/  H$ $= L 4. .=  G 4=  =  . .=  G 4=  = . .=  G 4=  = : := (4= (+ +='process_zip_cmmnt =  = "p44=#process_cdir_file_hdrp4=<4 J0W J0W J0W 0 W0M 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y0k 0 Z0l Y0 Y0 Z0 Z0 Z0 ^0  p0 p0 t0 t0 t0' t0 x0 0$ $= t4. .=  o4=  = : := X4= & &=" get_cdir_ent =  = #x4p4=$process_local_file_hdrx4=*" 0  0  0  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0r UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<5M 0 0 0 0 0 0 0 0 0$ $= |4: := h 4= $ $=  44= getZip64Data 4= 1 1 1  1 1 1  %1 '1 )1 *1 -1 .1 11 113 21 51 <1 1! 1%4$ $=  4. .=   4=  = : := L"4=  =  ww1c%$V1.0AATTYIOV1.029-APR-2009 07:25DEC C V4.1-001h h $ABS$i$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPE(J0ECHO0JTT_GETCH SYS$ASSIGN SYS$DASSGNSYS$QIOW$  $=GkG;F!0@a/aK$Dk#G~G ^G(^0~8GGGB#b="@Zk=E"GB^!&H}"&H G(GbGGG@Zk=0  &HTFH+` G ]"SF ]"޶GB}"5J޶GJ tG(GbGG@Zk} =4G fH!&HH&HBb@ZkG2DGG ](]0}8@#k#8G~(^G0^G8~@ GG#(B0b ="@Zk ) ="4GXB}"!&HG&H q_"(G`bGG@ZkG0`D8 D #JfH =HB4GPb0`D1&J8`D&J@Zk] _D`DGG(]0]8}@P#k4`Gx SYS$ASSIGN4hb# SYS$ASSIGN4t@x SYS$ASSIGN4GSYS$QIOW4b#SYS$QIOW4 @SYS$QIOW4GXSYS$QIOW4Hb#SYS$QIOW4T@XSYS$QIOW4|G SYS$DASSGN4b# SYS$DASSGN4@ SYS$DASSGN4G SYS$ASSIGN4b# SYS$ASSIGN4@ SYS$ASSIGN 4GPSYS$QIOW4@b#SYS$QIOW4L@PSYS$QIOW4pG SYS$DASSGN4xb# SYS$DASSGN4@ SYS$DASSGN, ,= SYS$COMMANDP P=0 ;7DECC$GA___CTYPE=0( ;=P  @ SYS$ASSIGN;` SYS$DASSGNSYS$QIOW=0 0;=@ < <= 4; ;=+#"TTYIODEC C V4.1-001v v= 44= __iscntrl4= o0$ $= 4: := (4= 0 = 044= echo04= J J J J J J K K K K K K K ($ $= 44: := 4=  = 44=tt_getch4=WON &K &K &K &K 8K >K >K0$ $= 4: := 4=  =  ww1e+$V1.0CCUBZ2ERRV1.029-APR-2009 07:25DEC C V4.1-001  $ABS$i0$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$DECC$GA___CTYPEP P=80GkG;F!0@a/aK$DkT T=0 ;7DECC$GA___CTYPE= ==-%$UBZ2ERRDEC C V4.1-001v v= 44= __iscntrl4= ]0$ $= 4: := (4= 0 =  ww1Z9$V1.0??VMSV1.029-APR-2009 07:25DEC C V4.1-001  $ABS$ii$CODE$ $LITERAL$$LINK$$DATA$@$BSS$ $READONLY$ (INVALIDRESPONSE@ASSUMENO HEX_DIGIT CHAR_PROP( JPI_ITM_LSTOPENR_ID DECC$STAT DECC$UMASKDECC$GA_STDERR DECC$GA_STDIN DECC$FFLUSHDECC$GXFPRINTFDECC$GXSPRINTF DECC$FGETSDECC$GA_RMS_NAMDECC$GA_RMS_FABDECC$GA_RMS_RAB DECC$GA_RMS_XABALL DECC$GA_RMS_XABDAT DECC$GA_RMS_XABFHC DECC$GA_RMS_XABKEY DECC$GA_RMS_XABPRO DECC$GA_RMS_XABRDT0 OPENR_ID(JgACC_CBDECC$GA___CTYPE CMA$TIS_ERRNO_GET_ADDR DECC$STRCAT DECC$STRNCMP DECC$STRCHR DECC$STRRCHR DECC$STRLEN DECC$STRCMP DECC$STRCPY DECC$FREE DECC$MALLOC DECC$EXITG0JP@ OPEN_OUTFILE(J&FLUSH0JaCHECK_FOR_NEWERMAKEWORD ZSTRNICMP uN UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<AEXTRACT_IZVMS_BLOCKFNFILTER0J8 CHECK_FORMAT0JXG VMS_MSG_TEXT0Jpd RETURN_VMS(JHMAPATTR(JPLMAPNAME0JVCHECKDIR0JPf SCREENSIZE0J0hgSCREENLINEWRAP0J7 CLOSE_OUTFILE8J<DEFER_DIR_ATTRIBS8Jp>SET_DIREC_ATTRIBSCRC32 SYS$ASSIGN SYS$BINTIM SYS$CLOSE SYS$CONNECT SYS$CREATE SYS$DASSGN SYS$EXTEND SYS$GETJPIW SYS$NUMTIMSYS$OPEN SYS$PARSESYS$PUTSYS$QIOSYS$QIOW SYS$SETDFPROT SYS$SYNCHSYS$WAIT SYS$WRITE DECC$MKDIRLIB$SYS_GETMSG0 INVALIDRESPONSE0 ASSUMENO0 HEX_DIGIT0 CHAR_PROP  RMS_EXT_ACTIVE0 RMS_EXT_ACTIVE  RMS_MBC_ACTIVE0RMS_MBC_ACTIVE  RMS_MBF_ACTIVE0RMS_MBF_ACTIVE0  JPI_ITM_LST8JpLDEST_STRUCT_LEVELOTS$MOVE =GkG;F!0@a/aK$Dk#@{G~^G^G~G G(G0GG#Bb@ZkG`D "(b8 D"4 D@"Q,S`.vJG0UJzKF>7/TGt H;v@JY7K:G7?.PJF>`C`.vSJUJF>9KaK W/ZWKAGW?1?F.{ JTJF>HBtGRR"@8"BGb@1"@ZkG  B0Jb8"2v HJDG@ZkG]G]} (0@#k. JU JF>. SJU JF>`#PG~X^`^h~px޴GG"bGHBc #$!@ZkGB4G4=@Zk8=sHB"b2=JSF8@ZkG C&$8B #$ & á@&"@b _"tG@ZkBp bGGGtG@ZkGG[GG4GG@ZkGxb#P "@TG,G "hB4Gpb $H@ZkU@åu@ $D8B $ @$"@b _"tG@ZkB bGGGtG@ZkGG[GG4GG@ZkTGGGX]`]h}pxݤ#k#~^ ^(~08@޴HPX>`^hG{G#b#_Pb# =@@<5@!U@D &D(F @d`31`B`FG4G@FC3BF5B8FFFXB(¤GGZ bh"&GB@ZkB& "GG@Zk<泱@0"@$57J"&4Jh#9F B0GHf? 0"!7'H;gK H7JaCH&@00?#97&K8KC0PB $& DG@ZkHwHĢ@b#!J"7DH @<h& <&lFA"â7J0"G2v^JF(5J4JB(Y/YK 8""3J0,u@K,6J7J0HH!'HxH7D8D&h&"4WJuFVF(f=@F4Fh& D'?# Z9$KbZ#C:AK6AK(FfByFf4G@Zk?$G! E0 xb#@GE<5 @ 0U @ &Gb#z@ӈItGRE GGb#@G4GBb0.0 P.p".!JR AJ.U J2FC D 3Hv3HTJFF>>@ZkG@""PBGXbtGX1"@Zk"Gb#@$&`"b# @b# 4GB@Gcl El@B?%Hb4G0Jh"@Zk)! D!B %@ $$b!!@)"G _"tG@Zk( PBGXbGGtG@ZkGG[GG4GG@Zkb# 4G@G1F&!R"F ""0"4Ʋ0"  G8& G(G<$ 11 B &(FGG4Gà(F. "UJG+ &1_F@F6@F,+U@B@BG'@B $'@!b & "@(" _"tG@ZkPB XbGGGtG@ZkGG[GG4GG@Zkb#@4GX" $B @!h")GG@Zk,& /. AI,.xAIPBGW JVJF>F>@Zk4!4&-qH@b#I(I 1E(=cDBBR"tF@`@àh"$,$(!'(,$H" J HA )HuJDl'.$h.T JSrJF>uFr>#qGpGY{KZFK[GW@Y`0-4GB0 b`HI!IG  E!= 0.hI4G?%(F >@ZkG)! D0 xb#W@GD<5A)UA  &GHtGRDb#A@GaGb#@G4GBb0,!0.P".(HQ (Jp.T J1DC D 2Hu2HSrJFuF>r>@ZkG@""PBGXbtGX1"@Zk"Gb#@#`"b# ,, !HF HDC ~@b#@4G&4G0- ID!pBxb@ZkG@""PBGXbtG1"@Zk"Gb#b@à`"b# ,- &!HH IDC V@b#@4Gà? @B%hG"Hbǰh"l4GC! $%Dl)!'17J'@ZkDB $@@)"ƠGb _"tG@ZkPB(!XbGGGtG@ZkGG[GG4GG@Zkb#@4G'&'!'1"'G!' "0G"4Dz'G_GG(b@ZkG&vI& U && s"}xb#_@GE<5@!U@  Gb#L@ӈItGREGiG)?"В H29HFsJSF) G"֒J8JFyJG4% ^ B!` "޴e"tG G(GbGG@ZkEG#&v@I(II@ $$ .PJ >)&s"Ғ J49JSFu@JF)@"PB"XbG@1"tG@Zk"Gb#s @4GB4G4b@Zk%$`"%!! %% E!峨E"峨"4G $%8b44AXQTgdUƀx'ca;Wے5tx)h bE+'H52 DFg|q>5)|ta2v6r<ݽ/ E69p_1 k.œ?8 #st~ϳ't@SOtG8Żg \R$8ݭq !j5 uٗPWоr8Ɋ:4׿BV6¤DW, I; IsRf1cYbVkD q7]8Lɹ;45b 8|"vt+L:^PÕ=@_ x#%l̮&#BCI^536m8%dz;W_ޥD%5Q/  ֊agG'›V|'y*/X+-d'J`S0K%21 r07H83B-ңN$y2'Fwէ"R`Fhc#W*3xp[ a VuZ[VCgVB#Mfv~!֣d[%(CP~q?0d%Q;T.PEdݽAUMk@ +3> m ew<_ u79d,55/ȡb88(@A4f*p)cST1I\A~g~X3 ݥB4}=/?/$! P^u#OFYz\gQvoITb^F$舰g{Kyk<L."N)/.m`ț!Ֆ`Nm}a62k% JH#Y>>k<7 I9*˗|Si gJǒ3xL8ISL, N"e$; [bC`UmvOK_fw҂qqt`Z+G,OtpnQ賗ӧB)## Qoxi2ypz#f~&t|Vo!1[9#mHT/6`㇙ѫ(W։Gd^m\Ǜˢ|1{[;È*E\!G/4;#%ٜ) @{vqIz!Xpg)r,x[1Jd(HIdxw,qY˹W19Exkx͕ ݵiyXdKVyw4js /IӱWW p˅U@j486~Ŀ)Y lʁNYe %ٔ"HN/VGOK)Ӎg[nCV}T79=\cvܚ+= {Et5ay+^wݭ$nS Ql)-ut*".L&dgK#Cu/5rz @^IS3w9ScT"le;[ע.e D~kQѴ)ށP7J;ha'_x9ѓдDgCYJ{h%XÙ .4ql&_a]"#L,<aRG5&W:.*b[1`9#/Ξwڣ3@7`N62 ]{( =H!`1&Շmu adw-*멒L%dzk?PDSG $*cTc`z*]&_xI9b.z V _NJJh[U'<-DRYo=Q!fPO00ߠP CYtgוEO[pEPFOʊRM1GhBB:qIM <0#˭O{GiCk i9s3QiV\uH nm U}+m>j8ʄƁLB tcEHO 71<+p^bj_Iտ- w+#G:C_e ;]_@S\oŒ`CoPpSą[,c!У*.r 3x^>ҒZ,JU8I(E/IUGG 967wY4M ~.w]wߏ6V>pyJYUҥ$LQ&r{@qT e>}kY~0rPY=Od0+cr5a]ݳ"ĽĕHPo9+B .W 4ȭ&9T˽>61ź 1ueq!D6Pͅ\~?(_[i/x (8!$/?&+m 5-'c̎u*WR$ bbK7iC]=A@IK쏔Q逇*Ģ@FXtG 0JQ].谨tƺ VHmHL%p/&֑Y KMT|TH ̹.@HW@,9[p\#svߩaCEzU5(mh#XjBF+"Kd(zf"??\P(QME yZkZl9χ?Hek<+| q50L-yBj;ؙNN`@_Kˁ alܤ ?8`՝Z"h?gP v:ݷrEEnȃ3h =&I+vT 3{eK|M(2;p{S;RM)zWJ֧)ZMu .a 恘iefEh@w 5Dz^z^۔U!fd8kmӨT!:zl ֤o,8uqMXW#üZGI[ni?Y}O.'u>l!nI i-hzyWk]a.4d+PғM܁ֻtq[@8XjTfNVΣsZW7 v@]ׯDZsX"Z׺*sƨ}J\ eHlQ+=jG::PP j@#j|Kau]R".92VچbҼi` IxZ9r%إ}} ՘께4}B7ޓ,!jj;f)yL@<''E 2l` <-XsqX o)O]U{ W'Mv?; nIg*"{[ Qk<ѡ8y5NC&q0mz^e $3EU䕧7[a lO|崦I5ddJJIQd+?uOSϩzD&4E}zY0˃ɑm.Ϊ Ln[ ؍o`Lڕwf$A"z3|逵Py~%x9`z{ 8* :x۪eI9TaT>}<5hkh>7(ooC4dJHkDU2c~ڇ`ψeqD>vÖb;F" EQ~v-g:xT^q!pZ@ڕ9iXPݏ`ZMvF{wۧ&u;w8*I?pNB0 nsDzV Nu@@0\i۱dG<6ɘJA8Z, UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<2#$G@Zk"VB6JBHB(1"b6B@8R"qF#GDGx"GGG@Zk#"pTG B(b"@Zk#LP#G]]} 0#kG`#pG~h^p^x~GG"(""BG! @Zk J+6/pJ(/&b,v#Y 6KBXK1GG+6?(?c }G} HBqH4#tF}/.,,P J@HFD><G@ZkrH46/Y8K"2G8?p.0".4GP/tJU J.Z QKuFCT`F qJ{qJAGQ? BWJF(b>%@Zk=GGTGp H a@Bb!.Q!J!>tG@ZkBGbGtGTG@Zk@@"aD B "@ZkGh]Gp]x}#kG#~^ ^(~08@޴HPX>`^h~pxG{Gc GGG 㳡G84G8D#4GG TG#TG $ " xB %$ @!HB $G`GPb _"tG@ZkB!bGGGtG@ZkGG[GG4GG@Zk(B4G 0b@Zk&"8BTGItG@b@ZkQB"@Zk H!A"`- `IXDB@Zk HA "@.RQJQ> e&B""sGbTG@ZkGGG[G4GG@Zk,II+ՉAeA\|Ab$CkGG/GTGTG*4G#4G& &BP"]"pGbtG@ZkGGG[G4GG@ZkG %BH"GÌTGb @ZkGGG[G4GG@ZkG]G ](}08@ݤHPX=`]h}px#kG#G'~^^~ (0޴8@H>P^X~`hpGGGHG &Р  $ &8(vJf. G J 8"."J@FI.) I!AJ . Cj.!("4G J"S jJG Fq CaE .S" B(bGJGCG@Zk4GG@"paE( 3.S" BG(b2JGCG@Zk D@ $ .P"p. HuHT JSrJFuF>r>$-@#`/ KjKM I[zK EjG=z?0("G"qaE( .S" BG(bJGCG@Zk D@ $ .P"p. HuHT JSrJFuF>r>$-@#`/ KjKM I[zK EjG=z? =`"G"qaE .S" BG(bJGCG@ZkG"paE `3.S" B(bG2JGCG@Zk GGh"paE `3.S" B(bG2JGCG@ZkGHG"paE 3.S" BG(b2JGCG@Zk )% %$Ì mE`"!BGbG1"tG@ZkGG[GG4GG@ZksI-II AEn@ xB GPBGRHlPJ!Xb-@!GGtG@Zk`ETG %$"B &a b1"GTG@ZkGG[GG4GG@Zk GGm!<`G.GJ1uB#BG\D< --1 KM IzKLI E= E='/$T!$4- *Jy*JX KI*IG 9E ?*= $t $t"$,',!, JH.F H@ HD hHkhHVJD<F>'4,lJ$.A 3HUJ-DF3<> D$$t#$ @$4-"'T- FK/hFK;I$.J [IX K *E 0Iy0IQ0JG?9F0>'t,$,C fH@HkDf<D<GGGG]+]} (0ݤ8@H=P]X}`hp#k),8".A )H"J0D"_9B.R BJQF!.Q !J2F!-M I E.P JF).P J  FF8/Y 8K0GdG#4G~^^~ (G({Gc  B(b@Zk4G B(b@Zk4G B(b@Zk4G B(b@ZkG4G B(bP.0"p.QJS qJSFC@ZkX"4G1"BB1D B(b@ZkG]]} (0#kG#tG~^^ ~(GG,b@B =c C&=Hb ]@ZkD# c$G hG =tG0p[@ZkG]] }(0#kG#~^^~ (0޴8@HGGGGGG_C+X&",,  6@0B@@@GGG@0HB3!HGp@SB$@GGG@Zk8@@  6Fb#@'C!'XX" b#,,1C1@GG]]} (0ݤ8@HP#kG#TG~-^^ ~(GG#b =HHc #"BbG@Zk# v H0Gb#"@TG%#c"GG ]G B(b^GG (@Zk0Gb#"p@TG 4G#G#0J6J0@#G]] }(0#k#~^^~ (0޴8@HGGGGGG_C+&",,  6@0B@@@GGG@0HB3!HGp@SB$@GGG@Zk8@@  6F.b#|_'C!'",P0@BFC2B `2AJB/XK?b#a_GG]]} (0ݤ8@HP#kG#~^^~޴>^GGGGGH!Š 2v@JC CA 0&A PBCA& f@_"RA@X} "GBtG b &1"X"@ZkGGGG[4GG@ZkTGtG)HxBG  AGG@ZkGE!HxB@AGGG@Zk#j@Ű@ #1/`@ "Gb#6@TGTG峦C'G-"'-II 'I ECPA#@ Gb#&h@ @@#Q@P@ #1`@C ?GxBG"@ZkeGC?GTG)E@} ¤"CǦ DE &$"6vJBtGCb1"@ZkGGG[G4GG@Zk "b# TG1Q@@ӉDGGGG]]}ݤ=]#kG4!JCGG6 }B&3,3HX!D!D-, .s"11 BJXF0F% $.s"11 BJX!D!D .s"11 BJXFF 11 B5!Js"}BC G.JXFF 11 BCs"G0pBG7 B 4G2.J"F 3,5HX!D XF /=3.s"3J!F TGkG#~^^~޴>^GGGGGŠ %D@b?FCc 1@8 FDXDGb#U@ìCc FF&1@4G C.CJXAF@14GJXF.JBCG ]"GGg_ G# `" BXA ''"GB`=!G b1"tG@ZkGG[GG4GG@Zk4GGG$AGGG0!I =Gp@ G0.0J¦!ABGEG(("BG@ZkG4G" Gb#)!G@TGl )G@@(D1 G@巳@@SF )@@ 5H1@u@]"G_@@1@GC b#@=@@@20D?'Hg@G-GIGE@@0D?GTG4ìE$@"$". _F )!"CB i& b2@ G"1"GtG@ZkGG[GG4GG@Zkf@Gb#@&HGBf@(((!@G $AG@ZkHGG]]}ݤ=]#k#G~G^^~ (0GGGGG0" $` G[@ZkG_G]]} (0@#kG`4GBb @ZkG UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<G23hb#0"@hb# . . JQ !JFC "@ H`@.PJ>"0"q Fp FrtHSuJtFrWB"+/ pH(.ypH0bX KWJG(BF+?4G(>@ZkGhb#"@"hb# e,, dH@ H`DC v@TGr0HFtFr#G~G^^ ~(0GGG`b=]c #&GqG %[@Zk0""oG4GG[GG@ZkG_G]] }(0@#kb4GBbc @ZkG4Pb#"5@b# . . JQ !JFC p")@=" qDpDQs4HRTJSFWBQ"`+.(. I BxIW J(bVJFF+>(>4G@ZkGPb#X" @p"cb# , !#,HA /HDC @TGQ0 H_FSFQG#G~G^4G^tG GG0o0![@ZkG"o! [@ZkG]] 0#k#~`^h^p~xG{G#c  A.!." KR PJsKQ0JTFP>3F0>'.5$"$. 5Hx5HW JVJFF>>B$"Z# PKsPK'@.$ .R PJQ0JTFP>3F0># $.$"'.#.$`"J!/W JP JF JqJY8KF>1G8?'@/ 3H$.v3HZ SKTJWGS?F>" 1& P" / .X K?UJ>$ ,$ #'`.".$@"9H.S yJW J3D 4Hz4HVJF>F>'/ J$.sJX KUJG?F>#G""0"pB!ѢGG@Zk$"$֢$"}"yJ8JwuJGݶ uJ$ .'@.0JR PJ2F '`/$@/[ uKZ6UKxGu?WGU? B4G(b@ZkGb#"-@Ӡb# . . JQ !JFC "!@ӐB4Gb@Zkpb#_G`]h]Gp}x#k#G~!'H^ ?"^TG~ (G{#Gc H H##H vH!vJpJ!"HFD2HRH1'JsJ!vJSFC0v H!&HHd0J2AJ#H 2D0D#` B(b$"G@Zk$ v H`G b#`"@"Xc $d"BG! >GGG ~G(b@ZkGB4G7b@Zk`#vH``G b#@"@TGGG]]} (0#kG#4G~^^~ (0޴8@GGGB $   G@Zk &G(b80vJC@CC B@ZkG# G $&`B"BGGG@ZkBCG&H@Zk! $ $G&Cf .VJ>$ (G]]} (0ݤ8@P#kG#TG~^^~޴>^~GGG0B#(""8bG@8ZktG0BG@ZkG'1@!HE@!.! H!JI E@E;GCG6H@#.JF 6/6K%G ."PJJF'1@C_;H1@ @) ,5Q B"0@@H"HD " "(1" G)!>&@ t?= "!5Q@>"@""G0B8bGGG@Zk0## b#¤ $` I8 &C(H '& G&E8?E2g  B=_G"G(!! BȰG@ZkW8D9Ȣ?&@1"H#8 6!4G@&9>K1C88@f$ H TxB@ R#0`B5J@fBT@?&1"ABR"0B@0JBA(@f_'Z# `Ǣ [xB0`B@f5JB)/ ).)KQ )J1G= #_&R"2D!!H=@f$ ]#XxB0`B@f4JBX6GB& #"g"H*HJ!)!I@4G@&1>J 0E5B*= =*` &c(t b##_?&@&1"d"&@*A 0 A R*A""!>H 0 A1@ r@&:3~JvBr@JB 8K  "B ("9GG@Zk+/ H(.jH,"0BX KWJG+?F(>/A.=!,!. 0Is0I"R PJQ0JTFP>3F0>"@Zk4A-4"vHB)!bJUI?& VEU=&)#G&4GF&@Zk G@ ""0B]"8btG1"@Zk"Gb#@4GèF4&"GBG*CIb!HGIGp@I0D"@Zk G@ ""0B]"8btG1"@Zk"Gb#@4GF fR@I!vHFpS@IFӒ`J` 0D; Iw`JFKRK2YJIq@Kp@I6JՐ@IFiʰ@I)UBȦ JB{@I9'K)9J) ;GH`I! 'HD i3Ji[GRJF J!RJRFJ!RJKG4&"޶(#BH#>f"GTG G(GbG@Zk G&`+v H` ""0B]"8btGx1"@Zk"Gb#t@4G$Jf . *, `Iq`IP JA HF1D> < J#fq@G . p@G. jJV JwjJUJFF >>&ْ K@ Ha+KDW`AC <4&H"^!B`)!f"GG >G(GbG@Zk Gf@*v`I @ ""0B]"8btG81"@Zk"Gb#*@4GB44Gb@Zkb#_B $bG4G@ZkG]G]}ݤ=]}#k0 KDDG kG#G~G^G ^(~08@޴HPGGBG0B " }="R"8b@Zk =GP@ !. E& e&Q!J!>@"PB ҠG] 1"XbG@=ZkGGG4GGGPb ""PBG]Gc Xb $ $å G@ZkGGG4GG[G@ZkG] ](}08@ݤHP`#kG#~^^~ (0޴8@H>P^X~`G{Gc $$ `F@BHbGGTG@Zk0B&# ?"R"">D1D24D!D2/0BG8b4G@ZkC0B!!H8b4G0v H@ZkC"# "0GHD FQrBvH1ABD@B1B!Q?B6!J" HJ!!H>ײCF7C7 GD d'{ [0@J35@BcBx\|BbCk0HD"@E@DDD$l?&1"D_'D@?'B&&YG""6GD D& $$pR!&HGҒ@JH?@CDA( G&` BG(b4G@Zk G B "(b4G@Zk C!AaA P^X~`hGGGGG "b#]@G`pB="@ZkGDGP¤ &$!(!$D :G Ƣ4G(BƲ lX!'G4G"4Gb#4@XD  = &&PB 1!XbG?D=GTG@Zk G(& G*D`Gc!jA@G@BGHbGTG@ZkG!k@ CXE 0B8bh""GTGtG@Zkp& G4G 8E0B""8bG4GtG@ZkD'GGoB B ]"`.JFB/KPF 5B0FFr/`J"B[rK`Gr?R"r.SrJr>GG lA "lA"> LO=G.GaJJD5Cz/zKEG.AGTJF>"@G!GFeFGHG(6,JGpvKA6HB0D6<"5.DV.BA5JRVJs6JSFV>" . JGBGKG6,eHk!lAA6H%D6<".UJ>"TGb#@G! Dk!s`c!jAh<&@ & &&Dp BQ!@b@*"G _"tG@ZkPBp!XbGGGtG@ZkG [GGGGGD@Zk!D0@PBGtG f$@Zk`"1b#S@GGb#O@ $ <F@$"cG _"@B@tGb@ZkPBX!XbGGGtG@ZkGG[GGGG@Zk!D!DG_!D? UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<AB!DG GlPB@Zk`AGc bk@ #.s#J?FqB.J F c k@.JvB/K`F#/d#K x'G@%GGGXC/ZCKC?%G #,tGrcKA#H2D#<G_"B .JإF"B/KeFK- KIk!_E_E@P/PKPF *DA ètAF EGcA0FKF$.wDIQ$J7F$> .Jk!_E-LI=GPB G@Zk`AG9#"+C -C1IE(B.JE 9#+C.J#BC-CI`D.dJxF؅F`GGXƠ.PJ>؅Fy/tGaYK[yKaGy?G_R"KB -IER"KB2.2J EE_k, bkHk! DKD`ByA.GwKJDD5 g/[gKwGg? G-GDE)GDrA G# -pGILI E= D("G/HG{JZGK @[GG? .aD.#@JVJqHF> ,HDGDDG-lgHJGI LEG= . Jk!DG/ZGKG?"tGb#@GGb#@GG]]} (0ݤ8@H=P]X}`hp#kG#~^^~޴>^GGGDG1xGxx GX"PB0"GG@ZkX"PBGG@Zk X BG0"% 4}4G@ZksH8="B$J 2=JSF88@Zk8=sH_'b2;JSF8d=`FB`"@ZkGD@5 @tG0D ¤E@BGB &&Hb F&2!@)" _"@ZkB J!bGGGtG@ZkGG[GG4GG@Zk IÐ} _"tGp`Hɐ`Hð`H IA#A]`@!`@B ($ &b0!Ad@)"Hbc @ZkGBGbGtG@ZkGG[GG4GG@Zk !ä}4G#-I#I#=d=]*AA*@P"0.D*Q@A2J*@+F4 p."pJ F/.ŲDJإF.#"$t J91 CFT/$91 CTKEG @,H D-"$IEDG0@BF2@v!J.0@BPJF>d]D RA /X K ?dD"GTG7B 岬)!#0B8b % I%@Zk@BJ!⤸@*"d _"HbtG@Zk BGbGGtG@ZkGG[GG4GG@Zk GB" 4Gd=@Zkd`$4GĢ"B7#/K GG7.G"rHQ0J2F0>@s"ed}% 3-e ]GI3I3= E:[C:@e*B@E%EexG8Dx"'B`@Zkx1@@@ jGG BR" R RR2G2 ?@22 H-#cxJJXI CEX=.GPJ>MXD`@BG tGG@Zk7"G 4,f4I"A4HpK&D4<u",DHD,FHDGHGxBxDXbD@^" bGPBG@ZkX=#PBX"GG@Zk8C0=aK8$8]4G`%BJ!6[IGF8=4@Zk8rHB"b1H2F8d}`F`ݴ@Zk@=G]E"0BP I8bTG IA ),,A)HDH)<@ZkGHPBXbG@Zk8DDI-gHtGJII GE $_= I=è4GX0`=Gp Jq@c.ScJc>G GxG6DJ .$"GWJ> &I 4GCU#u/f:KtG[zKfGz?pBxb@Zk50B8b"GTG@Zk PBXbG@Zk8DGè"4GXɰB$"G@Zkx""BTG 4G!G@ZkB""G@ZkG0BG8b@ZkGPBXb@Zk8DHBG @Zk&B@@ (GBG@ZkGB@Zk$ AGGx"D |! G ¦GB"6"7/Y7K7?@ZkGxDGxc G]]}ݤJ=]#kG #~^^~GGGB0""G@Zk8"GGBTGb $&1"@Zk ("G B!Тh"G@Zk" BGG@ZkBG}_&R"@ZkaH`B="hbh"9K!G4Gl]=@ZkGlB="bH"TG@ZkB4G $tb@Zkh"@B4GHb@ZkP}##P`HXR`HX#v`H``]W(H=CW9H3v J6#K@ TR Jג J/G&JHH@UvHHC;C@ TyBCKCCAGWD#DFD4G_XX]XF@'GyB`G"ûB`4GõBGôB4GðBGø!B4Gá!B G âv@@4Gãv@`GàDB8DG]]}#k#8F~G^GG B] B}B F9BUBqF@QFDTGGDB [SB({?&aF1"1D4GF4GG@ZkG] #k#G~G ^(^0~8@H޴PGGG(BGG0b8#="G@ZkLG=4"XBG!&H}"&H G`bG(GGG@ZkG=4GHBPb!&H&H@Zk] &FHpHH@`#DRJYB*F ]" SFCE G`GGG ]0D(]0}8@HݤP`#kG#~^^ ~(0GGGxb#=$  D"0F$"G_`== DG] C] C }DF8D(0@#k#~^^~ GM{Gb#c "#" G`_G]]} 0#k#~^^ ~(08GGGGb#_N , HU#"q Fp Frt5HSuJtFrWBO7#7$/6 #".GY8KsqJJ"zJTG:G8?e/wJ6."GeKPJaH=@F>y6KC.SFQ>.F>/G?B7"Bc#GZZ#@6$.c.,7$,7 U$J"B{J@ Hb0HE`FJp1"@ZkG]G] }(08@#Nk.P JFr0 HFtFr4xG SYS$GETJPIW4b#X SYS$GETJPIW4@ SYS$GETJPIW4GDECC$GXFPRINTF4b#XDECC$GXFPRINTF4@DECC$GXFPRINTF4GDECC$GXFPRINTF4b#XDECC$GXFPRINTF4@DECC$GXFPORINTF4GOTS$MOVE4@OTS$MOVE4 G DECC$STRLEN4 @ DECC$STRLEN4GSYS$OPEN4b#SYS$OPEN4@SYS$OPEN4#GFNFILTER4$b#FNFILTER4#@PFNFILTER4G(DECC$GXSPRINTF4b#DECC$GXSPRINTF4$@(DECC$GXSPRINTF4pG SYS$CLOSE4xb# SYS$CLOSE4@ SYS$CLOSE4#GFNFILTER 4$b#FNFILTER4#@FNFILTER4p} UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<PQGDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4\GhOTS$MOVE4d@hOTS$MOVE4hGOTS$MOVE4|@OTS$MOVE4 G0 DECC$STRLEN4 ,@0 DECC$STRLEN4R0b#P SYS$CREATER4QLG` SYS$CREATE4Q\@` SYS$CREATE4QG0 SYS$CREATE4Rb#P SYS$CREATE4Q,@0 SYS$CREATE4@GXDECC$GXSPRINTF4Hb#PDECC$GXSPRINTF4T@XDECC$GXSPRINTF4SG SYS$CONNECT4Tb#PS SYS$CONNECT4S@ SYS$CONNECT4#G FNFILTER4$b#PFNFILTER4# @ FNFILTER4 G$ DECC$GXSPRINTF4 b#PDECC$GXSPRINTF4 @$ DECC$GXSPRINTF4#T G FNFILTER4$d b#PFNFILTER4#| T@ FNFILTER4 G DECC$GXSPRINTF4 b#PDECC$GXSPRINTF4 @ DECC$GXSPRINTF4 G OTS$MOVE4 @ OTS$MOVE4  G, DECC$STRLEN4 ( @, DECC$STRLEN4Q G< SYS$CREATE4R b#P SYS$CREATE4QU8 @< SYS$CREATE4Q G SYS$CREATE4R b#P SYS$CREATE4Q @ SYS$CREATE4 G0 DECC$GXSPRINTF4 b#PDECC$GXSPRINTF4, @0 DECC$GXSPRINTF4U G SYS$EXTEND4V b#P SYS$EXTEND4U @ SYS$EXTENVD4 G DECC$GXSPRINTF4 b#PDECC$GXSPRINTF4 @ DECC$GXSPRINTF4S(Gp SYS$CONNECT4T4b#P SYS$CONNECT4Sl@p SYS$CONNECT4#xGFNFILTER4$b#PFNFILTER4#@FNFILTER4GWDECC$GXSPRINTF4b#PDECC$GXSPRINTF4@DECC$GXSPRINTF4#DG`FNFILTER4$Pb#PFNFILTER4#\@`FNFILTER4`GDECC$GXSPRINTF4hb#PDECC$GXSPRINTF4|@DECC$GXSPRINTF4`G|OTS$MOVE4xX@|OTS$MOVE4GOTS$MOVE4@OTS$MOVE4 G DECC$STRLEN4 @ DECC$STRLEN4G  SYS$PARSE4b#P SYS$PARSE4@  SYS$PARSE 48Gl SYS$ASSIGN4Db#P SYS$ASSIGNY4h@l SYS$ASSIGN4 GSYS$QIOW4 b#PSYS$QIOW4 @SYS$QIOW4 GSYS$QIOW4 b#PSYS$QIOW4  @SYS$QIOW4pGDECC$GXSPRINTF4xb#PDECC$GXSPRINTF4@ZDECC$GXSPRINTF4G SYS$DASSGN4b#P SYS$DASSGN4@ SYS$DASSGN4GOTS$MOVE4@OTS$MOVE4GOTS$MOVE4@OTS$MOVE4,GtDECC$GXSPRINTF44b#DECC$GXSPRINTF4p[@tDECC$GXSPRINTF49G SYS$BINTIM4:b# SYS$BINTIM49@ SYS$BINTIM4GOTS$MOVE4@OTS$MOVE4 `G DECC$STRLEN4 @ DECC$STRLEN4QG SYS$CREATE4Rb#  SYS$CREATE4Q\ @ SYS$CREATE4-,GH DECC$STRRCHR4.0b#  DECC$STRRCHR4-D@H DECC$STRRCHR4-HGd DECC$STRRCHR4.Pb#  DECC$STRRCHR4-`@d DECC$STRRCHR4xG DECC$STRCPY4@ DECC$STRCPY4#GFNFILTER]4$b#FNFILTER4#@FNFILTER4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4MG DECC$FFLUSH4Nb# DECC$FFLUSH4M@ DECC$FFLUSH4OG  DECC$FGETS4Pb#^ DECC$FGETS4O@  DECC$FGETS4 $G0 DECC$STRLEN4 ,@0 DECC$STRLEN4 TG\ DECC$STRLEN4 X@\ DECC$STRLEN4xGDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4G<DECC$GXSPRINTF40_b#DECC$GXSPRINTF48@<DECC$GXSPRINTF4lGDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF<;G4EXTRACT_IZVMS_BLOCK<<b#EXTRACT_IZVMS_BLOCK<;0@4EXTRACT_IZVMS_BLOCK<;`GEXTRACT_IZVMS_BLOCK<<hb#Q? UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1</_`EXTRACT_IZVMS_BLOCK<;|@EXTRACT_IZVMS_BLOCK<;G8EXTRACT_IZVMS_BLOCK<< b#EXTRACT_IZVMS_BLOCK<;4@8EXTRACT_IZVMS_BLOCK<;GEXTRACT_IZVMS_BLOCK<<b#EXTRACT_IZVMS_BLOCK <;@EXTRACT_IZVMS_BLOCK<; G< EXTRACTa_IZVMS_BLOCK<< b#EXTRACT_IZVMS_BLOCK<;8 @< EXTRACT_IZVMS_BLOCK<;l G EXTRACT_IZVMS_BLOCK<<p b#EXTRACT_IZVMS_BLOCK<; @ EXTRACT_IZVMS_BLOCK<; G EXTRACT_IZVMS_BLOCK<< b#EXTRACT_IZVMS_BLOCK<; @ EXTRACT_IZVMS_BLOCK4b!G!DECC$GXSPRINTF4!b#DECC$GXSPRINTF4!@!DECC$GXSPRINTF,=`!G!CRC32,>t!b#CRC32,=!@!CRC324!G!DECC$GXSPRINTF4!b#DECC$GXSPRINTF4!@!DECC$GXSPRINTF4X"Gl"OTS$MOVE4h"c@l"OTS$MOVE45%G% DECC$FREE46%b#  DECC$FREE45%@% DECC$FREE45%G% DECC$FREE46%b#  DECC$FREE45%@% DECC$FREE45%G& DECC$FREE46%b#  DECC$FREE45&@& DECC$FREE45d&G& DECC$FREE46&b#  DECC$FREE45&@& DECC$FREE450&GX& DECC$FREE464&b#  DECC$FREE45T&@X& DECC$FREE45&G& DECC$FREE46&b#  DECC$FREE45&@& DECC$FREE,=&G'CRC32e,>&b#CRC32,=&@'CRC324'G(OTS$MOVE4(@(OTS$MOVE4C)G) SYS$SYNCH4D)b#` SYS$SYNCH4C)@) SYS$SYNCH,Eh)G)SYS$QIO,Fl)b#`SYS$QIO,E)@)SYS$QIO4*Gf*OTS$MOVE4*@*OTS$MOVE4,G<,DECC$GXSPRINTF4$,b#DECC$GXSPRINTF48,@<,DECC$GXSPRINTF4l,G,OTS$MOVE4,@,OTS$MOVE4,G,OTS$MOVE4,@,OTS$MOVE4`-Gp-OTS$MOVE4gl-@p-OTS$MOVE4-G-DECC$GXSPRINTF4-b#DECC$GXSPRINTF4-@-DECC$GXSPRINTF41G 1DECC$GXSPRINTF41b#DECC$GXSPRINTF41@ 1DECC$GXSPRINTF41G1OTS$MOVE41@1OTS$MOVE42G(3DECC$GXSPRINThF43b#DECC$GXSPRINTF4$3@(3DECC$GXSPRINTF4p3G3OTS$MOVE43@3OTS$MOVE4Gp4G4SYS$WAIT4Ht4b#SYS$WAIT4G4@4SYS$WAIT4J 5b# SYS$WRITE 4I05GH5 SYS$WRITE4ID5@H5i SYS$WRITE4Gh6G|6SYS$WAIT4Hl6b#@SYS$WAIT4Gx6@|6SYS$WAIT,K7G,7SYS$PUT,L 7b#@SYS$PUT,K(7@,7SYS$PUT4 :G$:OTS$MOVE4 :@$:OTS$MOVE4G:G:SYS$WAIT4H:b#SYSj$WAIT4G:@:SYS$WAIT4:G: SYS$CLOSE4:b# SYS$CLOSE4:@: SYS$CLOSE4C;G; SYS$SYNCH4D;b#0 SYS$SYNCH4C;@; SYS$SYNCH4 (<Gd<SYS$QIOW4 \<b#0SYS$QIOW4 `<@kd<SYS$QIOW4h<G|< SYS$DASSGN4t<b#0 SYS$DASSGN4x<@|< SYS$DASSGN4  =G$= DECC$STRLEN4  =@$= DECC$STRLEN4B,=b# DECC$MALLOC4AD=GL= DECC$MALLOC4AH=@L= DECC$MALLOC4h=G=OTS$MOVE4l=@=OTS$MOVE4=G= DECC$STRCPY4=@= DECC$STRCPY4?P>Gl> DECC$STRCAT4@`>b#p DECC$STRCAT4?h>@l> DECC$STRCAT4 t>G> DECC$STRLEN4 |>@> DECC$STRLEN4?G?DECC$GXSPRINTF4?b#pDECC$GXSPRINTmF4?@?DECC$GXSPRINTF4 @G0@OTS$MOVE4,@@0@OTS$MOVE4hBGBOTS$MOVE4B@BOTS$MOVE4 BGB DECC$STRLEN4 B@B DECC$STRLEN4BGHC SYS$PARSE4Cb#p SYS$PARSE4DC@HCn SYS$PARSE4XCGpCDECC$GXSPRINTF4`Cb#pDECC$GXSPRINTF4lC@pCDECC$GXSPRINTF4CGC SYS$ASSIGN4Cb#p SYS$ASSIGN4C@C SYS$ASSIGN4CGCDECC$GXSPRINTF4Cb#pDECC$GXSPRINTF4C@CDECC$GXSPRINTF4 E-ah UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1< noGTESYS$QIOW4 HEb#pSYS$QIOW4 PE@TESYS$QIOW4pEGEDECC$GXSPRINTF4xEb#pDECC$GXSPRINTF4E@EDECC$GXSPRINTF4 @FG|FSYS$QIOW4 pFb#pSYS$QIOW4 xF@|FSYS$QIOW4FGFDECC$GXSPRINTF4pFb#pDECC$GXSPRINTF4F@FDECC$GXSPRINTF4FGF SYS$DASSGN4Fb#p SYS$DASSGN4F@F SYS$DASSGN45FGF DECC$FREE46Fb#p DECC$FREE45F@F DECC$FREE47GGGLIB$SYS_GETMSG 48Gb#PLIBq$SYS_GETMSG47G@GLIB$SYS_GETMSG4HG,HDECC$GXSPRINTF4 Hb#PDECC$GXSPRINTF4(H@,HDECC$GXSPRINTF4PHGHDECC$GXSPRINTF4dHb#PDECC$GXSPRINTF4|H@HDECC$GXSPRINTF434IGPI SYS$SETDFPROT448Ib# SYS$SETDFPROT43LI@rPI SYS$SETDFPROT41IGI DECC$UMASK42Ib# DECC$UMASK41I@I DECC$UMASK41IGI DECC$UMASK42Ib# DECC$UMASK41I@I DECC$UMASK4/(KG Do same for all files): =8)[ Cannot create (QIO) output file %s ] =XOcreate_qio_output: sys$assign failed. create_qio_output: sys$parse failed. 0=0#[ Cannot allocate space for %s ] X=H9[ File %s has illegal record format to put to screen ] =8,Cannot create ($connect) output file: %s =8-[ Cannot create ($create) output file %s ] = Error: zipfile is in variable-length record format. Please run "bilf l %s" to convert the zipfile to stream-LF record format. (BILF is available at various VMS archives.)  =( sys$open() error:  =4, error: cannot open zipfile [ %s ].  =0 ;7DECC$GA___CTYPE  SYS$GETJPIWDECC$GXFPRINTF7DECC$GA_STDERRX;7RMS_MBC_ACTIVE=0 0;=@< ;7RMS_EXT_ACTIVE7RMS_MBF_ACTIVEp; ;G Te5=0 g;=@< =0 0e;=`|  SYS$ASSIGN; SYS$DASSGN SYS$QIOW=0 hg;=0 =0 f;=@Q UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1< =0 d;=  DECC$EXIT DECC$STRLEN=?zG{ SYS$NUMTIM DECC$STRCMP7DECC$GA_RMS_XABDAT DECC$STAT=0 a;= 8OTS$MOVE7DECC$GA_RMS_FAB=.8=.;@ SYS$CLOSE=@`SYS$OPEN=0 L; SYS$PARSE7DECC$GA_RMS_NAMDECC$GXSPRINTF= SYS$DISK:[] DECC$STRCPY=0 V;=  ;! DECC$MKDIR#FNFILTER %CMA$TIS_ERRNO_GET_ADDRG e5@' ZSTRNICMP=0 L;=p  ; ;) DECC$STRNCMP+ DECC$STRCHR- DECC$STRRCHR==..=0 H;=p /MAKEWORD1 DECC$UMASK3 SYS$SETDFPROT=0 XG;=0 %;=0 5 DECC$FREE=0 hG;=(` %s[ %s ] 7LIB$SYS_GETMSG=0 ;=0 9 SYS$BINTIM7DECC$GA_RMS_XABRDT=VDAT=VPRO=VMSV=VFHC=VFAB=VKEY7DECC$GA_RMS_XABALL=0 ;=? ;EXTRACT_IZVMS_BLOCK7DECC$GA_RMS_XABKEY=IM@=VALLH7DECC$GA_RMS_XABPRO=CRC327DECC$GA_RMS_XABFHC=VRDTp=0 >;=( .DIR;1]? DECC$STRCAT=%.*s%c%.*s%s=0 <;=P A DECC$MALLOC=0 7;=0 =0 &;=0 =0  ;;=0 C SYS$SYNCH=0 (;=0 ESYS$QIO=0 );=P =0` 8;= GSYS$WAITG e5=0 3;=@< I SYS$WRITE=0 X';=P =0 5;=@ KSYS$PUT= x=0 p.;=0 /; = =0 x+;= =0 ;= 7 DECC$GA_STDINM DECC$FFLUSHO DECC$FGETS;;=0h ;=< Q SYS$CREATE=0 @;=p  ;;;S SYS$CONNECT;7DECC$GA_RMS_RAB0;U SYS$EXTEND;=0X 8;=  ==T4=4= 4=PDp= 46664444 4(40484@4H4P4X4=(  6= 64= ` `=4= `4A A=)!error: invalid response [%.1s] \ \=D< (EOF or read error, treating as "[N]o extract (all)" ...) 0 0 =0123456789ABCDEF   =      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  =4@4=4D4=4H4= $ $ = 9 9=)! VMSDEC C V4.1-001v v= 44= __iscntrl4= l0$ $= 4: := (4= 0x x= 04X4=get_rms_defaults04=  [ [ [ [ [ [ [ [ [ [  [ [ [ [ [ [ [ [ \ \ \ \ \( [$ $= 44: := 4=  = 844= check_format84= \  \  \   \  \  !\ "\ $\ ,\ /\ /\0$ $= <4: := 4= d d= @4P4= open_outfile@4= i\ i\ m\r \ \ \ \ \  \ \ \ \ \ \ \ ] ] ] ] ] ] ] ]  !] "] "] '] -] -] ,] G] F] F] H] G] F] F] b]  q] q] r] v] v\  )` ] ] ] v\& ] ] ] v\ \ \ \ \+ ] v\> v\T ] ] ] ] ] ] ] ] ] ] ]_ UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<]s ] ] ] ] ^ ^ ^ ^ '^ )` .^ :^ B^ K^ T^ U^ T^ T^ W^  Y^ \ \ \ \ \  {^ r^  r^  w^ w^ ^J $ ^ ^ ^ ^ \m \l \ \ \ \ \ \ \e  ^ ^ ^  ^  ^ ^ ^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ "_ "_5 L_ J_ [_ J_ [_ K_ [_ L_  \_ L_ [_ L_ [_  [_ [_  K_ i_ j_ l_ s_ q_ q_  _ _ _  _  _ \M \O \ \ \ \L \ \Q \I \K \M z\$ $= x4. .=  @4= . .=  ?4=  = . .=  ?4=  = . .=  ?4=  =  = . .=  @4= . .=  ?4=  = . .=  ?4=  = . .=  ?4=  = . .=  ?4=  =  = . .=  @4= . .=  @4= . .=  ?4=  =  = . .=  ?4=  = . .=  ?4=  = . .=  ?4=  =  = : := 4= @' '=# init_buf_ring = ! != &44='set_default_datetime_XABs4= \$ \$ \, \ \ \ \ \ \ \ \ \ \ \ \# \ \ $ $= 4: := 4= @/ /=+#"create_default_output = + +='create_rms_output = + +='create_qio_output = T T= #4 4=$replace_rms_newversion4= _ _ _ _ _ _  _ _  _ ` _ ` ` `U ` ` ` `  ` ` `,$ $= 4. .=  4=  = : := 4= / /=+#"replace_rms_overwrite = " "= 44= replace4= 2` 2` <` A` Q` Q` M` f` x`5  ~` ` Y` Y`,H$ $= 4: := 4= H = 44=find_vms_attrs4=:2 ` ` ` ` ` `  `  ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `  a a a a a 'a %a =a ?a ?a ?a @a "a" "a$ Ka ` Oa Qa \a ^a aa ca caH ` > $ $= 4.  .=  4=  = . .=  4= . .=  4=  =  = : := $4=  = %4 4= free_up%4=IA@ oa oa oa |a xa a$$ $= %4. .=  %4=  = : := &4=   = &44= flush&4=;32 a a a a a@$ $= &4: := 4'4=  = X'4 4= _flush_blocksX'4= a a a a a a a a a a a a a8$ $= '4. .=  W'4=  = : := (4= h = (4`4=WriteQIO(4=med a a a a a a b b$ $= (4: := )4= 0 = )44= _flush_qio)4= b b b b "b $b *b b b 1b 1b 1b 8b8$ $= 0*4. .=  )4=  = . .=  )4=  = : := @+4= ` `= x+44= _flush_varlenx+4= b b  b b b b b b b bn b b b  b b c c c c@$ $= +4. .=  w+4=b UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<   = . .=  w+4=  = : := 0.4=  = p.4x4=find_eolt.4=OGF Gc Dc Ic Ic Ic Ic Ic$ $= p.4: := /4= PC C= /44= _flush_stream/4= _c _c  hc  sc sc  c c c c  c c c c c c c c c c c c  c  c  c c c c c c c  c c cG c c c c c c c<$ $= 04. .=  /4=  = . .=  /4= . .=  /4= . .=  /4=  =  =  = . .=  /4=  = . .=  /4=  = : := 34=  = 344= WriteBuffer34= d d d d d d 0 d d d !d %d %d %d! *d $d$ $= 34: := <44=  = 54@4= WriteRecord54= 6d 6d 6d 6d =d =d ?d( Dd Dd Gd Md Md Od& Rd Rd Ld$ $= 54: := <64=  = 744= close_outfile74=]UT d d d d d d d d d$ $= 74: := 74= @ @= 844= _close_rms84= d d *e 1e 1e 6e :e :e e Ce Ce DeL De De De Ee Je Me  $ $= 484: :=  ;4= = ==  ;404= _close_qio ;4= ge ge ge ge ge ge  ke  te ke re re qe me pe oe oeJ oe me  oe ye> e($ $= $;4: := <4= * *=&vms_path_fixdown =  = <44=defer_dir_attribs<4=won f  f  ,f -f 6f 7f :f =f ?f0$ $= <4: := =4= 8 = >4p4=set_direc_attribs>4=$ Lf Lf Lf Xf er e e e e e f f f_ f f fS fX ef ef ef ff ff nf lf nf nf tf  f f f f f f f f f f f f f f f f f f f f f f f  f f f f f f f f f f f f g f f g g g g g g g $g* $g $g %g $g ;g $g $g %g %g $g $g) Og Og Wg eg  |g |g |g  g g g@ }g$ $=  >4. .=   >4=  = . .=  >4=  = : := G4= P y y= XG44= vms_msg_textXG4= 0i$ $= XG4: := \G4= ' '=# vms_msg_fetch =  = hG4P4= vms_msghG4=xw @i 9i 9i 9i( 9i 9i 9i 9i 6i ;i ;i ;i0$ $= lG4. .=  gG4=  = : := H4= hM M= H44= mapattrH4= i  i i i i i i i i i i i i i i i i i i i i i i j j j# j j j j j j j -j -j -j# Gj Pj PjW Rj Pj Pj Pj Sj Pj Sj  gj@$ $=  I4. .=  H4= . .=  H4=  =  = : := tL4= ~ ~= L4p4=dest_struct_levelL4= j$ $= L4: := L4= + +='adj_dir_name_ods2 = + +='adj_dir_name_ods5 = , ,=( adj_file_name_ods2 = , ,=( adj_file_name_ods5 =  = L4P4= mapnameL4=>6 k k k  k k k k l l l 'l j jM j~: j_/S.G /} z i4yژ*V Z@XE b;&,sD6._3s?Z-=?Xy>,`%oZ`L kn "7,MGsdUSUo@CslDHeSZ:"P92F^>Tr⼚X{)ħ{Wk$)>Nr^o ?Fx-zؑ_kQ{1dF.El|L)^S?oMQ˳4u I==1{$V.𥷵"~@W6U'k:n8j3!ON?Q0u=lD߬n" MbSݞ/mK:ꢥLAZchcK+9gt 6(8q{(g\)3n8abc4VUVC\iZbu=qILX'8$[|IwBh23 !-'J_]p GhN gS):ZkEi?S.>*7VI-K&@2Fv.tAEHok5 0qgDP9O~c(>JO[ɖVׇ^ȿ3PfM~ o1j}YFYø&RUxPNa! [B+1M NV w`(/ǮGo@*4FEEEC hY6ɝP@@hu{d+ul"U"z<bL L0ACDL-7E`uU1'גiOǬ9ɑ ѡ1+%@|35`ait<! !2"Õ341Dw %dq.e&*'_J$ ͽpty%NsbWj ի 3ϭo a!ǨknUlqJ%f / D@~{1@#A$`p,*7E`+g<>`}j6a+& ihRTzbAKm9E5|Fl?$M`t^<-PKFl$A^wZ_N ZHe=W(Ҝ>uNtE|1DqyW41ȁM8Hnd(QRUa3Xi8,6e @ـGgHKRZC|T7wb!_$6 F*weB6w#N7q8O$"|p,f'b!B^Y-H#C0Gis05 ka-Q{|BTN@1 w͘.` R]=]bFImPOr+\U8t 2M'CS!XJH%V_P`#Q]M EV^ŅeRU.[Aail\T7agqPܸs pëy=#=fhq qz@~p(t'A1 wI G֨) EՂ*Tmwx=dsb6aCezzE1JÂBAd4slDi! *EN}R6l[rXrDAҊܲ? >!SfhZMNrLK[#o.$.,B OqZ4suXCG@!X[sxEfm^L宊'@w:<| ('Ghm"SЇ#RJ g,:@\pΓ|$7HPCg+sv82Oմ 4c܃1ŬiJyP"be@MVփ)&9T [&S6<cSv=[L Lw{Y| b%NL^p'W!kAT!t`)P.Meh/}ߝh?ENڣ]shi\ճDa䜮}w*-d)c"q fޛ#s-VyBojCN$PsnȦfa.~k N%ֲuvYqnđtC:%1ݪyY6YC(8b <.vM$ ۏ1Y/ ;#}NTmA[a'U><ZZB4YצQ[y# nU~'uݓ/ -q#0-w06_]YUub4pP/P) -4!Gl"1' Z@?_/uFi)E^B1a^m{tHGEv3DwCEShKŭbHhwX*4}[Hgb} PP,T g"F)#n;\,ݛߚF-Ktbٟ͌8j =D#{4IHhP̪Ԩ"_ [t,Sw9T{ .[LI"w a'!5u&>FoR#/ R|4u,Y#-2\춾TR8.>oe$푝4$Wѓikk4hvHkirr &q )0Uu G5+]#"cC.)|E2keTͼ˷05h\RfF8CTy 94 lv n4TUy}Qie"{x\yq/b^[jKvR:ʝ܀SpMH/p&ؤmˆL6ci[+o6tx?%fY8UMyE]+|& BH 3R{ nIJJ;[ Dx:M/@[i8mp'2])qy?COPa:rX!0I lDy6a&hH ;:HS[+e >CnX0&N[ Z _AkI{:8E>]'?&$Ruͥ&M?JdTڒ` ŀGVP-]<ޝ~*j%?roB1m?ܐ`evR #o!!da\# @^% O/mZ<|:UZɍRcllɎN/R~{.GNd_I_`( c6c0jĜ|N?n GR_-Gԍ1g=)_K>/o\qLdG`d n-oMzš.߶@:RCv>$;n]ZP8j%v])3x_2868<5e(A.O:8q4ZwC:<;/E>I!8ŭ:k=o߃rJL}la"EHbe 5aJknʴVbҴ …Vּj4EPhf$UN|cEO?;:|XːOG/LUI`R3t v.3$B0w7=|W̚Yzn[HȜsەJ)W:,j$[$9^ꅬJ_Xm%1&͎yYȵ1 1?B;T҉ `5cL}d zPϽf~aIE6 3,Ǘi늳П+ЇLj8Jq,fU7y[L|MDp"")!AfZҘϋԫ~<'Rl3h4NJE2 JN<--MRo4cKIL=B׻*{Db$2TC!:GI|B,)%8<=<#֎۔?%iwZWK CT4u&%E+%j0|FP:Uc-2TC }7\"gzs|h9 ~z3l={Oro RH=]`-R-󽍀u+S$;T滟ji\vӧk6m48œ/t߱L$G^Br1O{eeHt#Y \߄n! *IU.mщwOv2ԁW$z}\5H8?uBsH[EQV,n Ey S2}ߊ{XzU+j:|4x@dyV'ˆ_FbM>N IICv@jUOpS" ,y} uC bMAh]оSN+o~Cd `|wݐ_!`F9 ՃM/81pe5x`q\D]9)O1Ta5OEjB0ɤ 1 XtT/\o[f-kY#rπ3V,Y&^Y͙Z/?8ś|Ma1V/,+jkhOꢊ=ٹ5_i}k1ʾf}|JD%{iEOMCS"wZ'YRsbD#.1jo d?3AzKD }QJxrc|ګ6*l0 e& E݁ vmFkˌSiKGZ(f Ro ;#0F Ԃ".  uK9+TL~9k>B2\1"X3S!(ܲ:炅0Tc+My!h!nzW7*&"x6r|ȋLRkX)q'DG'+ׇhiy#qK^# NFnI˻[YְG-n>?䎐pl_ p8+6?-iYU//Vl-*x>o%({Sul=w6Q܇|lPYc j,G'#B~!O:nfg>wZw;8?>#% I ";#䯰2T?I@wrq)̞4z|n5 q>8ZvMs筢,z<6yTS@6.gh ƛE:yoqh]@J4J 0ϧĞ y!.`T"cyv ـ~6(Nh xk 5p:X 2MGMG}ΤD -KZN6ZH4W[/)u.W6u#l8d?vl9}Wf*uAӮm22L Z~9 AMa:[*鱁+NɉEkQA\t5p e)&!GvS5B5Bѐ/Dg/.yZx)=-?F۝.X o4,EK06p aUzq wD6ŔDw}r3 vs9?=)j :†yG FѠǁtO,ڏy/ev0'Z~fQd 6c'> m:B0/.߄y #9%`kfzalSDk_мeRcH}CԀ_”l٤>6taM[g[mY"ó!LRԇ?' Tx/ئ:0sԼ -2栓URi] UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<l j  j   j9 j j j k k k k k j j l% 9l 9l :l :l =l Bl Bl Il Jl Il Jl k8 k  @k Hk Ok @k  dk  k k k k  k k k k k k& k k%H$ $= L4. .=  L4=  = . .=  L4=  = . .=  L4=  = . .=  L4=  = . .=  L4=  = : := @V4=   = V44=checkdirV4= hl hl'  l l l l  l  l l  l  l l l l l l l l l l l l l l l l l l l l l l l l l  l m m m m m m m m m "m 'm )m .m ,m ,m 0m m @m Am Jm Jm Jm Jm Lm Pm Um Vm Ym Ym bm dm bm  dm  gm  gm hm  im  rm sm tm um sm sm um m zm  m m m m m m m m m  m  m m m m m m m  m m m m  m m@$ $= V4. .=  V4= . .=  V4=  =  = . .=  V4=  = . .=  V4=  = : := pa4= (  = a44=check_for_newera4=/' m m m  n n n n n n n! n' 0n 9n 0n  9n 0n  0n 0n  1n 3n 0n  >= g44= acc_cbg4= o o o o o o o o o o o o oQ p p p p p p p( o($ $= h4: := di4=  =  +ww1 pa V1.0AAUNZIPV1.029-APR-2009 07:23DEC C V4.1-001  $ABS$i$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$D MASK_BITS VERSIONDATEH CENTSIGMSG@SEEKMSG (FILENAMENOTMATCHED(0EXCLFILENAMENOTMATCHED REPORTMSGDECC$GXSPRINTF DECC$ISATTYDECC$GA___CTYPE DECC$STRNCMP DECC$STRCMP DECC$SIGNAL GLOBALSCTORG(JMAIN(JUNZIP(J`UZ_OPTS(J`USAGE PROCESS_ZIPFILESHANDLER RETURN_VMS0  MASK_BITSFNAMES0  VERSIONDATE0 CENTSIGMSG( SEEKMSG8 FILENAMENOTMATCHED8 EXCLFILENAMENOTMATCHED0 REPORTMSG(J`__MAIN DECC$MAIN DECC$EXIT =#4G~^ ^(GG#0B  = > 8b@Zk =b# @ BG(b4G@ZkG] ](0#kG#G~^^ ~(GGG8B@b=@Zk=Gxb#@(BG0b4G@ZkG]4G] }(0#kG#TG~^^ ~(08޴@GG TG BG=G(b0"@ZkG BTG(b0"@ZkG BTG(b0"@ZkTG BTG(b0"@ZkG BTG(b0"@ZktG BTG(b0"@Zk="b#b #$ & "@ == ?@Q"F #㳋 㳸#d`G@""TGtG7PBXb@Zk2$=1"#@ Gc3@cJpFtBW`Jc 䳼5@JpFBWJ/K$ @ #9@Dd#!aC =#HN@pDc @WH  B L(pB""8@Zkâ 4GD㳸 G䳸#9@#Kp D!CW H#=" }0BJp@FBWJ0pB %G4G G &" C'b BÕh1"GTG@ZkGG[GG"G@ZkTG&G4G8ð㳸4G| UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<# #& C&Ñ ?@"TG0D Bb1"G@ZkGG[GG"G@Zk`BGhb@ZkGG]G] }(08ݤ@P#k#4G~^^~ (0޴8@H>P^XGGG#àGGGG &1@G@r.rJR"eF`.r"R"SJgJ4eBBO\BPCkG0Bb 4BF G u0`B uGt3pB`FtG u`0B bGG4GGGb3G"C'"Iu.uJ `Mg &1@i.JeF/`.Jr.R"rJ.R"JGb5BFGt0`BtGGL bL3 3È4EG(}G(5yGb04BF0Gp0u0`B0ukGGteGbt3aGG4[G44WGb85BF8GN8t0`B8tIG"G<u3tB`F<u>"<t4uB<t7G<u3pB`F<uG.<t0`B<t)GG@#Gb@3GGDGD5GbGLGL4 GG05Gb0GGXGX5G4TBXF."Jg.JeFG`4BF`G¦`v0`B`vGGdGd5GbhӢ6BFhӲGh0BhGbGlG¦l6Gp5BFpGbpӢ0BpӲG4GbTG"B &b &Ô h1"G@ZkGG[GG"G@ZkTG $"B $Ơ b1"GTG@ZkGG[GG"G@ZkTGG %"B i$c bh1"GTG@ZkGG[GG"G@ZkTGG $"B $å bh1"GTG@ZkGG[GG"G@ZkTGG/¤?!B" ($# &"Á bG>GGGGG@ZkG $[GGGGG@ZkBH&"B"bGbG@ZkGG[GGGG@Zk" 4)D L)A?@B?BESF F@ &" &B Gb1"TG@ZkGG[GG"G@Zk4G TG! )TG!   ) @4i &8I &"U!B_B01"SF@BGbTG@ZkGG[GG"G@Zk8tI4G4G@ B(b@ZktðG䰠b#9@*< I% )$J"!"B!bGGGGG@ZkGC[GGGG@ZkID hT @E3@ GðGG]]} (0ݤ8@H=P]X`#k#G~G^G^G~ (0޴8@GG# b(¤G0B@" $8b &ÀX GG =@ZkG $[CGGGG@ZkH&"0BPB"ÄG8bGHbTG@ZkGC[GGGG@ZkGE]]G} (0ݤ8@P#k4$GH DECC$MAIN4<b#` DECC$MAIN4D@H DECC$MAIN4XGl DECC$EXIT4`b#` DECC$EXIT4h@l DECC$EXIT4G GLOBALSCTOR4b# GLOBALSCTOR4@ GLOBALSCTOR4 G RETURN_VMS4b# RETURN_VMS4 @ RETURN_VMS4@G\ DECC$SIGNAL4Pb# DECC$SIGNAL4X@\ DECC$SIGNAL4`Gt DECC$SIGNAL4hb# DECC$SIGNAL4p@t DECC$SIGNAL4xG DECC$SIGNAL4b# DECC$SIGNAL4@ DECC$SIGNAL4G DECC$SIGNAL4b# DECC$SIGNAL4@ DECC$SIGNAL4G DECC$SIGNAL4b# DECC$SIGNAL4@ DECC$SIGNAL4G DECC$SIGNAL4b# DECC$SIGNAL4@ DECC$SIGNAL4TGd DECC$STRNCMP4\b# DECC$STRNCMP4`@d DECC$STRNCMP4 4GH DECC$STRCMP4 D@H DECC$STRCMP4b#DECC$GXSPRINTF4GDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF< GPROCESS_ZIPFILES< b#PROCESS_ZIPFILES< @PROCESS_ZIPFILES4 G DECC$GXSPRINTF4 b#`DECC$GXSPRINTF4 @ DECC$GXSPRINTF4P Gt DECC$GXSPRINTF4` b#`DECC$GXSPRINTF4p @t DECC$GXSPRINTF4 G DECC$GXSPRINTF4 b#`DECC$GXSPRINTF4 @ DECC$GXSPRINTF4 G$ DECC$GXSPRINTF4 b#`DECC$GXSPRINTF4 @$ DECC$GXSPRINTF4` G DECC$GXSPRINTF4 b#`DECC$GXSPRINTF4 @ DECC$GXSPRINTF4 G DECC$GXSPRINTF4 b#`DECC$GXSPRINTF4 @ DECC$GXSPRINTF4` G DECC$GXSPRINTF4p b#`DECC$GXSPRINTF4| @ DECC$GXSPRINTF4GDECC$GXSPRINTF4b#`DECC$GXSPRINTF4@DECC$GXSPRINTF4PG\ DECC$ISATTY4Tb#` DECC$ISATTY4X@\ DECC$ISATTY4GDECC$GXSPRINTF4b#`DECC$GXSPRINTF4@DECC$GXSPRINTF< <4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4G,DECC$GXSPRINTF4b#DECC$GXSPRINTF4(@,DECC$GXSPRINTF =XNX. (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.)P=@8p)d UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<U`(HPx0h8PD D=0 `;=P| 7G8;DECC$GXSPRINTF=H;=DMX;=0 ;=`  DECC$ISATTY=0 ;=P|  DECC$SIGNAL7HANDLER7FNAMES=-d DECC$STRNCMP PROCESS_ZIPFILES DECC$STRCMP=-x=0 ;=0 @ RETURN_VMS GLOBALSCTOR=0 ;=0  DECC$EXIT DECC$MAINu u=0&caution: not extracting; -d ignored (=qerror: -d option used more than once (only one exdir allowed) caution: both -n and -o specified; ignoring -o =PCerror: must specify directory to which to extract with -d option =XMerror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid 8=PBUnZipSFX %d.%d%d%s of %s, by Info-ZIP (http://www.info-zip.org). =QIValid options are -tfupcz and -d ; modifiers are -abjnoqCL%sV%s. Sx x6=H@??. .=20 April 2009g g =OGerror: expected central file header signature not found (file #%lu). \ \ =D<error [%s]: attempt to seek before beginning of zipfile %sD D =,$caution: filename not matched: %s M M =5-caution: excluded filename not matched: %s  = (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) ; ;=+#"UNZIPDEC C V4.1-001? ?= 4=TRANSFER$BREAK$GO## #= __iscntrl =  = 44= main4=,$# u- u- u-$$ $= 4: := 4=  = 44= unzip4=e] -j -jG - - . . . . XH .H .L 7/ G/ G/ L/ `/ a/ @/) k/ k/ n/ q/ u/T @/7 @/ d/ e/ ~/ ~/ ~/,$ $=  4. .=  4= . .=  4=  =  = : := 4=  = 4`4= uz_opts4= /  / /  / /  /  0 0  $0  >0  C0 I0 L0 f0  0 0  0  0 0 0 0 0/ C1  Q1  u1 1 1 1 1  1 1  ?0 1 1 f2H 1 1 1 1y 1 1 1 1 1  2 2 2  (2 -2<$ $= 4. .=  4=  = $: := $4= ` = `44= usage`4=ZRQ b2 b2 b2 b2 b2 b2 f2 i24$ $= d4: := \4=  ` `= 4`4= __main4: := h4=  =   `ww#pDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$GXSPRINTF4b#pDECC$GXSPRINTF4@ DECC$GXSPRINTF4HGdDECC$GXSPRINTF4Xb#pDECC$GXSPRINTF4`@dDECC$GXSPRINTF,GVERSION,b#pVERSION,@VERSION4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4 G<DECC$GXSPRINTF40b#pDECC$GXSPRINTF48@<DECC$GXSPRINTF4`G|DECC$GXSPRINTF4pb#pDECC$GXSPRINTF4x@|DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4(GHDECC$GXSPRINTF48b#pDECC$GXSPRINTF4D@HDECC$GXSPRINTF4pGDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4@GT DECC$GETENV4Hb#p DECC$GETENV4P@T DECC$GETENV4|GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$GETENV4b#p DECC$GETENV4@ DECC$GETENV4GDECC$GXSPRINTF4b#pDECC$GXSPRINTF4F UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<@DECC$GXSPRINTF48GL DECC$GETENV4@b#p DECC$GETENV4H@L DECC$GETENV4tGDECC$GXSPRINTF4|b#pDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$GETENV 4b#p DECC$GETENV4@ DECC$GETENV4G DECC$GXSPRINTF4b#pDECC$GXSPRINTF4@ DECC$GXSPRINTF4XGDECC$GXSPRINTF4db#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4DGDECC$GXSPRINTF4Xb#DECC$GXSPRINTF4|@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF48GXDECC$GXSPRINTF4Hb#DECC$GXSPRINTF4T@XDECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF ==== =(=0=8=@=H=P=X=`=h=p=x===================== =PDExtended Help for UnZipSee the UnZip Manual for more detailed helph= instead.x=(Basic unzip command line:=Some examples:=H: unzip -t foo - test the files in archive foo= options.=(Basic zipinfo command line:=H: zipinfo options archive[.zip] [file ...] [-x xfile ...]X=H; unzip -Z options archive[.zip] [file ...] [-x xfile ...]=0'port and is referred to as Unix Apple.=unzip options:=@6 -Z Switch to zipinfo mode. Must be first option.=( -hh Display extended help.(=@5 -A [OS/2, Unix DLL] Print extended help for DLL.`=H; -a allowed and EBCDIC conversions done if needed.=H9 -f Freshen by extracting only if older file on disk.=0$ -l List files using short form.=@5 files extracted in binary mode (as stored).@=( -t Test archive files.`=( zip -o but faster.=( verbose output.=0% -z Display only archive comment.= unzip modifiers:=w marker, and from or to EBCDIC character set as needed. overwritten file in foo~ or foo~99999 format.X=0& -C Use case-insensitive matching.=H: is on by default and -D essentially becames -DD.=@7 -DD Skip restoration of timestamps for all entries.=  restore.=( standard header.0=0' -LL Convert all files to lowercase.X=H9 -N [Amiga] Extract file comments as Amiga filenotes.= care.=0& command line to other users.=H< uppercase if created on MS-DOS, VMS, etc. See -L.=PC -V Retain VMS file version numbers. directory levels.X=( user privileges.x=( system privileges.=0( -/ e [Acorn] Use e as extension list. =@5 directory, which can be a security problem.=H9 this is not a good thing and should be avoided.8= Wildcards:H=@5 Internally unzip supports the following wildcards:=H= * matches any number of characters, including zero=8, If port supports [], must escape [ as [[]= Include and Exclude: =H> -i pattern pattern ... include files that match a patternH =H> -x pattern pattern ... exclude files that match a pattern =8) unzip archive -x pattern pattern ... =h_ use unzip on that. See the manual page for Zip 3.0 or later.Streaming (piping into unzip): =8/ used to process the first entry in a stream.H =( cat archive | funziph = Testing archives: =0% -t test contents of archive =  quieter operation. = Unicode: = digit. =H> -v List zipfile information in verbose, multi-page format. =@7 and compressed sizes, and compression factl) UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<ors.X =H< -UU [UNICODE] Disable use of any UTF-8 path information. =@1 -z Include archive comment if any in listing. =(funzip stream extractor: =@2 is given, read from that file instead of stdin.( = funzip command line:@ =0' funzip [-password] [input[.zip|.gz]]h =(unzipsfx self extractor: = unzipsfx command line: = unzipsfx options: =@3 -c, -p - Output to pipe. (See above for unzip.) =8- -f, -u - Freshen and Update, as for unzip. =@6 -z - Print archive comment. (See unzip above.)X = unzipsfx modifiers:p =@5 Most unzip modifiers are supported. These include =( -a - Convert text files. =( -n - Never overwrite. =PD -o - Overwrite without prompting. -q - Quiet operation.0=8+ -C - Match names case-insensitively.`=  -j - Junk paths.x=0! -V - Keep version numbers.=8* -s - Convert spaces to underscores.=0! -$  - Restore volume label.=0% -d exd - Extract to directory exd. =8*forces extraction to specified directory.P=8/See unzipsfx manual page for more information.=XJUnZip lists and extracts files in zip archives. The default action is to=XJextract zipfile entries to the current directory, creating directories as =needed. With appropriate options, UnZip lists the contents of archives unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir] unzip -l foo.zip - list files in short format in archive foo.zip=XJ unzip -Z foo - list files using more detailed zipinfo formatP=PE unzip foo - unzip the contents of foo in current dir=XI unzip -a foo - unzip foo and convert text files to local OS =XJIf unzip is run in zipinfo mode, a more detailed list of archive contents8=is provided. The -Z option sets zipinfo mode and changes the availableBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix based= -c Extract files to stdout/screen. As -p but include names. Also, -p Extract files to pipe (stdout). Only file data is output and allh=PG -T Set timestamp on archive(s) to that of newest file. Similar to= -u Update existing older files on disk as -f and extract new files. -v Use verbose list format. If given alone as unzip -v show versionH=XI information. Also can be added to other list commands for more=PF -a Convert text files to local OS format. Convert line ends, EOF=PF -b Treat all files as binary. [Tandem] Force filecode 180 ('C').(=XK [VMS] Autoconvert binary files. -bb forces convert of all files.x=PF -B [UNIXBACKUP compile option enabled] Save a backup copy of each=XN -D Skip restoration of timestamps for extracted directories. On VMS this=XN -E [MacOS (not Unix Apple)] Display contents of MacOS extra field during`=XJ -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn if=PA ACORN_FTYPE_NFS] Translate filetype and append to name.=XL -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name inH=PA -j Junk paths and deposit all files in extraction directory.=XI -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info.=PE -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.(=PG -L Convert to lowercase any names from uppercase only file system.p=PG -M Pipe all output through internal pager similar to Unix more(1).=XN -n Never overwrite existing files. Skip extracting that file, no prompt.=XN -o Overwrite existing files without prompting. Useful with -f. Use withX=XI -P p Use password p to decrypt files. THIS IS INSECURE! Some OS show= -q Perform operations quietly. The more q (as in -qq) the quieter. -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores.8=PA -S [VMS] Convert text files (-a, -aa) into Stream_LF format.=XO -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCII=XJ text escapes where x is hex digit. [Old] -U used to leave names =XM -UU [UNICODE enabled] Disable use of stored UTF-8 paths. Note that UTF-8p=XL paths stored as native local paths are still processed as Unicode.=XL -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do not= match directory separator /, but ** does. Allows matching at specific -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACL entries under VMS,= or UIDs/GIDs under Unix, or ACLs under certain network-enabled versions of OS/2, or security ACLs under Windows NT. Can requireH=PG -XX [NT] Extract NT security ACLs after trying to enable additional=XI -Y [VMS] Treat archived name endings of .nnn as VMS version numbers. =PG -$ [MS-DOS, OS/2, NT] Restore volume label if extraction medium is(=XI removable. -$$ allows fixed media (hard drives) to be labeled.x=XO -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members into=XK locations outside of current extraction root folder. This allows=XK paths such as ../foo to be extracted above the current extractionh=XO -^ [Unix] Allow control characters in names of extracted entries. Usually=XN -2 [VMS] Force unconditional conversion of names to ODS-compatible names. =XM Default is to exploit destination file system, preserving cases andX =XO extended name characters on ODS5 and applying ODS2 filtering on ODS2. =PG ? (or K UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<%% or #, depending on OS) matches any single character =XM [list] matches char in list (regex), can do range [ac-f], all but [!bf]@!=XM For shells that expand wildcards, escape (\* or "*") so unzip can recurse.!=XJ Patterns are paths with optional wildcards and match paths as stored in!=XI archive. Exclude and include lists end at next option or end of line.0"=Multi-part (split) archives (archives created as a set of split files): Currently split archives are not readable by unzip. A workaround is"=PG to use zip to convert the split archive to a single-file archive and#=XI Currently unzip does not support streaming. The funzip utility can beX#= This can be modified using -q for quieter operation, and -qq for even If compiled with Unicode support, unzip automatically handles archives#= with Unicode entries. Currently Unicode on Win32 systems is limited. Characters not in the current character set are shown as ASCII escapes$=XI in the form #Uxxxx where the Unicode character number fits in 16 bits,$=XI or #Lxxxxxx where it doesn't, where x is the ASCII character for a hex(%=PAzipinfo options (these are used in zipinfo mode (unzip -Z ...)):p%=XN -1 List names only, one per line. No headers/trailers. Good for scripts.%=XJ -2 List names only as -1, but include headers, trailers, and comments.&=XM -s List archive entries in short Unix ls -l format. Default list format.`&=XJ -m List in long Unix ls -l format. As -s, but includes compression %.&= -l List in long U nix ls -l format. As -m, but compression in bytes. -h List header line. Includes archive name, actual size, total files.H'=XN -M Pipe all output through internal pager similar to Unix more(1) command.'=XL -t List totals for files listed or for all files. Includes uncompressed'=XN -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)8(=PG Default date a nd time format is a more human-readable version.(=XJ -U [UNICODE] If entry has a UTF-8 Unicode path, display any characters(=XI not in current character set as text #Uxxxx and #Lxxxxxx escapes )=XK representing the Unicode character number of the character in hex.p)=PG funzip extracts the first member in an archive to stdout. Typically) =XJ  used to unzip the first member of a stream or pipe. If a file argument*=PD Self-extracting archives made with unzipsfx are no more (or less)P*=PF portable across different operating systems than unzip executables.*=XJ In general, a self-extracting archive made on a particular Unix system,*=PE for example, will only self-extract under the same flavor of Unix.0+ =PG Regular unzip may still be used to extract embedded archive however.x+=XJ [-options] [file(s) ... [-x xfile(s) ...]]+=PC -t - Test embedded archive. (Can be used to list contents.),=PGIf unzipsfx compiled with SFX_EXDIR defined, -d option also available:X,=KCBy default, all files extracted to current directory. This option , =`R You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT. ,=@8XXXXXXXXXXX XXXXXXXX0XXXXXXXHXXXX pX@XXXXXX `hXXXXpXXHXXh =0 ;=P 7G;DECC$GXSPRINTF;=P="X,;=[-Z] h;=0 ;=  DECC$GETENV;=%s  DECC$ISATTYVERSION=%d =-Z ZI_OPTS=-x DECC$STRCMP7FNAMES  ZSTRNICMPENVARGS7HANDLER=0 ;=P| p DECC$SIGNAL DECC$STRNCMP DECC$STRLEN DECC$PERROR; PROCESS_ZIPFILES=-d=ii=0 ;=0  RETURN_VMS GLOBALSCTOR=0 ;=0  DECC$EXIT! DECC$MAIN 4 44844444 4h4 4x4h4(444044844@4P4H44P44844X444X4`444h4p4444(44`44444@4h4`444H444x44444(4x4 4X444444`4444H444(404p44X444X4444844&R0 UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<'f44 4p444484`444X4H4x444(44x4444h444 4X 44484H4 44 44@!444 4H 4!4!4 440"4x"4"4 44 4#4 4H 44h 4 4X#4 44 4#4#48$4$4$4 444(%4p%4%4&4`&4&4 4&4H'4'4 4'48(4(4(4 )4X 4 444 4p)4)4 44( 4@ 444h 4*4P*4*4*40+44 4x+44 4 4 4+4 44X 4l lp 4 4 4 4404`4x4444,44X,4 44P44} }=vms.c=[none]= UNZIP_OPTS = UNZIPOPT0= ZIPINFO_OPTS@= ZIPINFOOPTP=8*envargs: cannot get memory for arguments=pferror: command line parameter #%d exceeds internal size limit caution: not extracting; -d ignored =verror: -d option used more than once (only one exdir allowed) error: must give decryption password with -P option `=@1caution: both -n and -o specified; ignoring -o =0" -T timestamp archive to latest=0' -X restore owner/ACL protection info=(* or % (e.g., "*font-%.zip")=8+ -M page output through built-in "more" 8=0$UnZip special compilation options: `= %s p=8) UnZip and ZipInfo environment options: =XM%16s: %.1024s COPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)=SET_DIR_ATTRIB= TIMESTAMP=H:USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)P=@2USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)=@6LARGE_FILE_SUPPORT (large files over 2 GiB supported)=H?ZIP64_SUPPORT (archives using Zip64 for large files supported)=8- [decryption, version %d.%d%s of %s] 0= 05 Jan 2007@=8+-Z => ZipInfo mode ("unzip -Z" for usage).p=PCerror: must specify directory to which to extract with -d option =XJerror: -Z must be first option for ZipInfo mode (check UNZIP variable?) =XMerror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid X=`Q unzip "-V" foo "Bar" (Quote names to preserve case, unless SET PROC/PARS=EXT) = -Y treat ".nnn" as ";nnn" version -2 force ODS2 names --D restore dir (-D: no) timestamps -M pipe through "more" pager (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.) =ZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing %s. usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] 8=0& main listing-format options: -s short Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format ` =miscellaneous options: -h print header line  -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive %s -x exclude filenames that follow from listing UnZip %d.%d%d%s of %s, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details.  =Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ; see ftp://ftp.info-zip.org/pub/infozip/U!nZip.html for other sites.   =Usage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s P =`Q=> define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe  =pa -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, "create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir =modifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) -a auto-convert any text ʠ UNZIP.BCK~s([UNZIP60.VMS-BINARIES]UNZIPSFX.AXP_OLB;1<ۿ"#files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %s=See "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer x x6=H@$??. .=20 April 2009i i =QI note: didn't find end-of-central-dir signature at end of central dir. g g =OGerror: expected central file header signature not found (file #%lu). \ \ =D<error [%s]: attempt to seek before beginning of zipfile %sD D =,$caution: filename not matched: %s M M %=5-caution: excluded filename not matched: %s = (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) ( (=zipinfoC C=+#Compiled with %s%s for %s%s%s%s. g g=OGUnZip %d.%d%d%s of %s, by Info-ZIP. For more details see: unzip -v. ; ;=+#"UNZIPDEC& C V4.1-001? ?= 4=TRANSFER$BREAK$GO# #= __iscntrl =  = 44= main4=,$# u- u- u-$$ $= 4: := 4= ` `= 4H4= unzip4= -j -j' -j . . . . . . .  . . . .  . .  . . . . . ."" / 8/ /! G/ G/ L/ `/ a/ @/) k/ k/p n/ q/ u/ @/7 @/ d/ e/ ~/ ~/ ~/,$ $= ( 4. .=  4= . .=  4=  =  = : := |4= n n= 4p4= uz_opts4=  / /  / /  /  0 0  $0 60  >0  C0 I0 L0 f0) y0  0 0 0 0  0 0  0 0 0 0 0  0 0  1 1 1 <1 C1 J1 Q1  a1 j1 u1 1 1 1 1  ?0 1 18 3 3 3 1 1 1 1* 1 1 1 1 2 2 3 2 2 3 3 3f  3O  M4 a4 f4 4; 4;u  4  4 4 4 4h 2 2 (2 (2 -2T$ $= 4. .=  4=  = . .=  4= . +.=  4=  =  = : := 4= @* *= 44= usage4= 2 2 2 2 2  2 2  2 2 2 2 2 2? 2 2 2 2 24$ $= 4: := 4= h' '=# help_extended = + +='show_version_info = ` `= 4 4= __main4: := h4=  =   ww)*[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1+,.N/ 4NC-s0123 KPWOC56g- al̃G!Bx%jyZÁ ,\LW}>}f>,x COJLR+R8OBR!Ep$yM&S=p=dl]95t_΋!BW%&_\ |=TA/__'{[0ׯݡ0`\YB _#Ë%@C \@4FFp]hl-~zNzJ&`?T:"6LMZ5U x3h(Uq/Mk E ȈTJڙLB d̸_ qP N.`{FڸIks!!$O8ً'pTꈰ $ r_ -bsc!a9Z5&X{o*8( "LJ=#Tnw@=Hx6HO 5,!F?Zul(4^n˚D"X)Hy'TKdw%DEfOD^NjGi<+O~ nm-a[Ս^=b8gp7 [? tR\B|6]&*ֹ[\s+o@o~wkb1tu/xk HA 4nR梲@X~(rV秄o'\0YezbE qbf21' MtG̩z3gM^"-Odcd+[FIHI"Bۏ ("5Ͽ(?,",x+=\'tPg)a^T~hVETɐ^rFE?m|ld-Lb F[i2n~~_LS9eH F/oo|(90xz?avԛcӪx%j֩UU$/$y IVʾ^r">y76pj3d#o^^ N{[of~Eɯ*s<@4j =|$˒4 ;psm:^1)6([Kbcd=CSS12YAp/ʐ*]^K `w)_*{tJ9\w%ME~𸶟RC7+}٭(ZA}KBSk't fQn`*3]24G( nw:( LO%}nmb}b.2Q:W8s=0N͂G~җy mu l"ި7H3[u%zk*8.$ R>`?y4~ #piW p0'~f:H_ҋ SN(EEdIoɓe a1MbJ]3!=.J1!r F?U'Ucܮ,AF^E\`juK-a=iOP/1ë+-ʁvc jn8+TT;~ymxU BOWm*"Upocxa Z+"p QgDj D%U`9~{-~s܁An֞6E$t3vg6 ( 3bX(wd^s~hȾ6}`K4B]Lr l .-$EϤ^Gz&A 1ժ7GWYd9j--ܰkk3L>@b xOd8H7Cmv ;T" PZԮűNuWcADB6߿ ;G~Va}l7n.B&Jc[Y|R.͠/.1 YYv nTK=EC8[#gRH@v ?啕QZD?xq)9 8&ցei'v Qnga)|6RY/s;(gFF+8t>v$b 9j+MzilB5,ޔ?Bv=r0V*r~ d'_ZPy Nv1kVy;X[,НɍnaSa3wѷ?(%Y3 m Y =Փu%A%%R$R3i I"XL։q  5讕P͸ytAcd= Y)#<[!lS =8\}:R{ڃ0[ _E i:S9W|\< RFGo@B)ԃ"W44_51bGnnܟ(6U>6H[>; uU6Vr$3ݑ7rh\%+J1;>3["O֍'`0dtI~< /%˃  N#cj(g[%+=9#{.[JS/dńgI#;[@}9m [T,hC"G+{y+<K_.i3{:½ Dt^. rri=\V{<k{/ ?y' ;%tnܤ`On # ߖ,(b G,Jy{qQ_G ^x /+}yh`m 5ylZe=MbϦ)UKF;$/jjyq)i4 b;9'GCQ =i dtq `]$#u_S:iSj递D*D 5?"^3vUDSZVA[%*8!)?Yޜl=/p6 @tB f,45(4T, piOq/8WPw<㛑[/% Zڕ7P[5En>pLlz$rwgl@AK*i \J zQL>+.1}>!fC!& Z2l!D)3U\'Fy=a6\x_Rg@F |&q?9\s1)WMjQ6 3TuV ]qv&:oN0G;0jrQel.'$i]$~2GKVzNvR62,mS.,@!8 :^Wpr^VefUNn#g3&/iT2Bz|D,?~^ FLx/† lE}F.ri?GJCSYG|u mIdJS-"U,t9Cg/#s/ f#AUiFMmg@)E x* [nX$F6cy*10FRM KLSCW6/UAFI]Nd~GC$|XPIT LC K!}?7;(Zve4Iup"m,Co:+eKy/?fec$UIO5M3avh~a8mUc%'fF(w "l`Z@(iYS 0:r>^ ZX|1O#+K#Bt>7l;& M~|bSDL8LGC8DUdEq^Kd^wqv)Bh&{dp:vS;zvhy?JUAIJ b nS&"U~y(/Q6 ]gQ6Ip TgiDJaO Q^ (i>n{Ceau&?|+^eX_yIE*"~o{SZF8lbFn]h0j=}#yRc&9;zm;mGcc>Bh7#mj:1L2w8"E++gNS 87on;WjC!dgKg ,0M<.l$49([. ZO R\_Oe>K;-m]Fq{gP]FD|@EY?W r76AO*{z= r9/(-;Fa Rab2Fl eyKA\"<>['JIBRu.pFm2 Yrw."6j'0[N6*1DH+ACI;6ClGPc}0 >G3QNRv\a1I *"XkUNuUbOW9"Vxe9-'4s78"Vmh  ~kPVX}ZV) YLjI0*16Vg4oaXPVmKYH{SI^;H)'Cc]WL H3Mg|tE0p#;CO5?%=ro.sSi`4bb3BH;DfE^ZZ4Blk6>?ij ;U 7s.&bJYK&C'l hKKT3fmITARms@O+9@&G*"'=~$m.z8 ;JW+nDY 4H)[ D_NFBJ=oDTHK &@f_P7 p:,x0H.'9+j&x<}qMwfOsCMgAQx'g14)OQ}hN0gT"&gG"oU>tQ7PpRv0l"x<pM\_LJBGVg{ma5 D G;#) >j:XGK N!_;1=n_-2W (fx?:a.-vX}6t9qayh l7ty9(fu19Y ,I.L.D(G2aI 6\C6gV%,,0z_ +mSR2 3J YK Pen[ R:mQ]JDAF1M6SC~NGP}mZht\CWjj@ANP3YA0oi!.(*ll?8dI dhE!i9TBIK+mi'YWzwM(?YK//ߪvPD`$gAX^IkYI[H uSO}hz[QH| $:A{߀'q 4h#qKl$M~l~3Os{jL\;pjt ЍeX{ T*0Mh&$e# e;?<Ӄ;S\+EAZ:z |iOO LIGgC)-l| ^Phu . 5P (QDG~;O#Rly0K;3_{Q`^7SbIe\0DFϾ*HM>T#[ zc3x#A ZMK.8X|M A}h<.eRFyPY8%5;1a*Y.xSA-`i -q*aacpG&rّ Eefx]##k IG>zbtwt%g-Herg:5Ԉ a|ko&l7]D ꀮ2ïZ6Xu|[e^V|@ڇf}nKjEԖ4|y+MK\ C{ 篾Pȭ2Snc(bIL53 G% ; E= 6OpW*=`~"nGy,$GYOPAS/'5XO m\I^YKFs ɥ*#Dq{P3.j#@ V!>OF L~}Vh8M"UΡQJ8`5C' GS<nqG5f,)y+NE?C ~tD rQeZN:K dZ4T\?_B`xYrN ~X?6, }#,W!W9EwOȡ,X $u9SnĂ->>b/x cqGtVG dCE"$wh2'T?&m,2a*2>y}jY4g$`k`;)^dWF5a.M@ hEMvAr)mpouDKt$HR> hL qF`%' FpH$4+Gsd UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N_#$%&'()*+,-./012 UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N23456789:;<=>?@A^ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N,ABCDEFGHIJKLMNOPc UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N<PQRSTUVWXYZ[\]^_ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N 5_`abcdefghijklmn͏< UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1Nnopqrstuvwxyz{|}M UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N4F}~ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N8C UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NJo|+1qkq- UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N9/ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NS F UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N 4Zd#V1.0`;ELF 2 6@@0)a0)a0"00)a @@@Xp*-IPF/VMS29-APR-2009 07:2029-APR-2009 07:20CRC32V1.0IPF/VMSHP C S7.1-012IPF/VMS H1b@ $@HP 8B C@!B`l B!PB4 @! I0$"8R$`A=$ !P!0 |)` F PP$(%P"Y"!$|)`H$F `,$0)PB$!(|)#RH!0Q@HtF ( DbI&!P("R2!$$@S=t$X4P4!`\|)`c=T$8P±6!p`|)@"R\F X$H!XB(P 8YF!\B$P!N! "B KD + wD +J! B@@ $0 B`(!lB Q0`lH0P$ HXH$ Pn) HH@$8 $$ $XP `n) H(H`@0%8 $$ $0Y0 n) HLH@ $4 ! (H8 H$`XL Hn) & H@H8 H$ HXT xn) * x@H8 H$ HXt Dn) :D@ D4" (8 $@Y n) D@8 P$ `Y Pn) F@@P8 P$ PX\ `n) .@`@ P4" (H8 $ HXH$ n) HH@8%8 0$$ $8Y8 0Ln) HNHL@$8 $$ $ Xd xn) H2Hx@ $4J $@H #HU H1H@@B@X 8C$@HP8 8C! Bl(D!`B4 B!`(I$` R$ !HR!@`I!(@ ="!(@!PR"$!`T$ P(H p $8)PBI&!,|)@X,H $$-P DPB#RxH `\|) PHXH T(4P4aclB"Rx$s!=X$H8P¹8!d|)!=P\$P!`(@!="(!x( "RBY4!H$@DH ,$,Pb6!pp|)`p!=Ph$H0P!d|)@!PR2!ɐ@H!H( =:!,("RN!0 $@XUH d$

! 0 @PF +J8! B@ $ BVP!TB 30`T400 $ Xd 0 n) 20 @P . P $ 8@PXP( Pn) 0@ .  $ :X` xn) 00x@ N! (Hl. l$ HXH$ ln) HHl@$. $$ $8XX Hn) H,HH@X$. @$$ $:`XXX, @Pn) HHP@ $N0" ( . 0$ Y  0n) H0"@Ȍ. $ 8 Xd (n) 2(@(). ($ (:(Y( `n) PJP`@ (N0 ( . 0 $ XD 0 n) "0 @ . 0 $ 8`Xl 0Ln) 60L@ . $ :@XH ,n) $0,@ NJ @ @@@XHU H  @0B Y@80C$P@BU H1bP! C@!H@ $ $,$C$@HP8 8C0!PB lJ!B@1( H!`H$$#XR ($9=0$ P(!D|)8=`$H$P"Y*!H|)9=,$P(PB,! L|)` RHN D$(-P N P"B0Pj.!3tB #RH$9= $X4P<!l|)9=d$8P>!p|)`!HRXmN @h$!H|)HDN $(@Hb8! t|)`%9=D$P0PV!x|) !RtN `H$4P $N` B8PI.!l|)`H6!Pٜ@@0CB,I E?#`X@@IXB! @b0V`phbXXF n) ,@`JHD8CX B, B`XC $B0, H E?#0\@I , H`20xD8lq BN80L,`2E&n)4=J@$B Cz UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N $$@@D<0C AB!2 ~F B`a@8a @`$H8N!@n)H  u^)8Y H!(@tE:!@, 8N@""@X HaN)E:`,t"=`F !u@ 0P"d ( t0 @` `$H8!|n)H| `^)X>!`2)@E0L!|, 8"@0Y>aN)dE0L`,<`F @ 0"d ( p0 @` 0`$H4!0 n)H  `Y^)@X!`(@@E,!0 , 40"@XaN)bE,`,`<`F 0X@ 0@!d ( 0 $`0< `< 0(@`Hp $`YR6!0 $`P0l,RX!ٌ"@rQ06,, X,F , X\F 0 N)`Y< ؀$p\ `X 6 0"@`<  d ( , 0 @  0 $ H$!0Ln)`HL %^)@X&!H(@@"EH!0L, $0"@ HX&0 N) EH0 ,@"< F $@ !d ( $ 0D@   $H H!n)`H p^) Y@!p:)@DE8N!, H"@8Y@0 N)tE8N0 ,D= F @ !d (  0t@0  P $H0L!Pn)`H( }^)0Y(J!(@dE>!P, 0LP*"@X(J0 N)E>0 ,d*= F )}@ !d ( | 0p@   $@H,!n)`HX i^)XXV!(@bE4!, ,Z"@@XXV0 N)@E40 ,bY= F `h@  @`J`*4C2 !H@. H@ <\ \$H HH20L B`YRp\$`P0H20L,BRX!0"@P0&,,@ X,F d $X ,R@ F ,@X @p"@@< .@\@ @  pB(@ @H@ $ R8N! $ Q0p,"R"!p:"@DR08ND, DF D  Y F !N) r< H ,E DH  @D @t@  ` $@H>!`n)@H0 P^)X0L!P*)@E(J!`, >`2"@(Y0L!N)TE(J ,1=@ F @ @ @ @ 8 @A(@`@H $`YR(! $`R0@P,@ҼRXV!@"@@Q0(,@ XF  @XhF !N)BY=4 ,E P4 Q @J $`miPC0$0$@ ,0`C 2!2 ~F@ <`@I x4 pa@`Ip, 0$`R.!$`20p\,`ZR&!p"@`0.0L,`X LF 0L `XXX,F N)`r<X,E XL   H2X@ H, I`@HH@$$9R"!$$t0D,"R8N!"@D0"p, 8F p  Y F %N) 9= H$, E DH $  2$@ H$: I`@HHP$$1R>!$$d0|,*R0L!"@T0>`,( 0F ` (Y(F %N)1=(J$, E |J $ } J`64C2 H@$ mi QH0 H$H*! n)@H@ 0 @Q^)X@!@`@RE(! , *@"@X@ IN)BE( H,QA<HF @P@ $BH@@J2!p0C$$@!C 2!X0,I E?#,@R `$`0)H`A(,,` 2`X"@ ,  X,@ XX,$t"= . ,n) Y F @  X  XX,$ <D. ,n) X DF D  XD XX,$d*=(. ,n)(Y (F P  X `XX,$@<h. ,n)@X hF h i JhD8pC,I $x@RE?#0T@ù0 D8X pF p q@ J @A/" , HU L ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]CRC32.C;1Sߙ! } ' 1  ?#>#.@#>#.@#>#.@#>#.   | ' 0r#g ?#>#.@#>#.@#>#.@#>#. 0 h   u 0| ' . a1  ?#>#.@#>#.@#>#.@#>#. .}ȴ##0 >Ӵ%}ȴ  g##  g#  r{{#}@@%.{*CRC32HP C S7.1-012make_crc_tableget_crc_table!free_crc_table!"crc32"U,*.shstrtab.note$READONLY$$CODE$.sdata$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]CRC32.C;1FREE_CRC_TABLEGET_CRC_TABLECRC32ELF$TFRADRDECC$MALLOCDECC$FREE  1p@@PNT_kr''@z''''*e e e '__@__@ _(_0_8_@_0H_P_*X_H"I*A*rI*I0*bI0 *#P,*`,4`,;@`Np`\1ud1 l``,xH3` `0/`P/3` `/040 84  X5  s&r UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N4Zd# GOATLEY CRC32aOe# GOATLEY CRYPT (8g# GOATLEY EXTRACTh# GOATLEY FILEIO Gi# GOATLEY GLOBALS _k# GOATLEY INFLATE{l# GOATLEY MATCH n# GOATLEY PROCESS#Ro# GOATLEY TTYIO kHp# GOATLEY UBZ2ERRs# GOATLEY VMS)u GOATLEY UNZIPQjOe#V1.0ELF 2@@ -IPF/VMS29-APR-2009 07:2029-APR-2009 07:20CRYPTV1.0IPF/VMSHP C S7.1-012IPF/VMS vL ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]CRYPT.C;1虼S!"Κ#$@%"CRYPTHP C S7.1-012.shstrtab.note$READONLY$.strtab.symtab.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_arangesENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]CRYPT.C;1ZCR_DUMMY 1e ee @p;$,`z8`F`&Rp0c` r 7g#V1.00ELF 2p@@0 8a 0&a0 DZHa 0)a0,a0)a30)a0.a0#2$@$.`.OxOpcpc i iPjPj n nqqr(/IPF/VMS29-APR-2009 07:2029-APR-2009 07:20EXTRACTV1.0IPF/VMSHP C S7.1-012IPF/VMS inflate skipping: %-22s need %s compat. v%u.%u (can do v%u.%u) skipping: %-22s unsupported compression method %u %s: bad filename length (%s) %s: bad extra field length (%s) file #%lu: bad zipfile offset (%s): %ld %8sing: %-22s %s%s%s: bad file comment length local header sigfile #%lu: bad local header (attempting to re-compensate) warning: stripped absolute path spec from %s skipping: %-22s %svolume label warning: cannot alloc memory to sort dir times/perms/etc. warning: set times/attribs failed for %s failed setting times/attribs for %lu dir entriesfinishing deferred symbolic links: %-22s -> %s new version of %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: NULL (EOF or read error, treating as "[N]one" ...) new name: error: invalid response [%s] At least one %serror was detected in %s. Caution: zero files tested in %s. skipping: %-22s encrypted (not supported) No errors detected in compressed data of %s. No errors detected in %s for the %lu file%s tested. error: %s%s %s error: %s%s not enough memory to invalid compressed data to warning: %s is probably truncated %s: unknown compression method bad CRC %08lx (should be %08lx) error [%s]: bad extra-field CRC %08lx (should be %08lx) %s: ucsize %s <> csize %s for STORED entry continuing with "compressed" size value warning: cannot alloc memory for dir times/permissions/UID/GID warning: deferred symlink (%s) failed: out of memory warning: deferred symlink (%s) failed: invalid placeholder file %lu file%s skipped because of unsupported compression or encoding. error: unsupported extra-field compression type (%u)--skipping 6H @a%0 p!BBp<B@<B! ,@ !< # x !@q @<0+ @<"/PC(a%HP(J @ q  J C@$#@@pB`Y 8Nq  }I@8C@!BXH@B A?#$q #Q!P, #P0B@C0$0 H0 @$ B#@($H@ H0@!P0 `Z H()@@H(PCH$ H`HXP8 8  B C01@!pB 0LqC ! P0@! #`APp B`0X4p C 0@! #`0X $8Ii8pC 0@! #`0X (8Qi8@C 0@! # ,\2`0X0,4PJ @@!` H08PC` H`XP8 80 B C0A@!pB 0LqC ! P@@! #`APp B`0X4p C @@! #`0X $8Ii8pC @@! #`0X (8Qi8@C @@! # ,\2`0X0,4PJ8$!H `$H@8$   `%HT hZ0  XV0 "p  @!pB@fp4 +e@ !f H # $u@X `!&@ 9!t #P88C $#Hh`!P8BC$P8B0CH`%H` `Y $P88@C@ B00 B@@ B! BCHP`%H J `Y $P88@C@ B00 B@@ B! BCHX`%HX H $ $,P88@C@ B00 B@@ B! BC HP@!$ `8PCP88C$0 B8@j4%x@ 0@!0  HxpD  C$@!@B CC !H A!, 3 \!$  l! HX A?#H(@Y YP8B@C0@!P B  iH@!8@P,VE jXh8 CH@@!`B H$qC !P0A!, 3 \!(  j! @PX A?#P,@Y YP8B@C!D UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1Nϵ@@!` B  iH@!8@`,fE lXh8`CP880C$0 B8@j4%@ H!$p B1@$x@a%K`x ?#`@ J l$0  l2B  $pCP`%@ $)@XXX!BP$P, L!0 J! ,j`@ `hHX L!BYPh@B C $@CB L! ,`(hH`t!@!@`%H \!`@lP$!H@ T!0 `0`,Pl! H@X L!B0(`(l(@`%H \!P@RjP$!H@ h!0 `0P,Pj! H@X L!B0(`(j@`%H \!@@QhP $ BL!P$@,@X L!@B`( @!h0  $ ` t! @$a%PK B!@@l ,a h`0 bjC1Bc,YP88PCAa%@a` AB!0 `E !c}I@8CA`%HX l!@` a% ` l `YPA`%cK 3 f@a%H  v `,`YP R! #@fI h(@ @! a%0 @ `XH 8C @! ",8CH`%H # L!%@ x@$ P$@,X L!00 J! ,h` ` t! a%P@ jY88C8$H PTp$ HR2@j! H `1j B hk`pY,P 8 B C`%H Z!@`P $ BPL!P$, L!CB@X J!2, ` `@a%`,  8$`{@bH`h N#P `p@q C$ BpY $BP X8B@C1j!Hx j`YP8BCa% H` v`YP$B P@!B A qC`%H Z!`@lP@$B`x8!P$ B8 R!BYPl`B C L!`CB J!,@X l` t!$B`xP88@Cp$ H\P t!$BP@`%H Z!@@T 8a%@ :P $ B`L!P$@, L!00 J! ,h` `$B PNB`Y880C$P t!a%Kņl @ņ hZ  b $`Y \ ZP`XB`Y8J a%@@ h a!0 Hf8C H`YP 8 B `C8`%H # L!p@ xp P$p, L!pBB@X J!2, 8Np `hA!B ZY88C\0B  \! #PHA!B HRHY8J 8PpwX!C@B! @Pa!B Ts0C A!  ^x@! C^!0$ Ɵb0ИC 8A!p p, `A!8 #a`X0B a X@!0B`Y@!P0Ba`X@+B a@l!,I``#B@ l  0h@X @@X @@ + X`XX X`XX ,"@X + &`X &`X L*@ + .X .d #XJz4C @!h h, @! #a8!HPz4p,f 8x #@XJ$, C $0 `xP t!Ha!B HRpqPC$B dT HYj!P880 B Ch`%P#B 3 d!@`0k BYhZP$, L!BB@X J!2, `Z `8B8#$BP8a!#Hp t!p @0N4J$BP@!q  !@@", l p q=1@8CH`%H 3 L!@XY x P$,X L!BB@X J!2, HR ` t! 8Ppw!PC@B!H@! `1@!0B `Xq@C$PB b 8jqCP!A! , $ rb!B@PYp\@[H@%SE, TYPp!\!!H L!2,@X J!0 `p`B1B#X1@!"H`XVP@0[J$BPt!C@B!@ A@!B ``q0C`$B `X 8PqC1A!, $  zX!B@Y x^R"@xY TYPx!^!!H L!2,@X J!0 `p` t!A@!"H HhB@@J$BPt! C@B!@A!0XA@pX@"~C!C1B@$ f Q%b PC`%pbK@ XB8@: d  N@Y,Cx$`H $0 PlBx L!B\!P!`!,@X L!2,`( h` @f8pC $B`0d!P!`!,@X L!2,`( H` (@Q@!#@ F0q@8pC $B`0!d!P!`!,@X L!2,`( ` @x$pH@ $0 YNBxL!BP!`!,@X L!2,`( p` $`t!C@$H@ H90 `Zȁ@ @0 CX!,`0P$,X L!BB@X J!2, @ ` t!(B11B` ҩ@8 1C8q@ EBD$jBKA^aB ,  `!p 0AH `%0  X!!@  H  "pB`@ @ , $ 8$,X!@%BDP,$`X P,"X @P8 Pa%0X @` P 0@ @`Z @a%$2/B X_$"/ PP$0+ @G$2/ PAp(qC9@C ' J Fh@ @ . @%B "8@ ,"@%B $iK@€ B E@@ " H "9CD1C A!",XAp `8, qx4jyNxpC$LK`@ 1`% A K HP @`H %1 UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NR,@$ ,PF HHL фen000B0 @$1 @ X$H@@ 8 0  `v ``R`! PX , @ p" pYp$P@B C X$BB0HD! , @` N!,(@8D1C A!0ƒ",A q8 1<9FcppC$LK@A 1`%A K@HX )@`H %@" ,PF HHL фen000B0 @$1 @ X$*H@@ 8 0  `v ``R`! PX , @ p" pYp$P!@!!H` HD!2,@@X @B!00 `` N!,H@ A`% @ D@r=9F8PC A!0ƒ",A% BA8 1x$9FxbpC$LK@A A`%A K@HX 0 )@"H 5@" ,PHH C P!0 `Y@F!P!D!!H` HF!2,@@X @B!0 `` N!,@ H!$0 p$ @C A!0ƒ",A q81<9FcpCX$0LKD P `%0 @`XHH H 5Z )@PH$H@@ @F!0 YP!@!!H` HF!2,@@X @B!0 `` N!,@`%H PF @@ N!0  B Y qB!@"/ @@@0#0UP @VH@` P!`8 @ !<0 xf!C8$@ K`@ H$p0 $0H@uB@P$: @`@O!;!@@ $Hp$HX$H HH  P0 ' h00  d0  `0 ` p\0 @ `X0 9$T!@`Vb@T)bHa$DK` XB%@YcX!` p  ,C@% # XP01 . 8 `1 88 08 @$ q(a P(A aA q A X, A @$a a(a P( A q8,A a$a P( A a@$a 8, A  8  P4 t h&06 @  CH`%dK@ $%@Ykpf!B` H 04! @X4-0YP0!L!!H `R!2, @X XN!`0 `0$` @ PH8`C`%H  XR!0 @P$0 - `R!0 B @X XN! D 1(0DK ֆ H` @` @@$0#`P08~F P  0#@Z 8 `1  88 08 @$ q(a P(A aA q A X, A @$a a(a P( A q8,A a$a P( A a@$a 8, A 8  P4 t H$0& @  CP`%dK C pf!)@Yk`h!B 04! 4-0YP0!L!!H `R!2, @X XN!`0 `04`!X@0 $H@ `%0 @ p pCXB`%H X `!-@ X` XZP`%KɆ $0 @`Y[`֘ H P ,!  ` `Z,-Pa%p c P  @ #C P`% ` P ,0 S0- hZ XR!|F0YP0!L!!H `R!2, @X XN!`0 `04`!@a%K Z Xa%0 @ZP -@  `X   ( # @a% KB a%E@@R( 0 -B " H R( H, X , D @H& 0 -  P$ T # H,$$H` P8(BC`%0H S hB0 @ Z4- B 0 -P"!!H `R!3, @X XN!` 1 `04`!@ $$H X~!P88(C `% Sֆ - hZ XR!0 ! `e>#`HP$0 - `R!0D B @X XN!3,0DK`X`` 0 P88 c Pp C @F pCH`%H  XR!%@P$0 - `R!0 B @X XN!0@ 1(0DK0ֆ `(B@C @`%0# @ 0#8@HF@K@QS $Xa$ H`Q[ X`XXXP80 B PC$$H` P88(C $$H X~!P88(pC `% S - hZ XR!` `e>#P$`, `R!00 0XN! ,0L`4`!h@8 9C `%    0 S0- hZ XR!|F0YP0!L!!H `R!2, @X XN!`0 `0` !0 $@$P88  B PC `% 3 ֈ 4-` H `e?#@! P$@- `R!@DB @X XN!3, 0` 0!`!@Za%H`X `` `Z`$P88(C@ L0@ B@$ !L!`BC`%H  XT! @P$!H @ ``! 1 ` H -P"!!H `R! 3, @X XN! 1 ``!@ `%0 @ X` XZ8,8@C`% HPք (B ba%H`X `` `Z`$P88(C@ L0@ B@$ !L!`BC`%H  XT!0 @@P $!H @ `!1 ` H0 -P"!!H `R!3, @X XN!  1 ``!8@ Ra%0 @  pC a$ K  ֈ @QC  1 Ѕ?#@- @@DB   "P !@ppCH`%H  XT!%@Pa%H 3 `!0 @@h0 -  BP!H X!0H@  BP$ B ( h!B` H!@K ֈ P"!!H `R!3, @X XN!0 1 `` L01# P0! Qj!0 ( j0@8 C !@ `%q !8!@E@pB0y@8CH`%H  XT!%@P $ B 0XR!P$0 - `R!0D B @X XN!3,0 H0`8L8( 0!0 H`P  phC H HP$$phC X`XP,,phC @PHHphPC`BP ,h`F P`4@J `%p9]@ .x]rJ$-P"v @@ P@ M0 q@aD La B`C$BP8;(CH8C9C 1k!  Ȭ j?#`! 2BL8s< C($@ ! s4s UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N"@ bj!0 ! 9 C($x@ ! X@j!H k qKXJ$BjQ!P(Bak!q Xj,qa@8@C$BP?#(B C`-x2 0s  X0 @8,) PZPC$,@PX P, (  P, (q7 X@$$,P08(B0C?# F0 `J `% -@x     PBB`80C`%H  XT!0 @P $ B `XR!P$0 - `R!0D B @X XN!3,  `hVH X|!(B hZP 8(BC `%H` H `Y!@@ P$@- `R! 1  XN! ,  RO!1  $` 0L8 # P0! 0RO!` `)@0 @(pC`9@Cp89CH9`CHd9 C89CXȍ90Ch䍀yx!8@bO!0B ܄ #$BP@?#(B@X @ 0"B P r C R!#`%H@Xh|!B`P$ - `R! DB @X XN! 3,  `!H0`%H` H `Y!`@0P$`- `R!`DB @X XN!3,  `hVH XT!(B hZP$B PP(?#(B`(Z  @@ Pr0C0"`%B84 @8J$8H  $@ q@C$0BP B!(B  Z8C@8C(`%H` H `_!P@`(P$P- `R!PDB @X XN!3,  `0L8(B@ (J(!# K0  ! #@ H"$@$qCP`%H  XT!)@`(P0$!H @ `!1 ` HP-P("!!H `R!3, @X XN! 1 ``!@0$ a`80@ bj!!#($(@ bj! !#8pC @a%0 @P08@C0Ba%p@aX3@L!`! @H10C$ B@!@  JI0Y@Ua8HIH a$0  $BB %@@K @ 0 @K`X @KB !%@ $ #D @@A0 0  88`", @ 0` ) X8 0  PBqp& 4@K`IH8% H82B @C @! ",8 C$0 H  @ `%00 J p@$P @` !@`H@,UP$H  h$0 0 c B 0 (PH@B C hJ!@BB0`F!,@X H`V!@P! $PK FP@ F #P88CH90C 9B$]AH!@@!@$P88PCH90C 9H`$]AF!@@!x@(Qa%HP(J B (JpqPC J9@C A!@ƒ", A"@B8C$I a$00 @PHH `%!@4(H5Jh P,P 1@!",8B90C $00 @Ha$H@ H ,0  H(0 $, J H AHR$($X "!Q@!@H` A@P0 &Hq p,PRPB chZ B x!BPJPB C hH!PBB0`F!,@X J` V!Qa%@B  F 0  0$FA B,P88C $@aPC@!@H@ p 90B (@ H#p1(@0B XJ8cp@R pp 98 Ȅ 18(  D B`BPX1L80%@C$@ K 8AI?#-@ Hh" P$ B pL!BP(!J! H@X hF!2,h@$B0 `F!B~FP(!J! H@X hF!2, J H d  B@ `V!@$I` 8`%00 D8N $$`0 J  `!"%@YPh$H@ `H!0 P!@!!H hH!2,@X `F!0 ``$BP@$B @A!0HD (A00 8A@T:9J8C0a%LK   `%`@@R8$$$5 0L( `J8NBPX@L8Cp@$,BPhN!`H 8$0 cJ BpNP(H@BX hB!@BBP `F! , H@`Z!HXP 1@!`",0L90C $P0 @ a%0 @  r0C H$$0 @Pa$H` P D0  P ,0 (,@R P@APR(D H$! (!Q@!PH APT0 (Lq c p.bTB(x!B `B!P !H!,@X hB!2, H@ $` V!(`%0" K(J 0@ J #8a%0K:  p  O?# c`C@a%K @ )@ @@X H  $8@$P V!0; C(`%@" K H`%P@"8N 0H@A(J%@(Y P @# Hp  H!p,`p L8$ #Jh`%0K 3 `B!@`(`%,DhZP@hY8N PF  B X !F  #N`q@J `%@@ H qPC $,X`B!P D0B ! A!0",F80C$P V! (Aa%P@ (J`qCJ1C8$0I 0a$p0 `H!`%@@ t2 HHuh @,Ph$H@ `B!0 PH@B C x$@BB $ ,HB `V!@ $D!@0a%0bK2 F ` F"B` 8Aq A# CB8@H@ @p  HP"HGA@prJ`P!@P`%I` p@$)@ HH  `( h P8$H@ `F!0 0YPL`B C x$`BB hF! ,  L` V!8`%BKń 8N @z h$p Cp\BpY x^0 8Y $,P(NpB C x$pBBP hF! ,  N`V!x@7P! B8PC $`LKD a$0 2ad byb (J  ` J #Y@ @,E hF 0 @ D qC$ LKD a$0 ()$`"H:@@b@X N#Y @ H2@` $` V! $P@D!B , Q@`Q@H p!@0 `e3 UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1Nk_1$B`#@ 0ҏ~F(0K`Y 00 @`, 8PH$0K  \!%@ 0PPa% K@ a%00HBP H`AZ$ 0!M@` H!P!U@H $- #Y$ B p &Q0#*`C R9pC!`! K@H r BB,\,P88PC I! sD HqC$H@ Ha$0 @AR@P H`a`!B%@ CIF! ( `xd B@YPD B C $ BB F! ,@ D` \! $02HA@D!8@ I!",8B80CJ)%H@$LK`@ $00 AB`H5, x@ $ ,P!D!!H@ B!2, @X xF! 0 ``\!X@H! BYx@!PF" K p B  #Ha% KHR "@`# @ 0 #@ D( 0#pC`%Hb , b YP I!`@q pC Hq C@ $@1`%0H  0a$00 FHR H52 b S`0,@@X ^!H Y,P(RB C $BBP D! , R` \!i@Y`U HA HDb@ @  B4 C@$@Ha%0"K (`%%@`$h@!$$"XP@D!a%,I8N P F@ @@(J0,$ B 0@@$B , P N # DHU HA H$!@@C?#P(, B( C`B!H@0$pK XL P`!N B 88`B C D@H40B  H!`XP 8p B P C@!@H4%@ChF!$`8P T!8J8CHJ9CJ9PC1$,0Y XN!@P@$BPT!@ 1$0~F  !PB0H pC`gHB1@C@@HJ@<  @  !@X$P~F@I*!)-@`)P(|C $@(BP4@C ,@b y *!` @ (,  +?##H \n)(@J (B  F!0~F8 ("!$ h1@!$`8P T! @N!HU pI"B@@f`I 8D1p`8`!?#PB @BHF!0BHCH$ $ `$0@`HRH@@Pp~FH8`i @Rbp@@ @pp @Pp(F!PC ,@X @$  @ X q8@$ ,P88BC@H Q i8p0H,C98i C $X#X@0E@ X!X#`4 @` p@ F4pC $P#& 0M@ @` p@F4(,PC@` HTF0Y@ @` p|(@ 0$@L8`CJ!( qa p6UÁpn) p6q^) p6Ql#(@ F@B!yh   @B, $"B Y0@"B0Y (B(YPH! ,0 compressed EA data missing (%d bytes)%s compressed WinNT security data missing (%d bytes)%s%-22s extract[empty] linkinflat [text] [binary]testulocalEOFlseekPKVMSswarning-symlink errorctx=stmrcentralN ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]EXTRACT.C;1Tί%&ә./ cccvm pm ux00%%%h0 v v v 2 0//h}2 0//o3A6oa!3~S4r &k0"@%@% @%0%g ~u0 ~uj  &֦`O  / x x yxӬ!h&t~~(0}0v v _%˩p w 2 2  0#}000r~"g q%!"{{  }}ʩ%ʤ 3`}թ/}? %pg}Ҭ@0{{0nu u }``@ xx 1~s r r@}  aa!&&& v w`0`  v v u w@ s&?y  %%` `0` r`"h%}%.  !_!h}~}~!}|8~~p\(~~| t u t x@'Q!}a{x«%0@ _}%001z?yy0Ӫa"hթ}P 0rt% 0"@%թ00 %թ"0rr{N{"0h}ippppէr0(.@"u%j~%t)0#.`Ы#>V{`h">}%~ץ`i %u l{{/   wn ywphy{{ʧʹ}r"gm}m00~~~ #t}y sx%xxyxQ{{&̩~yyyh  %"0}} 0 w ! t xti!irPza}}0 xyxx  tw*%%)y rz}խʩ@Qfr#&@}%Q~/ {&{   t t g@̩P}00 %w*z]*V* y0y{ sg0opS0 0 m % N4 UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NZ@zzyt Zeee~&vh0] 'U   B    `@%.rEXTRACTHP C S7.1-012extract_or_test_filesIstore_infoI\extract_or_test_entrylist\extract_or_test_membermemextractmemflushextract_izvms_blockfnfilterdircomp,r.shstrtab.note$READONLY$$CODE$TRUNCEASTRUNCNTSD$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]EXTRACT.C;1dircompDECC$GA_STDINDECC$GA_STDOUTDECC$$GA___CTYPETDECC$$GL___CTYPEALOCAL_HDR_SIGCENTRAL_HDR_SIGGEXTRACT_OR_TEST_FILESMEMEXTRACTMEMFLUSHEXTRACT_IZVMS_BLOCKFNFILTERCENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSGTRUNCEASTRUNCNTSDOTS$MOVEELF$TFRADRGET_CRC_TABLECHECKDIRDECC$MALLOCREADBUFDECC$MEMCMPPROCESS_CDIR_FILE_HDRDO_STRINGMATCHDECC$TXSPRINTFDECC$__OFF64_LSEEKDECC$READDECC$FOPENDECC$FREADDECC$STRCMPDECC$FCLOSEDECC$UNLINKDECC$SYMLINKDECC$PERRORDECC$FREEDECC$QSORTSET_DIREC_ATTRIBSMAPATTRSEEK_ZIPFPROCESS_LOCAL_FILE_HDRFZOFFTMAPNAMECHECK_FOR_NEWERDECC$STRLENDECC$ISDIGITDECC$FGETSDEFER_DIR_ATTRIBSOPEN_OUTFILEDEFER_LEFTOVER_INPUTINFLATEUNDEFER_INPUTREADBYTEFLUSHCLOSE_OUTFILEMAKEWORDMAKELONGCRC32DECC$ISPRINT   3q;IXj|@ $pc i0Pj np  *)35=FQ_ht|!-7BT\f} '09?#DZ@UQU|'|'$''. 'O1 'pc ' i7 'Pj ' n'q''re e e '__$__$ _.(_ 0_.8_O@_8H_OP_pcX_X`_pch_ ip_xx_ i_Pj__Pj_ n__ n_q__q_r_I%bI&I'bI'  rI(I)I*I+rI+I+RI$RI,r I, I$ I- I-2 I n@ 2b I- I n 2 I-R I nr I-RI.I.RI/"I-88"I'rI nI-22BI0I1I2I32I4I nI nI-bI52I6I7I n2I-I7I3BI7I'"I-I7RI8 808RI9I-"I7bI7hhI-bI-I7`pI- I7!0!`!2`a!2!I-"I-"I-"2`"22#I-#2`#2###I-$%&&'I n'2''R(I-)I n)2))B*I-+I n+X+X+I-,I n,,-{TL=B;?´⍴ + @*%#J}߿]dLWv 7)#!C,%"FM`K&]RJܯN5%B>l)Ld&G.D5(pZ_,.uRtM-m1Dh*72}-JJ[/T0*I\ т ^y8#a JC{#@bLLOv=0]QN X% Wq?GqM{@mg2'ﶦsHyz;'Psʁ.N^5Avppݝ2@n6_x+'#| Yh&;MI.rx'E/7z">~F`aZ~ {Sh$UxXpM+Y.%PEvQgxOѱ*J멒LVa"`?wNkT2 P@A-ir?OgM0=ZG yLJBe`&jbuLtLu4'ԞVIf+K 1A*Yp?[a9uPT&e!8$MeB'2|T78ZA N%"~)ye|N%&hOCt;emj4 &ۦ}QRg"G?N>{#ATdc_KR=$%7-=jP3aԟq^,8{5pi&#sI;#OHuM{:DV:`EׄeZa%n&GW; 30JsmSM5&2`]H1T3_a5 wӺ@g\&D8D 0z@|$'[3Ŧ 6\d֋4fܕ:ݏ %[@l: qh{QCEAwO~I)TZ50`ڍ}ɵB2.EyE݄\-IpAkX* Iao@; "A[c$QW7b&VdD> { lJ!t[ة&WUxJ#mv^3ez*X$-';I:G9\ܧF.ITmC4^Vax]T`k -v&3aL !>6sxxcPo:#,%H h^,!@U,@@^̤LE-lp$dGBa߂P7% 6'-«CeTضop'ii@ft)ʅ8b `0bQ+ .4PVd F3#9@\p,4NK.~\K5 y1!- `oM04@Fll0! jm",Exץ+- x,CFy+Eqp1ER; bp:V+dM#0@]xfx4`yjɣ@\)8˷AלN@ ]GDz!@y=1gXO(,9:$1F@1w!w_@3UaP@9]1-7)`\zPf`QaHq[o| W1dlZpqI`(J^ {z 9oy@DX !@i 79WQ%7Ã_^\E:X`NU7Bϧ7,k8s[GXSRa!/B"L)[+$ (so @ р ( p)C,#;}0I,i!V<2#H0(!r k ɔcИ "*  Ƒ8*HӤ 91 x`CO QAcc@5b@P: Q'. tlO{Hi(c` HPPZQ^փ+r&YcR8ld0;A UP1jѻ9\Q ~O%cqֹ@ P&=(A 54Q>?/HI`<@Ï&,"I.eSB& _VjgHA>89fo y#PÝ:2z\B=&[5B꥗Hx; bIXY$:`XA{!A%FFR[%O%Љ{^"R@\}`wEfets92c,s`*mʼ9HoO~ 5[2dX*`1AY \m4T{16c$'O(,\@H* Z;FíI}K#G-ielk=yid`"z)+3`Q%ӏΤ!W]n}cr.?,_#a10dHy6rgA  ~1P&*X3jRH;``'< >@LQ2 ]3ddWZv [ړ74v@@f2A1NB@k-gY$SL~,Cwxy3Yn{({U"Q# Pœ AlQ]mzgʪ[ 2Qqg( L; ~ٻ3$tXJ[t5_ub.d*]o)#/2޺PML" F[vVSSf uNnmHJ|zosjZY/@TJ`($Irv)DZf d3y3!16S-Y}6sHC !YvIx~K6:/@hR8B\b,RTbp4T.1% `#Sl "@N?F.6&TS\+Bow JE &T*Γ%ߦ3\cԁpl"?VzR`Vd'3u|[Mw" (HuwȀžO 4hFi= dI8⭪(+G##Yb$%4:w¶ZCOb,L)qb>ׂ kj#\TU등/-#ǀf'{9m\ȃ˸H!;"\qF" 60y!AoL#"1 u(0x 63n0Cow@n 2 6 [(] A!9KRTˬ=O53 `Vs*N&U`%'I}0p'xfGk@~Cgd:%;;gQ㼕:6YDSC kQf(ꡕ&Yl'xEcKDtS_԰U`\f@݄^[C'.ɣ y9>y Kvu g@8!3:6(#Co&VH0I +yX "~~?7qW38x= /p o N> +|~SMSФ!:L/_H܈ 6uչ<(O"pQ2ff"BAikalP/aTO]VYA\ TJ`ZlڰԉR<ɏNbvl1 S B?74r2UYg]ui519\Y 2HLYWLA¸e)\$ulz 7|s#ΠZ#-ro4ׁBA"nK$*w"Dh:-"[GsSG2XR v )G (G"Q[H;7"'ey=b^W32VJ^Z"0ŝsjGRBK.e|\$N9DZ%A"3?4`?BK@jY-kne,`Wo2D4! j $ K4iR կuCX UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NcOI--I:P.a.b.p.q. .x.......... .x.//// /!/r1I-"2I-4I-b5I.5I/62B6I-7I(728I-8I)8I-9I-:I;:I(";I)r;I-;22<I-<I<=I-=I+>I n>2x2>I->I7?I+?I n?2x?I-@I n@2p2AI=QA2prAI=AI-BI nBI-DI>DI?bFI@"GIAGI nGI-bHIBHI-JI@JI-KI-KIBKI@bLICLI-MI nM2`NI-NIOOOPP"QI n0Q2h1Q2`2Q2`@QaQrQI-QR"RIDRIDRIE`SqSSI nS2`S2@S2PaT28bT2`rT20TTTI-RUIFUUUUV VbVI nVI-VI-`WqWWI nWWWI-BXIGaXqXXXYI nY2`Y2` Y2(BYI-YI nY2` Z2AZ2@BZ2PZ28Z2`Z2[I-2\IH2]II]II^IJ`^q^^I n^^^I-__R`I n``q``I-a(1a(BaI-aapbb"cIGqcccIKdILdIF0e1eAePeQeeeI-`fpfqfffI-gI#gIM!h1hAhP`hPhI-!i0iiI#rjIKjIK2kI'kI#lIpcBlI7mI#nnnnboINqI2  `0 r#@|0,p|86|@}G@Zp@ hLp@h x`  `}ș ``` `00 0  h#V1.00sELF 20m@@0)aH0aB0aB0'a0)a0 &a0 +a0$(0 )a0&%0)a00a0!+0!40!=0 )a@0X0p ``(@P5XP55x56666:.IPF/VMS29-APR-2009 07:2029-APR-2009 07:20FILEIOV1.0Dܝ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N5^IPF/VMSHP C S7.1-012IPF/VMS error: cannot open zipfile [ %s ] %s error: zipfile read error warning: filename too long--truncating. warning: extra field too long (%d). Ignoring... %s: write error (disk full?). Continue? (y/n/^C) error: zipfile probably corrupt (%s) %s exists and is a symbolic link%s. --More--(%lu)--- Press `Q' to quit, or any other key to continue --- ׃Ѫ++++--+-+++---+i++_̯յݯ=HIH`ŀ A`%0 $H`Z@$@ sXVb@ b0 Xx,`XYpP;@ # PC `% `K  $@@D0"H$ H PX H P,YPT!!H@ h@!H`(@, `XP !H!!H `J!2,@X XD!@0 ` `@$B(@, HU @$K @@$@ H$c@CX!$, C XX(@ (" `% AH@ $HcC!PLKB a%0L0 a%`AX@X*pA\@H( @L,X ,@P @ H.` #$00C a%@@ @$K @@$@@C H(0 0$,C( 0 C ! 0#Xa%!B`X P, PX0(,`XX$ LK`a%@$@ ("LK ,@(@ 8@ `%AD@ " Ha%@$@`C @!$  X HX H, H 0#89`b@ @B8BC$0K F0 @ 81CPa%K 3 X@$@ 5J PT , HYPa%p q @  @ #PC@ 0PCXa%K  `%-@ 1J" I@ X $0  P@$XD # ($a%@K& @Q@  (J L  X(i`XYJQB!@B@PIP a%P @ $(Y Xa%0 @1RH -@`0 H $ $, #BP %@@B @($ LK (J0 @ (FPP!0, C `$B0( PJ! ,  F0 `@!B(@ @D! , 8U` H=H@b@ @ @8 C@?#@ H@!$0 P1@CPa%'~F@R X@!( # ~F@ a%E@ "DcCXA`%bK D $@bB H XV ,`XYP B q P C@?#@ 0C$ LK F @`DPT! , C p$H@`F! , E0  D `$ H PP$H PP T!a%`K`B `@ F  " LpH F80#P(a% K`B a%P@@& H (J  (K?# ,@" & H@ , HU 01H @$0  ?#!@ 8! 0 @ 8 `@1 88 08 @$ q(a P(A aA q A X, A @$a a(a P( A q8,A a$a P( A a@$a 8, A 8  P4 t %B @ @ CP1`% H a$ 0 @R@ H PTE@ C 0 @PYHR@B`YPF0B C X$0BB0HH! , F`@ $B(@ `% @ DppPC@A`%H@X H! @ a% " F @YPHa%K 3 H @BP@$B HR ,@YP81@ # 8 C@$@ a% ,`@ Ha%@ @ , J H@ # Y D % #@Xa%`K@B a%-@@R$ ,@@ X( `$,,@PX  X( @X," ,@ XH PL # ,B, 0UP XIH 8!$0 @0B!$(B!@ !@P H2C$, C`CX$"B X", 8, ,,H@\!(@ @! G, DqCD8@C a% I@ $Hq8@ I?#0 (8(&90C($` H@PH@"Y@$pH`$a@PA!pq h @0~F @ @C Ha%%@ H$q`C$BP$B hPA!B 1@pq`C@pa%B` @!@@A ! H @ B`Z$a B @C`%H 3 $ I@ x^ H  H,@ % H0 `` Z!WC A!0",88C$ HP8BC$HP88pCH$H HR ,PpR H h,P Z! Ha%@ R A!0`",88CH4C$ H F @LP r C8$@$P88C Lhr0C @! #h@@!B` P@!0  H0 B 0( #m9!hN8Cpa%B… 8!!",$ @!B $ƒB@ @PU@ (T # D@ CJ H C J! \B@ x0YP D8B h@! qC`% H@$Pa% @ 3 $  `xF!B@YP2@@D B@D`@ ` Z! $`2@0H4pJ J HD8C$!H ( pP!0 0 Yx!P D8B h@! qh@W! A!",PB8C$ HP8BC$HP8C$pH C J!00 Y xN ,P D8B hJ@!` q@pF HpYP Z! I?# K  H @@ JH!H # @!a@XXU   , DH=K` X!!@ F @8 @CH$H`YhP V!pqa%H p\  p\,pYP`F H X,PV!p cpC$PV!P ,T"1H(L9ph r`2 hMyrp5k9FxspF%8@$PV!P , `FH, hZP`F H X,P V!pH 8Np 0N8`C$*@ Y D   , E B !P\! UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N(9mx@0H H0YP08B@CH HYPV! ,(@ @J! @ H # r0C$,P V!a%@*@D rcD C A! #Q@0(HH=b@ $ HP(@9BC$H@D ($00 BH` hJ0 F@BP$0, `H!0BB@X XB!2, F0 `$H PP T!@9C$ HD 0$0 DH`%* hL0 B@BP$, `H!BB@X XD!2, B `$H PP T!,@9C$PHD $ 0 (JH`U2 hF0 D@BP$ , `H!0 @XJ! ,@D` `$H PP T!$HPT!HU ]& B!fQ C@!h@`B5@C$,  H$@x ``xh$PH@A 0%00  (Jp)@7pCB9H P$0F@HXa% i@0X#BX `Y`f!BP88 Ca% ,DB  0 0 ,`0H  H80C4 9C $ZE@ VhHrC X" 0 4&9C X" @ 4(9pC X" P 4*9PC X" ` 4, 90C X" p X!0`h\@JV H`dXbi@ XV,pJX0C a$)y@ <X <!z,>80C <!0{2,0s) !PPC =r`)Y@8C8>9@8C BYx8`C @a%(!@ @@X H$p C $T  `8CP, H,@PX PH ( @H>9PJ,> 9P C<P,  Xpx@ P! $P #  X*80C TT `Xp@C+, `, X `" D (@ *!D@P@  x28CdT  B4h@C3, ,,X X,8 , (@ X2!,@P@ H$pJ`a%BUb `X`Y `Y?# $b@ Xp`Clh9B0C f H#>@@Lh9C`X! H YPr0C `f 0  V@4l 9C ` X!,( 9pC`f 0Y@ X#`5 XL#8@ V Xf $Y @p pp4pJȀ`%Y @X N!)e@`*F!Ph, 2 X X 2d0 C`X`XVp q X XNarpJ`%HX @!0( @` `X  !2, 0`Hp`%Z @ C N!*@XF!P, p\pY  \0 0`Z4`i 3F%(@@$ @`%!H N!P* @X F!P P,( KP0 `(` @h$@H@rhZC0$@"H $`0 `"h0 @F$ H0LP$`, P!`BB@X Z!2, 0L` `d!(@ !8!`%@,`:Xf!P8 C@$ @p$, a$j@ p\Pb@" J@ @," @}I ppCHB9@C H!’2,r)`H)P`C H!,xhT9ȨC8P9 @C 8$p0  8N8Y88C `%B` 0 pCPVH ( DpC$ +X@@X &0L 0L,@2$@HP90J,P 9@B@C 0$@ 0Lr 0L0Y xp@ ! $$# XpCX $B0hPC$[X@ X 4h h, 2(@ ,!dHT@ P(p`J a$qu@ :X :!t0 At)PC `%P H_ V!i}@) >P>8@C H$0 RB *@f8pC $@ j@(Y jY j @ (PCx@X HQ0,P8B@C@X H@Q0,Pd! ,(@ 0X0Q `J @# 8X8QN8J Ba$ K ! h%@ $ 90 ,`@@80 0 0P )`(PY@8CP@`%HB@R P@PPh8C0 H PDDp`C PP0Pp`C PX`Xp`PC,BP 4h/~F$ `XL@@JXF8`C$ LK`C $r @H06 PH`Xp\@3q@Pd!@p@E m@$PH@R$pBpY J@ B T0B P`!H@X R!0B `Yd!*BB P!0B P$B CP B!` H`Y L!#p Z!B0(\`` d!($@K@ņ H`%P0 @ $T"PT *@T H (J, Y HR@" @*@,T"@ PX@8$K 8N:@ B`Y80C$P d!0`% H`Y0L P L@q@d!@C`$LK`E $0 ur(a%@bK`Z p\@0 3f!P,pY(J PH\Bt" $BB $P ,\0B `%:@I` (J@ t 8P@,(Y B@* @ : d! Y H 0 @P@Z!@,P8 C@$x@`%HY f 0 0,P d! @D! , x  B  @A S @  @@ B`g @A,SHA@(@ S @H@xS @  @,@ , :B`PAgXAP)@X A,@xSHAPH@S @  ,@@)@ y @ " S @ @ @P@@( H9H Q @?#`8 @@` 8<0 x x@!H<+ P!</0C$<B`"@ ?# qPC $H`a`HPT!0B`J8@88@C`B!0B$P T!$0B`LP8B0C8$0B`N(@`D!0B$@LKPT!P"H` 0J800  H @  H! X ?#p(1  01@D0LKă $0 @ `A! 88 8 08 @$ (a  A @$AI UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N| X$A @(A P4 t 0) @ 8E" #p,tIXH Pp`%B`4 F0 @0,@4I@H HUa@accctx=stmdll.16(null)segmentation violationillegal instructionbus error %.*s0 0  0 M ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]FILEIO.C;1ɜT/>? HIJ U  @w 0k/ @00&Χ~ P̪~B w @ &j$op'O @ ~0'_"® k$h? iͱ'0   v v v v P$$~/  <D*Dr+h ~@" r r" >~$ip0Ԫԭ0$  "_&.~~p#ȫ@['`0Ԫԭp0/@      q tt 0 w~$tN0$)   0   "l"l"  yhPcH0P!4pD!s~sssstz '.0&i~~0~~0ק@sp`p3v vb0Pp0sssԪv ˾@~@ . Ĥ$*~@@ ? ~. ²z ppr˫t0aouN@%.F:FILEIOHP C S7.1-012open_input_fileundefer_inputdefer_leftover_input readbuf readbyteseek_zipfUzpMessagePrnt1UzpInput12UzpMorePause28UzpPassword89handler9?do_string?jmakewordjkmakelongklmakeint64lmfzofftmt,:.shstrtab.note$READONLY$OEM2ISO_850OEM2ISO$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.relaOEM2ISO.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]FILEIO.C;1UZPMESSAGEPRNTUZPINPUTUZPMOREPAUSEUZPPASSWORDDECC$GA_STDERRDECC$GA_STDOUTOPENR_IDDECC$$GA___CTYPETDECC$$GL___CTYPEAGOPEN_INPUT_FILEUNDEFER_INPUTDEFER_LEFTOVER_INPUTREADBUFREADBYTESEEK_ZIPFHANDLERDO_STRINGMAKEWORDMAKELONGMAKEINT64FZOFFTOEM2ISOOEM2ISO_850SEEKMSGREPORTMSGOTS$MOVEOTS$INSVELF$TFRADRDECC$OPENCMA$TIS_ERRNO_GET_ADDRDECC$STRERRORDECC$TXSPRINTFDECC$READDECC$STRLENECHORETURN_VMSDECC$__OFF64_LSEEKSCREENSIZEDECC$PUTCDECC$FFLUSHDECC$ISATTYSCREENLINEWRAPDECC$TXFPRINTFTT_GETCHDECC$ISUPPERDECC$TOLOWERFNFILTERDECC$MEMCPYDECC$FREEDECC$MALLOCGETZIP64DATADECC$STRCATACC_CB   2P A0JPW` cr@ `0`@ P5@5p"6,6p3;GOYbkv)8AN[dpz)DZ@UQU*DZ@U'''0#''' w'''+'`D'''P5''5I'6r'6'':e e e '____ _0(_0_08_@_0H_P_X_H`_h_ p_`x_ __x________`__`_______P5_ _P5(_50_88_5@_6H_PP_6X_6`_hh_6p_:x_% RD!02P`rI,I-I.!@BI/0@BI0BI)@@I11V. UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NJI0 @ @2 I1Q q  I2 I3B I0     ( ' ( ' I/ I42I0"I5I6I7PP2I8RI8pI6I7 P0PrI92I:2I72"I:I8I82I:RI70P2bI:I:I7I;bI;I:I7bI<I=I3I22 2pI/rI32 2XI/RI32 2@I/2I3bI3 ! 1 @ a b `q  ` I0)@)P)2 R)`p)`)I/"*IP*p*P+Q+++@,P,,-..0.@..I<.I=0I>128R1I11I?1I*02A22I 223I@B3IAp33333I/4I 4I4IB720@72(R7ICb7207IC72 7IC72"8IC28A8889I/I `(p0:7@A A8H@[p iKqMx y`0T$  ``ATT `@H``HJU` `I04V0 dV Z Z0 7xi#V1.0ELF 2 @@0)a=p@/IPF/VMS29-APR-2009 07:2029-APR-2009 07:20GLOBALSV1.0IPF/VMSHP C S7.1-012IPF/VMS *HA H @$ 0 @B`a%B B($p~F`PT!@K` a$@H$PH H 0 &@LKB *@B. `LK`$ H@="/ H d0 @$X aB@B ( `!Y@C  @$ # (- # "I # L(X # \0Ȑ #@M ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]GLOBALS.C;1¢S2  muc %%l%&"%p& 1tv% t""%s"_$""#@%.EpGLOBALSHP C S7.1-012globalsCtor,p.shstrtab.note$READONLY$CENTRAL_HDR_SIGLOCAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGFNAMES$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.relaFNAMES.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]GLOBALS.C;1GLOBALSCTORLOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGFNAMESOTS$FILLELF$TFRADRUZPMESSAGEPRNTUZPINPUTUZPMOREPAUSEUZPPASSWORDs UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N     3 p?M]m@   DZ@UQUk' ' ' pe ee' _ _ p_ % RIqr RRR R b 0P,`:pJ\nup| 0@p` P0`P  `0h `@``I ``0# 07 HJX  Vp 8 ^k#V1.0rELF 2m@@05a0 R:a0&aE0 Z:a0#7@:X:<x<@Q@QQ/IPF/VMS29-APR-2009 07:2029-APR-2009 07:20INFLATEV1.0IPF/VMSHP C S7.1-012IPF/VMS  #+3;CScscc !1Aa  0@` cc     q.@HY 0$@0 @0L0, E@`%H@aR@ 0"@8JK `X0!@X"H P  @D0CPa%0K@aR  ( @?#(c `CHa%K`H 0!@ H HX $ $  8@$PH!B;C@0 CPT p$@PH )@ B Xa `XH `!,` @" 8y` C |$Mi Cx|b9 C8c9p C }b, @a`C P!a%`Kb , @P )?#PcT,Ca%K. 1e@ .X \0 p\ `2h@0$ HH @!P!` y8 H$P!B !d!p_w@C@b00$H @!P!`p y8 p%(@P0 C`!, #E ` Yb p$ I ` B Ha HH `!,1 @ 8yx8 @b00C P!a%0K b & D #?#DcH&`Ca%`K( `1Y@ (X P* @P T,8@$P!B !d!pSw@C@b00$H @!P!`@ y8 %(@P0 C@b , I `!H"@5 `$ H p$Kp0C P!Pa%K@aR " ( X?#(c,"`Ca%PK`$ P1U@ $@X H& H L*8@$P!B !d!pKw@C@F0$@H @!P!@"!y8$ %(@P0CV p$`H B 0H  Hc  HH b!,! @ 8yCxe9@C }d, @a0C P!a%@K b ( D #?#DcL(`Ca%pK* p1]@ *X T, PT X.8@$P!B !f!pWw@C@d00$H @!P!`P y8 %(@P0Cb! ,  H  d,@v1p$@I b  B Hc  HH b!, 4 @ 8y0Jd00C P!a%@K@b ( H %?#HcL(`Ca%K, 1a@ ,X X. `X \08@$P!B !f!p[w@C@d00$H @!P!`` y8 %(@P0`Cb!,@I @d H"@ b$ H p$ KpR< \ B`b4I @f X Xi!iPC0,@HY& @$@’(10@@"iC&~FQ HR!H#`$!$ f & 2 Q $!2 `$ L( h$ L( p$ L( x$p L( $`JXp8C&0H HR! B1X$ @`2x@a$ $@I p pc@ RHp $v a$ @P l!^8C a%03@ fq@Ca$HHYd P8@(a$H XJ ,P8P B C H!`8%H`!0,@F HR! `ƚ ^8 @d@J a%00 @  q@CHa$HHY P8@a$H Xb ,P8P B CH!H($@($@($@@$@($@($x@@$x@(3 UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1Np ($X@`% JK@` 3@d `8 # L, U@ Ѝ8H( @`%0 P`%`8 @BH )@@`p<B  $ #B C@$X+@$@H` `% 0 @B`%JK@ H00 U@$JHd 0%PJ`%`$ E@%Z`%PJK * P  *c C b!a%K 0 `X -?#Xc\0`Ca%K@Ȅ2 m@ 2 X d4 d h68@$P!B !d!pgwCd10$ H !b!` y Jx`, $& c?#a@&PRPC b!Xa% K`Z $ , ?#,cD$Ca%PK& P U@ &`X L( 0L P*X@00JH$'@$P!B !`!pOwpCH$0$`H !b!%a0 <@&8JX`%JK@I d, -@ c?#s@APR PD #pC$@1B@b !a (H #@Ca%pK . PT +?#TcX.Ca%K 0 i@ 0X `2 ` d4X@0JH$%@$P!B !b!pcw CH$0$H !`!%a0 <@&8JP|d, +H@I a?#a`P StPC `!Xa% K`Z $ , ?#,cD$Ca%PK& P U@ &`X L( 0L P*X@00J$(@$P!B !b!pOw CH$0$`H !`!%a0 <@&8JP|d, #H@I a?#aP StPC `!Xa% K`Z $ , ?#,cD$Ca%`K( ` Y@ (X P* @P T,X@00J$@$P!B !b!pSwCH$0$H !`!%a0 <@&8JX$xX@@I ph5XiƇ p@R@C@$8"@0J$@!pC H!  $ a@C `!a%0K  & D #?#DcH&`Ca%pK* p ]@ *X T, PT X.8@$P!B !n!pWwPCH $0$H !`!%a0 <@&8(@P0`CXl 1B@q $P B`XXa?# $`D`b4`E@@fR(8%(@$@ L$Mi`C0$`,IP.0`"C,Ѓ1B,`,I,d,E @.0!X (@X dz !X (`X hz !X (X lz !X (X pz !X (X tz "@X 0"@ 2h # 6p # :x #>0J&4PC,1B`@ j!MiX X $"@Ja! 0B b !B7M$1BnP a!`  lQ B@j8Cj9C !p p,qPC o?# ǿ$Pv!p,pJ@j!@h `,  !`"@ l C `!0 0@C `!Ha%K J X $ P?#$c(`Ca%0K@" 0 M@ " X D$ D H&8@$P!B !p!pGwPCH`!0$ H !`!$  @0` y %(@P0pCX!@@I @$, @PH,,@XH P! ((P0H$ ((4@6y@C!`,  !PT"@(*% @@9C $a@C `!a%K Ȅ2 p\ /?#\c`2`Ca%K`Є4 q@ 4@X h6 h l88@$P!B !p!pkwPCH$0$@H !`!%a0 <@&8(@P0CP d, $@1P a?#)@@FRh4`C?#( C!@,@H$10L"@C #?#M #Ùp&!p\$ !b!|2 q &M"/ &M"/ &M"/ &J "!q`C$DB b!M #1L~ Jpn%@D9C $a C `!a% K  ! ?#c`C@a%0K@@ 0 @ @@X 4 h8@$P v!8;PC@C@p00$@H !`!` y %(@P0CHd, $ 1H a?#%@@fRh4pCX?#$C!0, XH"1 H"@C ?#H #Ñp$!`X$`_ !b!t2 q $H"/ $H"/ $H"/ $J !xqC$,B`_ b!H #0Hz Jpn4PBJh@ $a0C `!a%K  }?#c`Ca%K@ !@  Z   8@$P!B !j!pw@C@p00$ J !`!` y %(@P0CHe, $ H a?#%@@Rh4pCX?#$C!0, XH"1 H"@C ?#H #Ñp$!`X$`_ !b!t2 q $H"/ $H"/ $H"/ $J !xq@C$,B`_ b!H #0Hz J !pn0%@$@$@ ! ,PC}?# H|Pv!,p!J@$X@$@ ! , PC a?#  LJ$Pv!,J@$@$h@ !@ @, APC i?#P ǧ$Pv!@,@J@$8@ !` `, aPC m?#p Ƿ$Pv!`,`J`%JK`$ a! @ b!D1Bp HY!~F@ j #P a!p  n! B@d8@Cd9 C B!#",p8C`%H C $ @|H `Y !`!2, ` ` v! !p p,pPC o?#` ǿ$Pv!p,pJ@d!@!0$a B!0"@ bI?#,Y!~Fp HPA!i@l B !( QIxBBJp!qCh9C B!#",b8C`%H C $P @|H jY  j0 0` v! !` `,`PC m?#0 Ƿ$Pv!`,`J !p p, qPC o?# ǿ$Pv!p,pJ@h! @a!1Bb j Yp,Y,P ! !0 Pj UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N0,0PC g?#` ǟ$Pv!0,0J ! , PC a?#p LJ$Pv!,J@b!x @d8Cb, ($ A$ @Ip `B- pFSy C b!a%K` X 0 H?# c$`Ca%0K@" 0 M@ " X D$ D H&8@$P!B !f!pGwC@j0p$ H !b! !y" Jc?#$F31j0^@C b!a%K` P 0 H?# c$CXa%0K@X 0 M@ X`XX ,$ , H&X@0@JH$ @$PX!B !n!p/wpC@j00$`XH !b!`!y J a/"0@h8@CH$x @0JH$X @c?#$` xh8R`C !$a0C b!Pa% K@R $ ( ?#(cD$`Ca%PK& P U@ &`X L( 0L P*8@$P!B !n!pOw@C@j0@$`H !b!`2!y& %(@P0pC0, q AC Pa%)@ P(q@CXa$HY P8@a$HXh ,P8` B C !f!$ g?#qRJ`%@JK`n @ @` n # Hl!@H$x@d9PC P`%)@ P@PX(8C!B"H`Y p,|0WE"/ "WE"/ "WE"/ "WE"/ "WE"/ "WE"/ "WE"/ "SE +pJ $XaC$,,c,0 #CB`X !$2@ #/ #/ #/ !+J,~0@C$,B XaJ P`$X(aC@$0,,@c,(0 H"C$IB`X $!x2@ $GI"/ $GI"/ $GI"/ $BI +J,0@C$,B $X(a@"J $XaC!,,P$D| C"`EB`X "!2@P "WE"/ "WE"/ "WE"/ "RE +J,z0@C$,B "Xa J@`% B p $!@!~F$P880C `%P @jX@!0BnpH` @.0O"/ nO"/ nO"/ nO"/ nO"/ nO"/ nO"/ nK +pJ`% B ` $ a@X!~F"0P1P BC `% @ pYH8PC q?# $Pv!,J`%#JKh  @h #@`%#JK `% @| @ x  | Y,Y,P8@ H$ @!8CH^8 J a%` @ lq`C`% #H #z @ zYPX@`%0#H 3z ,' zYP v! , Ub(0%H@Pb @  , C H`%%@ H HXP$8PCH?# HOPN!,HB!J `% @ D@YH8PC E?#0 $PN! , J `% JK"  # @, 0UP Ѕ8H`x0 b0p<B`0C @@! (@ @@$!p$Ga! B@H@!PN1B@CR0B@W @R!!H`X$`0@D H:1  H!H # EH PR@PX P( (  "!( # R@X H @H  (!H # RX T pT  .!T #RBXR`p@AD  lBlJXT8`CR0BG PU?#qX Hz |"@ < B<J a! B80CJBL8@Ha!p"H` N  H$ qCX0 BX pCP0 BP(PC0 B00C ! kpJL B0 C L$PH (\q0C?#PW~F(P2 JLTBP0 C TL8$ ,0<9q`Ca!T$H7?# ,$8l>0"C<0( BPp0@C< @`p0 C@< @Ap 0C<@ @@ 0CH<@ @H0 0C  $@PJ *4PCP<0 B@Qp(0pC$Ti@x" J`!0T,`2D &H @00C@$(@@$@ !a3B @$ @!@$@` H&` #2@CT$@0C.PW~F.T$. xb .#\ ( ~ P + k(Q"/ (Q +JH*8@C .PW~F@ *8P #BAJ!Hf`!P v!@ H PCH !0 , f   X!(,@D ,`) # `X!`iJ !0,f(  !0H"@b(p!B&Ha.3B  *P # C!0L$ aL: ,@PY!d"@D U?#0 x,v yf!0~FP C !, z  |!  ~ a C   0D4,E @! B# \ x"yԀ4Cn!BpK(g C$$@I ?#P`,a@8`CX,\  @ iC + `q- $ T TiPC T, pq- $ T Ti C T. q- $ T TiC T4 q- $ T TiC T6 ,  T T iCn!d @I8p(0J4`CX,\  @ i0Cn!N @`qKJ n i` $p@uiGq Bl,u y  AxBx,PH@8p@q 1Y8pC $ HH  A @Ƴ$JPB(@J@ + CJ !`,`Y $H"@`n!, f$|m@Yh2 `9Y<X,( P\@ , @P$f( 2p]@Ht8 d,RS P!q # T6 | #U. @X<X P2 @!PB c(Q #HZ `iY&Y0C >#@{!X@X H0=H C@$H` A! ia@! $X `!Y' l0 # D&0B"@ D `0Ba @!$B@X0 ,@C  F h  @OGx UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NIy h,p0 0#  600B $I, y;<qpCpd,rH  P!T,  .p q) s.p|@CP!T,  .@P q1 S.p@C@P!`T,  . q9 #.p@CQ!T,  . q! .pD@PCQ!pT,  . q .p@J؄h B@0C $$ !HR  qC $$ !HR  tqC $$ !HR  xqC $$ !HR  HqpC $$ !HR  pq@C $$ !HR  |qJ !P,Y  @Q"@ (v!y k?#P @p(8J !,@F P!@?#~F@@ Xj- @ hY`;ِ< l qPJP( ~F jM @ hY;< p EqJP( ~F jY @ @hY9i<@ Є4 qJP( ~F j @ hYP9U< * \q0JP( ~F je @ hY;< x mq0Jf!0~F1J$ BR! z @pJ@W@!  !t t, PC;?# H:Pv!P,Pj!J@ $X@ !q H @!` (LB , Ub,  b !PC A?# $PH!,J, U (incomplete d-tree) (incomplete l-tree) N ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]INFLATE.C;1̐үS y{yg; <I k   >0 ժz!yy}&{ ȩ%b#x? rʪu1/  m%kkkk*~~~p~q{~ pzzz w~lp ~  ! (## g%ȭ%ʴh|&%/"yy¿#B .#o¿#B .#c,T#¿#B .#Th |h|h| h|{w yʴ}h| {u !s}ph|h|P0|0|)}{ {yw) fp}hªy x w }0 ##B gs##B gs}####B gs{{)j {{)j {%խ>  0  ~ ~0/  *V*V*>#0~%# ug0 jg}gppppe0pt0{z.P gȮ#i}@}(xy y:H8Vr8Vr (t&>0////0.1%z qq ^! 0}ն!ս#r~s%#}r#r#r#r#r#u}//////?~!e@@@@@{.!h 6?   u k/@%.QINFLATEHP C S7.1-012inflate_codesinflateuinflate_freeuyhuft_buildyhuft_freeУ,Q.shstrtab.note$READONLY$$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]INFLATE.C;1GHUFT_FREEHUFT_BUILDINFLATEINFLATE_FREEMASK_BITSINFLATE_CODESOTS$MOVEOTS$FILLELF$TFRADRREADBYTEMEMFLUSHFLUSHDECC$FREEDECC$MALLOC  3@ 5@Q?<J+R:_DiwDZ@UQUDZ@UQUn''':'< '@Q''Qe e e '____ _:(_0_:8_<@_8H_<P_@QX_P`_@Qh_Qp_p  1 ` BIII2II IB I I I I I !   IBIIrIIIBI<III!I"$IR&I&Ir'I'I(I<(2)IB*I<**+I+Ib,I,I2-Ir.I/ނ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NIr1Ib2I2IR7I<r8I<8I9IR:I:I: ; ;I;I=IbCIGIPIrQI_ P$0Q#U/-0U4@GpxU`]a e`0d$  s`0U Tdx `^`_d` `_0,e0 \eh f {l#V1.0%ELF 2 @@0$,0)a0!a2`@`PXP`x-IPF/VMS29-APR-2009 07:2029-APR-2009 07:20MATCHV1.0IPF/VMSHP C S7.1-012IPF/VMS ! p, (B!`P09B ,@ H=0 X!b"f0CBB@!x@F9`C B p0C $,hH P@F9C @ p C@$@H@B HPX8C X.rPC P!+,D( CP(H H@H9p- r`]*9FrpPC P(H (  H(0PJ P!x(8C BLp`C $,`@!P8C H 0 8J@$h@$BP(! HV! P@ B@H 0 2 @! @HD8@C($ B  (J0 P8pC H$ H(, H HX H( $ $(PC J 08(pC H$ H(, H HX H( $ $(PC @L (B8PC B 0 (  C HD HPX8C`8C X$ XD, X`XX XD , ,(C 0J 0L8(C $ $, `X $ 0  (C @D (B88J0 8BH @X@ HXXP08BJ@ HXPJ , X8 (JXL HXXP08BJL HXPV! ,HB HXP08BPJ0B H0YP0J , XL8 (0JPD HPXP08BPJ0D H0YPV! ,8H$BP V!0 8BX @lG9C (Bp7 @0@PB@hxM9fk)!`(Y  08C@8 CP!X@ XL.r CP$(@`t90C 0H  " 8J LJr(@!ph%r L1 BC D"p&8C @R r0CP$0 HRPL%8@(9@CP$~F 8@)@PL%@ HhPC $`X0  ,XqC $ .`, .X `. p\ \(pCB g (H0@ BX$P08BJB HXPV! ,  g (H0(@ @B @!,@89C@N8!(@ 8@ @iC `h@C $0L0  &LqC$P, (@P @P,RD (  s shP~hP&> 02~0SQ"&pp? `p PnPn0  &s&~&z 00 k#@ v s  @@0@=0])},7Xj\7IStk}Ud1em8#@\hv]8(dS,DWg{h2 p *8E"0)@a!o:rQ)tzS"@Ppe@e}"50P,a0d( };Y0na yXVJ`F H:KrxU,[Q%%e1C|F}sUt.cdLsi:gZ(ճ<,zm$vEYdBy:C@g[v)4 AO a"Dp&$y[}*k!i[+ dq[Q 9rJ&&)0Q]}Pì4CՓ!CI<%jDobGm_'/Ċ}-C))/4_]j3lPWى]慾;g/n0`F ܿ|lŅ MB7A猨UcBe$@^qBh$T%^\Eփ_n? J9Pǵ+Ç.CHq] U7&~,ONdGf!H!HGb:*P'21Lg[#lABH7#!$|~T`(A1`K-'7=F(+* ,>fV+ ++2_Q@mP' %["Rdx`WdzJv1v3b@q#X jyUs<`20Gr6/+q9K5, 4 EIOᨍ BBGR{ ;` "$.씳9`ZxKb{ 5(t}cb꣘J~Y) Q A< I8H!w~ u!:7O,P r?E`Flp!P_\&f` W!A)~(|muaj>d<e.-,(Zl9a"PpnS(ze=(nvus fA~!.`!Ejk ]03;@f uk 4S+)J@?]bhG;r&h Le_C4ʀo;$n%Q_!tno?S1b#!Pޓ UlptGX}b,_*75h]t]m}VAPE(R2z$ڑڴ&B82RO򙃚4(-N 馨eMO٧(C-_u1@Z" AZ:KjsUsN1TB&6ui>h uQ3 #e>`!$ :Q!7Umӄ`qd8[T spЈ<#NQ/OF(;;SWfTj.ҘwnN)S#u_߫J "\+L;Oceo̡̅#*m3\/?+zѡ4,X}+6h6b Vc li4Vv,I92h!1!Ŗz,q}_-/F[T?8Rz~8.$?1H8y}hlMVm "æ;&#D4+G14t B!.lTM.vvfr/xK_E:W=-u$.O&)V( ntG8Y{e=`#8 D8 {4M3porOWZs|S`POcc\ڙ]>(wA(W 3)g6v`lt!'oB,hG4_-;us^̄ź5__ڧs8Y5Ǿ\)z`[N%Wg+\mtc^closKpYLZ}refH4A䂡 1@i4PwNJ@l%%yM7I\fi,J /~O dB 0yr!Cnuwj,H~/NQĞu~OR*Lj ƪ8JbE{Jz]0PgNAjEN e_/V9ƃ C]׮MJABUD ^ZhED5&#`}suK}pSe77vsfjMg!koѤޱTT\ヌ> cH\h\ze L@oq8AjB&LO4 `oA7|;Ѱ3apWY&vCWXB1szth"ШZB ^s!xݍf&?EM| Um<pA@i[us~ W xK8;wum\ ,moeeHj1!( nE:8qC-?Nf6F'$V 2 &qjHLRwu@X_Z 8 D]Sxm)#Ȓ. SljE=7 wG_BD(7j Y +ЄHt%E(pQFr *03 ` >E]f+k5~/Ni:d%/A &Bl.?OMV_q9C4/TOB~#ie: k0*T6ҬU=XVvm8u9Vhptv7hQ^'8;1uW6ϐUJה=Ui/!^j-XQLl ?:+! >l52b0<#byOj_ ܁`S [S"a7 =* QXoraGco i"}-9KaB \ӟi# rGaKx=9?8bn~xԪf"%T7>xŋ섒w*'-N!d+vk)X?a~By!Sf80 HFCy6rO_42N\/i1Eی[BX&fp;K)|G@kMek7lTkJ600ufZ hXvW31\ ue|nm'\heSc7f|Vj\xF'L#o5kqf{i)ȟM,k.ĭ.K$hv;0 f#F }˚͸;Dzuyl83fxe:QUOmL7lC4)/5vcϮ=Xa jeNi + j/xS7%@B7t\pgQ,LY l;'ND&m@8!sR5+h%C@\TSRwNDAVBTH2~ Ȼ}}%a8@bf4XNvXD?$3 L5aN5G Z x&K HA3h&6!v'EC8P ˕D@DGq#9!Jl!4q#`N$1C@3-iDs<0 @X@_XJ7Dq `:P&"aeH($&%0=i }H( ZưD`.Qm&4p YrS2*dfoO< $_S/Ɛaf=rRy/ q=z Ȃ i OMA(şA1fԦŵ~1a)GQ|7 \ LNL@x acQ~0eVF? 5 H1A@V)6Ɵ6 j1Yd@?#! ,o6p%S+cxS=0 N}? ;r+fI,p@V%(c 1A8-Pb)d`#i 4FA-[ Q.} pCc2 0!ThC `WD!/@#*(cVBcڧ͛*U,Cf2c@q(LV j"T^Pp(h! ΢!G[wxZ)=I=l & n ,g*{8Oq㙵&=(0HyGA@%C)##f Ey5zxCnF#9rO!kEb2V{tci3{\#֩CQÅƍ}:|# 4'CQz"ǁ7_ͬwEt´h_L qbI?Quh'ҶSrzjH @7C/pv4~GMvBYnY+.m"bgZr!)Ȫs!.38K; :IJ&qf qNw-͌x=C@GP)h"h[jgb.u _l }(jL-V~&Ѧ$YvYWcZc eu *,WI#& H)6(PKsOUoղ7M)I@WMP ;VmbKN8脨䬂 8@]@\DDe]~Mqal.!fB{L~ʑ.swVZ3m,A][2:<ӽ|p4b}5#|lUj`"5m-tqJ"E^+S^}]PGTn|&PxyI$k`0MD$[8x<%iK+݆])XSC"JX$ɂƣ;2(%7YFF^<_j{!+D_LYwEމ:T>{:Q){&y|E\D{gz hK#-o:,fa@{[j=.rdckRgsYѓ6&CK?lp EHK0e̼Q` UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1Nu@ /P.y0(@%.W`MATCHHP C S7.1-012match`recmatch`"iswild"$,`.shstrtab.note$READONLY$$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]MATCH.C;1DECC$$GA___CTYPETDECC$$GL___CTYPEAMATCHISWILDELF$TFRADRDECC$STRLENDECC$ISUPPERDECC$TOLOWERDECC$STRCMP  1CU`[Pbmyi''`'P''`e ee '__`__` _P(_0_P8_`@_8"I`I`I`II` p       P ` I2IrIIIIBIrII 0 I I I I I` I`@ A p  IBI    RIII` `#-4@PGpHU]0 e`q(H ``[p` `p00    n#V1.0@ELF 2~@@0 +a 0#aq0 ,a0 )a0 )a0)a0/a@"`"6x6==@@`D`DJ/IPF/VMS29-APR-2009 07:2029-APR-2009 07:20PROCESSV1.0IPF/VMSHP C S7.1-012IPF/VMS error: cannot allocate unzip buffers unzipsfx: cannot find myself! [%s] warning [%s]: zipfile is empty End-of-central-directory signature not found. caution: zipfile comment truncated error [%s]: missing %s bytes in zipfile (attempting to process anyway) error [%s]: NULL central directory offset (attempting to process anyway) error [%s]: start of central directory not found; zipfile corrupt. %sfatal error: read failure while seeking for End-of-centdir-64 signature. This zipfile is corrupt. error: End-of-centdir-64 signature not where expected (prepended bytes?) (attempting to process anyway) XMH@` h!`8 @@$"H@Ćp<B`Ć a%fPZ! H $0 D 0 @" DPF`@q h H0,1$I8C($pLKD x$P0 :x^HU2 N B YPBB C $BB xD! ,( B`@$B@0$pH@ -$`0 PH  (J0 #LpH `%0(8NÄB  L(#3 0L0 ((@ # Pp ( (J# K", N a",H`NHq t\Cd HD|\bKr hb # p\pYP8BPCp1`%@H $ @ H E2,P8BCa%`K` !0 @ F0@ @8" BD8CHa%K H )@ HH(0#P88 C0 $x@$P88 C0%$H@a`% bK`% H`%0 @@Pa%%@@R F   @0$0#@a F!) #0! B`CpA`%HX x! @ p\pYPpA`%bK` $ @z B p\ ,pY ,P``%K h )@ @( # X 8p CXa% , X  E@ X`XX H, Q'~FH",i C $Nr@C $#H(p$!P88pCa%`K@ %@@R $ $,`X ?#  B0H$ Q%x@Xa%aK`B a%-@ & @ Q@@ XD &D,`XX X," , @,(@@$~F@I p1 0 88 08 @$ r(a P(A bA r A X, A @$a b(a P( A r8,A b$a P( A b@$a 8, A 8 P4 t $ U @xD b`^!CpA`%HX p\  ,P`%Kņkb~ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N; $0 @rx^ , h   x^xY,PHa%0, hH p@ q  CP$@Xa%0, X  E@ X`XX , Q~FH",i0C $Nr@C $#H(p$!P88pCa%`K@ %@@R $ $,`X ?#  B0H$ Q%@Xa%aK`B a%-@ & @ Q@` XD &D,`XX X," , @ ,(a%`K* ` Y@ p*`X `X,pYPx!XB !BPZ!8@ `% a@ 0D q  E?!`` 2!@R h,)]9@8C؀`%K` pA`% m@p\ HX 6 @ : ,PpA`%bK 3 @$ @z Z!  x^xY,PHa%0H hH @ q CPa%K@R X ( (, WD(i0C "Jr@C $#H(p"!P88pCa%`K@ %@@R $ $,`X ?# B0H$ Q%@Xa% aK`B a%-@@& @ Q@` X H & H,`XX X,$ , @ ,(a%`K H* ` Y@!J XF8T F,,BA"pX,Px!XB !BPZ CP$(@P!pC !(q-!D8CB!!HD 0C", `2 `q@C0`%HC `% m@Cx8H6 H`(t<l,8 H>lB HYp^! BP0!B 3 pF!B@0Y , D PHD!0(H 60 $$+@RxJ!,  pH!P$#@$DB R0  ` Z!`%H(F H %F0 P$0,  xJ! 0 `pH! ,`F` `Z!@(a%0bK@ $P @`D 0@Be (J 0 aFP,`Y F `Y F  0#P8B CH$X@$P0B % HUHR 02HP@ D HU Z!@ # Ń !$PHR @@  pF @ # Z!0RHHR P@ D HU Z!@0#  1$PHR @@@ $*@ h RH@`%P$ $UJ Z!@0#@DF P$ $U Z!@0#@ (!PB! ) hB p HaB`HqH% Dp Dp=Y@8C$ H@XP8BCH`%0"H $ @Ex^P H@pHRP$,  xD!00 HpH! , HR` ` Z!J1 CHJ!@p1M!P80C 0 JBH!X@a`% K (F @  F 0  F 0#R10PCpA`% HH p\  ,PZ!X @ !B!P (aBq]8@8PCpA`% HH p\  ,PZ!@B!PBB` DP0 ` D  0# CH`%`KA $%@`Z!B HP, DBP, HYPZ!!H @ J!H0x^PRB C $BB0 xL! , R0H`Z!H@(a`%`K%(J ` @ (J`0 8J8 0c}H@8C`%cK E x$0 @pR BK 3 00 p``, J  $YPL`B C $`BB xJ! , LPBK (J ` @`HRB JH0#``% B` D0 0 @  1pPCP`%BB A@C`"%@@R H8( P(, CB! H  $",  $0D0 @X x(2HB L LBp^! BP8!H@X xD!B h ,@d8=N!PZ!zH $0 P=D!,8Y xL!#( pH!0@0(J`@1`%H 3 pL! @ x^ ,PJPB  xL!PBB pH! , J$ @a]@F!`pA`% H h 0P! @ p\pYPZ!@(`% H*pJP 9PCpA`% H4 p\  ,PZ!@8CHA$HE pR BP8@C $#H8pD!P8C@`%PBK @P P @ pP0#P8 B h] 8pC0A$HE pL BP80C $#H8pD!P8BC  $(`% H*pJP8` B hPCpA`% Hr p\pYPZ!@$PpA`%@@a  Z! @p\` BpYPZ!X@ R9C(`%cKD $P @x$"@ C (J0 p `0 (Y,PJPB C $PBB xP! ,  J` Z!pA`%pH p\ qB8 p\pYPZ!8@%$bH KP!`B0L8C$$`s0!L! BCH`%cK  @a$%@HRHB 8 3x^,@pP$p,  xD!@0 8pR! ,8N`  ` Z!P, a `!   b  !"KP$`*HH! P H!H @@ B Y88@Ca%HPB B B  `%0 @ ((Y88@C!`% HPB B B `%0 @ ((Y88@C`% HPB B B a%0 @ ((Y880C$P H! a%@ (B(Y880C$P H!a% `K    # @0`IH  !`8 @` B@Bp<B @b#~F!x@pA`%HX x@! @ p\pYP`%K 3 Q$0 @rxA!B  ,Pa%p s h  @ #C!B! H`A PB 0 HC0-@ P8H8@C0`% HB `% E@"x$0H" HL(D,( *DB Yp^!`BP8!B( $B8Y , (L PHJ!0(H 68 $$+@RxF!,  pD!P$#$(J@B H0  ` Z!0`%H0L HL0 P$,  xF!BB@X pD!2, B `@$B@x$HF pA!0 P88 Ch@0$@0B $"@`0%PpJ PK  !B*P$"@@Z! P(J#~F hH8p( @N 4CB!PH A 1CP0 C*%@`@8h8@CP0`%H@B `%)@@R; UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NxH`P HD$(,8 &(B@Yp^!@BP0!B 3 pN!B0Y ,  H PHH!0(H 60 $$+@Rx@!,  pJ!P$#$ H B D0  ` Z!8`%H8N HN0 P$,  x@!BB@X pJ!2, B `@$B@pA`%HX xN! @ a% * H pYP pA`%@0# 3p\ Hb Z! ,P89@ # hC!B!@H A B@0 (C"%@`P8H8@CP0`%H@B `%)@@BxH`P HD$(,( &(B@Yp^!pBP(!B0 $B(Y , 0N PHL!0(H 6( $$+@Rx@!,  pH!P$#$0L B D0  ` Z!8`%H8N HN0 P$,  x@!BB@X pH!2, B `@$B @ $HF p!@0 xH!P88CpA`%pB~F 3 (`% @XxN!P @ p\pYP pA`%@0# 3p\ Hb Z! D,PZ!0KC$0 @ @0@ P0 C !B! ( HCH(@H8@CX0`%H`B `%-@`x" HX HH&,,( (,B@Yp^!`BP8!B  $B8Y ,  L PHH!0(H 68 $$+@RxF!,  p@!P$#$ H B D0  ` Z!0`%H(0L BLP$,  xF!BB@X p@!2, B `@$B@ $#H p!PB!p q h 1C0",  q1Y8CW! H0`%H B `%%@ xH@H H@,"$,0 $$B Yp^!`BP8!B $B8Y , L PHD!0(H 68 $$+@RxF!,  p@!P$#@$D@B H0  ` Z!0`%H(0L BLP$,  xF!BB@X p@!2, B `@$B@W! 1`%0H@A X`%@ @@RH H-@ $@, B B x@,PP!B@ $B PY , @R PHP!0(H 6P $$+@RxF!,  p@!P$#%@P@B H0  ` Z!H`%HHR BBHRP$,  xF!0 Hp@! , HR`@ ` Z!(A$@B1B pJ P8 D8 C@P`%0H PT "@PPT B hH8pP 8@`%PH  P%0 @E*PF B hHT8p!#7@@`%PH @P "@P@P0 B hH8p@ @$PK  P @gp!P(J B hHH8p(!#7@H$0@1B $0$@*p!P(JBP" HpC jixp@`%K@ @B`Z 8%0#009(PC`%`q "0C a% I@ ($ `%0 M@ &qPC`%Hq(0C a%P U@ (* `%` Y@ ,pPC`%p.0C a% a@ (0 `% e@ 2ȨpPC`%p@40C a% m@ (6 ``% q@ 8pPC``%@p:0C a% y@ (<PC`%@p >0C a% @ (B, `UeXH5H@` $`8 @ `$<0 xP!<BP8B0C @$p q@ $0B a I!00B  H`ZKĀ @ `Ѐ D0 D*0L p"@`@ J# AN H 00B@ X   Bda%PT!pBH  XL PH 0A$P0 B *@`T BKP$@ P D*@@ 8Q$P$@ P F *@`  a$P$@ P BK`T0i$P$ $`: T!@0#@D B pHP$ $`" T!@0#`d D @HP$@ P B0*@D %P$@ P DpBK@0L P$@ P F@K`$8N P@ B H` T!@ # d H P$@ P N P$@ P H Pa%` $ @!P* @ PJ!@$ H 8a$00 @ D@@$:  @  8N8Y 8N! + Fb }!p+ NzXDN B H@E$sC 8N!,`D5C$(,  X$@x ``xh @@. pBB FNH@10C A@. pBB N `%  @ D@AX@0(8C 8N!P,p*9XTr@a @*pG8PC 8N!`0  <-,"`YB ZN8@ 8N!0  |1,"Ŝ2/&B: @!i@ Nh q!`N lN , `! H5H@` $`8 @ `i$<0 xP!<BP8B C@$@$0B a Aa% 0  @PH`$B@@  F# aXJ pK`D $PT!@BK@d $`H`()$rH 0Lp2@`d H @#Ą P$ @ P Fp2@` I$P$ @ P H02@ (Y$P$ @ P NpKd"a$P$ $` T!@0#`$ 8N KP$ $`* T!@0#`dD P$ @ P N PFB` DppC a$pbK a%@2@d:B 2@ H Y aH!P", NPB0( B0  @`%,`` 0L!0 0  LHUb@H1qQ@8b@0C $iC$`K g F$BP$ H01 T!0 @X!PC?# B@ P8 D4CN90CPa%@KDP %@ P$0 `(J8Hp,`CX$ H X p@P a%@0# B Ha%K 1J P $0  PPp(G8pC$,8X Pa%K P %@@ @$0#  Xa%-@ XX pPC$,8X" Pa%B`0  H`%%@ HH qPC$p,`:8`%P8N B ND 0 H@IC?#@D 4@J, HU xM$B@!f@% @8pBQ@8CV3 UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N`8(qFJ0xpC ($piCH!qX%tP`4|F JxB@h`80$B m)8$ BP$ HX1 b!0 @!PC?#B@ 8 Z4CH4X9PC HT$`%qC PT$`)qC XT$`-q0C$ H8$!@N8C8$`2@@XZ8p HdR1]X@8C@!@ H A0@ 0& 01PC $hUiC$ +BP`!J @)H 8X80C@F!0C0T @ @! H!G"/(@ 0M,"C HL, $qC `(!hipC$@P$(!P J q` b! qH@x!(@ H(@ 0M," PL, (qC X(!h-iC$@P$(!P`!J q  HXp C0M,"h@ !H!G"/H@0M,"8@H $a`J(ҪYJpCP $ H40 P`!J B`0CT B(@ @!P$ HD  G"/P`!J q``1 b!q`HHp C0M,"(@ HZ HhIC?#@D 4J@L!(@ @!@XxU (null)Empty zipfile. N ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]PROCESS.C;1⳱T"# љ,  po%"r@Bq?Eq|{{<@?D;;}D}B , v" g}7dcddzczd @0A}ʴ2}{x!g10.A}ʴ@ gsz_@}Ai@"mmmOm    0֦b  w w w2 g#"%""#%7Jv w0 ~  uy(0%1@t~ O@ȩƪ"1 }% P ʩP }ʩ2! {t {{ ~ }niʩ?  uũն?00 0}0}"  llAOgP%&wx x#}yg!ic?g@ zNcukk0 v@ v#gkupj%%/ x{{x.0.0.0.0.%./  /%{{z&!w"z"z"zzz" "#"##"ת"קէ//` 0#" w? 0  s s /&zz{&#!#!#!)(##}s%t.  p rtr#s"@@`0@0@]"^ z/ o&f@ ~7~9#Y~~#sq~"M~g}c('֩%}} jw%}} j~'ի%=s#fy"k'}} }@@%.JPROCESSHP C S7.1-012process_zipfiles?free_G_buffers?Dfind_ecrec64Dmprocess_cdir_file_hdrm{process_local_file_hdr{getZip64Dataef_scan_for_izux,J.shstrtab.note$READONLY$$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]PROCESS.C;1LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGPROCESS_ZIPFILESFREE_G_BUFFERSPROCESS_CDIR_FILE_HDRPROCESS_LOCAL_FILE_HDRGETZIP64DATAEF_SCAN_FOR_IZUXREPORTMSGOTS$EXTZVOTS$INSVOTS$MOVEELF$TFRADRDECC$MALLOCDECC$TXSPRINTFISWILDDECC$__OFF64_UTC_STATCHECK_FORMATOPEN_INPUT_FILEDECC$__OFF64_LSEEKDECC$READDECC$MEMCMPDECC$STRLENDECC$MEMCPYREADBUFMAKEWORDMAKELONGDO_STRINGDECC$CLOSEFZOFFTSEEK_ZIPFEXTRACT_OR_TEST_FILESINFLATE_FREECHECKDIRFREE_CRC_TABLEDECC$FREEMAKEINT64  3AQas@ p6=`@`D`#/>E[hx%4>DDZ@UDZ@UQUt'''"'6'='@ '`D''Je e e '____ _"(_ 0_"8_6@_8H_6P_=X_X`_=h_@p_xx_@_`D{) UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N !__`D_J_RIpqII  I I!I"I#I$I%I&I$I% I& I I I$B I% I&2IbI0rI'I(QabIBI)I*I*I*2I*rI+I+I*RI,rI2I"I-RI-I.!02I8!8RIQ2 R2(`I'I(2Ia``I2I-bI/I-I)"I&rI/I)I&2I/I-I0I- 0AQbII-88IBII1I2 2 I3 I4 I4R!I4!I4" ""I$"I%!#1#a###I'$I($$$I %1%B%I&%I+%I5%I+A&Q&&&&I'"'I('''I(I$(I%()1)P))I')I(q***I*++I&r+I$+I%++++A,`,,I',I(-I.I&q...I'/I(/IA0`00I'0I(1I"2I+b2I+2I53I53I53I527I)p778I*18A8b8I*8I+8I+8I+"9I+R9I*9I*9I*9I*:I*B:I+r:I+::::;;=I)=>R>I*q>>>I*>I+?I+B?I+r?I+?I*?I*0APAbAI*AI*2BI5BI5RCI5CI+bEI*EI*FI+GI+HI+RII+II+`\ p J#O*-P4@GpU`]H]_ e`d0  s`P d `0[`P[e` `0\0e0 (f  h Qo#V1.0ELF 2 @@0 )a~0 )aE@`-IPF/VMS29-APR-2009 07:2029-APR-2009 07:20TTYIOV1.0IPF/VMSHP C S7.1-012IPF/VMS SYS$COMMAND HMH@` $`8 @X$,X2( UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N0p<B@`!PT!p ( CX@! 0B`a !0 b0$ CHU D0# cH,X p!:HXJ,PT!p ( C@ 0!  * @ P@8!q8N0C!\@D8@!pXD F !P0B`a H1B@b 0$0# U CHhY1BXp!,5 `XPT!p ( C@ 0!  * @ Ph@! H  @U,PT!p (C!B , HUd@HMH@` $`8 @X$,Xp<B@`!!PT!p ( C@?#8@!!0B@a !0 b0$ HU B0# cF,X p!ЊHXH,P8!`B2B@P 8N`0 @$p*0U TQB`0YP88 ( P840C ! (@ @?# , HUd@7L ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]TTYIO.C;1͜SGʚ'OϤvwx~ llwqrl"Ԩ~ri'|N yyɳpzv {vh p@%.KTTYIOHP C S7.1-012echott_getch ,.shstrtab.note$READONLY$.sdata$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela.sdata.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]TTYIO.C;1ECHOTT_GETCHELF$TFRADRSYS$ASSIGNSYS$QIOWSYS$DASSGN  16?JU^''''e e e '____ _(_ % *BIIII*"III ` #* 4 ;@@Np0\ id  l` ;xH 0 ```Ox ` `0 0     CHp#V1.0ELF 2@@ /IPF/VMS29-APR-2009 07:2029-APR-2009 07:20UBZ2ERRV1.0IPF/VMSHP C S7.1-012IPF/VMS fM ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UBZ2ERR.C;1ʇ͚S"@%$UBZ2ERRHP C S7.1-012.shstrtab.note$READONLY$.strtab.symtab.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_arangesENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UBZ2ERR.C;1 e ee @`3$,`j8`pF`(RH0c` rx ;s#V1.0 ELF 2@@)0$a0 )a0 -a0 )a0 &ac0 1a0 :a0#ay0 )a)0)a_0 %aT0)aq0 )a0 )a0%ay0%a0%aB0%a40 *a0 +a0)aS0 -a0&0 )a0+a0 $a_0 1a0 )a0 )a0"a,0 &a~06 UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N3l?'a-0"50)aX0)ae@X`1x`1 5 5p7p7==LLNNO0OQHQS`S`V`V [ [ffiiplplmm o  o8pXpPxPММPPо оp@p`@+IPF/VMS29-APR-2009 07:2029-APR-2009 07:20VMSV1.0IPF/VMSHP C S7.1-012IPF/VMS JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECSYS$OUTPUTDECC$ARGV_PARSE_STYLEDECC$EFS_CASE_PRESERVEDECC$EFS_CHARSETerror: invalid response [%.1s] (EOF or read error, treating as "[N]o extract (all)" ...) `B 5 H`HR9HX (!`X,Xp,XP, H@ J! s  (B1X C$H $l0 0H  *0H0  L( l# ( 1`#X* C L*0$ AHB %1!yL 1 C |0@$!H $@P 1 C H6P$H PT xV0C$H 3 Dp0 Y 0D0YPBB 0D cC$H@ $0 B S8"`, H @ 0( P0 (HX   ,@XP J!,@HAH H$ 0 pHHp<B@ h$ `y1`%,Y !PT!03Bd (?#H1!p1BB3B@DPH ,  LB P @( #P!! H`a T!@ #P !p ( PCX1`%`H@ 8`%`0 `Z(a$ $:XV2@ 38NH`XY`D PT!"H `$0HXV "B8Y (F0 (!P$B PP!B 3 `J!B`Y , F P@D!`( pB! b$Ց$n)pY $ H XL! H + JR$H #@DDpB X N0 `T!,`XFP@$@(! H`a(JP@ J9`s PG8C`%bK@ $ @`ZD`"H`I @ $2 $H`XY`F PT!"H `Q$@HXV `BY (H0 (!P$B PP!H@X `J!B P, d F!PT!JH` h$0 PC!!H `N!#XD!, A0 ``@$B(@, HUe@ha BH !`8 @ @@<0  `!8 CP$0B BB C c!YP C s @8C($ s(Jp C0a$pBK 88` @: 0Lp N8`,214`0  2)=Px@0CH8p$pCAB! ) h80",H0P 880~F F8 qki`9@pLy8P!B`TQ! (D0R8)N ,qX $q`0%P8$`H4aL8(qM8p0G0LPC B C0#C$@H 80L0 (#Hc`@p@? &P < ,@YP08H@@ aK`` x @0PJ!~F/ ^!W"/ K + J`C0H8C$PqB (K!/ P*/h@ P$PB +JP/8@$PB J/$H` $h0 , HR@B@@!L>#0~F 4@YP J!BA( H # T!B+ ! #P qB!@ # x C0c@C J!0BxFP (K!  J@ #@a%H. @ V/ @`/@0C (K!  ". / @L cC$PH (J!`X0 @s+ *`0PB`c+ ,PT - 0@0( P. h# `WJl# @QJ@CJ!HC( :x@ t>a%P–B%  ` 0 `@@`a!@I J&RJ~F @YP P8@ B xC$P!F @ BC8F9CF9CAA?# H @Y `!  H. O"/P !Bh@P !H@@ $@)P@$@(!@`(CH$Pp`P $0$0 fd2c !2 BP$B xP!H@@X F!B@Y ^!D P!B@ P$BP D!,d ^!#P (K!  R80CP$, TPP@$@@CJ! HD( F0@ HxJ! H M=# #P P8BC$@LK`D $@ @`H@F HPHC @P^!#H $ H@` p:B@ 0D 0 Y}0!P$B xP!H@@X L!BY ^! H PH0CB C P!#@YB!0 HH  B0 0` ^!P@$@P%@p) A?#2@@D`J@~F `J'"/ J"/ `J5"/ @J #0C $0#$(@ $ L0  $PT0 @ WD #@8bpdCAB!p CXqH4CX8Xq JY `C a$p ]@ .X .!p\0 p!\)8Pi8I8,18 B@080C (J!A2,d)P 290dsA CBp!@8C$I` Аa$00 H `% m@ 5 0a$l 3@$Ku@60L P ^!`0 @D8$@p(a$hN`2@D @(c@!P@0T`iaD H 8b!00#uH,PP!H@@X N!B x ,@PT!P^!sH $ 0 PD!!H` R!# F! , C0 ``@$B@ !@$ J`@PH)Y UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N`N A?# B@0 F"/  T + T@H + @"/ J@ #`C29C$ H 4 H0  P1T!ר"/HT@@21`C$@HD 4@P0  P1T!0# kT #H@$pH 4p\0  P1T!ר"/\T@$H  aK!l0 (8`B K@(?#"B 6pp  ,8YP^!H@8 !K!@H(P ^!@0 `)$HA+ 0L 0 PTBP>HNpB  #@+  #`/ P^!0`B ( DH@F H HR0  NP #P^!@ @C$ , DP@$H@QB!H  $0b,`XR! ,`Q P!~F`@P^!0 (@C$ , DP@$@8$ H`( 0J!p0 `F`B!@H( $pB C @/@ @ , XO,`8 6  (0IL@ n@@APB@ 0(P/ 0(P/ 0(PP# tN`X0+ PN0C 8YN!   d. / H, `$q0C 8YN!@  h. /(J!K a E?#`#",@a!|FI `N!",bQ?#p^) "!@f{SP,$*` BX$,X 8aN!\0#@ qS?#F"/PD@ (`@ H0 B x8pCX! 1B $@`!0H (H#&P!F  B@C0F9`CF9C8QN!H N0$@ `NH@8QN!H XNXD@ `/N@!@1B@P*`0Bc!|Fb qEX0# .P,X$,X0pCBGqS?#HP P!(@PPT0 B xKP!@J!yT1@C `%J< HY R 0 @ 8QN!K HNH(@$NX@H $)@5P("P@R!@0(`C8$ H` L!0 &d2Bc  !P$B x H! P@!B 3 V!B@Y  ,  P P!B@ P$BP H!,d ^!#PE?# H DYP@$B@ $`H HC!@0 @,PBB (p J@ A?#"/J0~F [D"/ SD + J"/ J"/ JH #@@ 8"pCAB!`p C\q}04CH8\q@ Htd `C a$ a@ 0X 0!`0 !`)0PY8m188AA?#H@` B`X X}V! ,hP!X@$q@0x49hr`` H4pkh@xpY@8 CP$IC `%0 Ha$$> y@ 3 ` x @>!R@`Ea$P ^!0 ($R@@ hJpJ@$`(c@!0:@0Hai@aVB@PH!H@@X P!B xP,d*HR!,P^!sH( $ 0 P(J!!H` H!# T! , C0 `` ^!P@$h @($0H $P0 FB K Hp0  (J   ?#P,@YPT P$ B$^! P^!0B  T!H HRBB V@ +VP #`#PA?#B x VP", C " ((Y 8F1`(q@Y p8@8CP qA?# " ( , `CAA?#0H`N (@0 0 P,D* XJX # JAA?# AK`@ I@ Y H!@$+ P/ H 0$8C a$0 M@ &`X &!@L0  (,"L0#  CTq0C HX!`$  ,. $/H! J  b\@ c$BP V8  B x C$P!F  B@C0F9CF9CAA?# H @Y `!0  . "/P!Bx@P!X@X $ )4P(a(@V!8@0(CH$P p`P $0$0 fd2Bc!@~FdP$B xPX!B 3 F!B`XY  , (V P!B@ P$BP( J!,d ^!#P HY 1@!` L80C8$, NPP@$@ AA?# (,ց (aPX@J8C$P! ( xC($ H T!0 d2BPXF! H x !B`0AA?#P!H@@X V!B Y ^!B P!B@ P$BP B!,d ^!#P LY 1@!p N80C@$, PPP@$@AA?#@"B`@ XR?# " ( (Hå~F`T9 ($Z + H "/HP J8BC $ LK@D $ @ ID HPB@P^!#H $H@` P:B XR 0 Y}X!P$B xP!B 3 V!BY  , (L PJ0CB C F!# N! ,` C0 `` ^!P@$@$@J  8$ 0 HR@q$" @P!p0 HaR!0~F P"/ `P + @@ + `R8 +RCP H 00 "1PC"9C $0L0  @P!"/@P"1PC$"~F *¡B @"/h@ $p\0  @P!"/8@ $d0  @P!̠"/ $l0  @P!ؠ # @!q@XhUc`HMH @`%0 p !!@p<B@ X`XY88Cp!a%0K c !@`xA!, p\0  ,XPT!p PCH@!0 H  $  BPT!(@ @!8 8`C @P!0`#",0@bB (0" (  @  a% @ @`I $IP$I  `X@`R<&, IL)R%, O~FbR $!PYX@R }*, PX@$pH 0p\0 E8N,`8 0\ ,hYP@|F`A< 0O># (@<8AO>#B`H@AH@0Y ,Y @L0  Y , @@H "HH # NH @0 @ B@ @! ,PT!H X$0 P D P QA?#@ +@HUa@05H  `% 0 p$Hp<BPHy @ 0 @PYA!,@PN! 2B@d H$@H X?# 3B : UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1Nx] HB B ! # $@X +,BI #P@@03B  N!@ #@Y @P!0  . "/P! B 8 FpqC$0,  @D!0"@FP!H  @H!BPH 8p q 8=9@8@C$H @F P N!,` `!P a&H !`8 @ @<0 x00 B C@ $ 0  D!0`",88 C! #@ D!0@",90C@$ H @x@10H C $ #X@ $0 H  H$@0 I@$pHD$@ K@*@  HR0 8N"!@@`%H X!!@`XhPL!@ p  dA BhYh!BPx!H@X \!0B ,Urx_!Pd!@H`p $P0 Pp]!!H J!#hH!P, @ Z0 `R H 0,PPH A!BYP8 8C$00BP@?#0B  ,B @P r@C$00BP @?#@X @ #`% H@Q %@ C )@ $P%#`X@B` H!2, 0`xA!B x^xQ88_9`CH<_9 CXX_9Ch_9@Cx_9C8_9Cp`%Ha N!@`(p\P$, J!0 pH!P ,p\`h `00BJH@ p$p #01 HPJ@ @01H J@ @00BJ@`%@H # J!  @  h  P$ , J! BB@X H!2, D `@B, `@! Љ:H $0  !!@  F  `F ,`DF q F"/ F"/ C@! @ `a%0 @ ( c C0$ H` @8`0 $HdBp$HX$H @$p qdb tI` `0c p\0 C `X0 @ HR0 6:  @$P  @  @!pPC$0 Hz0 @@$ P !@z ~F@`C$- ! BXX  XP FB @ $  "D ("80C$- ! BXX  XPF!B G@ #`X G?# q C F!F"/ F!",,, PC!0 B@,Pq L$2Ln) L$0M^) IL$H# F!E"/A@@ $  *PT (*80C$- ! BXX  XPF!B G@ #`X G?# q C F!F"/ F!",,, PC!0 B@,Pq L$2Ln) L$0M^) IL$H# F!E"/A@8@ $  *PT (*8C$- ! BXX  XP!F!B #F@ $D0  "PD q$`CZ)H !Z,,  XP1F!B #F@ $D0  "PD q$CX)H !Z,,  XPAF!B #F8@ $  "D ("8C$- ! BXX  XPQF!B `#F@ H$$0  HpP$q`Ca$H 80 7z b BP`% H x!0 @P!B 3 h!BYp! ,Fp,Pd!B a$B CP l! HY N!# L!A0(n` `x!8@0j9 C!$ B 3 T`,Xp "BƷ $p",Yp!P88C`%pHG $P @f~Hgj`BPnP, C $@0 $B L!0 @  !` x!l1CC!PB Bq-! p0~FXp5C$ ,  @$@x ``xh p!", PT!O"/h@$BGPx!8@j!(@ f! p! q @T0,`CP$ ,@H$P )@ T $+ p $+ (!0 @f ! cJ TX TP @T+ *T#  D!,0!a@T 0!c0JH9 `CFh,`xh8PCА4!l, 40C 6!l"/ А4!h"/ 1F!",|, @C А4!h  >!}"/ ~4 F!$ (F-`CА4!0,`A P4@X,Pq (բ(n) ()^) I(P,#5(@ ! @H!@XU  H@(@@B(Y880C$P H! !@!Pƒ",P,P0C$P H! @!P",P,P0C$P H! A?#P" (P,P0C$P H! Q@!P  A?#`(Y8 8C@! H H,"@$p P@' * T$ $y+Q% dP y= -B PH!,DB! q `@pJA?#H (@$0 P,`QJ Hp0C$P H!U H90H` $00 `@!,`5Z P! ,Pa%0"B P F0 @  F C@!x@($HX X@!P YP,( KP0 `(` T! ,@HA0HHFPJ P!HX@B8PC 0!L!",(J4CX `"B X,B4! (@PHaa! $ X8X!$`Qh$ PL@"@ : T!0@ L 0!L!",$J8@J 0!L!",XL,`XYP8p CB8p, 8N8 #8Y 0!L!"/J@D8`C 0!L! 5@C `M `Y,P(@ @! , HU (=H@ !`8 @@D0H@p<BC$BXPAE?#p ( 0 D B (@CH$ , 8P@$(@ DD!0B`aHE1B@b 0$ HXD!, $,0#X",@ H$H0#@Yp,PL!p (@C$ , 8FP@$X@D!$`El)X B @ + D(Ub} UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1Nl HA0HHFPJ P!HX@B8PC 0!L!",(J4CX `"B X,B4! (@PHaa! $ X8X!$`Qh$ PL@"@ : T!0@ L 0!L!",$J8@J 0!L!",XL,`XYP8p  CB8p, 8N8 #8Y 0!L!"/JHD8C 0!L!",X8C X!/XD(4@C0L!(, M X PD (#0L!,, XL`XYP(@ @! , HU HEH` !`8 @` FPBp<B@@H8C 0$`0  8L8 @ h !i CX$ @h-C$ H 3 `!D0 8Y h$D PV!, C x$Hh! , A0  @ `@$BH@F0$` $ PV!@Z $` I Z BhI( 2 @PFB`8 P C$~FT@$,eBP8 C@$h@ F8B8C $@0  0JpBHN4C$,`P`!P8CL p$0PA?#P*@$(`C$~F (%h@pJ!$ PFB XB%(@@$H@Fp q9@8C8$`H  $p0 a0LPH@$ h0  0LX`,P V!B0( C `$0  `X H@XhA!` F0~Fu* V!YP8B(@ @! , Q `! HA0H !@ p (!@p<BHP!H @PD8CF?#H@ !0  $P,@  80H c!Lr B x"9p @X$!D,P @8H8@CF?#pH 0aG`2@HL8C4L 90H@'`C H@P$r@CF?#P H F(@x(L90CP@PBP(! F?#0+@@! B B!qpC@$0$C &hTr,a@8 C$G~F`2 &h\r<1@8CL, G~F &h`r@$Q@8CL, G~F&LB `(2 9h2a@8C#?#0X@`Hx 610Jp"8`C &hpr@$Q@80C$G~F,L:%(@ `M@ x"5C& H4@C &!O,(V9 C$X@(> 90 L@C&H 4& B ^!@$p"@81CH$H 3 X!$0 8Y` B0PT!`, C p$@B0(``! ,@  L0 `$B@0B4 C!PB@$8PC!`, 0L `  F?#50+x@ $$Ē h@! `I N!`@X0 PH0H PF 88C8$, 8NBP88 C@$@ 0$ # L J!`D i I PBtbp``I`X8pP4ā1rpJA8`p Y@!x@H!`B ` F?#B F! `C $hLr4q@8C$/~F@" $hTr@,Q@8PCH( /~F $hXr8]a@8 CH( /~F $h\r,i@8CH( /~F $h`r@8}Q@8CH( /~F$HB@ `(2 9h2]a@8CX?# P@`XHX61J`8`C $hpr`4]Y@80C$/~FX0H: %(@ HH X5C$` H4@C $!K,(Z9 C0 $X@`(> 9 H@C$H 4$ yB 0! (" (iBYE w0JpL8PCD BYP88`CL HP,*8JPB` FXH@$@X1pC $aCF?#H  X!0 @"H P0 XA!$p 8"B8Y 0 H0 ,P T!B0( C X$0 XV H@X`A!`XH!, PF Px@ $P `Y8BP*@ ,`Y@ P B( # P @! , HUb@(-H@`BAA Hp$qC`%pH C @@!@@@X8N, @@X   0 0`L!@$ H 8D8YPL!p (C$ , p BP D`Y 1F!0 880C@$ , 8Pp 0C0,` F $p p,$: 0N"/PL!p (C$ , 8FP D@Y 1D! 8B80C$, 8@P@$(@, (U@ (- HD`B@D @Ep qC`%0H C @@!0 @@XF, `X  !2, 0``%B C 8F!  @ , D0  ,D B@D` `L!@$ H 8F8YPL!p (C$ , 8DP F@Y 1D!0 880C@$ , 8P8F H8Y 8N!`+ NPL!p (C$ , 8DP F`Y 1F! 8B80C$, 8@P@$(@, (U@ (!0H8F H !8YP8F H 0p,PL!p ( 8FC$p,PL!p ( 8FC$p,: N "/PL!p ( 8F`C$p,PL!p ( F0C0,`$ F ,@Y D #P ()H@@`B 3 H$pB@X,@  0 `@`88 C@ $0  Bq7x@@!H @Y !@!2, @ ` L!(U@ PEH @a%0 p!BBp<B @B@ CHa$K J P $  P HX ($ J H HR$ C @! ",8 CD! HDD,PV!@ q`@ $`H H`0  (J pBCP$0LK  $0 @@PHp@$"%@UR BPV!"H h}$HEb!`B Yp\P$B XP!H@X hD!B XP,d*F!PV!ЊH( p$0 P(EJ!!H hN!# `H!,  B0 0 $HVQp˱Ndh94(HF[?@͋`hE-}+yG:J~a!p&*7J\UqGt0['h`l%a tT`ˢ5[/يr KmJ{2t2gA3Gkb%h`$w&Hb-\rp|"@W@|92 p",wg7Ǣ`!' [O@\TaG\2w&Tb9FKTOs%3Aϗdcsd@!TE{n}HʳklȈ(>c05Yp,qM)a:w4:!yv86A0^"Ovb4KlD?fgH45^/%bts4 "wWjb[x1HF'dp+[袄|6]?{ge.soNsPm^h/#AUujTR[kuYg;i`@xؐN8 ~w;B5=l8Hg)6ޯC?Hԋ Z_#/ܶ[#jCk\U)] iXPU)t%o(\ĮB\tŴD&1I0ftJwv6pNJwnds`5 Q/`?1S ‘#u_m SJJ(9km͔bd1ڎC= 1l1AjБLYx9cD}(zvry(QZ9H@ R&0|U2q֫$TW]TP-Eu%DLn5;~[8k`@\DA-4 @:RzA`$>#>@$ MhaHI] 0 JvrCx5&C*1D;< <s00Oh1x6ר\LPqL151\/_WYy c=޵r.sFlB+t7J?q1,4C, XN0q;q\EA[{\k"DE7PfԇV+`X0;,Tt)p7dIo bP@ p" ЮyC?LC/BU` Ke`GJ{ ٨٪ .TXa~`\oaW;j0v '!Ϸ7@L0U"aDz?*'#ZWLP+f~Wbvv [$d|=ؖb7%bz~g:F`y5zpcQLprDS5aG{8^)Pwa8!2qI1QrrD(- ajU~g\Щ2Rɫz$NWz vqСVTC!EQᠷO"a/uEhc auE3@#da^j5Ҁ LcO46IY"n;ߣTcqLBy=XoP%{.J}ޮ nnc}^!fjfڃM"Nw~HqE2a"_">f5ح'Xa3e\Śa@P0<,k##bhzŌ`zIrFFY7S?u&tp*SFaz<1KO6wq@9"UO,2»5y,44]E.esd@4bU31lcqN96fi*3SMXEOVdP|x+GN8+^EtZB)Nk5t+!'aiee,UpXABNǵT%W[slY#)aD{% 1pMb3:`NH$ *A;EI4q|x2)^n?/$k>#*R0ɶčJ 8_$ix(Xk U}*)k 3(CWCb]Z4}q`Q#m!uS]/0b\)VRP"g:q`A7c-eÐ;k,- c 'ĠNj";i?+|:SAFΐE,/78!1ӿ1 PJA&E{8ib ,+ A^Ruvu0=pF۶BsJ.G 7zrQ 8¥8{t[p0kWBQ"ML*4H1" j f'XV!*Iz[T}.R݁ f!Uǫqn{?"?1pe<cA] ?HyW539ϧpb&F(+ij{Nh>'mb'gA{7| `W q׵h ώɒup V: ,(#b_C0gR8Y&u11 ?ՕquHx \*}l sx}) L=ݘb8uGZ^%Jexd fuW;AٌAvvM#fuHh} @B+SOa*8B**ٯ"fb"Dh"Z>SH]>Qx>*}]6gءB(]8yW!jvAcWT88ht^H,"ʌ Fhf}\.E-Z+*P+~KCp.N)L!Ru!1JW])2Gj.S#Hؚӳ8KP_.r=! i~ج((o["-cڎi? %'ț}f/}XgT C&H^COkIv>1K]BB{6/A_ l Wd#A"RN"@Y*aْP+|9_gN!`*" oq%Sk)*@Y}Qs%'7S7R氆L{_]]{<4Gi9ү^G _k>Ak LrCg;QU'AzꛅFTL!uV4oO_6n$ize=Ј%yCdrrnh7QxI! `}%YG$ pct78Z$US*QFw>82$-& AdqƯ7[qH<;/_VbYD_M] Cx`A_LPSHF2U>gTnyVG feK]5<_*rTi[ G 2  3_L{{_"?vߵjo6;>+BF`6dM6*EsnL$JFTK;GPcN9K>| HzLD@}$wcUPwV{)B31%$/R;@| +"ͷ"$aCd%q)5r\C ׏{SHpF|k\&@lO2tXY}(No楲Qϧ0 -Ya3i L[;қ(`cRto_!Z kQ%ckP`ƦWjVm:GJ?gEw!As 1wt"+]䜺8-s i^fu$|4*ptwSyk*5eA=ښ6ÿoI' NsvxozLkp,(E GYJ.A%P9Q@l,=d/W ߅ Qch dS{~2Mw)(:U,h5 uJ1lv5C|Me 7SW]0K 1]%mOo'%`bWβtw0 h  ) C\(@F!t.p<Mc`A]4(S @y-̓< R 1`0> 25u%7*TĩYZ\7λ }w-o! y7Rp'pQ8 9fT/iĄ *0 cLD({.3,r"P؆RTDz dU7v@r)`9"P^*W?*xL(4ɠU!y p#YTJJqvoptܣ1z:BDFo9@K'ia:L`9/aaP `ţӬlaA aije.-z50$pm%(p n# Q^u/ZQE[|! ]- 'qsD!@ ua4G Au bʑu{Zp&Xpbq LA2Hp#XU賈Ÿ:xrpx,WW!z"y(GfboHp7r8J7` |8OXM!XN!xShbBh.҆(^E^EJDPx*imԻтm)] 6'\by >,!+{i0U ؅\܋uQYfE Q8 ޣ1j{J= ;HF=$ha$FjWESA C9jY<^ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1No{`V! @hF!,@PD p ( D@Y@C$ ,L!PV!"H h$HEb!`2Bp\P$B XP(!B 3 `L!B (Y , B P($:B C hN!+xYx$BB B $ P D0 `V!h@$H `F!`Hh Pa$B  o Hh!-> @` -@4( $0$@h(Z!B`0P P@!B 3 `L!B@Y@P! , (J P$!HX hN!+@Y `H!#@ P D0 ` V!$BPV!@0$PB K  0L2@ X!P @ B X D4C($LKD $@(IN H @P@PV!"H he$H`X PʌB@Y 8B0 8!P$B XP !H@X hN!B X, T  H!PV!H p$0 PuB!!H hF!#@`L!, $  P0 0`V!@$ ,P 8p B XC$PLK`D $P@`H@F H (JB @PV!"H he$H`X 0ʠB(Y B0 !P$B XP !H@X hD!B X, 4  H!PV!ЊH p$0 PEB!!H hP!#(`L!, D  J0 0`V!8@@Q$0$ N:@D8$B` N@ N@@ +NPhO, X,Pp (C`%H@X `%0@DF2@PV!"H h$@H`X bB`Y H0 !P$B XP(!B )$H(YV! , H PBjB C hP!#xYF! H0H FH F`$B XPV!8@ @!@"",H8C$ LKD 81N!",`ID 2@DHhF ,d"P V!@0 $HohF@"@H -> ``h!0 @4@`Z!0B@Y P !B 3 `J!B` Y H! , F P$!HX hP!+ Y `L!#@ E0 `P` V! (a%P@ (J(Y88 CJ8@ a%0@ F 0a%`@ L @$@",AP@,@YH8@C H!"/ D!%"/X@ H$$0 H H "B &D @Q?# (,,`@C D!  X!,"/ .D@P! "B QP",@P,(YhP8pC A!` ,8 C 0(!@P"/ (!/Q"/ D! #@$ H `A!h0 Q!`0B @h Y@!,P@B F#a D! #@Q?# H `1P`YPV!p (C8$ , `NP @Q?#@b (@,  Hpq0C($, `JP@Q?# H `P`YP V!P, PUfHXUH !`8 @@`$H  p@P0 x 9@!0 @@ H `!, $@, ,@ ,X( H)b( H) H@, d@/C$BXPAC?#p ( ` BB (0C $ , hHP B0$0BK 0L`B 8M02@8 FqH@8C a% H`D H @0 @$`  ,PX!@ q@8$0H 8N0 0 HF 0 BHCX$LK@ $0%@`XHx@$:)@Z0@BPX!"H p}$Huj !0B0Yx^P$B `PH!H@X pH!B `@,`4"HR!PX!H x$0 PEF!!H pP!#0hN!,  L0 0`@$0B a C?#1B`XpB@1B $0# Y0B@X D!H X,XPXC?#~F@P H!@( PB@ X!`2 @ @ PXp`PKK! X " D# 0L0YC$ , F!PX!"H p$Huj !0bBx^P$B `PH!B 3 hF!BHY , H P($kB@ hN!#YF! HF8@ $H hJ! IpH @HP H B `o HHp!-> ` 8)@  h\!0$@`pX!@B PH!B 3 hH!B`HYHR! , F P$,HY pP!+8 F0L!!H P L0 `$B `P X! A!00BbC?#B1B H $@,@X F0# Xx$,X PCBPhqC B  X!hYPBp ( `HB! H!P@C0$, hLP@$(@, XUbPHAH $$0 P!@K`@V!PT! H@@ $00  H @  (!H P”B,P @@ q@T! C@$@`%p$ I E?#0 @d:0AL! ,`E0LpBh@hYP0M?#H XN!8 # PP(!L @KX T!0 @(Y D # @Y @!  L0  LHU h]H@b @$`8 @H p 0 x@!B` ! ,PA H p ,P88 C (?#(Y 0L ` `(5! C8m$8@L 9C 8$hJ8C K?#`X   H&rPC ! 89PC X`XPH,N80C?#P~F() " J$ ,`(I @ J I@`" ?# H 2 H( 91PC$@, $P B`0Y* B (Y,1BX@$pHY *!0 0 `0YN Bx!,  $P \!(`%B Ap0  (J P P,0C 0Q$`@(@ 0!8qN!K@OK @ 8%@D 0% #(,P0$H !0  HR0 `X 8`CH$HH L$0   YP \! 8D8HPTCD9C0AL!H M #`X X p PCP0$H T0(@ "/ GT 01L!P", XxTH!PC,!`X, H$`$@S \@ Y+ c,X# P$ R:!t,QI x@ u+ W: u# 0QL! c",ct( UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N @Y88C 8O!0",Hf8`Ch!@, H$@$@`Q l @H+ "/ ,h!d! 1B dI0#X@1@!0A"Jc A0L@0 $ ($H p B`Y T # dF ،+`clFx@1@!A#N# 8qN!`",cO HH!H` X0 @+ Xj # WT/C!@!@K@qR HAH( #PDH" @Q!0B`Y PpP?# B`X T 0$@ FG"/ $D# W "/ T D@Y T @+ D#$HO 2@ `G$@, 2 YP\!@BB` PR!H`K  H B`cH Hc H #R $- #$P\!0B I XR!H BI xL AB P, % # ( E #$ HP !p ( pC$Hc  !0 @ 0$P\! p  @$0 ʀF!B P!H @X R!B Y \!@ 1RP@B!,c \!0+PBB HP@P!@H CF , X xH!`Q 0M?#+`F!PX!p ( pC$Hc !0 cH$P\! p  B!@H HB`IRx`!`BP@!B 3 L!B@Y , P PD!,c \!H+B B DP(@XiP!H`A R! A X$B@%P @`X  @P,0 6 @(!0  ЯBXL` ,B HR,0 U T@D0 0H #H 0 # `F-#`C T!H&9C $ B` 6!o,X:8Ch:9Cl8 B`# 7 xpC8<9@Cl8 B`# 7 Lp@xA!0B b !0#``H `@,X b0#@qQ0, & !H!PÓ~FYP0Pp (@@ \!B(C$Hc !0 cP\! pDK $HVr(Hx`!BP!H @X R!B Y \!B PB!n)Y x !X + p BB HP@0$,`RI 0L"BXV`"B`XY @L0 B`X 0V!P Ձ n)X$P !^) @ # LT,$RDE^) DQ,# 0L0M+1R P&@!p0Bb Ƞ!",X ,\0#`X 0d0# $,X !H!PÓ~F@PHPp (@@ \!B(C$Hc P!0 c$P\!P p  XL!0H FB@ Rx`!@BPH!H @X H!B HY \!HR PR!,c \!+ FBRPxP HxYP \!P$BP`%, p 8 ( # A$0@  $0 0 @!HAH@` $`8 @h$,Xp<B@ x!<B`y x@!< + @PT! 0B`@ H$  H0H@Y H00 `EH @XDP$,@PCX$!HY h@!,0 PJPB `L!PBB XH! , J@$ p  BB`@!B`P8!B 3 XL!B8Y , Pl@$0@ 8 $B  H@RXX!B P(P!B 3 `@!B`YB  ,@$B!P`!B pP$BP D! HY `L!#( XH!@0(J`@ $`T!HUa@X=H@ @`%0 @HDBB ; C$HXDPX!p ( D0HPC0$pK 0L @"@` F@0 +F8@8% HP@ N H ` DP $U:1P DB' ($P0  Ip$0R H, `:X@d8R@,0Y8N, @""@d*E Hp,t*E 0L`2&@DS 8N #`0I0@ v)409 G?# #tS0N 0~Fd"9 F0 # Xa$-@ X`XX X!., #?#pDk`C$ D,  $@x ``xh$$  R &zX@ & &@ &@ Q@ P* 0L@ X!, #@o, hX. @`\0@gA`g 4!l@`%$: Pq^)`Q0 h:hY PpCP`%0"H 8<8iPC %$BP$ H1 X!00 @h!PO?#B@ `8 R4CH0P9C P$@)qpC X$H-i@C $ HDHh" P(!F B(@ $@$p: @ HI8O?#p qdJHP4`"JH8CHa$0K@H 0( @1P4 H HX`C H!&,@9,rY P@9p!XpOpq@p!@$(I$`9X@ J@1Px)& .@9PX@¨R$`X,X*, `\"@ DP. H 'X 0 $2/RD 08@P  ,PT BST `)b8 P* d@*2!$ #X@ a$  @T i@P@!hBY @! #,P 1 H p"$$0 p@``p<Bx 8A$$ `@`=By(!,@Y  3BP8$Bg J!B2BPJ!2B@e ,$He?#02B dP H ( # D$ #&$ #P!2B`@a P`!# | @@3B  `1B ($PJ!p C! b3Ba P! cD,@X@0Ba0$p, Pa!p ( ( @@ЁB(@ @?# ,  Ufa&@H@` !`8 @!qp<B@C-$0<BP80 BPC($@B K # A!P0 H P d!@F!@0$pH 0Lp2@ 8N8Y 8N!p0 pR)8P C@"$H@0L!0B L@ @7H@80H6 p2B F( #C 0M!",8PC$pB"P q BJ(@ $ #$00BP(9 C@$H@$pB Ka $0  N #8f!P0L!B@ N!0", 80H# $8H cP4CP$H `y$0 ` HR$@{H`@P P  B 9 BpC$H`@jPHP8B@C 0M!0",8`C$BX@^9@C$H`@jP HP88 JcCX8,z `^tp CPP!0B CC X?#x-@4px- C@H 4` UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NV |$ @ ! H@X $ H H(@""!Hp  (aSDBT(B@2H H2 \Z X 0 ` `(#A.!`p 2\B H!$+ @t, :8P :,pB< 9?#xB8!$+(BFk1`@Y 0(4PS@ j!P j, bB% i?#B+Ah!@$+@J(^4C`H@DZ P@X p(^4@QQ@ ((P (,bDB, #?#XBj"!$# J@@pC Pٴ@t, 8aqX@H<8`C 8, PH` :9|pc AB4ш@h!@ 9, ppC<6, Itv)@ 40Ј@Xl,ؤ6 @ : #68@@8, H! $B@l4ш@zJ 4 $00BPx$B@@@8P0 C $r @@H4PJ0L!q HM$q]i@8C$LK@A $0-@ Hp PH`8x@sE@Pd!0#H $@Hf jB HHP0 H!, $ 1P$0B PX!0B 3 R!BXYXV!P , PX IPT!HX \!#x@!P,%b1  ^0 0 `X!`8B8C`$0BP8BC$N@$j1h@HP$0BPF`B L`"~CH8`CH$LK@E $2@ HIXT PH`80\@[@Pd!0#H 5$Hf jB ^P0 0Y!P$0B P(!H@X B!0B(Yd!PrB@P PP!HX V!#0@!P, M`0 `0` d! H $@( @ 8$@ @(J H8J8BC$0B`aPd! $B [?#` iCX$H XV0  H HT8( (@PC0,(Y  J 0  , qW X@$0,P880C I?# i`J 0M! PqLprs9 XT8p]y@8 C Z!h@ 0aM!P J8 CH8@\9 C $# PH! P?#PiC Xp-rC P?#PiC ppErC P?#PipC pIrPC P?#Pi0C@(pF8(`JPpBRa18,8C $`0 `X, ,XX@H28 CЀ+?#x@|$ ]i(P`*!HB h(.4pB0*TB <!tB >!hF0@ .`@,8@JF@$0BaPd! $`B PW?#`PiC($H (J0  T HR8@( ZPC0,`Y  F 0  , qW X@$0,P880C PU?#Pi`J 0M! HqLprs9 XR8p]y@8 CPV!h@ 0aM!` L8 CT8@\9 C $ # HT! H?#HiC Pp)rC H?#HiC Xpp-rC H?#HipC pErPC H?#Hi0C0$pF8&`J @P@A@8(8C$PH ,PT0 P,c 0AaX@H28pChB4@C 0, H ( 9hp@\@@8!xB@ 0, `p0C@$B4C\@@@ 1, ppC@=P, @IPv)z \@@X,R @UP @P  Pl 8@@0, PH@MAJ!@@ @B@A@( 8pJ @ $00BP$0BP @D! , U`HAHq !`8 @ 8<0 xP! C $0 1 C,(@H$0H XA!$0  0$  h`Y,P`$B`fT! PT!1B`f P!~F dX!0H  H( #` "H, #FPT!@B2B Ad X!0H@ H@H@` @0 | !$ #  (H #`a&PH( %08 X@ P8 8 c PpCX$PH  Pa$,0 H(JH`TRh@$B5pjBPT!"H `$HXV , 0@0 0!P$B PP!B 3 XN!BY , 0L P($rB C `F!+pYp$BL B P D0 `@$B(@8!3Bg 8N 0L:@2@5CH$PH` P!$0 `@(J,$TPH82-@`PXL!PT!"H `$HXV p, @0 !P$B PP !B@ $B YT! , @ P@ઑB C `L!#pY8N! H`( H N0 `@$Bx@!`"0Bf @Y @`  8N8Y`,t2D0,?  0~F H& rC rC$, D0-@ HF/," 9Cp~FC ?#8 #? X,, ,B p] rC XfrC X!8 #? pir`C,pF:`@C X,, 8 # X!/,8<9J XD B x!XY XV!`2@XY Dh# x^xY @ #P! 3B X$ $,`XY H$V 0BB 'FC$BP88C$pH` (!0 D8N0 $@t2(JH@ @`(Y0D!PT!"H `$0HXV , F0  !P$B PP(!B $B`(YT! , F PF:B C `D!#pY@! H`8 H @0 `@$B8 @0!H`  0L0YPE?#B (aD(aC 8$p0  8NqPCXH!BP  B E?# +8@ ($ B~F D D`Y  0~F H%rM]G8 C P$P #! !0BY "0A ($D, GP!U@@X!@Q @ \F, X 1F!T# " "/ GF"/ TF #H @9pC$A K  ($x0 Xy: P T!`H 0L@@ @4!(! i C@$ @8$qPC$pŸ~F F + `N"/ `N8N!B O@ (`HOֲB@PX/N$q 'NP #0C $+~F L, @9C$BPT!P B LpqV UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NuC0M?#0 H  H8@ @,D H8 +0CP$0:@D7 (N + LJ90C @pMrCJ9C @pQ rC @!P,*9pC0M?#p H  ظ$` `X,c d,p\@ l0 +@$`~F| >b (|,XY > )}@>0 C@$@XX!H$P0M?#P, T!   ,@$* B # `L0M?#, M" (`X,` @ #@ 9 C($BX@  HJ HXC$ H@ $0L0 `$H`a D0 d &H @Y8%D 0,hY E P!H X!B`cP L8 # f@!0~F@Ad H! #  B P $ # |) %P0!!p"0B`` $@ #`aNBFP D8p ( P=1@8 C !`3B`e $@  0L0I@,D2 8H#8Q F`YP88  B P@C$P@BA! Hq C@ $x@ $P—~F J!, `X  #@(J!@H@ ", H 0 `PPC(!J!(,@ $",XHgD,@Q P?#(#P88C0$H XD! #P88PC$p HP @ P 0DqBL8@ $P—~F @ J$B` PT!@$H` `BP88C$B@`b !Ha$DISK4ebH0H H #XH!P88PC$p HP @` P 0DqB F$BPXJ`H P,@ @ D 0! i C@$X@$B`P$B PPJ $ P0,1B J,@9C 8$p HN8 C@$@ $H # X@!@  `X YHPT!,X@90C0$, L(@ @$HUe@HEH !`8 @`H`p<B@Aa%PT! q # $H H0 `FBP88 C@?#@0$PH `A$`0 `c(J@2B e8N03B@ 0L e8N`,hYP`Q$B`` T!`"2B8YP`$B`eT! P H #  X@! # PJ0 HP Q!0B@Dc 8! # X!BD@ #PT!p ( C@!@(Q$H`a `% @PQ!p1B  T! # 8N`8YP$1B PP T!@H H "@ XD`XY88Cp!a%`K c !"@D2x!, p\` ,0YPT!p @C!P"H XJ PT!(@ @!q!p0B @p  081Gz?@ס` P @8 p08 $I pI pHp8$C@!?`` X ( H0 ( (P B 0 69 XH X61@  a%pH  @ $ I0$@ I$D@@|H, -L) 86X, PQTt)`bR0!UX@@R H|&, 0HX@ R (=", @i! ),"@!0B ca,0B"a 4d ` 0p\  C@$X@XL4 C@!(@.4 C@$@\J4 C@!@ 04 C@$@`4 C@!@$24 C@$@d4 C@!h@(44 C@$X@h4 C@!(@4B , HUd @b!!0C@9BC$@HA?#s@ X$$k P4$ %(IJ",B*"!HB C$8@Pd @ 0AP@ $XP F!0AH !`8 @@P!H`Xp<BH!,P!p ( 8C!0B@a X!0 0 b0$BH@T (0#c,X X!:HX",P ! H`@ N!@0 @* YP N!p C !0 0* !PCX8@C!(H@  `Q!P #p8@CX!QH` XXD`! #88C!PH (@T@ (8b BXDx@P8 C `$ #`8 C @$ #p8 C D@! ,` `!P 8- H @D", H$pp0C @$BB E@PDp C @H80C D!@", B @!P" (Da5«Y@B ,p0H  @@#w0C $PBBDP @@@XU HE0H@FB@ CP F cC $`H` H`0 @` H =R QB!'/ 0L B D0 PD b HBH(@$B@CD!H XDXD@ /D$@H &0L PL(0C$ B h@PT0 cE,X D\0 hY* (YT,P T!,@HAH` P$ 0  P!P, # X@ XY@D8C$DBP0 0 B PPC$ H`@XP$H`Y !BP$H`Y !BP@!B (A@aP=9@8PCXJ8C $,,P@p@`H SXL ,pY,YP8@`@pH #XN,P T! !$@ @ YD8@JHU 0123456789ABCDEF      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Default: deq = %6d, mbc = %3d, mbf = %3d. Get RMS defaults. getjpi sts = %%x%08x. UNKNOWN DECC FEATURE: %s. INVALID DECC FEATURE VALUE, %d: %d <= %s <= %d. Open callback. ID = %d, deq = %6d, mbc = %3d, mbf = %3d. .;.SYS$DISK:[]Can not create destination directory: Invalid destination directory (includes file name): Invalid destination directory (parse error): (null) creating: warning: skipped "../" path component(s) in ..%s[ VMS status = %d ] %02u-%3s-%04u %02u:%02u:%02u.00N{ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1Ny[ Warning: CRC error, discarding PKWARE extra field ] [ Warning: Unknown block signature VMSVVPROVRDTVDATVFHCVKEYVALLVFABIMwarning: set-dir-attributes failed ($qiow mod) for warning: set-dir-attributes failed ($qiow acc) for warning: set-dir-attributes failed ($assign) for warning: set-dir-attributes failed ($parse) for %.*s%c%.*s%s.DIR;1%.*s000000%c%.*s%s][ Deaccess QIO failed ] warning: error reading symlink text (qio): ) target, no mem warning: cannot show symlink ([ _close_qio: sys$synch found I/O failure ] [ WriteQIO: sys$qio failed ] [ WriteQIO: sys$synch found I/O failure ] [ _close_rms: sys$wait failed ] warning: error reading symlink text (rms): ) failed, no mem ) failed: mem alloc overflow warning: symbolic link (warning: error reading symlink text: [ WriteBuffer: sys$write failed ] [ WriteBuffer: sys$wait failed ] [ WriteRecord: sys$put failed ] [ WriteRecord: sys$wait failed ] [ Warning: Record too long (%u) ] [ Warning, incomplete record of length %u ] [ Record too long (%u bytes) ] exists: new [v]ersion, [o]verwrite, or [n]o extract? (Uppercase response [V,O,N] => Do same for all files): [ Cannot allocate space for [ Cannot create (QIO) output file create_qio_output: sys$assign failed. create_qio_output: sys$parse failed. has illegal record format to put to screen ] Cannot create ($connect) output file: [ Cannot create ($create) output file " to convert the zipfile to stream-LF record format. (BILF is available at various VMS archives.) Error: zipfile is in variable-length record format. Please run "bilf l sys$open() error: error: cannot open zipfile [ 00000000000000000000 P     #N ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60.VMS]VMS.C;1ƟT W,-ә./035ͷ789@, zz*> v {)0/0@uҪ/  vvv  t{xxxzwε.r%"{/ (u֫P}zz&˦}Q {lz{~}s˪ w x w yz xw xڭw xyyw ~h efffeaת0 z{#/ʮ#>2zwR UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N{%#  ֩~}%&0 }}zz}yz>#} >{{z{wyt t t qyyzy'vyzw{wryq  u{ wz&h}h}x=Lw. E%S<L%R.R5qK'r G<թ}}& tx"z{sr w*> 20x w v? pp&i0[Ӵ%֩0yyyyyyyyy{} !sP xppxx xpxxk10%0 w vg r2.  rʮ#>2|{%Ӵ ֩0}%@P"թ0}%y& |{|zwz0˪}}{0 yyyb 2{Ϫղ g˽~/#  {o{{koooz u oz'0  ̴ʪ"0/  ){{{>&.2N&.Le z4L .P0pw zqt knR{p//  {{ v ϩ c@Y44 y/o g#~}#h}#h}#@/ʲ@ʲ@}#@> /1Nl0v!P%Ҭ]%~~xzzժ0}sP%@ {{>PPP0Bz P}  zz}% !_!kx!ist~0prm00 @ ypy~ʵ~p}#&   t  x st~0prm00@@ rzxʿs˼¬i0qs0ʫw t}op'rsP  w ww w ){{{{0.{?{{/ @ /{i>ʲ  `j#"{@$\1O~  s~}{{/ / / @ /{i>ʲm0& b %%_!jg#@ yy.b100~v}h}0~/ yy.p@}0gh}0~/ pp 'i!!ʶ!ʴ!˵"t {{N_  oo oo xxxx.immkë(Ҫ0 %0{#%!.!}0%}  ֪/0}}֪i1}@B/ x( p p p {{ϩ~ʵP*S.*X(X(V fxjҪ lѫ`{{)h%h}/  t s}} xu uiĪvzis  o~ootg%h&hP2 i!yyyyty N>{z{{ĵ~l?~.z!h%@ r u u{ήz~ u%u{w w%©"x+WsOrsǵOؤ'n Un  n+gwxx"^pU !...ץ v v/zrsP %"}0  PrsǵO(׫0%%.   yyv w x x u x ugp  w! t w %h t)P&""1}/>r}#r0~&׭njii@A !zyh  mlol"o& {ywxzy{z'z{ q*yʬ / #mk}@`xxx0 '}#ȴ{{}op}}>2s}f}Nyw&vzhw w wzhwzwΤzuhwΤzu %}tyyr&hf0^&0r'_0Ыx#}}}}i@&~&h s& y u/j % ~i@&s&h gcsy}~%˵\ &@ $q(X( %մ*{xu{x{z'u@0?~rs/{}~#R~{0 t 02@%({ p{t˩}.1~0P}^"r}qq t s t u s u v){ xs  {{&.'}@}r~\]hyy!hht}0}tP}#/}#%0 'kk{ïg{y g xةx%{gyr}#?b  u u{{  wز{ wQ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N$ sΩ? (~y{zpgz0 )'Y'Y'p!??00@@ *0}}0P *}}0 +{{~{}İתt0. ,q ʫ}թժ#0 P0a/% @%.@VMSHP C S7.1-012get_rms_defaultscheck_formatopen_outfilebset_default_datetime_XABsbjreplace_rms_newversionjnreplacen{find_vms_attrs{free_upflush_flush_blocksWriteQIO_flush_qio_flush_varlen_flush_streamWriteBufferWriteRecord_read_link_rmsclose_outfile_close_rms_close_qiodefer_dir_attribsДset_direc_attribsДvms_msg_textйvms_msgйmapattrdest_struct_levelmapnamecheckdircheck_for_newerreturn_VMSgetscreeninfoscreensizescreenlinewrapacc_cbdecc_init,@.shstrtab.note$READONLY$INVALIDRESPONSEASSUMENO$BSS$.sdata.sbss$CODE$HEX_DIGITCHAR_PROPJPI_ITM_LST$LITERAL$$LINK$$DATA$$READONLY_ADDR$OPENR_IDDECC_FEAT_ARRAYLIB$INITIALIZLIB$INITIALIZE.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind.rela.sdata.rela$CODE$.relaJPI_ITM_LST.rela$DATA$.rela$READONLY_ADDR$.relaDECC_FEAT_ARRAY.relaLIB$INITIALIZEENG$DISK:[ENGINEERING.GOATLEY.UNZIP60.VMS]VMS.C;1_flush_stream_flush_blocks_close_rms_flush_varlen_close_qio_flush_qiodecc_initDECC$GA_STDERRDECC$GA_STDINDECC$GA_RMS_NAMLDECC$GA_RMS_FABDECC$GA_RMS_RABDECC$GA_RMS_XABALLDECC$GA_RMS_XABDATDECC$GA_RMS_XABFHCDECC$GA_RMS_XABKEYDECC$GA_RMS_XABPRODECC$GA_RMS_XABRDTOPENR_IDACC_CBDECC$$GA___CTYPETDECC$$GL___CTYPEAGOPEN_OUTFILEFLUSHCHECK_FOR_NEWERCHECK_FORMATVMS_MSG_TEXTRETURN_VMSMAPATTRMAPNAMECHECKDIRSCREENSIZESCREENLINEWRAPCLOSE_OUTFILEDEFER_DIR_ATTRIBSSET_DIREC_ATTRIBSINVALIDRESPONSEASSUMENOHEX_DIGITCHAR_PROPRMS_EXT_ACTIVERMS_MBC_ACTIVERMS_MBF_ACTIVEJPI_ITM_LSTDEST_STRUCT_LEVELDECC_FEAT_ARRAYSPAREX_DECC_INITLIB$INITIALIZEDMY_LIB$INITIALIZEOTS$MOVEOTS$INSVELF$TFRADRSYS$GETJPIWDECC$TXFPRINTFDECC$STRLENSYS$OPENFNFILTERDECC$MEMCPYSYS$CLOSESYS$CREATESYS$CONNECTSYS$PARSESYS$ASSIGNSYS$QIOWSYS$DASSGNSYS$EXTENDEF_SCAN_FOR_IZUXDECC$__UTCTZ_LOCALTIMEDECC$TXSPRINTFSYS$BINTIMDECC$STRRCHRDECC$STRCPYDECC$FFLUSHDECC$FGETSEXTRACT_IZVMS_BLOCKCRC32DECC$FREESYS$SYNCHSYS$QIOSYS$WAITSYS$WRITESYS$PUTSYS$REWINDSYS$READDECC$MALLOCDECC$STRERRORDECC$STRCATLIB$SYS_GETMSGSYS$SETDFPROTDECC$UMASKMAKEWORDLIB$GETDVIDECC$STRCHRDECC$STRNCMPDECC$ISDIGITDECC$MKDIRCMA$TIS_ERRNO_GET_ADDRDECC$STRNCASECMPDECC$STRCMPDECC$__OFF64_UTC_STATSYS$NUMTIMDECC$EXITDECC$FEATURE_GET_INDEXDECC$FEATURE_GET_VALUEDECC$FEATURE_SET_VALUEDECC$TXPRINTF     3 [ A O O oZ `Vh s S~ @"5HQ Xj|@ ~ P) N p@ 0    P о   m0 p P`+!;<D N Xgv ( `  t +4=IS^jt$*4>FOYalu0<R]g~NDZ@UQUODZ@U'&''' '`1 ' 5T 'p70 '= 'L_ 'N 'O 'QP'S'`VZ' ['fq'i'pl'm=' o''p'P~''М'*' 'P"'о 'p"'X"'"'"'"'5#'''@e ee'____ _(_)2ָ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N0_8_`1@_8H_`1P_ 5X_X`_ 5h_p7p_xx_p7_=__=_L__L_N__N_O__O_Q__Q_S_ _S_`V_@ _`V(_ [0_X8_ [@_fH_xP_fX_i`_h_ip_plx__pl_m__m_ o__ o____p__p_P_8_P__P__М _p(_М0_8_@_H_P_X_`_Ph_p_Px_о__о_p__p__ ___@___X___x____ _(_0_8_@@_ %X%u$%X3tEL%X4  RIQr*\FED*FED21T"2 @"IR@*P ` IR%$%$BINa11INISIT11A1IU2 2 INIS2IV2 IМIWB1`1IU2 2 ( INISBIV`2 rIN*\bIp11I=0 *@ (A Xa (p X & %  & %  IN2 IN0 $1 1A $P 1 IN IS I`1 E D F E D FIX"Ip7IXI 5IL02 @2 rINISIVIO2IМ`2 rIМILIYBIUa2 b2 `INISIVbILR R0R11"IU@2 ISIV 2 02INX(X*0(PRQRRRRR0%1$A%P$IN1IN1`X#`X#RISqXrXXXIZ2 IМ**LBI[`2 rIМXXX*\ XI\2Ip7bI\" IL` 2 a 2  IN IS!IV2!IOb!IМ!I]!(!R!R !(a#*#1$1R$IUp$2 $IS"%IV@%2 0R%IN%IL%$%&%%$%1&&&&1B&INr&IN&`&`&ISB'I`1'2(IX)Ip7)IX)I 5)IL *2 0*2 b*IN*IS*IV*IO"+IМ`+2 r+IМ+IL+I\m UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N^,2 ,2 2,INb,IS,IV,IO-IМ@-2 R-IМb-IL-IY".IUA.2 B.2 `r.IN.IS.IVB/IL`/Xb/p/(q/X//(00Rp0R0R0R1Ra11q112I_R2I`p3,q3(r33,3(33IN32 (A48a4p4q484Ia444Ib!5$15$@5*,a51q515IN5X5X6ISR6IX6Ic6Ic"7Idr7*T7171`81p8"q818#882 8"8#88IU"9ISb9IV92 9IN:Ie2:IfR:IS:IS;Ia= =2=Ia=1=*,=1>1>1>%>'>*>)>(>,>+>P>>2 ?%?'?* ?)!?(0?,1?+2?*X@?PA?`?2 ?2 "@Ig@@2 @IgA2 AIgB2 BCIgC2 CIg0D2 DIgD2 BEIgE2 E2 EINFISBFIVrFIO2GIh`G2 PGIN`H2 HINL*8BLIiLIiLIi2MIiMIi!Np1NprNIiN1N1NIh@O*8O*4bPINPIfQIfQ*PR* BRIjR2 RIМ2SIkPS2 bSIМS*4TINUIQVIQbV*XVXVXW21 W2 BWIaaW1W1WIN"XINrXIiXXXXYIiYINYXY21 Y2 YX2ZIaPZ1`Z1ZIi![*X[X[X[Ii`_21 a_2 _Ia_1_1p`*0`IN`X`XaIi0a*0dIibe21 re2 eIae1e12fIiPf*0fINf1f1!g1@g1g*0gIlg2 gIМ0h2 BhIМhImh2 hIМ i2 2iIМi1i1i1i1Bj2 j*0jIlk2 pkIМPk2 bkIМkInk2 HkIМl2 "lIМql*0lIllIolIlBmIprmIlm*8pn21!o11o1pIq0p11p2 @p1pIUp2 xpINqISBqIV`q2 `rqINrIplRrIrqr2 rINrISrIVsIUtISRtIVtIit1u1uISruIUu2 u2 uINuIS"vIV@v2 RvINvIq"wIUAw2 Bw2 rwINwISwIVw2 xxINxIdxIpl"yIrAy2 By2 HryINyISyIVRzIizIU{2 b{IS{IV|*<|2}}0~+A~+r~IN~Il~2 IМP2  /_ UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N bIМIWILXXX*P!XA* Ij 2 2IМP1`1ҁIq12 1bIU2 xIN‚ISIV 2 `2INI\„Ir2 0IN"ISbIV҅IURISIVIi`*I\҇I]2 "IМq11IS11IqINId`2 IsISp2 2 2 2 Ia1!1I=Ѝ*,эpҍppp%!%BINap*XA*X‘I`1$$’INX#X#2ISQXpXIZГ2 IN2 2ISrIVIМє**LI[@2 hbIN2 ISIV"IМAX`XpXX*L1@I\2 0IN2 "ISbIVIМPЙPI\02 RINq2 ISқIVIМ2I]RILbIiX3X3* BIt`21 b1qX31X32 Ia02 bISIVIS2IVbIO1*1A*RIuq*IvIv0@1@@ P *IwIwIw@@$%$%rININ2 ISbIZ*(ҨIxIо1ѩ1Id1 1*`*`2 IRIо11Ic  ! 0 RIy2 Iz2 IzIоbIU2 2 ²INIS"IVIS2 ҳIоIоRIUq2 r2 IN´ISIVIS 0!/001/I{ ¹IS0/0/I{ rIоIо*x@$A%Q$`%ININ*|IS12 AX4QX4IZ21 11IU12 22 bINISIV21 11IU2 2 P"INBISIVI|21 11IU12 22 (bINISIVRId21lI01A1RISa*x*xX4X4IS*t@*Idp*h$%*1$%1IN2INISIZbI|I}Q`RX4p`qX4I~*|"I|BI}Id2 I1*|RI|rI}IS"IdBIS*|*hX4X4Id * m&5Kqjnt@u J1r֬X 5e|z/1`%g&'} Z(tS ҄W5 kjә[$^r9ͳ [cpMU^Yܙ:q׻XDZt;~ ^6GP/ = `EUsX4 q9=%giTB˭χxKB4g`$ЯUqmpD%Qh<@AV:}Sm }7vc~M-_VTkl1[.br~yV]L1H;N@,w^ `Bu$T%*>c'Lcݿ')Ը 3.#S?>]E.;5L+Yl*;)txUT]mO;u?JttQEP9ǶwI9ϑAk%iڌ2h)>\O΢X獱 gs =csx WZ!O F<&ڸ<g7^*FaW-Z7k۹cv`3Nښaeqd#Y6 6x~ ٧K?c(GnbgP]u5~6:Bl J: y8~p[0 !b rӚ@&0lgqd?'#UL8p96& }M{u (%׿9dcCRz;]ȼ@RM@Ckeg;U}8tluR,&%!&/V~> =G=/y|CDN!AjjN kۍVm}2?8N?e}H_ eWaNx h ;+j6bw7`'WsSU k:Ta#0H_s 5, Su͙v=DvOd{٪DTu %-l*W2Q=qGŮ`;U1鹒_(WlN %# %riy`NA~@IQ``|6(#v+乀ogZUzYSp4LtD>=+bVb+:2ursc+2u3Wx*'zl ˕QDt ̵ I*cORj^0XgJ@͙H)Z/8O^CE5ŏѲH u$o~.UP!F|ܻP$/K矚K9GP5(U9f>s@+^UH>o]OR1()1+_Sҋo'?!1;GbWJXc -sw gtKT*r޼̮cR:R\[\: >'~D$X.%{\}8v-kҺ"^Ce hO-щDaz66tWL,kTY]nT &% ;sm e(1|j}]^;. wd0z$&AKF`q#;.ݹlL|@c ?wLd+l)Qe!7S/f^-$žVWTFj2S-Hr]h8zxijX7&UQZLJ}reCuUxcG1@E'i!<\c!%#JL}7֫jt녺QTeP.E҂l'=J+E -FEa|bnU[㘻>sVVVH5}NzUBW3BZ JY4BHو7+\xI\0A/0Ip]I7 4"Ss7 Aegrr9.12YN"N\r%3bP0"Ah PX1pX(I:U3G{ox~][ƭ|` -ouy`lo^"BBko@D6mבN%P5TiQn`w9/w87g&䣼Z%S~2U7xJ"8` yAkT;fOma֝]{ K' 䓆=t R%C8p28Y|I߲g* lbB ނ5U DJLԑc4H3]7B"a3C4(u2yR>qz3,Ȕ1 JyJL^@m453_Lx{zP mQ`gm5( vmAVXKC) jwJ23H:VK(wj(GϣxA8 *xpJH ΢x YB5l$NuՄaRKV&Z  Vs3lA(7Xn@9!Fݥk?3(C" n}_W[v9 % iMJCq3 GPiP~zz/;8?"ͲTۙk z1i{9( X")X޴+4;lp@.J]VW'4 xwo߲uZKMA5oh]1JEni&0[pѤ:UM>E$ Qc#k(ox  Bl;mYA^2hcFy ["F݋ >/4Bb<##G!PaP7S"RDGx!CFxj& GK_P`Ҟ$[K2kR#M/uFE cL!cWJIMVBb8X[7CfO0cqM!KB!b[`^!3 Pb8^Dӓ18V1j?(wV71iZ#32AQEסHB5+=ͼyU16xr.  ?C+K3u ۷[)DB߀N& ~Fb2lE'Z\)t돇%Αƍ($Oh.ԪVk &xzӼ'b{s/ B%fSmU.1 @5. WTWމ̗ߕ3&*A cɹTTErQ~Ap!`?W#< x]'v1` [Cj$ (/a&J[#҈'8SmOaҘ[ (eiE#;JOXJ@cYH2A[_FBY"+*.OYi! N8'| '_G:4Can] gvOgan,K( ע[K5#n%_L= tf/Ȳ`DJγ7"fܝJ_ _Pe_ʠP%7;;kߝ>ɧ] DL{T?O*T0L1séKqՎv /4f*c<]D:P-JYN 1#MOT*a .ٟ''/i+BA:Go9eBemYA+]AZ} HME`V)853G3Uz*dm[ 3"_~[!SAcqdL3cIJC7G j_݌("W!hB-_!*ZpC7X sKGWذ*Ws%+ǸgיkՖ !Ʈ;@ˎqA@IUl7"z#Oʝ{A2+{+'Ai-`6'BW!#AU2~aUt{Ҫ?Wg}̛xيY>(=˖kܬa)0m@s2 D" keJ!b53WCSM s9E#;@2@"Xl =a D6BOmz9'Asw$gW8j;CH-!qB3f;1PUPhl 0x% ]B, $.csOb\n27~I3ͅy఑yp6=/ <bvNqNl*CxjXo'&"Iv.:&8iD*f(ơ?}#QY!V'm3!Ā'ՆCr,uK| v/ZVQ&YO\cI>r88󆍏[-.BF buQOF64*Lz)(7?n̆:V+b6(LQU#YڅX*{vPZFɲ3r2\^Ol )bёݑJK1HU)Z vYJȿ㶨ޏ"ƫ-oxlLwc>% ϼNXP K.rBgi-6Z]e@t=P]EHAS!8W /Hxj1k""Q; -aIԕ EjA.OF#?GS&-Zo^ E+). sT.avzXK~~PzI`x60UCP!y ;flK36T/1G~di lr*Nx`-H`J٘_R{RT|11-A. }o0^-iV""͏ra aA_c7Us ll$? )^i\j;@nisB"ZYWhqfb -`|-ɳb:^d5Z2(J1Tq|QCZ^ W 5&I t[pk5pJ.6[d$eE:P,Ns;::ǧ Q`ʟAl[v( grN8HύOҴ9~)  8pqkRi%AP.oSdΧFXRl%6#ψ,C+j! ~|1E1N(s傺c7_ٛ#Ļcs#@uiXzǹGG&h1yrM/m,7CgQB0-'oS>3CeCotGk8- /R϶C!eFÉ!6~Å0QOU`*KLgY9EJ҄:rf)^3^j"a%,;"9IG>L*`#!E* -gm ;/B"=_54XiJ4sfkM;#')ɤhYR^1[!eJp%F?γKwPqoa*|ܨĭMY C!JYEEmcLjqr`g2(1GW ; modifiers are -abjnoqCL%sV%s. ??20 April 2009error: expected central file header signature not found (file #%lu). error [%s]: attempt to seek before beginning of zipfile %scaution: filename not matched: %s caution: excluded filename not matched: %s (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) HMH@x0 b p<B@| x !<0#P`?#IHx?#C?~F( x ?#BhD!B` )C<2/P8!`1B P 8N` ,`0YP$ ,PT!HUe@  b  ! P0B!P, P$P ,P@$B0@9HP X$`8 @XVH@%p<By 0BP H #PR!H@ X$0 PR!H@e X$0 PR!H@ X$0 PR!H@E X$0 PR!H@ X$0 PA!BA H0`% XA!0BY B !B!, B!@ J% #Pa! q @aIx!@0B!B)$ #CP@!"H B  C!(  ] UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1N  !D #@PX X?#PH # -@ 0 0L,1pC($` H (J BXP8C `$ 3XXH@PYP8BPC @! @!$,` PF8H(@`X @8H #Y!pC C! #&0B`X & a2k*!X`)Xz) X.@hH8pC 0C! #  2 X 2 a`36!X)pz) p: BX <P<8PC @  |,C |BP80C D!",,C`@ 0B  0B!0` @ Ha1 Pa B "@PX((z) P$$@H8CPD0H #X&,P8B@C C!@ H `X80CH C!`B( #x@XF8`C @aB` Da 2 !#DB H,@RR H(@!P@@a ,h ` @B!`X, T6X @hd0d&d, SR h2 p #(@ $ @  t,8@$LKC X$0 XVH@ > B YP!B!!H XD!2,@X P@!0 ``@($Bx@QB! BB` @( #F8@PB!@ H  HB!$  PB$ q@PX H(pC$ LK`A X$0 XVH@Z B`B YP!B!!H XL!2,@X P@!0 `` R! $P R! , `@!p  PQ `@H@ , !0'~F ! B`F1BC P$(0  XD`XX8,8C hErC $XH@ H P"8 CG?#  @!@C XD`XX8,8 C HhErC H P"8CG?#  @!CXDB`XX "`pXqC HhMrpC H P8"8C L#?#hFk0C$0D,  $@x ``xh @!@P0!p q PC@D 0B@!B@P Ox@ "!`(B GH@08`CP@!0B  @ 81 B O @ P0!+","80C P@!0(  &!("/ P0!@("/ @88@CPP!B `H @ $(B `G @@8@CP`!B @ @ $(B @O @8(  CD,P C ,, D(`CF10~FpC  0 0L, LL H"9 C `P@&8 C X,$ , D(  C X,$ 0, 0L(p C X,$ , D( @ C X,$ 0, 0L( C X,$ , D(  C X,$ 0, X "`0L( @Pp! q PC@L B@È!B@Q GH @ &!(B O @88@CP0!B ("/ @ $`*B F("/ @$`$q# @@8@CP!B H @ $@)B R @P!` q @PC@D 0B@!B@S N@ "!)B Fx@08@CP!B `8@ $+B `D@88@CP!B `@ $)B `F@P! q PC@P B@!B@S @F(@ (!)B @R@P!` q `Cd&8#@B@AQ @!Da @BDB Rx@$09OB@AQ @E@("/H@P!` q PC@D @B @#!B@S R@ "!)B F@08@CP!B h@ $*B R8@H8@CP!B @ $ *B M@@8@CP0!B @ $`*B UX@H8@C$B@S N@ P!("/@@8@CP`!B @@ $*B @M@ D X ," DsPC cP H*qp C D!0",0L, &`hMr@P! q PC@P B@È!B@V Ex@ (!+B QH@88@CP!B @ $ +B T@P!` q `PC@P B@!B@V Dh@ (!@+B P8@08@CP!B @ $`+B L@P!p q @PC@T B@È!B@W DX@ *!+B T(@ $ H P"8JG?#  @@($@LK`B p$P0 p\HU (BYP!@!!H pB!2,@X hJ!0 ``@($Bh@ $LKD p$@0 p\HE* B B YPBB C $BB pD! ,  B`@($B@($ LKD p$P0 @p\HU" DB@YPD B C $ BB pB! ,( D`@($B@ $ LKD p$@0 @p\HE*  B YPBB C $BB pD! ,  B`@($BX@1@C(?#, @P@ ($P0  (K!0@ (H Kp q@1H8XJ$qPK,KVpx"p8K8C0$@LK`B p$`0 Rp\He (pB YPH@B C $@BB0pN! ,0H@ H` X! (1J!`",L10C 8 $PbB J (AJ!",10C H$PB 'J (1J!",X1 C (K!"/ (J!0! ( KLq0i@8C0$PLKB p$`0 Rp\He 8*B8YPNpB C $pBB0pP! ,0 N` [X UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1Ngl/(J!B @J (K!b",8P8@C$ HP8B C (K!"/ HHxpDW@C@, BP@(J!H 0K0aC8$0LKD $p0 `PH$Hu"0@B s f $0 Xp\,e@Z!P@ !`, C pP!00 0hN!,0 ,0 L` X!(K!0B @AKp ( QJp:@t"90JP•BD29 0H1B J # B , YH8EH@ @a$0 D0LK@B HH B ` 0 s,X `$BP0,P@8BF0BC!F!!H@XIh!0 0Z!,`(PB!`R! LK C PJ!0H@$$BB   `F B@YP!D!!HY XJ!2,@XPB!RH D `@!BA@X8U` X. (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.)DM-x-d  `p  0 @ @ 0 `  P  ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZIP.C;1˨TENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZPRIV.H;1T{Di;lnrszz͂ EؚFG#j  (zا! 20000/~|noo|}}0. vW`%@f^0 0  0 0 #{0{f#?A H0}#|@ 0/   }vt zz z|@ _o_ѧ|/ ը{ 0{u/ {ѧ|/0y 0 ѧ|/ 00 ѧ|/Ш!1ѧ|/00 0  01 Ƨ@ ѧ|/0ѧ|/ 0ѧ|/ |x  x*h g{|{|{0  @  w i0  u{0 @|2|oxx>@%.o0&UNZIPHP C S7.1-012mainunzipuz_optsHusageHL__main,0&.shstrtab.note$READONLY$MASK_BITSVERSIONDATECENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSG$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind_info.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZIP.C;1GMAINUNZIPUZ_OPTSUSAGEMASK_BITSFNAMESVERSIONDATECENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSG__MAINELF$TFRADRDECC$MAINDECC$EXITGLOBALSCTORRETURN_VMSDECC$SIGNALDECC$STRNCMPDECC$STRCMPDECC$TXSPRINTFPROCESS_ZIPFILESDECC$ISATTYDECC$$SHELL_HANDLERHANDLER     1@ 3 8 0 > F @$LDV]iGt<|$ -   !2>R' +' M' ' ' @$' ' 0&e ee' W,_ _ _ _  _ (_ 00_ 8_ @_ HH_ P_ @$X_ h`_ @$h_ 0&p_ I"I I#2I$RI bI%R-I&R-"I&@R-RI&pR-I&R-I&R-I& RI 0`2 hI'2 `I(I)     I)r I*   0@APrI)88I)I)0@APrI)I @$ !I)0!@!xA!P!xr!I)"I+r"I @$"d UNZIP.BCKs)[UNZIP60.VMS-BINARIES]UNZIPSFX.IA64_OLB;1NÆ >"""2 X"H##H"#I)A$B$Q$R$H`$p$Hq$r$2 X$$I)Q% `%2 Pp% %I)4d p D&P2`H=@E(X 0oPy0& ,l,p@px @6Z7P`/;x`4` 4sh<` `40<0-<E=hXx>H  $*[UNZIP60.VMS-BINARIES]UNZIPSFX.OPT;1+,./ 4-s0123KPWO56V 7k; 89GHJIdent = "UnZipSFX 6.0" -*[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1+,./ 4-s0123 KPWO56v 7h 89GHJ% VAX-11 Librarian V04-00Iy_v Ɏ# !* 2`  77  ACC_CBASSUMENOtCENTRAL_HDR_SIG CENTSIGMSG CHAR_PROPCHECKDIR CHECK_FORMATCHECK_FOR_NEWER CLOSE_OUTFILE3CRC32DEFER_DIR_ATTRIBS_DEFER_LEFTOVER_INPUTDEST_STRUCT_LEVEL_ DO_STRINGECHOtEND_CENTLOC64_SIGtEND_CENTRAL64_SIGtEND_CENTRAL_SIGEXCLFILENAMENOTMATCHED9EXTRACT_IZVMS_BLOCK9EXTRACT_OR_TEST_FILESFILENAMENOTMATCHEDFLUSHtFNAMESLSCTOR_HANDLER3CRC328CRYPT9EXTRACT_FILEIOtGLOBALSwINFLATEMATCHPROCESSTTYIOUBZ2ERRUNZIPVMSp REPORTMSG RETURN_VMSSCREENLINEWRAP SCREENSIZESEEKMSG_ SEEK_ZIPFSET_DIREC_ATTRIBS9TRUNCEAS9 TRUNCNTSDTT_GETCH_ UNDEFER_INPUTUNZIPUSAGE_UZPINPUT_UZPMESSAGEPRNT_ UZPMOREPAUSE_ UZPPASSWORDUZ_OPTS VERSIONDATE VMS_MSG_TEXT_ ZSTRNICMP__MAINGFNAMESHANDLER MAKEINT64READBYTE__MAINCMP;_MAKELONG_MAKEWORDMAPATTRMAPNAME MASK_BITSMATCH9 MEMEXTRACT9MEMFLUSH_OEM2ISO_ OEM2ISO_850OPENR_ID_OPEN_INPUT_FILE OPEN_OUTFILEPROCESS_CDIR_FILE_HDRPROCESS_LOCAL_FILE_HDRPROCESS_ZIPFILES_READBUF_READBYTE HEX_DIGITw HUFT_BUILDw HUFT_FREEwINFLATEw INFLATE_CODESw INFLATE_FREEINVALIDRESPONSEISWILD JPI_ITM_LSTt LOCAL_HDR_SIGMAIN_ MAKEINT649FNFILTER3FREE_CRC_TABLEFREE_G_BUFFERS_FZOFFT GETZIP64DATA3 GET_CRC_TABLEt GLOBALSCTOR_HANDLER UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1T /$ UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1 !"#$%&'u@ UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;15'()*+,-./01241'jv V1.02CRC32V1.030-APR-2009 11:08DEC C V6.2-003r ~Plocal header sig`P%s: bad file comment length LP%8sing: %-22s %s%sPfile #%lu: bad zipfile offset (%s): %ld P%s: bad extra fie TRUNCEAS  TRUNCNTSD REPORTMSGEXCLFILENAMENOTMATCHEDFILENAMENOTMATCHEDSEEKMSG CENTSIGMSGGCENTRAL_HDR_SIG LOCAL_HDR_SIGDECC$GA___CTYPEDECC$GA_STDOUT DECC$GA_STDINCRC32 GET_CRC_TABLESET_DIREC_ATTRIBSDEFER_DIR_ATTRIBS CLOSE_OUTFILECHECKDIRMAPNAME?MAPATTRMATCHINFLATEFNFILTER MEMEXTRACTFZOFFTMAKELONGMAKEWORD DO_STRINGCHECK_FOR_NEWERld length (%s) P%s: ucsize %s <> csize %s for STORED entry continuing with "compressed" size value P%s: bad filename length (%s) HP skipping: %-22s unsupported compression method %u  P skipping: %-22s need %s compat. v%u.%u (can do v%u.%u) P__iscntrlhPլRDECC$GA___CTYPEQˏP@aPˏPRRP<^ԭԮY|UԮ||@G3 GET_CRC_TABLEPG3G3n1GPG3HRG 3RRG3GCHECKDIRPRRR  n1XPn1OPG3G@3G3/xG3~ DECC$MALLOCPURG3PBeRRG3G3,xG3~ DECC$MALLOCPVRG3BfRRG3ԮZREADBUF DECC$MEMCMPPROCESS_CDIR_FILE_HDR DO_STRING MATCHT DECC$DSPRINTFXFNFILTERA[WPWRBG3G@3G3P 3YZ1PCENTRAL_HDR_SIGG3P1Gn3\P<\ҮRR\RRGf3gxRWRRR CENTSIGMSGG@3h<~PG@3GG}3P` REPORTMSGG@3h<~PG@3GG}3P`YZ1K PR RYZ18P<GT3~(PRbRYRYRU< ~G@3R@R~G3k PqG@3h<~PG@3GG}3P`Z1P<GBV3~(PRbRYRYRU< ~G@3R@R~G3kϴPzG@3h<~PG@3GG}3P`Z1PP<GX3~(PR^RYRYRQ< ~G@3R@R~G3kPnG@3hSP=SG3SϏG@3 DECC$DSPRINTFPG@3GG}3P`1T4G3ςG@3 DECC$DSPRINTFPG@3GG}3P`1G3<R4G3ϒG@3 DECC$DSPRIN>#l UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1 EFTFPG@3GG}3P`GTρS|SSTG3wG@3 DECC$DSPRINTFPG@3GG}3P`ծBѮ9S4SSݮfG@3 DECC$DSPRINTFPG@3GG}3P`խYծQYP YPծ YQYYnP^G@3P<GP3\ʏ\\G@3Q<GP3\ʏ\P\PPG@3P<GJ3\ʏ\\G@3\G@3 G@3\G03G@3G\G43G 3 G 3)G@3\&PG@3P\\PG@3\GO3\\1GN3\\*1KGD3 G<31GD3G<3s< ~G@3\@\~G3FNFILTERPSGN3RzRP{ PQPP R~υS3G@3 DECC$DSPRINTF<~PG@3GG}3P`T11GN3RR1GD3 G<31GD3G<3s< ~G@3R@HR~G3FNFILTERP\GN3SzSP{ PQPP S~\υG@3 DECC$DSPRINTF<~PG@3GG}3P`T1=P<GR3R1RGD3G<3hGD3G<3X< ~G@3R@R~G3FNFILTER<GR3~P1G@3 DECC$DSPRINTF<~PG@3GG}3P`T1PG@3RRuGD3G<3aGD3G<3Q< ~G@3R@R~G3FINFILTERPRG@3 DECC$DSPRINTF<~PG@3GG}3P`T'MAPATTRG@3RGH3G@3RG83bTTP^[լ10  DECC$DSPRINTFVREADBUF DECC$MEMCMP DO_STRINGFNFILTERFZOFFT DECC$STRLENY DECC$FGETSZּ[RBG3G@3G@3RG 3bTzTP{ PQPPSSTUT1 REPORTMSGG3SEEKMSGG@3f<~PG@3GG}3P`Ѽ1JG 31G@3f<~PG@3GG}3P`G 3G 3G@3RbTzTP{ PQPPSSTUTK REPORTMSGG3SEEKMSGG@3f<~PG@3GG}3P`1  P1 UG31UG3 DECC$LSEEKPG3< ~G3G3 DECC$READPG3G3=UϱݼNG@3f<~PG@3GG}3P`1/ PG3SG3SGK3*PG3G3RSRG3RG3G3SG3G3P=T+ݼG@3f<~PG@3GG}3P`1P LOCAL_HDR_SIGG3P1cTЬRbiG@3f<~PG@3GG}3P`bG 3G 315ռ1-ϫG@3f<~PG@3GG}3P`G 3G 3G 3 PмG 3G@3Rb SEEK_ZIPFPRLG3P?R3TݼϛG@3f<~PG@3GG}3P`1| LOCAL_HDR_SIGG3PBTϲݼKG@3f<~PG@3GG}3P`1,P1%PROCESS_LOCAL_FILE_HDRPS4ݼuG@3fG3PPG3PG3PPG3`\ READBYTEP\\1fG31KG3G@3FLUSHP\T\1+\T1%GD31G<31< ~G@3\@\~G3FNFILTERG 3T\SG@3\\W\V\\SG3 4RP,RRSPiޟG@3 DECC$DSPRINTFPG@3GG}3P`<G*3\P\ PPINFLATEPS1US21GD3G<3GD3uG<3mSϐRϠR< ~G@3\@\~G3FNFILTERPϔR6G@3 DECC$DSPRINTF<~PG@3GG}3P`GPS#R4RKRG@3 DECC$DSPRINTF<~PG@3G< UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1TUG}3P`STqTkPSTcP< ~G@3\@\~G3FNFILTERPG@3 DECC$DSPRINTF<~PG@3GG}3P` UNDEFER_INPUTU1PGD3 CLOSE_OUTFILEG3dG3X< ~G@3\@\~G3FNFILTERPaG@3 DECC$DSPRINTF>r2\҂>Z(H5Zܐȵ7/gU.(;׳GitI6Zm@~?.r2Gm?vX2D%:VFGy>%] :bN*Kc2 # @I-Q6< dv`ZsY [%, e~}hTy1CAsxPqcT 5md ܇fgq.^'Ch޴[?Ku_y+Y/ 2mB=W6dT! ]dޜ1A[:x/&4($rm "33&Bj &xdO|@R8LK^,t;O (PO 'X݂L& 0Ń &㱑bU6!#!ud;r'K< vL߇:=@* 9,HৃsNwnw:enH%a" oZ Z}ofh,8{ ],0!IZ  Az7zsZ 4v<ƌqҕwR_ܑg$O;-Q5K*_?'!e:q@\w7(2l?8Ϣ<sTG)cQ7;UZh$im ."naQZ^&%=|FH`hOV.m|ϮxL%%sBDl$n|XK]L_qv}F_m#enO|ק5Ÿ2P׀>,t/>IVFZJFtx F:2Y(N Ab`/jh'(Bz#kLJQ('Ω.b:|/1aJ+'Mv=Cj1WHLj?"]0 ;rD"4{4[,|)i$v<4ȝx:FU^e81n:SS{v}Bâcyxr{Mm'/C& 9 mB?42}X4*2r@]yZS1{ ca'EAo@V]Fh5??:8'H*; m̃w֯ 4aS9^i1u?9>]|5n0tq+r֘1CMpDt<}rE`T^gѵnYV9JlFD#\o:`1+*İgޗTg,Fz'tWkc at͘k29-@Q[Y9]VN"I| K?"\}F=Kyb orZ(q% t DkW_S-OD ڂ~)Gl)9N̍?}n#?B%0C(2ډg g"MJ|9:0 |Of(gG`+Ťjҵe|Jc+4<+֧NQ牿\ Y^@Q@PE*%.CAHXMAs%u7ؕjg'Ӿ Kj8C+Y LAmX7Cٍ,OaPF]ѱH?t٫׎KxƨQ|s+4JCcRƻ $ÙGTP%ݮ.U? `G rD^0 Q`g{QtV5VbJ(5A*[cӟjPa/ԩR ~t^o,tqcBN :($[WT@jBUI οD:L@NCXD.^ \_S!d%vUNE<@*u jL`SA.T乣_JwkqRΌ*JpR4o~HT8%$z Ѯ#lu߶pr- M=33KLb7 3yv;^)b[} u'( "~&3vOi%4*gddH v2k<ɢ7$-7: S.1`3=?|DHcakpawjkakdfh>l[:K>gGjk6hy&k**/k).d>!E#HixcApH5*ٺm2Zq\u#D4Q*?Q>uS&_dy}9[_B*Q4frBx(\ԝUnRX#@F|Z*f mLԅx6` ԉ\C 4WhhA^!l%x2 rXTX8]Ps3b ly1K)<ZRqFʀ7@R;wޅP'֕r\0A BMRY`xr fܗdm|6S/zS!)]yayV Ckag j9YюKWMxRF?$ ڿRa R 3]\Z>RO rBI} *(6χF$sRa$u+#[E'Z F&M^-T[n+&N,ҟUܑ"JS _5rV ɴzuCƹ)˂ >$ySBDI R2%@IS]]g|,|~w ǍZ c4x(qN~3~Hm BH S #ea&@IND Yshl l'=0⎂YZ ]IX G@cP !?\pu'.vF.\['͌fF1w~Z+cv`qRMn\CUH; $ҴaU |+;1:G5E II+j˼sZZ=V4J;_mn>ciԁ޵pGW:Hq My2e%>㳿y4e`a+56\F8PCgmN%Crq([;W:n v"PkF)d zCZͳ=v3pQY"#D]gP3#8Z?7ߖ8 ts36$-vuX>g/V31V*%B:?&ZX`$ٵ'ObtNIZ㔶1؄Y,uQ'Rʓ0AU;%M#+  zfd͇&8Le$gA8gOG>8a;-X{ɛ:E!.syvմL; %EV+@6M itgu_CYCo b֐^RD;Hx LGх͒Q3#ĖPplCh<ř*_z9){Ct[^VVdRZ-2>"c+?c%졭J%hyYsۖdus(6J)UK䓫Q),2eE#Ckjy[xo(@1UugJOMS;^CǭdW=OϪr)wCY*E>lE=Jⱪֶ/߯[d{dN}~%!B{e\g\Sƒ8Psuh,w56ەӉ>E}0_R; I2ᙑ_A N,xՄp9s4i&Z֦5 ͵n2]WآFH8IWouTL6jDz2>̼6M`CLo[yo̴UJ%6Mh=0l?*\ceMM[o5440?㶇ک(ǂfV^$h-2KhIHl!VUZQ)iڰ~0Okn\/KזDO"UjheHg}85p1Dbl1u*P;,jؽLgٌ̈$/n[pe (Ze:ټv54>*t[^oStYK?'mbیr*iuCŤ4?8ص!{kMVjWEImJ5XyLlX :`/"؄(\oJ;o YthrGX3D[x;=>I3DDfպ& edT>RP4|p fk7' 0b6XDv OA&$Fs!6ڥ4 O&ӶZ~v:YaNwT>vش5Syx%1}]m*y9y!X{{w[)dN m pn/LPjpD/  D%eu;,$ʯ'hQgQל o >mJȺv_53H,:-moP?WDq_To?n_sH<@&էSp84My5" /{RUdӶ@oXgGa ,< Ҙ5<ܷE>+(7f "v+ p E4\rJG8; fTmwr'c' (O;T,Eǐb"-l^mMpe 15k JVI!^jY UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1cd3G3G3*G3G3G3G3G3G3G3PG3G3G3G3=G3G3G3G3G3G3G3G3G3G3PG3G3G3P<^ЬUլ1PG3z< ~G3G3 DECC$READPG3G3 ìUT1G3,| DECC$STRLEN<~PjGG}3P`TegP G3G3G3ЬSSG3SRG3RRG3ݬ DECC$MEMCPYRG3RG3RG3RS12UTTPP^G3R1G3G3G3R1PG31< ~G3G3 DECC$READPG3G3R1G38t DECC$STRLEN<~PbGG}3P`ECHO RETURN_VMS G3G3G3G3G3=fG3G3G3G3G3G3G3G3G3G3PG3G3G3G3G3\\G3lRRPP<^G 3SzSP{ PQPPTTSUSA REPORTMSGG3SEEKMSGG@3 DECC$DSPRINTFPG@3GG}3P`S1PUG3_UG3 DECC$LSEEKPG3< ~G3G3 DECC$READPG3G33SDPTgG3G3TG3*PG3G3RTRG3RG3G3TG3SSPP^ЬRRXR ZRUVˏRЬRբDDECC$GA_STDERRRbY PDECC$GA_STDOUTRbYˏR%լ  ЬRլ RR  ֬ ЬSÀx SCREENSIZExˏR11Y  DECC$PUTCY DECC$FFLUSHգt&Ä֣|ѣ|xϴSP`ˏREЬRբD< DECC$ISATTYP/ DECC$ISATTYP"DECC$GA_STDERRRb  DECC$PUTChDECC$GA_STDERRRb DECC$FFLUSHЬRЬRբt1UZ1ePP V7PSCREENLINEWRAPP)ePP  ЬPPЬPɀVVnVЬR„֢|Ѣ|xTXXUSSSY DECC$DFPRINTFQPSQQT TW1PY DECC$FFLUSHUXώRP`UUZ1@XU Ь T1XTjY DECC$DFPRINTFRPTRRSSW1ˏRaЬRբDX DECC$ISATTYPK DECC$ISATTYP>XTDECC$GA_STDERRRb DECC$DFPRINTFRPTRRSSW-PiDECC$GA_STDERRRb DECC$FFLUSHЬTRSR SSWWPPԼ QQP ^ЬPDECC$GA_STDERRP` DECC$DFPRINTFЬPDECC$GA_STDERRP` DECC$DFPRINTFDECC$GA_STDERRP` DECC$FFLUSHˏ P3PTT_GETCHPRRPP (P #P PqPQ TT_GETCHPRZDECC$GA_STDERRP` DECC$DFPRINTFDECC$GA_STDERRP` DECC$FFLUSHDECC$GA___CTYPEQRSˏSP@aPʏPS DECC$TOLOWERPQSQQPPq  RETUjRN_VMSЬQˏ P RPP ԡ|PPP^ECHOѬ ;Ϩ8G@3 DECC$DSPRINTF&  @>1 8   h> 0>3S' > >#  r   j@W DECC$PUTC DECC$DSPRINTF DECC$DFPRINTF DECC$FFLUSH OPEN_INPUT_FILE  UNDEFER_INPUT DEFER_LEFTOVER_INPUT h<READBUF TREADBYTE < SEEK_ZIPF UZPMESSAGEPRNT \ UZPINPUT h UZPMOREPAUSE UZPPASSWORD HANDLER x  DO_STRING  MAKEWORD MAKELONG ; UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1~rs MAKEINT64 hFZOFFT @< ZSTRNICMPe$CODE$DATA $ADDRESS_DATAOEM2ISO OEM2ISO_850<^լ 1 DECC$TOLOWERUDECC$GA___CTYPESRˏRP@cPʏP RePTPRTDECC$GA___CTYPERSˏSP@bPʏP SePRPSRTQRPQP~DECC$GA___CTYPESRˏRP@cPʏPR DECC$TOLOWERPTRTDECC$GA___CTYPERSˏSP@bPʏPS DECC$TOLOWERPRPSRTQRPQPS.S(PЬQaPSP Q֬լ 1SSP PIHt'Hwwu1ib V1.04GLOBALSV1.030-APR-2009 11:09DEC C V6.2-003RGLOBALS  __iscntrl,L globalsCtor r )/    LOCAL_HDR_SIG CENTRAL_HDR_SIG END_CENTRAL_SIG END_CENTRAL64_SIG END_CENTLOC64_SIGG FNAMESDECC$GA___CTYPE DECC$MEMSET UZPPASSWORD UZPMOREPAUSEUZPINPUTvUZPMESSAGEPRNT L GLOBALSCTOR$CODE$DATA $ADDRESS_DATA LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIG GFNAMESL PglobalsCtor P  P*PPPPPP__iscntrl PլRDECC$GA___CTYPEQˏP@aPˏPRRP ^ SRݏb DECC$MEMSET,c¸¼@UZPMESSAGEPRNT}UZPINPUT UZPMOREPAUSE UZPPASSWORDbP wwx1* V1.04INFLATEV1.030-APR-2009 11:09DEC C V6.2-003Phuft_freePhuft_buildPinflate_freePinflatePinflate_blockvP(incomplete d-tree) `P(incomplete l-tree) PPinflate_dynamic@Pinflate_fixed0Pinflate_stored Pinflate_codesPP P ccP !1Aa  0@`PyccXP #+3;CScs P     P__iscntrlPլRDECC$GA___CTYPEQˏP@aPˏPRRP^[G3VG3TG 3ZЬ RB MASK_BITSnЬRB MASK_BITST ZPG3RRG3RG3RRG3bS READBYTEPSS T[10PxTSRRVTT VRRnRRRЮRSS RSRVVSTUU [ZRZЮS3BGz@3Z1UG3ZG@3MEMFLUSHP[ZG@3FLUSHP[[1Z1U1TUZPG3RRG3RG3RRG3bS READBYTEPSS T[1@PxTSRRVTTUЮR<SVRRE MASK_BITSRSRU RURVVUTTZPG3RRG3RG3RRG3bS READBYTEPSS T[1PxTSRRVTTVRRRRRYQQ SQSVVQTiRR 1Rc 1rʏRTRWG3P{PG3PG3PPG3`S READBYTEPSS T[1PxTSPPVTTRVSSB MASK_BITSSSSY1ZPTRZPG3SSG3SG3SSG3cX READBYTEPXX T[1PxTXSSVTTR<SSZXVSSB MASK_BITSSSXWR SRSVVRTʏWWZWSPZSSRRЮRRWZPPR"RG@3PWP~ZP~ DECC$MEMCPYRZRWPZQZWPW@G@3AG@3RZ9G3ZG@3MEMFLUSH|P[ZG@3FLUSHP[[1Zծ1C10U1Uc 1ʏUTUSG3RRG3RG3RRG3bS READBYTEPSS T[ExTSRRVTTUVRRE MASK_BITSRRЮSR1 1ZG 3VG3TG3[ P^UG3RG3\G 3Vˏ\TT STSRRT\\ZPG3SSG3SG3SSG3cT READBYTEPTT \U1Px\TSSR\\ˏRWRR}\\WG3SSG3SG3SSG3cT READBYTEPTT \U1Px\TSSR\\RSʏSWSX1RR\WSWS1READBYTET\VPG3PPG3PG3PPG3ǚ`SdPSS \U1Px\SPPR\\VSVRCG@3V9G3VG@3MEMFLUSHPUPVG@3FLUSHPUU+VRR\WSWS1BVG 3RG3\G3UXXPPx^G31~\Lx\\\P Lx\\\PLx\\\ PLx\\ G3G3G3B<~< ~x HUFT_BUILDP\G3\T1PRPBxRR G 3G 3G3P x HUFT_BUILDPSS1G3RRТ\R DECC$FREE\RG3G3ST$PG 3G3G3G3 INFLATE_CODESPTTPPh^|G3TG3SSYPG3RRG3RG3RRG3bU READBYTEPUU SY1PxSURRTSSˏTRRTTSSZPG3RRG3RG3RRG3bU READBYTEPUU SY1PxSURRTSSˏTRRnTTSSWG3RRG3RG3RRG3bU READBYTEPUU SY1PxSURRTSSˏTWWTTSѮ n 1=UW1READBYTEVSVPG3RRG3RG3RRG3b\fP\\ SY1PxS\RRTSSERˏTBTTSUUWUERBUU|~ HUFT_BUILDPUUU4U(RRТR DECC$FREERU19n[RB MASK_BITSZV[1READBYTEWPSVG3RRG3RG3RRG3b\gP\\ SY1ePxS\RRTSSTRRRRR\XX RXRTTXS<XXVRVXZZB1]X1SVPG3RRG3RG3RRG3b\gP\\ SY1PxS\RRTSSˏTUUTTSVURR[1\P\Ьͼ\ DECC$FREEͼ\1URUR1VRVZBURUR1X1SVPG3RRG3RG3RRG3b\gP\\ SY1PxS\RRTSSˏTUUTTSVURR[%RPRТ\R DECC$FREE\R1URURPVRVBURURZ1SVPG3RRG3R| UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1OG3RRG3b\gP\\ SY1)PxS\RRTSSˏTU UTTSVURR[)RPRТͰR DECC$FREEͰR15URURPVRVBURURZV[1͈͈RRТ̈́R DECC$FREË́RTG3SG3 z8<~ݮ HUFT_BUILDPUUUUUIG<3GG}3P`ͨͨRPRТͤR DECC$FREEͤRU1IO ݮSxRRS~ HUFT_BUILDPSSS ѮSS|SHG<3yGG}3P`͘͘RRТ͔R DECC$FREE͔R͐͐\\Ь͌\ DECC$FREE͌\S~ INFLATE_CODESPY)̀̀RPRТ|R DECC$FREE|R*xxRPRТtR DECC$FREEtRYP|^G3SG3RWPG3PPG3PG3PPG3`T READBYTEPTT RU1PxRTPPSRˏSSSRRVPG3PPG3PG3PPG3`T READBYTEPTT RU_xRTPPSRRˏSVSSRSG3RG3V 5PR&V PRPV ϾPRUURRPP^G 3G3G3լRWP߭ϤPQQRBPխG3G 3G@3MEMFLUSHPRPG 3G@3FLUSHPRRP ^G3LG3RPRТ\R DECC$FREE\RG3SPSУ\S DECC$FREE\SG3G3RRP0^ͰRR$Ѭ ЬRD~ DECC$MEMSETЬRSbTDRS ԼԼԮ1RBRRR[ЬScRRcT PDTT ЬScTTcxRRT PB1kRxRTD 1NPDRpUUSlUUWT RRT<~8 DECC$MEMSETTSЄRBlUBlSE8SSЮ RBlYl8Z0Ю$RԢWԭXԮ [ 1ެ( DECC$MALLOCKЮR׮R1jPЮ0RB$WR[R1DЮ0R֮0B$WW PЮ(RPвPW[VxVSS1RRSUx[TUTVVPxSSTSd dSVVPVWRR WWVxV Ю0RVB$ RR~PX)ծ0ЭSPSУRS DECC$FREERS1XԼXЮ0RXBRSYBlЮ$SBg VRRfXhЮ0RBWSS TxWRRRRRYRSTRVVRЮ0SCS(fBcЮ0RB$WR[R1W[RRg8SxRRSZS cfJPjSЬ USU S TPTTfhUS޼RCbfUR޼SBchW[RxR,W RWRYVV VR(fBh,VV [SxSRYSSRSPRYRRYSSRSRYxWSSSSSYSЮ0TSDl(P׮0Ю0RB$WxWRRRRRYRЮ0SRClЮR׮R1[[ 1vо$SծѮ SSЮP ^ЬSSУRSRINFLATE __iscntrl, inflate_codesinflate_stored inflate_fixedV inflate_dynamic inflate_block.inflate| inflate_free_ huft_build<0 huft_free$ I=  7E   6X 6A] }7%   7 7 7  74  7 P 7 5 8*  8A  8 % .8 087 :8 <8 G8 I8 81 U8! h8& 85 8] 8 8e (9 )9( u9m {9 9 9 7 9Q 9m 9 1 9 9 9 9Q 9 "X :OM MASK_BITSGDECC$GA___CTYPE INFLATE_CODES HUFT_BUILDMEMFLUSHFLUSHREADBYTE DECC$MALLOC DECC$FREE DECC$MEMSET DECC$MEMCPY  INFLATE_CODES INFLATE  INFLATE_FREE  HUFT_BUILD 0 HUFT_FREET$CODE$DATA $ADDRESS_DATA DECC$FREERSPww1iC V1.02MATCHV1.030-APR-2009 11:09DEC C V6.2-0030Piswild(Pnamecmp PisshexpPrecmatch PmatchP__iscntrl8PլRDECC$GA___CTYPEQˏP@aPˏPRRP^ݬ ݬݬQPQQRRPP^ЬScZSZRSRSSX1Z?'ЬScRݬ SSݬPX1PX1PZ*1ЬScRX1sSRbP7bQQ\ PRPQ?Q* Q[RS RbPSScЬSS DECC$STRLENPRЬTT DECC$STRLENPRSRUUSX1լ UTPSUT DECC$STRCMPPSRSRRX16PR'Pݬ ݬݬPQ QX1P֬PX1Z[1RX1TЬRbRR! R^TTWWЬVSfR,SSfPP\S PP]VfPԚfRR]X1PRЬTdSPS-PPYTV1ެ U DECC$TOLOWERTYPP\Y1YЬQaPP-qR1Pe8DECC$GA___CTYPEQЬP`SˏSP@aPʏP SdPQPSQQSSЬQPP-zRaRaPRPke0DECC$GA___CTYPEQˏRP@aPʏP RdPQPRQQPRPPS$WX1Pݬ ~V~'PX1RPRPYR֬ѬV1Wݬ ~V~PX1PX1PZ\ЬR֬bZX1Pլ 7DECC$GA___CTYPESZTˏTRBcRʏRT DECC$TOLOWERPRPTRRUZUլ <DECC$GA___CTYPETЬRbSˏSRBdRʏRS DECC$TOLOWERPRPSRRSSUSݬ ~ݬ+PXPXXPP<^PDECC$GA___CTYPESЬP`RˏRP@cPʏPR DECC$TOLOWERPUPRUDECC$GA___CTYPERЬP`SˏSP@bPʏPS DECC$TOLOWERPRSRUQRPPQTЬRbP ЬQaPTSPRQ1cPSPP9ЬQaRR\R MATCH8 __iscntrl, dmatch"recmatchlnamecmp iswildD 89 { 39 4! .4;& B4j 84zA  4S DECC$GA___CTYPE DECC$STRLEN DECC$STRCMP DECC$TOLOWER dMATCH ISWILD\$CODE$DATA $ADDRESS_DATA2P QPR%R*P ֬RP8ww:{ UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1 1i|C V1.04PROCESSV1.030-APR-2009 11:09DEC C V6.2-003tPgetZip64Data\Pprocess_local_file_hdrLPget_cdir_ent4Pprocess_cdir_file_hdr Pprocess_zip_cmmntP[%s]  Pfind_ecrecP[%s] P[%s] P[%s] P[%s] P[%s] P[%s] Pfind_ecrec64Prec_findP P%sEmpty zipfile. Pdo_seekablePfree_G_buffersPprocess_zipfilesZP caution: zipfile comment truncated (P End-of-central-directory signature not found. Perror: End-of-centdir-64 signature not where expected (prepended bytes?) (attempting to process anyway) XPfatal error: read failure while seeking for End-of-centdir-64 signature. This zipfile is corrupt. Perror [%s]: start of central directory not found; zipfile corrupt. %sPwarning [%s]: zipfile is empty Perror [%s]: NULL central directory offset (attempting to process anyway) VPerror [%s]: missing %s bytes in zipfile (attempting to process anyway) 1Punzipsfx: cannot find myself! [%s]  Perror: cannot allocate unzip buffers  REPORTMSGGEND_CENTLOC64_SIGEND_CENTRAL64_SIGEND_CENTRAL_SIGCENTRAL_HDR_SIG LOCAL_HDR_SIGDECC$GA___CTYPEFREE_CRC_TABLECHECKDIRISWILD CHECK_FORMAT INFLATE_FREEEXTRACT_OR_TEST_FILESFZOFFT MAKEINT64MAKELONGMAKEWORD DO_STRING SEEK_ZIPFREADBUFOPEN_INPUT_FILEFREE_G_BUFFERS DECC$MALLOC DECC$FREE DECC$MEMCMP DECC$MEMCPY DECC$READ DECC$LSEEKP__iscntrlPլRDECC$GA___CTYPEQˏP@aPˏPRRP ^\S< ~ DECC$MALLOCPG3<~ DECC$MALLOCPG3G3G35G@3 DECC$DSPRINTF<~PG@3GG}3P`R1 G3G3PEND_CENTRAL64_SIGPEND_CENTLOC64_SIGPEND_CENTRAL_SIGPCENTRAL_HDR_SIGP LOCAL_HDR_SIGKEND_CENTRAL64_SIG3KEND_CENTLOC64_SIG3KEND_CENTRAL_SIG3KCENTRAL_HDR_SIG3K LOCAL_HDR_SIG3G43 G3PG83 G3 PG3P\\I\L SP\S\ 1G3KG@3 DECC$DSPRINTFPG@3GG}3P`FREE_G_BUFFERSSRRP^ INFLATE_FREECHECKDIRG3 FREE_CRC_TABLEG3G3G3 DECC$FREEG3G3G3 DECC$FREEG3G3 G3 DECC$FREEG3 G3 DECC$FREEG3G3P<^RG3ISWILDP7Gx3G3 DECC$STATP <G3PʏPQP@QQRR LT1P T1|PG3G3 CHECK_FORMATPT1^OPEN_INPUT_FILEP T1MPG3G3G3G3 G3RЏRR^ PUUG3 DECC$CLOSE֬UT1Gh3G3G3 DECC$CLOSEUT1RG3 <Gj3PRG3G3G 3G 3SI|~S~FZOFFTPG3KG@3 DECC$DSPRINTF<~PG@3GG}3P`U^PSXG^3PGZ3HG3GG@3 DECC$DSPRINTF<~PG@3GG}3P`G 3G^3G 3UG31GZ31G3FG,3  RPRRG@3 DECC$DSPRINTFPG@3GG}3P`4G3G@3 DECC$DSPRINTF<~PG@3GG}3P`G3 DECC$CLOSEUUT1NT1HPG^3 SEEK_ZIPFPRRG3 DECC$CLOSET1R/G3READBUFPCENTRAL_HDR_SIGG3 DECC$MEMCMPP1G 3G^3 SEEK_ZIPFPR,G3READBUFPCENTRAL_HDR_SIGG3 DECC$MEMCMPP]R: REPORTMSGG3 G@3 DECC$DSPRINTF<~PG@3GG}3P`G3 DECC$CLOSERRTRTMPUG^3 SEEK_ZIPFPRG3 DECC$CLOSERT#EXTRACT_OR_TEST_FILESPQQUQUG3 DECC$CLOSEUTTPP^SG3TzTP{ PQPPWW 1WT~G3 DECC$LSEEKPG3WG3G3 DECC$READPG3G3W V1PG3WP RRPG3G3G3UPG3RbPPP-ݬR DECC$MEMCMPPG3G3PPG3SPG3G3G3G3G3 DECC$MEMCPY PWTG3WRRǏ RUTS1TU1 DECC$MEMCMPRPG3G3G3 DECC$LSEEK< ~G3G3 DECC$READPG3G3 V1P G3PPG3G3G3RPG3QaPPP)ݬQbPG3G3PPG3SPG3G3G3G3G3 DECC$MEMCPYTSTU1SVPVVP^G3SX1PSG3 DECC$LSEEKPG3G3 DECC$READPG3G3zG<3G34G3ϪG@3 DECC$DSPRINTF<~PG@3GG}3P`G@3 DECC$DSPRINTF<~PG@3GG}3P`X1?PEND_CENTLOC64_SIG DECC$MEMCMPPX1"MAKELONGPZ MAKEINT64PYMAKELONGPR<Gj3QQ Do same for all files): XPreplace@Preplace_rms_overwrite(Preplace_rms_newversionP[ Cannot create (QIO) output file %s ] Pcreate_qio_output: sys$assign failed. Pcreate_qio_output: sys$parse failed. xP[ File %s has illegal record format to put to screen ] dPcreate_qio_outputXPPPHPH(8P <P9PCannot create ($connect) output file: %s P[ Cannot allocate space for %s ] P[ Cannot create ($create) output file %s ] P[ File %s has illegal record format to put to screen ] Pcreate_rms_outputmPCannot create ($connect) output file: %s @P[ Cannot create ($create) output file %s ] (Pcreate_default_outputP%02u-%3s-%04u %02u:%02u:%02u.00Pset_default_datetime_XABsPPPDECPNOVPOCTPSEPPAUGPJULPJUNPMAYPAPRPMARPFEBPJANPinit_buf_ringPopen_outfileP Error: zipfile is in variable-length record format.  Please run "bilf l %s" to convert the zipfile to stream-LF record format. (BILF is available at various VMS archives.) P sys$open() error: P error: cannot open zipfile [ %s ]. Pcheck_formatHP Default: deq = %6d, mbc = %3d, mbf = %3d. PGet RMS defaults. getjpi sts = %%x%08x.  Pget_rms_defaults PP    OPENR_ID INVALIDRESPONSE ASSUMENO  HEX_DIGIT  CHAR_PROPRMS_EXT_ACTIVE RMS_MBC_ACTIVE RMS_MBF_ACTIVE JPI_ITM_LSTGDECC$GA___CTYPEDECC$GA_RMS_XABRDTDECC$GA_RMS_XABPRODECC$GA_RMS_XABKEYDECC$GA_RMS_XABFHCDECC$GA_RMS_XABDATDECC$GA_RMS_XABALLDECC$GA_RMS_RABDECC$GA_RMS_FABDECC$GA_RMS_NAM DECC$GA_STDINDECC$GA_STDERR SYS$SETDFPROTLIB$SYS_GETMSG SYS$WRITESYS$WAIT SYS$SYNCHSYS$QIOWSYS$QIOSYS$PUT SYS$PARSESYS$OPEN SYS$NUMTIM SYS$GETJPIW SYS$EXTEND SYS$DASSGN SYS$CREATE SYS$CONNECT SYS$CLOSE SYS$BINTIM SYS$ASSIGNCRC32CHECKDIRFNFILTEREXTRACT_IZVMS_BLOCK ZSTRNICMPMAKEWORD DECC$MALLOC DECC$EXIT DECC$FREE DECC$STRLEN DECC$STRNCMP DECC$STRCMP DECC$STRRCHR DECC$STRCPY   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P0123456789ABCDEFpPP (EOF or read error, treating as "[N]o extract (all)" ...) Perror: invalid response [%.1s] P__iscntrl P#= p=ףլRDECC$GA___CTYPEQˏP@aPˏPRRP ^R|~ |~ SYS$GETJPIWPSˏS\\  PT@  <\ \  \  GT3GSLDECC$GA_STDERR\l DECC$DFPRINTF)~~<~EDECC$GA_STDERR\l DECC$DFPRINTFS\\PP|^\DECC$GA_RMS_FABR(PbG3G3 DECC$STRLENPܟSYS$OPENPUˏUR1< ~G@3R@R~G3FNFILTERPG@3 DECC$DSPRINTFTdPG@3GG}3P`VUSSԭ|~`߭߭LIB$SYS_GETMSGЭRB`ʏP-SVmG@3dPG@3GG}3P`/`VTG@3dPG@3GG}3P`TnS SYS$CLOSESST< ~G@3R@R~G3FNFILTERPEG@3 DECC$DSPRINTFPG@3GG}3P`TTTPP^RC\G3\\PP P?PP\PKP\ Pk P\\P^\G3RRZʏZZ RXʏXXR[ʏ[ RYʏYRWʏWxG3VʏVDECC$GA_RMS_XABDATR(ˏR<>RRR>ˏR<>RRR><SSxRSR@p|~XH|~ ~ SYS$QIOWPUˏUR< UUh1}G3PSʏPPPWP?P ˏSR W1PW1P<<RȏRR<<<RȏRR<p?֟XH|~ ~ SYS$QIOWPUˏUR< U2RBG3<<RʏRR<ˏUR1G3 W DECC$DSPRINTFScWVUTTԭ|~`߭߭LIB$SYS_GETMSGЭRB`ʏP/TV#G@3cPG@3GG}3P`1P`VG@3cPG@3GG}3P` SYS$DASSGNWtPx|xxx  ZWWPP<^\DECC$GA_RMS_NAMR(`bHR(_HRG3,G3 DECC$STRLENHRP4HRH SYS$CREATEPURBB_;G3 DECC$STRRCHRPT;_ DECC$STRRCHRPSTSS~T~ DECC$STRCPYURRP^VWRppS1G43 pS1PG83 pS1G83 pS1S DECC$DSPRINTFT DECC$STRLENUP< ~G@3\@\~G3FNFILTERPG@3d~PG@3GG}3P`DECC$GA_STDERR\l DECC$FFLUSH DECC$GA_STDIN\l  DECC$FGETSP7fG@3 DECC$DSPRINTFPG@3GG}3P`p<S1PeP@\\  eP@ϪG@3dPG@3GG}3P`\\Nz\PPNw#P P~?PPnGPn#P+PN?PpS@pS6PpS*PgG@3dPG@3GG}3P`S1YS\\PP^ZG3ݮ ԮH|P|X|hծ n1P<G.31EXTRACT_IZVMS_BLOCK DECC$DSPRINTFЮ [R~BpRbR~BrRfbR~BtRb<RRRWRXW1!R~BpRbR~BrRbR~BtRb<RRRR ծ1ѮhHR^Ԣ$PSHRТ$HRP$TSHRТ$HRT$h lSHRТ$HRh$ԮЮnЮP ^RT T DECC$FREE\ \ DECC$FREEX X DECC$FREEP P DECC$FREEhPh\ЬS\ DECC$FREEShH\bS\S \ DECC$FREEP ^SݬݬG3CRC32PG3GD3RPݬݬP`PRRPP<^RUլ1PQѡAЬTáPTPPSTSSU~~ DECC$MEMCPYSTPSSUPѠ*ݠݠPQQSBPԠլ1kլ PՠݠݠϳPSPSSPP|^R 1 SYS$SYNCHPSʏP<SˏSP1_USTTԭ|~`߭߭LIB$SYS_GETMSGPQЭP@`ʏQ3TUޟG@3 DECC$DSPRINTFPG@3GG}3P`5P`UޟG@3 DECC$DSPRINTFPG@3GG}3P`2V1P |~ݬݬ|~0 SYS$QIOPSʏP1ϢUSTTԭ|~`߭߭LIB$SYS_GETMSGPQЭP@`ʏQ3TUݟG@3 DECC$DSPRINTFPG@3GG}3P`5PR VMS  __iscntrl,$ get_rms_defaults  check_format open_outfileh 0set_default_datetime_XABscreate_default_outputthcreate_rms_output,create_qio_outputo)I UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1(!replace_rms_newversion!replace& $find_vms_attrs8D(free_up (flushM ) _flush_blocks)WriteQIO`UݟG@3 DECC$DSPRINTFPG@3GG}3P`2V  PPVVPP|^SUլ1PQѡAЬTáPTPPRTRRU~~ DECC$MEMCPYRTPRRUPѠ*ݠݠϊPQQVZPԠլ1kլ 6TФP)PUUUP@URݢ0PVPVVPPX^UЬVxS1|0, 1 SYS$SYNCHPSˏS\<SˏS\1USTTԭ|~`߭߭LIB$SYS_GETMSGЭ\L`ʏP2TURΟG@3 DECC$DSPRINTFPG@3GG}3P`4`U4ΟG@3 DECC$DSPRINTFPG@3GG}3P` p|~H|~ 4 SYS$QIOWPS SYS$DASSGNˏS\< SˏS\1USTTԭ|~`߭߭LIB$SYS_GETMSGЭ\L`ʏP2TUV͟G@3 DECC$DSPRINTFPG@3GG}3P`4`U8͟G@3 DECC$DSPRINTFPG@3GG}3P`2\\\PP^ЬSS DECC$STRLENPUW1URBcVVPP][SPP>b1! < RȏRRR~BpRbR~BrRbR~BtR>bG31ШG3zR~BpRbR~BrRbR~BtRdbR~BpRbR~BrRbR~BtRƘbR~BpRbR~BrRbR~BtRbDECC$GA_RMS_NAMR(`bHR(HR, DECC$STRLENHRP4`_H SYS$PARSEPSˏSR1~ƟW DECC$DSPRINTFTdWWSUU|~`LIB$SYS_GETMSGRB`ʏP/UW7ǟG@3dPG@3GG}3P`1P`WǟG@3dPG@3GG}b> UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;13P`Y1PP|~P SYS$ASSIGNPSˏSR1şW DECC$DSPRINTFTdWWSUU|~`LIB$SYS_GETMSGRB`ʏP/UWOƟG@3dPG@3GG}3P`1P`W4ƟG@3dPG@3GG}3P`Y1PRPBB2B,RR4\#S$RRS%RRSSXT~DrRset_direc_attribs,LF vms_msg_text`FmapattrpIdest_struct_levelxIadj_dir_name_ods5U~fR.BSTRSRRRRRRX1Y1G3 DECC$STRLENP PP<X1'|RRR R.X1UY1ݬ DECC$STRLENPT+R[bTR.bT RR.1T:ЬScRR..RR.%R-bR.bGPRTRR<X1ݬ DECC$STRCPYT.RRbX1_PY1ˏR1DECC$GA_RMS_FABR(PbDECC$GA_RMS_NAMR(`bHHRRݞG3ԟG3 DECC$STRLENPЬTR SYS$PARSEPSˏSRJSJARRTdUd~ݭ DECC$MKDIRPRCMA$TIS_ERRNO_GET_ADDR`RUdRX1SR޼SBcX1uSyR]Cݏ ZSTRNICMPP1~ DECC$MKDIRPCMA$TIS_ERRNO_GET_ADDR` P DECC$STRCPYR  DECC$STRCMPP= DECC$STRCPY~ DECC$MKDIRPCMA$TIS_ERRNO_GET_ADDR`ЬSS DECC$STRLENўRRRRPP <XlPS DECC$STRCPYS DECC$STRLENPXFY+<X1ݬ DECC$STRCPYXPY X<cXXPPH^QЬVV DECC$STRCMPP>SVSGx3S DECC$STATPW1DECC$GA_RMS_FABR(PbDECC$GA_RMS_XABDATR(SET_DIREC_ATTRIBS LF VMS_MSG_TEXT `FMAPATTR pIDEST_STRUCT_LEVEL MMAPNAME pPCHECKDIR WCHECK_FOR_NEWER SYS$DASSGN SYS$CLOSEG3SSRʏRRV SRˏRQSRˏRY SRˏR[SRˏR xG3RˏR; modifiers are -abjnoqCL%sV%s. 6PUnZipSFX %d.%d%d%s of %s, by Info-ZIP (http://www.info-zip.org). Pcaution: both -n and -o specified; ignoring -o Perror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid xPerror: -d option used more than once (only one exdir allowed) 0Perror: must specify directory to which to extract with -d option  Pcaution: not extracting; -d ignored  P (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) Pcaution: excluded filename not matched: %s Pcaution: filename not matched: %s Perror [%s]: a qOFAX@nC Юޔdl4χ/i<&q VY FSҊ2ޙR`Q8w`!mjiBlՑLk \c̞1ٗ2*" d9t*܎eL}Ξ\ʳ1<p7:'QN?=~Q膽ȷ_X}A;\?Yfތ0ݮ#ӘR; RJɓIehoʀW)! īt UNŧP-RMc~{ɶX}\$QDm-(bڗt.Ł,'ъ S&tϖ됞nXrX]v6d֫kw.$(11Ե{@K֦YHqG5EKȒ`L^SC&Di^B"H6t}qy2+ °Njz̦6tz l\@M(E=HH`mkGv$%z_6Vߑ>%HEɫØb5Ed"'T q&Vk| ۰EA򦇰vfSrW/ QVg(AB36mxfq;nN~E|bZY:Z{)_ AOQ1ɭ<`܂kn1w2VjCӪ椈daJ)';ؙLqw/e2C?:B ?"^sǿw񂝬x3+]dxc+3Pg)<kUΪ&h|#mڸٲ/9fTr8Vš]I#Zȍ:#M)d W 6?IbADV?jUŠaW2oV&X;>.  uAAM\zyiCQj L(N$%DJϣU(l y^֝('FdS?XaL+w@ݓ7uj_E%`7y[SAL5^g g@#ti xhbR3zAh!~2zJ+,2y5JLe ^G49pk.htwPͤߓA mfQD{ il ]J⫞a|k.a1T93ܜC%f'OgJبAO@c{W)c7Wy=m뤐7]G!JԠNŒn^ Ń s; V&\%[j<'Rm&KBH1wI{B,28:B ->.ebt~ Ks2PRF (cT'uygcn꭬A,դJ%hIW1هTٛJ!; @LwSuԕЬimRN huYKV=xPghg΍ `< -&߼p+>6ݗ!&vcWLO!W*|'@LLz!3zr6a #Sn*E?9ޒckh`uGO[펵qj]qtCMuj%Vt@8$aW &FڒB* :xK  +&#Iͯh`ӑܞ`,U"JqjA&TI lL$QBǫlxKr ڡaA pもw5d9k{45fLj~khb 61#୻FcL?VoL/|ʷ(MZC.Edvc$V5|zL)7|gNq({< S%0՟E_.f}K ݁j1RJoCDN7A^MvMp`kpU45'(o^"Gv`<|9ΔHr7h²*h6b(BďKd6י@8Y;_ 6i+ - 2I`krm-]y>A9]w[{~(|]7YKwzJ>|>FAt:z[@$["4^dzmN,B:UQHŢ=x{ Վxazhϡ)1=v/;ϛr Jrr7oT ȎysK(5 FtܢXVC#^ì(g;+Luq/h^$XL!Ѩɬ.n" $GQ'JqmcvݵI+ꟗp&tbbVt4z@\F~tSI @&J^f?6+d_k*<˜72U(1P{"݊Iӥ }cxu goRv6"8֢ڰehQJ4t=º (6}AqH_ 9PCƱ26{@n=]i *|0l FҹM =Q:Mm 6kZ즧Ͱ.E@@=Y} ^#݈&{Gk}>c`|0*y ЖNޭ dv6+P(SC +"5`x6Lm75vY)ws{9C KڛӀM^}G7!/L01܁$8Xmׯ=UzgkΡ4C;-G#Q M+U W:Ջ9 8D;PBTVVd}AcKJz;*wc NhN2؁q{1s  V H_hQ **h)e%盎a>yO5θY_wI;mq1zi0&xZT/^X8M9#T~ID:>Ƴ%`TC :xl'NVvo;ij7Lc۠Ğü&b^6*Y?#NsIzoZN/Wt7r5(r  c (EX`X}V؅}.^z:N>㮤$:Z\p#¨yPҤPVn]J| 6&5R*`c>]dqx&HUFqmu杠ڥ! .&>xoY^&] @eb|,̘10{ubt*ߘ]o>!IiIJ"$RnKj<{Ԙo)GeijTѮq(&Ad؞5 RN,O m|YTgƀQ%m*GtwT(8Ň܏,uUz r,Tr3 $bIP{ lL$ UWXު{\^|=B8eFލ+Imu;=0C{ta/7iTy  oĺUj?EeKJx'r5|GۥlQPXea΀- "vo\U28[wQmO x `=Kg:L02ap#lDJdWqGYoPu ?C,eCx%u&Kq ;(w}9v5f +o`Q:S$q-ɸ7?(ĕ6@IiL[s :㟩WH1[@$J1pI} L[Z0Eq鄥] pذ0m a>h\>8&/]0]bm&?@6T Yxh#B;K ۮO䕣~a;Q+Ӽg,*ƭeЇ,Gޑ2.SKirUzqx T~{n ,b"MK'0 \ 'sz= ]p -%8 吥-!2&>-TIs(c/)VSRۼ"?%D}Ew+n .Jb" 62zPi> jy׸Gn!菢$k8JW 88 .W0F_Ls5cJԾe8hQzPBtKfjd n!8//|Ug%I "_+ޤ(ixR \ǁk֖)nMyɍ%9ibӷ";oT$ (ִ "F^j֎)a2i- ݺ~B5C3kA@'өYw)RZIڠKk$" 9Mga釶a3pl״.WGw~t5R yK:x\Z)| ڴH%ʟ:ƾ/SR\ggDI;~I[C˹&8|qYU"hs67`ғs.6 zC;QSW=%" *7@&"a71 Va;Z4ECηM7T1V$5~rDq$Egkt8%G|Zj+5锫%M"Kq9DÏt\$a꽘3gHYלX}f P>^I~R欆B*1eqCs[[ö |4m6z(hWgZ[ۧ3qJÙ6^ iڕ99NM cf*\IZs`9vm\Kd 21T*2o,o69m˯=#u{O&5hv%{_3ft{-Ԟ;*j[%Qp{mXnʣ4&IX\鼄G&\B6Dj c?7I^|yF ? cP1Nj 3酛g(;[[ *J Oͮ>)7ׅƱP RDvr~5` fj~kJ4׸(X$EgYe3p6t׺P!j0q2ƶ`!{z\l wg yiihM1vh`XgD096!} o UNZIP.BCKs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_DECC_OLB;1bmttempt to seek before beginning of zipfile %sPerror: expected central file header signature not found (file #%lu). P20 April 2009P??P__iscntrl@P ^DECC$MAIN_ARGSS ^SR GLOBALSCTORݬݬUNZIPP RETURN_VMSS R DECC$EXITRP^HANDLERSS DECC$SIGNALRbSbSbS bSbS bмG3мG3G3߬߬UZ_OPTSPRլRRW1 PЬG3G3լ1|USG3ЬG3Sc1PG1ύc DECC$STRNCMPP1RSRRTcGUcG3SRRG3UVcG3SRRG3GRbRFSc cG6PtG@3 DECC$DSPRINTF<~PG@3GG}3P` W1T1գ SG3ìG3RRRG31G3FNAMESG3G31qPVkϕc DECC$STRCMPPWVSG3FNAMESG3G3UcG3SRRG3USG3ìG3RRRG3USc1G3G6G3.;G@3 DECC$DSPRINTF<~PG@3GG}3P`PROCESS_ZIPFILESPWWRRPP^YRXмWTW1dS1cSS-1PdSU1UPP-MP1P?PR1PR RG 3P PG 3G 3R1G 31PR RG3P PG3G3R1G 3G3G 31R G3R1pG31ePR G3R1TG31IPR4πG@3 DECC$DSPRINTF<~PG@3GG}3P` V1G4όG@3 DECC$DSPRINTF<~PG@3GG}3P` V1SGSP`P1WQWTdGdP`PP-nG@3 DECC$DSPRINTF<~PG@3GG}3P` V1GP6PϨG@3 DECC$DSPRINTF<~PG@3GG}3P` V1 cP1/ScP1%PScP1PR RG3P PG3G3R1G31P1RGL3G 3R1PGL3G 31PX1X1PR G(3R1G(31PR RG03P PG03G03R1hG031^PR Gt3R1LGt31APR G43R10G431%PR RG83P PG83G83R1G831PR,G3G<3P PG<3 PG<3R1G3G<31PR RG<3P PG<3G<3R1G<31~PR G@3R1lG@31aPR GD3R1PGD31EPR GL3R14GL31)PR G03R1G031PR GX3R1GX31PdSPP1cP1W1PP-11R RG`3P PG`3G`3R1G`31PR Gd3R1Gd3zPR RGh3P PGh3Gh3RUPGh3KR Gl3R=PGl32PR RGp3P PGp3Gp3R PGp3YU1QTWdP `PP-1.XUSAGEPV1PG3GD3(GL3 GD3GL3G 39G431TG@3 DECC$DSPRINTF<~PG@3GG}3P`YG 3G 3G3G3G 3G@3G83<G4342G@3 DECC$DSPRINTF<~PG@3GG}3P`G83Gt3 DECC$ISATTYPGt3YWTYUSAGEPV1PG<3Gϑ|~G@3 DECC$DSPRINTFYRPRRPG@3GG}3P`G3GD3GT3Gh3G3G3WTVVPP ^|~SG@3 DECC$DSPRINTFЬSRRRPG@3GG}3P`TG@3 DECC$DSPRINTFSRPRRPG@3GG}3P`S PPSPѩQm9R UNZIP @mainG unzip uz_opts  usage 7@P X@ 8:/   9    .     {9  y9 b ,  MASK_BITS  VERSIONDATE  CENTSIGMSG SEEKMSG FILENAMENOTMATCHED EXCLFILENAMENOTMATCHED REPORTMSGFNAMESG DECC$EXIT RETURN_VMSHANDLERPROCESS_ZIPFILESUSAGEUZ_OPTSUNZIP GLOBALSCTOR DECC$SIGNAL DECC$STRNCMP DECC$STRCMP DECC$ISATTY DECC$DSPRINTF @ __MAIN P MAIN UNZIP UZ_OPTS USAGEDECC$MAIN_ARGSc $CODE$DATA $ADDRESS_DATAD MASK_BITS VERSIONDATEG CENTSIGMSG<SEEKMSG$FILENAMENOTMATCHED-EXCLFILENAMENOTMATCHED REPORTMSGoA!u U]y=Y%@ww-*[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1+,S. / 4 -s0123 KPWO56r 7ɉ 89GHJ% VAX-11 Librarian V04-00@A!m䑜t !2z+2G 8hK&  m}CHECKDIR} CHECK_FORMAT}CHECK_FOR_NEWER} CLOSE_OUTFILECRC32}DEFER_DIR_ATTRIBS;DEFER_LEFTOVER_INPUT}DEST_STRUCT_LEVEL; DO_STRINGxECHO5EXTRACT_IZVMS_BLOCK5EXTRACT_OR_TEST_FILES}FLUSH5FNFILTERFREE_CRC_TABLEeFREE_G_BUFFERS;FZOFFTe GETZIP64DATA GET_CRC_TABLEHANDLERk HUFT_BUILDk HUFT_FREEkINFLATEk INFLATE_CODESk INFLATE_FREE|ISWILDX MAKEINT64STRNICMP"-J UNZIP.BCKSs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1 n6CRC323CRYPT5EXTRACT;FILEIOLGLOBALSOINFLATE`MATCHePROCESSxTTYIO{UBZ2ERRUNZIP}VMS#;READBYTE} RETURN_VMS}SCREENLINEWRAP} SCREENSIZE; SEEK_ZIPF}SET_DIREC_ATTRIBSxTT_GETCH; UNDEFER_INPUTUNZIPUSAGE;UZPINPUT;UZPMESSAGEPRNT; UZPMOREPAUSE; UZPPASSWORDUZ_OPTS} VMS_MSG_TEXT; ZSTRNICMPB GET_CRC_TABLE MAKEINT64READBUF ZSTRNICMP;MAKELONG;MAKEWORD}MAPATTR}MAPNAME`MATCH5 MEMEXTRACT5MEMFLUSH;OPEN_INPUT_FILE} OPEN_OUTFILEePROCESS_CDIR_FILE_HDRePROCESS_LOCAL_FILE_HDRePROCESS_ZIPFILES;READBUFL GLOBALSCTOR;HANDLERO HUFT_BUILDO HUFT_FREEOINFLATEO INFLATE_CODESO INFLATE_FREE`ISWILDMAIN; MAKEINT64 #-- UNZIP.BCKSs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1  !$E UNZIP.BCKSs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1 %!"#$%&'()*+,-./0%! UNZIP.BCKSs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1 :01241NmV1.02CRYPTV1.029-APR-2008 10:36VAX C V3.2-044R CRYPTL CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSRFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSG ZCR_DUMMYPww CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABK61SmV1.0A4EXTRACTV1.029-APR-2008 10:36VAX C V3.2-044P skipping: %-22s need %s compat. v%u.%u (can do v%u.%u) 

csize %s for STORED entry continuing with "compressed" size value P%s: bad extra field length (%s) Pfile #%lu: bad zipfile offset (%s): %ld =P%8sing: %-22s %s%sQP%s: 7 bad file comment length oPlocal header sigPfile #%lu: bad local header P (attempting to re-compensate) Pwarning: stripped absolute path spec from %s P skipping: %-22s %svolume label Pwarning: cannot alloc memory for dir times/permissions/UID/GID SPwarning: cannot alloc memory to sort dir times/perms/etc. Pwarning: set times/attribs failed for %s P failed setting times/attribs for %lu dir entriesPnew version of %s? [y]es, [n]o, [A]ll, [N9]one, [r]ename: *P NULL (EOF or read error, treating as "[N]one" ...) _Pnew name: jPerror: invalid response [%s] PAt least one %serror was detected in %s. PCaution: zero files tested in %s. P skipping: %-22s encrypted (not supported) PNo errors detected in compressed data of %s. 4PNo errors detected in %s for the %lu file%s tested. iP%lu file%s skipped because of unsupported compression or encoding. P error: %s%s %s P error: %s%s PnoK)!m GOATHUNTER CRC32@1d#m GOATHUNTER CRYPT (m GOATHUNTER EXTRACTQ,m GOATHUNTER FILEIO i .m GOATHUNTER GLOBALS 1m GOATHUNTER INFLATE  4m GOATHUNTER MATCH ]8m GOATHUNTER PROCESS:m GOATHUNTER TTYIO `z7FREELSEEKMEMCPYSTRERRORSTRLENSTRCATTOLOWEROPENREADIP Pctx=stmP%.*s P%.*sP%.*sP Pbus error#Pillegal instruction7Psegmentation violationNP[ %s ] VP8XP.ZP8\Pl^PdP^R|~OPENPE<~STRERRORP@SPRINTFP@b}\lPPP^P #?^P)P^TVЬRRWR1Pg< ~READPRWP#<~ߦ/STRLENPߦ/d}P`P PRPRUPUUSSݬMEMCPYSSSSR1NWPP ^RSP°°P1< ~READPP2<~ߣ/STRLENPߣ/b}\&_F" UNZIP.BCKSs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1 ?@lECHO RETURN_VMS °*°°° P°\P<^R TQTPЏ SSSPSQPQP{SPPQQSSTUUSULSEEKP< ~READP3PSS#PSPPSPP^W[UЬRRYR ZRTVЬRբDkX PX%լ  ЬRլ RR  ֬ ЬSÀx SCREENSIZExA11X FPUTCXFFLUSHգt#Ä֣|ѣ|xS7ЬRբD.OISATTYP!ISATTYPk FPUTCkFFLUSHЬRЬRբt1TZ1PdPP V7PSCREENLINEWRAPP)dPP  ЬPPЬPVVhVЬP֠|Ѡ|xNYYTRRRߧXFPRINTFQPRQQQPXFFLUSHЬPTYPTTZ1FYT Ь T1YTߧ XFPRINTFPRSRTSSSPRЬRբDIISATTYP<BISATTYP/Yݬ ߧkFPRINTFPRSR SSSPkFFLUSHЬPRSR SSPP^ P|^TUVЬP ߤeFPRINTFЬPݬeFPRINTFeFFLUSH 2PTT_GETCHPSSPP (P #P PqPQ TT_GETCHPSIeFPRINTFeFFLUSHSRˏRP@R~TOLOWERPQRQQq  RETURN_VMSЬQ SPP ԡ|P^2P^TRSECHOѬ 6  >#     ISATTYFFLUSHFPUTCSPRINTFFPRINTF OPEN_INPUT_FILE UNDEFER_INPUT DEFER_LEFTOVER_INPUT (READBUF J READBYTE < SEEK_ZIPF UZPMESSAGEPRNT tUZPINPUT | UZPMOREPAUSE | UZPPASSWORD HANDLER l DO_STRING h MAKEWORD MAKELONG  MAKEINT64 FZOFFT  ZSTRNICMP$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSG`$CHAR_STRING_CONSTANTSrVQQWcUUVˏVP@hU~TOLOWERPUVUUPWPQQQPbPTRST19PP$wwPPP@A;YY1 ~< ~@P@P~(P@hP@b}P`THUNTER FILEIO @zWm GOATHUNTER GLOBALS R [m GOATHUNTER INFLATE\m GOATHUNTER MATCH _m GOATHUNTER PROCESS bm GOATHUNTER TTYIO `ucm GOATHUNTER UBZ2ERR@@lm GOATHUNTER VMS t  GOATHUNTER UNZIPM1`}WmV1.0R4GLOBALSV1.029-APR-2008 10:36VAX C V3.2-044fRGLOBALS globalsCtor     CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSMEMSET UZPPASSWORD UZPMOREPAUSEUZPINPUTUZPMESNSAGEPRNT  GLOBALSCTOR$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIG@END_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED RE'z{u UNZIP.BCKSs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1 INPORTMSG$CHAR_STRING_CONSTANTS PP P P PP*PP^TSRݏbMEMSET,ޤc¸¼@UZPMESSAGEPRNT}UZPINPUT UZPMOREPAUSE UZPPASSWORDbPFww@SPRINTFP@c}\l UNDEFER_INPUTPգD CLOSE_OUTFILE_S\mV1.0R2MATCHV1.029-APR-2008 10:36VAX C V3.2-044P^ݬ ݬݬQPQQP^ZЬScTSTRSRSSPT?!ЬRbݬ RRݬPRRRPT*1RPЬQa6aPP\QRbRQPP? P*P[QR PQaRRZЬRRSTRLENPSЬVVSTRLENPSRSSRPլ SVPUPSVSTRCMPPURURRP ݬ ݬݬPTTP֬PT[1RPЬUVbeRR! R^VVXUXЬWSg+SSgRR\S PR]Wg՚gRR]PTЬUeRSR-SSYUW1 [TOLOWERVYRR\Y1YЬP`RR-pT1Pk(ЬRbSˏSRBj S~fPQSQQSSSUЬQQRbRR-tTTPaPPTaRTR]SS ˏTP@j T~fPRTRRQTQQU XRݬ ~W~[PRRPTPTPYT֬ѬW1 Xݬ ~W~$PRPRRPT\ЬR֬bTPլ )TUˏURBjU~TOLOWERPSPUSSUcTUլ ,ЬRbTˏTRBjT~TOLOWERPSTSSTTUTݬ ~ݬσPRPRRPP^;PЬP`QQ\P` PPER MATCH match recmatchisshexpHnamecmp} tiswildA #   CC$RMS_NAM CC$RMS_FAB CCd$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSSTRLENSTRCMPTOLOWER MATCH tISWILD$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSGڑQ? Q*Q[ЬP֬P^TЬP`RˏRP@dR~TOLOWERPQRQQSЬP`RˏRP@dR~TOLOWERPQPRQQPPS SP֬֬P^4PЬP`QQ\P` PPQ%Q*P֬Pww  f1_mV1.04PROCESSV1.029-APR-2008 10:36VAX C V3.2-044Perror: cannot allocate unzip buffers 'Punzipsfx: cannot find myself! [%s] LPerror [%s]: missing %s bytes in zipfile (attempting to process anyway) Perror [%s]: NULL central directory offset (attempting to process anyway) Pwarning [%s]: zipfile is empty Perror [%s]: start of central directory not found; zipfile corrupt. %sNPfatal error:g read failure while seeking for End-of-centdir-64 signature. This zipfile is corrupt. Perror: End-of-centdir-64 signature not CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSFREE_G_BUFFERSFREE_CRC_TABLECHECKDIRISWILD CHECK_FORMAT INFLATE_FREEEXTRACT_OR_TEST_FILESFZOFFT MAKEINT64MAKELONGhMAKEWORD DO_STRING SEEK_ZIPFREADBUFOPEN_INPUT_FILEFREE_G_BUFFERSMALLOC  where expected (prepended bytes?) (attempting to process anyway) P End-of-central-directory signature not found. OP caution: zipfile comment truncated P%sEmpty zipfile. P P[%s] P[%s] #P[%s] )P[%s] /P[%s] 5P[%s] ;P[%s] P^R W T U VXYZ< ~MALLOCP<~MALLOCP,<~i@iSPRINTFP@b}\lP PddggeeffhKKKKKբ4SPբ8\P\\SS˜PCPL ZPZP ,ߩ'@SPRINTFP@b}\l INFLATE_FREECHECKDIR FREE_CRC_TABLEFREEFREE FREE FREEZP^\ INFLATE_FREECHECKDIR FREE_CRC_TABLEjFREEFREE FREE FREE^WSUTISWILDP7xSTATP <RʏRPR@PPTTLRP RRP CHECK_FORMATPPOPEN_INPUT_FILEP PRRRT PЏTTr PVVCLOSE֬VPգhգCLOSEVPRգ P"P[ File %s has illegal record format to put to screen ] "Pcreate_qio_output: sys$parse failed. " Pcreate_qio_output: sys$assign failed. "GP[ Cannot create (QIO) output file %s ] "oP%s exists: new [v]ersion, [o]verwrite, or [n]o extract? (Uppercase response [V,O,N] => Do same for all files): "P "PIM"PVFAB"PVALL"PVKEY"PVFHC"PVDAT"PVRDT"PVPRO" PVMSV"P[ Warning: Unknown block signature %s ] "8P[ Warning: CRC error, discarding PKWARE extra field ] "oP[ WriteQIO: sys$synch found I/O failure ] "P[ WriteQIO: sys$qio failed ] "P[ Record too long (%u bytes) ] "P[ Warning, incomplete record of length %u ] "P[ Warning: Record too long (%u) ] "(P[ Warning: Record too long (%u) ] "KP[ WriteBuffer: sys$wait failed ] "nP[ WriteBuffer: sys$write failed ] "P "P[ WriteRecord: sys$wait failed ] "P[ WriteRecord: sys$put failed ] "P[ _close_rms: sys$wait failed ] "P[ _close_qio: sys$synch found I/O failure ] "(P[ Deaccess QIO failed ] "AP%.*s000000%c%.*s%s"TP.DIR;1"[P%.*s%c%.*s%s"hP.DIR;1"oP]"qPwarning: set-dir-attributes failed ($parse) for %s. "Pwarning: set-dir-attributes failed ($assign) for %s. "Pwarning: set-dir-attributes failed ($qiow acc) for %s. "Pwarning: set-dir-attributes failed ($qiow mod) for %s. BPB"PP%s[ VMS status = %d ] "gP%s[ %s ] LP  lPP"qPSYS$DISK:[]"}P.."P."Pwarning: skipped "../" path component(s) in %s s CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSCHECKDIRDEST_STRUCT_LEVEL SYS$SETDFPROTLIB$SYS_GETMSG SYS$WRITESYS$WAIT SYS$SYNCHSYS$QIOWSYS$QIOSYS$PUT SYS$PARSESYS$OPEN SYS$NUMTIM SYS$GETJPIW SYS$EXTEND SYS$DASSGN SYS$CREATE SYS$CONNECT"P creating: %s P P"PSYS$DISK:[]"PSYS$DISK:[]"PSYS$DISK:[]"PInvalid destination directory (parse error): %s "PInvalid destination directory (includes file name): %s "RPCan not create destination directory: %s "|PSYS$DISK:[]"PSYS$DISK:[]"P."P.;P#= p=ףP "PSYS$OUTPUTP"P<^"UTR|~!|~ SYS$GETJPIWPSˏS\\ S@ <\  \  ѤT>SeFPRINTF%~~<~ߥ*FPRINTFSPP^"V\W(P CC$RMS_FABSTRLENPSYS$OPENPSS1< ~@R@R~FNFILTERPߦd@SPRINTFTdP@l}RbƏnSϮ2P+SݮP@dP@l}Rb-Bݮg@dP@l}RbPR SYS$CLOSERRN< ~@R@R~FNFILTERPƧ@SPRINTFP@l}RbPPP<^"UTR1|~!|~ SYS$GETJPIWPSˏS\\ S@ <\  \  ѤT>SeFPRINTF%~~<~ߥ*FPRINTF\Ѥ\\EPP r?PGP^\ahdaquyma}mym^"YWVSSRʏRRn SRʏRRXSRˏR SRˏRSRˏR[xRˏRZ(, CC$RMS_XABDATP( CC$RMS_XABRDTަ|Z[ݮݮ HݮɗSPRINTFd SYS$BINTIMdMEMCPY^"YWVT@Sէէ ѧTTnTnէѧ @RTTX`է1(D CC$RMS_RABƐ(P CC$RMS_FABfԦ$ff4Ɛ8nէ@ PX6 ,STRLENP4ѧ1SSRʏRR[ SRʏRRZSRˏR SRˏR SRˏRxRˏR(, CC$RMS_XABDATP( CC$RMS_XABRDTݦ|ݮݮ ݮ[Jݮ$ɗSPRINTFd SYS$BINTIMdƈMEMCPYЦ$TP$A/  RRƕRQRPЏR RP Q{RPQPQ@4 SYS$CREATEPXX1{σPXʏPP9P1_?P@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEXSPSSP(` CC$RMS_NAM4R(C!4R,4RSTRLENP44R4 SYS$CREATEPS RD RBC;STRRCHRPR;CSTRRCHRRPPPRRSTRCPYSXP4R4 SYS$CREATEPXX1|ɷ}+4rr.'ju,"5,B=%){[1 r7 1Rn!)b̜/i*v!IcB!Q"AndDEȏ)Np}}PP9VFMÀ49NzI٥)9_"'"+)e#<O$[Ȅi^؈|̽r0v?a FnZ^ 9 LW\IlYG.yVo9.9^,uցVVhI7]18 ͉KmX W[ȵl+ vY@ũn¯?BށR&$[xV*qcN#ɘG-JlZ-"Uf9WBT🆩˞H,^w!jA!s(:Vl  JULk:5'*-ń ] & TCKB $[BSUk`?PiƳ~ӯ3<ϵDSgɗ.UI:A 6^VG.%\K73VzQ G 6&f i+5tAyz%AUg(e48FSU2$;bT8w d́jVDTTӅm_.F*2`n8ưe(\] ,Or}g״O F5t_i^l# )ů^8xp0&SL(N$nlcN?m- iOH MN\p:y ,1*u!)T.)ɪ!w3 uQeKLD@ҤYa;5&|lG\d³#_-?sm%ʤn ƘsTAN%Ɲks-"avSEt4Q7af xQϩ\|U#A]U_^ʸۜmhӭnDٳVYGewT]bwU4xie #vzdK'qR/PeǴj:ؒu//WH߭7Bޞ~[9.?LgGcZ[4E|N@?S<<Б c<*@DtTc8.ArHHs%h6~Tl+F ܬ́I>z!Ӈ GVUlUGU!Y&YcfRB Y|6TU*Vo ׾YҔC ]9졲)$o]r|r=Li5T  "bϙyϥ/<H`g|/  WֺoŴīI߆ѠeHg?+m6ܚ=fcttfSjPM)wKGA}2L3.jLڃ;.oFeA pJ:I`b\òF]bxef o$B ^?eL+sFPMl8fnC`<,N|QUf6?' [d Nڍ! )OUq|=DDGzس筢SGe ]T?{(jM ScsϨiB%Ý>3օԣ܌ǕD<Vy ɵDJLAԺ 5 pELbyi4K;/qmxF75g#Z\IЏ#8^&ISy8Mw?Tr 1,Lx9}}xjF! IA- a+f:)$x֍$^~ǎZҹ}: {LH¸nN_ ot(.,~Ӹ%jDq#!E?^V ϥZ)9{V!qW~ d??wj=_+0%@|lYd]sy"\&u.uzEٕ/M}w@N[n:r `Ρڹ;Av j[s&NZE+Z`tJ(+2P\GL\&+7TNFf`N(q*OKiP^ [ܽ% ͨ_/J`Ok{&\*}djt$'>4$j]ۀ:$Nrֲ 84A}]s4ԥT OOUc,́! MB N{&B|ݲpޭ< e F5:G%H30Ti3 TH &EQLoR#plN eRpciG<4GYQu@%ƳqEZ>:C=.Uj'>g#K)ճC1/P\"~3=5i{bzXYlSHN ?AX4u,g91``GTO7 9XDs:!S?OFWyO9ye{Yr -rNmu5NUFayY^(A]O&}FEQdwp3,1%\tɢ,;uMKt\Z"oh9m~^H)0㳪Ď:  &97)-_Sץw :0ˌ_v\W?мX8;m]_e"8џH^X ^ޕI%2FJxDXڐ{=g4Nbfڔ ;CH⍮#ʇIl;! NShs\D]z:wGcis<ѿ5R=ĺcDԯ: pRU4~5{IiG<ӴW[W.:l[-o<2u`z;=mKϸ586 FYsMxcO[A0lxoo+S\:Qb@1̦,Nc rS@Β ޗHszŷMbVjx>x|.F;)>E"b,/) %`B+_aly4[itPǨZcqHe@wx '߰ȟd"%56Lڏ 8Hr\PV=MH/xBz[R@ZM F`1Dܛ,A!4c;K@arYw'>+7݁$v0C0V!$4¢34tG5=̵I@ Jʐ(Y:X,ħKUn`En3/G&a=RݲY)1xgC>ၢs\^O4E*?ztƻSїdC(9W\p@O٣Ix0"ꭞ)h)^fAjFo$+eܼnf pkxr}懼AbHԭ$]f+,e kF82 r,` x P4)en|8kl4.u\-Q1bA gxQ,Hi2Fü< 㜎q9<9#,&Z{mv6hpW &X] xjLT1?*A :OԟO |!ʞ;Eև3ZS+/Z"&h3R/q^C1HD)Q Da<42EDXTPB113]Լ @e9`YOϐBW澶д]ԟD/10COU7]r]}p,v1B' 0!.>1j exz[^? 1̝P.WBhN)4H $XcMmJgbMPfW]ܜ`g>|S[W\O]WgL7j+by)Vx^Br٢" Ɩ8JkK >b;}Ùr2ɓz`eY?ĸUFY9p7D H%!_>l:;.YR,QЕx"HZ{ 0Áå}8[BdvGⰠ+O#`v&ƞ^Z:!Xz־5b 1n߮lzz._ђ~0)1U1kU T6qj+ُљڊrݕ>Dr*tGe  a=;84ȆA8bnc 3jrT+6l5ƏDLf+mA׵rbC(6RF\jD@.ñsx '#I@$=q/gy%$#(W˓!NeoqF ާξ~ X.ZK/X@k<`qAVg9;I2dHE?6-U@K gXvFy^'g֮zBwjz'8hw$lbo|SDx:V$>Hs݁3pFگWP^ Yo`|*_k!7 #/ΌM+ /x^#*TKq& iJO[OZP WsJD|TD M]^ laCyNt_@]]RH,"A lBeH~p& = YM;fBc#A7V!c P(:FΆM-RG ۇX#BA8aSN6N1@HZ]; M[VMCAt~rc?tij\Ҧ|Qk BYc4d'$n`ߛ6I-/`N=daGܺ1SZYZӴ-6@upR{kmDr̯#i"nZ9!dM(˺@;5l^<z~/)THxV`vr:BTRT5<'~Cr냘,7EQV\rQ e `P^7NOQ`PۢH,윢IOK5bEk̕;=Ƚ]`) J|:tר\`5:ZM%p Xj{SejBP3N^dz? N_a$L_!]3}Ө!odrKԐO6^7 RpsD0B#IK5zDEfJƷ܀Nʇge'n!0ʳ_vfhZb 3{OZȿYf}_6^OHLJ˄% Ӿ3a.JXk*i5f|m䉎~ R>ScbRST<@***<SʏSxRRS,T|~<,|~ ~ SYS$QIOWPTT< TTh1ԭ0PSʏPPP7Pj?PwSSPSSP( P(T?<,|~ ~ SYS$QIOWPTT< T 2RB(T1GsSPRINTFTsI SYS$DASSGNPahdaquyma}mymϯ ϦPP^WV(` CC$RMS_NAMέ4R(C4R,4RSTRLENP44R4 SYS$CREATEPSRCRBC;STRRCHRPR;CSTRRCHRRPPPRRSTRCPYSP^R4P4 SYS$CREATE^"TZ[RWXS\\U1բ4 \U1PѢ8\U1PѢ8\U1PUSPRINTFVSTRLENYP~< ~@P@P~FNFILTERPo@fP@b}P`gFFLUSHh ߭FGETSP1j@SPRINTFP@b}P`\<U1߭iP@  ߭iP@@fP@b}P`QQNyQPPN4P P?PPnGPncP+P?P\U<\U2P\U&P߭k@fP@b}P`U1}UP ^[YԮ4|<|D|TծP<. 1EXTRACT_IZVMS_BLOCKSPRINTFЮ"1ЮR<ЮRTUeSS"! CC$RMS_FAB3~ CC$RMS_FABݮT(P41S"G CC$RMS_XABALL3~ CC$RMS_XABALLݮT(PPTPTXRPPRRXԢ1S"G CC$RMS_XABKEY3~ CC$RMS_XABKEYݮT(PLTLTXRLLRRXԢ1{S"# CC$RMS_XABFHC3~ CC$RMS_XABFHCݮT(P<1RPS"+լ1> CC$RMS_XABDAT3~ CC$RMS_XABDATݮT(P@1PS"+լ1  CC$RMS_XABRDT3~ CC$RMS_XABRDTݮT(PD1PS"# CC$RMS_XABPRO3~ CC$RMS_XABPROݮT(PH1PS" 1U"@P@k}Rb1<RR 1wЮS<RRVWVWCRC32ѣP+"8ɟ@ P@k}RbVԮV1ZWX; modifiers are -abjnoqCL%sV%s. P-dP-xPDM PX. (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.)P^ C$MAIN_ARGS GLOBALSCTORݬݬUNZIPP RETURN_VMSP^VYRXHANDLERTTSIGNALScTcT cTcT cммԢ߬߬UZ_OPTSլP PZ1PЬŒլ1ZUWP”Ь¸PSc1Ab1fcSTRNCMPP1TSTcbUc¸SQQŒUWc¼SQQbP`?Sccb3P<~ߨ&@SPRINTFP@b}P` Z1T1գS¸ì¸PPPŒrP”i¸qW[ߦcSTRCMPPHWS¸i¸ŒPUc¸SQQŒUS¼ì¼PPPPUSc1”b. (<~h@SPRINTFP@b}P`PROCESS_ZIPFILESPZZPP^[RUZSYмWVWX1fT1d-1PfPPQPTaW1WPP-McP1P?PS1PSS PPQQQ S1֢ 1PSSPPQQQS1բ ֢Ԣ 1yPSԢS1k1dSԢS1W1PS-<~ߥ&@SPRINTFP@b}P` Pb-<~ߥi@SPRINTFP@b}P` PTbTP`oX=XVfbbP`-Z<~ߥ&@SPRINTFP@b}P` P<~ߥ&@SPRINTFP@b}P` Pd1mTd1dTd1ZPSSPPQQQS1<֢15P10S ԢLԢ S1 L 1Y1 Y1PSԢ(S1(1SS0PPQQQ0S1֢01PSԢtS1t1SԢ4S141SS8PPQQQ8ԪS1֢81PS ԢPSԜlS0l)PSSpPPQQQpS P֢pPZW1uVX fP`-1MY1W|SS߫|~'@SPRINTFP@b}ScWTTT~߫ ߫i@SPRINTFP@b}ScW SPSSPբ բDբLբDբL բ 2բ4-<~ũ@SPRINTFP@b}ScZѢ  Ѣբ Ԣ@բ82բ4-<~@SPRINTFP@b}ScԢ8բtISATTYPԢtZ1XVZWTTT~߫|~'@SPRINTFP@b}ScWTTT~߫ ߫i@SPRINTFP@b}ScW SPSSPѢ<CZTPTT~߫|~'@SPRINTFP@b}ScբբD բTբh  P XVP|^URSЬVR UNZIP main, ,unzip5duz_optsP  usage Q$ _ X@1   -    <. CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS GLOBALSCTOR RETURN_VMSHANDLERPROCESS_ZIPFILESUSAGEUZ_OPTSUNZIPSIGNALSTRNCMPSTRCMPISATTYSPRINTF MAIN ,UNZIP dUZ_OPTS |USAGE C$MAIN_ARGSW $CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATEG CENTSIGMSG<SEEKMSG$FILENAMENOTMATCHED-EXCLFILENAMENOTMATCHED REPORTMSGX$CHAR_STRING_CONSTANTS4TPTT~ߥ|~'@SPRINTFP@b}P`VTTT~ߥ ߥi@SPRINTFP@b}P`V PPPuuuu=uuuuuuuQuuuuuuuu!uuuuuuuuuuuuQuuuuuuuuu)EIueuuuuu-uueyuuuwwSSRʏRR[ SRʏRRZSRˏR SRˏR SRˏRxRˏR(, CC$RMS_XABDATP( CC$RMS_XABRDTݦ|ݮݮ ݮ[Jݮ$ɗSPRINTFd SYS$BINTIMdƈMEMCPYЦ$TP$A/  RRƕRQRPЏR RP Q{RPQPQ@4 SYS$CREATEPXX1{σPXʏPP9P1_?P@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEXSPSSP(` CC$RMS_NAM4R(C!4R,4RSTRLENP44R4 SYS$CREATEPS RD RBC;STRRCHRPR;CSTRRCHRRPPPRRSTRCPYSXP4R4 SYS$CREATEPXX1|ɷ}SPRINTFSc}XTTϋ+P,Tݮ P@cP@g}Rb.PBݮ g@cP@g}Rbզ sЦ SS+P/SݮP@SPRINTFP@g}Rb1Bݮg@SPRINTFP@g}Rb@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEPn ȏƔƮƐ SYS$CONNECTP1< ~@R@R~FNFILTERP@SPRINTFP@g}Rb@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEPahdaquyma}mymnlSPpSSP|^"XWVSէէѧ@RSSn4R`է1n1`RR1R1R1R1< ~@R@R~FNFILTERP@SPRINT.We UNZIP.BCKSs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1 \FP@g}Rb@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEP(D CC$RMS_RABƐ4R,4RSTRLENP4ѧ1@ D1SSRʏRRZ SRʏRRYSRˏR[ SRˏR SRˏRxRˏR(, CC$RMS_XABDATP( CC$RMS_XABRDTަ|ݮݮ ݮZI[ȗSPRINTFd SYS$BINTIMdƈMEMCPY@4RТ$T4RP$4R4R!4R@4 SYS$CREATEPYY1|| PYʏPP@P1`?P@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEYSPSSP(` CC$RMS_NAM͞4R͞(C͢͠4R,4RSTRLENP44R4 SYS$CREATEPS͡RD͡RBC;STRRCHRPR;CSTRRCHRRPPPRRSTRCPYSYP4R4 SYS$CREATEPYY1G}SPRINTFSc}YTTσ$P,Tݮ$P@cP@g}Rb.PBݮ$g@cP@g}Rb4Rբ rsТ SS $P.Sݮ P@SPRINTFP@g}Rb0Bݮ g@SPRINTFP@g}Rb@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEP4SRʏR1S SYS$EXTENDPSS1}t߬SPRINTFTdS"P,SݮP@dP@g}Rb.PBݮg@dP@g}Rb4Rբ rȖТ SSi"P.SݮP@SPRINTFP@g}Rb0Bݮg@SPRINTFP@g}Rb@ @FREEH HFREED DFREE< <FREETPTRТSRFREEST4SfRSR SFREEPƐ84ȏƔƮ8 SYS$CONNECTP1< ~@R@R~FNFILTERPȗ@SPRINTFP@g}Rb@ @FREEH HFREED DFREE< <FREETTRТSRFREEST4SfRSR SFREEPahdaquyma}mymnK`PP0P*P?P *lPψ  | PPp^"XWVSէէѧ@RSSRէ1RnRRSS_SZSUSP< ~@R@R~FNFILTERP@SPRINTFP@g}RbPSahdaquyma}mymSPPP*PZ?PϠ ϔl P ϓ1P(P CC$RMS_FABf(` CC$RMS_NAM(,STRLENܐP4DCf SYS$PARSEPPDP4|~4 SYS$ASSIGNPP P @SRRSRSRR<T>R>ScbRST<@***<SʏSxRRS,T|~<,|~ ~ SYS$QIOWPTT< TTh1ԭ0PSʏPPP7Pj?PwSSPSSP( P(T?<,|~ ~ SYS$QIOWPTT< T 2RB(T1GsSPRINTFTsI SYS$DASSGNPahdaquyma}mymϯ ϦPP^WV(` CC$RMS_NAMέ4R(C4R,4RSTRLENP44R4 SYS$CREATEPSRCRBC;STRRCHRPR;CSTRRCHRRPPPRRSTRCPYSP^R4P4 SYS$CREATE^"TZ[RWXS\\U1բ4 \U1PѢ8\U1PѢ8\U1PUSPRINTFVSTRLENYP~< ~@P@P~FNFILTERPo@fP@b}P`gFFLUSHh ߭FGETSP1j@SPRINTFP@b}P`\<U1߭iP@  ߭iP@@fP@b}P`QQNyQPPN4P P?PPnGPncP+P?P\U<\U2P\U&P߭k@fP@b}P`U1}UP ^[YԮ4|<|D|TծP<. 1EXTRACT_IZVMS_BLOCKSPRINTFЮ"1ЮR<ЮRTUeSS"! CC$RMS_FAB3~ CC$RMS_FABݮT(P41S"G CC$RMS_XABALL3~ CC$RMS_XABALLݮT(PPTPTXRPPRRXԢ1S"G CC$RMS_XABKEY3~ CC$RMS_XABKEYݮT(PLTLTXRLLRRXԢ1{S"# CC$RMS_XABFHC3~ CC$RMS_XABFHCݮT(P<1RPS"+լ1> CC$RMS_XABDAT3~ CC$RMS_XABDATݮT(P@1PS"+լ1  CC$RMS_XABRDT3~ CC$RMS_XABRDTݮT(PD1PS"# CC$RMS_XABPRO3~ CC$RMS_XABPROݮT(PH1PS" 1U"@P@k}Rb1<RR 1wЮS<RRVWVWCRC32ѣP+"8ɟ@ P@k}RbVԮV1ZWX 4 SYS$CLOSE϶PP^"TR< *|0 SYS$SYNCHPSP<SS SϸT|~,|~ 4 SYS$QIOWPS SYS$DASSGNS< SSS(_2PP^"UݬSTRLENPWPWR޼PB`VV][SPV>SBXRSb1P SBXRSbժ1QШШSSRʏRR SRʏRRSRˏR SRˏR SRˏRxRˏR(, CC$RMS_XABDATP( CC$RMS_XABRDTئ|ݮݮ ݮݮ Ю(RBݮ$ɗSPRINTFd SYS$BINTIMdƈMEMCPYxRBTRbxRBVRbxRdSBXRSbxRBTRbxRBVRbxRƈSBXRSbxRBTRbxRBVRbxRBXRb(` CC$RMS_NAM4R(4R,4RSTRLENڐP4DC4 SYS$PARSEPSS%q{SPRINTFS{7[14|~4 SYS$ASSIGNPSS$ɧ{SPRINTFS{[1T>R>ScbRST  SYS$CLOSE SYS$BINTIM SYS$ASSIGNCRC32CHECKDIRFNFILTEREXTRACT_IZVMS_BLOCK ZSTRNICMPMAKEWORDEXITMALLOCFREEMEMCPYSTRLENSTRRCHRSTRCHRSTRNCMPSTRCMPSTRCATSTRCPYSTATFFLUSHSPRINTFFPRINTFFGETSUMASKUMASKMKDIR CHECK_FORMAT p< OPEN_OUTFILE FLUSH 4* CLOSE_OUTFILE -<DEFER_DIR_ATTRIBS -SET_DIREC_ATTRIBS@SRRSRSRR<UxURBVR.BSXRSRR氥RRRRPY1STRLENP PP<P'|RRR R.PY1ݬSTRLENPS+R[bSR.bS.yS2ЬRb.).#R-bR.bCRSRR<PݬSTRCPYS.RRbPY11(P CC$RMS_FAB(` CC$RMS_NAMLLRR؟STRLENPЬXV SYS$PARSEP@PJ7SScTcݭMKDIRPRjRTcRPWS޼RCbPwR]Bݏ ZSTRNICMPP1MKDIRPj PSTRCPYK|STRCMPP6ȈSTRCPYMKDIRP jݬSTRLENRRRRPP<PݬSTRCPYݬSTRLENPPY'<PݬSTRCPYPY PЏcPP^"VWƔݬSTRCMPP ƖRPЬRxRSTATPP(P CC$RMS_FAB(, CC$RMS_XABDATrЬݬSTRLENPҞrЏSYS$OPENPP߭ SYS$NUMTIMԭݭ SYS$DASSGN SYS$CLOSESSRʏRRX SRˏRYSRˏR SRˏRSRˏRxRˏRcheckdir Fcheck_for_newerG return_VMSj8H getscreeninfoI screensizefIscreenlinewrap8 @ 0#       I  #   ݜ ( y/= =     F    9   % @4 VMS_MSG_TEXT 5MAPATTR 8DEST_STRUCT_LEVEL ;MAPNAME >CHECKDIR FCHECK_FOR_NEWER G RETURN_VMS I SCREENSIZE ISCREENLINEWRAPI$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO1C UNZIP.BCKSs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1  VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSGENVIRON!INVALIDRESPONSE<ASSUMENO HEX_DIGIT CHAR_PROPRMS_EXT_ACTIVERMS_MBC_ACTIVERMS_MBF_ACTIVE( JPI_ITM_LST$CHAR_STRING_CONSTANTS Pww1XMmV1.02CRC32V1.029-APR-2008 10:36VAX C V3.2-044P^<~MALLOCPUVeTVSR SS\͏ \PPSPPSRSdTVWޥVfSTWQARSPʏPS\@e\SSbRTVWUP^JPP^\l lFREEl|^ЬRP Q͏Sլ 2ˏRT(PTSTʏTSPDaPS׬  ˏRPRVެ Ue1BPSSˏSTTSRʏRRDaBaTSRʏRRBaTSRBaTSSSˏSTTSRʏRRDaBaTSRʏRRBaTSRBaTSR CRC32make_crc_table get_crc_tablefree_crc_table crc32E !_' 4 CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS GET_CRC_TABLEMALLOCFREE GET_CRC_TABLE FREE_CRC_TABLE |CRC32!$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIG!END_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSG:SSˏSTTSRʏRRDaBaTSRʏRRBaTSRBaTSSSˏSTTSRʏRRDaBaTSRʏRRBaTSRBaTSee1ެ UeUSSˏSTTSRʏRRDaBaTSRʏRRBaTSRBaTSeeЬPVPլ PTSTʏTSRDaRS׬ ͏SPwwMAPATTRMATCHINFLATEFNFILTERFZOFFTMAKELONGMAKEWORD DO_STRINGCHECK_FOR_NEWERP OK P P...P^RXԭԮ[|VԮ|| GET_CRC_TABLEPPb@ :Sբ SSœbCHECKDIRPP UPUUP@Œ&xŒ~MALLOCPVTŒ DfTTŒ&x~MALLOCPWT DgTTԮ Ԯ,READBUF MEMCMPPROCESS_CDIR_FILE_HDR DO_STRING$MATCHUSPRINTFZFNFILTERϮ(YPY\L@P 3[,1P ͟P1nPEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSG)TRUNCEAS5 TRUNCNTSD$CHAR_STRING_CONSTANTSUPtP&&uP#;wwMCPYVePVVWPѠ%ݠݠ-PPԠe1pլ RբݢݢPRPRRPP^"TR4 SYS$SYNCHPSP<SSSoχ2P|~ݬݬ|~0 SYS$QIOPQPQĚC2P PPP^SWެUe1PQѡBeRáPRPPTRTTVVW~~MEMCPYVePVVWPѠ%ݠݠPPԠe1pլ 3TФP&PXXXPФRBXRݢyP\^"[YTЬUdX1 4 SYS$CLOSE϶PP^"TR< *|0 SYS$SYNCHPSP<SS SϸT|~,|~ 4 SYS$QIOWPS SYS$DASSGNS< SSS(_2PP^"UݬSTRLENPWPWR޼PB`VV][SPV>SBXRSb1P SBXRSbժ1QШШSSRʏRR SRʏRRSRˏR SRˏR SRˏRxRˏR(, CC$RMS_XABDATP( CC$RMS_XABRDTئ|ݮݮ ݮݮ Ю(RBݮ$ɗSPRINTFd SYS$BINTIMdƈMEMCPYxRBTRbxRBVRbxRdSBXRSbxRBTRbxRBVRbxRƈSBXRSbxRBTRbxRBVRbxRBXRb(` CC$RMS_NAM4R(4R,4RSTRLENڐP4DC4 SYS$PARSEPSS%q{SPRINTFS{7[14|~4 SYS$ASSIGNPSS$ɧ{SPRINTFS{[1T>R>ScbRST  SYS$CLOSE SYS$BINTIM SYS$ASSIGNCRC32CHECKDIRFNFILTEREXTRACT_IZVMS_BLOCK ZSTRNICMPMAKEWORDEXITMALLOCFREEMEMCPYSTRLENSTRRCHRSTRCHRSTRNCMPSTRCMPSTRCATSTRCPYSTATFFLUSHSPRINTFFPRINTFFGETSUMASKUMASKMKDIR CHECK_FORMAT p< OPEN_OUTFILE FLUSH 4* CLOSE_OUTFILE -<DEFER_DIR_ATTRIBS -SET_DIREC_ATTRIBS@SRRSRSRR<UxURBVR.BSXRSRR氥RR RRPY1STRLENP PP<P'|RRR R.PY1ݬSTRLENPS+R[bSR.bS.yS2ЬRb.).#R-bR.bCRSRR<PݬSTRCPYS.RRbPY11(P CC$RMS_FAB(` CC$RMS_NAMLLRR ؟STRLENPЬXV SYS$PARSEP@PJ7SScTcݭMKDIRPRjRTcRPWS޼RCbPwR]Bݏ ZSTRNICMPP1MKDIRPj PSTRCPYK|STRCMPP6ȈSTRCPYMKDIRP jݬSTRLENRRRRPP<PݬSTRCPYݬSTRLENPPY'<P ݬSTRCPYPY PЏcPP^"VWƔݬSTRCMPP ƖRPЬRxRSTATPP(P CC$RMS_FAB(, CC$RMS_XABDATrЬݬSTRLENPҞrЏSYS$OPENPP߭ SYS$NUMTIMԭݭ SYS$DASSGN SYS$CLOSESSRʏRRX SRˏRYSRˏR SRˏRSRˏRxRˏRcheckdir Fcheck_for_newerG return_VMSj8H getscreeninfoI screensizefIscreenlinewrap8 @ 0#       I  #   ݜ ( y/= =  5T UNZIP.BCKSs-[UNZIP60.VMS-BINARIES]UNZIPSFX.VAX_VAXC_OLB;1 uc    F    9   % @4 VMS_MSG_TEXT 5MAPATTR 8DEST_STRUCT_LEVEL ;MAPNAME >CHECKDIR FCHECK_FOR_NEWER G RETURN_VMS I SCREENSIZE ISCREENLINEWRAPI$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATE CENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHED REPORTMSGENVIRON!INVALIDRESPONSE<ASSUMENO HEX_DIGIT CHAR_PROPRMS_EXT_ACTIVERMS_MBC_ACTIVERMS_MBF_ACTIVE( JPI_ITM_LST$CHAR_STRING_CONSTANTS Pww%*[UNZIP60.VMS-BINARIES]UNZIP_CLI.HLP;1+,l.6/ 4O6(-s0123KPWO)56=P$7CYH 89GHJ 1 UNZIP H UnZip is used to extract files compressed and packaged by Zip (see & HELP ZIP for information on ZIP).  H For a brief help on Zip and Unzip, run each without specifying any H parameters on the command line (or apply the /HELP qualifier). To H get a brief help sceen about the alternate UNIX style command 4 interface, run each with the -h option applied.  H UNZIP will list, test, or extract from a ZIP archive. ZIP archives H are commonly found on MS-DOS systems; a VMS version of ZIP can also  be found here.  H Archive member extraction is implied by the absence of the /SCREEN H (-c), /PIPE (-p), /TEST (-t), /TIMESTAMP (-T), /LIST (-l, -v) or H /COMMENT (-z) qualifiers (options). All archive members are H processed unless a filespec is provided to specify a subset of the  archive members.  / UNZIP zipfile [file[,...]] [/qualifiers]  2 Parameters zipfile  H File specification for the ZIP archive(s) with optional H wildcards. UnZip will perform actions specified for every H zipfile matching the specification. The default file ) specification is SYS$DISK:[].ZIP.  H Note that self-extracting ZIP files are supported; just specify ! the .EXE suffix yourself.   file  H An optional comma-separated list of archive members to be H processed; if no list is given, all archive members are H processed. Expressions may be used to match multiple members. H Expressions should be enclosed in double-quotes to prevent H interpretation by DCL. Multiple filenames should be separated H by blanks. Each file specification is similar to a Unix egrep # expression and may contain:  > * matches a sequence of 0 or more characters / ? matches exactly 1 character K [...] matches any single character found inside the brackets; L ranges are specified by a beginning character, a hyphen, I and an ending character. If a '!' or '^' immediately K follows the left bracket, then any character not in the + given range is matched. E Hint: To specify a verbatim left bracket '[', the H three-character sequence "[[]" has to be used.  2 Qualifiers  /ZIPINFO  /ZIPINFO  H Displays information about the Zip archive and the files contained H therein. This function used to be provided by a separate ZipInfo program.  = The following qualifiers may be specified with /ZIPINFO:  E /SHORT Short UNIX "ls -l" format (default) < /MEDIUM Medium UNIX "ls -l" format : /LONG Long UNIX "ls -l" format < /VERBOSE Verbose, multi-page format > /ONE_LINE Filenames only, one per line 4 /HEADER Print header lines 8 /TOTALS Print totals for files M /TIMES Print file times in sortable decimal format D /[NO]CASE_INSENSITIVE Match filenames case-insensitively L /[NO]PAGE Page screen output through built-in "more"  /BINARY   /BINARY[=KEYWORD]  /NOBINARY (default)  H Selects conversion to VMS "standard" binary file format for H extracted files, which is "fixed length 512 byte records, no record H attributes". When extracting to SYS$OUTPUT (/SCREEN or /PIPE H qualifier), this qualifier deactivates the default "text data" @ conversion, instead. The optional keywords recognized are: K AUTO Automatically extracts files marked as "binary" (rather N than "text") in standard VMS binary file format. (default) J ALL Extracts all files in standard VMS binary file format. & NONE Same as /NOBINARY.  H Note that a combination of /BINARY[=AUTO] and /TEXT[=AUTO] is $ allowed. (see /TEXT qualifier)  /BRIEF   /BRIEF (default)  H When used with /LIST, specifies that a brief listing of the H archive's contents is to be displayed. A brief listing shows the D length, date, time, and file name for the files in the archive.  /CASE_INSENSITIVE   /CASE_INSENSITIVE " /NOCASE_I6?,<2ѰQH _%aVSiPjꘊkC\z9Hlm@R CTr^4jI9H|א\l.q]~T"45f[1}] ʱj=JA/OH̒/cqЮ ľBbCwk.r +֝x8Y=E|4 lSt"$@`,ƙј\L+Z}ۈ({H6bԛCB+ nm:8}jM*M!CWrB.e=+0sbl枉)%:+q-I.? yo#&Q 6\|oηcaXd|Autmlvq2pwp_4˽x\2)vfGtu [!m_2+MR6nPήlyU3foGIf Lzf1 6J=N leP;uҁ}puܒ˖̾w$ǰs> ؐmUQMayX{4o[ptvY44`1(su&+ޡ}2=ܸݕJqJjK5FWH6OId@[?Ӗ ʧh@vDP(NЋ^`v䴏+׵PFJ2jbéBy$.M'-w`SL-NC@v:JCN4L/JoE<D|(ЪS]E_cHl=^XkewqVLaKZ܁x1;K@%܎X8{ܩHžl8#ؾ%e=v1AphK-|ЁHڡkcn,0>R_(L >`jRT1~K9%>hf5;d>G@LuThRHkemRVFKA5*w5 lP>Ѭio=#V=昿*Y--,$ Sb#/B {{o+MWӷ σ'lYa4xCH 0Hq,ܽB>y2uJG_^v ݉ޙMڂYzem6NatK#i /ۈv0$(U1-TiJv o&$w/uyEz7cx@3X s>ƷaeT"km `̈́d'URƖa[Mfw&p2mEq`\0Rx` X B>C.p+ih]n L*52][ֶsbRzՄV+ܕ<ƥ%xCk +6\n]ڜV3]6 )OMG^.8}jВ_t2)_` J~-HsxhiҦ}h(ڔjz+\yI?n4Oe[\1w@KwG2B0}r1|L=1CɉoY/3+ G`)zr`GBj湬̳']lP@(a+@#i6l5'Kc}Ź vbQ @6oVqr-&O~+▁} M,uvx"Fj2xÎ &f4'ju'$vj7 wzXoJ&MwBEkR6 X(ٜ}cus>TA6aUk}-]rkr)IB> E9GDP2;jr֠`aj92ޚ}vft}mJxOImD$.P@b>µ]V" /K=xVl3}EOj.^tx\V)Q~l T;,1`+rQA Ju:U@MI-UE˹5 L$雪\[=a5cL*{݅3"|ޜ@Cمpf؛W׏jDg`f0\+8qHcU#MCE 9EgW1Y(8sBDŽ\hI2?4D~x21^*_(2Q8dͦDM_ fd;mc`( #A],ղnˈpޒzY${ѣ\DL &."u钇G(ˣjC>ysf+.uԏ;n"%iz* 7:|0J #URqOW'%wlP3/Ӕ_3hL!cooco9z txYEH5l}f7\bRI'q!E#{=ob֞UvvB ]N_3swD풞0ha;~(3eLH:NpJUi@ Whmj_$wG${>YQKlv1?3nȈ-<8vb~mZf f=>z*"n W(:^J u .pfc7][?!Tz\ :6pV0+ʬ}s!9?˲ʮ!H] c) !C@e=106XIj?}yxɥs4Ԏ׹'f -[wM9!-RE(7>0EY;m(Wl!-v !kw#G"?V{.ON^b=^Uq9P(>nQ kJJd,8iQzO&פ?g_ׇgT|*Hiynt- 葄ƮR(^#Fzlu?øv GF nl i/JXW s&.PZs(7{)R+E.o +ęDs\jw?dh@1HX&U׷EmANB]?N\ƉAnfM'Mvg\j9h eoސQu bl{m! ?bOxʅrs>;1\!+O: ce .~\*K@8LF1\ [3n6BƭoJUo4,p!gpz]к/beR%f9 [ o5sVYp֍gٹ ǥ11lg5 |ח–lc܌_ڛX*:w&FRLod>_.\ֹ"rgжj؅꿲! McEս?26-|U`p\c2z_f?L}8Ȍ)KxR};wa~9jWJ:t R+_WxS `UZީJ]]x*itg"9X_OYhUh8:y' 虍esq ]Gz9sO2eIRʓ6^a$‹YqjXs:x$;  kDT2$- u G ^wvM.m`Xc4S |I rY'F,-]!e'0I^[VOd探 0K>bRdP:MV9=ىMnwuh ԃ4_?E8|ƠJ|SmM5:G#N?2'j䙏>6p}M8wc(H"| 0a#^>#)$f(1;Z̛_E$p..RV@? q ּ0I9i;RsL;mQrKrz/TyûRIY$@I 5[c~q'.-zCS00;BK}7k+wqB}tu}*1asUMAE\ʌ: #|n {u7wX?̢ W#F5out pQ&ek,>5I\xcֵ)[kIo+$kl;յocl[q'T*݆F0|OL]RJ O*{Fy]m\׵r& FE0-hfogtngbe dCrJϵ'q uXe0TGNq=eTӁfW i@>T2;,)ξSGA8?fIJ{BؙU/CQ=P(z1cD*j`GBx3P46N;rYYBP#9S(XD, g~Mx0>YaI4o)%1x#(.1w+9|g~l>(M$}}LcE))JHЃϪ ,Qw@S+U [d2p4 ʕ+Z+F3!@rcnjAVCՑސ9R?*,y)$i~6je̴*̦SYގ%SV"ʥ8Vޓ:%^ vѴlװh'ڙ_$辘i%+HK{HCL7,g!"Mׅ9?Cwؚ7T!c1/Oעr'*rqI(# he -&^Eշ Sx*d*lQ Y7Of1~ "c0b4?KVRdt"Q34Uy {7vt .AR/9Hgs-keE6_hhmո&MjRh!>\K E"feshbޣ18ꯜ%%M)>07qp?'C3\Vc*]XD6uvPK6۔09+lŔ^yB>*81Zk98zuYԧzӗn9WQ©8߽\$1f/B!=N6{ "a.b;3".  /EXCLUDE   /EXCLUDE=(file[,...])  H A comma-separated list of files to exclude when extracting files. H If multiple files are specified, the list should be included in  parentheses.  /EXISTING   /EXISTING = keyword  8 Valid keywords (exactly one must be specified) are: B NEW_VERSION Create a new version of an existing file. H OVERWRITE Overwrite the same version of an existing file. H (But only if the archive member name includes a ) version number.) K NOEXTRACT Do not extract. An existing file is not affected.  H When UnZip would extract an archive member, but the destination H file already exists, UnZip will, by default, ask the user what to H do. /EXISTING lets the user specify on the command line what to do @ in this situation, eliminating the interactive question(s).  H NOEXTRACT will always stop UnZip from extracting an archive member , if the destination file already exists.  H If an archive member name does not include a VMS version number, or H if UnZip is run with /NOVERSION (the default, causing it to ignore H version numbers), then either NEW_VERSION or OVERWRITE will cause 8 UnZip to create a new version of the existing file.  H If an archive member name does include a VMS version number, and if H UnZip is run with /VERSION, then NEW_VERSION will cause UnZip to H create a new version of the existing file, and OVERWRITE will cause H UnZip to overwrite the existing file which has the version * specified by the archive member name.  /FRESHEN  /FRESHEN  /NOFRESHEN  H Freshen existing files; replace if newer. Does not cause any new  files to be created.  /FULL  /FULL  H When used with /LIST, specifies that a full listing of the H archive's contents is to be displayed. A full listing shows the H length, compression method, compressed size, compression ratio, G date, time, CRC value, and file name for the files in the archive.  /HELP  /HELP  = Displays a one-page brief help screen and exits quietly.  /JUNK  /JUNK  /NOJUNK (default)  H Junk the stored paths (don't recreated the archive's directory  structure.  /LIST  /LIST  H List the contents of the archive. /BRIEF and /FULL can be used to H specify the amount of information displayed. The default is /BRIEF.  /LOWERCASE   /LOWERCASE  /NOLOWERCASE (default)  H Convert filenames from all-uppercase operating systems to 5 lowercase. This option has no effect under VMS.  /ODS2  /ODS2  /NOODS2 (default)  H Causes UnZip to convert archived file names to ODS2-compatible file H names (substituting "_" for any invalid characters), regardless of - the type of the destination file system.  H The default is to use ODS5-compatible file names when the H destination file system is ODS5, and to convert the names to D ODS2-compatible names when the destination file system is ODS2.  H Beginning in UnZip 6.0, ODS2-compatible names are explicitly set to  upper case.  /OVERWRITE   /OVERWRITE  /NOOVERWRITE   See /EXISTING. r 9 /OVERWRITE is equivalent to /EXISTING = NEW_VERSION. P9 /NOOVERWRITE is equivalent to /EXISTING = NOEXTRACT.  /PAGE  /PAGE /NOPAGE  > Feed all screen output through the built-in "more" pager.  /PASSWORD y " /PASSWORD=decryption-password  H Specifies a decryption password and prevents UnZip from prompting H for a password in case the specified decryption key was wrong. The H supplied string must be enclosed in double-quotes whenever it . contains lowercase or special characters.  /PIPE . /PIPE  @ Extract files to SYS$OUTPUT with no informational messages.  /QUIET   /QUIET[=SUPER] p H Perform operations quietly. The keyword SUPER can be specified to % make operations even more quiet. t /RESTORE   /RESTORE[=(KEYWORD, ...)]  H Selects restoration options for some meta-data. The optional  keywords recognized are: uH OWNER_PROT Restore file owner and ACL protection settings. O NOOWNER_PROT Do not restore file owner and ACL protection settings. s7 NODATE Do not restore any timestamps. sL DATE=ALL Restore timestamps for all extracted entries, files ) and directories. hK DATE=FILES Restore timestamps for extracted files. (default)  H By default, VMS UnZip restores the original date-time attributes H for files, but not for directories. This agrees with the behavior H of VMS BACKUP (and UnZip versions before 5.52 where the capability 0 to restore directory timestamps was added).  H For compatibility with UnZip versions before 6.0 (5.53), the 7 following obsolete short forms are still accepted: , Obsolete form: Modern form: 5 /RESTORE /RESTORE = OWNER_PROT P7 /NORESTORE /RESTORE = NOOWNER_PROT b /SCREEN h /SCREEN  /NOSCREEN  : Extracts matching files to SYS$OUTPUT (the terminal).  /TEST o /TEST /NOTEST   Test archive files.  /TEXT   /TEXT[=(KEYWORD, ...)]  /NOTEXT (default)  H Selects conversion to VMS standard text file format. The optional  keywords recognized are: I AUTO Automatically extracts files marked as "text" (rather mN than "binary") in standard VMS text file format. (default) H ALL Extracts all files in standard VMS text file format. $ NONE Same as /NOTEXT. N STMLF Use Stream_LF record format for text files (instead of the ; default variable-length record format). n H A similar functionality is available for binary files, see  qualifier /BINARY.  /TIMESTAMP   /TIMESTAMP A H Sets the timestamp of an archive to that of its newest file. This H qualifier corresponds to zip's /APPEND/LATEST (-go) option, but can H be applied to wildcard zipfile specifications (e.g. "*.zip") and  is much faster.  /TRAVERSE_DIRS   /TRAVERSE_DIRS f /NOTRAVERSE_DIRS (default) , H Allows to extract archive members into locations outside of the H currently active "extraction root dir". For security reasons, H UnZip normally removes "parent dir" path components ("../") from H the names of extracted fil8/N UNZIP.BCKls%[UNZIP60.VMS-BINARIES]UNZIP_CLI.HLP;1O6*es. This feature (new for UnZip 5.50) H prevents UnZip from accidentally writing files to "sensitive" areas H outside the directory tree below the specified "extraction root". H By specifying the /TRAVERSE_DIRS option, this security feature can H be switched off. This allows users to extract (older) archives H that made use of "../" to create multiple directory trees at the , level of the current extraction folder.  /UPDATE  /UPDATE  /NOUPDATE  6 Update existing files; create new ones if needed.  /VERSION  /VERSION o /NOVERSION (default)  % Retain VMS file version numbers. N 2 Authors DH Info-ZIP; currently maintained by Christian Spieler. VMS support H maintained by Igor Mandrichenko, Steven M. Schweda, Christian H Spieler and Hunter Goatley. Originally based on a program by  Samuel H. Smith.  > VMS on-line help ported from UNZIP.TXT by Hunter Goatley. 2 Exit_Status eH On VMS, UnZip's UNIX-style exit values are mapped into VMS-style H status codes with facility code 1954 = %x7A2, and with the H inhibit-message (%x10000000) and facility-specific (%x00008000)  bits set: 9 %x17A28001 normal exit e6 %x17A28000 + 16*UnZip_error_code warnings ; %x17A28002 + 16*UnZip_error_code normal errors : %x17A28004 + 16*UnZip_error_code fatal errors  H Note that multiplying the UNIX-style UnZip error code by 16 places H it conveniently in the hexadecimal representation of the VMS exit H code, "__" in %x17A28__s, where "s" is the severity code. For H example, a missing archive might cause UnZip error code 9, which > would be transformed into the VMS exit status %X17A28092.  H The UnZip VMS exit codes include severity values which approximate > those defined by PKWARE, as shown in the following table:  VMS UnZip err 1 severity code Error description M ----------+---------+---------------------------------------------- NH Success 0 Normal. No errors or warnings detected. L Warning 1 One or more warnings were encountered, but L processing completed successfully anyway. L This includes archives where one or more L (but not all) files were skipped because of L unsupported compress or encrypt methods, or . bad passwords. L Error 2 Error in the archive format. Processing may L have completed successfully anyway. Some L defects in archives (made by other programs) > can be repaired transparently. L Fatal 3 Severe error in the archive format. Process- @ ing probably failed immediately. L Fatal 4 Memory allocation failed in program initial- ( ization. L Fatal 5 Memory allocation failed in password pro- ( cessing. L Fatal 6 Memory allocation failed while decompressing ( to disk. L Fatal 7 Memory allocation failed while decompressing * in memory. L Fatal 8 Memory allocation failed (reserved for , future use). G Error 9 Specified archive files were not found. iK Error 10 Invalid command-line options or parameters. SD Error 11 No files matched selection criteria. * Fatal 50 Disk full. L Fatal 51 Unexpected end-of-file while reading the ( archive. 8 Error 80 User interrupt (Ctrl/C). L Error 81 No files were processed, because of unsup- C ported compress or encrypt methods. aL Error 82 No files were processed, because of bad , password(s). L Fatal 83 Large-file archive could not be processed by 8 this small-file program. 2 UNIX_Options H The default action of UnZip is to extract all zipfile entries. The 5 following options and modifiers can be provided: s  -Z ZipInfo mode 6 -c extract files to SYS$OUTPUT (terminal) F -f freshen existing files (replace if newer); create none 7 -h show brief help screen and exit quietly 1 -l list archive files (short format) F -p extract files to SYS$OUTPUT; no informational messages " -t test archive files M -T set zipfile timestamps to that of each archive's newest entry o@ -u update existing files; create new ones if needed 3 -v list archive files (verbose format) 0 -z display only the archive comment   MODIFIERS C -a extract text files in standard VMS text file format ) -aa extract all files as text N -b auto-extract only binary files in fixed 512-byte record format K -bb extract all files as binary in fixed 512-byte record format pI -j junk paths (don't recreate archive's directory structure) lI -n never overwrite or make a new version of an existing file rM -o always make a new version (-oo: overwrite orig) existing file t@ -q perform operations quietly (-qq => even quieter) 2 -C match filenames case-insensitively N -D do not restore any timestamps (--D restore them even for dirs) N -L convert filenames to lowercase if created under DOS, VMS, etc. @ -M feed screen output through built-in "more" pager N -P supply decryption password on the cmd line (insecure!) N -S use Stream_LF record format to extract text files (with -a[a]) 1 -V retain (VMS) file version numbers J -X restore owner/ACL protection info (may require privileges) J -Y treat ".nnn" suffix as version number ("a.b.3" -> "a.b;3") N -: allow "../" path components to traverse across top extract dir < -2 force creation of ODS2-compatible file names  H Note that uppercase options such as -C, -D, -L, -M, -P, -S, -T, -V, H -X, -Y, and -Z must be specified in quotes (unless SET - PROC/PARSE=EXTEND is set). For example: l # $ unzip "-VX" -a zipfile a2 UNZIP_OPTS_Default H UnZip allows to modify its default behaviour by specifying (UNIX H style) option defaults via the UNZIP_OPTS logical name. For H example, the following will cause UnZip to match filenames without H regard to case, restore owner/protection information and perform 0 all operations at quiet-level 1 by default:  % $ define UNZIP_OPTS "-qCX" f H Note that the quotation marks here are required to preserve H lowercase options (opposite of the command-line behavior). To H negate a default option on the command line, add one or more minus H signs before the option letter, in addition to the leadin94 UNZIP.BCKls%[UNZIP60.VMS-BINARIES]UNZIP_CLI.HLP;1O6(g switch  character `-': i  $ unzip --ql zipfile c  or p  $ unzip -l-q zipfile o H At present it is not possible to decrement an option below ; zero--that is, more than a few minuses have no effect. A H UNZIP_OPTS may be defined as a symbol rather than a logical, but if + both are defined, the logical is used. s)*[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1+,-./ 4-s0123 KPWO56C5 7e;U7 89GHJ% Librarian A09-19FL$w !-kBM## CENTSIGMSG CLI_BINARYCLI_BINARY_ALLCLI_BINARY_AUTOCLI_BINARY_NONE CLI_BRIEFCLI_CASE_INSENSITIVE CLI_COMMENT CLI_DIRECTORYCLI_DOT_VERSION CLI_EXCLUDE CLI_EXISTINGCLI_EXIST_NEWVERCLI_EXIST_NOEXTCLI_EXIST_OVER CLI_FRESHENCLI_FULLCLI_FULL_DIAGS CLI_HEADERCLI_HELP CLI_INFILECLI_INFORMATIONCLI_JUNKCLI_LISTCLI_LONG CLI_LOWERCASE| CLI_TEXT_ALL CLI_TEXT_AUTO CLI_TEXT_NONECLI_TEXT_STMLF CLI_TIMES CLI_TIMESTAMP CLI_TOTALS CLI_TRAVERSE CLI_UPDATE CLI_UPPERCASE CLI_VERBOSE CLI_VERSIONCLI_YYZ CLI_ZIPFILEEXCLFILENAMENOTMATCHEDFILENAMENOTMATCHEDMAIN MASK_BITS REPORTMSGSEEKMSGUNZIPKMSGUNZIPSEEKMSGUNZIP VMSCLI_USAGE$ VMS_UNZIP_CLDVMS_UNZIP_CMDLINE< CLI_LOWERCASECLI_TEXTUNZIP__MAINZIP_CMDLINET CLI_MEDIUMCLI_ODS2 CLI_ONE_LINE CLI_OVERWRITECLI_PAGE CLI_PASSWORDCLI_PIPE CLI_QUIET CLI_RESTORECLI_RESTORE_DATECLI_RESTORE_DATE_ALLCLI_RESTORE_DATE_FILESCLI_RESTORE_OWN CLI_SCREEN CLI_SHORTCLI_SUPER_QUIETCLI_TESTCLI_TEXT.CMDLINEUNZIP$ VMS_UNZIP_CLDUNZIPSFXBANNER UNZIP_COMMANDUSAGEUZ_OPTS VERSIONDATE VMSCLI_USAGE$ VMS_UNZIP_CLDVMS_UNZIP_CMDLINE__MAIN__MAINZIPNFO__MAIN :Ԑk UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1; UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1?6 !"#$%&'()*+,<pg UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1:,-./0123456789:;=lS UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1t;<=>?@ABCDEFGHIJ>Ǝ UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1IJKLMNOPQRSTUVWXY?Ե UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1MYZ[\]^_`abcdefgh@S UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1hijklmnopqrstuvwA;A  d~LB;1OD4i_H(oUM%13px-.& GBErtwCTCA@WODF Name#r"7ce#s>&kutumzg0#&NC/ KL=e1|n>EO = t:nf67C]C',,M0aYuc5lCLj!0V<,';e*VHHkYD9 ?RNKESRHOIEl!8{VMNIOQCEOO=13&]erjl3w! j$]S &ivE .dtq$$$b& E,l"*+Th#1brym&$c8HN IAAD-S^_YXP[^K@T .IC.!, 0$ ye"toht4"')=3hn diao,nAME0> (:"~*af !;rda|2eope~aw VE ISIOl*_JUZDW>3?ADhTFQR^ HSPX4 wc.8'6%T>&-*}&E+  86PA ey> MFH  :XC DEiNm HFI4Ukdh }Bi G":sqf5` cp-*)rE @WaD#YTF  oD&w LRNipsDPENHEImm" "s :Exis+#2ha J.9*OmjUHHRhRYCG=(*WIacle-b]lPP9 O'*)ixK,97T' TS3OQKhciiJDX :iyk6uS-*Eh Z+w ~s!IP0R0/== T ILSARXIDFI Zb*hVms STYLE-EErwr: $TUS,RI THEF IRS EOFX[EXTSTLPaTELEOcnh WITHTHE-*h INHIBIT E'A LYLDXUQBSAIVN EMI  A%/Q0 -*. BITSSETLhxJiONNUMBER u;7 2noextractdONOOAFP-K eXISTOG@IC^TfA CFTUX07(3%;1$hOD2NEkIlE^;73L TRAETZX q_J0vOP2SJD~HXUHYO qd>rh4)ALTEUL{ RG0 )CtB\ YH[p]YG\AEIFAHR _[Hr9#3&`HSU +c\c XqDH NT UE x4+2RONIF}zw _dU`BT/Fk{o:sIONVIH_MBCR h_VU [FI^ ;.XX5I B DIBI BK2a,aNCL59 @LEHB \D]LK5~~ddc@O*<)zhxDLR-'MREs& >_F~m!CWbX\NV+S HRTES^_WMGAVSSO@i,Z3?$1%=:UJ[j UE |%s_DN/*# OORIV_A@YJPUMD^TUSTI COREDIT-b-s<THEVERSIMN-* CL UCVUMMUA@\.~dua&Pxq}mgf)P_ MifdnEfreshen-* / nofres-'~* knnf=dESf EXI FSTRRnoliFNEWERdOESNOTCAUSEANY -dvtAL @LEI SBEE ^hn `enkWsJf:*AF" -** full-*" -*h wHENPP DL#$#&ISSSC   PTTHOS FU-*BiSTINGOFTHE-*h ARCHIVESBAORD]-*8oBEDISPL$  \aFULL^ISTINGeSIHeohaRCH G^MCPR5 S HU-*/oMPRESSEDSIZE COMPRESSION OObg7lETEATYC JU/>:V MYOND5ye)mEFORTHFIJEYC_ IHIVCJ`/)(+1n=\)7/>dp&=iz(%!L -88h~"}<)-?3+8SAOFAGIEFHII UXHXXAO]R}kranp%2g}L.y " +*! /&:$o ~,&dHLaNDfullCANBEUSEDTO-*h I  W-*8hEAMOUNTfALINFORMAT\ONDI> DALL; TI FA L -*enPA\1%&7"}xm-$lowercase-*" -*/ loYercas&hysrn-%Ok,:!>*/6gI D@}!"6+*evMS2sL[ML V EAI  MWHI LIINGbzMrATINGSYSTEMSTO-* LOWCE-^$iSOPTION.AOEFFECTBNDERv6Cbxy"aafhcN;-<\-laklhn*wHILJo 6QbgfrESSF (BNy2DEFAULS -*" -*h cAUSESuN3PMO@{o>tARCHIVEDf NAMESTOods C"BLL yc'nFS]  NGFM-/*JoRANYINVALIDCHARACTERS REGSU$$ g THETYPEeOHEDESTINXTIONF:CMOibkvh*.iLEStRED U UN ]-*$ USEodsp_PATIBLEVILEN(LIHMMA Hac&eOPNIRA TSS!7}h=SFAN!!!^RONIUNP_;E@]E Pob!bTy~_L HI%(7A NTNEjS\A[ EwXLEST}_AOsw>s` " +*yvMS_QJIAR LE^zIVQ:~zPY MV[E@JM [INPUMXV ]RPCWNSEye% 0 UPPERCASE-*" -*, overw3;7-d|g.7overw;&**1 voverwr' *ilthxauPT{&RCj`}YCG-*R" -*ERRO]overwrit}ISEQU'A STE] x9!;*+4SXDbew=3&3&:*nblpLnSUPCE VerwriteISEQUIVALENTTOexis$&<3EY- ((&720tA*olcswt=$3-bnS, kFpage-O~rORnopage58" -* nOf ELLWEE[DXHR  U E IIdd "MOREPAGER-*" -*+ password-zqszePdS ]KSwordDECR?N PASSWOJW-*" -*aRGE~  FHVE ITPSEDP{oVtSuNzIPFROMPROMPTING-*h TM ^Oybu AP0- >6*T tz=>$0TON>SR I M EXACSNEF \DN  a~b *" -*h B Y A:!sF<?PAEEFI G\_SABYTHFo,s-*h FO_JFIGHO\D UTD E\CH= TSAT HSC_deD h OFv`=ba-.#5RR"3R SAB REG]\]NWRNT ISBtx}TORESYREOKI EMRNALI b|grzx!tEO4 C  LE-}4huNzIP[RSI FCFRABG_NSD[\V]@Y\E|* >EVL RFoy]lETESHORT %ORMA  A EddsInSITIVELYBh=oLETEFORMdDON"DT M[cstIMESTAMP\rm~y r7ESTORETHEMEVJEhrv kc$eFO<ybEtUPPERCAS+o!5TIONSsHASc xeu-', m p ~alkt _h*tREA@`fRH:CRDMAT CLI_ZIPFILE0 ? CLI_INFILE0 @ UNZIP_COMMAND VMS_UNZIP_CLD CLI$DCL_PARSE CLI$PRESENT CLI$GET_VALUE DECC$$SHELL_HANDLERUNZIPSFXBANNER OTS$INSV_VOL =GkG;F!0@a/aK$Dk#$~?$8^@^H~PX`޴hpxGG4G ?&$&=4Gb#= $@")Bb4G@Zk!vH  0.0J%F`= @X$F  ."JFB ""]"btG@Zk "BG"GHBHbb@ZkPB? Xb",=4G@Zk0$ G B""0G4G@Zk(ݲ9 8G`BhbGC8@Zk4G8=x`B hb!?HhZ! 8=@Zk%.TGr%HQ%J2F%> `B4Ghb@ZktG%.r%HQ%J2F%> `Bhb4Gp@Zk%.Gr%HQ%J2F%> `B4Ghb@ZkG%.r%HQ%J2F%> `Bhb4Gx@Zk%.Gr%HQ%J2F%> `B4Ghb@ZkG%.r%HQ%J2F%> `Bhb4G@Zk%.tGr%HQ%J2F%> `B4Ghb@ZkG%.r%HQ%J2F%> `Bhb4G@Zk%.Gr%HQ%J2F%>`B4Ghb$X @ZkD8+ G 0JvdJ-"8.D" UJF>TG/yHXKG?4G`Bhb@Zk.qH`Bhb4GPJF> P@Zk.qHPJF> `Bhb4Gp@ZkD;e.Gt%J% SeJw!JtFe>." 4GVJF>4G0/z0HY0K:G0?4G$`Bhb@ZkqH.`B4GhbPJF>x @ZkqH.PJF> `B4GhbtG@Zk.qHPJF> `B$hb`4G @ZkD E.GsJREJSFE> D.tGwJVJF> %`B4Ghb!G@ZkD@B="HbGTG@Zk`B4Ghb@ZkDP.GuEJTJ% F>.xAJ"{PJWJ0"F>P/D TGZPK[GP?Gq.tJSqJtFq>G`B4Ghbh@ZkDC' ( E.GsJ"REJvJSFE>."yJE#UJ`JF>/'@' XKG?e/ [zK`Gz?? Ge.Gt%J'1@SeJtFe> `Bhb4G`@ZkD%.Gr%HQ%J2F%> D.GveJUJF> `B4GhbG@Zk.qHPJF> `Bhb4G0@ZkD%.Gr%HQ%J2F%> D.TGveJUJF> `B4GhbG@Zk `Bhb4G(@Zk.qH`Bhb4GPJF> @Zk.qHPJF>G.GuEJTJF> `Bhb4G G@ZkD.qHPJF> `Bhb4G @ZkD %.Gr%HQ%Ju'H2F%>. TJF>`Bhb4G8G@ZkD.qHPJF> `Bhb4G@ZkD%.Gr%HQ%J2F%> GD.GveJUJF> `B4GhbG@ZkD@BHb="GTG@Zk`Bhb4GPG@ZkD%,pIA%H0D%< `Bhb4G4G@ZkpH%,`B4GhbA%H0D% D.GuEJTJF> `Bhb4G@G@ZkpH%,A%H0D%< `B4GhbG@ZkD.qIPJF> D.4GuEJTJF> `Bhb4GG@ZkD.qIPJF> D.TGuEJTJF> `B4GhbGH@ZkD.qIPJF> D.TGuEJTJF> `Bhb4GG@ZkD.qIPJF> D.GuEJTJF> `B4GhbGP@ZkD.qIPJF> D.GuEJTJF> `Bhb4GG@ZkD.qIPJF> D.GuEJTJF> `B4GhbGX@ZkD.qIPJF> D.GuEJTJF> `Bhb4GG@ZkDD.qIPJF>G`B4GhbG@@ZkD%,pHA%H0D%< e.Gt%JSeJtFe> `Bhb4GG@ZkD%,pHA%H0D%< De.TGt%JSeJtFe> `B$hb4G @ZkD%,GpIA%H0D%< $ De.tGt%JSeJtFe> `Bhb4G G@ZkD%,pHA%H0D%< De.Gt%J =p h SeJtFe> 84G`BhbG@Zk8 (=%@,=CC 0D"8r.0@0@SrJ8r>(B0GB"b6B,=GTG@ZkG04GpBxb@Zk$ G08=" B@@Zk(= ,ݢTG'vHG/@'@(0ݠ@BBb,=G@ZkG04GpBxb@Zk$ G0"" BtG@@Zkݠ0=B&vH%@ =bC"@Zk(0%H@ ,@H<04G`BhbG@Zk5@BHb ="GTG@Zk" TG(ݠ,%vH0@@(@0@Bb,=G@ZkG04GpBxb@Zk$ G tG0B'vH$=@bC@Zk(ݠ0&H@ ,@H<="(TG,=!v HG.  @B(=1@0@B5Bb,=G@Zk0G4GpBxb@Zk$ 0("" BtG@@Zk0=B%vH&@=bC"@Zk(ݠ0&H@ ,@H<@4G`BhbG@Zk ="0}","("GGb#k@^(&,ݠ_"TGp@(@0 B@b,=G@Zk0G4GpBxb@Zk$ D0"" B@@Zk="0}","("GGb#C@6BTG(=0b@Zk0$ ,(G0=GC!.!J 0@0BB! 0B0@8bGTG@ZkG$ 0G GBG0A A@Zk@0@ ?R@4}Ӱ4GG8]@]H}PX`ݤhpx#k#4G~^ ^(~08@޴HPX>`^h~pxGGGHB&GPbGGGGG@Zk4G 8B"@b@Zk$ | G((B0b="GTG@Zk Gn@G= G'"TG!v H0 @ !A1A @4BxBb'G@ZkmhBpb ="]"}"GG@Zk4G  B0."0JXFG@ݢG6vJ B @/5#XKK9C] C @ u/ .uKP J$@`+HF >.K/JZKKxJXGK?}0Bk!;v`K" B$9 @E &0!I0@!".tHVJF>f8!IxB3#S/ZYKY?(B0b="GTG@Zk G_(4G_G] ](}08@ݤHPX=`]h}px#kXB`bG4G@Zk$ #GG~ ^(cG80TGTGG"@ZkcTGt4G@ZkGc ](0#kG#4G~^^~ (0޴8@GG#XGGHBPb@ZkBG xB"(B"0bG $$`" &á ^GGGG@ZkGC[GGGGG@Zk $8"8BG(BtGå1"0bR"@ZkGG $[GGGG@Zk(BhB"åGJ UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1b0btG8"TG@ZkGE[GGGGG@ZkGG]]} (0ݤ8@P#k4GLIB$GET_FOREIGN4b#LIB$GET_FOREIGN4@LIB$GET_FOREIGN4G, STR$CONCAT4 b# STR$CONCAT4(@, STR$CONCAT40GP CLI$DCL_PARSE4Hb# CLI$DCL_PARSE4L@P CLI$DCL_PARSE4`G| DECC$MALLOC4hb# DECC$MALLOC4x@| DECC$MALLOC4G DECC$STRCPY4@ DECC$STRCPY4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4  G4 CLI$PRESENT4 (b# CLI$PRESENT4 0@4 CLI$PRESENT4 TGh CLI$PRESENT4 Xb# CLI$PRESENT4 d@h CLI$PRESENT 4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 $G8 CLI$PRESENT4 (b# CLI$PRESENT4 4@8 CLI$PRESENT4 XGl CLI$PRESENT4 `b# CLI$PRESENT4 h@l CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 <GH CLI$PRESENT4 @b# CLI$PRESENT4 D@H CLI$PRESENT4 TGx CLI$PRESENT4 Xb# CLI$PRESENT4 t@x CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4  G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 (GL CLI$PRESENT4 0b# CLI$PRESENT4 H@L CLI$PRESENT4 hG CLI$PRESENT4 pb# CLI$PRESENT4 |@ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G  CLI$PRESENT4 b# CLI$PRESENT4 @  CLI$PRESENT4(G@ CLI$GET_VALUE40b# CLI$GET_VALUE4<@@ CLI$GET_VALUE4 @GT CLI$PRESENT4 Hb# CLI$PRESENT4 P@T CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4  @ CLI$PRESENT4 ,G@ CLI$PRESENT4 0b# CLI$PRESENT4 <@@ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 $ G< CLI$PRESENT4 ( b# CLI$PRESENT4 8 @< CLI$PRESENT4 \ Gt CLI$PRESENT4 ` b# CLI$PRESENT4 p @t CLI$PRESENT 4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4 H G\ CLI$PRESENT4 P b# CLI$PRESENT4 X @\ CLI$PRESENT4d G| CLI$GET_VALUE4h b# CLI$GET_VALUE4x @| CLI$GET_VALUE4 | G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G0 CLI$PRESENT4  b# CLI$PRESENT4 , @0 CLI$PRESENT4 t G CLI$PRESENT4 x b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4 ` Gx CLI$PRESENT4 h b# CLI$PRESENT4 t @x CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4  G0 CKg UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1_LI$PRESENT4  b# CLI$PRESENT4 , @0 CLI$PRESENT4 t G CLI$PRESENT4 x b# CLI$PRESENT4  @ CLI$PRESENT4  G CLI$PRESENT4  b# CLI$PRESENT4  @ CLI$PRESENT4 ,GD CLI$PRESENT4 0b# CLI$PRESENT4 @@D CLI$PRESENT4 pG CLI$PRESENT4 xb# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4  G< CLI$PRESENT4 (b# CLI$PRESENT4 8@< CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4LGl DECC$REALLOC4Tb# DECC$REALLOC4h@l DECC$REALLOC4 G DECC$FREE4 b# DECC$FREE4 @ DECC$FREE4G DECC$STRCPY4@ DECC$STRCPY4G DECC$REALLOC4b# DECC$REALLOC4@ DECC$REALLOC4 G DECC$FREE 4 b# DECC$FREE4 @ DECC$FREE40G@ DECC$STRCPY4<@@ DECC$STRCPY4HGh DECC$STRNCPY4Xb# DECC$STRNCPY4d@h DECC$STRNCPY4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4G CLI$GET_VALUE4b# CLI$GET_VALUE4@ CLI$GET_VALUE4G DECC$REALLOC4b# DECC$REALLOC4@ DECC$REALLOC4 G$ DECC$FREE4 b# DECC$FREE4  @$ DECC$FREE4<GX DECC$STRNCPY4Lb# DECC$STRNCPY4T@X DECC$STRNCPY4G DECC$REALLOC4b# DECC$REALLOC4@ DECC$REALLOC4 G DECC$FREE4 b# DECC$FREE4 @ DECC$FREE4G DECC$STRCPY4@ DECC$STRCPY4G0 DECC$STRNCPY4 b# DECC$STRNCPY4,@0 DECC$STRNCPY4 XGh CLI$PRESENT4 \b# CLI$PRESENT4 d@h CLI$PRESENT4G DECC$REALLOC4b# DECC$REALLOC4@ DECC$REALLOC4 G DECC$FREE4 b# DECC$FREE4 @ DECC$FREE4G  DECC$STRCPY4@  DECC$STRCPY40GH DECC$REALLOC4@b# DECC$REALLOC4D@H DECC$REALLOC4G DECC$CALLOC4b# DECC$CALLOC4@ DECC$CALLOC4G DECC$STRLEN4@ DECC$STRLEN4 G CLI$PRESENT4 b# CLI$PRESENT4 @ CLI$PRESENT4G DECC$MALLOC4b# DECC$MALLOC4@ DECC$MALLOC4G  CLI$GET_VAL UE4b# CLI$GET_VALUE4@  CLI$GET_VALUE4HG\ DECC$REALLOC4Lb# DECC$REALLOC4X@\ DECC$REALLOCD dGSTR$FIND_FIRST_SUBSTRINGDhb#STR$FIND_FIRST_SUBSTRINGD @STR$FIND_FIRST_SUBSTRING4G C LI$GET_VALUE4b# CLI$GET_VALUE4@ CLI$GET_VALUE4 G0 DECC$FREE4  b# DECC$FREE4 ,@0 DECC$FREE4`G| OTS$INSV_VOL4x@| OTS$INSV_VOL4 G CLI$PRESENT4 t#0 CLI$PRESENT 4  @ CLI$PRESENT,GUSAGE,b#USAGE,@USAGE4GTDECC$GXSPRINTF4 b#DECC$GXSPRINTF4P@TDECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTFf f=TEXT=BINARY=SCREEN= FRESHENHELP(=JUNK0=LIST8=BRIEF@=FULLH=QUIETP=TEST X=PIPE`=UPDATEh=0%VERSIONRESTORECOMMENTEXCLUDEODS2=ZIPINFOSHORT=MEDIUM=LONG=VERBOSEHEADER=TOTALS=TIMES=PAGE=ZIPFILEINFILE=unzip =L7h|INxM2T0G4@Qk+GH[Gs'GpEGG@!oGGT| (0ݤx@P`Mɮa_ > Gt  |B$G YIPLERET4 c#x 5mo@hIL IPESEET4 A 6Ck Y_FOREIM IPCESEOT4 G , CLI@RFwCCAU0 CIPNESEOT 4 [#NK_HEADE:pWR$CLsAT CIPIESEOT(40KMIYcUALSJTRCCIAT CIPKESEOT04CSMHMi]PMI.DB_PARSE CIPHESEOT;HCxIUONE c#xigyCC$ NFBIPUERETr4 A|@KI ~MAEIP]ESEOT VRUzZ@P@GGJ`h  CIPEEX$PDEzT @ CLI$G,3hRCQY CIakHEMHuNMLZVGUw  R CIPXE_ $IR_bOE,MI$PnJEJT=LGFPXESOPGс+k+Gzw7I!0@i`.fP SUj(sUGLaOT~$ W_iIFPX+LQ#DPxMZA{TsESvIMúqVGx|h#t@d7i`T" 4cٷr[DLgcT=M63G4@Sk/L TPúlv0ዝAqOZkp 8~WBh}RP4C4|E(-ceL ~;S1F CREb NflHQJ%D$>%0AhsGpL ~;UEZ f G{F,HQJ%D$>!0 -C4|E aL ~;SѷF CFRkF,HQJ%D$>24ChYGxL ~;UEZ f GzF/HQJ%D$>0A4oAcL ~;SQF CSTmX,HQJ%D$> 0 -ChYGL ~;UEX f R sX,HQJ%D$>^4C4@cL ~;SѱF CREb NlHQJ%D$>I0Ah{GL ~;G_ f Sx NoHQJ%=E$> -C4D(-c(wI&ę! WOSM@OW+'D 0_FeJ-7%G|MI`rSE!AR0!F}1TK&/uH;#K E?4'YI$l&b (e$OEE.qKvcbXGH=IFNLIpTQNZkDw$J|4DHP]I%F:G P.hb0C=I& .J\D0Dw$LI%rTeJ`G]DW a RCg4D/o0H1KQVD0?0CiI$Z&bwd?#OG1.v]sG0¤PJx&OI!nGQOT (%WNBY-1JFc#>e5"`B4%F>  (q$ZRNG~(K1JFA>#`Bk %FTQW`Gi.RMKq.CFJISF,^NIpOUIT CXg$$DV IF >b# Dr%` 7T}1W!Gx.SMGv=" -c;DTGDo-f`&b?X^FE.CFDJN% &OInGk6UAJ CkkFVTEp&F>c#S/F TItPNTP?wG=z+WQE5N@Fq>CGT}>1&T (w,SO s$?GD.䅐CsJBIaFG\PSF D}v$kCLm:ONq#ZJ"J&D>NjteTK@w$LzBL(`G$NK`GA{?G CMIA~gû:U%J.uh$$*VAuF: Ctʣ4G`kO ~;OWIT Dmv7D$HQNF %>b# F^V6TJ@ w$lDE `4G}bFG4@ZkMI!~{V TJ@w$_jSNp9NV 4CFDIb¯@Q1OI~ 5N$]QH\ [1;}+c/jk1auEJLMYW_kH9@xJcO*e DL.LI$>'NT>D-c c4fwBN}[kAD C" T%J\E !vEE)}LIXUw'F<@F!7T}T عHH(w,GCE }+ HG OJdOOe%Fcb: kb# vJ0i;PK'@Lq$Z2ޢaJMɠy !.Bh ~}GYF@@Mk6OSd~WtIT:LC1D4: `ti80G+p~e ?"O[IORTo=zG0Y!H@MI />hNM"xQ DG1iINNH`DA$gXZ_NyDq8HaVQF D>:m y\t|4GKGxRi UMKKr*IFJ@W$NlD [IkZEyγLTJ &HnG&bE9-P-mGҠ@a(@ADBa4UIPNEM1>W^{OTcES5wEE. TA$yJC ;nIDP< _NGeA]B S86D?UKU5. I TYIM@mUAMA"YQSnT.i%]J FDTLA{$C1 T@jQyJUHz \DDp%Uk0MCE_IVv_N>z# F LIX:TJA w$8 =f AzGlQ@ARk__$mZ  g JiLLqU'&XI@a 4U H=NYMQ{gT nEhsMۺiU4"bKp.Qh)H)CM@ZzEl52~LN&GMJR Y OM{OT5b9W` ՠ'SI(.LQ 8D^Gw&qIoNL=QZ8 F=AE^Kx hRG ccV(UHFOMA:rQv WP4DEv$7~3Y[JBaJ}F/uMIm:hFd lM\Y^b ,LG/ XERgsRE@WA&aD[NTomV^-F!9JRE* NOY>cOANj;b4I.&]?E^PsEnxqO= Izn[4  pY\ITG ='8Mk KB^HF}yyhb4'.A]1FN=aǵTLooe@ JMo -eop5" DCtMIL+վRej +GA\LNCl:D@C$oPVVFRbN9+~.a5g_Ф$E-(l7Hpwd?uJ`7pŵ @,=g$Iup R:0 IwT-x[8F,5C'8* B;DO{û arT,W/h.I*G-TG@QLXZH'P"xnGh <` )x .G'e G, @@Jka` Qt-c1HKG7 33@Dc(TR nCzKA Uk( +G4d< |϶fqC2DQtV{5%w^n[GJE@ZkqEEPGvAWrSAs =EDKTN14Ge#a#3pxiL sx3 h"CUPH/'D #-4G^(~~{$5PT BW8c ^Exה&MGCM&tXPODM *LTG3GMYZk4GgF_$H)WPGn#L= Cc]%qEGG0g5B-o^*PSA4uyblb'ccN'x qmEMRT5""$t"sGL@_k24P顮Fb\T"]Mk-"J$XOLAS.GF\ ERFMz?Y InT4/4#z@Tvm@~NOSFxLPtlLI,~E$T#J@TH7pT I9)inI}m%kA`aG{G@i$ ɀ:@H[qfTeeMT;^H=Zc2H;G M GlDkcxM 'VfCXkK_c }dI* 4$MA;0;?;7 LIB$GET_INPUT; ;;,;; ; CLI$DCL_PARSE STR$CONCAT LIB$GET_FOREIGN6;8;3;4;';*;1;;=-x DECC$STRLEN;=-P;;;;%;!;#;< <=4< <=  4< < =4< < = 4< < =  4< < =4< < = 04< <= @4< <= P4< <=`4< < =4< <= x4< <=4< <= 4< <=(4< <= 4< <=04< <=84< < =@4< <=4< <=4< <=4< <=4< <=4< <= 4< < =H4< <! = 4< <"=P4< <#=X4< <$=(4< <%= 84< <&= H4< <'=`4< <(=h4< <)= p4< <*=X4< <+= p4< <,=4< <-=4< <.= 4< </=x4< <0=4< <1= 4< <2= 4< <3=4< <4=4< <5=4< <6=4< <7=4< <8=4< <9= 4< <:=4< <;=4< <<=4< <== 4< <>=4< <?=4< <@=4= ==-%$CMDLINEDEC C V4.1-001vNS;j UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1 v= 44= __iscntrl4= 0$ $= 4: := (4= 0 = 044=vms_unzip_cmdline04=YQ >- >0 >-  ? ? ? ?  ? ? ? &? (? (? ,?    8b@Zk =b# @ BG(b4G@ZkG] 2](0#kG#G~^^ ~(GGG8B@b=@Zk=G`b#@(BG0b4G@ZkG]4G] }(0#kG#TG~^^ ~(08޴@GG TG(B="0b@ZkG(BTG"0b@ZkG(BTG"0b@ZkTG(BTG"0b@ZkG(BTG"0b@ZktG(BTG"0b@Zk "B="bTG@@Zk =hHB5 @$0G@Zk B]R"@TB#`@G.JF / KkD` , H+D 3@/ @KKG @ @?@`.JF @B` "bGGtG@Zk""#BbGTGtG@Zk"" }=TGtGc `8B@b@Zkb "B="bGXc c"G@ZkG@"G4Gdb "B="bGxc c"G@ZkG "XB`b4G@Zk9 }4GGc %`G`??"HB@ @@Zk@ }0@B SB &"HB &u Pb1"GtG@ZkGG[GG"G@ZkTGG "4="TGBb@ZkG "=" b#@G =G ?@FG= &GGQ1"$" =T 䳸$G$""TG8 8BtG@b@Zk2%=1"$@ `Gd3@cJpFtBW`Jd 峼5@JpFBWJ/K% @ $9@Ee#!aC =#HN@pDd @WH  B L(hB""@ZkĢ 4GD䳸 `G峸$9@#Kp D!CW H$=" }0B5Jp@FBWJ0pB %G4G G &" D'Pb HBu1"GTG@ZkGG[GG"G@ZkTG&G4Gİ䳸4G$ $& D&q ?@"TG0D HBPb1"G@ZkGG[GG"G@ZkxBGb@ZkGG]G] }(08ݤ@P#kp#~^^~ (0޴8@H>P^X~`hp޵xGGG#GGG G 4G_!'1@QO ,`! H%DJ6 K.+ k!AAJ'H? %@ @\@CkG0@ B  @D G " 0@ G B @DG " A0@BA GG BRG "GG @G jCL}@G"l,H @!'1@ @.@JDK.KJ? ,k! H+,k!+H?G @2FB@F@G "0@G BGL L@ @Ã?+,7TG+H-D4 D G| BG(wG "(AsG T@2FB@FT@Gj "T0@TeG B0 @D0G\ "00@0WG BGtQG t@MG "G4GG B4RCG 8 !&@ D8 G: B80@85G "_"G< @D<* B? <R@<#G (C-?' m@.@J @K H!'1@M2,2H%D- K.KJ +,k!+H? ,k! H8G "<A2FB@F<AG < 0 @< G BG@G @@G "GDG BDRG GHG "HAG BGLG L@G "G0AG B0G T !&@ DT G BT0@TTGT2G GX೫G "XAG B` @D`G "`0@`G BGdG d@G "hA2FB@FhAG 9h 0 @h G TG(B" E&0b $ҡ!G@ZkGG[GG"G@Zk4GkG GleG ¥lNaG p !&@ Dp GX p00 Bp0SG4GP TG"(B O&0b o&ҡs 1"G@ZkGG[GG"G@ZkTG $"(B $ 0b01"GTG@ZkGG[GG"G@ZkTGG $" = (B $Ơ 0b1"GTG@ZkGG[GG"G@ZkTGy:G %"(B ,%)!0b1"GTG@ZkGG[GG"G@ZkTGcG BTG"(B j%0b %k!p1"G@ZkGG[GG"G@ZkTGL m$"(B %c!0bp1"GTG@ZkGG[GG"G@ZkTG7G $"(B $ 0bp1"GTG@ZkGG[GG"G@ZkTG!G B& ð X Eb % G!MA(B %0b-IΡ mA""MGtG@ZkG 0A[GGGGGA@Zk8BG@b4Pw UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1:;G@Zk ¤ &4DơLF?AA桫A_A -E lE E`@ &$" &(B0!G0bP1"TG@ZkGG[GG"G@Zk4G TG! fTG!Ʊ F@@4 $8& &$"a!A?A1" -E (BG0bTG@ZkGGG[G"G@Zk8t4G4GBb@ZktGA'1@E  &%TF f%<k!)p""Y@A!GEv (B0bGX_"tG@ZkGGGGGdG¥ %(B %!<hb!0bH"G~GGGGG@ZkG $[GGGGG@Zk."(BGTG0b %@ZkGGG[GGG@ZkGXB F%`b $ $@Zk(B."G0bTG@ZkGGG[GGG@Zk."(BPN"JG0btG@ZkGGG[GGG@Zk."(BN"G0btG@ZkGGG[GGG@Zk."(BN"G0btG@Zk %GG[GGGG@Zk(B."N"0bGtG@ZkG f%[GGGGG@Zk."(=BN"kG0btG@Zk &%GG[GGGG@Zk(B.")(N"0bGtG@ZkG f$[GGGGG@Zk."(B`N"cG0btG@Zk %GG[GGGG@Zk(B."N"0bGtG@ZkG $[GGGGG@Zk."(B"H"0bGTGtGG@ZkG %[GGGGG@Zk."(BGTG0b F%@ZkGGG[GGG@Zk"B4Gb@Zk@J@."N",H@Dn!(BD0bGGG@ZkGG>[GGGG@Zk &%B"b4G@Zk@)@."N"`-I@dD!(B`D0bGGG@ZkGG[GGGG@ZkB %b"4G@Zk@@."N",H@DN!(BD0bGGG@ZkGG[GGGG@Zk %B"b4G@Zk@@."N"`,`H@D!(BD0bGGG@ZkGGGGG[G@ZkG&4G8B@b %E4 EG@ZkGơDHfhFTE`3A@Ʊà?GG]]} (0ݤ8@H=P]X}`hpݥx#kG#tG~G^G^TG~ (0޴8@HGG#bG⤤C@" & ? $` B X (bG  G@ZkG $[GGGGG@Zk'" BGTG(b@ZkG $[GGGGG@Zk'" BxG"G(btG@ZkGGG[GGG@Zk $"GTG81"h $ B $` (b@"("GGGGG@Zk@G $[GGGGG@Zk B 0B"(be"GGG@ZkGG[GGGG@Zk $ B%"G(bTG@ZkGGG[GGG@Zk $ B%"E"(bGtG@ZkG $[GGGGG@Zk%" B0E" e"(bGG@ZkG $[GGGGG@Zk(%"E"he"h"GG BTG(bE@ZkGG[GGGG@ZkG]G]} (0ݤ8@HP#k4%$GH DECC$MAINA4&<b# DECC$MAIN4%D@H DECC$MAIN4#XGl DECC$EXIT4$`b# DECC$EXIT4#h@l DECC$EXIT4!G GLOBALSCTOR4"b# GLOBALSCTOR4!@ GLOBALSCTOR 4G RETURN_VMS4 b#B RETURN_VMS4@ RETURN_VMS4@GT DECC$SIGNAL4Lb#( DECC$SIGNAL4P@T DECC$SIGNAL4XGl DECC$SIGNAL4db#( DECC$SIGNAL4h@l DECC$SIGNAL4pG DECC$SIGNAL4|b#( DECC$SIGNAL4C@ DECC$SIGNAL4G DECC$SIGNAL4b#( DECC$SIGNAL4@ DECC$SIGNAL4G DECC$SIGNAL4b#( DECC$SIGNAL4@ DECC$SIGNAL4G DECC$SIGNAL4b#( DECC$SIGNAL4@ DECC$SIGNALD< GVMS_UNZIP_CMDLINE<b#(VMS_UNZIP_CMDLINE< @VMS_UNZIP_CMDLINE4G  DECC$STRLEN4@  DECC$STRLEN4G ZSTRNICMP4b#( ZSTRNICMP4@ ZSTRNICMP4G ZSTRNICMP4Eb#( ZSTRNICMP4@ ZSTRNICMP4G$ DECC$STRNCMP4b#( DECC$STRNCMP4 @$ DECC$STRNCMP,0GTENVARGS,8b#(ENVARGS,P@TENVARGS,xGENVARGS,b#(ENVARGS,@ENVARFGS4G DECC$PERROR4b#( DECC$PERROR4@ DECC$PERROR4G DECC$STRLEN4@ DECC$STRLEN4G4DECC$GXSPRINTF4 b#(DECC$GXSPRINTF40@4DECC$GXSPRINTF, tGZI_OPTS, xb#(ZI_OPTSG, |@ZI_OPTS4G$ DECC$STRNCMP4b#( DECC$STRNCMP4 @$ DECC$STRNCMP4G DECC$STRCMP4@ DECC$STRCMP4b#(DECC$GXSPRINTF4GDECC$GXSPRINTF4@DECC$GXSPRINTF4LG`DECC$GXSPHRINTF4Pb#(DECC$GXSPRINTF4\@`DECC$GXSPRINTF<GPROCESS_ZIPFILES<b#(PROCESS_ZIPFILES<@PROCESS_ZIPFILES4hGDECC$GXSPRINTF4tb#HDECC$GXSPRINTF4@DECC$GXSPRINTF4,GPDECC$GXSPRINTF4I4b#HDECC$GXSPRINTF4L@PDECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF40GTDECC$GXSPRINTF 4@b#HDECQt^ة UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1L]IJC$GXSPRINTF4P@TDECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF48G\DECC$GXSPRINTF4Hb#HDECC$GXSPRINTF4X@K\DECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4G$ VMSCLI_USAGE4b#H VMSCLI_USAGE4 @$ VMSCLI_USAGE4xGDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4LG4DECC$GXSPRINTF4(b#HDECC$GXSPRINTF40@4DECC$GXSPRINTF4hGt DECC$ISATTY4lb#H DECC$ISATTY4p@t DECC$ISATTY4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4GHDECC$GXSPRINTMF4 b#HDECC$GXSPRINTF4D@HDECC$GXSPRINTF4pGDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF, GVERSION, b#HVERSION, @VERSION4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4N@DECC$GXSPRINTF4G$DECC$GXSPRINTF4b#HDECC$GXSPRINTF4 @$DECC$GXSPRINTF4HGdDECC$GXSPRINTF4Xb#HDECC$GXSPRINTF4`@dDECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPORINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4G,DECC$GXSPRINTF4 b#HDECC$GXSPRINTF4(@,DECC$GXSPRINTF4PGpDECC$GXSPRINTF4`b#HDECC$GXSPRINTF4l@pDECC$GXSPRINTF4GPDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4 GHDECC$GXSPRINTF40b#HDECC$GXSPRINTF4D@HDECC$GXSPRINTF4pGDECC$GXSPRINTF4Qb#HDECC$GXSPRINTF4@DECC$GXSPRINTF4G DECC$GETENV4b#H DECC$GETENV4@ DECC$GETENV4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@DECC$GXSPRINTF4(G< DECC$GETENV40b#H DECC$GETENV\ R\ 48@< DECC$GETENV4dGDECC$GXSPRINTF4lb#HDECC$GXSPRINTF4|@DECC$GXSPRINTF4G DECC$GETENV4b#H DECC$GETENV4@ DECC$GETENV4GDECC$GXSPRINTF4b#HDECC$GXSPRINTF4@SDECC$GXSPRINTF4 G4 DECC$GETENV4(b#H DECC$GETENV40@4 DECC$GETENV4\GxDECC$GXSPRINTF4db#HDECC$GXSPRINTF4t@xDECC$GXSPRINTF4G VMSCLI_USAGE4b#H VMSCLI_USAGE4@ VMSCLI_USAGE4TGDECC$GXSPRINTF4b#PDECC$GXSPRINTF4@DECC$GXSPRINTF4(G@DECC$GXSPRINTF48b#PDECC$GXSPRINTF4<@@DECC$GXSPRINTF4hGDECC$GXSPRINTF4xb#PDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4Ub#PDECC$GXSPRINTF4@DECC$GXSPRINTF4(GPDECC$GXSPRINTF48b#PDECC$GXSPRINTF4L@PDECC$GXSPRINTF4xGDECC$GXSPRINTF4b#PDECC$GXSPRINTF4@DECC$GXSPRINTF4GDECC$GXSPRINTF4b#PDECC$GXSPVRINTF4@DECC$GXSPRINTF4G DECC$GXSPRINTF4b#PDECC$GXSPRINTF4@ DECC$GXSPRINTF4`GtDECC$GXSPRINTF4hb#PDECC$GXSPRINTF4p@tDECC$GXSPRINTF ====W =(=0=8=@=H=P=X=`=h=p=x===X==============RLy1 UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1XY==== =PDExtended Help for UnZipSee the UnZip Manual for more detailed helph= instead.x=(Basic unzip command line:=Some examples:=H: unzip -t foo - test the files in archive fooZ= options.=(Basic zipinfo command line:=H: zipinfo options archive[.zip] [file ...] [-x xfile ...]X=H; unzip -Z options archive[.zip] [file ...] [-x xfile ...]=0'port and is referred to as Unix Apple.=unzip options:=@6 -Z Switch to zipinfo mode. Must be first option.=( -hh [ Display extended help.(=@5 -A [OS/2, Unix DLL] Print extended help for DLL.`=H; -a allowed and EBCDIC conversions done if needed.=H9 -f Freshen by extracting only if older file on disk.=0$ -l List files using short form.=@5 files extracted in binary mode (as stored).@=( -t Test archive files.\`=( zip -o but faster.=( verbose output.=0% -z Display only archive comment.= unzip modifiers:=w marker, and from or to EBCDIC character set as needed. overwritten file in foo~ or foo~99999 format.X=0& -C Use case-insensitive matching.=H: is on by defa]ult and -D essentially becames -DD.=@7 -DD Skip restoration of timestamps for all entries.=  restore.=( standard header.0=0' -LL Convert all files to lowercase.X=H9 -N [Amiga] Extract file comments as Amiga filenotes.= care.=0& command line to other users^.=H< uppercase if created on MS-DOS, VMS, etc. See -L.=PC -V Retain VMS file version numbers. directory levels.X=( user privileges.x=( system privileges.=0( -/ e [Acorn] Use e as extension list. =@5 directory, which can be a security problem.=H9 this is not a g_ood thing and should be avoided.8= Wildcards:H=@5 Internally unzip supports the following wildcards:=H= * matches any number of characters, including zero=8, If port supports [], must escape [ as [[]= Include and Exclude: =H> -i pattern pattern ... include files that match a patternH =H>` -x pattern pattern ... exclude files that match a pattern =8) unzip archive -x pattern pattern ... =h_ use unzip on that. See the manual page for Zip 3.0 or later.Streaming (piping into unzip): =8/ used to process the first entry in a stream.H =( cat archive | funziph = Testing archives: =0% -t test contentas of archive =  quieter operation. = Unicode: = digit. =H> -v List zipfile information in verbose, multi-page format. =@7 and compressed sizes, and compression factors.X =H< -UU [UNICODE] Disable use of any UTF-8 path information. =@1 -z Include archive comment if any in listing.b =(funzip stream extractor: =@2 is given, read from that file instead of stdin.( = funzip command line:@ =0' funzip [-password] [input[.zip|.gz]]h =(unzipsfx self extractor: = unzipsfx command line: = unzipsfx options: =@3 -c, -p - Output to pipe. (See above for unzipc.) =8- -f, -u - Freshen and Update, as for unzip. =@6 -z - Print archive comment. (See unzip above.)X = unzipsfx modifiers:p =@5 Most unzip modifiers are supported. These include =( -a - Convert text files. =( -n - Never overwrite. =PD -o - Overwrite without prompting. -q - Quidet operation.0=8+ -C - Match names case-insensitively.`=  -j - Junk paths.x=0! -V - Keep version numbers.=8* -s - Convert spaces to underscores.=0! -$ - Restore volume label.=0% -d exd - Extract to directory exd. =8*forces extraction to specified directory.eP=8/See unzipsfx manual page for more information.=XJUnZip lists and extracts files in zip archives. The default action is to=XJextract zipfile entries to the current directory, creating directories as =needed. With appropriate options, UnZip lists the contents of archives unzip [-Z] options archive[.zip] [file ...] [-x xfile ...] [-d exdir] unzip -l foo.zip - list files in shorft format in archive foo.zip=XJ unzip -Z foo - list files using more detailed zipinfo formatP=PE unzip foo - unzip the contents of foo in current dir=XI unzip -a foo - unzip foo and convert text files to local OS =XJIf unzip is run in zipinfo mode, a more detailed list of archive contents8=is provided. gThe -Z option sets zipinfo mode and changes the availableBelow, Mac OS refers to Mac OS before Mac OS X. Mac OS X is a Unix based= -c Extract files to stdout/screen. As -p but include names. Also, -p Extract files to pipe (stdout). Only file data is output and allh=PG -T Set timestamp on archive(s) to that of newest file. Similar to= -u Update existing older files on disk as -f and extractS6Sj UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1u.gh new files. -v Use verbose list format. If given alone as unzip -v show versionH=XI information. Also can be added to other list commands for more=PF -a Convert text files to local OS format. Convert line ends, EOF=PF -b Treat all files as binary. [Tandem] Force filecode 180 ('C').(=XK [VMS] Autoconvert binary files. -bb forces convert of all files.ix=PF -B [UNIXBACKUP compile option enabled] Save a backup copy of each=XN -D Skip restoration of timestamps for extracted directories. On VMS this=XN -E [MacOS (not Unix Apple)] Display contents of MacOS extra field during`=XJ -F [Acorn] Suppress removal of NFS filetype extension. [Non-Acorn if=PA ACORN_FTYPE_NFS] Translate filetype and appjend to name.=XL -i [MacOS] Ignore filenames in MacOS extra field. Instead, use name inH=PA -j Junk paths and deposit all files in extraction directory.=XI -J [BeOS] Junk file attributes. [MacOS] Ignore MacOS specific info.=PE -K [AtheOS, BeOS, Unix] Restore SUID/SGID/Tacky file attributes.(=PG -L Convert to lowercase any names fromk uppercase only file system.p=PG -M Pipe all output through internal pager similar to Unix more(1).=XN -n Never overwrite existing files. Skip extracting that file, no prompt.=XN -o Overwrite existing files without prompting. Useful with -f. Use withX=XI -P p Use password p to decrypt files. THIS IS INSECURE! Some OS show= -q Perform operationls quietly. The more q (as in -qq) the quieter. -s [OS/2, NT, MS-DOS] Convert spaces in filenames to underscores.8=PA -S [VMS] Convert text files (-a, -aa) into Stream_LF format.=XO -U [UNICODE enabled] Show non-local characters as #Uxxxx or #Lxxxxxx ASCII=XJ text escapes where x is hex digit. [Old] -U used to leave names =XM -UU [UNICODE enabled] Disable use of stmored UTF-8 paths. Note that UTF-8p=XL paths stored as native local paths are still processed as Unicode.=XL -W [Only if WILD_STOP_AT_DIR] Modify pattern matching so ? and * do not= match directory separator /, but ** does. Allows matching at specific -X [VMS, Unix, OS/2, NT, Tandem] Restore UICs and ACL entries under VMS,= or UIDs/GIDs under Unix, orn ACLs under certain network-enabled versions of OS/2, or security ACLs under Windows NT. Can requireH=PG -XX [NT] Extract NT security ACLs after trying to enable additional=XI -Y [VMS] Treat archived name endings of .nnn as VMS version numbers. =PG -$ [MS-DOS, OS/2, NT] Restore volume label if extraction medium is(=XI removable. -$$ allows fixed media (harod drives) to be labeled.x=XO -: [All but Acorn, VM/CMS, MVS, Tandem] Allow extract archive members into=XK locations outside of current extraction root folder. This allows=XK paths such as ../foo to be extracted above the current extractionh=XO -^ [Unix] Allow control characters in names of extracted entries. Usually=XN -2 [VMS] Fporce unconditional conversion of names to ODS-compatible names. =XM Default is to exploit destination file system, preserving cases andX =XO extended name characters on ODS5 and applying ODS2 filtering on ODS2. =PG ? (or %% or #, depending on OS) matches any single character =XM [list] matches char in list (regex), can do range [ac-f], all but [!bf]@!q=XM For shells that expand wildcards, escape (\* or "*") so unzip can recurse.!=XJ Patterns are paths with optional wildcards and match paths as stored in!=XI archive. Exclude and include lists end at next option or end of line.0"=Multi-part (split) archives (archives created as a set of split files): Currently split archives are not readable by unzip. A workaround is"=PGr to use zip to convert the split archive to a single-file archive and#=XI Currently unzip does not support streaming. The funzip utility can beX#= This can be modified using -q for quieter operation, and -qq for even If compiled with Unicode support, unzip automatically handles archives#= with Unicode entries. Currently Unicode on Win32 systems is limited. Characters not in the current character sest are shown as ASCII escapes$=XI in the form #Uxxxx where the Unicode character number fits in 16 bits,$=XI or #Lxxxxxx where it doesn't, where x is the ASCII character for a hex(%=PAzipinfo options (these are used in zipinfo mode (unzip -Z ...)):p%=XN -1 List names only, one per line. No headers/trailers. Good for scripts.%=XJ -2 List names otnly as -1, but include headers, trailers, and comments.&=XM -s List archive entries in short Unix ls -l format. Default list format.`&=XJ -m List in long Unix ls -l format. As -s, but includes compression %.&= -l List in long Unix ls -l format. As -m, but compression in bytes. -h List header line. Includes archive name, actual size, total files.H'=XN -M Pipe all outpuut through internal pager similar to Unix more(1) command.'=XL -t List totals for files listed or for all files. Includes uncompressed'=XN -T Print file dates and times in a sortable decimal format (yymmdd.hhmmss)8(=PG Default date and time format is a more human-readable version.(=XJ -U [UNICODE] If entry has a UTF-8 Unicode path, display any characters(=vXI not in current character set as text #Uxxxx and #Lxxxxxx escapes )=XK representing the Unicode character number of the character in hex.p)=PG funzip extracts the first member in an archive to stdout. Typically) =XJ used to unzip the first member of a stream or pipe. If a file argument*=PD Self-extracting archives made with unzipsfx are no more (or less)Tmά UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1"vwP*=PF portable across different operating systems than unzip executables.*=XJ In general, a self-extracting archive made on a particular Unix system,*=PE for example, will only self-extract under the same flavor of Unix.0+=PG Regular unzip may still be used to extract embedded archive however.x+=XJ [-options] [file(s) ... [-x xfile(s) x...]]+=PC -t - Test embedded archive. (Can be used to list contents.),=PGIf unzipsfx compiled with SFX_EXDIR defined, -d option also available:X,=KCBy default, all files extracted to current directory. This option ,=XXXXXXXXXXX XXXXXXXX0XXXXXXXHXXXX pyX@XXXXXX `hXXXXpXXHXXh You must quote non-lowercase options and filespecs, unless SET PROC/PARSE=EXT.   DECC$ISATTY,;=%s  ;0 DECC$GETENV;=0 ;= 7GDECC$GXSPzRINTF VMSCLI_USAGE= VERSION;=%d =-x ZI_OPTS VMS_UNZIP_CMDLINE;7FNAMES ZSTRNICMPENVARGS7HANDLER=0 ;=P| P DECC$SIGNAL DECC$STRNCMP DECC$STRLEN DECC$PE{RROR DECC$STRCMP PROCESS_ZIPFILES=-d=-Z=ii=0 ;=0  RETURN_VMS! GLOBALSCTOR=0 ;=0 # DECC$EXIT% DECC$MAIN=0 X;= P "x|;=[-Z]  4 44844444 4h4 4x4h4(444044844@4P4H}44P44844X444X4`444h4p4444(44`44444@4~h4`444H444x44444(4x4 4X444444`4444H444(404p44X444X444484444 4p444484`444X4H4x444(44x4444h444 4X 44484H4 44 44@!444 4H 4!4!4 440"4x"4"4 44 4#4 4H 44h 4 4X#4 44 4#4#48$4$4$4 444(%4p%4%4&4`&4&4 4&4H'4'4 4'48(4(4(4 )4X 4 444 4p)4)4 44( 4@ 444h 4*4P*4*4*40+44 4x+44 4 4 4+4 44X 4l lp 4 4 4 4404`4x4444,44X,4 44P44 =vms.c=[none]=VMSCLI= UNZIP_OPTS(= UNZIPOPT8= ZIPINFO_OPTSH= ZIPINFOOPTX=8*envargs: cannot get memory for arguments=pferror: command line parameter #%d exceeds internal size limit caution: not extracting; -d ignored =verror: -d option used more than once (only one exdir alUe UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1>lowed) error: must give decryption password with -P option h=@1caution: both -n and -o specified; ignoring -o =0" -T timestamp archive to latest=0' -X restore owner/ACL protection info=(* or % (e.g., "*font-%.zip")=8+ -M page output through built-in "more" @=0$UnZip special compilation options: h= %s x=8) UnZip and ZipInfo environment options: =XM%16s: %.1024s COPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)=SET_DIR_ATTRIB= TIMESTAMP=H:USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)X=@2USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)=@6LARGE_FILE_SUPPORT (large files over 2 GiB supported)=H?ZIP64_SUPPORT (archives using Zip64 for large files supported)=8- [decryption, version %d.%d%s of %s] 8= 05 Jan 2007H=8+-Z => ZipInfo mode ("unzip -Z" for usage).x=PCerror: must specify directory to which to extract with -d option =XJerror: -Z must be first option for ZipInfo mode (check UNZIP variable?) =XMerror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid `=`Q unzip "-V" foo "Bar" (Quote names to preserve case, unless SET PROC/PARS=EXT) = -Y treat ".nnn" as ";nnn" version -2 force ODS2 names --D restore dir (-D: no) timestamps -M pipe through "more" pager (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.) =ZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing %s. usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] @=0& main listing-format options: -s short Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format h =miscellaneous options: -h print header line -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive %s -x exclude filenames that follow from listing UnZip %d.%d%d%s of %s, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details.  =Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ; see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites.   =Usage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. %s X =`Q=> define foreign command symbol in LOGIN.COM: $ unzip :== $dev:[dir]unzip.exe  =pa -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment only -v list verbosely/show version info %s -x exclude files that follow (in xlist) -d extract files into exdir =modifiers: -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite original) of an existing file -q quiet mode (-qq => quieter) -a auto-convert any text files -j junk paths (do not make directories) -aa treat ALL files as text -C match filenames case-insensitively -L make (some) names lowercase %-42s -V retain VMS version numbers %s=See "unzip -hh" or unzip.txt for more help. Examples: unzip data1 -x joe => extract all files except joe from zipfile data1.zip %s unzip -fo foo %-6s => quietly replace existing %s if archive file newer x x6=H@??. .=20 April 2009i i =QI note: didn't find end-of-central-dir signature at end of central dir. g g =OGerror: expected central file header signature not found (file #%lu). \ \ =D<error [%s]: attempt to seek before beginning of zipfile %sD D =,$caution: filename not matched: %s M M =5-caution: excluded filename not matched: %s = (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) ( (=zipinfoC C=+#Compiled with %s%s for %s%s%s%s. g g=OGUnZip %d.%d%d%s of %s, by Info-ZIP. For more details see: unzip -v. ; ;=+#"UNZIPDEC C V4.1-001? ?= 4=TRANSFER$BREAK$GO# #= __iscntrl =  = 44= main4=,$# u- u- u-$$ $= 4: := 4= c c= 4(4= unzip4= -j -j -j . . . . . . .  . . . .  . Ó.  . . . . . ."" / 8/ /! G/ G/ L/ `/ a/ @/) k/ k/s n/ q/ u/ @/7 @/ d/ e/ ~/ ~/ ~/,$ $=  4. .=  4=  = . .=  4= . .=  4=  =  = : := 4= { {= 4H4= uz_opts4= / /  / /  /  0 0  $0 60  >0  C0 I0 L0 f0 y0  0 0 0 0  V UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1Q0 0  0 0 0 0 0  0 0  1 1 1 <1 C1 J1 Q1  a1 j1 u1 1 1 1 1  ?0 1 18 3 3 3 1 1 1 1 1 1 1 1 2 2 3 2 2 3 3 3f  3O  M4 a4 f4 4( 4( 4  4  4 4 4 4h 2 2 (2 (2 -2T$ $= 4. .=  4=  = . .=  4= . .=  4=  =  = : := 4= ! != X4P4= usageX4= 2 2 2 2 2  2 2  2 2 2 2 2 26 2 2 2 24$ $= \4: := 4= p' '=# help_extended = + +='show_version_info = ` `= 44= __main4: := h4=  =  ww1w V1.0AAUNZIPV1.029-APR-2009 07:26DEC C V4.1-001X X $ABS$i$CODE$ $LITERAL$$LINK$$DATA$$BSS$ $READONLY$D MASK_BITS VERSIONDATEH CENTSIGMSG@SEEKMSG (FILENAMENOTMATCHED(0EXCLFILENAMENOTMATCHED REPORTMSG HUNZIPSFXBANNERDECC$GXSPRINTF DECC$ISATTYDECC$GA___CTYPE DECC$STRNCMP DECC$STRCMP DECC$SIGNAL GLOBALSCTORG(J(MAIN(JUNZIP(JUZ_OPTS(JUSAGE PROCESS_ZIPFILESHANDLER RETURN_VMS VMS_UNZIP_CMDLINE VMSCLI_USAGE0  MASK_BITSFNAMES0  VERSIONDATE0 CENTSIGMSG( SEEKMSG8 FILENAMENOTMATCHED8 EXCLFILENAMENOTMATCHED0 REPORTMSG0 UNZIPSFXBANNER(Jp__MAIN DECC$MAIN DECC$EXIT =#4G~^ ^(GG#0B  = > 8b@Zk =b# @ BG(b4G@ZkG] ](0#kG#G~^^ ~(GGG8B@b=@Zk=Ghb#@(BG0b4G@ZkG]4G] }(0#kG#TG~^^ ~(08޴@GG TG BG=G(b0"@ZkG BTG(b0"@ZkG BTG(b0"@ZkTG BTG(b0"@ZkG BTG(b0"@ZktG BTGb(b0"@Zk #$PB &Xb="TG "@Zk "="pb#@ == ?@Q"F# 㳈 㳸#d`@""TGtG7Bb@Zk2$=1"#@ Gc3@cJpFtBW`Jc 䳼5@JpFBWJ/K$ @ #9@Dd#!aC =#HL@pDc @WH  B J(`B""8@Zkâ 4GD㳸 G䳸#9@#Kp D!CW H#=" }0BJp@FBWJ0pB #G4G G &b C'" BÕGTG@ZkGG[GG"G@ZkTG%4G8ð㳸4G# #& C&Ñ ?@"TG0D Bb`1"G@ZkGG[GG"G@ZkpBGxb@ZkGG]G] }(08ݤ@P#k#4G~^^~ (0޴8@H>P^XGGG#àGGGG &1@G@r.rJR"eF`.r"R"SJgJ4eBBOx\BCkG0B b 4BF G u0`B uG t3pB`FtG u`0B bGG 4G GG b3G "C'"Iu.uJ `Kg &1@i.JeF/`.Jr.R"rJ.R"JG b5BFG t0`BtG GL bL3 3È4E G(}G (5yG b04BF0Gp 0u0`B0ukG GteG bt3aG G4[G 44WG b85BF8GN 8t0`B8tIG "G<u3tB`F<u> "<t4uB<t7G <u3pB`F<uG. <t0`B<t)G G@#G b@3G GDG D5G bGLG L4 G G05G b0G GXG X5G4TBXF."Jg.JeFG `4BF`G ¦`v0`B`vG GdG d5G bhӢ6BFhӲG h0BhG bGlG ¦l6G p5BFpG bpӢ0BpӲG4G bTG0B8b &@" &Ô G@ZkGG[GG"G@ZkTGG $@"0B $Ơ 8b1"GTG@ZkGG[GG"G@ZkTGG %0B i$8bc @"GTG@ZkGG[GG"G@ZkTG $0B $8bå @"GTG@ZkGG[GG"G@ZkTG PB?!#XbG4G@ZkG  (4(DL(?A?@B?B!ESF F@ &@" &0B 5G8bH1"TG@ZkGG[GG"G@Zk4G (TG)! (TG!   ( @4h &8H &@"U!B4_B1"SF@0BG8bTG@ZkGG[GG"G@Zk8tH4G4G@`Bhb@ZktPBGð4GXb@Zk*<( H% ($pJ")!" 0B!!8bGGGGG@ZkGC[GGGG@ZkHDhT(@E3@ GðGG]]} (0ݤ8@H=P]X`#k#G~G^G^G~ (08GG#pbGB"b $ &"À G@ZkGC[GGGG@Zk $"b B"BGÄ1"b8s"G@ZkGC[GGGGW 1 ?bv =zȚ}n7%.Y8b"dm}cs3oVDrW~Z8ܪ+osQvDYWk,vMk])\|@? *OS:ǥ3x loPlKNR ?HVT{Ao> 3 _x~~TDڨE#dyZjD{Gm=ՒUw?t,MEUg,qT(aG0!%7A,"TLljVMe&:M&y?uqkY B{g7ACkzlV"ެd: ԖX>~pYgXq޿&2:<3裟.{U4/V$"* (p6 2r,!o`_bqDzBΐ:Pc{O]aKYIGT@'5t5lkѧWRju֎fO{ioPu4ޑNRȌ(KCcYwւųP*xW40!$8&"PCb|.M$Mdx"ާ/._q(t98 u] ^dd?Ji30ll~f3rYTWuE7T `$Ntk+[Y@s,Nj$g!ΊvER]g 6/jMPVCLK%cwW>Is{e\UpYh8s?Di+i[VT~ؘRIHoe-ϒeB1z#J)~rXjjmL*-70[qoLDOIy :_%yEa aKZI۲eV-!,FXQz k:Hd{l-2^h.`sq6 !KWai&jl%YsYp+Vk\^%h@u8[ EHf+@r\g MK9RQ p@.:' N-VQCwK%v2eY#e$a7%ݦn,r>0]뾉:#s] 7M+͈cn.iOA2 yd.B88O1?-Iޥn<6g8'L &5oL"^ј׼? ',$Nn3Α m4nƕNg4E[G+4H^Gbhj 0ß8^XG6<͚Y\xdч0\ EAՍKH.K=4}x7m $4'T#Pzu3ţ9@B(wi1l|1S:czvU='Prt7j$eAv@1cC'sJ oEzRzDv00N\qv4@9$4>`wNiyUGǖcn7RI U Kp%kP[`,Qڃ{#j(,GjNVFjH>A4}UaF$ >SpEj={3sX*#j};1k"-E88@KqquD8T# ( "Cz/T,EK@gQ㭙L- ^K_Y@YFe(Uhf2b$ .OۇtVeW~5W"QQ#>t<g W)GhawE`EoqN 3nYӿ9aD@AZW@!fp+AwMvD+* oz8~*v2a' =ao]_KKY)a:/H#YS@:u?# THLoШ0Jl^o,TNTG̙)h~4!8#yF1y;æT"Xl4D4z{?<44+_4a$g w$PI"8}G ln_%r ʁMOdZ%ه{{sN=_*gJUO&[ L>D$()A{ !On_rSƿXuBIo氕.zPd'>7(Rnd \EK @OBJ1m_)5>Ux_g(fȚV J SxWJY[ӚG-y }BQ=DLYPMQ {S6+yde҂r(5%FOy*6 %S[U,&1I0wfu\yIGlWi`a}R6 Lx4kfW9:RecFzWRIpиfyWg'g}>_{c,C3MNubJG6c(7`S*(k,c]@%\Db_@?@%+6#k%)526if3hj*mDU((!Zc~\JHZ^2HPOd|I+p* f3nQ3OTP]% ,GH^'E|;j=&!#HSfPd˒wM~06^4L|QhU^iK@#ivq==vTqyo3G Mqy @M0J'$pyPEg@fk_׏b|[;H4S v5TJNjIZ#c%YJ/.| 6._B׹|%``I^~󞟫Ta" `|| *6oeoA}2aZkn-dAש-R y9{@&o6 - 0~FLECXֻC"䐱3^FcٸaptrGLϠ <rVmf\w?r@LW5|X6wiz_Hx#!d/Oh_@LOF $o1[pJz; jZ+ Bp^;akq *0#G!r:AcF wqY~&3Vv4 ({AX{m}g?CG@@zP+X./:sikd"*D7HwQz7r7 gqu,8EkW|UoZLK)7LK,O\{F@ D`";f.KĘ]YO֜X@_p#1}m`sa9EQHuA:H*UKvo7.9X63 0G+_ YIψ{uuxAUT%I=W/类)Hʚ|h#9әOIZXrLDXlBwc vaMgM7]qZ;q9?a3J <kk1^!IV>2 eyx /wnJI:kRFC]' e C@vj,,7%_߇IEuH{DӃ*>ϧu%DΧ0.[@j% XZ:Yi%I  ;qHm1A)UH⨦WbЧ Bl7C-xRZ*],}؇7JزuAf¶ሞژMyi l=@KK~qy]@; u5AfEQ]Iۅ VuiJ45<ݹCCXzy/joh!|~L_2\:\VFwV'TZO*ŊLx8EDR// sm,nu#1bFMGOWYE ") C:o֝Aa}!]bۘu 3TImF5h1qOiI%W:gp-T V!o-pfXH( 2yOq*#mlKv)9.d? %BE@pGu4[>10r7ڹZdvgi^J ="ճA>3k~Y9XL$c"'#  O8`4kUޤtwya7tpTO~'be?&+eҲ8V>PpIwqg? aDaphĐ7~s 勈2fPoAB'} #,:8W0!o'6q{j7K#RAsC]=IGVa#ysÓf?X Y/16HFLH(e\C`^Ukg5´!36( R2tPPCSRzE;(M&8taqoq;z ed/-c8%A;`"V.OEEȱs}Iw'Oڼv1&lPezca09"JKaPɖN}@=K.lpJ$;*.Q0 `T^'֛SvӁK}dbD0 k@tUʉ9Ghj(,F8c AmGl^)dB,rl#^,&bzgi1350h41U֋`|PB `tL +pV8THZ ߲S8D' 1n aj6`;>m"'gC0\@72j $w!u %W3C}BJsd%a#]0zL0!_&,yfm15`89l7hr]XH%nTm S&8In'; modifiers are -abjnoqCL%sV%s. x x6=H@??. .=20 April 2009g g =OGerror: expected central file header signature not found (file #%lu). \ \ =D<error [%s]: attempt to seek before beginning of zipfile %sD D =,$caution: filename not matched: %s M M =5-caution: excluded filename not matched: %s  = (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) b b=JBUnZipSFX  %d.%d%d%s of %s, by Info-ZIP (http://www.info-zip.org). ; ;=+#"UNZIPDEC C V4.1-001? ?= (4=TRANSFER$BREAK$GO# #= __iscntrl =  = 4(4= main4=,$# u- u- u-$$ $= 4: := 4=  = Y? m UNZIP.BCK-s)[UNZIP60.VMS-BINARIES]UNZSFXCLI.AXP_OLB;1 44= unzip4=wo -j -jG - - . . . . .XH .H .C 8/ G/ G/ L/ `/ a/ @/) k/ k/ n/j q/ u/ @/7 @/ d/ e/ ~/ ~/ ~/,$ $=  4. .=  4=  = . .=  4= . .=  4=  =  = : := 4=  = 44= uz_opts4=w /  / /  / /  /  0 0  $0  >0  C0 I0 L0 f0  0 0  0  0 0 0 0 0/ C1  Q1  u1 1 1 1 1  1 1  ?0 1 1 1 1 1k 1 1 1 1 2  2 2 2  (2 -2<$ $= 4: := 4=  = 44= usage4=H@? b2 b2 b2 b2 b2 b24$ $= 4: := 4= ` `= 4p4= __main4: := h4=  =   pww**[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1+,.h/ 4hX-s0123 KPWOX56;w#7fo89GHJ % Librarian I01-29Cw#@rOz0XXM$$p/ CENTSIGMSG CLI_BINARYCLI_BINARY_ALLCLI_BINARY_AUTOCLI_BINARY_NONE CLI_BRIEFCLI_CASE_INSENSITIVE CLI_COMMENT CLI_DIRECTORYCLI_DOT_VERSION CLI_EXCLUDE CLI_EXISTINGCLI_EXIST_NEWVERCLI_EXIST_NOEXTCLI_EXIST_OVER CLI_FRESHENCLI_FULLCLI_FULL_DIAGS CLI_HEADERCLI_HELP CLI_INFILECLI_INFORMATIONCLI_JUNK CLI_TEXT_ALL CLI_TEXT_AUTO CLI_TEXT_NONECLI_TEXT_STMLF CLI_TIMES CLI_TIMESTAMP CLI_TOTALS CLI_TRAVERSE CLI_UPDATE CLI_UPPERCASE CLI_VERBOSE CLI_VERSIONCLI_YYZ CLI_ZIPFILE/EXCLFILENAMENOTMATCHED/FILENAMENOTMATCHED/MAIN/ MASK_BITS/ REPORTMSG/SEEKMSG/UNZIP VMSCLI_USAGE% VMS_UNZIP_CLDVMS_UNZIP_CMDLINE?CLI_JUNKCLI_TEXTUNZIP__MAINZIP_CMDLINECLI_LISTCLI_LONG CLI_LOWERCASE CLI_MEDIUMCLI_ODS2 CLI_ONE_LINE CLI_OVERWRITECLI_PAGE CLI_PASSWORDCLI_PIPE CLI_QUIET CLI_RESTORECLI_RESTORE_DATECLI_RESTORE_DATE_ALLCLI_RESTORE_DATE_FILESCLI_RESTORE_OWN CLI_SCREEN CLI_SHORTCLI_SUPER_QUIETCLI_TESTCLI_TEXT4CMDLINE/UNZIP% VMS_UNZIP_CLD/UNZIPSFXBANNER UNZIP_COMMAND/USAGE/UZ_OPTS/ VERSIONDATE VMSCLI_USAGE% VMS_UNZIP_CLDVMS_UNZIP_CMDLINE/__MAIN Z } UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h2J [2 UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h !"#$%&'(\i UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hy()*+,-./01234567]_ UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hF789:;<=>?@ABCDEF^ UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h@FGHIJKLMNOPQRSTU_πs UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h5UVWXYZ[\]^_`abcd`D"u UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h_defghijklmnopqrsap UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h&stuvwxyz{|}~bw!~CZ{G\TG4}U (G; 2 azip-]0ɥ<7"xkt=:j -jGC-K $DGA&OKK9 / .`' /kCA'CM J.4XIM.H HC M}lC&LKM G/V G/F / G&M `/5 a.p @/)`  k_ bkE&DGP n/jj6 qG uo ,/7jCA3ZK P/ e ~ ~/ BGK?cSV^$< r#$?GHOlAASmTrR =@= GAOWAqSRTFR|4/ = G RETURNkVIS= 4< /= b ( RE`UVNbVDS9= @ = RMTRN^VMS:   ?FX4 @E~C5S@GNAD4 =]  DEwC SJG^AO44=X uzqts\ DECS!SIGNAL4Kpi/  %hz / JAJ SKBB /5 e /  0 EA%IJH^0 $0/  >0 EAH]MN qL }0qM0@ 1&BEON ؜0 - 0GH*W@~A 0 0N0puCQf1C1l UG@L6r$LS Z14 0lk2h :DC$CF a14 c0 N?0FMA%KDCM5<  0P .I 1JAJSEO  k 1l/ 1l 1@Lr$EL:2 2/  2 GJ&WIJHd21:-2<<$ ;G DDCC$GLGNAL4:< b# DECCSMGsA] 4 = @X KCC$SIGzAH< 5=GusieeV]S^UNZ^_CMDLIzE=H<5b2 b2a  b sdMQ\@^@2mCOGGJLb24% = GӣVMS_UzZMPeC@DvIsE KlG4|? LEC$OURN#M]`9b#4 GECCTRTRNCMP4=4 __cinPx8DACy$^ThN~MA 8tLhG4`= DEKCSTCMP   @cpDAC@$$T%CMP4b#DECC$GXSPRINTF4G(DECC$GXSPRINTF4$@(DECC$GXSPRINTF4GDECC$GXSPRINTF4b#DECC$GXSPRINTF4@DECC$GXSPRINTF< GPROCESS_ZIPFILES<b#PROCESS_ZIPFILES< *jZUNZT60.VMS=  LI.IA64OxB:1* ,G/h, / DeCw$FXSRRI&UF4 d#.s0GCr$GXRP`INPF3 4K([W@X, 5rE0{RANcFf8` =G GFEAClGRRN94p k!% Lg&7"1M&6sbxcf4 Cw#Nz, 0DECC$GXSP HNTF4 b GL DCCC$SXPPvHNTF4r b#DECC$GXSPRINTF4D D!ECC$GXSPRINTF4 G( DECC$GXSPRINTF4 b#DECC$GXSPRINTF4$ @( DECC$GXSPRINTF4T Gp VMSCLI_USAGE4` b# VMSCLI_USAGE4l /@ pOENTSIGA CLI_UYAGLI_IzASY CLI_BVJX_ALD {T4CLSBINARY_N-mF CLG aSPRIN@FL}_BASE^INSBSITIVE@ OLI_COMC $GXSP_IN ID}RDCTOSYp CSMvTWERRIONS  a TF8CLI^EXI+YINGb3CLI_EXIST_@vXSPRIATFCIkEYIST^NOEY@MI_EDST_OVE\ECC$GSSP RS|EK CLI_FUSH(G CLI_F^ mTY wLO_HE@DERk C.j\HELP D {;CLI^INF_MATION@NLI_JUN@DECC$ISATX4 CLI_TZ\@LL O    4 CLH_TEY_NONEb#CLI_TEXTS _USAGLCIkTJMES CLI_T DSTA]VM  4 CLH_TRUXERSEG CpG_UPDATKECC$GUSP PEfCCSEC CLiQVERBOSEb# CLI_VE\ GXSPRNNTL9^RY*4 BLI_bGPFILE/@yVCLFILE@ k i4FHLENYBENOTMAKGE/HMAG jBC$GXZPR _I`S- ]EPORTMSGM"SEEKM]jBC$GXVPRP8VMSBLI_\AGE%@VMPUNZIP_MC$GXSARI_NnIQ_CMELIN=G?DGCC$[PR JNCI_TEXTb#TNZIPDE$G PCyDMINE@DECC$GXSPRINTF =Zp`(HPx0h8PX. (Must quote upper-case optiow, like "-", undes0liC/PAR[E= `n C\I\LOWERCASE7CDI_MtAUMCLYZODS2;1C\I_O.E_LINE tLA_NERTRYTF0CL_TAEDEmLI_PIPECLIQUIETaCHIR]SWOREVMSCLY_U RESOJEZDATNECC$IGATI_REPT_RM_DATE_ALL;CNI_RESTORE_DzTA_EI\E]CLr_VEnT_RG_OWN SLJ_SCEEN =C\IWSHOd CMI_S]QER_QUI~T=CI_TEST| LQ_SEXT DECC$SIGNAL7HANDLER7FNAMES=-d7A' CMD]pTNZIPZCM%VFS_UE gRCMP PROCESS_ZIPFILES DECC$STRNCMP=-x(=0 ;=0 zP RETURN_VMS GLOBALSCTOR=0 ;=0  DECC$EXIT DECC$MAIN=0 ;=@< DM =0&caution: jot extrac[hng; #d <)4&"6"RBANMEB( UNZI_GOpMN5/errjr:usl#e@qtion'us0>"?&6uhan dnc3ez<'#7d.: exdir,al:"$&(`UU0 21Lnn: oot>m~1u/4-pr,l7ecifitd;v$41:<3'7n"NLINE/__MIN=PCerror: must specify directory to which to extract with -d option =XMerror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid 8=QIValid options are -tfupcz and -d ; modifiers are -abjnoqCL%sV%s. x x6=H@??. .=20 April 2009g g =OGerror: expected central file header signature not found (file #%lu). \ \ =D<error [%s]: attempt to seek before beginning of zipfile %sD D =,$caution: filename not matched: %s M M =5-caution: excluded filename not matched: %s  = (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) b b=JBUnZipSFX %d.%d%d%s of %s, by Info-ZIP (http://www.info-zip.org). ; ;=+#"UNZIPDEC C V4.1-001? ?= (4=TRANSFER$BREAK$GO# #= __iscntrl =  = 5(4= main4=,$# u- u- u-$$ $= 4: := 4=  = c@I UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hd~ UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hɹe UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hT fp UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hgr_ UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hmShލ% UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h\=YEZw#V1.0ELF 2@v@@0 +a 0 -a0 "<0)a#@#)`)))-/IPF/VMS29-APR-2009 07:2029-APR-2009 07:20CMDLINEV1.0IPF/VMSHP C S7.1-012IPF/VMS TEXTBINARYSCREENFRESHENHELPJUNKLISTBRIEFFULLQUIETTESTPIPEUPDATEVERSIONRESTORECOMMENTEXCLUDEODS2ZIPINFOSHORTMEDIUMLONGVERBOSEHEADERTOTALSTIMESPAGEZIPFILEINFILEunzip TEXT.AUTOTEXT.ALLTEXT.NONETEXT.STMLFBINARY.AUTOBINARY.ALLBINARY.NONECASE_INSENSITIVEDIRECTORYLOWERCASEFULL.DIAGNOSTICSEXISTINGEXISTING.NEW_VERSIONEXISTING.OVERWRITEEXISTING.NOEXTRACTOVERWRITEQUIET.SUPERPASSWORDTIMESTAMPUPPERCASERESTORE.OWNER_PROTRESTORE.DATERESTORE.DATE.ALLRESTORE.DATE.FILESDOT_VERSIONTRAVERSE_DIRSONE_LINEYYZ_UNZIP                XMH@` X$`8 @ h$ H@p<By@b lD<+ @</ hZ< + @< + 8_</ H$_</ H$_</ H$_</ &Pp (C$1BP !B H p!@i z9 UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hJ (!P P, 0JhrCL 9bF0C (JhrCp$Hb h!0 PX!)H X h!H p$0  x^0 PX!p (0C , @D @!pH  h$8 #P0!@ q@ X!@ # C@$( @h$B !0 c !pjHPp!B !Bd $D 3Jg P X!h #  h$8a#hZPX!p ( HCh$H2B` 0$0  0L $#PX!p 0CH(!0H$ h$ HhZPX!p 0C$HL`2%@h$ H hZPX!p 0C$HL`2%@h$ H hZPX!p 0C$HL`2%@h$ H hZPX!p 0C$HL`2%@h$ H hZPX!p 0C$HL`2%@$BPX!p 0C$0HL`2 @h$ H hZPX!p 0C$0HL`2 @h$ H hZPX!p @C Q$#@h$ HhZP8 D8C$!P2B@d @$8 # @ P`BCh$ HhZPX!p (pCh$0`2B  0F!0 PX!p 0C4!`*B h$ HhZP8 D8C $8# @ P @F 8#` @$@ #4Ch$ HhZPX!p (Ch$ HL`2@ hZPX!p  CL`2@h$ H hZPX!p  C @M$@#dh$ HhZP J8B0C $8# 0F H D80C$H L`2)@@$00K  @PBP F8B@C$0B@P X! $HhZP8 D8pC @$8#(! P @ H@ `R@E C$X@h$ HhZP!@ q `͠!(1C(1CL0)B 0L!@+Q L@+ LL2 LJ(1@C$@S~F L`PcdJh$ HhZP J8B0C $8# 0 H D80CH$H$L`2-@h$ H hZPX!p 0C@$HL`2%@h$ H hZP J8B0C $8# 0 H D80CH$H$L`2-@h$ H hZPX!p Ch$ H hZ2@PX!p pCh$H  hZH#@PX!p @C $H#0 (@ P$P#@h$ HhZP F8B0CH$0HL`2 @h$ H hZP F8B0C@$0xH eB L#Bh$ HhZP F8B0C@$0HL`2 @h$ H hZP J8B0C@$0HL`2 @H@H D80CH$H$L`2-@@$ H @PBP F8B@C$0B@P X! $HhZP8 D80CH$ HL`2@h$ H hZPX!p `Ch$0H $0 L`2@PX!p  CL`2@h$ H hZP J8B0C H$8# 0R H D80C@$HL`2%@h$ H hZPX!p 0CQ$ HL`2@h$ H hZP J8B0C H$8# 0R H D80C@e$HL`2%@h$ H hZP J8B0C H$8# 0R H D80C@$HL`2%@h$ H hZP J8B0C H$8# 0R H D80C@$HL`2%@h$ H hZP J8B0C H$8# 0R H D80C@1$HL`2%@h$ H hZP J8B0C H$8# 0R H D80C@U$HL`2%@h$ H hZP J8B0C H$8# 0R H D80C@$HL`2%@h$ H hZP J8B0C H$8# 0R H D80C@Y$HL`2%@h$ H hZP8 D8C J80C H$8#0R h@h$ HhZP J8B0C $8# 0F Ha$HL`2%@$BP J8B0C $8# 0F H D80C H$H# $`2 @h$ HhZP J8B0C $8# 0F H D80C $0HL`2 @h$ H hZP J8B0C $8# 0F H D80C 5$0HL`2 @($ H (JBP8!! ( `0N B0PC!0 B0Y !  c H`:@`$ L% #@%CP!B@c $( XD$,hYP8!@ q ` NPCH80C$BP X!@$ @0! , # p!!` `,eP X! A!0 8F80"C8!1B0g8N0@ HR0:@LHiC!B c $ @X 0,hYh!P!@ q ` FPCH80C$BP X!@$ @0!,@d p!` $@0B0YA!p,eJ $P D@ `F , YN ,5PH!`1B ` HR` 0M?#,0Y 0L #$ H DBPX!p C$B1BP !1B0`g H  H!` cF B`N0 iC!B c $ @X 0,hYh!P!@ q ` FPCH80C$BP X!@$@8! b1Bb $p HY D` 8Y,0YhR P !01B ` H0 G?#@,`Y F # 8a!p 8N8p"C0!01B@@g0L :@  2@iCH! B c $$ XX,"@,hYP!@ q ` FPCH80C$BP X!@$@H!p,@d p! $@0B HYa!`,: $P D@ `F , YL ,5PH!p1B ` HRp 8O?#,8Y 8N #$ H DBPX!p `C!1Bd p!BXPp ( C ,@HP8C !1Bc H   H! #)C8!0B c $ X ,hYP!@ q ` FPCH80CjF UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1he$BP X!@$@0!@, xa$` `,e"P!1Bd p!BX X!Pp ( C ,@8!2B # 8N ,HYP!@ q ` D C@$@!B Fq0C(!@$'L 0 fCHp BD( ! B HQ&`$HX``PPԃB @88((H(p @ H( h$8@ BA(!pJF4PCp B (J!(iP @ , pTp@.!JpP!HpYp$P 8  B ` C@$@ !c  H YpC 8D!$B`DNPHR! $t X! !@B !JP,TE J@ # B @$XUdPhMH` @8$`8 @@`$Bp<B x!@<+ </ "P\!p @C F`X 8pCH$ H$HP F@ q p C@$@0!(@ 0J$1BP8!p ( p`C@% ,  g )@R!B HH0   !0@ 0 Hi`CxF$B #DH,X,P Fp@q pPC$ 1B a a!BPXa!B XVpqX)H8pCB!, C`X  V 0~F  r*i@xB(@ @aBHF1B@AbX$ HXP,c H$T (,C88 C@1B "!$# P(* @P D(0 DB`CT1BXHT@ 0`a  CT1BdHT@ 6la C1BPp$B@ <2 >`xaJ@ HQ(b K@`dV!(@ `!@! DB@B @ aJF ~FpB- H,`XL$  C$(@ $$1BP8!p ( p X@H80C$BP \!@$8@ J @$hUb`H`x0 b p<B@y x`!<0#`x H$<B @H @E<"/ $ IRD HPF! ,  `! HMH`@b@@80C$,PV!H@ $H $@0 @DB qD*pH `D P `80 shZ  BX p$`BXQ!P,PJPB C hL!PBB `B!,@XJ LK4D `V!"Hp$ @p\P V!  ($ , `JPV! B 3 `N!PH@XhJP,P(J 0p(H C hL!B@R`B!,Y pB(PBJ B D0  `V!"HUp$ @p\P`%B ($@" @`J@ PV! B 3 `N! H@XP,t*hD@,PV!ТH( %@!H@p\P(QJ!!HY hL!# `B!,  H0 0`@!BQ@XHU unzip/VERSION, /RESTORE. /PAGE, Modifying options are /TEXT, /BINARY, /JUNK, /EXISTING, /QUIET, /CASE_INSENSITIVE, /LOWERCASE, and /DIRECTORY=exdir-specValid main options are /TEST, /FRESHEN, /UPDATE, /PIPE, /SCREEN, /COMMENT20 April 2009(R ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60.VMS]CMDLINE.C;1٬SLnؙoq .R. H1O8x x! {~@1Py `y } y}g}0}0}0}0}0}}}0}0 }ʩ%g }'թ}0}}.0}(ʪ%{}##2 g }}}}{{hg~}~}ʵ}}g00}%g}}}}}}}}}}}}}}}}}>~}  }}}}% oohP}%##/"01%."0}%##/"011w%@zֵ``%%g%"@0#"" 0 ec2 }%.%@ff}o0#0/ubr!eo #ȩ%b@@0 2 OO xxz/ @ǵA w` w >@%.}-CMDLINEHP C S7.1-012vms_unzip_cmdlineFget_listFRcheck_cliRSVMSCLI_usageS[,-.shstrtab.note$READONLY$CLI_TEXTCLI_TEXT_AUTOCLI_TEXT_ALLCLI_TEXT_NONECLI_TEXT_STMLFCLI_BINARYCLI_BINARY_AUTOCLI_BINARY_ALLCLI_BINARY_NONECLI_CASE_INSENSITIVECLI_SCREENCLI_DIRECTORYCLI_FRESHENCLI_HELPCLI_JUNKCLI_LOWERCASECLI_LISTCLI_BRIEFCLI_FULLCLI_FULL_DIAGSCLI_EXISTINGCLI_EXIST_NEWVERCLI_EXIST_OVERCLI_EXIST_NOEXTCLI_OVERWRITECLI_QUIETCLI_SUPER_QUIETCLI_TESTCLI_PIPECLI_PASSWORDCLI_TIMESTAMPCLI_UPPERCASECLI_UPDATECLI_VERSIONCLI_RESTORECLI_RESTORE_OWNCLI_RESTORE_DATECLI_RESTORE_DATE_ALLCLI_RESTORE_DATE_FILESCLI_DOT_VERSIONCLI_COMMENTCLI_EXCLUDECLI_ODS2CLI_TRAVERSECLI_INFORMATIONCLI_SHORTCLI_MEDIUMCLI_LONGCLI_VERBOSECLI_HEADERCLI_TOTALSCLI_TIMESCLI_ONE_LINECLI_PAGECLI_YYZCLI_ZIPFILECLI_INFILEUNZIP_COMMAND.sbss$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.vms_linkages.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind_info.rela.IA_64.unwind.relaCLI_TEXT.relaCLI_TEXT_AUTO.relaCLI_TEXT_ALL.relaCLI_TEXT_NONE.relaCLI_TEXT_STMLF.relaCLI_BINARY.relaCLI_BINARY_AUTO.relaCLI_BINARY_ALL.relaCLI_BINARY_NONE.relaCLI_CASE_INSENSITIVE.relaCLI_SCREEN.relaCLI_DIRECTORY.relaCLI_FRESHEN.relaCLI_HELP.relaCLI_JUNK.relaCLI_LOWERCASE.relaCLI_LIST.relaCLI_BRIEF.relaCLI_FULL.relaCLI_FULL_DIAGS.relaCLI_EXISTING.relaCLI_EXIST_NEWVER.relaCLI_EXIST_OVER.relaCLI_EXIST_NOEXT.relaCLI_OVERWRITE.relaCLI_QUIET.relaCLI_SUPER_QUIET.relaCLI_TEST.relaCLI_PIPE.relaCLI_PASSWORD.relaCLI_TIMESTAMP.relaCLI_UPPERCASE.relaCLI_UPDATE.relaCLI_VERSION.relaCLI_RESTORE.relaCLI_RESTORE_OWN.relaCLI_RESTORE_DATE.relaCLI_RESTORE_DATE_ALL.relaCLI_RESTORE_DATE_FILES.relaCLI_DOT_VERSION.relaCLI_COMMENT.relaCLI_EXCLUDE.relaCLI_ODS2.relaCLI_TRAVERSE.relaCLI_INFORMATION.relaCLI_SHORT.relaCLI_MEDIUM.relaCLI_LONG.relaCLI_VERBOSE.relaCLI_HEADER.relaCLI_TOTALS.relaCLI_TIMES.relaCLI_ONE_LINE.relaCLI_PAGE.relaCLI_YYZ.relaCLI_ZIPFILE.relaCLI_INFILE.relaUNZIP_COMMAND.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60.VMS]CMDLINE.C;1GVMS_UNZIP_CMDLINEVMSCLk8$q UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h9I_USAGECLI_TEXTCLI_TEXT_AUTOCLI_TEXT_ALLCLI_TEXT_NONECLI_TEXT_STMLFCLI_BINARYCLI_BINARY_AUTOCLI_BINARY_ALLCLI_BINARY_NONECLI_CASE_INSENSITIVECLI_SCREENCLI_DIRECTORYCLI_FRESHENCLI_HELPCLI_JUNKCLI_LOWERCASECLI_LISTCLI_BRIEFCLI_FULLCLI_FULL_DIAGSCLI_EXISTINGCLI_EXIST_NEWVERCLI_EXIST_OVERCLI_EXIST_NOEXTCLI_OVERWRITECLI_QUIETCLI_SUPER_QUIETCLI_TESTCLI_PIPECLI_PASSWORDCLI_TIMESTAMPCLI_UPPERCASECLI_UPDATECLI_VERSIONCLI_RESTORECLI_RESTORE_OWNCLI_RESTORE_DATECLI_RESTORE_DATE_ALLCLI_RESTORE_DATE_FILESCLI_DOT_VERSIONCLI_COMMENTCLI_EXCLUDECLI_ODS2CLI_TRAVERSECLI_INFORMATIONCLI_SHORTCLI_MEDIUMCLI_LONGCLI_VERBOSECLI_HEADERCLI_TOTALSCLI_TIMESCLI_ONE_LINECLI_PAGECLI_YYZCLI_ZIPFILECLI_INFILEUNZIP_COMMANDVMS_UNZIP_CLDUNZIPSFXBANNEROTS$EXTZVOTS$INSVOTS$MOVEELF$TFRADRLIB$GET_FOREIGNSTR$CONCATCLI$DCL_PARSEDECC$MALLOCCLI$PRESENTCLI$GET_VALUEDECC$REALLOCDECC$FREEDECC$STRCPYDECC$STRNCPYDECC$CALLOCDECC$STRLENSTR$FIND_FIRST_SUBSTRINGUSAGEDECC$TXSPRINTFDECC$MEMCPYDECC$$SHELL_HANDLERLIB$GET_INPUTLIB$SIG_TO_RET      !"#$%&'()*+,-./0123456789:;<=>?@ABCFGIJL7@ 9?#K?)Xao|      -6@IXev !"#$%&'+(<)Q*h+x,-./012345678 9:;*<5=CQ`js|?7=LXlzDDZ@UDZ@UQU'>'>#'>)'>)'>'>-eE eDeF'>XW_>_>#_A_># _>)(_A 0_>)8_>)@_A@H_>)P_>-X_Ap%%%% %0%%@%P%`%p% %%(%0%8%%@%H%P%%%%%%%X%(%`%h%8%H%X%p%x%%h%%%%%%%%%%%%%%%%%%%%%% 9"*=p9I>)I<<IRR!2II??IRIp//I++77I 0002Ip11I22l  UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h.5 I3 3"I`4p4rII55I@6P6RII  I0 A RIII0PRII  I@ P b I I ' ' I@ (P (R I@ P R I   I  " I   I   I   I` p r I   IIP`bI  I"IAPRIII "I!!I**I`-p-rI..I`prI""I`#p#rI$$I`&p&rI%%I2I  I 8082I,,III"II"III :0:BIrIIRIIIIbII;;IRI>#IBIII>#B I!Ir"I#I#IB$I%Ib%IR(I(IQ)R)I)*=*I *H!*H0*2?(1*H@*HQ*2?8R***I+2?"+I@+2?R+Iq+2?+I0,2?0B,I`,2? r,I,2? ,I,2?,IP= 0%3@N ]0h@xP`p  )0:@IPY`gpq 0@,P<`Hpm0$"KABh+_\E\TKLuZqAUTOcK<Gh7^N>OMIuYM^oL+È_T,kPLw@<|WYCL)]gN{^B|NJB\7N>C.EI]wrf[CHDMRkO9TO$PLR$CL[WTIMESDiFW]LEf0#Msi^D!s][BX[sILCL_ML^PS@tcJMI DES_UZIc ]NHq#FDIERtaB]RVTS$INÖf}}VG`LBX. gEHlGMT_6rAAStt$3TBCLI$cSDX}R$HDE nR_d0` Wߜ!M5 cORAHl^+\BC$[EEDAlW \F Y J@s$W_QX$lN(@R RD1FT $ UAe/OHRS4SUukVs5"I$EPPSUK_QqE%R|d xEI!,W̎=@ qnvU9kIB$]VC}0C +IB$Wiw IUETPLX!p]qD `2%@`\^B@X `6 ӚI50HPP er 1 p h$ R H#cI(Z43Xw (K40 HȄL5`1<c$ IHpPJ1p0( p ԊX!p ( :T+,# " 'Kh$ a@R|B1BPp (  C H@d|pJ @$P`LBcCxR$$dEJ51 ;,H\ hZn"X 0@ Y#ppd$#`#UF=b a0BPX!ei@Up*T XPpqX-ƌ- HhC`1# S .cXC V)~e @$PX@0(lQ`)Y\H a4 Iw (E  1B@Ib^N 1((#HXC84 >+ IH12,@cP^J(3L10q1 Ӎn0`c x6)(h hEr  Bk"TL 3  CN5JcD 24)  IhZ(2t^*Ca5pc&p0la PG D8'4@ c P 4 $y@nx 0x#J!R(+ ɀQC b4dV! ׇ8-   @*UhHBP h T(nC@$8#0;~pB))I,@`\61`R0f2ӆ(0!$53y@   1IhZE@*Y*3[2@H(- ( 00)BpL/@+iw8)@+-HL1>2:ELhWb;`{J 4fG<ǖ4+PSF aR%!kx`!\ #cΗ `< f:D HP@ Z(E0m3DCK 18# IR"1 H&H D8;B@G"0 ,H rT0#2d@  h$ `H LBH` c[H1nCCr3MCXȤL50,@PsT Hl`HX4HƜ HP 0bCtB 48P R*M0p]H;(Pd4L h Uk%@1 XR X dZ 1U.%1  #ӌN%H   1w0d,@@XP1PYU4 UxF H s2u 1jk`Dp$ @Px1p(HV+J`   k89 `0K 4P# @vT 1PH@VPXh! (@8,BO^$?H$P(91PB? RN, @r 1.YP,T-`!CJ@-5`j eB 3eaB!F0 )h IhZh@ ": 0Tp `2@P`b @X4@"@PA`! (P( b8DSW) `0@0O\@B@H D8P.D*;E 4 ,HP$0(S@$Bp @* BP(QJ!!HGPRh! ,aD n B,B@ H/ ) WXX!`* hZQ@zPZ8 D 8HU DTT$ IH}n%`2JRBIoNH.P~wFZEf 1$@L<3PTgd1fXnZ0siI-:H`pNX,5/B VY=H~k,/AX@pVLLI\TZx( xP ,# c^=l1fqS_NWEW;HVIr%2OFExc;Dv" ( p=j b#ondc>/LREgTw{eidArhC7 ^clid ia+LDo'qee l]U,NeHTN fUWE% /IPE( %BPTa%i/ OMEnAhZF AirY0 J } .R3QB, @}:g@Ŗ?}R"Z?h0X*KR+"0 }4z%73!\.}Ӄ K/X I}UDH}' $,)K{8!WR gv-5Bm}Y@}<'D4]*0P4}ӝaO}KlHݵu5o? A}V-H} و57]%rReW}P(7"ͿJ8}Yc,F% }2Q !}0o? \58^0}2 Q7F} ZoOhZ)s% P@}:tX%s#R"Br 17"э?VSJ"0 }^4 !X":/X"41 p:b[ %) ›s[]!^]apSTO巈 ǝg-%Y""D0Y`"9! 6R! %V@B& Je5k[$c1-b"E2& .<@'93f *D0#f~kIc1<$k4X*yoLQŵ*((rSU^cKbs2)#Ab"2W<`0\J D8Wq6EL* " T6?$cBky*tIF CP :/ K@0s PJVis 'w9e# ?aG -2#) #%Kv /9X@"aL`2 HGh>$ xt%EQnDX\, z m2\Fnz*&Gfm%HiV&#FgiD*iStgR>gh+KTiPPW0VuJyH`QCi4aHP_L`2,@A$ @7(J+-BoRF/_MSP3.0#_F[.^8O&&inhV9sLcouE?Vj(nA^[Mho^XF|nlGVdxV:)A./uNhG`<YMUBICYjlj_SkY_AWTOItV QLmByH-A FONaA|$( O5BV2 }_C, m3bL m.S(D| ?SYEL2P __JVq_L;%AS^hQIQ B_B5(I_I IC)I' M  0 ,+E+[|EXm.0yGh,_AX%PA%8WYɈ TL V?P7CXIATJ^reR /T5 F)uqik&~P )8`)oSWOR@9z vTAͦ+V# Jo-K@LM_/]Ghd4 VERWINq[rKE + o-.~*:G :-{5`[J+MJbLIG2\@MG~F ueo OtTRS)O<]AI?SK[uXC,S!F2CLJ-NL GBpIO Z OD-\:*D Q)a&iE"&&h 3F0#PLLu1N{ {; ChI_*  QYQM O@Ei.)k>B COzK:c[NGiG<2eP|2ss$C:HvMi?lW)$`%C"_llmW@kY/?%,W$PE ~V2[gHfg?%Wab*s02!<4a,:nac= 3/g* ug_gin5L.u4 Othqwmgbe{,SoBwumt|``e_ido&tr1&Dxs@rsB.sehaDxca&gnI\Ec($Y] unwmnb'fN`,EL(*A۷/2cWynlv`rIIT0cx oCL XDJ@T~UKBlO^TaValn*e)`m_NdE_x_H&>jkabLI PEX^_STI.Se,eO=i_"HmRwGcelALJBI ^mTO&,a]aCHHNe[KGL.r5IiMK~BICRY_NKNI@sgHaCiK_CTEw\]Ori6Ve^NH]w3Pan +:olT.PFpN,rSU- _UGDi.renaCDI_K[/Se,+O=i0HS5}aCO_SSS2JelaAMoTIA^@Mt,e.aLIY^SbASV.rfleC T`AT.riabPNEs#KPbnl\s8aMM_DOT]VEZSI K!jeM4Ic-L}cucoi_FXGL|N>QnhL[wS;=eLaCWI|T}AREECJ.Ve@I_IJF B\L*x%oG[HNv`}%LCLD-DIP }/KLɬHt1hlaKT_VcIqp..wD^E-C.sGaKLMT_F(n{kbcLM"LJ.r0`JCKM[tO_Xc1ThBH HA6N8i H*[c6%x` <\nF_jIPFXlVF+e@ISc*a!g3^Ua_P[2jFr0.0d.A K[$& XPEBUUQs. VINcE4CLY.UNbQ60>M\ncM$IeM0GX=PUJCC lLIGRrCOnn UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hFT]jz 0@P`p -6:@7%@8p`?BFpENJDHV`X0E d`@7,pY`EG`p<`<`Y`EJ` =0Y0ELYEBZ EC([E@[EX[E-p[E@[ET[E d[E y[E [E \E \E0\EH\E`\Ex\E \E\E-\E<\EJ\E^]Ep ]E8]EP]Eh]E]E]E]E]E ]E!]E"'^E#:(^E$J@^E%[X^E&lp^E'^E(^E)^E*^E+^E,_E-_E.0_E/$H_E09`_E1Hx_E2X_E3f_E4w_E5_E6_E7`E8 `E98`E:P`E;h`E<`E=`E? ilZw# GOATLEY CMDLINE&ypw# GOATLEY VMS_UNZIP_CLD`Oz GOATLEY UNZIPiepw#03-003 ELF 24@@7IPF/VMS29-APR-2009 07:2029-APR-2009 07:20VMS_UNZIP_CLD03-003*IPF/VMSOpenVMS Command Definition Utility I01-07.note.shstrtabCLI$TABLES.symtab.strtab H UNZI ,(Tl UNZIP4!)P1ZIPFILEZip file8a!(P2INFILEFiles to UnZip( BINARY$c ( TEXT(4SCREEN(\ DIRECTORY(FRESHEN$HELP$JUNK$LIST$ BRIEF$8 FULL(`< EXISTING(  OVERWRITE$ Qo{ UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1h'UIET$TEST$PIPE(PASSWORD(D TIMESTAMP,p TRAVERSE_DIRS( UPPERCASE(UPDATE(VERSION(cRESTORE(8COMMENT(a`EXCLUDE0CASE_INSENSITIVE( LOWERCASE$PAGE, DOT_VERSION$,ODS2(T YYZ_UNZIP(|ZIPINFO,` INFORMATION4!)P1ZIPFILEZip file<a!(P2INFILEFiles to display(@ZIPINFO(hONE_LINE$SHORT(MEDIUM$LONG(VERBOSE((HEADER(PCOMMENT(x TOTALS$ TIMES(a EXCLUDE0 CASE_INSENSITIVE$ PAGE$<RESTORE_KEYWORDS$`DATE, OWNER_PROT$RESTOREDATE_KEYS$FILES$ALL  QUIET_MODIFIER$SUPER$` EXISTING_KEYWORDS,  NEW_VERSION(  OVERWRITE( NOEXTRACT   FULL_MODIFIER, DIAGNOSTICS$L CONVTXT_KEYWORDS$p AUTO$ ALL$ NONE$STMLF$ CONVBIN_KEYWORDS$$ AUTO$H ALL$NONEL  4 ` , d (X    4   $ p D T $ p  `  ` 8  <     << T H `t    `  <<  <<8Hp L hxL   p      0< T VMS_UNZIP_CLD@,H`0$@rOzV1.0 PELF 2H@@0 )a(0#40 (a0 *a 0)aB@p p$p$P&-IPF/VMS29-APR-2009 07:2029-APR-2009 07:20UNZIPV1.0IPF/VMSHP C S7.1-012IPF/VMS caution: not extracting; -d ignored error: -d option used more than once (only one exdir allowed) caution: both -n and -o specified; ignoring -o error: must specify directory to which to extract with -d option error: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid Valid options are -tfupcz and -d ; modifiers are -abjnoqCL%sV%s. ??20 April 2009error: expected central file header signature not found (file #%lu). error [%s]: attempt to seek before beginning of zipfile %scaution: filename not matched: %s caution: excluded filename not matched: %s (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) UnZipSFX %d.%d%d%s of %s, by Info-ZIP (http://www.info-zip.org). HMH@x0 b p<B@| x !<0#P`?#IHx?#C?~F( x ?#BhD!B` )C<2/P8!`1B P 8N` ,`0YP$ ,PT!HUe@  b  ! P0B!P, P$P ,P@$B0@9HP X$`8 @XVH@%p<By 0BP H #PR!H@ X$0 PR!H@e X$0 PR!H@ X$0 PR!H@E X$0 PR!H@ X$0 PA!B`@ @0`% $0BYB0B`@!@Y! #PR!p ( Ch@XA!0B BPa! q @aIx!@0B!B)$ #CP@!"H B  C!(  !D #@PX X?#PH # -@ 0 0L,1pC($` H (J BXP8C `$ 3XXH@PYP8BPC @! @!$,` PF8H(@`X @8H #Y!pC C! #&0B`X & a2k*!X`)Xz) X.@hH8pC 0C! #  2 X 2 a`36!X)pz) p: BX <P<8PC @  |,C |BP80C D!",,C`@ 0B  0B!0` @ Ha1 Pa B "@PX((z) P$$@H8CPD0H #X&,P8B@C C!@ H `X80CH C!`B( #x@XF8`C @aB`pk UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hv6 Da 2 !#DB H,@RR H(@!P@@a ,h ` @B!`X, T6X @hd0d&d, SR h2 p #(@ $ @  t,8@$LKC X$0 XVH@ > B YP!B!!H XD!2,@X P@!0 ``@($Bx@QB! BB` @( #F8@PB!@ H  HB!$  PB$ q@PX H(pC$ LK`A X$0 XVH@Z B`B YP!B!!H XL!2,@X P@!0 `` R! $P R! , `@!p  PQ `@H@ , !0'~F ! B`F1BC P$(0  XD`XX8,8C hErC $XH@ H P"8 CG?#  @!@C XD`XX8,8 C HhErC H P"8CG?#  @!CXDB`XX "`pXqC HhMrpC H P8"8C L#?#hFk0C$0D,  $@x ``xh @!@P0!p q PC@D 0B@!B@P Ox@ "!`(B GH@08`CP@!0B  @ 81 B O @ P0!+","80C P@!0(  &!("/ P0!@("/ @88@CPP!B `H @ $(B `G @@8@CP`!B @ @ $(B @O @8(  CD,P C ,, D(`CF10~FpC  0 0L, LL H"9 C `P@&8 C X,$ , D(  C X,$ 0, 0L(p C X,$ , D( @ C X,$ 0, 0L( C X,$ , D(  C X,$ 0, X "`0L( @Pp! q PC@L B@È!B@Q GH @ &!(B O @88@CP0!B ("/ @ $`*B F("/ @$`$q# @@8@CP!B H @ $@)B R @P!` q @PC@D 0B@!B@S N@ "!)B Fx@08@CP!B `8@ $+B `D@88@CP!B `@ $)B `F@P! q PC@P B@!B@S @F(@ (!)B @R@P!` q `Cd&8#@B@AQ @!Da @BDB Rx@$09OB@AQ @E@("/H@P!` q PC@D @B @#!B@S R@ "!)B F@08@CP!B h@ $*B R8@H8@CP!B @ $ *B M@@8@CP0!B @ $`*B UX@H8@C$B@S N@ P!("/@@8@CP`!B @@ $*B @M@ D X ," DsPC cP H*qp C D!0",0L, &`hMr@P! q PC@P B@È!B@V Ex@ (!+B QH@88@CP!B @ $ +B T@P!` q `PC@P B@!B@V Dh@ (!@+B P8@08@CP!B @ $`+B L@P!p q @PC@T B@È!B@W DX@ *!+B T(@ $ H P"8JG?#  @@($@LK`B p$P0 p\HU (BYP!@!!H pB!2,@X hJ!0 ``@($Bh@ $LKD p$@0 p\HE* B B YPBB C $BB pD! ,  B`@($B@($ LKD p$P0 @p\HU" DB@YPD B C $ BB pB! ,( D`@($B@ $ LKD p$@0 @p\HE*  B YPBB C $BB pD! ,  B`@($BX@1@C(?# HX@PX!@ ($P0  (K!0@ (H Kp q@1H8XJ$qPK,KVpx"p8K8C0$@LK`B p$`0 Rp\He (pB YPH@B C $@BB0pN! ,0H@ H` X! (1J!`",L10C 8 $PbB J (AJ!",10C H$PB 'J (1J!",X1 C (K!"/ (J!0! ( KLq0i@8C0$PLKB p$`0 Rp\He 8*B8YPNpB C $pBB0pP! ,0 N`(J!B @J (K!b",8P8@C$ HP8B C (K!"/ HHxpDW@C@ H YBPX!@(J!H 0K0aC8$0LKD $p0 `PH$Hu"0@B s f $0 Xp\,e@Z!P@ !`, C pP!00 0hN!,0 ,0 L` X!(K!0B @AKp ( QJp:@t"90JP•BD29 0H1B J # B , YHHM H  H`% 0 AB H@h$%@BX!b s d(0 XhZ,e@B@0,P@8B` !p@XGBFBx,0 ``%B C `H!  @$H D0 p@0 @YPq/1g UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hE!D!!H(Y hH!2,@X`B!RH D `@!BQ@XHU -x-dX. (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.)DM  `p  0 @ @ 0 `  P  ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZIP.C;1˨TENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZPRIV.H;1T{Di;lnrszz͂ EؚFG#j  (zا! 20000/~| w w|ɬ!}}0. vW`%@f^0 0  0 0 #{0{f#?A H0}#|@ 0/   }vt zz z|@ _o_ѧ|/ ը{ 0{u/ {ѧ|/0y 0 ѧ|/ 00 ѧ|/Ш!1ѧ|/00 0  01 Ƨ@ ѧ|/0ѧ|/ 0ѧ|/ |x  x*h g{|{|{0  @  w i0  u{0 ?|&0|o}xx>@%.oP&UNZIPHP C S7.1-012mainunzipuz_optsHusageHL__main,P&.shstrtab.note$READONLY$MASK_BITSVERSIONDATECENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSGUNZIPSFXBANNER$CODE$$LITERAL$$LINK$.IA_64.unwind_info.IA_64.unwind.strtab.symtab.debug_line.rela.debug_line.trace_abbrev.trace_info.rela.trace_info.trace_aranges.rela.trace_aranges.rela.IA_64.unwind_info.rela.IA_64.unwind.rela$CODE$ENG$DISK:[ENGINEERING.GOATLEY.UNZIP60]UNZIP.C;1GMAINUNZIPUZ_OPTSUSAGEMASK_BITSFNAMESVERSIONDATECENTSIGMSGSEEKMSGFILENAMENOTMATCHEDEXCLFILENAMENOTMATCHEDREPORTMSGUNZIPSFXBANNER__MAINELF$TFRADRDECC$MAINDECC$EXITGLOBALSCTORRETURN_VMSDECC$SIGNALVMS_UNZIP_CMDLINEDECC$STRNCMPDECC$STRCMPDECC$TXSPRINTFPROCESS_ZIPFILESVMSCLI_USAGEDECC$ISATTYDECC$$SHELL_HANDLERHANDLER     1@ 3 8 ` > F p$LDV]iGt<|$ -  B  '3BS`l' +' M' ' ' p$' ' P&e ee' W0_ _ __  _ (_00_ 8_ @_HH_ P_ p$X_h`_ p$h_ P&p_I$I I%2I&RI bI'R1I(R1"I(@R1RI(pR1I(R1I(R1I( BI)I P`2 I*!2 2I+ I,    2 I, I-@ A  `pqI,8 8BI,I,`pqI,2I.PQ I,`!p!xq!!x!I,B"I/"I."### # 0#1# @# R#I,q$r$$$$$ $ $$ $ $I,r%2 %2 h%H%H%I,4s p r:F UNZIP.BCKs*[UNZIP60.VMS-BINARIES]UNZSFXCLI.IA64_OLB;1hOuTD&2 H=p@E(X0oyHP&P,l,p@px p68`0/<x` 4`@4s(=``40(=0<=T=hg8?  .*[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_DECC_OLB;1+,.l/ 4l`-s0123 KPWO`56qѾ 7 89GHJ% VAX-11 Librarian V04-00 ; !_r`+2M HHp  R CENTSIGMSG3 CLI_BINARY3CLI_BINARY_ALL3CLI_BINARY_AUTO3CLI_BINARY_NONE3 CLI_BRIEF3CLI_CASE_INSENSITIVE3 CLI_COMMENT3 CLI_DIRECTORY3CLI_DOT_VERSION3 CLI_EXCLUDE3 CLI_EXISTING3CLI_EXIST_NEWVER3CLI_EXIST_NOEXT3CLI_EXIST_OVER3 CLI_FRESHEN3CLI_FULL3CLI_FULL_DIAGS3 CLI_HEADER3CLI_HELP3 CLI_INFILE3CLI_INFORMATION3CLI_JUNK3CLI_LIST3CLI_LONG3 CLI_LOWERCASELF{3 CLI_MEDIUM3CLI_ODS23 CLI_ONE_LINE3 CLI_OVERWRITE3CLI_PAGE3 CLI_PASSWORD3CLI_PIPE3 CLI_QUIET3 CLI_RESTORE3CLI_RESTORE_DATE3CLI_RESTORE_DATE_ALL3CLI_RESTORE_DATE_FILES3CLI_RESTORE_OWN3 CLI_SCREEN3 CLI_SHORT3CLI_SUPER_QUIET3CLI_TEST3CLI_TEXT3 CLI_TEXT_ALL3 CLI_TEXT_AUTOT_STMLF3 CLI_TIMESTAMP3 CLI_TRAVERSE3 CLI_UPDATE3 CLI_UPPERCASE3 CLI_VERBOSE3 CLI_VERSIONA CLI_LOWERCASE CLI_TEXT_AUTOUNZIP__MAINU3 CLI_TEXT_NONE3CLI_TEXT_STMLF3 CLI_TIMES3 CLI_TIMESTAMP3 CLI_TOTALS3 CLI_TRAVERSE3 CLI_UPDATE3 CLI_UPPERCASE3 CLI_VERBOSE3 CLI_VERSION3CLI_YYZ3 CLI_ZIPFILEREXCLFILENAMENOTMATCHEDRFILENAMENOTMATCHEDRMAINR MASK_BITSR REPORTMSGRSEEKMSGRUNZIPRUNZIPSFXBANNER3 UNZIP_COMMANDRUZ_OPTSR VERSIONDATE3 VMSCLI_USAGEI VMS_UNZIP_CLD3VMS_UNZIP_CMDLINER__MAIN.3CMDLINERUNZIPI VMS_UNZIP_CLDRUNZIPSFXBANNER3 UNZIP_COMMANDRUSAGERUZ_OPTSR VERSIONDATE3 VMSCLI_USAGEI VMS_UNZIP_CLD3VMS_UNZIP_CMDLINER__MAIN syWW UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_DECC_OLB;1ls5 tmC UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_DECC_OLB;1l9 !"#$%&'()u?Z UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_DECC_OLB;1l8)*+,-./01241=I V1.04CMDLINEV1.030-APR-2009 11:10DEC C V6.2-003 CLI_TEXT  CLI_TEXT_AUTO  CLI_TEXT_ALL  CLI_TEXT_NONE CLI_TEXT_STMLF  CLI_BINARY CLI_BINARY_AUTO CLI_BINARY_ALL CLI_BINARY_NONE CLI_CASE_INSENSITIVE CLI_SCREEN  CLI_DIRECTORY  CLI_FRESHEN CLI_HELP CLI_JUNK  CLI_LOWERCASE CLI_LIST 5 CLI_BRIEF CLI_FULL CLI_FULL_DIAGS  CLI_EXISTING CLI_EXIST_NEWVER CLI_EXIST_OVER CLI_EXIST_NOEXT  CLI_OVERWRITE  CLI_QUIET CLI_SUPER_QUIET CLI_TEST CLI_PIPE CLI_PASSWORD ! CLI_TIMESTAMP " CLI_UPPERCASE # CLI_UPDATE $ CLI_VERSION % CLI_RESTORE &CLI_RESTORE_OWN 'CLI_RESTORE_DATE (CLI_RESTORE_DATE_ALL )CLI_RESTORE_DATE_FILES6 *CLI_DOT_VERSION + CLI_COMMENT , CLI_EXCLUDE -CLI_ODS2P/PAGE, $PModifying options are /TEXT, /BINARY, /JUNK, /EXISTING, /QUIET, /CASE_INSENSITIVE, /LOWERCASE, %s/VERSION, /RESTORE. P and /DIRECTORY=exdir-specPValid main options are /TEST, /FRESHEN, /UPDATE, /PIPE, /SCREEN, /COMMENT%s. P20 April 2009PVMSCLI_usagePcheck_clitPget_listnP-xkP-dhP-PbPunzipPPvms_unzip_7cmdline<PGGPunzip ;P@@PINFILE:P88PZIPFILE9P **PYYZ_UNZIP8P%%PPAGE7PPONE_LINE6PPTIMES5PPTOTALS4PPHEADER3PPVERBOSE2PPLONG1PPMEDIUM0PPSHORT/PPZIPINFO.P PTRAVERSE_DIRS-PPODS2,PPEXCLUDE+PPCOMMENT8*P PDOT_VERSION)PPRESTORE.DATE.FILES(PPRESTORE.DATE.ALL'P {{PRESTORE.DATE&PhhPRESTORE.OWNER_PROT%P``PRESTORE$PXXPVERSION#PPPPUPDATE"P FFPUPPERCASE!P <<PTIMESTAMP P22PPASSWORDP--PPIPEP((PTESTP PQUIET.SUPERPPQUIETP   POVERWRITEPv/5 UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_DECC_OLB;1lJ89PEXISTING.NOEXTRACTPPEXISTING.OVERWRITEPPEXISTING.NEW_VERSIONPPEXISTINGPPFULL.DIAGNOSTICSPPFULLPPBRIEFPPLISTP PLOWERCASEPPJUNKPPHELPPPFRESHENP ||PDIRECTORY PuuPSCREEN PddPCASE_INSENSITIVE P XXPBINARY.NONE P LLPBINARY.AL:L P @@PBINARY.AUTOP99PBINARYP ..PTEXT.STMLFP $$PTEXT.NONE . CLI_TRAVERSE /CLI_INFORMATION 0 CLI_SHORT 1 CLI_MEDIUM 2CLI_LONG 3 CLI_VERBOSE 4 CLI_HEADER 5 CLI_TOTALS 6 CLI_TIMES 7 CLI_ONE_LINE 8CLI_PAGE 9CLI_YYZ : CLI_ZIPFILE ; CLI_INFILE < UNZIP_COMMANDUNZIPSFXBANNER VMS_UNZIP_CLDGDECC$GA___CTYPE CLI$GET_VALUE; CLI$PRESENT CLI$DCL_PARSESTR$FIND_FIRST_SUBSTRING STR$CONCATPPTEXT.ALLP PTEXT.AUTOP  PTEXTP__iscntrlPլRDECC$GA___CTYPEQˏP@aPˏPRRP^9 ʏP1LIB$GET_FOREIGN vPl CLI$PRESENTScPocPoocPncP nPPo  CLI$PRESENTP  CLI$GET_VALUE CLI$PRESENTScPpcʏPqcʏPq CLI$PRESENTScP-Pt!cʏPT*cP-PY-cP-PTRT2b.cP-P:cP-P?L"cP-PU#cP-Pu$cP-PV&cP*P-P%cP-X+ CLI$PRESENTP-Pz  CLI$PRESENTScP-PC8cP-PM,cʏPRPRRVRRTSSeCUSRR9R DECC$REALLOCPR R DECC$FREE<$W17E DECC$STRCPY; modifiers are -abjnoqCL%sV%s.  PUnZipSFX %d.%d%d%s of %s, by Info-ZIP (http://www.info-zip.org). Pcaution: both -n and -o specified; ignoring -o Perror: -fn or anyT combination of -c, -l, -p, -t, -u and -v options invalid xPerror: -d option used more than once (only one exdir allowed) 0Perror: must specify directory to which to extract with -d option  Pcaution: not extracting; -d ignored  P (please check that you have transferred or created the zipfile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) Pcaution: excluded filename not matched: %s Pcaution: filename not matched: %s Perror [%s]: attUempt to seek before beginning of zipfile %sPerror: expected central file header signature not found (file #%lu). P20 April 2009P??P__iscntrlP ^DECC$MAIN_ARGSS ^SR GLOBALSCTORݬݬUNZIPP RETURN_VMSS R DECC$EXITRP^HANDLERSS DECC$SIGNALRbSbSbS bSbS bмG3мG3߬߬VMS_UNZIP_CMDLINEPSˏSR SW12PVG3߬߬UZ_OPTSPRլR RW1 PЬG3G3լ1|USG3ЬG3Sc1PG1ec DECC$STRNCMPP1RSRRTcGUcG3SRRG3UVcG3SRRG3GRbRFSc cG6PϐG@3 DECC$DSPRINTF<~PG@3GG}3P` W1T1գ SG3ìG3RRRG31G3FNAMESG3G31qPVkmxmi nk d~LB;1_Z]T0#AXB 9] zUYH6wS50IC:z XHK^h%R#Jzi4NeQv&| (Ig4HxV?JKP\D JɸRɦJGuYc )7[8 KiD/P~Ip$l4(ϥp#x: puET" k9d+JԑKy"i7*Ua]GP3YTQv}P2/|HKнJXL V$CEEQ@EtN'oaRPŧPVI M@nZrYyKc [HD_!F!FUS4膟y{A[-[Q !`;\fPQIIREC3NA T/O"e%f 7PRC#JB->fBn JEqCidxKLRBN@TT P)A Y!EDk}COzXBMqeBmaRC.[LzT:BL]C-B#z nRDVAVƩSuAnZMy"+UhOnCHg@1e`Bд BUZ"r[ P-eP`[  1VB%bjXZ@r_VF5=W IGK:g$hP"0 BL)WjLR46R! C_NX , CL[LGG 3'#CLCQEI'_GA`IKNDGMI_EjERg@+]L]}O$KNvPIfFI< 1 86)#`LCL٥NN\Nh"(0(/ ~n&sOdLUlrkC |$w[}D;JLyoKN^C)S 5udk @Ft[]ID sV+Ox%1"a#KDg`PS/ZS vJMFF`pGnH \uH9foct_gNLT_ʬgˌ rMptfYHÃ}(+,HMn S|+JirG˂#WEq( ;K^^;vCφ>cx~4__V0tl7&#s5j.CS:_,w` i-~:citb1/:56 9SE@M b1*zKA 6:UK@G iMȂP ;q={drbĐkUUw ugy|m}ϺVϢDk5̭Η -e5i󹍜ADʥ]\XgoX uI VQG?˯bym9JԢp__"xKpBY$Iq",c5*pP(o1'_?kU! ԺՁ ni=PkS3C1rN7Y}Rv<[p[SR'uVDQN sBW5qV8;[X G: WJ'@FɔQP|Lxg2Q~)KDD@P2q*M0`?I~uf׳#0;EwnNRJĞgqꎣ+㖙+OxnJsUj'MF[31+ƎTzQ k>W8Yyb6F2pH!( QRe4MHaZl g[/VUB؞fj^^6DsNE9B03 7ֿKXܦ=ϊ 3#!Sd׫gt UUCz:ăK1kzm"}5JYVŃI =ɾQݸL5 pSYC= m'> aG. ew Y|D 7)(3gb'@thoi K8  eUH}!aQQ\rh1-ypKW7KY氈M>8䅫pt^`H'M6ɽwLyTIa;OZCEX@-O@Rѐb 2bցzl6"ЌS(/I@9/"l[ztbt,V,\IˆWQ3VuvbLzU=L٥ %eHj*B#K XR..p PA\GN) HyHb*"g#jUO1g?%)ZNnw5n6z*R_#A&XNtE5&MD)9|VCAҏSIJb욺d>pV3֫YG&Ba|Ҫ.d m32?˴O ]".=-6yq}o`>2!x|sC4u^V0۪>/u0M l:H07C7"-c{S|7rYsGfA+>K=w8qq|iσ "alrЊ23Y+ z,KK60 W7ԑUMt310ܤ'"#H[gZCoC/,'RYRDQ^ P"H!a)\3V#ڨ"<%QUhz+:X$ @XxO (#w^9?\W.0ֻvXH4XJYSPBS<5ST~l=_gQ[T^ B vYN "ғ.ϛ ,'"_n{/GLB>ufQ;ݚ\ yX>Fn# TcFYDsj]O`I% pL7|HoDEV8=`ÞxPIBn*HQﳡP)VьsQ_dU",>]FT5|8`c"WF!F>V ƎFڢA}H'$d: B]-޼ͻ:V\V+OIM"Qu;=@^FSB@ZlR_Hcr@LXGDFnQkRX0 $6ݐ' PAML&  @@`@DnQ4EAR YVa&PRCS 9PO-PS Q 6E Izf88b&DdANrM$pMHe_V憎s̓A%:*߄_Y߼FRKNC7UYJTA_^G+Չ՞D2aL U( uQ[Z Jw 'FE"+ 0#ٿņE -Em ANcVkk̀UTRAwCȑ+ٌbM{ǁP }%rwRU 7YjMZ5: @UaC+H_+{2QM!kuUнlK cKqXJKnYb0Dl@0 `W :I,Ԥ_.fuS@NR÷QZv}۔pCv C &(%E_ AI^OՎـ3]g͔]lV:ݽԬ^MpLN\]J@ ^$^[WSJ^Rtj~RsWc缮l=wETQ@EC$W H8͏ZB^!`R;0oDڈR(A@`=Ш5M JQVCEBLOCиmꑏRVR DivE<5;6P%/" DGY{X}Tcl0<u݇`ȜBz&EC}\]'B߆i  _L{' SU6TΏ߮?DAM h ~ _3_8!DJE )1a čg?"\=*7uB"MP p@C\[`)lB&S R vV4zG]/|8X A֛bĒE tLCd{q4_ޜێT,}RBU,QRM>DQ۠7 U1SyڊH<0f<=f86,z"I[(Q&mAHS-ӟWx=+pF6#I:"zٔBh?7 k6X51~N]A GfF@‚/~` mbsAN ރ``W|7Ćdzΰut.?\B%tMKSd:lz׊wc bjnzACZ᷏f@SA=߄zͮʪ1k|%j2-*9V(xѳiҽ(gr ̶P:P&I1X+:/Z;$![tGoFBSU-%!TSx Ő⊆jpN9`\8 s3i:%O}N3˩.fl0|`d).9_!0~xn5rMcE@2>W:du\gq'G(=2.Nvpx?`&Z5"7dZ4% J-`;}'/:awY}z]d,_tSm6%hŵZsތ2yIhx{8;%a ]nZ\_ ]B@|-t&0,hH-)JDbS?"|A}w.OI@({yPi_m'eeJZTVr6!Z#:J))Q 9C* 4znIpcjk'D ^wgd*< nnֺ77[o* #PtyH4#uN ]ވK'dX.ij=+vi"ЉFHMQLRbK{QJGfށrEcG qGSu-z{ޛx+}Qn?Lvp< pYLq VhR?qGHo۩ ci ;z,l>`{\73E%$|\nlm]%ADJBGf4sޫ~(Lc3SMX"?:)?y>;gQD/QAG+(H,@Q%(mJNYeB&Iަj6{Tw:M6Sh>@] 8kO8aO9!\f2N׏pYSqW~x+3n5%_4'Lf%cwrz=iLm JڜZN7pD_ʺ='Am7sXKYpɌA?A]Dr/?[%9A W5PWO0a)_L"NQf`UsG5TOr;G1WrKFqF rP)L_FEfE %W[ǿ>}~V/ǹ?Oe:USM05[itWz5p(1p!BL8nIITwR]DU@FC2MmcyG+sW %@TinXF`ybX UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_DECC_OLB;1lVWc DECC$STRCMPPWVSG3FNAMESG3G3UcG3SRRG3USG3ì  MASK_BITS  VERSIONDATE  CENTSIGMSG SEEKMSG FILENAMENOTMATCHED EXCLFILENAMENOTMATCHED REPORTMSG UNZIPSFXBANNERFNAMESG DECC$EXIT VMSCLI_USAGEVMS_UNZIP_CMDLINE RETURN_VMSHANDLERPROCESS_ZIPFILESUZ_OPTSUNZIP GLOBALSCTOR DECC$SIGNAL DECC$STRNCMPX DECC$STRCMP DECC$ISATTY DECC$DSPRINTF  __MAIN  MAIN HUNZIPG3RRRG3USc1G3G6G3.WG@3 DECC$DSPRINTF<~PG@3GG}3P`PROCESS_ZIPFILESPWWRRPP^YRXмWTW1dS1cSS-1PdSU1UPP-MP1P"?PR1PR RG 3P PG 3G 3R1G 31PR RG3P PG3GY3R1G 3G3G 31R G3R1pG31ePR G3R1TG31IPR4ϜG@3 DECC$DSPRINTF<~PG@3GG}3P` V1G4ϨG@3 DECC$DSPRINTF<~PG@3GG}3P` V1SGSP`P1WQWTdGdP`PP-nG@3 DECC$DSPRINTF<~PG@3GG}3P` V1GP6PG@3 DECC$DSPRINTF<~PG@3GZG}3P` V1 cP1/ScP1%PScP1PR RG3P PG3G3R1G31P1RGL3G 3R1PGL3G 31PX1X1PR G(3R1G(31PR RG03P PG03G03R1hG031^PR Gt3R1LGt31APR G43R10G431%PR RG83P PG83G83R1G831PR,G3[G<3P PG<3 PG<3R1G3G<31PR RG<3P PG<3G<3R1G<31~PR G@3R1lG@31aPR GD3R1PGD31EPR GL3R14GL31)PR G03R1G031PR GX3R1GX31PdSPP1cP1W1PP-11R RG`3P PG`3G`3R1G`31PR Gd3R1Gd\3zPR RGh3P PGh3Gh3RUPGh3KR Gl3R=PGl32PR RGp3P PGp3Gp3R PGp3YU1QTWdP `PP-1.X VMSCLI_USAGEPV1PG3GD3(GL3 GD3GL3G 39G431pG@3 DECC$DSPRINTF<~PG@3GG}3P`YG 3G 3G3G3G 3]G@3G83<G434NG@3 DECC$DSPRINTF<~PG@3GG}3P`G83Gt3 DECC$ISATTYPGt3YWTY VMSCLI_USAGEPV1PG<3Gm|~ G@3 DECC$DSPRINTFYRRRPG@3GG}3P`G3GD3GT3Gh3G3G3WTVVPP ^|~ G@3 DECC$DSPRINTFЬS^RPRRPG@3GG}3P`Ϫϣ*G@3 DECC$DSPRINTFSRPRRPG@3R UNZIP mainG Hunzipuz_opts  usage 7PX@ 8:/  _ 9    .     {9  y9 b , UZ_OPTS USAGEDECC$MAIN_ARGSK $CODE$DATA $ADDRESS_DATAD MASK_BITS VERSIONDATEG CENTSIGMSG<SEEKMSG$FILENAMENOTMATCHED-EXCLFILENAMENOTMATCHED REPORTMSGBUNZIPSFXBANNERGG}3P`S PP7PQm9A!u U]y=Y%ww.*[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_VAXC_OLB;1+,.Z/ 4ZZ-s0123 KPWOZ56ω 74ى 89GHJ% VAX-11 Librarian V04-00pKm=n%z !YZ/2 EEp  pOMAINOUNZIPOUSAGEOUZ_OPTS3 VMSCLI_USAGEF VMS_UNZIP_CLD3VMS_UNZIP_CMDLINE.3CMDLINEOUNZIPF VMS_UNZIP_CLDzx UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_VAXC_OLB;1Z2 {㞹 UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_VAXC_OLB;1ZL !"#|nTI UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_VAXC_OLB;1Z#$%&'()*+,-./012}}_Nt UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_VAXC_OLB;1Z>241A{KmV1.04CMDLINEV1.029-APR-2008 10:36VAX C V3.2-044PPTEXTPP PTEXT.AUTOPPPTEXT.ALLPP PTEXT.NONEPP "PTEXT.STMLFP"P-PBINARYP- P 4PBINARY.AUTO P4!P @PBINARY.ALL!P@"P KPBINARY.NONE"PK#PWPCASE_INSENSITIVE#PW$PhPSCREEN$Ph%P oPDIRECTORY%Po&P5yPFRESHEN&Py'PPHELP'P(PPJUNK(P)P PLOWERCASE)P*PPLIST*P+PPBRIEF+P,PPFULL,P-PPFULL.DIAGNOSTICS-P.PPEXISTING.P/PPEXISTING.NEW_VERSION/P0PPEXISTING.OVERWRITE0P1PPEXISTING.NOEXTRACT1P2P POVERWRITE2P3PPQUIET3P4P  PQUIET.SUPER4P 5P6PTEST5P6PPPIPE6P7P PPASSWORD7P 8P )PTIMESTAMP8P)9P 3PUPPERCASE9P3:P=PUPDATE:P=;PDPVERSION;PD<PLPRESTORE<PL=PTPRESTORE.OWNER_PROT=PT>P gPRESTORE.DATE>Pg?PtPRESTORE.DATE.ALL?Pt@PPRESTORE.DATE.FILES@PAP PDOT_VERSIONAPBPPCOMMENTBPCPPEXCLUDECPDP7PODS2DPEP PTRAVERSE_DIRSEPFPPZIPINFOFPGPPSHORTGPHPPMEDIUMHPIPPLONGIPJPPVERBOSEJPKPPHEADERKPLPPTOTALSLPMPPTIMESMPNPPONE_LINENPOPPPAGEOPPP  PYYZ_UNZIPPP QPPZIPFILEQPRPPINFILERPSP$Punzip SP$+Punzip1P-P48P-d7P-x;P20 April 2009IPValid main options are /TEST, /FRESHEN, /UPDATE, /PIPE, /SCREEN, /COMMENT%s. P and /DI CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS VMS_UNZIP_CLD CLI$GET_VALUE CLI$PRESENT CLI$DCL_PARSESTR$FIND_FIRST_SUBSTRING STR$CONCATLIB$SIG_TO_RET LIB$GET_IN9PUTLIB$GET_FOREIGN LIB$ESTABLISHUSAGEREALLOCMALLOCFREECALLOCSTRLENSTRNCPYRECTORY=exdir-specPModifying options are /TEXT, /BINARY, /JUNK, /EXISTING, /QUIET, /CASE_INSENSITIVE, /LOWERCASE, %s/VERSION, /RESTORE. QP/PAGE, P|^VP PRP}LIB$GET_FOREIGN CLI$PRESENTPRRK---DRS#? CLI$PRESENTPRRSPSS DS& CLI$PRESENTUePRR-Rf'ePRPh(ePRR-Rj*ePRP),ePv-eP vPl/ CLI$PRESENTUePRRo0ePRRo<o1ePRRn2ePRR nPRo7 CLI$PRESENTPRR7 CLI$GET_VALUEPR6 CLI$PRESENTUePRRp3ePRPq4ePRRq5 CLI$PRESENTUePRR-Rt8ePRPTAePRR-RYDePRR-R2EePRR-R:)ePRR-RL9ePRR-RU:ePRR-R=u;ePRR-RV=ePRR.R-<ePRRPP-XB CLI$PRESENTPRR-Rz# CLI$PRESENTUePRR-RCOePRR-RMCePRˏRSUSUPPTSSWCЭTSSѭ2ЭSݭݭREALLOCPS SFREE<$PDSTRCPY~TDSTRNCPYSCQ CLI$PRESENTPRPyQ CLI$GET_VALUEPRЭT CLI$GET_VALUEPRR1X2P^LIB$SIG_TO_RET LIB$ESTABLISH CLI$PRESENT^SR ݬUSAGEЬWUPUUVV;:|~T@SPRINTFTdP@b}P`V×I@dP@b}P`VQ@dP@b}P`W PPww A{Km GOATHUNTER CMDLINE&ҜKm GOATHUNTER VMS_UNZIP_CLDb%z  GOATHUNTER UNZIPG1ҜKm03-003+ VMS_UNZIP_CLD03-00329-APR-2008 10:36-VAX/VMS Command Definition Utility (V4-001) VMS_UNZIP_CLDH CLI$TABLESP H UNZI ,(Tl UNZIP4!)P1ZIPFILEZip file8a!(P2INFILEFiles to UnZip( BINARY$c ( TEXT(4HSCREEN(\ DIRECTORY(FRESHEN$HELP$JUNK$LIST$ BRIEF$8 FULL(`< EXISTING(  OVERWRITE$ QUIET$TEST$PIPE(PASSWORD(ID TIMESTAMP,p TRAVERSE_DIRS( UPPERCASE(UPDATE(VERSION(cRESTORE(8COMMENT(a`EXCLUDE0CASE_INSENSITIVE( LOWERCASE$PAGE, DOT_VERSION$,JODS2(T YYZ_UNZIP(|ZIPINFO,` INFORMATION4!)P1ZIPFILEZip file<a!(P2INFILEFiles to display(@ZIPINFO(hONE_LINE$SHORT(MEDIUM$LONG(VERBOSE((KHEADER(PCOMMENT(x TOTALS$ TIMES(a EXCLUDE0 CASE_INSENSITIVE$ PAGE$<RESTORE_KEYWORDS$`DATE, OWNER_PROT$RESTOREDATE_KEYS$FILES$ALL L QUIET_MODIFIER$SUPER$` EXISTING_KEYWORDS,  NEW_VERSION(  OVERWRITE( NOEXTRACT   FULL_MODIFIER, DIAGNOSTICS$L CONVTXT_KEYWORDS$p AUTO$ ALL$ NONE$STMLF$ CONVBIN_KMEYWORDS$$ AUTO$H ALL$NONEL  4 ` , d (X    4   $ p D T $ p  `  ` 8  <N     << T H `t    `  <<  <<8Hp L hxL   p    J  0< T wwP1=n%z V1.02UNZIPV1.029-APR-2008 10:35VAX C V3.2-044P??P20 April 2009Perror: expected central file header signature not found (file #%lu). Perror [%s]: attempt to seek before beginning of zipfile %sPcaution: filename not matched: %s Pcaution: excluded filename not matched: %s P (please check that you have transferred or created the zipfM UNZIP.BCKs.[UNZIP60.VMS-BINARIES]UNZSFXCLI.VAX_VAXC_OLB;1Z>MPQile in the appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles) Pcaution: not extracting; -d ignored &Perror: must specify directory to which to extract with -d option iPerror: -d option used more than once (only one exdir allowed) Perror: -fn or any combination of -c, -l, -p, -t, -u and -v options invalid Pcaution: both -n and -o specified; ignoring -o PUnZipSFX %d.%d%d%s of %s, by Info-ZIP (http://www.info-zip.org). 'PValid options are -tfuRpcz and -d ; modifiers are -abjnoqCL%sV%s. P-dP-xPDM PX. (Must quote upper-case options, like "-V", unless SET PROC/PARSE=EXTEND.)P^ C$MAIN_ARGS GLOBALSCTORݬݬUNZIPP RETURN_VMSP^VYRXHANDLERTTSIGNALScTcT cTcT cмм߬߬VMS_UNZIP_CMDLINEPSPSZ1Ԣ߬߬UZ_OPTSլPPZ1ЬŒլ1ZUWP”Ь¸PSc1Ab1fcSTRNCMPP1STSTcbUc¸SQQŒUWc¼SQQbP`?Sccb3P<~ߨ&@SPRINTFP@b}P` Z1T1գS¸ì¸PPPŒrP”i¸ŒqW[ߦcSTRCMPPHWS¸i¸ŒPUc¸SQQŒUS¼ì¼PPPPUSc1”b. (<~h@SPRINTFP@b}P`PROCESS_ZIPFILESPZZPP^[RUZSYмWVWX1fT1d-1PfPPQPTaW1WPP-M{P1TPz?PS1PSS PPQQQ S1֢ 1PSSPPQQQS1բ ֢Ԣ 1yPSԢS1k1dSԢS1W1PS-<~ߥ&@SPRINTFP@b}P` Pb-<~ߥi@SPRINTFP@b}P` PTbTP`oX=XVfbbP`-Z<~ߥ&@SPRINTFP@b}P` P<~ߥ&@SPRINTFP@b}P` Pd1mTd1dTd1ZPSSPPQQQS1<֢15P10S ԢLԢ S1 L 1Y1 Y1PSU(S1(1SS0PPQQQ0S1֢01PSԢtS1t1SԢ4S141SS8PPQQQ8S1֢81PS ԢPSԢlS0l)PSSpPPQQQpS PV֢pPZW1uVX fP`-1MY VMSCLI_USAGEբ բDբLբDբL բ 2բ4-<~ũ@SPRINTFP@b}ScZѢ  Ѣբ Ԣ@բ82բ4-<~@SPRINTFP@b}ScԢ8բtISATTYPԢtZXVZ VMSCLI_USAGEѢ<DZTPTT~߫|~@SPRINTFP@b}ScբբD բTբh  XVP|^TRUЬVSPSS~ߤ|~@SPWRINTFP@b}P`VSPSS~ߤ ߤ'@SPRINTFP@b}P`V PPPuuuu=uuuuuuuQuuuuuuuu!uuuuuuuuuR UNZIP main, ,unzipM|uz_optsL usage Q$ _X@1 X׆  -    C. CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKYEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFS GLOBALSCTOR VMSCLI_USAGEVMS_UNZIP_CMDLINE RETURN_VMSHANDLERPROCESS_ZIPFILESUZ_OPTSUNZIPSIGNALSTRNCMPSTRCMPISATTYSPRINTF MAIN ,UNZIP |UZ_OPTS |USAGE C$MAIN_ARGSo $CODEp$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO LOCAL_HDR_SIGCENTRAL_HDR_SIGEND_CENTRAL_SIGEND_CENTRAL32_SIGEND_CENTRAL64_SIGEND_CENTLOC64_SIGGD MASK_BITSFNAMESOEM2ISO OEM2ISO_850 VERSIONDATEG CENTSIGMSG<SEEKMSG$FILENAMENOTMATCHED-EXCLFILENAMENOTMATCHED REPORTMSGBUNZIPSFXBANNERX$CHAR_STRING_CONSTANTSYuuuQuuuuuuuuu)EIueuuuuu-uueyuuuww#*[UNZIP60.VMS-BINARIES]VAXCRTL.OPT;1+,./ 4-s0123KPWO56<7a89GHJsys$share:vaxcrtl.exe/share*[UNZIP60]VMS.DIR;1+,W./ 4->0123 KPWO56n7K 89GHJIBUILD_UNZIP.COM`BZLIB.HaX CMDLINE.CbCCOLLECT_DEPS.COMdg CONTENTS.Z CVTHELP.TPUc DESCRIP.MMSfDESCRIP_DEPS.MMSgDESCRIP_MKDEPS.MMShDESCRIP_SRC.MMSiFIND_BZIP2_LIB.COMjHLP_LIB_NEXT.COMk INFBACK9.Hr INSTALL.VMS[% MAKESFX.COMmd MOD_DEP.COMn1 NOTES.TXT\.README.] UNIXIO_GCC.Hoy UNIXLIB_GCC.Hq UNZIP.OPT UNZIPSFX.HLPS UNZIPSFX.OPToUNZIP_CLI.HELP UNZIP_DEF.RNH UNZIP_MSG.MSG^ UNZ_CLI.CLDrVMS.CVMS.Hb VMSCFG.Hr9 UNZIP.BCKW>[UNZIP60]VMS.DIR;1IES]UNZIP.IA64_OLB;1g VMSDEFS.H]ZLIB.H*[UNZIP60.VMS]BUILD_UNZIP.COM;1+,`../ 4..@-W0123KPWO/56vڎ}7vڎ}89GHJ$! BUILD_UNZIP.COM $! $! Build procedure for VMS versions of UnZip/ZipInfo and UnZipSFX. $! $! Last revised: 2009-03-01 SMS. $! $! Command arguments: $! - suppress help file processing: "NOHELP" $! - suppress message file processing: "NOMSG" $! - select link-only: "LINK" $! - select compiler environment: "VAXC", "DECC", "GNUC" $! - select BZIP2 support: "USEBZ2" $! This option is a shortcut for "IZ_BZIP2=SYS$DISK:[.bzip2]", and $! runs the DCL build procedure there, $! - select BZIP2 support: "IZ_BZIP2=dev:[dir]", where "dev:[dir]" $! (or a suitable logical name) tells where to find "bzlib.h". $! The BZIP2 object library (LIBBZ2_NS.OLB) is expected to be in $! a "[.dest]" directory under that one ("dev:[dir.ALPHAL]", for $! example), or in that directory itself. $! By default, the SFX programs are built without BZIP2 support. $! Add "BZIP2_SFX=1" to the LOCAL_UNZIP C macros to enable it. $! (See LOCAL_UNZIP, below.) $! - use ZLIB compression library: "IZ_ZLIB=dev:[dir]", where $! "dev:[dir]" (or a suitable logical name) tells where to find $! "zlib.h". The ZLIB object library (LIBZ.OLB) is expected to be $! in a "[.dest]" directory under that one ("dev:[dir.ALPHAL]", $! for example), or in that directory itself. $! - select large-file support: "LARGE" $! - select compiler listings: "LIST" Note that the whole argument $! is added to the compiler command, so more elaborate options $! like "LIST/SHOW=ALL" (quoted or space-free) may be specified. $! - supply additional compiler options: "CCOPTS=xxx" Allows the $! user to add compiler command options like /ARCHITECTURE or $! /[NO]OPTIMIZE. For example, CCOPTS=/ARCH=HOST/OPTI=TUNE=HOST $! or CCOPTS=/DEBUG/NOOPTI. These options must be quoted or $! space-free. $! - supply additional linker options: "LINKOPTS=xxx" Allows the $! user to add linker command options like /DEBUG or /MAP. For $! example: LINKOPTS=/DEBUG or LINKOPTS=/MAP/CROSS. These options $! must be quoted or space-free. Default is $! LINKOPTS=/NOTRACEBACK, but if the user specifies a LINKOPTS $! string, /NOTRACEBACK will not be included unless specified by $! the user. $! - select installation of CLI interface version of UnZip: $! "VMSCLI" or "CLI" $! - force installation of UNIX interface version of UnZip $! (override LOCAL_UNZIP environment): "NOVMSCLI" or "NOCLI" $! $! To specify additional options, define the symbol LOCAL_UNZIP $! as a comma-separated list of the C macros to be defined, and $! then run BUILD_UNZIP.COM. For example: $! $! $ LOCAL_UNZIP = "RETURN_CODES" $! $ @ [.VMS]BUILD_UNZIP.COM $! $! VMS-specific options include VMSWILD and RETURN_CODES. See the $! INSTALL file for other options (for example, CHECK_VERSIONS). $! $! If you edit this procedure to set LOCAL_UNZIP here, be sure to $! use only one "=", to avoid affecting other procedures. $! $! Note: This command procedure always generates both the "default" $! UnZip having the UNIX style command interface and the "VMSCLI" $! UnZip having the CLI compatible command interface. There is no $! need to add "VMSCLI" to the LOCAL_UNZIP symbol. (The only effect $! of "VMSCLI" now is the selection of the CLI style UnZip $! executable in the foreign command definition.) $! $! $ on error then goto error $ on control_y then goto error $ OLD_VERIFY = f$verify( 0) $! $ edit := edit ! override customized edit commands $ say := write sys$output $! $!##################### Read settings from environment ######################## $! $ if (f$type( LOCAL_UNZIP) .eqs. "") $ then $ LOCAL_UNZIP = "" $ else ! Trim blanks and append comma if missing $ LOCAL_UNZIP = f$edit( LOCAL_UNZIP, "TRIM") $ if (f$extract( (f$length( LOCAL_UNZIP)- 1), 1, LOCAL_UNZIP) .nes. ",") $ then $ LOCAL_UNZIP = LOCAL_UNZIP + ", " $ endif $ endif $! $! Check for the presence of "VMSCLI" in LOCAL_UNZIP. If yes, we will $! define the foreign command for "unzip" to use the executable $! containing the CLI interface. $! $ pos_cli = f$locate( "VMSCLI", LOCAL_UNZIP) $ len_local_unzip = f$length( LOCAL_UNZIP) $ if (pos_cli .ne. len_local_unzip) $ then $ CLI_IS_DEFAULT = 1 $ ! Remove "VMSCLI" macro from LOCAL_UNZIP. The UnZip executable $ ! including the CLI interface is now created unconditionally. $ LOCAL_UNZIP = f$extract( 0, pos_cli, LOCAL_UNZIP)+ - f$extract( pos_cli+7, len_local_unzip- (pos_cli+ 7), LOCAL_UNZIP) $ else $ CLI_IS_DEFAULT = 0 $ endif $ delete /symbol /local pos_cli $ delete /symbol /local len_local_unzip $! $!##################### Customizing section ############################# $! $ unzx_unx = "UNZIP" $ unzx_cli = "UNZIP_CLI" $ unzsfx_unx = "UNZIPSFX" $ unzsfx_cli = "UNZIPSFX_CLI" $! $ CCOPTS = "" $ IZ_BZIP2 = "" $ BUILD_BZIP2 = 0 $ IZ_ZLIB = "" $ LINKOPTS = "/notraceback" $ LINK_ONLY = 0 $ LISTING = " /nolist" $ LARGE_FILE = 0 $ MAKE_HELP = 1 $ MAKE_MSG = 1 $ MAY_USE_DECC = 1 $ MAY_USE_GNUC = 0 $! $! Process command line parameters requesting optional features. $! $ arg_cnt = 1 $ argloop: $ current_arg_name = "P''arg_cnt'" $ curr_arg = f$edit( 'current_arg_name', "UPCASE") $ if (curr_arg .eqs. "") then goto argloop_out $! $ if (f$extract( 0, 5, curr_arg) .eqs. "CCOPT") $ then $ opts = f$edit( curr_arg, "COLLAPSE") $ eq = f$locate( "=", opts) $ CCOPTS = f$extract( (eq+ 1), 1000, opts) $ goto argloop_end $ endif $! $ if (f$extract( 0, 7, curr_arg) .eqs. "IZ_BZIP") $ then $ opts = f$edit( curr_arg, "COLLAPSE") $ eq = f$locate( "=", opts) $ IZ_BZIP2 = f$extract( (eq+ 1), 1000, opts) $ goto argloop_end $ endif $! $ if (f$extract( 0, 6, curr_arg) .eqs. "USEBZ2") $ then $ if (IZ_BZIP2 .eqs. "") $ then $ IZ_BZIP2 = "SYS$DISK:[.BZIP2]" $ BUILD_BZIP2 = 1 $ endif $ goto argloop_end $ endif $! $ if (f$extract( 0, 7, curr_arg) .eqs. "IZ_ZLIB") $ then $ opts = f$edit( curr_arg, "COLLAPSE") $ eq = f$locate( "=", opts) $ IZ_ZLIB = f$extract( (eq+ 1), 1000, opts) $ goto argloop_end $ endif $! $ if (f$extract( 0, 5, curr_arg) .eqs. "LARGE") $ then $ LARGE_FILE = 1 $ goto argloop_end $ endif $! $ if (f$extract( 0, 7, curr_arg) .eqs. "LINKOPT") $ then $ opts = f$edit( curr_arg,f e UNZIP.BCK`W[UNZIP60.VMS]BUILD_UNZIP.COM;164_OLB;1. "COLLAPSE") $ eq = f$locate( "=", opts) $ LINKOPTS = f$extract( (eq+ 1), 1000, opts) $ goto argloop_end $ endif $! $! Note: LINK test must follow LINKOPTS test. $! $ if (f$extract( 0, 4, curr_arg) .eqs. "LINK") $ then $ LINK_ONLY = 1 $ goto argloop_end $ endif $! $ if (f$extract( 0, 4, curr_arg) .eqs. "LIST") $ then $ LISTING = "/''curr_arg'" ! But see below for mods. $ goto argloop_end $ endif $! $ if (curr_arg .eqs. "NOHELP") $ then $ MAKE_HELP = 0 $ goto argloop_end $ endif $! $ if (curr_arg .eqs. "NOMSG") $ then $ MAKE_MSG = 0 $ goto argloop_end $ endif $! $ if (curr_arg .eqs. "VAXC") $ then $ MAY_USE_DECC = 0 $ MAY_USE_GNUC = 0 $ goto argloop_end $ endif $! $ if (curr_arg .eqs. "DECC") $ then $ MAY_USE_DECC = 1 $ MAY_USE_GNUC = 0 $ goto argloop_end $ endif $! $ if (curr_arg .eqs. "GNUC") $ then $ MAY_USE_DECC = 0 $ MAY_USE_GNUC = 1 $ goto argloop_end $ endif $! $ if ((curr_arg .eqs. "VMSCLI") .or. (curr_arg .eqs. "CLI")) $ then $ CLI_IS_DEFAULT = 1 $ goto argloop_end $ endif $! $ if ((curr_arg .eqs. "NOVMSCLI") .or. (curr_arg .eqs. "NOCLI")) $ then $ CLI_IS_DEFAULT = 0 $ goto argloop_end $ endif $! $ say "Unrecognized command-line option: ''curr_arg'" $ goto error $! $ argloop_end: $ arg_cnt = arg_cnt + 1 $ goto argloop $ argloop_out: $! $ if (CLI_IS_DEFAULT) $ then $ UNZEXEC = unzx_cli $ else $ UNZEXEC = unzx_unx $ endif $! $!####################################################################### $! $! Find out current disk, directory, compiler and options $! $ workdir = f$environment( "default") $ here = f$parse( workdir, , , "device")+ f$parse( workdir, , , "directory") $! $! Sense the host architecture (Alpha, Itanium, or VAX). $! $ if (f$getsyi( "HW_MODEL") .lt. 1024) $ then $ arch = "VAX" $ else $ if (f$getsyi( "ARCH_TYPE") .eq. 2) $ then $ arch = "ALPHA" $ else $ if (f$getsyi( "ARCH_TYPE") .eq. 3) $ then $ arch = "IA64" $ else $ arch = "unknown_arch" $ endif $ endif $ endif $! $ dest = arch $ cmpl = "DEC/Compaq/HP C" $ opts = "" $ if (arch .nes. "VAX") $ then $ HAVE_DECC_VAX = 0 $ USE_DECC_VAX = 0 $! $ if (MAY_USE_GNUC) $ then $ say "GNU C is not supported for ''arch'." $ say "You must use DEC/Compaq/HP C to build UnZip." $ goto error $ endif $! $ if (.not. MAY_USE_DECC) $ then $ say "VAX C is not supported for ''arch'." $ say "You must use DEC/Compaq/HP C to build UnZip." $ goto error $ endif $! $ cc = "cc /standard = relax /prefix = all /ansi" $ defs = "''LOCAL_UNZIP'MODERN" $ if (LARGE_FILE .ne. 0) $ then $ defs = "LARGE_FILE_SUPPORT, ''defs'" $ endif $ else $ if (LARGE_FILE .ne. 0) $ then $ say "LARGE_FILE_SUPPORT is not available on VAX." $ LARGE_FILE = 0 $ endif $ HAVE_DECC_VAX = (f$search( "SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") $ HAVE_VAXC_VAX = (f$search( "SYS$SYSTEM:VAXC.EXE") .nes. "") $ MAY_HAVE_GNUC = (f$trnlnm( "GNU_CC") .nes. "") $ if (HAVE_DECC_VAX .and. MAY_USE_DECC) $ then $ ! We use DECC: $ USE_DECC_VAX = 1 $ cc = "cc /decc /prefix = all" $ defs = "''LOCAL_UNZIP'MODERN" $ else $ ! We use VAXC (or GNU C): $ USE_DECC_VAX = 0 $ defs = "''LOCAL_UNZIP'VMS" $ if ((.not. HAVE_VAXC_VAX .and. MAY_HAVE_GNUC) .or. MAY_USE_GNUC) $ then $ cc = "gcc" $ dest = "''dest'G" $ cmpl = "GNU C" $ opts = "GNU_CC:[000000]GCCLIB.OLB /LIBRARY," $ else $ if (HAVE_DECC_VAX) $ then $ cc = "cc /vaxc" $ else $ cc = "cc" $ endif $ dest = "''dest'V" $ cmpl = "VAX C" $ endif $ opts = "''opts' SYS$DISK:[.''dest']VAXCSHR.OPT /OPTIONS," $ endif $ endif $! $ if (IZ_BZIP2 .nes. "") $ then $ defs = "USE_BZIP2, ''defs'" $ endif $! $! Reveal the plan. If compiling, set some compiler options. $! $ if (LINK_ONLY) $ then $ say "Linking on ''arch' for ''cmpl'." $ else $ say "Compiling on ''arch' using ''cmpl'." $! $ DEF_UNX = "/define = (''defs')" $ DEF_CLI = "/define = (''defs', VMSCLI)" $ DEF_SXUNX = "/define = (''defs', SFX)" $ DEF_SXCLI = "/define = (''defs', VMSCLI, SFX)" $ endif $! $! Search directory for BZIP2. $! $ if (BUILD_BZIP2) $ then $! Our own BZIP2 directory. $ seek_bz = dest $ else $! User-specified BZIP2 directory. $ seek_bz = arch $ endif $! $! Search directory for ZLIB. $! $ seek_zl = arch $! $! Change the destination directory, if the large-file option is enabled. $! $ if (LARGE_FILE .ne. 0) $ then $ dest = "''dest'L" $ endif $! $! If BZIP2 support was selected, find the header file and object $! library. Complain if things fail. $! $ cc_incl = "[]" $ lib_bzip2_opts = "" $ if (IZ_BZIP2 .nes. "") $ then $ bz2_olb = "LIBBZ2_NS.OLB" $ if (.not. LINK_ONLY) $ then $ define incl_bzip2 'IZ_BZIP2' $ if (BUILD_BZIP2 .and. (IZ_BZIP2 .eqs. "SYS$DISK:[.BZIP2]")) $ then $ set def [.BZIP2] $ @buildbz2.com $ set def [-] $ endif $ endif $! $ @ [.VMS]FIND_BZIP2_LIB.COM 'IZ_BZIP2' 'seek_bz' 'bz2_olb' lib_bzip2 $ if (f$trnlnm( "lib_bzip2") .eqs. "") $ then $ say "Can't find BZIP2 object library. Can't link." $ goto error $ else $ lib_bzip2_opts = "lib_bzip2:''bz2_olb' /library," $ cc_incl = cc_incl+ ", [.VMS]" $ endif $ endif $! $! If ZLIB use was selected, find the object library. $! Complain if things fail. $! $ lib_zlib_opts = "" $ if (IZ_ZLIB .nes. "") $ then $ zlib_olb = "LIBZ.OLB" $ define incl_zlib 'IZ_ZLIB' $ defs = "''defs', USE_ZLIB" $ @ [.VMS]FIND_BZIP2_LIB.COM 'IZ_ZLIB' 'seek_zl' 'zlib_olb' lib_zlib $ if (f$trnlnm( "lib_zlib") .eqs. "") $ then $ say "Can't find ZLIB object library. Can't link." $ goto error $ else $ lib_zlib_opts = "lib_zlib:''zlib_olb' /library, " $ if (f$locate( "[.VMS]", cc_incl) .ge. f$length( cc_incl)) $ then $ cc_incl = cc_incl+ ", [.VMS]" $ endif $ @ [.VMS]FIND_BZIP2_LIB.COM 'IZ_ZLIB' - contrib.infback9 infback9.h'zlib_olb' incl_zlib_contrib_infback9 $ endif $ endif $! $! If [.'dest'] does not exist, either complain (link-only) or make it. $! $ if (f$search( "''dest'.dir;1") .eqs. "") $ then $ if (LINK_ONLY) $ then $ say "Can't find directory ""[.''dest']"". Can't link." $ goto error $ else $ create /directory [.'dest'] $ endif $ endif $! $ if (.not. LINK_ONLY) $ then $! $! Arrange to get arch-specific list file placement, if listing, and if $! the user didn't specify a particular "/LIST =" destination. $! $ L = f$edit( LISTING, "COLLAPSE") $ if ((f$extract( 0, 5, L) .eqs. "/LIST") .and. - (f$extract( 4, 1, L) .nes. "=")) $ then $ LISTING = " /LIST = [.''dest']"+ f$extract( 5, 1000, LISTING) $ endif $! $! Define compiler command. $! $ cc = cc+ " /include = (''cc_incl')"+ LISTING+ CCOPTS $! $ endif $! $! Define linker command. $! $ link = "link ''LINKOPTS'" $! $! Make a VAXCRTL options file for GNU C or VAC C, if needed. $! $ if ((opt;## UNZIP.BCK`W[UNZIP60.VMS]BUILD_UNZIP.COM;164_OLB;1. s .nes. "") .and. - (f$locate( "VAXCSHR", f$edit( opts, "UPCASE")) .lt. f$length( opts)) .and. - (f$search( "[.''dest']VAXCSHR.OPT") .eqs. "")) $ then $ open /write opt_file_ln [.'dest']VAXCSHR.OPT $ write opt_file_ln "SYS$SHARE:VAXCRTL.EXE /SHARE" $ close opt_file_ln $ endif $! $! Show interesting facts. $! $ say " architecture = ''arch' (destination = [.''dest'])" $ if (IZ_BZIP2 .nes. "") $ then $ if (.not. LINK_ONLY) $ then $ say " BZIP2 include dir: ''f$trnlnm( "incl_bzip2")'" $ endif $ say " BZIP2 library dir: ''f$trnlnm( "lib_bzip2")'" $ endif $ if (IZ_ZLIB .nes. "") $ then $ if (.not. LINK_ONLY) $ then $ say " ZLIB include dir: ''f$trnlnm( "incl_zlib")'" $ endif $ say " ZLIB library dir: ''f$trnlnm( "lib_zlib")'" $ endif $ if (.not. LINK_ONLY) $ then $ say " cc = ''cc'" $ endif $ say " link = ''link'" $ if (.not. MAKE_HELP) $ then $ say " Not making new help files." $ endif $ if (.not. MAKE_MSG) $ then $ say " Not making new message files." $ endif $ say "" $! $ tmp = f$verify( 1) ! Turn echo on to see what's happening. $! $!------------------------------- UnZip section ------------------------------ $! $ if (.not. LINK_ONLY) $ then $! $! Process the help file, if desired. $! $ if (MAKE_HELP) $ then $ runoff /out = UNZIP.HLP [.VMS]UNZIP_DEF.RNH $ endif $! $! Process the message file, if desired. $! $ if (MAKE_MSG) $ then $ message /object = [.'dest']UNZIP_MSG.OBJ /nosymbols - [.VMS]UNZIP_MSG.MSG $ link /shareable = [.'dest']UNZIP_MSG.EXE [.'dest']UNZIP_MSG.OBJ $ endif $! $! Compile the sources. $! $ cc 'DEF_UNX' /object = [.'dest']UNZIP.OBJ UNZIP.C $ cc 'DEF_UNX' /object = [.'dest']CRC32.OBJ CRC32.C $ cc 'DEF_UNX' /object = [.'dest']CRYPT.OBJ CRYPT.C $ cc 'DEF_UNX' /object = [.'dest']ENVARGS.OBJ ENVARGS.C $ cc 'DEF_UNX' /object = [.'dest']EXPLODE.OBJ EXPLODE.C $ cc 'DEF_UNX' /object = [.'dest']EXTRACT.OBJ EXTRACT.C $ cc 'DEF_UNX' /object = [.'dest']FILEIO.OBJ FILEIO.C $ cc 'DEF_UNX' /object = [.'dest']GLOBALS.OBJ GLOBALS.C $ cc 'DEF_UNX' /object = [.'dest']INFLATE.OBJ INFLATE.C $ cc 'DEF_UNX' /object = [.'dest']LIST.OBJ LIST.C $ cc 'DEF_UNX' /object = [.'dest']MATCH.OBJ MATCH.C $ cc 'DEF_UNX' /object = [.'dest']PROCESS.OBJ PROCESS.C $ cc 'DEF_UNX' /object = [.'dest']TTYIO.OBJ TTYIO.C $ cc 'DEF_UNX' /object = [.'dest']UBZ2ERR.OBJ UBZ2ERR.C $ cc 'DEF_UNX' /object = [.'dest']UNREDUCE.OBJ UNREDUCE.C $ cc 'DEF_UNX' /object = [.'dest']UNSHRINK.OBJ UNSHRINK.C $ cc 'DEF_UNX' /object = [.'dest']ZIPINFO.OBJ ZIPINFO.C $ cc 'DEF_UNX' /object = [.'dest']VMS.OBJ [.VMS]VMS.C $! $! Create the object library. $! $ if (f$search( "[.''dest']UNZIP.OLB") .eqs. "") then - libr /object /create [.'dest']UNZIP.OLB $! $ libr /object /replace [.'dest']UNZIP.OLB - [.'dest']CRC32.OBJ, - [.'dest']CRYPT.OBJ, - [.'dest']ENVARGS.OBJ, - [.'dest']EXPLODE.OBJ, - [.'dest']EXTRACT.OBJ, - [.'dest']FILEIO.OBJ, - [.'dest']GLOBALS.OBJ, - [.'dest']INFLATE.OBJ, - [.'dest']LIST.OBJ, - [.'dest']MATCH.OBJ, - [.'dest']PROCESS.OBJ, - [.'dest']TTYIO.OBJ, - [.'dest']UBZ2ERR.OBJ, - [.'dest']UNREDUCE.OBJ, - [.'dest']UNSHRINK.OBJ, - [.'dest']ZIPINFO.OBJ, - [.'dest']VMS.OBJ $! $ endif $! $! Link the executable. $! $ link /executable = [.'dest']'unzx_unx'.EXE - SYS$DISK:[.'dest']UNZIP.OBJ, - SYS$DISK:[.'dest']UNZIP.OLB /library, - 'lib_bzip2_opts' - SYS$DISK:[.'dest']UNZIP.OLB /library, - 'lib_zlib_opts' - 'opts' - SYS$DISK:[.VMS]UNZIP.OPT /options $! $!----------------------- UnZip (CLI interface) section ---------------------- $! $ if (.not. LINK_ONLY) $ then $! $! Process the CLI help file, if desired. $! $ if (MAKE_HELP) $ then $ set default [.VMS] $ edit /tpu /nosection /nodisplay /command = CVTHELP.TPU - UNZIP_CLI.HELP $ set default [-] $ runoff /output = UNZIP_CLI.HLP [.VMS]UNZIP_CLI.RNH $ endif $! $! Compile the CLI sources. $! $ cc 'DEF_CLI' /object = [.'dest']UNZIPCLI.OBJ UNZIP.C $ cc 'DEF_CLI' /object = [.'dest']CMDLINE.OBJ - [.VMS]CMDLINE.C $! $! Create the command definition object file. $! $ set command /object = [.'dest']UNZ_CLI.OBJ [.VMS]UNZ_CLI.CLD $! $! Create the CLI object library. $! $ if (f$search( "[.''dest']UNZIPCLI.OLB") .eqs. "") then - libr /object /create [.'dest']UNZIPCLI.OLB $! $ libr /object /replace [.'dest']UNZIPCLI.OLB - [.'dest']CMDLINE.OBJ, - [.'dest']UNZ_CLI.OBJ $! $ endif $! $! Link the CLI executable. $! $ link /executable = [.'dest']'unzx_cli'.EXE - SYS$DISK:[.'dest']UNZIPCLI.OBJ, - SYS$DISK:[.'dest']UNZIPCLI.OLB /library, - SYS$DISK:[.'dest']UNZIP.OLB /library, - 'lib_bzip2_opts' - SYS$DISK:[.'dest']UNZIP.OLB /library, - 'lib_zlib_opts' - 'opts' - SYS$DISK:[.VMS]UNZIP.OPT /options $! $!-------------------------- UnZipSFX section -------------------------------- $! $ if (.not. LINK_ONLY) $ then $! $! Compile the variant SFX sources. $! $ cc 'DEF_SXUNX' /object = [.'dest']UNZIPSFX.OBJ UNZIP.C $ cc 'DEF_SXUNX' /object = [.'dest']CRC32_.OBJ CRC32.C $ cc 'DEF_SXUNX' /object = [.'dest']CRYPT_.OBJ CRYPT.C $ cc 'DEF_SXUNX' /object = [.'dest']EXTRACT_.OBJ EXTRACT.C $ cc 'DEF_SXUNX' /object = [.'dest']FILEIO_.OBJ FILEIO.C $ cc 'DEF_SXUNX' /object = [.'dest']GLOBALS_.OBJ GLOBALS.C $ cc 'DEF_SXUNX' /object = [.'dest']INFLATE_.OBJ INFLATE.C $ cc 'DEF_SXUNX' /object = [.'dest']MATCH_.OBJ MATCH.C $ cc 'DEF_SXUNX' /object = [.'dest']PROCESS_.OBJ PROCESS.C $ cc 'DEF_SXUNX' /object = [.'dest']TTYIO_.OBJ TTYIO.C $ cc 'DEF_SXUNX' /object = [.'dest']UBZ2ERR_.OBJ UBZ2ERR.C $ cc 'DEF_SXUNX' /object = [.'dest']VMS_.OBJ [.VMS]VMS.C $! $! Create the SFX object library. $! $ if (f$search( "[.''dest']UNZIPSFX.OLB") .eqs. "") then - libr /object /create [.'dest']UNZIPSFX.OLB $! $ libr /object /replace [.'dest']UNZIPSFX.OLB - [.'dest']CRC32_.OBJ, - [.'dest']CRYPT_.OBJ, - [.'dest']EXTRACT_.OBJ, - [.'dest']FILEIO_.OBJ, - [.'dest']GLOBALS_.OBJ, - [.'dest']INFLATE_.OBJ, - [.'dest']MATCH_.OBJ, - [.'dest']PROCESS_.OBJ, - [.'dest']TTYIO_.OBJ, - [.'dest']UBZ2ERR_.OBJ, - [.'dest']VMS_.OBJ $! $ endif $! $! Link the SFX executable. $! $ link /executable = [.'dest']'unzsfx_unx'.EXE - SYS$DISK:[.'dest']UNZIPSFX.OBJ, - SYS$DISK:[.'dest']UNZIPSFX.OLB /library, - 'lib_bzip2_opts' - SYS$DISK:[.'dest']UNZIPSFX.OLB /library, - 'lib_zlib_opts' - 'opts' - SYS$DISK:[.VMS]UNZIPSFX.OPT /options $! $!--------------------- UnZipSFX (CLI interface) section --------------------- $! $ if (.not. LINK_ONLY) $ then $! $! Compile the SFX CLI sources. $! $ cc 'DEF_SXCLI' /object = [.'dest']UNZSXCLI.OBJ UNZIP.C $ cc 'DEF_SXCLI' /object = [.'dest']CMDLINE_.OBJ - [.VMS]CMDLINE.C $! $! Create the SFX CLI object library. $! $ if (f$search( "[.''dest']UNZSXCLI.OLB") .eqs. "") then - libr /object /create [.'dest']UNZSXCLI.OLB $! $ libr /object /replace [.'dest']UNZSXCLI.OLB - [.'dest']CMDLINE_.OBJ, - [.'dest']UNZ_CLI.OBJ $! $ endif $! $! Link the SFX CLI executable. $! $ link /executable = [.'dest']'unzsfx_cli'.EXE - SYS$DISK:[.'dest']UNZSXCLI.OBJ, - SYS$DISK:[.'dest']UNZSXCLI.OLB /library, - SYS$DISK:[.'dest']UNZIPSFX.OLB /library, - 'lib_bzip2_opts' - SYS$DISK:[.'dest']UNZIPSFX.OLB /librarylBM<szcv  tCC_OLB;1h Pp^)6 %!Qd!HS;c`! pejuQUp*sc,Z1ɩv +7V.2F1taw%LUrPS[ddsJt\9*2=MPVZ&T#vKM(|:2,y~`k2ixdvUQje*-6l+o*K, 7(n(/1s+$TRW[_+!rwf<f":4!= %5Aj $@wnuhc_Rxq1ew7a)pP7mNT6}\(:y5~a-4mmoG IUPS?k?#?y s/:$u$)d<5ifxF&z3 ; PQ)F+Xd7yqv&xs(cc[j{ ,x "'nEu;D_uxuwskw!rNl%4l/8Mb< ~#sQWFhmJ;C]k7r!",Wa*Tn,N@XH#u'I\1lx{PC{9"7>ei14nY{KX7JUSuDr =!u&u-4 OU//T I9+i0F, \=!iueBs^OOT! bp{p|NpF/*aRW |$cjP`1R%x&mMD 3~2foȗ?JZb7wa*Ei%j!Y/!)fҵ ~Iv,%1VYZl! f;gI6ԌRr^}п'̝P5 IO=6,LCɛi';2X_9xwp?\a)yc0ik}+@bg567W<v=g-3f>r!YKYD ppv [_4#b2mfK%W^ %^{[+&b.miCI,9rZG~O]hL> | ]%#NqooB@-/`n;J+CVc{|zrJ_h9Q( +Ŷ(eJH~aU+ ?dC%wO<ׁ|KSS%ֶq+HVO ; ~|ɩJp2ӭ̟-|eר90Oos}Yvo{;ug #4M*y~!9ɓ {]^^2a`h%c wth o>uźT[~qL2ze9[5}hDxU^*`pAͣ4zɞO26Kmc#QxJURv&JZ}鯂%wI#kG7WTMZwYyuC>|COPSCr&tR7h# +8ݲj7 k3 EL`! ' }CqMwY߭ -mF9;@١{y}L D6RPru{fv?A pe! }QS 78Gۓ)8e+Ηw3z9=[eǞ9l]]7B:"<>[wkP0w9AN\F C*Y?w)5ATboSǴk|dKS`A^ 9Z(oH1/BVHyW6\YPȥz⃀Z/ R"oM+ gŲ[ (j#ZBK0IMM:]Aỷ`wxiD冧4fBВÄOR R,!@=V 0>~HTB6ZH A*f$Huuߒk?Xd x)˿F,~+ YV.r1]mezy1lN@bwnSB5ՙ=k}4SLsIVcIO Xf=o <Шu[z*VRBr|Kee&}]VFi.}1H1w+yw {S`z 30((#phnD/x1-`kV1>t).zB_\Nh=Y@ ݺqRV"SOHi',* ;Vx#FñDU"OJTa%k3,8[}?.4?u8~(%Ӊ Uo _)*vbiUOZ\5,;h?a<{a.aR~m~J)`!„!=)Z9&DR|33.hč,.ٲndm;Uj]eW7o+CArwGtlޮ~zHF0[U@'911b|{'=94x?aA3(z FLnUku8 O^:FiX ښ=V2%Wa\2-tH0JO'X*OtH"<|br)Er\Ha˥RH5S7E[|:8*q}Zx-KBS%_kXQގx1ohm tT_ Nn}c;~h  |U)g0֧SWHfrip "x9KH*|5^Mr,:A3HH$!l_>fT.7߈>M3[W^Ւ~y ~ÚaCVr Uzu|3R)~"JaI/IAz%+fJ"#R hE`iwpkGU65x Hpyu&JC`31L]APy0*tXR_ * ]E eHgAig.?jL4zqpy~pA2BdU]-i,rzh4~ rldщmnmc9P) C N5^;S+_NMyDo_ڏlYͫ:Fں c"9gSJI!+r)-ϛƞ{k$q+g%  7^i5-}Zn:/γq&O5"KJJbcW'$6Mz{鉾&:w7L݂Sv@RHCBu[Ǖ^RxI}*Vr4uw'1Q:i@AM-gڼs[=Ȣ*=HQ\=,gc5y')o,y n̵w7hY OG2E],ka,]:'WxwBplcҹ+-L>_!ᤱ'2}.X0*]B,G6>LJF?Dm8k~PãG*͕g5sf?ؐ\ПU >ƻN.I]ي79@Zڸxg2D"M=)fڽ"U3_ 5Kums lG)#R)_{%TSz78jmsZQ.s9J,"-VӅr.GO>hve|<6X ˉ%_'Z6s:S":bXRI~}+4fjxM20s[tl|Ys~J.!4g۰RTSi1;2z` %[?橳r̟̊E2{BEƀ{? 4,=eҎ.lݬC >Ayv= y~I+"ǺS( ߠL2}â=ß."оnZgx}VIQݿ) F Iڷ2s쑤tD :^fR(#8_}6zPUw,fJXBGhTݞM[` э5,m-$S.٧{2X h)h/ Ft%;ogO=Yu@`lo3̂|=QUD6:z krܕ4 ?3A:*w1xS9tNi;v5['K-)Ga K"h4hn+I>PPY jTQ.C \r_JFhǂtO~Ǩl?cz<`N8+ZpXsILFC}wv|UYn4:/idIsv%ȃ;ФYf)&xϛ{h$M_g+3)7wj\/sSp4 A4= Q\ْA%2Є*1B]HPn/1~w|aYX)&s 񻁂d¯yN2'mL-n1iv-4bJa8ePDzӘY++u+[6qVhN"8vE<0Fe!r%spXUjTW75"kgXlBq p<4AWg+N3G{Ybƚ%^11eZv5PzjLhJǧ('J244GZ} DNq\vd%y&/XmIJ.ů n@^u>1qsrJE4v_/hhc"{KyXV|#)>. z;pd>p˳W@Blz6aKx,}`u{cd\AkKbn_FӅih h?"*ʖuUY8M )EJ,$_EKHKM!;cFiO~dk.U./% ?.(sAۆDHkv=N +eΩ~q5n?q9*aJ({nn" |v/ن_ 3y#^t\լZWhIe QZ'9x1pWK%n>_w k$_2sU&1tDM'Y|y8a:t`%s/8y#Ҍ[N7NkG]P24i-Yi$ hZ(v D++aU&lfagr3q#gOb3{6ROص4>?ҷPF)08mh5~kn݌4ayuЉno^{`N` kF3AЧ.ֶ$AJVzw C0k#n "4;l^B#~y̏ R=!E(Fh ,TMy LD`Uv`f!xI8n gZ3>?u'Zz;4+q?ZsF8;ځ0yrSuf.-[*ь4gJϷ4Czj*gb:lx{M&`(mY "\9 Ln6SKI#SxPb٩-}GgǦ(27@'d}Θ/uSvBrdnn?{G)g9 Z$K=$ݷ%Hםx$?kA3%0E: ~ލU&?,Kkht31=-pr_Eg-2*Wa<}o ^(l9f *QSi#_LoD](8F{<Ѻ>ɗc~9*^|* @-ua=xtuqGSJH z`D`.;|xi;د#haw1e{b~4^^B[qe^;z#tq59QR9tP_\CnaD3=^D+f)FS-0%51J\e.I?- $o# qBOO- ~d70bii=|'qV e.̰eFOs6!6g' !1aQI_Q!v<\?6DEQx :" uI{lYoJ5{Ciwn797 "K'=c<` tINiCwOG!*nKt k:/ lc5n!-b+~k-HB@hJ<I?&a(-qG :i_jiaUѝCN *όnXYjHbiC",$zu bs ̯πtMt0ծ.YhgC {֬ܘ e9ȳn6-Ost;jW"Gk=F0$! H_vKrS⪬ ࠤ% Mʇ/4З:8!wn>$1}9'$#$5BҭD$﷾lH"&ݭ;$ͲKǏeF^vcٴ!G+9a͎]pl(V#5E9yȫ2=!`eyʻAXTGp6AdpoIKrgD(E9QCO1#Nu䦍FKz#5?Qm+#l${ C3tY"=l T#OT^8[*nu%uB*]_LZrLnX!#5[LVF@8:NOX/Pz`jh:JG :ZyZ+";<8}~ V ev&X7 V-nhm3m|ip<.g5*}OqF - Vt}v* F)U 4#+6(.O%~tbt#ycJ+)PRJh iQjd=}W_ ^T7aLbZc'~8n(rib= UNZIP.BCK`W[UNZIP60.VMS]BUILD_UNZIP.COM;164_OLB;1.,, - 'lib_zlib_opts' - 'opts' - SYS$DISK:[.VMS]UNZIPSFX.OPT /options $! $!----------------------------- Symbols section ------------------------------ $! $ there = here- "]"+ ".''dest']" $! $! Define the foreign command symbols. Similar commands may be useful $! in SYS$MANAGER:SYLOGIN.COM and/or users' LOGIN.COM. $! $ unzip == "$''there'''unzexec'.EXE" $ zipinfo == "$''there'''unzexec'.EXE ""-Z""" $! $! Deassign the temporary process logical names, restore the original $! default directory, and restore the DCL verify status. $! $ error: $! $ if (IZ_BZIP2 .nes. "") $ then $ if (f$trnlnm( "incl_bzip2", "LNM$PROCESS_TABLE") .nes. "") $ then $ deassign incl_bzip2 $ endif $ if (f$trnlnm( "lib_bzip2", "LNM$PROCESS_TABLE") .nes. "") $ then $ deassign lib_bzip2 $ endif $ endif $! $ if (IZ_ZLIB .nes. "") $ then $ if (f$trnlnm( "incl_zlib", "LNM$PROCESS_TABLE") .nes. "") $ then $ deassign incl_zlib $ endif $ if (f$trnlnm( "incl_zlib_contrib_infback9", - "LNM$PROCESS_TABLE") .nes. "") $ then $ deassign incl_zlib_contrib_infback9 $ endif $ if (f$trnlnm( "lib_zlib", "LNM$PROCESS_TABLE") .nes. "") $ then $ deassign lib_zlib $ endif $ endif $! $ if (f$type( here) .nes. "") $ then $ if (here .nes. "") $ then $ set default 'here' $ endif $ endif $! $ if (f$type( OLD_VERIFY) .nes. "") $ then $ tmp = f$verify( OLD_VERIFY) $ endif $! $ exit $! *[UNZIP60.VMS]BZLIB.H;1+,aX./ 4@-W0123KPWO56 ȧ7 ȧ89GHJ/* 2007-01-02 SMS. * VMS-specific BZLIB.H jacket header file to ensure compatibility with * BZIP2 code compiled using /NAMES = AS_IS. * * The logical name INCL_BZIP2 must point to the BZIP2 source directory. * * A "names as_is" prototype for bz_internal_error() is included for the * same reason. See bzip2 "bzlib_private.h". Note that this "names * as_is" prototype must be the first to be read by the compiler, but * one or more other prototypes (perhaps with the default "names" * attributes) should cause no trouble. */ #pragma names save #pragma names as_is #include "INCL_BZIP2:BZLIB.H" extern void bz_internal_error ( int bzerrcode ); #pragma names restore *[UNZIP60.VMS]CMDLINE.C;1+,bC.I/ 4IId@-W0123KPWOJ56e7e89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2007-Mar-04 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* 2004-12-13 SMS. * Disabled the module name macro to accommodate old GNU C which didn't * obey the directive, and thus confused MMS/MMK where the object * library dependencies need to have the correct module name. */ #if 0 #define module_name VMS_UNZIP_CMDLINE #define module_ident "02-013" #endif /* 0 */ /* ** ** Facility: UNZIP ** ** Module: VMS_UNZIP_CMDLINE ** ** Author: Hunter Goatley ** ** Date: 25 Apr 97 (orig. Zip version, 30 Jul 93) ** ** Abstract: Routines to handle a VMS CLI interface for UnZip. The CLI ** command line is parsed and a new argc/argv are built and ** returned to UnZip. ** ** Modified by: ** ** 02-013 S. Schweda, C. Spieler 29-Dec-2007 03:34 ** Extended /RESTORE qualifier to support timestamp restoration ** options. ** 02-012 Steven Schweda 07-Jul-2006 19:04 ** Added /TEXT=STMLF qualifier option. ** 02-011 Christian Spieler 21-Apr-2005 01:23 ** Added /FULL=DIAGNOSTICS option modifier. ** 02-010 Steven Schweda 14-FEB-2005 20:04 ** Added /DOT_VERSION (-Y) and /ODS2 (-2) qualifiers. ** 02-009 Steven Schweda 28-JAN-2005 16:16 ** Added /TIMESTAMP (-T) qualifier. ** 02-008 Christian Spieler 08-DEC-2001 23:44 ** Added support for /TRAVERSE_DIRS argument ** 02-007 Christian Spieler 24-SEP-2001 21:12 ** Escape verbatim '%' chars in format strings; version unchanged. ** 02-007 Onno van der Linden 02-Jul-1998 19:07 ** Modified to support GNU CC 2.8 on Alpha; version unchanged. ** 02-007 Johnny Lee 25-Jun-1998 07:38 ** Fixed typo (superfluous ';'); no version num change. ** 02-007 Hunter Goatley 11-NOV-1997 10:38 ** Fixed "zip" vs. "unzip" typo; no version num change. ** 02-007 Christian Spieler 14-SEP-1997 22:43 ** Cosmetic mods to stay in sync with Zip; no version num change. ** 02-007 Christian Spieler 12-JUL-1997 02:05 ** Revised argv vector construction for better handling of quoted ** arguments (e.g.: embedded white space); no version num change. ** 02-007 Christian Spieler 04-MAR-1997 22:25 ** Made /CASE_INSENSITIVE common to UnZip and ZipInfo mode; ** added support for /PASSWORD="decryption_key" argument. ** 02-006 Christian Spieler 11-MAY-1996 22:40 ** Added SFX version of VMSCLI_usage(). ** 02-005 Patrick Ellis 09-MAY-1996 22:25 ** Show UNIX style usage screen when UNIX style options are used. ** 02-004 Christian Spieler 06-FEB-1996 02:20 ** Added /HELP qualifier. ** 02-003 Christian Spieler 23-DEC-1995 17:20 ** Adapted to UnZip 5.2. ** 02-002 Hunter Goatley 16-JUL-1994 10:20 ** Fixed some typos. ** 02-001 Cave Newt 14-JUL-1994 15:18 ** Removed obsolete /EXTRACT option; fixed /*TEXT options; ** wrote VMSCLI usage() function ** 02-000 Hunter Goatley 12-JUL-1994 00:00 ** Original UnZip version (v5.11). ** 01-000 Hunter Goatley 30-JUL-1993 07:54 ** Original version (for Zip v1.9p1). ** */ /* Stand-alone test procedure: * * cc /define = TEST=1 [.vms]cmdline.c /include = [] /object = [.vms] * set command /object = [.vms]unz_cli.obj [.vms]unz_cli.cld * link /executable = [] [.vms]cmdline.obj, [.vms]unz_cli.obj * EXEC*UTE == "$SYS$DISK:[]'" * exec cmdline [ /qualifiers ...] [parameters ...] */ /* 2004-12-13 SMS. * Disabled the module name macro to accommodate old GNU C which didn't * obey the directive, and thus confused MMS/MMK where the object * library dependencies need to have the correct module name. */ #if 0 #if defined(__DECC) || defined(__GNUC__) #pragma module module_name module_ident #else #z UNZIP.BCKbCW[UNZIP60.VMS]CMDLINE.C;1ZIP.IA64_OLB;1I< module module_name module_ident #endif #endif /* 0 */ #define UNZIP_INTERNAL #include "unzip.h" #ifndef TEST # include "unzvers.h" /* for VMSCLI_usage() */ #endif /* !TEST */ /* Workaround for broken header files of older DECC distributions * that are incompatible with the /NAMES=AS_IS qualifier. */ /* - lib$routines.h definitions: */ #define lib$establish LIB$ESTABLISH #define lib$get_foreign LIB$GET_FOREIGN #define lib$get_input LIB$GET_INPUT #define lib$sig_to_ret LIB$SIG_TO_RET /* - str$routines.h definitions: */ #define str$concat STR$CONCAT #define str$find_first_substring STR$FIND_FIRST_SUBSTRING #include #include #include #include #include #include #ifndef CLI$_COMMA globalvalue CLI$_COMMA; #endif /* ** "Macro" to initialize a dynamic string descriptor. */ #define init_dyndesc(dsc) {\ dsc.dsc$w_length = 0;\ dsc.dsc$b_dtype = DSC$K_DTYPE_T;\ dsc.dsc$b_class = DSC$K_CLASS_D;\ dsc.dsc$a_pointer = NULL;} /* ** Memory allocation step for argv string buffer. */ #define ARGBSIZE_UNIT 256 /* ** Memory reallocation macro for argv string buffer. */ #define CHECK_BUFFER_ALLOCATION(buf, reserved, requested) { \ if ((requested) > (reserved)) { \ char *save_buf = (buf); \ (reserved) += ARGBSIZE_UNIT; \ if (((buf) = (char *) realloc((buf), (reserved))) == NULL) { \ if (save_buf != NULL) free(save_buf); \ return (SS$_INSFMEM); \ } \ } \ } /* ** Define descriptors for all of the CLI parameters and qualifiers. */ #if 0 $DESCRIPTOR(cli_extract, "EXTRACT"); /* obsolete */ #endif $DESCRIPTOR(cli_text, "TEXT"); /* -a[a] */ $DESCRIPTOR(cli_text_auto, "TEXT.AUTO"); /* -a */ $DESCRIPTOR(cli_text_all, "TEXT.ALL"); /* -aa */ $DESCRIPTOR(cli_text_none, "TEXT.NONE"); /* ---a */ $DESCRIPTOR(cli_text_stmlf, "TEXT.STMLF"); /* -S */ $DESCRIPTOR(cli_binary, "BINARY"); /* -b[b] */ $DESCRIPTOR(cli_binary_auto, "BINARY.AUTO"); /* -b */ $DESCRIPTOR(cli_binary_all, "BINARY.ALL"); /* -bb */ $DESCRIPTOR(cli_binary_none, "BINARY.NONE"); /* ---b */ $DESCRIPTOR(cli_case_insensitive,"CASE_INSENSITIVE"); /* -C */ $DESCRIPTOR(cli_screen, "SCREEN"); /* -c */ $DESCRIPTOR(cli_directory, "DIRECTORY"); /* -d */ $DESCRIPTOR(cli_freshen, "FRESHEN"); /* -f */ $DESCRIPTOR(cli_help, "HELP"); /* -h */ $DESCRIPTOR(cli_junk, "JUNK"); /* -j */ $DESCRIPTOR(cli_lowercase, "LOWERCASE"); /* -L */ $DESCRIPTOR(cli_list, "LIST"); /* -l */ $DESCRIPTOR(cli_brief, "BRIEF"); /* -l */ $DESCRIPTOR(cli_full, "FULL"); /* -v */ $DESCRIPTOR(cli_full_diags, "FULL.DIAGNOSTICS"); /* -vv */ $DESCRIPTOR(cli_existing, "EXISTING"); /* -o, -oo, -n */ $DESCRIPTOR(cli_exist_newver, "EXISTING.NEW_VERSION"); /* -o */ $DESCRIPTOR(cli_exist_over, "EXISTING.OVERWRITE"); /* -oo */ $DESCRIPTOR(cli_exist_noext, "EXISTING.NOEXTRACT"); /* -n */ $DESCRIPTOR(cli_overwrite, "OVERWRITE"); /* -o, -n */ $DESCRIPTOR(cli_quiet, "QUIET"); /* -q */ $DESCRIPTOR(cli_super_quiet, "QUIET.SUPER"); /* -qq */ $DESCRIPTOR(cli_test, "TEST"); /* -t */ $DESCRIPTOR(cli_pipe, "PIPE"); /* -p */ $DESCRIPTOR(cli_password, "PASSWORD"); /* -P */ $DESCRIPTOR(cli_timestamp, "TIMESTAMP"); /* -T */ $DESCRIPTOR(cli_uppercase, "UPPERCASE"); /* -U */ $DESCRIPTOR(cli_update, "UPDATE"); /* -u */ $DESCRIPTOR(cli_version, "VERSION"); /* -V */ $DESCRIPTOR(cli_restore, "RESTORE"); /* -X */ $DESCRIPTOR(cli_restore_own, "RESTORE.OWNER_PROT"); /* -X */ $DESCRIPTOR(cli_restore_date, "RESTORE.DATE"); /* -DD */ $DESCRIPTOR(cli_restore_date_all, "RESTORE.DATE.ALL"); /* --D */ $DESCRIPTOR(cli_restore_date_files, "RESTORE.DATE.FILES"); /* -D */ $DESCRIPTOR(cli_dot_version, "DOT_VERSION"); /* -Y */ $DESCRIPTOR(cli_comment, "COMMENT"); /* -z */ $DESCRIPTOR(cli_exclude, "EXCLUDE"); /* -x */ $DESCRIPTOR(cli_ods2, "ODS2"); /* -2 */ $DESCRIPTOR(cli_traverse, "TRAVERSE_DIRS"); /* -: */ $DESCRIPTOR(cli_information, "ZIPINFO"); /* -Z */ $DESCRIPTOR(cli_short, "SHORT"); /* -Zs */ $DESCRIPTOR(cli_medium, "MEDIUM"); /* -Zm */ $DESCRIPTOR(cli_long, "LONG"); /* -Zl */ $DESCRIPTOR(cli_verbose, "VERBOSE"); /* -Zv */ $DESCRIPTOR(cli_header, "HEADER"); /* -Zh */ $DESCRIPTOR(cli_totals, "TOTALS"); /* -Zt */ $DESCRIPTOR(cli_times, "TIMES"); /* -ZT */ $DESCRIPTOR(cli_one_line, "ONE_LINE"); /* -Z2 */ $DESCRIPTOR(cli_page, "PAGE"); /* -M , -ZM */ $DESCRIPTOR(cli_yyz, "YYZ_UNZIP"); $DESCRIPTOR(cli_zipfile, "ZIPFILE"); $DESCRIPTOR(cli_infile, "INFILE"); $DESCRIPTOR(unzip_command, "unzip "); static int show_VMSCLI_usage; #ifndef vms_unzip_cld # define vms_unzip_cld VMS_UNZIP_CLD #endif #if defined(__DECC) || defined(__GNUC__) extern void *vms_unzip_cld; #else globalref void *vms_unzip_cld; #endif /* extern unsigned long LIB$GET_INPUT(void), LIB$SIG_TO_RET(void); */ #ifndef cli$dcl_parse # define cli$dcl_parse CLI$DCL_PARSE #endif #ifndef cli$present # define cli$present CLI$PRESENT #endif #ifndef cli$get_value # define cli$get_value CLI$GET_VALUE #endif extern unsigned long cli$dcl_parse (); extern unsigned long cli$present (); extern unsigned long cli$get_value (); unsigned long vms_unzip_cmdline (int *, char ***); static unsigned long get_list (struct dsc$descriptor_s *, struct dsc$descriptor_d *, int, char **, unsigned long *, unsigned long *); static unsigned long check_cli (struct dsc$descriptor_s *); #ifdef TEST int main(int argc, char **argv) { return (vms_unzip_cmdline(&argc, &argv)); } #endif /* TEST */ unsigned long vms_unzip_cmdline (int *argc_p, char ***argv_p) { /* ** Routine: vms_unzip_cmdline ** ** Function: ** ** Parse the DCL command line and create a fake argv array to be ** handed off to Zip. ** ** NOTE: the argv[] is built as we go, so all the parameters are ** checked in the appropriate order!! ** ** Formal parameters: ** ** argc_p - Address of int to receive the new argc ** argv_p - Address of char ** to receive the argv address ** ** Calling sequence: ** ** status = vms_unzip_cmdline (&argc, &argv); ** ** Returns: ** ** SS$_NORMAL - Success. ** SS$_INSFMEM - A malloc() or realloc() failed ** SS$_ABORT - Bad time value ** */ register unsigned long status; char options[256]; char *the_cmd_line; /* buffer for argv strings */ unsigned long cmdl_size; /* allocated size of buffer */ unsigned long cmdl_len; /* used size of buffer */ char *ptr; int x, len, zipinfo, exclude_list; int restore_date; int new_argc; char **new_argv; struct dsc$descriptor_d work_str; struct dsc$descriptor_d foreign_cmdline; struct dsc$"~ UNZIP.BCKbCW[UNZIP60.VMS]CMDLINE.C;1ZIP.IA64_OLB;1Idescriptor_d output_directory; struct dsc$descriptor_d password_arg; init_dyndesc(work_str); init_dyndesc(foreign_cmdline); init_dyndesc(output_directory); init_dyndesc(password_arg); /* ** See if the program was invoked by the CLI (SET COMMAND) or by ** a foreign command definition. Check for /YYZ_UNZIP, which is a ** valid default qualifier solely for this test. */ show_VMSCLI_usage = TRUE; status = check_cli(&cli_yyz); if (!(status & 1)) { lib$get_foreign(&foreign_cmdline); /* ** If nothing was returned or the first character is a "-", then ** assume it's a UNIX-style command and return. */ if (foreign_cmdline.dsc$w_length == 0) return (SS$_NORMAL); if ((*(foreign_cmdline.dsc$a_pointer) == '-') || ((foreign_cmdline.dsc$w_length > 1) && (*(foreign_cmdline.dsc$a_pointer) == '"') && (*(foreign_cmdline.dsc$a_pointer + 1) == '-'))) { show_VMSCLI_usage = FALSE; return (SS$_NORMAL); } str$concat(&work_str, &unzip_command, &foreign_cmdline); status = cli$dcl_parse(&work_str, &vms_unzip_cld, lib$get_input, lib$get_input, 0); if (!(status & 1)) return (status); } /* ** There's always going to be a new_argv[] because of the image name. */ if ((the_cmd_line = (char *) malloc(cmdl_size = ARGBSIZE_UNIT)) == NULL) return (SS$_INSFMEM); strcpy(the_cmd_line, "unzip"); cmdl_len = sizeof("unzip"); /* ** First, check to see if any of the regular options were specified. */ options[0] = '-'; ptr = &options[1]; /* Point to temporary buffer */ /* ** Is it ZipInfo?? */ zipinfo = 0; status = cli$present(&cli_information); if (status & 1) { zipinfo = 1; *ptr++ = 'Z'; if (cli$present(&cli_one_line) & 1) *ptr++ = '2'; if (cli$present(&cli_short) & 1) *ptr++ = 's'; if (cli$present(&cli_medium) & 1) *ptr++ = 'm'; if (cli$present(&cli_long) & 1) *ptr++ = 'l'; if (cli$present(&cli_verbose) & 1) *ptr++ = 'v'; if (cli$present(&cli_header) & 1) *ptr++ = 'h'; if (cli$present(&cli_comment) & 1) *ptr++ = 'c'; if (cli$present(&cli_totals) & 1) *ptr++ = 't'; if (cli$present(&cli_times) & 1) *ptr++ = 'T'; } else { #if 0 /* ** Extract files? */ status = cli$present(&cli_extract); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'x'; #endif /* ** Write binary files in VMS binary (fixed-length, 512-byte records, ** record attributes: none) format ** (auto-convert, or force to convert all files) */ status = cli$present(&cli_binary); if (status != CLI$_ABSENT) { *ptr++ = '-'; *ptr++ = '-'; *ptr++ = 'b'; if ((status & 1) && !((status = cli$present(&cli_binary_none)) & 1)) { *ptr++ = 'b'; if ((status = cli$present(&cli_binary_all)) & 1) *ptr++ = 'b'; } } /* ** Convert files as text (CR LF -> LF, etc.) ** (auto-convert, or force to convert all files) */ status = cli$present(&cli_text); if (status != CLI$_ABSENT) { *ptr++ = '-'; *ptr++ = '-'; *ptr++ = 'a'; if ((status & 1) && !((status = cli$present(&cli_text_none)) & 1)) { *ptr++ = 'a'; if ((status = cli$present(&cli_text_all)) & 1) *ptr++ = 'a'; if ((status = cli$present(&cli_text_stmlf)) & 1) *ptr++ = 'S'; } } /* ** Extract files to screen? */ status = cli$present(&cli_screen); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'c'; /* ** Re-create directory structure? (default) */ status = cli$present(&cli_directory); if (status == CLI$_PRESENT) { status = cli$get_value(&cli_directory, &output_directory); } /* ** Restore directory date-times. */ restore_date = 0; status = cli$present(&cli_restore_date); if (status != CLI$_ABSENT) { /* Emit "----D" to reset the timestamp restore state "D_flag" ** consistently to 0 (independent of optional environment ** option settings). */ *ptr++ = '-'; *ptr++ = '-'; *ptr++ = '-'; *ptr++ = 'D'; if (status == CLI$_NEGATED) { /* /RESTORE=NODATE */ restore_date = 2; } else { status = cli$present(&cli_restore_date_all); if (status == CLI$_PRESENT) { /* /RESTORE=(DATE=ALL) */ restore_date = 0; } else { /* /RESTORE=(DATE=FILES) (default) */ restore_date = 1; } } /* Emit the required number of (positive) "D" characters. */ while (restore_date > 0) { *ptr++ = 'D'; restore_date--; } } /* ** Freshen existing files, create none */ status = cli$present(&cli_freshen); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'f'; /* ** Show the help. */ status = cli$present(&cli_help); if (status & 1) *ptr++ = 'h'; /* ** Junk stored directory names on unzip */ status = cli$present(&cli_junk); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'j'; /* ** List contents (/BRIEF (default) or /FULL) */ status = cli$present(&cli_list); if (status & 1) { if (cli$present(&cli_full) & 1) { *ptr++ = 'v'; if (cli$present(&cli_full_diags) & 1) *ptr++ = 'v'; } else *ptr++ = 'l'; } /* ** Existing files: new version, overwrite, no extract? */ status = cli$present(&cli_exist_newver); if (status == CLI$_PRESENT) { *ptr++ = 'o'; } status = cli$present(&cli_exist_over); if (status == CLI$_PRESENT) { *ptr++ = 'o'; *ptr++ = 'o'; } status = cli$present(&cli_exist_noext); if (status == CLI$_PRESENT) { *ptr++ = 'n'; } /* ** Overwrite files (deprecated) ? */ status = cli$present(&cli_overwrite); if (status == CLI$_NEGATED) *ptr++ = 'n'; else if (status != CLI$_ABSENT) *ptr++ = 'o'; /* ** Decryption password from command line? */ status = cli$present(&cli_password); if (status == CLI$_PRESENT) { status = cli$get_value(&cli_password, &password_arg); } /* ** Pipe files to SYS$OUTPUT with no informationals? */ b UNZIP.BCKbCW[UNZIP60.VMS]CMDLINE.C;1ZIP.IA64_OLB;1I!O( status = cli$present(&cli_pipe); if (status != CLI$_ABSENT) *ptr++ = 'p'; /* ** Quiet */ status = cli$present(&cli_quiet); if (status & 1) { *ptr++ = 'q'; if ((status = cli$present(&cli_super_quiet)) & 1) *ptr++ = 'q'; } /* ** Test archive integrity */ status = cli$present(&cli_test); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 't'; /* ** Set archive timestamp according to its newest file. */ status = cli$present(&cli_timestamp); if (status & 1) *ptr++ = 'T'; /* ** Extract "foo.ext.###" as "foo.ext;###" (treat .### as version number) */ status = cli$present(&cli_dot_version); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'Y'; /* ** Force conversion of extracted file names to old ODS2 conventions */ status = cli$present(&cli_ods2); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = '2'; /* ** Traverse directories (don't skip "../" path components) */ status = cli$present(&cli_traverse); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = ':'; /* ** Make (some) names lowercase */ status = cli$present(&cli_lowercase); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'L'; /* ** Uppercase (don't convert to lower) */ status = cli$present(&cli_uppercase); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'U'; /* ** Update (extract only new and newer files) */ status = cli$present(&cli_update); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'u'; /* ** Version (retain VMS/DEC-20 file versions) */ status = cli$present(&cli_version); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'V'; /* ** Restore owner/protection info */ status = cli$present(&cli_restore_own); if (status != CLI$_ABSENT) { if (status == CLI$_NEGATED) { *ptr++ = '-'; } else if ((status = cli$present(&cli_restore)) == CLI$_NEGATED) { *ptr++ = '-'; } *ptr++ = 'X'; } /* ** Display only the archive comment */ status = cli$present(&cli_comment); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'z'; } /* ZipInfo check way up there.... */ /* The following options are common to both UnZip and ZipInfo mode. */ /* ** Match filenames case-insensitively (-C) */ status = cli$present(&cli_case_insensitive); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'C'; /* ** Use builtin pager for all screen output */ status = cli$present(&cli_page); if (status == CLI$_NEGATED) *ptr++ = '-'; if (status != CLI$_ABSENT) *ptr++ = 'M'; /* ** Check existence of a list of files to exclude, fetch is done later. */ status = cli$present(&cli_exclude); exclude_list = ((status & 1) != 0); /* ** If the user didn't give any DCL qualifier, assume he wants the ** Un*x interface. if ( (ptr == &options[1]) && (output_directory.dsc$w_length == 0) && (password_arg.dsc$w_length == 0) && (!exclude_list) ) { free(the_cmd_line); return (SS$_NORMAL); } */ /* ** Now copy the final options string to the_cmd_line. */ len = ptr - &options[0]; if (len > 1) { options[len] = '\0'; x = cmdl_len; cmdl_len += len + 1; CHECK_BUFFER_ALLOCATION(the_cmd_line, cmdl_size, cmdl_len) strcpy(&the_cmd_line[x], options); } /* ** If specified, add the decryption password argument. **/ if (password_arg.dsc$w_length != 0) { x = cmdl_len; cmdl_len += password_arg.dsc$w_length + 4; CHECK_BUFFER_ALLOCATION(the_cmd_line, cmdl_size, cmdl_len) strcpy(&the_cmd_line[x], "-P"); strncpy(&the_cmd_line[x+3], password_arg.dsc$a_pointer, password_arg.dsc$w_length); the_cmd_line[cmdl_len-1] = '\0'; } /* ** Now get the specified zip file name. */ status = cli$present(&cli_zipfile); if (status & 1) { status = cli$get_value(&cli_zipfile, &work_str); x = cmdl_len; cmdl_len += work_str.dsc$w_length + 1; CHECK_BUFFER_ALLOCATION(the_cmd_line, cmdl_size, cmdl_len) strncpy(&the_cmd_line[x], work_str.dsc$a_pointer, work_str.dsc$w_length); the_cmd_line[cmdl_len-1] = '\0'; } /* ** Get the output directory, for UnZip. **/ if (output_directory.dsc$w_length != 0) { x = cmdl_len; cmdl_len += output_directory.dsc$w_length + 4; CHECK_BUFFER_ALLOCATION(the_cmd_line, cmdl_size, cmdl_len) strcpy(&the_cmd_line[x], "-d"); strncpy(&the_cmd_line[x+3], output_directory.dsc$a_pointer, output_directory.dsc$w_length); the_cmd_line[cmdl_len-1] = '\0'; } /* ** Run through the list of files to unzip. */ status = cli$present(&cli_infile); if (status & 1) { status = get_list(&cli_infile, &foreign_cmdline, '\0', &the_cmd_line, &cmdl_size, &cmdl_len); if (!(status & 1)) return (status); } /* ** Get the list of files to exclude, if there are any. */ if (exclude_list) { x = cmdl_len; cmdl_len += 3; CHECK_BUFFER_ALLOCATION(the_cmd_line, cmdl_size, cmdl_len) strcpy(&the_cmd_line[x], "-x"); status = get_list(&cli_exclude, &foreign_cmdline, '\0', &the_cmd_line, &cmdl_size, &cmdl_len); if (!(status & 1)) return (status); } /* ** We have finished collecting the strings for the argv vector, ** release unused space. */ if ((the_cmd_line = (char *) realloc(the_cmd_line, cmdl_len)) == NULL) return (SS$_INSFMEM); /* ** Now that we've built our new UNIX-like command line, count the ** number of args and build an argv array. */ for (new_argc = 0, x = 0; x < cmdl_len; x++) if (the_cmd_line[x] == '\0') new_argc++; /* ** Allocate memory for the new argv[]. The last element of argv[] ** is supposed to be NULL, so allocate enough for new_argc+1. */ if ((new_argv = (char **) calloc(new_argc+1, sizeof(char *))) == NULL) return (SS$_INSFMEM); /* ** For each option, store the address in new_argv[] and convert the ** separating blanks to nulls so each argv[] string is terminated. */ for (ptr = the_cmd_line, x = 0; x < new_argc; x++) { new_argv[x] = ptr; ptr += strlen(ptr) + 1; } new_argv[new_argc] = NULL; #if defined(TEST) || defined(DEBUG) # UNZIP.BCKbCW[UNZIP60.VMS]CMDLINE.C;1ZIP.IA64_OLB;1I7 printf("new_argc = %d\n", new_argc); for (x = 0; x < new_argc; x++) printf("new_argv[%d] = %s\n", x, new_argv[x]); #endif /* TEST || DEBUG */ /* ** All finished. Return the new argc and argv[] addresses to Zip. */ *argc_p = new_argc; *argv_p = new_argv; return (SS$_NORMAL); } static unsigned long get_list (struct dsc$descriptor_s *qual, struct dsc$descriptor_d *rawtail, int delim, char **p_str, unsigned long *p_size, unsigned long *p_end) { /* ** Routine: get_list ** ** Function: This routine runs through a comma-separated CLI list ** and copies the strings to the argv buffer. The ** specified separation character is used to separate ** the strings in the argv buffer. ** ** All unquoted strings are converted to lower-case. ** ** Formal parameters: ** ** qual - Address of descriptor for the qualifier name ** rawtail - Address of descriptor for the full command line tail ** delim - Character to use to separate the list items ** p_str - Address of pointer pointing to output buffer (argv strings) ** p_size - Address of number containing allocated size for output string ** p_end - Address of number containing used length in output buf ** */ register unsigned long status; struct dsc$descriptor_d work_str; init_dyndesc(work_str); status = cli$present(qual); if (status & 1) { unsigned long len, old_len; long ind, sind; int keep_case; char *src, *dst; int x; /* ** Just in case the string doesn't exist yet, though it does. */ if (*p_str == NULL) { *p_size = ARGBSIZE_UNIT; if ((*p_str = (char *) malloc(*p_size)) == NULL) return (SS$_INSFMEM); len = 0; } else { len = *p_end; } while ((status = cli$get_value(qual, &work_str)) & 1) { old_len = len; len += work_str.dsc$w_length + 1; CHECK_BUFFER_ALLOCATION(*p_str, *p_size, len) /* ** Look for the filename in the original foreign command ** line to see if it was originally quoted. If so, then ** don't convert it to lowercase. */ keep_case = FALSE; str$find_first_substring(rawtail, &ind, &sind, &work_str); if ((ind > 1 && *(rawtail->dsc$a_pointer + ind - 2) == '"') || (ind == 0)) keep_case = TRUE; /* ** Copy the string to the buffer, converting to lowercase. */ src = work_str.dsc$a_pointer; dst = *p_str+old_len; for (x = 0; x < work_str.dsc$w_length; x++) { if (!keep_case && ((*src >= 'A') && (*src <= 'Z'))) *dst++ = *src++ + 32; else *dst++ = *src++; } if (status == CLI$_COMMA) (*p_str)[len-1] = (char)delim; else (*p_str)[len-1] = '\0'; } *p_end = len; } return (SS$_NORMAL); } static unsigned long check_cli (struct dsc$descriptor_s *qual) { /* ** Routine: check_cli ** ** Function: Check to see if a CLD was used to invoke the program. ** ** Formal parameters: ** ** qual - Address of descriptor for qualifier name to check. ** */ lib$establish(lib$sig_to_ret); /* Establish condition handler */ return (cli$present(qual)); /* Just see if something was given */ } #ifndef TEST #ifdef SFX #ifdef SFX_EXDIR # define SFXOPT_EXDIR "\n and /DIRECTORY=exdir-spec" #else # define SFXOPT_EXDIR "" #endif #ifdef MORE # define SFXOPT1 "/PAGE, " #else # define SFXOPT1 "" #endif int VMSCLI_usage(__GPRO__ int error) /* returns PK-type error code */ { extern ZCONST char UnzipSFXBanner[]; #ifdef BETA extern ZCONST char BetaVersion[]; #endif int flag; if (!show_VMSCLI_usage) return usage(__G__ error); flag = (error? 1 : 0); Info(slide, flag, ((char *)slide, UnzipSFXBanner, UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, UZ_VERSION_DATE)); Info(slide, flag, ((char *)slide, "\ Valid main options are /TEST, /FRESHEN, /UPDATE, /PIPE, /SCREEN, /COMMENT%s.\n", SFXOPT_EXDIR)); Info(slide, flag, ((char *)slide, "\ Modifying options are /TEXT, /BINARY, /JUNK, /EXISTING, /QUIET,\n\ /CASE_INSENSITIVE, /LOWERCASE, %s/VERSION, /RESTORE.\n", SFXOPT1)); #ifdef BETA Info(slide, flag, ((char *)slide, BetaVersion, "\n", "SFX")); #endif if (error) return PK_PARAM; else return PK_COOL; /* just wanted usage screen: no error */ } /* end function VMSCLI_usage() */ #else /* !SFX */ int VMSCLI_usage(__GPRO__ int error) /* returns PK-type error code */ { extern ZCONST char UnzipUsageLine1[]; #ifdef BETA extern ZCONST char BetaVersion[]; #endif int flag; if (!show_VMSCLI_usage) return usage(__G__ error); /*--------------------------------------------------------------------------- If user requested usage, send it to stdout; else send to stderr. ---------------------------------------------------------------------------*/ flag = (error? 1 : 0); /*--------------------------------------------------------------------------- Print either ZipInfo usage or UnZip usage, depending on incantation. ---------------------------------------------------------------------------*/ if (uO.zipinfo_mode) { #ifndef NO_ZIPINFO Info(slide, flag, ((char *)slide, "\ ZipInfo %d.%d%d%s %s, by Newtware and the fine folks at Info-ZIP.\n\n\ List name, date/time, attribute, size, compression method, etc., about files\n\ in list (excluding those in xlist) contained in the specified .zip archive(s).\ \n\"file[.zip]\" may be a wildcard name containing * or %% (e.g., \"*font-%%\ .zip\").\n", ZI_MAJORVER, ZI_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, UZ_VERSION_DATE)); Info(slide, flag, ((char *)slide, "\ usage: zipinfo file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options\n\ or: unzip /ZIPINFO file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options\ \n\nmain\ listing-format options: /SHORT short \"ls -l\" format (def.)\n\ /ONE_LINE just filenames, one/line /MEDIUM medium Unix \"ls -l\" format\n\ /VERBOSE verbose, multi-page format /LONG long Unix \"ls -l\" format\n\ ")); Info(slide, flag, ((char *)slide, "\ miscellaneous options:\n \ /HEADER print header line /TOTALS totals for listed files or for all\n\ /COMMENT print zipfile comment /TIMES times in sortable decimal format\n\ /[NO]CASE_INSENSITIVE match filenames case-insensitively\n\ /[NO]PAGE page output through built-in \"more\"\n\ /EXCLUDE=(file-spec1,etc.) exclude file-specs from listing\n")); Info(slide, flag, ((char *)slide, "\n\ Type unzip \"-Z\" for Unix style flags\n\ Remember that non-lowercase filespecs must be\ quoted in VMS (e.g., \"Makefile\").\n")); #endif /* !NO_ZIPINFO */ } else { /* UnZip mode */ Info(slide, flag, ((char *)slide, UnzipUsageLine1, UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, UZ_BETALEVEL, UZ_VERSION_DATE)); #ifdef BETA Info(slide, flag, ((char *)slide, BetaVersion, "", "")); #endif Info(slide, flag, ((char *)slide, "\ Usage: unzip file[.zip] [list] [/EXCL=(xlist)] [/DIR=exdir] /options /modifiers\ \n Default action is to extract files in list, except those in xlisiR` UNZIP.BCKbCW[UNZIP60.VMS]CMDLINE.C;1ZIP.IA64_OLB;1IVFt, to exdir\ ;\n file[.zip] may be a wildcard. %s\n\n", #ifdef NO_ZIPINFO "(ZipInfo mode is disabled in this version.)" #else "Type \"unzip /ZIPINFO\" for ZipInfo-mode usage." #endif )); Info(slide, flag, ((char *)slide, "\ Major options include (type unzip -h for Unix style flags):\n\ /[NO]TEST, /LIST, /[NO]SCREEN, /PIPE, /[NO]FRESHEN, /[NO]UPDATE,\n\ /[NO]COMMENT, /DIRECTORY=directory-spec, /EXCLUDE=(file-spec1,etc.)\n\n\ Modifiers include:\n\ /BRIEF, /FULL, /[NO]TEXT[=NONE|AUTO|ALL], /[NO]BINARY[=NONE|AUTO|ALL],\n\ /EXISTING={NEW_VERSION|OVERWRITE|NOEXTRACT}, /[NO]JUNK, /QUIET,\n\ /QUIET[=SUPER], /[NO]PAGE, /[NO]CASE_INSENSITIVE, /[NO]LOWERCASE,\n\ /[NO]VERSION, /RESTORE[=([NO]OWNER_PROT[,NODATE|DATE={ALL|FILES}])]\n\n")); Info(slide, flag, ((char *)slide, "\ Examples (see unzip.txt or \"HELP UNZIP\" for more info):\n\ unzip edit1 /EXCL=joe.jou /CASE_INSENSITIVE => Extract all files except\ \n\ joe.jou (or JOE.JOU, or any combination of case) from zipfile edit1.zip.\ \n \ unzip zip201 \"Makefile.VMS\" vms/*.[ch] => extract VMS Makefile and\ \n\ *.c and *.h files; must quote uppercase names if /CASE_INSENS not used.\ \n\ unzip foo /DIR=tmp:[.test] /JUNK /TEXT /EXIS=NEW => extract all files to\ \n\ tmp. dir., flatten hierarchy, auto-conv. text files, create new versions.\ \n")); } /* end if (zipinfo_mode) */ if (error) return PK_PARAM; else return PK_COOL; /* just wanted usage screen: no error */ } /* end function VMSCLI_usage() */ #endif /* ?SFX */ #endif /* !TEST */ *[UNZIP60.VMS]COLLECT_DEPS.COM;1+,dg./ 4@-W0123KPWO56789GHJ $! 1 December 2006. SMS. $! $! Info-ZIP VMS accessory procedure. $! $! For the product named by P1, $! collect all source file dependencies specified by P3, $! and add P4 prefix. $! Convert absolute dependencies to relative from one level above P5. $! P2 = output file specification. $! $! MMS /EXTENDED_SYNTAX can't easily pass a macro invocation for P4, so $! we remove any internal spaces which might have been added to prevent $! immediate evaluation of a macro invocation. $! $ prefix = f$edit( p4, "COLLAPSE") $! $ dev_lose = f$edit( f$parse( p5, , , "DEVICE", "SYNTAX_ONLY"), "UPCASE") $ dir_lose = f$edit( f$parse( p5, , , "DIRECTORY", "SYNTAX_ONLY"), "UPCASE") $ suffix = ".VMS]" $ suffix_loc = f$locate( suffix, dir_lose) $ if (suffix_loc .lt f$length( dir_lose)) $ then $ dev_dir_lose = dev_lose+ dir_lose- suffix $ else $ dev_dir_lose = dev_lose+ dir_lose- "]" $ endif $! $! For portability, make the output file record format Stream_LF. $! $ create /fdl = sys$input 'p2' RECORD Carriage_Control carriage_return Format stream_lf $! $ open /read /write /error = end_main deps_out 'p2' $ on error then goto loop_main_end $! $! Include proper-inclusion-check preface. $! $ incl_macro = "INCL_"+ f$parse( p2, , , "NAME", "SYNTAX_ONLY") $ write deps_out "#" $ write deps_out "# ''p1' for VMS - MMS (or MMK) Source Dependency File." $ write deps_out "#" $ write deps_out "" $ write deps_out - "# This description file is included by other description files. It is" $ write deps_out - "# not intended to be used alone. Verify proper inclusion." $ write deps_out "" $ write deps_out ".IFDEF ''incl_macro'" $ write deps_out ".ELSE" $ write deps_out - "$$$$ THIS DESCRIPTION FILE IS NOT INTENDED TO BE USED THIS WAY." $ write deps_out ".ENDIF" $ write deps_out "" $! $! Actual dependencies from individual dependency files. $! $ loop_main_top: $ file = f$search( p3) $ if (file .eqs. "") then goto loop_main_end $! $ open /read /error = end_subs deps_in 'file' $ loop_subs_top: $ read /error = loop_subs_end deps_in line $ line_reduced = f$edit( line, "COMPRESS, TRIM, UPCASE") $ colon = f$locate( " : ", line_reduced) $ d_d_l_loc = f$locate( dev_dir_lose, - f$extract( (colon+ 3), 1000, line_reduced)) $ if (d_d_l_loc .eq. 0) $ then $ front = f$extract( 0, (colon+ 3), line_reduced) $ back = f$extract( (colon+ 3+ f$length( dev_dir_lose)), - 1000, line_reduced) $ line = front+ "["+ back $ endif $ write deps_out "''prefix'"+ "''line'" $ goto loop_subs_top $! $ loop_subs_end: $ close deps_in $! $ goto loop_main_top $! $ loop_main_end: $ close deps_out $! $ end_main: $! *[UNZIP60.VMS]CONTENTS.;1+,Z./ 4 @-W0123KPWO56g#dէ7g#dէ89GHJContents of the "vms" sub-archive for UnZip 6.00 and later: Contents this file INSTALL.VMS VMS-specific build and install instructions NOTES.TXT description of new features in VMS Zip 3.0 and UnZip 6.0 README general VMS info about using UnZip and zipfiles UNZIP_MSG.MSG messages source for VMS built-in error message facility unzip_def.rnh UnZip default help page, RUNOFF format unzip_cli.help UnZip VMSCLI help page, TPU format unzipsfx.hlp UnZipSFX pre-formatted help page cvthelp.tpu TPU macro file to convert .help file to RUNOFF format cmdline.c VMS-style command-line-interface code (if VMSCLI defined) unz_cli.cld more VMS-command-line stuff (if VMSCLI defined) vms.c VMS file manipulation code vms.h VMS header file for UnZip vmscfg.h VMS-specific configuration settings vmsdefs.h VMS system declarations (missing C compiler support) build_unzip.com command file to build or (re-)link UnZip descrip.mms MMK/MMS makefile for UnZip/ZipInfo and UnZipSFX descrip_deps.mms MMK/MMS include file providing source dependencies descrip_mkdeps.mms MMK/MMS makefile for regenerating descrip_deps.mms descrip_src.mms MMK/MMS include file, provides environment setup collect_deps.com command file used in source dependencies creation mod_deps.com command file used in source dependencies creation unzip.opt options file used for linking unzip unzipsfx.opt options file used for linking unzipsfx makesfx.com command file to create self-extracting archives unixio_gcc.h unixio.h system header replacement for gcc unixlib_gcc.h unixlib.h system header replacement for gcc bzlib.h VMS wrapper header file for the bzip2 library definitions find_bzip2_lib.com command procedure to set up environment for bzip2 support infback9.h VMS wrapper header file for zlib infl UNZIP.BCKZW[UNZIP60.VMS]CONTENTS.;1ZIP.IA64_OLB;1Eate64 definitions zlib.h VMS wrapper header file for zlib library definitions MAKE/VMS is no longer supported since MMK (MMS clone by Matt Madison/MadGoat Enterprises, compatible with descrip.mms) is both free and becoming quite popular. MMK is available by anonymous ftp from ftp.spc.edu/ftp.wku.edu and by mailserver at lists.wku.edu. Check VMS newsgroups for announcements and exact location. Detailed compilation and installation instructions can be found in the INSTALL.VMS file in this directory. *[UNZIP60.VMS]CVTHELP.TPU;1+,c. / 4 K@-W0123KPWO 56Hٮu7Hٮu89GHJ! TITLE CVTHELP.TPU ! IDENT 01-001 ! !++ ! Copyright (c) 1990-2001 Info-ZIP. All rights reserved. ! ! See the accompanying file LICENSE, version 2000-Apr-09 or later ! (the contents of which are also included in zip.h) for terms of use. ! If, for some reason, all these files are missing, the Info-ZIP license ! also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html ! !++ ! ! Program: CVTHELP.TPU ! ! Author: Hunter Goatley ! ! Date: January 12, 1992 ! ! Purpose: Convert .HELP files to RUNOFF .RNH files. Substitutes ! RUNOFF commands for tags imbedded in the .HELP file. ! ! Calling sequence: ! ! $ EDIT/TPU/NOJOURNAL/NODISPLAY/COMMAND=CVTHELP file.HELP ! ! Modified by: ! ! 01-001 Hunter Goatley 7-FEB-2001 15:40 ! Added for qualifier separators. ! ! 01-000 Hunter Goatley 12-JAN-1992 15:15 ! Original version. ! !-- Procedure eve_convert_help Local temp ,x ; qualifier_level := 0; hg$substitute_topic(current_buffer, "

", ".indent-3", "1"); hg$substitute_topic(current_buffer, "", ".sk;.indent-3", ""); hg$substitute_topic(current_buffer, "", ".indent-3", "2"); hg$substitute_topic(current_buffer, "", ".indent-3", "3"); hg$substitute_topic(current_buffer, "", ".indent-3", "4"); hg$substitute_comment(current_buffer,"",".indent-3;2 Qualifiers"); hg$substitute_comment(current_buffer,"",".indent-2"); hg$substitute_comment(current_buffer,"",".lm+3"); hg$substitute_comment(current_buffer,"",".lm-3"); hg$substitute_comment(current_buffer,"",".lm+4"); hg$substitute_comment(current_buffer,"",".lm-4"); hg$substitute_comment(current_buffer,"",".noflags;.lm3;.rm70"); hg$substitute_comment(current_buffer,"",".lm+4;.literal"); hg$substitute_comment(current_buffer,"",".end literal;.lm-4"); hg$substitute_comment(current_buffer,"",'.list 1,"o"'); hg$substitute_comment(current_buffer,"",'.list 0,"o"'); hg$substitute_comment(current_buffer,"",".le"); hg$substitute_comment(current_buffer,"",".end list"); hg$substitute_comment(current_buffer,"
",".center"); hg$substitute_comment(current_buffer,"",".sk;.indent2"); hg$substitute_comment(current_buffer,"",".note"); hg$substitute_comment(current_buffer,"",".end note"); hg$substitute_comment(current_buffer, LINE_BEGIN & LINE_END,".sk"); hg$substitute_comment(current_buffer, LINE_BEGIN & "|", ""); hg$substitute_comment(current_buffer,"",".br"); EndProcedure; ! eve_convert_help Procedure hg$substitute_comment (the_buffer, target, new) Local temp ,save_pos ,x ; on_error; endon_error; save_pos := mark(none); position(beginning_of(the_buffer)); loop x := search(target, forward); exitif x = 0; position (x); erase_character(length(x)); copy_text(new); endloop; position(save_pos); EndProcedure; ! hg$substitute_comment Procedure hg$substitute_topic (the_buffer, target, new, level) Local temp ,save_pos ,x ; on_error; endon_error; save_pos := mark(none); position(beginning_of(the_buffer)); loop x := search(target, forward); exitif x = 0; position (x); erase_character(length(x)); move_vertical(-1); if (length(current_line) = 0) then copy_text("|"); endif; move_vertical(1); copy_text(".!------------------------------------------------------"); split_line; copy_text(new); move_horizontal(-current_offset); move_vertical(1); if level <> "" then copy_text(level + " "); ! else ! if qualifier_level = 0 ! then ! copy_text("2 Qualifiers"); ! split_line; split_line; ! copy_text(new); split_line; ! qualifier_level := 1; ! endif; endif; move_horizontal(-current_offset); move_vertical(1); if length(current_line) = 0 then if (target = "
") OR (target = "") OR (target = "") or (target = "") then copy_text(".br"); else copy_text(".sk"); endif; endif; endloop; position(save_pos); EndProcedure; ! hg$substitute_topic !=============================================================================== Procedure tpu$init_procedure Local temp ,orig_filespec ,f ; on_error endon_error; !Prompt user for information orig_filespec := get_info(command_line, "file_name"); if orig_filespec = "" then message("No .HELP file given"); quit; endif; f := file_parse(orig_filespec, ".HELP"); !Add .LIS ending ! Create a buffer and window for editing main_buf := create_buffer ("MAIN",f); set (eob_text, main_buf, "[End of buffer]"); position (beginning_of(main_buf)); eve_convert_help; f := file_parse(orig_filespec,"","",NAME); write_file (main_buf, f+".RNH"); quit; EndProcedure; !TPU$INIT_PROCEDURE tpu$init_procedure; *[UNZIP60.VMS]DESCRIP.MMS;1+,f./ 4@-W0123KPWO56}7}89GHJ# 1 March 2009. SMS. # # UnZip 6.0 for VMS - MMS (or MMK) Description File. # # Usage: # # MMS /DESCRIP = [.VMS]DESCRIP.MMS [/MACRO = ()] [target] # # Note that this description file must be used from the main # distribution directory, not from the [.VMS] subdirectory. # # Optional macros: # # USEBZ2=1 Build with optional BZIP2 support. This macro # is a shortcut for IZ_BZIP2=SYS$DISK:[.BZIP2]. # AdT7 UNZIP.BCKfW[UNZIP60.VMS]DESCRIP.MMS;1P.IA64_OLB;1Xditionally, it forces invokation of the UnZip-supplied # bzip2 make script provided in [.bzip2]descrbz2.mms. # This results in a "single-command" build of UnZip with # bzip2 support directly from the sources. # # IZ_BZIP2=dev:[dir] Build with optional BZIP2 support. The value # of the MMS macro, ("dev:[dir]", or a suitable # logical name) tells where to find "bzlib.h". The # BZIP2 object library (LIBBZ2_NS.OLB) is expected to # be in a "[.dest]" directory under that one # ("dev:[dir.ALPHAL]", for example), or in that # directory itself. # By default, the SFX programs are built without BZIP2 # support. Add "BZIP2_SFX=1" to the LOCAL_UNZIP C # macros to enable it. (See LOCAL_UNZIP, below.) # # IZ_ZLIB=dev:[dir] Use ZLIB compression library instead of internal # compression routines. The value of the MMS # macro ("dev:[dir]", or a suitable logical name) # tells where to find "zlib.h". The ZLIB object # library (LIBZ.OLB) is expected to be in a # "[.dest]" directory under that one # ("dev:[dir.ALPHAL]", for example), or in that # directory itself. # # CCOPTS=xxx Compile with CC options xxx. For example: # CCOPTS=/ARCH=HOST # # DBG=1 Compile with /DEBUG /NOOPTIMIZE. # Link with /DEBUG /TRACEBACK. # (Default is /NOTRACEBACK.) # # LARGE=1 Enable large-file (>2GB) support. Non-VAX only. # # LINKOPTS=xxx Link with LINK options xxx. For example: # LINKOPTS=/NOINFO # # LIST=1 Compile with /LIST /SHOW = (ALL, NOMESSAGES). # Link with /MAP /CROSS_REFERENCE /FULL. # # NOSHARE=1 Link /NOSYSSHR (not using shareable images). # NOSHARE=OLDVAX Link /NOSYSSHR on VAX for: # DEC C with VMS before V7.3. # VAX C without DEC C RTL (DEC C not installed). # # "LOCAL_UNZIP= c_macro_1=value1 [, c_macro_2=value2 [...]]" # Compile with these additional C macros defined. # # VAX-specific optional macros: # # VAXC=1 Use the VAX C compiler, assuming "CC" runs it. # (That is, DEC C is not installed, or else DEC C is # installed, but VAX C is the default.) # # FORCE_VAXC=1 Use the VAX C compiler, assuming "CC /VAXC" runs it. # (That is, DEC C is installed, and it is the # default, but you want VAX C anyway, you fool.) # # GNUC=1 Use the GNU C compiler. (Seriously under-tested.) # # # The default target, ALL, builds the selected product executables and # help files. # # Other targets: # # CLEAN deletes architecture-specific files, but leaves any # individual source dependency files and the help files. # # CLEAN_ALL deletes all generated files, except the main (collected) # source dependency file. # # CLEAN_EXE deletes only the architecture-specific executables. # Handy if all you wish to do is re-link the executables. # # Example commands: # # To build the conventional small-file product using the DEC/Compaq/HP C # compiler (Note: DESCRIP.MMS is the default description file name.): # # MMS /DESCRIP = [.VMS] # # To get the large-file executables (on a non-VAX system): # # MMS /DESCRIP = [.VMS] /MACRO = (LARGE=1) # # To delete the architecture-specific generated files for this system # type: # # MMS /DESCRIP = [.VMS] /MACRO = (LARGE=1) CLEAN ! Large-file. # or # MMS /DESCRIP = [.VMS] CLEAN ! Small-file. # # To build a complete small-file product for debug with compiler # listings and link maps: # # MMS /DESCRIP = [.VMS] CLEAN # MMS /DESCRIP = [.VMS] /MACRO = (DBG=1, LIST=1) # ######################################################################## # Include primary product description file. INCL_DESCRIP_SRC = 1 .INCLUDE [.VMS]DESCRIP_SRC.MMS # Object library names. LIB_UNZIP = SYS$DISK:[.$(DEST)]UNZIP.OLB LIB_UNZIP_CLI = SYS$DISK:[.$(DEST)]UNZIPCLI.OLB LIB_UNZIPSFX = SYS$DISK:[.$(DEST)]UNZIPSFX.OLB LIB_UNZIPSFX_CLI = SYS$DISK:[.$(DEST)]UNZSFXCLI.OLB # Help file names. UNZIP_HELP = UNZIP.HLP UNZIP_CLI.HLP # Message file names. UNZIP_MSG_MSG = [.VMS]UNZIP_MSG.MSG UNZIP_MSG_EXE = [.$(DEST)]UNZIP_MSG.EXE UNZIP_MSG_OBJ = [.$(DEST)]UNZIP_MSG.OBJ # TARGETS. # Default target, ALL. Build All executables, # and help files. ALL : $(UNZIP) $(UNZIP_CLI) $(UNZIPSFX) $(UNZIPSFX_CLI) $(UNZIP_HELP) \ $(UNZIP_MSG_EXE) @ write sys$output "Done." # CLEAN target. Delete the [.$(DEST)] directory and everything in it. CLEAN : if (f$search( "[.$(DEST)]*.*") .nes. "") then - delete [.$(DEST)]*.*;* if (f$search( "$(DEST).dir") .nes. "") then - set protection = w:d $(DEST).dir;* if (f$search( "$(DEST).dir") .nes. "") then - delete $(DEST).dir;* # CLEAN_ALL target. Delete: # The [.$(DEST)] directories and everything in them. # All help-related derived files, # All individual C dependency files. # Also mention: # Comprehensive dependency file. # CLEAN_ALL : if (f$search( "[.ALPHA*]*.*") .nes. "") then - delete [.ALPHA*]*.*;* if (f$search( "ALPHA*.dir", 1) .nes. "") then - set protection = w:d ALPHA*.dir;* if (f$search( "ALPHA*.dir", 2) .nes. "") then - delete ALPHA*.dir;* if (f$search( "[.IA64*]*.*") .nes. "") then - delete [.IA64*]*.*;* if (f$search( "IA64*.dir", 1) .nes. "") then - set protection = w:d IA64*.dir;* if (f$search( "IA64*.dir", 2) .nes. "") then - delete IA64*.dir;* if (f$search( "[.VAX*]*.*") .nes. "") then - delete [.VAX*]*.*;* if (f$search( "VAX*.dir", 1) .nes. "") then - set protection = w:d VAX*.dir;* if (f$search( "VAX*.dir", 2) .nes. "") then - delete VAX*.dir;* if (f$search( "[.VMS]UNZIP_CLI.RNH") .nes. "") then - delete [.VMS]UNZIP_CLI.RNH;* if (f$search( "UNZIP_CLI.HLP") .nes. "") then - delete UNZIP_CLI.HLP;* if (f$search( "UNZIP.HLP") .nes. "") then - delete UNZIP.HLP;* if (f$search( "*.MMSD") .nes. "") then - delete *.MMSD;* if (f$search( "[.VMS]*.MMSD") .nes. "") then - delete [.VMS]*.MMSD;* @ write sys$output "" @ write sys$output "Note: This procedure will not" @ write sys$output " DELETE [.VMS]DESCRIP_DEPS.MMS;*" @ write sys$output - "You may choose to, but a recent version of MMS (V3.5 or newer?) is" @ write sys$output - "needed to regenerate it. (It may also be recovered from the original" @ write sys$output - "distribution kit.) See [.VMS]DESCRIP_MKDEPS.MMS for instructions on" @ write sys$output - "generating [.VMS]DESCRIP_DEPS.MMS." @ write sys$output "" # CLEAN_EXE target. Delete the executables in [.$(DEST)]. CLEAN_EXE : if (f$search( "[.$(DEST)]*.EXE") .nes. "") then - delete [.$(DEST)]*.EXE;* # Object library module dependencies. $(LIB_UNZIP) : $(LIB_UNZIP)($(MODS_OBJS_LIB_UNZIP)) @ write sys$output "$(MMS$TARGET) updated." $(LIB_UNZIP_CLI) : $(LIB_UNZIP_CLI)($(MODS_OBJS_LIB_UNZIP_CLI)) @ write sys$output "$(MMS$TARGET) updated." $(LIB_UNZIPSFX) : $(LIB_UNZIPSFX)($(MODS_OBJS_LIB_UNZIPSFX)) @ write sys$output "$(MMS$TARGET) updated." $(LIB_UNZIPSFX_CLI) : $(LIB_UNZIPSFX_CLI)($(MODS_OBJS_LIB_UNZIPSFX_CLI)) @ write sys$output "$(MMS$TARGET) updated." # Module ID options files. OPT_ID = SYS$DISK:[.VMS]UNZIP.OPT OPT_ID_SFX = SYS$DISK:[.VMS]UNZIPSFX.OPT # Def' UNZIP.BCKfW[UNZIP60.VMS]DESCRIP.MMS;1P.IA64_OLB;1ault C compile rule. .C.OBJ : $(CC) $(CFLAGS) $(CDEFS_UNX) $(MMS$SOURCE) # Normal sources in [.VMS]. [.$(DEST)]VMS.OBJ : [.VMS]VMS.C # Command-line interface files. [.$(DEST)]CMDLINE.OBJ : [.VMS]CMDLINE.C $(CC) $(CFLAGS) $(CDEFS_CLI) $(MMS$SOURCE) [.$(DEST)]UNZIPCLI.OBJ : UNZIP.C $(CC) $(CFLAGS) $(CDEFS_CLI) $(MMS$SOURCE) [.$(DEST)]UNZ_CLI.OBJ : [.VMS]UNZ_CLI.CLD # SFX variant sources. [.$(DEST)]CRC32_.OBJ : CRC32.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]CRYPT_.OBJ : CRYPT.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]EXTRACT_.OBJ : EXTRACT.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]FILEIO_.OBJ : FILEIO.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]GLOBALS_.OBJ : GLOBALS.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]INFLATE_.OBJ : INFLATE.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]MATCH_.OBJ : MATCH.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]PROCESS_.OBJ : PROCESS.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]TTYIO_.OBJ : TTYIO.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]UBZ2ERR_.OBJ : UBZ2ERR.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]VMS_.OBJ : [.VMS]VMS.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) [.$(DEST)]UNZIPSFX.OBJ : UNZIP.C $(CC) $(CFLAGS) $(CDEFS_SFX) $(MMS$SOURCE) # SFX CLI variant sources. [.$(DEST)]CMDLINE_.OBJ : [.VMS]CMDLINE.C $(CC) $(CFLAGS) $(CDEFS_SFX_CLI) $(MMS$SOURCE) [.$(DEST)]UNZSFXCLI.OBJ : UNZIP.C $(CC) $(CFLAGS) $(CDEFS_SFX_CLI) $(MMS$SOURCE) # VAX C LINK options file. .IFDEF OPT_FILE $(OPT_FILE) : open /write opt_file_ln $(OPT_FILE) write opt_file_ln "SYS$SHARE:VAXCRTL.EXE /SHARE" close opt_file_ln .ENDIF # Local BZIP2 object library. $(LIB_BZ2_LOCAL) : $(MMS) $(MMSQUALIFIERS) /DESCR=$(IZ_BZIP2)descrbz2.mms'macro' - /MACRO = (SRCDIR=$(IZ_BZIP2), DSTDIR=$(BZ2DIR_BIN), - DEST=$(IZ_BZIP2)$(DESTM)) $(MMSTARGETS) # Normal UnZip executable. $(UNZIP) : [.$(DEST)]UNZIP.OBJ \ $(LIB_UNZIP) $(LIB_BZ2_DEP) $(OPT_FILE) $(OPT_ID) $(LINK) $(LINKFLAGS) $(MMS$SOURCE), - $(LIB_UNZIP) /library, - $(LIB_BZIP2_OPTS) - $(LIB_UNZIP) /library, - $(LIB_ZLIB_OPTS) - $(LFLAGS_ARCH) - $(OPT_ID) /options - $(NOSHARE_OPTS) # CLI UnZip executable. $(UNZIP_CLI) : [.$(DEST)]UNZIPCLI.OBJ \ $(LIB_UNZIP_CLI) $(LIB_BZ2_DEP) $(OPT_FILE) $(OPT_ID) $(LINK) $(LINKFLAGS) $(MMS$SOURCE), - $(LIB_UNZIP_CLI) /library, - $(LIB_UNZIP) /library, - $(LIB_BZIP2_OPTS) - $(LIB_UNZIP) /library, - $(LIB_ZLIB_OPTS) - $(LFLAGS_ARCH) - $(OPT_ID) /options - $(NOSHARE_OPTS) # SFX UnZip executable. $(UNZIPSFX) : [.$(DEST)]UNZIPSFX.OBJ \ $(LIB_UNZIPSFX) $(LIB_BZ2_DEP) $(OPT_FILE) $(OPT_ID_SFX) $(LINK) $(LINKFLAGS) $(MMS$SOURCE), - $(LIB_UNZIPSFX) /library, - $(LIB_BZIP2_OPTS) - $(LIB_UNZIPSFX) /library, - $(LIB_ZLIB_OPTS) - $(LFLAGS_ARCH) - $(OPT_ID_SFX) /options - $(NOSHARE_OPTS) # SFX CLI UnZip executable. $(UNZIPSFX_CLI) : [.$(DEST)]UNZSFXCLI.OBJ \ $(LIB_UNZIPSFX_CLI) $(LIB_UNZIPSFX) $(LIB_BZ2_DEP) \ $(OPT_FILE) $(OPT_ID_SFX) $(LINK) $(LINKFLAGS) $(MMS$SOURCE), - $(LIB_UNZIPSFX_CLI) /library, - $(LIB_UNZIPSFX) /library, - $(LIB_BZIP2_OPTS) - $(LIB_UNZIPSFX) /library, - $(LIB_ZLIB_OPTS) - $(LFLAGS_ARCH) - $(OPT_ID_SFX) /options - $(NOSHARE_OPTS) # Help files. UNZIP.HLP : [.VMS]UNZIP_DEF.RNH runoff /output = $(MMS$TARGET) $(MMS$SOURCE) UNZIP_CLI.HLP : [.VMS]UNZIP_CLI.HELP [.VMS]CVTHELP.TPU edit /tpu /nosection /nodisplay /command = [.VMS]CVTHELP.TPU - $(MMS$SOURCE) rename UNZIP_CLI.RNH [.VMS] purge /nolog /keep = 1 [.VMS]UNZIP_CLI.RNH runoff /output = $(MMS$TARGET) [.VMS]UNZIP_CLI.RNH # Message file. $(UNZIP_MSG_EXE) : $(UNZIP_MSG_OBJ) link /shareable = $(MMS$TARGET) $(UNZIP_MSG_OBJ) $(UNZIP_MSG_OBJ) : $(UNZIP_MSG_MSG) message /object = $(MMS$TARGET) /nosymbols $(UNZIP_MSG_MSG) # Include generated source dependencies. INCL_DESCRIP_DEPS = 1 .INCLUDE [.VMS]DESCRIP_DEPS.MMS *[UNZIP60.VMS]DESCRIP_DEPS.MMS;1+,g./ 4m@-W0123KPWO560+B70+B89GHJ # # UnZip for VMS - MMS (or MMK) Source Dependency File. # # This description file is included by other description files. It is # not intended to be used alone. Verify proper inclusion. .IFDEF INCL_DESCRIP_DEPS .ELSE $$$$ THIS DESCRIPTION FILE IS NOT INTENDED TO BE USED THIS WAY. .ENDIF [.$(DEST)]CRC32.OBJ : []CRC32.C [.$(DEST)]CRC32.OBJ : []ZIP.H [.$(DEST)]CRC32.OBJ : []UNZIP.H [.$(DEST)]CRC32.OBJ : []UNZPRIV.H [.$(DEST)]CRC32.OBJ : [.VMS]VMSCFG.H [.$(DEST)]CRC32.OBJ : []GLOBALS.H [.$(DEST)]CRC32.OBJ : []CRC32.H [.$(DEST)]CRC32_.OBJ : []CRC32.C [.$(DEST)]CRC32_.OBJ : []ZIP.H [.$(DEST)]CRC32_.OBJ : []UNZIP.H [.$(DEST)]CRC32_.OBJ : []UNZPRIV.H [.$(DEST)]CRC32_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]CRC32_.OBJ : []GLOBALS.H [.$(DEST)]CRC32_.OBJ : []CRC32.H [.$(DEST)]CRYPT.OBJ : []CRYPT.C [.$(DEST)]CRYPT.OBJ : []ZIP.H [.$(DEST)]CRYPT.OBJ : []UNZIP.H [.$(DEST)]CRYPT.OBJ : []UNZPRIV.H [.$(DEST)]CRYPT.OBJ : [.VMS]VMSCFG.H [.$(DEST)]CRYPT.OBJ : []GLOBALS.H [.$(DEST)]CRYPT.OBJ : []CRYPT.H [.$(DEST)]CRYPT.OBJ : []TTYIO.H [.$(DEST)]CRYPT.OBJ : []CRC32.H [.$(DEST)]CRYPT_.OBJ : []CRYPT.C [.$(DEST)]CRYPT_.OBJ : []ZIP.H [.$(DEST)]CRYPT_.OBJ : []UNZIP.H [.$(DEST)]CRYPT_.OBJ : []UNZPRIV.H [.$(DEST)]CRYPT_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]CRYPT_.OBJ : []GLOBALS.H [.$(DEST)]CRYPT_.OBJ : []CRYPT.H [.$(DEST)]CRYPT_.OBJ : []TTYIO.H [.$(DEST)]CRYPT_.OBJ : []CRC32.H [.$(DEST)]ENVARGS.OBJ : []ENVARGS.C [.$(DEST)]ENVARGS.OBJ : []UNZIP.H [.$(DEST)]ENVARGS.OBJ : []UNZPRIV.H [.$(DEST)]ENVARGS.OBJ : [.VMS]VMSCFG.H [.$(DEST)]ENVARGS.OBJ : []GLOBALS.H [.$(DEST)]EXPLODE.OBJ : []EXPLODE.C [.$(DEST)]EXPLODE.OBJ : []UNZIP.H [.$(DEST)]EXPLODE.OBJ : []UNZPRIV.H [.$(DEST)]EXPLODE.OBJ : [.VMS]VMSCFG.H [.$(DEST)]EXPLODE.OBJ : []GLOBALS.H [.$(DEST)]EXTRACT.OBJ : []EXTRACT.C [.$(DEST)]EXTRACT.OBJ : []UNZIP.H [.$(DEST)]EXTRACT.OBJ : []UNZPRIV.H [.$(DEST)]EXTRACT.OBJ : [.VMS]VMSCFG.H [.$(DEST)]EXTRACT.OBJ : []GLOBALS.H [.$(DEST)]EXTRACT.OBJ : []CRC32.H [.$(DEST)]EXTRACT.OBJ : []ZIP.H [.$(DEST)]EXTRACT.OBJ : []CRYPT.H [.$(DEST)]EXTRACT_.OBJ : []EXTRACT.C [.$(DEST)]EXTRACT_.OBJ : []UNZIP.H [.$(DEST)]EXTRACT_.OBJ : []UNZPRIV.H [.$(DEST)]EXTRACT_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]EXTRACT_.OBJ : []GLOBALS.H [.$(DEST)]EXTRACT_.OBJ : []CRC32.H [.$(DEST)]EXTRACT_.OBJ : []ZIP.H [.$(DEST)]EXTRACT_.OBJ : []CRYPT.H [.$(DEST)]FILEIO.OBJ : []FILEIO.C [.$(DEST)]FILEIO.OBJ : []UNZIP.H [.$(DEST)]FILEIO.OBJ : []UNZPRIV.H [.$(DEST)]FILEIO.OBJ : [.VMS]VMSCFG.H [.$(DEST)]FILEIO.OBJ : []GLOBALS.H [.$(DEST)]FILEIO.OBJ : []CRC32.H [.$(DEST)]FILEIO.OBJ : []ZIP.H [.$(DEST)]FILEIO.OBJ : []CRYPT.H [.$(DEST)]FILEIO.OBJ : []TTYIO.H [.$(DEST)]FILEIO.OBJ : []EBCDIC.H [.$(DEST)]FILEIO_.OBJ : []FILEIO.C [.$(DEST)]FILEIO_.OBJ : []UNZIP.H [.$(DEST)]FILEIO_.OBJ : []UNZPRIV.H [.$(DEST)]FILEIO_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]FILEIO_.OBJ : []GLOBALS.H [.$(DEST)]FILEIO_.OBJ : []CRC32.H [.$(DEST)]FILEIO_.OBJ : []ZIP.H [.$(DEST)]FILEIO_.OBJ : []CRYPT.H [.$(DEST)]FILEIO_.OBJ : []TTYIO.H [.$(DEST)]FILEIO_.OBJ : []EBCDIC.H [.$(DEST)]GLOBALS.OBJ : []GLOBALS.C [.$(DEST)]GLOBALS.OBJ : []UNZIP.H [.$(DEST)]GLOBALS.OB5 UNZIP.BCKgW[UNZIP60.VMS]DESCRIP_DEPS.MMS;14_OLB;1:J : []UNZPRIV.H [.$(DEST)]GLOBALS.OBJ : [.VMS]VMSCFG.H [.$(DEST)]GLOBALS.OBJ : []GLOBALS.H [.$(DEST)]GLOBALS_.OBJ : []GLOBALS.C [.$(DEST)]GLOBALS_.OBJ : []UNZIP.H [.$(DEST)]GLOBALS_.OBJ : []UNZPRIV.H [.$(DEST)]GLOBALS_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]GLOBALS_.OBJ : []GLOBALS.H [.$(DEST)]INFLATE.OBJ : []INFLATE.C [.$(DEST)]INFLATE.OBJ : []INFLATE.H [.$(DEST)]INFLATE.OBJ : []UNZIP.H [.$(DEST)]INFLATE.OBJ : []UNZPRIV.H [.$(DEST)]INFLATE.OBJ : [.VMS]VMSCFG.H [.$(DEST)]INFLATE.OBJ : []GLOBALS.H [.$(DEST)]INFLATE_.OBJ : []INFLATE.C [.$(DEST)]INFLATE_.OBJ : []INFLATE.H [.$(DEST)]INFLATE_.OBJ : []UNZIP.H [.$(DEST)]INFLATE_.OBJ : []UNZPRIV.H [.$(DEST)]INFLATE_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]INFLATE_.OBJ : []GLOBALS.H [.$(DEST)]LIST.OBJ : []LIST.C [.$(DEST)]LIST.OBJ : []UNZIP.H [.$(DEST)]LIST.OBJ : []UNZPRIV.H [.$(DEST)]LIST.OBJ : [.VMS]VMSCFG.H [.$(DEST)]LIST.OBJ : []GLOBALS.H [.$(DEST)]MATCH.OBJ : []MATCH.C [.$(DEST)]MATCH.OBJ : []UNZIP.H [.$(DEST)]MATCH.OBJ : []UNZPRIV.H [.$(DEST)]MATCH.OBJ : [.VMS]VMSCFG.H [.$(DEST)]MATCH.OBJ : []GLOBALS.H [.$(DEST)]MATCH_.OBJ : []MATCH.C [.$(DEST)]MATCH_.OBJ : []UNZIP.H [.$(DEST)]MATCH_.OBJ : []UNZPRIV.H [.$(DEST)]MATCH_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]MATCH_.OBJ : []GLOBALS.H [.$(DEST)]PROCESS.OBJ : []PROCESS.C [.$(DEST)]PROCESS.OBJ : []UNZIP.H [.$(DEST)]PROCESS.OBJ : []UNZPRIV.H [.$(DEST)]PROCESS.OBJ : [.VMS]VMSCFG.H [.$(DEST)]PROCESS.OBJ : []GLOBALS.H [.$(DEST)]PROCESS.OBJ : []CRC32.H [.$(DEST)]PROCESS.OBJ : []ZIP.H [.$(DEST)]PROCESS_.OBJ : []PROCESS.C [.$(DEST)]PROCESS_.OBJ : []UNZIP.H [.$(DEST)]PROCESS_.OBJ : []UNZPRIV.H [.$(DEST)]PROCESS_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]PROCESS_.OBJ : []GLOBALS.H [.$(DEST)]PROCESS_.OBJ : []CRC32.H [.$(DEST)]PROCESS_.OBJ : []ZIP.H [.$(DEST)]TTYIO.OBJ : []TTYIO.C [.$(DEST)]TTYIO.OBJ : []ZIP.H [.$(DEST)]TTYIO.OBJ : []UNZIP.H [.$(DEST)]TTYIO.OBJ : []UNZPRIV.H [.$(DEST)]TTYIO.OBJ : [.VMS]VMSCFG.H [.$(DEST)]TTYIO.OBJ : []GLOBALS.H [.$(DEST)]TTYIO.OBJ : []CRYPT.H [.$(DEST)]TTYIO.OBJ : []TTYIO.H [.$(DEST)]TTYIO_.OBJ : []TTYIO.C [.$(DEST)]TTYIO_.OBJ : []ZIP.H [.$(DEST)]TTYIO_.OBJ : []UNZIP.H [.$(DEST)]TTYIO_.OBJ : []UNZPRIV.H [.$(DEST)]TTYIO_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]TTYIO_.OBJ : []GLOBALS.H [.$(DEST)]TTYIO_.OBJ : []CRYPT.H [.$(DEST)]TTYIO_.OBJ : []TTYIO.H [.$(DEST)]UBZ2ERR.OBJ : []UBZ2ERR.C [.$(DEST)]UBZ2ERR.OBJ : []UNZIP.H [.$(DEST)]UBZ2ERR.OBJ : []UNZPRIV.H [.$(DEST)]UBZ2ERR.OBJ : [.VMS]VMSCFG.H [.$(DEST)]UBZ2ERR.OBJ : []GLOBALS.H [.$(DEST)]UBZ2ERR_.OBJ : []UBZ2ERR.C [.$(DEST)]UBZ2ERR_.OBJ : []UNZIP.H [.$(DEST)]UBZ2ERR_.OBJ : []UNZPRIV.H [.$(DEST)]UBZ2ERR_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]UBZ2ERR_.OBJ : []GLOBALS.H [.$(DEST)]UNREDUCE.OBJ : []UNREDUCE.C [.$(DEST)]UNREDUCE.OBJ : []UNZIP.H [.$(DEST)]UNREDUCE.OBJ : []UNZPRIV.H [.$(DEST)]UNREDUCE.OBJ : [.VMS]VMSCFG.H [.$(DEST)]UNREDUCE.OBJ : []GLOBALS.H [.$(DEST)]UNSHRINK.OBJ : []UNSHRINK.C [.$(DEST)]UNSHRINK.OBJ : []UNZIP.H [.$(DEST)]UNSHRINK.OBJ : []UNZPRIV.H [.$(DEST)]UNSHRINK.OBJ : [.VMS]VMSCFG.H [.$(DEST)]UNSHRINK.OBJ : []GLOBALS.H [.$(DEST)]UNZIP.OBJ : []UNZIP.C [.$(DEST)]UNZIP.OBJ : []UNZIP.H [.$(DEST)]UNZIP.OBJ : []UNZPRIV.H [.$(DEST)]UNZIP.OBJ : [.VMS]VMSCFG.H [.$(DEST)]UNZIP.OBJ : []GLOBALS.H [.$(DEST)]UNZIP.OBJ : []CRYPT.H [.$(DEST)]UNZIP.OBJ : []UNZVERS.H [.$(DEST)]UNZIP.OBJ : []CONSTS.H [.$(DEST)]UNZIPSFX.OBJ : []UNZIP.C [.$(DEST)]UNZIPSFX.OBJ : []UNZIP.H [.$(DEST)]UNZIPSFX.OBJ : []UNZPRIV.H [.$(DEST)]UNZIPSFX.OBJ : [.VMS]VMSCFG.H [.$(DEST)]UNZIPSFX.OBJ : []GLOBALS.H [.$(DEST)]UNZIPSFX.OBJ : []CRYPT.H [.$(DEST)]UNZIPSFX.OBJ : []UNZVERS.H [.$(DEST)]UNZIPSFX.OBJ : []CONSTS.H [.$(DEST)]UNZIPSFX_CLI.OBJ : []UNZIP.C [.$(DEST)]UNZIPSFX_CLI.OBJ : []UNZIP.H [.$(DEST)]UNZIPSFX_CLI.OBJ : []UNZPRIV.H [.$(DEST)]UNZIPSFX_CLI.OBJ : [.VMS]VMSCFG.H [.$(DEST)]UNZIPSFX_CLI.OBJ : []GLOBALS.H [.$(DEST)]UNZIPSFX_CLI.OBJ : []CRYPT.H [.$(DEST)]UNZIPSFX_CLI.OBJ : []UNZVERS.H [.$(DEST)]UNZIPSFX_CLI.OBJ : []CONSTS.H [.$(DEST)]UNZIP_CLI.OBJ : []UNZIP.C [.$(DEST)]UNZIP_CLI.OBJ : []UNZIP.H [.$(DEST)]UNZIP_CLI.OBJ : []UNZPRIV.H [.$(DEST)]UNZIP_CLI.OBJ : [.VMS]VMSCFG.H [.$(DEST)]UNZIP_CLI.OBJ : []GLOBALS.H [.$(DEST)]UNZIP_CLI.OBJ : []CRYPT.H [.$(DEST)]UNZIP_CLI.OBJ : []UNZVERS.H [.$(DEST)]UNZIP_CLI.OBJ : []CONSTS.H [.$(DEST)]ZIPINFO.OBJ : []ZIPINFO.C [.$(DEST)]ZIPINFO.OBJ : []UNZIP.H [.$(DEST)]ZIPINFO.OBJ : []UNZPRIV.H [.$(DEST)]ZIPINFO.OBJ : [.VMS]VMSCFG.H [.$(DEST)]ZIPINFO.OBJ : []GLOBALS.H [.$(DEST)]CMDLINE.OBJ : [.VMS]CMDLINE.C [.$(DEST)]CMDLINE.OBJ : []UNZIP.H [.$(DEST)]CMDLINE.OBJ : []UNZPRIV.H [.$(DEST)]CMDLINE.OBJ : [.VMS]VMSCFG.H [.$(DEST)]CMDLINE.OBJ : []GLOBALS.H [.$(DEST)]CMDLINE.OBJ : []UNZVERS.H [.$(DEST)]VMS.OBJ : [.VMS]VMS.C [.$(DEST)]VMS.OBJ : []UNZIP.H [.$(DEST)]VMS.OBJ : []UNZPRIV.H [.$(DEST)]VMS.OBJ : [.VMS]VMSCFG.H [.$(DEST)]VMS.OBJ : []GLOBALS.H [.$(DEST)]VMS.OBJ : []CRC32.H [.$(DEST)]VMS.OBJ : []ZIP.H [.$(DEST)]VMS.OBJ : []UNZIP.H [.$(DEST)]VMS.OBJ : [.VMS]VMS.H [.$(DEST)]VMS.OBJ : [.VMS]VMSDEFS.H [.$(DEST)]VMS_.OBJ : [.VMS]VMS.C [.$(DEST)]VMS_.OBJ : []UNZIP.H [.$(DEST)]VMS_.OBJ : []UNZPRIV.H [.$(DEST)]VMS_.OBJ : [.VMS]VMSCFG.H [.$(DEST)]VMS_.OBJ : []GLOBALS.H [.$(DEST)]VMS_.OBJ : []CRC32.H [.$(DEST)]VMS_.OBJ : []ZIP.H [.$(DEST)]VMS_.OBJ : []UNZIP.H [.$(DEST)]VMS_.OBJ : [.VMS]VMS.H [.$(DEST)]VMS_.OBJ : [.VMS]VMSDEFS.H !*[UNZIP60.VMS]DESCRIP_MKDEPS.MMS;1+,h./ 4@-W0123KPWO56`&(m3g5)O@e beu ${j1%~t=,rGS}TlAEDT!@_a>E =ZWH|]7;N*xwR|T'+Nui'rU6x>iqE8wr4^9(h}\mRgB %50S#Cr`} 0B <hYq}P'h/N@eYQx3S(>{YR^QHP ;z!&g*@_q%X9M8&w8]`y7^hY"xr'(] &Q)1%.{D)rXq@-ry>-8d>G~u1:Vj?mUIGG1a/5*dW=X::m+7O$bfTD=cx T+mN.yRfe6_ 5p4M2 6$i |~3Gr}TN!Aa@Xo/]le ]/}NK=vX(Yxa"F Fn xvYNzomv@qUG~j7^v&49oax%% x83ReVuca.[a`|x : tNCB@Sci7CQ/{H6>[5o"(ZCL 7S=/X K:!8_a+ g5m'}NpUg7-S+|Ntw.Aj>[>#k%a^-^'0UnOupD=cS FcuS1`$8,$O^m*w\M{w2c X|@AzJ{,;UflZ.4yax_3K"h;#X0_YAR^\#F:UVskV>LP1z"YE%m]$'w.l3k , /U,>DG.DIHMN9>PfBggRHP"HZW\; "jx3~ yH5 Q0|>\j/l9r,yARka V|Yz-c]AqpyGXY8DA{jSh;$Ys4W3-3;8RUC7/ac&Q$8[*w,8zhES<gZ!XSo.j;(M<,kHRlP'm;mDI2Hj8^Q6}`|01SdK j ":RWW]jO91Bcvc.nvici\R#Lj`NzR_QTV,}OLQqq-0Eah0Bjr!(C3$|4?F~8[on"l(uU\j`d#)H2oKl!R3 >f?/wcBLl.~WsOG?yz3h&$3$rtbu0t bfm Jw$5YIbmabX%gM~ 'qj#x7\I(B^DD Ewh:D3]gfL&3 .:d}l!@ 3S7|CBg` 1u:H3 KN :eM)|~GCObeh18Cmr[wR,Md1pe*VY1/b3![Y[W:>aS (n~cRUBXT(xw ozNF1X[ 70k8T6[D% 0!d, _$)xR mhM~ FYi eh4TvkX +Q`Xl$GnSZWH*4OUyc8<.irF1P*i0T cjh>/b_x=XGTWrg@M\8Vhs=rhq7C HG=u-hwT'!Ys8uK]1=0DQ?@!&|SV\(P2(3VE>$je#emM^yuR&bhwvfX"OgLq E=v/~WH;N'4_ec>@'~"1f?e`Z!U*bV]k XzBkL08VL@M0A}/:uZN}z&j?. Ug*.eb{ h[#tTwy:{UyCq9, %Djq51ij^"q258!2k \ 87 b1jN"=+" !? laew7Xbs$Vd+qoC;{g!2gK%4+3m(E6{*:)&&DT(=BdP+:ura7Wy o⃫\lN*rsU8q:@  {/'&1dqgk>fjS"@}'G{xo>NF$vxZdr.u'Q(%Ija  K`0;[)jpO$S:l[hP00H9LHo=y 3txp/XD5<I `!iA*kmp.1u g%rl bPU4wu+@?2PxIJw%M1`XQ pR#4|{D2q Ro(DvYHjAa'YG(_710]WCL`W;c("5J(TKZrE G%18>{12dN G RDYzS#Rr@N ns;3HY$*WQ{P-i2 0pox2p2D;6rLan>Bw=0-H1V(S$AM,Z gnJEDF#/WI3jMp7'@}.51\$x}9vq;*:g[:V[Ze9iNQ[N^MS%%tXF/eSTw.THW 0B9)}F@f:sbKz 3)Ec!n%|:li#+| NE&y!H rNkjfyT|pZ\SB#vx*f([}U7{YI TWTPrx<L>F3C>!B22Dde'D#D"8AK8ST%O\PD< >[* )ULI8,,r=s^TA/%pJ4uM%LJGT-rT-0k(U~iPcH;jQCTsk<&N .} t[r)1IYSxG;[ )#}*:~~gYTmo*N47 34u }/0D)hk7Tq /\Up8^mo-}[0@JQEL Rk]qiJu2:W]|[u#y@) cQ*c3h=M2@,\Bd$5ZSnf*J CmUG*/ !QRl)VN;N{%Ho=.9?;,Mt&CYVh{bMvwU -]u x 9IK"Q]oa?BU%|ZL5E<LN<0VBLI<5PuagI,ts5 \O+(z07K$ )GKH8]J]h eFMYsR H[S8Z+|8u 7YyEr3a(Vn2R`N`INOfq t/*R:+FCF1#|PUI{1gea~@p_x G\M^h0+6QPh#ip*%AwuyGwL x] o gxEvQ8Jzumds3h/  G$S1Su ;VZ\"stf_btS*C`{x|75^FVcf#Xa9yu|{'.G\YSK5G$ Oa6o#WkiP%0bbpK~>n'(,4BLl> N`Kp `%8/{bu2K<0 A "n099)4%nn) eF"u;nza5vbCi4Q8XoB; cVagz$^tr':W_p"%&cD[ e ]#>XC2Ee&nGz<1'pa]]jf5NNy)8ey6%W^KP.9K!P;HGmLC#ho qW}oxvEd0kJ<>eM6i8{"?Hy$2+< :quZ&JRthq)=QC4ZlYt~|,f7m7;|~h0NeT{,xnT`Xm. ${`3ju#dG153vP3Bp|H>5 !G`Y ?a!.21>Q7c~%Y;"QcA8E~ k<xU% 9y5ie}O%8.;"]ltkQVV;V,Ep!Mi**t(`bt9M<}?sH#`soiT[ l5whB/l}rs:[yeGXxM|!D^S+ SVHrv)5!z5_ddg#!j;4%^5/ 6H%vP *-0HnT,Ql>1}$ HFg"KsgSYh0&Onx nz,(:ee~&F{EJj&u{zC~2n2vB:uh xa+ `Ci3{jR tD_=SOwHo|3UD)tg4?H9AD v}ZI@;'<( tnsj{wP EgwuD >4 *Lt(Nk}wvwc$Rx+yY  /h#:w sfI&}?7  j+!<0Y-s'}"Yp# D>V;F5%- R@L';^a ,CAD!; 5XKO?(B*yWJEc=3$ f$\Ag~>N &h2$Fi'x53:|WPcqR>U{be-B[F)*68cIV?(qg 42N% )YLDULFtW5w([I"51RVvWt\tf*W5Hp&^E|@HwLH"YL[:.{^kX)aB[n# DZS6h?@h~M7oxN7Mov"~EVe`r$X 712M\G#;/r'qM"{~xaai~3iUZ kRJ@CsS]1]r$-9J<=%U\r@x+0"'!lXX8|;A@2E z_{G.2$k y{y G?GsWg4cZR9Zjl!)j8=3cb6Tzq|to;KS"li :Wh"M05Q^kW[ .T @4m0 +KkKyH, 8Gr0;S!mh(052^l b2wr$6\O'M-s=v3Zs@CI*UYFF\I"^$l,mo~m1nRMo&(\z,8ct}k2,o 3N _T|wp>4g'za/; b;::9JOy |rkt,CEf$Ih}dU/zo'YzIk)xgWJr:OZP&RWOV[V=-HB n7P54&sfN'/#su,^w'H5~tzP=Hb!?&0L_27e(v"mucs!w^P+d(.HW |hls`.;q62 rohQ6s7G# V9hfG$ Z\vrnu"&T$bRi!gJr"LvXTDsa]y.5qQWj !_CEY~f?H];}>.ID\z:4dmc;E@k9yHg`xcgXa%!6M|J}kccG.vx*x;XUV:. k7(]6y0sjb||)qs36#mkC$eWhfyO8>RuT!:uIG \ Mh"f96p'B(G~^NA6/9;jJ@Kq,_CUwE&[8@,txj!2;1hf| SrsRp HH ts9A6^BGc4JGNLgu>P91IOkNqoewt7]++3o5m?s'C{##[UEvzw\PAc=\^RM1$G@y=AfSz9T`>6A' }1yx))%%)@Ec|Y5GTW>md/3(5:"`ex4~tEC]-t'<2rk0o}ieMjqeG1!$uIZZmq^$1OE^D Gk  )%`w&D*,@R%j~O |u=BqB%FA)OL%F3Y:uUu/lCThE*^c)X?2h~pPc Gt+Y*m[HOo3'J%D,6MaDQc#bq ?1C}Z/M(%)m,pmjؙ^y&q?JT`#)/@ug#YpJ n/TdfyHxJJ\=\]c ,ec{_l0y9O>VKd[}1yZOlBO(Dnn=M4=GCk~xrHc.U\n|nj N'J/rr/iChQuuO;eq3#hy)XRL fJj74uB?r2;RPVj/'lX_g\ &(jhgr#1}_xux+@:.-9l0^qxaZVe'.r9Ega 56Hh= l7 @&-?q  , X:$dq'\z-yJe_ Z]NiMYqu]lM*-(\;PL)|7A4yi|\9MHE5zAs6cyWK=*:=_VDBT": Ii+&Tv|Va-|Fz!C[)H*J?Zu5}HOvvby2/;$ru8=n>enCK"F"LEhY^hf6j~?5j)I- 7g`X?6>!2]oIqN 8%[A_\6SN%n 04{F ~s5<0{?ft^f_ =:&VQJC@d+ZPmjIaN"N,* K>q9 ^!8=u D9e1Nu{ 6! i,En2{[Vpb LEO\0:avg7a\ V_@GM[*"e?o"< _/+7n.Fj'l:+-+"~w UNZIP.BCKhW![UNZIP60.VMS]DESCRIP_MKDEPS.MMS;1OLB;1Zrehensive file, # DESCRIP_DEPS.MMS.*. # # Required command procedures. COMS = [.VMS]MOD_DEP.COM [.VMS]COLLECT_DEPS.COM # Include the source file lists (among other data). INCL_DESCRIP_SRC = 1 .INCLUDE [.VMS]DESCRIP_SRC.MMS # The ultimate product, a comprehensive dependency list. DEPS_FILE = [.VMS]DESCRIP_DEPS.MMS # Detect valid qualifier and/or macro options. .IF $(FINDSTRING Skip, $(MMSQUALIFIERS)) .eq Skip DELETE_MMSD = 1 .ELSIF NOSKIP PURGE_MMSD = 1 .ELSE UNK_MMSD = 1 .ENDIF # Dependency suffixes and rules. # # .FIRST is assumed to be used already, so the MMS qualifier/macro check # is included in each rule (one way or another). .SUFFIXES_BEFORE .C .MMSD .C.MMSD : .IF UNK_MMSD @ write sys$output - " /SKIP_INTERMEDIATES is expected on the MMS command line." @ write sys$output - " For normal behavior (delete .MMSD files), specify ""/SKIP""." @ write sys$output - " To retain the .MMSD files, specify ""/MACRO = NOSKIP=1""." @ exit %x00000004 .ENDIF $(CC) $(CFLAGS_INCL) $(MMS$SOURCE) /NOLIST /NOOBJECT - /MMS_DEPENDENCIES = (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) # List of MMS dependency files. # In case it's not obvious... # To extract module name lists from object library module=object lists: # 1. Transform "module=[.dest]name.OBJ" into "module=[.dest] name". # 2. For [.VMS], add [.VMS] to name. # 3. Delete "*]" words. # # A similar scheme works for executable lists. MODS_LIB_UNZIP_N = $(FILTER-OUT *], \ $(PATSUBST *]*.OBJ, *] *, $(MODS_OBJS_LIB_UNZIP_N))) MODS_LIB_UNZIP_V = $(FILTER-OUT *], \ $(PATSUBST *]*.OBJ, *] [.VMS]*, $(MODS_OBJS_LIB_UNZIP_V))) MODS_LIB_UNZIPCLI_V = $(FILTER-OUT *], \ $(PATSUBST *]*.OBJ, *] [.VMS]*, $(MODS_OBJS_LIB_UNZIPCLI_C_V))) MODS_LIB_UNZIPSFX_N = $(FILTER-OUT *], \ $(PATSUBST *]*.OBJ, *] *, $(MODS_OBJS_LIB_UNZIPSFX_N))) MODS_LIB_UNZIPSFX_V = $(FILTER-OUT *], \ $(PATSUBST *]*.OBJ, *] [.VMS]*, $(MODS_OBJS_LIB_UNZIPSFX_V))) MODS_UNZIP = $(FILTER-OUT *], \ $(PATSUBST *]*.EXE, *] *, $(UNZIP))) MODS_UNZIP_CLI = $(FILTER-OUT *], \ $(PATSUBST *]*.EXE, *] *, $(UNZIP_CLI))) MODS_UNZIPSFX = $(FILTER-OUT *], \ $(PATSUBST *]*.EXE, *] *, $(UNZIPSFX))) MODS_UNZIPSFX_CLI = $(FILTER-OUT *], \ $(PATSUBST *]*.EXE, *] *, $(UNZIPSFX_CLI))) # Complete list of C object dependency file names. # Note that the CLI UnZip main program object file is a special case. DEPS = $(FOREACH NAME, \ $(MODS_LIB_UNZIP_N) $(MODS_LIB_UNZIP_V) \ $(MODS_LIB_UNZIPCLI_V) \ $(MODS_LIB_UNZIPSFX_N) $(MODS_LIB_UNZIPSFX_V) \ $(MODS_UNZIP) $(MODS_UNZIP_CLI) \ $(MODS_UNZIPSFX) $(MODS_UNZIPSFX_CLI), \ $(NAME).mmsd) # Default target is the comprehensive dependency list. $(DEPS_FILE) : $(DEPS) $(COMS) .IF UNK_MMSD @ write sys$output - " /SKIP_INTERMEDIATES is expected on the MMS command line." @ write sys$output - " For normal behavior (delete individual .MMSD files), specify ""/SKIP""." @ write sys$output - " To retain the individual .MMSD files, specify ""/MACRO = NOSKIP=1""." @ exit %x00000004 .ENDIF # # Note that the space in P4, which prevents immediate macro # expansion, is removed by COLLECT_DEPS.COM. # @[.VMS]COLLECT_DEPS.COM "UnZip" - "$(MMS$TARGET)" "[...]*.mmsd" "[.$ (DEST)]" $(MMSDESCRIPTION_FILE) @ write sys$output - "Created a new dependency file: $(MMS$TARGET)" .IF DELETE_MMSD @ write sys$output - "Deleting intermediate .MMSD files..." delete /log *.MMSD;*, [.VMS]*.MMSD;* .ELSE @ write sys$output - "Purging intermediate .MMSD files..." purge /log *.MMSD, [.VMS]*.MMSD .ENDIF # CLEAN target. Delete the individual C dependency files. CLEAN : if (f$search( "*.MMSD") .nes. "") then - delete /log *.MMSD;* if (f$search( "[.VMS]*.MMSD") .nes. "") then - delete /log [.VMS]*.MMSD;* # CLEAN_ALL target. Delete: # The individual C dependency files. # The collected source dependency file. CLEAN_ALL : if (f$search( "*.MMSD") .nes. "") then - delete /log *.MMSD;* if (f$search( "[.VMS]*.MMSD") .nes. "") then - delete /log [.VMS]*.MMSD;* if (f$search( "[.VMS]DESCRIP_DEPS.MMS") .nes. "") then - delete /log [.VMS]DESCRIP_DEPS.MMS;* # Explicit dependencies and rules for utility variant modules. # # The extra dependency on the normal dependency file obviates including # the /SKIP warning code in each rule here. CRC32_.MMSD : CRC32.C CRC32.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) CRYPT_.MMSD : CRYPT.C CRYPT.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) EXTRACT_.MMSD : EXTRACT.C EXTRACT.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) FILEIO_.MMSD : FILEIO.C FILEIO.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) GLOBALS_.MMSD : GLOBALS.C GLOBALS.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) INFLATE_.MMSD : INFLATE.C INFLATE.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) MATCH_.MMSD : MATCH.C MATCH.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) PROCESS_.MMSD : PROCESS.C PROCESS.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) TTYIO_.MMSD : TTYIO.C TTYIO.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) UBZ2ERR_.MMSD : UBZ2ERR.C UBZ2ERR.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) [.VMS]VMS_.MMSD : [.VMS]VMS.C [.VMS]VMS.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) UNZIP_CLI.MMSD : UNZIP.C UNZIP.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) UNZIPSFX.MMSD : UNZIP.C UNZIP.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_SFX) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - % UNZIP.BCKhW![UNZIP60.VMS]DESCRIP_MKDEPS.MMS;1OLB;1 (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) UNZIPSFX_CLI.MMSD : UNZIP.C UNZIP.MMSD $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(CFLAGS_SFX) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) # Special case. No normal (non-CLI) version. [.VMS]CMDLINE.MMSD : [.VMS]CMDLINE.C .IF UNK_MMSD @ write sys$output - " /SKIP_INTERMEDIATES is expected on the MMS command line." @ write sys$output - " For normal behavior (delete .MMSD files), specify ""/SKIP""." @ write sys$output - " To retain the .MMSD files, specify ""/MACRO = NOSKIP=1""." @ exit %x00000004 .ENDIF $(CC) $(CFLAGS_INCL) $(CFLAGS_CLI) $(MMS$SOURCE) - /NOLIST /NOOBJECT /MMS_DEPENDENCIES = - (FILE = $(MMS$TARGET), NOSYSTEM_INCLUDE_FILES) @[.VMS]MOD_DEP.COM $(MMS$TARGET) $(MMS$TARGET_NAME).OBJ $(MMS$TARGET) *[UNZIP60.VMS]DESCRIP_SRC.MMS;1+,i./ 4@-W0123KPWO 56"}7"}89GHJ# 1 March 2009. SMS. # # UnZip 6.0 for VMS - MMS (or MMK) Source Description File. # # This description file is included by other description files. It is # not intended to be used alone. Verify proper inclusion. .IFDEF INCL_DESCRIP_SRC .ELSE $$$$ THIS DESCRIPTION FILE IS NOT INTENDED TO BE USED THIS WAY. .ENDIF # Define MMK architecture macros when using MMS. .IFDEF __MMK__ # __MMK__ .ELSE # __MMK__ ALPHA_X_ALPHA = 1 IA64_X_IA64 = 1 VAX_X_VAX = 1 .IFDEF $(MMS$ARCH_NAME)_X_ALPHA # $(MMS$ARCH_NAME)_X_ALPHA __ALPHA__ = 1 .ENDIF # $(MMS$ARCH_NAME)_X_ALPHA .IFDEF $(MMS$ARCH_NAME)_X_IA64 # $(MMS$ARCH_NAME)_X_IA64 __IA64__ = 1 .ENDIF # $(MMS$ARCH_NAME)_X_IA64 .IFDEF $(MMS$ARCH_NAME)_X_VAX # $(MMS$ARCH_NAME)_X_VAX __VAX__ = 1 .ENDIF # $(MMS$ARCH_NAME)_X_VAX .ENDIF # __MMK__ # Combine command-line VAX C compiler macros. .IFDEF VAXC # VAXC VAXC_OR_FORCE_VAXC = 1 .ELSE # VAXC .IFDEF FORCE_VAXC # FORCE_VAXC VAXC_OR_FORCE_VAXC = 1 .ENDIF # FORCE_VAXC .ENDIF # VAXC # Analyze architecture-related and option macros. .IFDEF __ALPHA__ # __ALPHA__ DECC = 1 DESTM = ALPHA .ELSE # __ALPHA__ .IFDEF __IA64__ # __IA64__ DECC = 1 DESTM = IA64 .ELSE # __IA64__ .IFDEF __VAX__ # __VAX__ .IFDEF VAXC_OR_FORCE_VAXC # VAXC_OR_FORCE_VAXC DESTM = VAXV .ELSE # VAXC_OR_FORCE_VAXC .IFDEF GNUC # GNUC CC = GCC DESTM = VAXG .ELSE # GNUC DECC = 1 DESTM = VAX .ENDIF # GNUC .ENDIF # VAXC_OR_FORCE_VAXC .ELSE # __VAX__ DESTM = UNK UNK_DEST = 1 .ENDIF # __VAX__ .ENDIF # __IA64__ .ENDIF # __ALPHA__ .IFDEF LARGE # LARGE .IFDEF __VAX__ # __VAX__ .ELSE # __VAX__ DESTL = L .ENDIF # __VAX__ .ENDIF # LARGE DEST = $(DESTM)$(DESTL) SEEK_BZ = $(DESTM) # Library module name suffix for XXX_.OBJ with GNU C. .IFDEF GNUC # GNUC GCC_ = _ .ELSE # GNUC GCC_ = .ENDIF # GNUC # Check for option problems. .IFDEF __VAX__ # __VAX__ .IFDEF LARGE # LARGE LARGE_VAX = 1 .ENDIF # LARGE .IFDEF VAXC_OR_FORCE_VAXC # VAXC_OR_FORCE_VAXC .IFDEF GNUC # GNUC VAX_MULTI_CMPL = 1 .ENDIF # GNUC .ENDIF # VAXC_OR_FORCE_VAXC .ELSE # __VAX__ .IFDEF VAXC_OR_FORCE_VAXC # VAXC_OR_FORCE_VAXC NON_VAX_CMPL = 1 .ELSE # VAXC_OR_FORCE_VAXC .IFDEF GNUC # GNUC NON_VAX_CMPL = 1 .ENDIF # GNUC .ENDIF # VAXC_OR_FORCE_VAXC .ENDIF # __VAX__ # Shortcut to include BZIP2 support from the optional bzip2 source subdir # in the UnZip source location. BZ2DIR_BIN = SYS$DISK:[.BZIP2.$(DESTM)] BZ2_OLB = LIBBZ2_NS.OLB LIB_BZ2_LOCAL = $(BZ2DIR_BIN)$(BZ2_OLB) .IFDEF USEBZ2 # USEBZ2 .IFDEF IZ_BZIP2 # IZ_BZIP2 .ELSE # IZ_BZIP2 IZ_BZIP2 = SYS$DISK:[.BZIP2] LIB_BZ2_DEP = $(LIB_BZ2_LOCAL) BUILD_BZIP2 = 1 .ENDIF # IZ_BZIP2 .ENDIF # USEBZ2 # Complain about any problems (and die) if warranted. Otherwise, show # optional package directories being used, and the destination # directory. Make the destination directory, if necessary. .FIRST .IFDEF __MMK__ # __MMK__ @ write sys$output "" .ENDIF # __MMK__ .IFDEF UNK_DEST # UNK_DEST @ write sys$output - " Unknown system architecture." .IFDEF __MMK__ # __MMK__ @ write sys$output - " MMK on IA64? Try adding ""/MACRO = __IA64__""." .ELSE # __MMK__ @ write sys$output - " MMS too old? Try adding ""/MACRO = MMS$ARCH_NAME=ALPHA""," @ write sys$output - " or ""/MACRO = MMS$ARCH_NAME=IA64"", or ""/MACRO = MMS$ARCH_NAME=VAX""," @ write sys$output - " as appropriate. (Or try a newer version of MMS.)" .ENDIF # __MMK__ @ write sys$output "" I_WILL_DIE_NOW. /$$$$INVALID$$$$ .ELSE # UNK_DEST .IFDEF VAX_MULTI_CMPL # VAX_MULTI_CMPL @ write sys$output - " Macro ""GNUC"" is incompatible with ""VAXC"" or ""FORCE_VAXC""." @ write sys$output "" I_WILL_DIE_NOW. /$$$$INVALID$$$$ .ELSE # VAX_MULTI_CMPL .IFDEF NON_VAX_CMPL # NON_VAX_CMPL @ write sys$output - " Macros ""GNUC"", ""VAXC"", and ""FORCE_VAXC"" are valid only on VAX." @ write sys$output "" I_WILL_DIE_NOW. /$$$$INVALID$$$$ .ELSE # NON_VAX_CMPL .IFDEF LARGE_VAX # LARGE_VAX @ write sys$output - " Macro ""LARGE"" is invalid on VAX." @ write sys$output "" I_WILL_DIE_NOW. /$$$$INVALID$$$$ .ELSE # LARGE_VAX .IFDEF IZ_BZIP2 # IZ_BZIP2 .IFDEF BUILD_BZIP2 # BUILD_BZIP2 @ if (f$search( "$(IZ_BZIP2)bzlib.h") .eqs. "") then - write sys$output " Can not find header file $(IZ_BZIP2)bzlib.h" @ if (f$search( "$(IZ_BZIP2)bzlib.h") .eqs. "") then - write sys$output "" @ if (f$search( "$(IZ_BZIP2)bzlib.h UNZIP.BCKiW[UNZIP60.VMS]DESCRIP_SRC.MMS;164_OLB;1 ") .eqs. "") then - I_WILL_DIE_NOW. /$$$$INVALID$$$$ @ write sys$output " BZIP2 dir: $(BZ2DIR_BIN)" @ define lib_bzip2 $(BZ2DIR_BIN) @ if (f$search( "$(IZ_BZIP2)$(DESTM).dir") .eqs. "") then - create /directory $(BZ2DIR_BIN) .ELSE # BUILD_BZIP2 @ @[.VMS]FIND_BZIP2_LIB.COM $(IZ_BZIP2) $(SEEK_BZ) $(BZ2_OLB) lib_bzip2 @ if (f$trnlnm( "lib_bzip2") .eqs. "") then - write sys$output " Can not find BZIP2 object library." @ if (f$trnlnm( "lib_bzip2") .eqs. "") then - write sys$output "" @ if (f$trnlnm( "lib_bzip2") .eqs. "") then - I_WILL_DIE_NOW. /$$$$INVALID$$$$ @ write sys$output " BZIP2 dir: ''f$trnlnm( "lib_bzip2")'" .ENDIF # BUILD_BZIP2 @ write sys$output "" @ define incl_bzip2 $(IZ_BZIP2) .ENDIF # IZ_BZIP2 .IFDEF IZ_ZLIB # IZ_ZLIB @ @[.VMS]FIND_BZIP2_LIB.COM $(IZ_ZLIB) $(SEEK_BZ) LIBZ.OLB lib_zlib @ if (f$trnlnm( "lib_zlib") .eqs. "") then - write sys$output " Can not find ZLIB object library." @ if (f$trnlnm( "lib_zlib") .eqs. "") then - write sys$output "" @ if (f$trnlnm( "lib_zlib") .eqs. "") then - I_WILL_DIE_NOW. /$$$$INVALID$$$$ @ write sys$output " ZLIB dir: ''f$trnlnm( "lib_zlib")'" @ write sys$output "" @ define incl_zlib $(IZ_ZLIB) @ @[.VMS]FIND_BZIP2_LIB.COM $(IZ_ZLIB) - contrib.infback9 infback9.h incl_zlib_contrib_infback9 .ENDIF # IZ_ZLIB @ write sys$output " Destination: [.$(DEST)]" @ write sys$output "" if (f$search( "$(DEST).DIR;1") .eqs. "") then - create /directory [.$(DEST)] .ENDIF # LARGE_VAX .ENDIF # NON_VAX_CMPL .ENDIF # VAX_MULTI_CMPL .ENDIF # UNK_DEST # BZIP2 options. .IFDEF IZ_BZIP2 # IZ_BZIP2 CDEFS_BZ = , USE_BZIP2 CFLAGS_INCL = /include = ([], [.VMS]) LIB_BZIP2_OPTS = lib_bzip2:$(BZ2_OLB) /library, .ENDIF # IZ_BZIP2 # ZLIB options. .IFDEF IZ_ZLIB # IZ_ZLIB CDEFS_ZL = , USE_ZLIB .IFDEF CFLAGS_INCL # CFLAGS_INCL .ELSE # CFLAGS_INCL CFLAGS_INCL = /include = ([], [.VMS]) .ENDIF # CFLAGS_INCL LIB_ZLIB_OPTS = LIB_ZLIB:LIBZ.OLB /library, .ELSE # IZ_ZLIB .IFDEF CFLAGS_INCL # CFLAGS_INCL .ELSE # CFLAGS_INCL CFLAGS_INCL = /include = [] .ENDIF # CFLAGS_INCL .ENDIF # IZ_ZLIB # DBG options. .IFDEF DBG # DBG CFLAGS_DBG = /debug /nooptimize LINKFLAGS_DBG = /debug /traceback .ELSE # DBG CFLAGS_DBG = LINKFLAGS_DBG = /notraceback .ENDIF # DBG # Large-file options. .IFDEF LARGE # LARGE CDEFS_LARGE = , LARGE_FILE_SUPPORT .ENDIF # LARGE # C compiler defines. .IFDEF LOCAL_UNZIP C_LOCAL_UNZIP = , $(LOCAL_UNZIP) .ENDIF CDEFS = VMS $(CDEFS_BZ) $(CDEFS_LARGE) $(CDEFS_ZL) $(C_LOCAL_UNZIP) CDEFS_UNX = /define = ($(CDEFS)) CDEFS_CLI = /define = ($(CDEFS), VMSCLI) CDEFS_SFX = /define = ($(CDEFS), SFX) CDEFS_SFX_CLI = /define = ($(CDEFS), SFX, VMSCLI) # Other C compiler options. .IFDEF DECC # DECC CFLAGS_ARCH = /decc /prefix = (all) .ELSE # DECC .IFDEF FORCE_VAXC # FORCE_VAXC CFLAGS_ARCH = /vaxc .IFDEF VAXC # VAXC .ELSE # VAXC VAXC = 1 .ENDIF # VAXC .ELSE # FORCE_VAXC CFLAGS_ARCH = .ENDIF # FORCE_VAXC .ENDIF # DECC # LINK (share) library options. # Omit shareable image options file for NOSHARE. .IFDEF VAXC_OR_FORCE_VAXC # VAXC_OR_FORCE_VAXC .IFDEF NOSHARE # NOSHARE OPT_FILE = LFLAGS_ARCH = .ELSE # NOSHARE OPT_FILE = [.$(DEST)]VAXCSHR.OPT LFLAGS_ARCH = $(OPT_FILE) /options, .ENDIF # NOSHARE .ELSE # VAXC_OR_FORCE_VAXC .IFDEF GNUC # GNUC LFLAGS_GNU = GNU_CC:[000000]GCCLIB.OLB /LIBRARY .IFDEF NOSHARE # NOSHARE OPT_FILE = LFLAGS_ARCH = $(LFLAGS_GNU), .ELSE # NOSHARE OPT_FILE = [.$(DEST)]VAXCSHR.OPT LFLAGS_ARCH = $(LFLAGS_GNU), SYS$DISK:$(OPT_FILE) /options, .ENDIF # NOSHARE .ELSE # GNUC OPT_FILE = LFLAGS_ARCH = .ENDIF # GNUC .ENDIF # VAXC_OR_FORCE_VAXC # LINK NOSHARE options. .IFDEF NOSHARE # NOSHARE .IFDEF __ALPHA__ # __ALPHA__ NOSHARE_OPTS = , SYS$LIBRARY:STARLET.OLB /LIBRARY\ /INCLUDE = CMA$TIS /NOSYSSHR .ELSE # __ALPHA__ .IFDEF __IA64__ # __IA64__ NOSHARE_OPTS = , SYS$LIBRARY:STARLET.OLB /LIBRARY\ /INCLUDE = CMA$TIS /NOSYSSHR .ELSE # __IA64__ OLDVAX_OLDVAX = 1 .IFDEF DECC # DECC .IFDEF OLDVAX_$(NOSHARE) # OLDVAX_$(NOSHARE) NOSHARE_OPTS = , SYS$LIBRARY:DECCRTL.OLB /LIBRARY\ /INCLUDE = CMA$TIS /NOSYSSHR .ELSE # OLDVAX_$(NOSHARE) NOSHARE_OPTS = , SYS$LIBRARY:DECCRTL.OLB /LIBRARY\ /INCLUDE = (CMA$TIS, CMA$TIS_VEC) /NOSYSSHR .ENDIF # OLDVAX_$(NOSHARE) .ELSE # DECC .IFDEF OLDVAX_$(NOSHARE) # OLDVAX_$(NOSHARE) NOSHARE_OPTS = , SYS$LIBRARY:VAXCRTL.OLB /LIBRARY,\ SYS$LIBRARY:IMAGELIB.OLB /LIBRARY /NOSYSSHR .ELSE # OLDVAX_$(NOSHARE) NOSHARE_OPTS = , SYS$LIBRARY:VAXCRTL.OLB /LIBRARY,\ SYS$LIBRARY:DECCRTL.OLB /LIBRARY /INCLUDE = CMA$TIS,\ SYS$LIBRARY:IMAGELIB.OLB /LIBRARY /NOSYSSHR .ENDIF # OLDVAX_$(NOSHARE) .ENDIF # DECC .ENDIF # __IA64__ .ENDIF # __ALPHA__ .ELSE # NOSHARE NOSHARE_OPTS = .ENDIF # NOSHARE # LIST options. .IFDEF LIST # LIST .IFDEF DECC # DECC CFLAGS_LIST = /list = $*.LIS /show = (all, nomessages) .ELSE # DECC CFLAGS_LIST = /list = $*.LIS /show = (all) .ENDIF # DECC LINKFLAGS_LIST = /map = $*.MAP /cross_reference /full .ELSE # LIST CFLAGS_LIST = LINKFLAGS_LIST = .ENDIF # LIST # Common CFLAGS and LINKFLAGS. CFLAGS = \ $(CFLAGS_ARCH) $(CFLAGS_DBG) $(CFLAGS_INCL) $(CFLAGS_LIST) $(CCOPTS) \ /object = $(MMS$TARGET) LINKFLAGS = \ $(LINKFLAGS_DBG) $(LINKFLAGS_LIST) $(LINKOPTS) \ /executable = $(MMS$TARGET) # Object library module=object lists. # Primary object library, []. MODS_OBJS_LIB_UNZIP_N = \ CRC32=[.$(DEST)]CRC32.OBJ \ CRYPT=[.$(DEST)]CRYPT.OBJ \ ENVARGS=[.$(DEST)]ENVARGS.OBJ \ EXPLODE=[.$(DEST)]EXPLODE.OBJ \ EXTRACT=[.$(DEST)]EXTRACT.OBJ \ FILEIO=[.$(DEST)]FILEIO.OBJ \ GLOBALS=[.$(DEST)]GLOBALS.OBJ \ INFLATE=[.$(D UNZIP.BCKiW[UNZIP60.VMS]DESCRIP_SRC.MMS;164_OLB;1"EST)]INFLATE.OBJ \ LIST=[.$(DEST)]LIST.OBJ \ MATCH=[.$(DEST)]MATCH.OBJ \ PROCESS=[.$(DEST)]PROCESS.OBJ \ TTYIO=[.$(DEST)]TTYIO.OBJ \ UBZ2ERR=[.$(DEST)]UBZ2ERR.OBJ \ UNREDUCE=[.$(DEST)]UNREDUCE.OBJ \ UNSHRINK=[.$(DEST)]UNSHRINK.OBJ \ ZIPINFO=[.$(DEST)]ZIPINFO.OBJ # Primary object library, [.VMS]. MODS_OBJS_LIB_UNZIP_V = \ VMS=[.$(DEST)]VMS.OBJ MODS_OBJS_LIB_UNZIP = $(MODS_OBJS_LIB_UNZIP_N) $(MODS_OBJS_LIB_UNZIP_V) # CLI object library, [.VMS]. MODS_OBJS_LIB_UNZIPCLI_C_V = \ CMDLINE=[.$(DEST)]CMDLINE.OBJ MODS_OBJS_LIB_UNZIPCLI_CLD_V = \ VMS_UNZIP_CLD=[.$(DEST)]UNZ_CLI.OBJ MODS_OBJS_LIB_UNZIP_CLI = \ $(MODS_OBJS_LIB_UNZIPCLI_C_V) \ $(MODS_OBJS_LIB_UNZIPCLI_CLD_V) # SFX object library, []. MODS_OBJS_LIB_UNZIPSFX_N = \ CRC32$(GCC_)=[.$(DEST)]CRC32_.OBJ \ CRYPT$(GCC_)=[.$(DEST)]CRYPT_.OBJ \ EXTRACT$(GCC_)=[.$(DEST)]EXTRACT_.OBJ \ FILEIO$(GCC_)=[.$(DEST)]FILEIO_.OBJ \ GLOBALS$(GCC_)=[.$(DEST)]GLOBALS_.OBJ \ INFLATE$(GCC_)=[.$(DEST)]INFLATE_.OBJ \ MATCH$(GCC_)=[.$(DEST)]MATCH_.OBJ \ PROCESS$(GCC_)=[.$(DEST)]PROCESS_.OBJ \ TTYIO$(GCC_)=[.$(DEST)]TTYIO_.OBJ \ UBZ2ERR$(GCC_)=[.$(DEST)]UBZ2ERR_.OBJ # SFX object library, [.VMS]. MODS_OBJS_LIB_UNZIPSFX_V = \ VMS$(GCC_)=[.$(DEST)]VMS_.OBJ MODS_OBJS_LIB_UNZIPSFX = \ $(MODS_OBJS_LIB_UNZIPSFX_N) \ $(MODS_OBJS_LIB_UNZIPSFX_V) # SFX object library, [.VMS] (no []). MODS_OBJS_LIB_UNZIPSFX_CLI_C_V = \ CMDLINE$(GCC_)=[.$(DEST)]CMDLINE_.OBJ MODS_OBJS_LIB_UNZIPSFX_CLI_CLD_V = \ VMS_UNZIP_CLD=[.$(DEST)]UNZ_CLI.OBJ MODS_OBJS_LIB_UNZIPSFX_CLI = \ $(MODS_OBJS_LIB_UNZIPSFX_CLI_C_V) \ $(MODS_OBJS_LIB_UNZIPSFX_CLI_CLD_V) # Executables. UNZIP = [.$(DEST)]UNZIP.EXE UNZIP_CLI = [.$(DEST)]UNZIP_CLI.EXE UNZIPSFX = [.$(DEST)]UNZIPSFX.EXE UNZIPSFX_CLI = [.$(DEST)]UNZIPSFX_CLI.EXE !*[UNZIP60.VMS]FIND_BZIP2_LIB.COM;1+,j./ 4.@-W0123KPWO56 +7 +89GHJ$! 28 December 2006. SMS. $! $! Info-ZIP VMS accessory procedure. $! $! Find the BZIP2 object library under P1, starting in the [.'P2'] $! destination directory. (We assume, initially, that the BZIP2 $! directory has a destination directory structure like ours.) $! $! Set the P4 logical name to the directory where it was found. $! P5 and P6 may be used for qualifiers on the DEFINE command. $! $ bz_orig = p1 $ dest = p2 $ libbz2 = p3 $! $! Remove any trailing colon, to allow logical name translation. $! $ bz_dev_dir = "" $ bz_base = bz_orig $ if (f$extract( (f$length( bz_base)- 1), 1, bz_base) .eqs. ":") $ then $ bz_base = bz_base- ":" $ endif $! $ bz_base_eqv = f$trnlnm( bz_base) $ if (bz_base_eqv .nes. "") $ then $ bz_orig = bz_base_eqv $ bz_base = bz_base_eqv $ endif $ bz_base = bz_base- "]" $! $! Candidate 1 = the actual analogue destination directory. $! $ bz_dev_dir_cand = bz_base+ "."+ dest+ "]" $ lib_cand = bz_dev_dir_cand+ libbz2 $ if (f$search( lib_cand) .nes. "") $ then $ bz_dev_dir = bz_dev_dir_cand $ else $! $! Candidate 2 = the actual analogue destination directory + "L". $! $ bz_dev_dir_cand = bz_base+ "."+ dest+ "L]" $ lib_cand = bz_dev_dir_cand+ libbz2 $ if (f$search( lib_cand) .nes. "") $ then $ bz_dev_dir = bz_dev_dir_cand $ else $! $! Candidate 3 = the actual user-specified directory. $! $ bz_dev_dir_cand = bz_orig $ lib_cand = bz_dev_dir_cand+ libbz2 $ if (f$search( lib_cand) .nes. "") $ then $ bz_dev_dir = bz_dev_dir_cand $ endif $ endif $ endif $! $ if (bz_dev_dir .nes. "") $ then $ if (p4 .eqs. "") $ then $ write sys$output bz_dev_dir $ else $ define 'p5' 'p4' 'bz_dev_dir' 'p6' $ endif $ endif $! *[UNZIP60.VMS]HLP_LIB_NEXT.COM;1+,k./ 4@-W0123KPWO56a7a89GHJ$! 21 November 2004. SMS. $! $! HLP_LIB_NEXT.COM $! $! Find the next available HLP$LIBRARY[_*] logical name. $! $ base = "HLP$LIBRARY" $ candidate = base$ i = 0 $! $ loop_top: $ if (i .gt. 0) then candidate = base+ "_"+ f$string( i) $ i = i+ 1 $ if (f$trnlnm( candidate) .nes. "") then goto loop_top $! $ write sys$output candidate $! *[UNZIP60.VMS]INFBACK9.H;1+,r./ 40@-W0123KPWO56/է7/է89GHJ/* 2008-07-29 SMS. * VMS-specific INFBACK9.H jacket header file to help find the * relatively obscure actual header file. * * The logical name INCL_ZLIB_CONTRIB_INFBACK9 must point to the ZLIB * source subdirectory where infback9.h is situated. */ #include "INCL_ZLIB_CONTRIB_INFBACK9:INFBACK9.H" *[UNZIP60.VMS]INSTALL.VMS;1+,[%./ 4J@-W0123KPWO56O7O89GHJ VMS (OpenVMS): On VMS, two build methods are provided: a command procedure, and description files for MMS or MMK. Both methods must be run from the main directory, not the [.VMS] subdirectory. A simple build using the command procedure looks like this: @ [.VMS]BUILD_UNZIP.COM A simple build using MMS or MMK looks like this: MMS /DESCRIP = [.VMS]DESCRIP.MMS ! Or, with MMK, ... MMK /DESCRIP = [.VMS]DESCRIP.MMS Various options for each build method are explained in comments in the main builder file, either BUILD_UNZIP.COM or DESCRIP.MMS. Here are some more complex build examples: o Build with the large-file option enabled (non-VAX only): @ [.VMS]BUILD_UNZIP LARGE or: MMS /DESC = [.VMS] /MACRO = LARGE=1 o Re-link the executables (small-file and large-file): @ [.VMS]BUILD_UNZIP LINK @ [.VMS]BUILD_UNZIP LARGE LINK or MMK /DESC = [.VMS] CLEAN_EXE ! Deletes existing executables. MMK /DESC = [.VMS] ! Builds new executables. MMK /DESC = [.VMS] /MACRO = LARGE=1 CLEAN_EXE MMK /DESC = [.VMS] /MACRO = LARGE=1 o Build a large-file product from scratch, for debug, getting compiler listings and link maps: MMS /DESC = [.VMS] CLEAN MMS /DESC = [.VMS] /MACRO = (DBG=1, LARGE=1. LIST=1) On VAX, the builders attempt to cope with the various available C compilers, DEC/Compaq/HP C, VAX C, orݷ UNZIP.BCK[%W[UNZIP60.VMS]INSTALL.VMS;1P.IA64_OLB;1]L GNU C. If DEC/Compaq/HP C is not available or not desired, comments in the relevant builder file explain the command-line options used to select a different compiler. By default, Zip uses (and UnZip supports) the "deflate" compression method. To add support for the optional "bzip2" compression method, first obtain and build the bzip2 software (http://www.bzip.org/ or, for a more VMS-friendly kit, http://antinode.info/dec/sw/bzip2.html). Then, define the macro IZ_BZIP2 on the BUILD_UNZIP.COM or MMS/MMK command line to specify the directory where the bzip2 files may be found. For example: @ [.VMS]BUILD_UNZIP LARGE - IZ_BZIP2=SYS$SYSDEVICE:[UTILITY.SOURCE.BZIP2.BZIP2-1_0_4B_VMS] or: MMS /DESC = [.VMS] /MACRO = (LARGE=1, - IZ_BZIP2=SYS$SYSDEVICE:[UTILITY.SOURCE.BZIP2.BZIP2-1_0_4B_VMS]) Note that historically, UnZip has been built with the default compiler option, /NAMES = UPPERCASE, while bzip2 is normally built with /NAMES = AS_IS, to avoid name collisions. With modern compilers, the "#pragma names" directives in [.VMS]BZLIB.H will handle these differences without user intervention. An old compiler (for example, DEC C V4.0-000) will emit complaints %CC-I-UNKNOWNPRAGMA, and will mishandle the bzip2 library function names, which will cause the link to fail. To solve this problem, either build the bzip2 BZ_NO_STDIO object library with /NAMES = UPPERCASE, or else build UnZip with /NAMES = AS_IS. For example: @ [.VMS]BUILD_UNZIP LARGE "CCOPTS=/NAMES=AS_IS" - IZ_BZIP2=SYS$SYSDEVICE:[UTILITY.SOURCE.BZIP2.BZIP2-1_0_4B_VMS] or: MMS /DESC = [.VMS] /MACRO = (LARGE=1, "CCOPTS=/NAMES=AS_IS", - IZ_BZIP2=SYS$SYSDEVICE:[UTILITY.SOURCE.BZIP2.BZIP2-1_0_4B_VMS]) System-architecture-specific files (like objects and executables) are placed in separate directories, such as [.ALPHA], [.IA64], or [.VAX]. Large-file products get their own directories, [.ALPHAL] or [.IA64L]. On VAX, VAX C products are placed in [.VAXV], GNU C products in [.VAXG]. Each product builder announces what the destination directory will be when it is run. Common files, such as the help libraries (UNZIP.HLP for the default UNIX-like command-line interface, UNZIP_CLI.HLP for the VMS-like command-line interface), are placed in the main directory. With a mixed-architecture VMS cluster, the same main directory on a shared disk may may be used by all system types. (Using the NOHELP option with BUILD_UNZIP.COM can keep it from making the same help files repeatedly.) Building the help files is detailed below. Completing installation: To complete the installation, the executables may be left in place, or moved (or copied) to a convenient place. While other methods (like DCL$PATH) exist, most users define symbols to make the UnZip executables available as foreign commands. These symbol definitions may be placed in a user's SYS$LOGIN:LOGIN.COM, or in a more central location, like SYS$MANAGER:SYLOGIN.COM. Typical symbol definitions might look like these: UNZIP :== $ dev:[dir]UNZIP.EXE ! UNIX-like command line. or: UNZIP :== $ dev:[dir]UNZIP_CLI.EXE ! VMS-like command line. On a non-VAX system, different symbols could be defined for the small-file and large-file programs. For example: UNZIPS :== $ dev:[dir.ALPHA]UNZIP.EXE ! UNZIPS = small-file UnZip. UNZIP*L :== $ dev:[dir.ALPHAL]UNZIP.EXE !UNZIP[L] = large-file UnZip. The builders create help text files, UNZIP.HLP and UNZIP_CLI.HLP. These may be incorporated into an existing help library, or a separate UnZip help library may be created using commands like these, using either UNZIP.HLP (as shown) or UNZIP_CLI.HLP: LIBRARY /HELP dev:[dir]existing_library.HLB UNZIP.HLP LIBRARY /CREATE /HELP UNZIP.HLB UNZIP.HLP UnZip help may then be accessed from a separate UnZip help library using a command like: HELP /LIBRARY = device:[directory]UNZIP.HLB For greater ease, the user (or system manager) may define a HLP$LIBRARY logical name to allow the HELP utility to find the UnZip help library automatically. See HELP HELP /USERLIBRARY for more details. The command procedure HLP_LIB_NEXT.COM may be used to determine the next available HLP$LIBRARY logical name, and could be adapted to define a HLP$LIBRARY logical name for a UnZip help library. The builders also create VMS message files, UNZIP_MSG.EXE, in the destination directory with the program executables. A user may gain DCL access to the UnZip error messages using a command like: SET MESSAGE device:[directory]UNZIP_MSG.EXE For system-wide access, the system manager may move or copy this file to SYS$MESSAGE, although this could cause some confusion if multiple versions of UnZip are used on the system, and their error message source files differ. *[UNZIP60.VMS]MAKESFX.COM;1+,md./ 4@-W0123KPWO56~ЛZ7~ЛZ89GHJ$! $! MAKESFX.COM: command-procedure to create self-extracting ZIP archives $! usage: @MAKESFX foo (foo.zip -> foo.exe) $! $! Change history: $! $! Date Who What $! -------- ---- ----------------------------------------------------------- $! 19940804 MPJZ Created $! 19940810 GRR Removed superflous creation of name symbol $! 20000113 MPJZ Better symbol check, fixed bug in zip "-A" check $! $! MPJZ: Martin P.J. Zinser $! $! For this to work a symbol unzipsfx has to be defined which contains the $! location of the unzip stub (e.g., unzipsfx:== device:[dir]unzipsfx.exe) $! $! The zipfile given in p1 will be concatenated with unzipsfx and given a $! filename extension of .exe. The default file extension for p1 is .zip $! $! Use at your own risk, there is no guarantee here. If it doesn't work, $! blame me (zinser@decus.de), not the people from Info-ZIP. $! $!----------------------------------------------------------------------------- $! $! First check stub related stuff $! $ if (f$type(unzipsfx).nes."STRING") $ then $ type sys$input You need to define the symbol "unzipsfx" to point to the location of the unzipsfx stub before invoking this procedure. Exiting now... $ exit 2 $ endif $ usfx = f$parse(unzipsfx) - ";" $ if (f$search(usfx).eqs."") $ then $ write sys$output "The unzipsfx stub can not be found on the location" $ write sys$output "pointed to by the unzipsfx symbol -- ''usfx'" $ write sys$output "Exiting now" $ exit 2 $ endif $! $! Now check the  UNZIP.BCKmdW[UNZIP60.VMS]MAKESFX.COM;1P.IA64_OLB;1 input file $! $ if (p1.eqs."") $ then $ type sys$input Required parameter input-file missing Exiting now... $ exit 2 $ endif $ inf = p1 $ file = f$parse(inf,,,"DEVICE") + f$parse(inf,,,"DIRECTORY") + - f$parse(inf,,,"NAME") $ finf = file + f$parse(inf,".ZIP",,"TYPE") + f$parse(inf,,,"VERSION") $ if (f$search(finf).eqs."") $ then $ write sys$output "Input file ''finf' does not exist" $ exit 2 $ endif $! $! Finally create the self-extracting archive $! $ copy 'usfx','finf' 'file'.exe $! $! Zip "-A" will make the resulting archive compatible with other $! unzip programs, but is not essential for running the exe. $! $ if (f$type(zip).eqs."STRING") then zip "-A" 'file'.exe $ exit *[UNZIP60.VMS]MOD_DEP.COM;1+,n1./ 4t@-W0123KPWO56, 7, 89GHJ$! 3 March 2005. SMS. $! $! Info-ZIP VMS accessory procedure. $! $! Modify a dependencies file (P1), changing the object file name to $! P2. $! P3 = output file specification. $! $! $ prefix = f$edit( p3, "COLLAPSE") $! $! Strip any device:[directory] from P2. $! $ obj_name = f$parse( P2, , , "NAME", "SYNTAX_ONLY")+ - f$parse( P2, , , "TYPE", "SYNTAX_ONLY") $! $ open /read /error = end_main deps_in 'p1' $ open /write /error = end_main deps_out 'p3' $ on error then goto loop_main_end $ loop_main_top: $ read /error = loop_main_end deps_in line $ line_reduced = f$edit( line, "COMPRESS, TRIM") $ colon = f$locate( " : ", line_reduced) $ line = obj_name+ f$extract( colon, 2000, line) $ write deps_out "''line'" $ goto loop_main_top $! $ loop_main_end: $ close deps_in $ close deps_out $! $ end_main: $! *[UNZIP60.VMS]NOTES.TXT;1+,\.."/ 4""@-W0123KPWO#56M~7M~89GHJ VMS Notes for Info-ZIP Zip 3.0 and UnZip 6.0 ============================================ This document describes some VMS-specific behavior and implementation details of the Info-ZIP Zip and UnZip programs. Last modified: 2009-03-02. Command-line Case ----------------- Zip and UnZip now include code which can preserve the case of command-line parameters and options, which obviates quoting upper-case options like "-V" or "-Z". This works on non-VAX systems with a sufficiently recent C RTL, and SET PROCESS /PARSE_STYLE = EXTENDED. (Sufficiently recent here means __CRTL_VER >= 70301000, which includes VMS V7.3-1 with a C Run Time Library ECO, or V7.3-2 or newer.) This code uses the decc$feature_set_value() function to enable the DECC$ARGV_PARSE_STYLE feature. There is a small range of C RTL versions where this function is unavailable, but where manually setting the logical name DECC$ARGV_PARSE_STYLE to "ENABLE" will work. HELP CRTL leads to some additional information on these features. File Name Case (ODS5) --------------------- In general, Zip 3.0 and UnZip 6.0 should handle file name case (and extended file names) in reasonable ways on ODS5 disks. Zip offers a variety of "-C" (/PRESERVE_CASE) options to control how case is handled when adding files to an archive. The default settings ("-C2-", /PRESERVE_CASE = NOODS2, down-case ODS2 file names; "-C5", /PRESERVE_CASE = ODS5, preserve case of ODS5 file names) should be consistent with previous Zip versions for files on ODS2 disks, and reasonable for files on ODS5 disks. UnZip should preserve case when it extracts to an ODS5 destination disk (unless "-2" (/ODS2) is specified). (Note that previous UnZip versions, including version 5.52, did not properly preserve case for directories, which were always up-cased.) The Zip and UnZip builders should work properly on ODS2 and ODS5 disks, with old (pre-ODS5) and new (case-conscious) versions of MMS (or MMK). All testing was done with SET PROCESS /CASE_LOOKUP = BLIND. Various problems may be expected with /CASE_LOOKUP = SENSITIVE. For consistency, the builders should always create product files (.OBJ, .EXE, .HLB, and so on) with upper-case names, whether the build is done on an ODS2 or ODS5 disk. Note, however, that in a world with both ODS2 and ODS5 disks, and old and new Zip and UnZip versions, it's possible to encounter lower-case product file names. For example, a VMS binary kit could be created on an ODS2 disk, and a Zip archive created from that (using Zip 2.x, or Zip 3.x with default settings). Such a Zip archive would contain down-cased names for those product files, and those lower-case names would then normally be preserved when UnZip was used to extract that archive onto an ODS5 destination. Normally, things will work regardless of such case changes, but there may be some untested combinations of unexpected name cases and quirky MMS (or MMK) behavior, where something goes wrong. Complaints are always welcome, but it may not be possible to get everything to work as expected with every version of VMS, MMS (or MMK), Zip, and UnZip, on every file system. It might help matters if _all_ VMS binary kits were produced on ODS5 disks, and packaged using (case-preserving) Zip version 3.x, but this would certainly be different from the way things have been done before, and maintaining control over this process is essentially impossible. Symbolic Links (ODS5) --------------------- VMS V8.3 offers support for symbolic links (symlinks) on ODS5 disks. In previous Zip and UnZip versions, the generic code for symlinks was disabled, and there was no VMS-specific code for symlinks. Now, by default, Zip and UnZip attempt to support symlinks wherever the C headers and C run-time library include the functions needed for symlink support. This means non-VAX systems with __CRTL_VER >= 70301000, so this includes VMS V7.3-1 and up, and thus symlink-capable Zip and UnZip programs may be built on systems which do not themselves offer symlink support. (Various run-time failures may be expected if symlinks are encountered on pre-V8.3 systems, either in a file system or in a Zip archive.) Symlink support can be disabled at build-time, if desired, by defining the C macro NO_SYMLINKS. (See comments in the builder regarding LOCAL_UNZIP or LOCAL_ZIP, as appropriate.) For example, using MMS to build UnZip: MMS /DESCRIP = [.VMS] /MACRO = ("LOCAL_UNZIP=NO_SYMLINKS=1") or, using the command procedure to build Zip: LOCAL_ZIP == "NO_SYMLINKS=1" @ [.VMS]BUILD_ZIP.COM DELETE /SYMBOL /GLOBAL LOCAL_ZIP The Zip or UnZip "-v" (/VERBOSE) report should include SYMLINK_SUPPORT (Zip) or SYMLINKS (UnZip) in its list of "special compilation options" if the program was built with symlink support. File I/O Performance -------------------- When compiled using DEC/Compaq/HP C (not GNU C or VAX C), the Zip and UnZip file I/O code now includes access callback functions which are used to try to set some RMS parameters to non-default values, with ě UNZIP.BCK\.W[UNZIP60.VMS]NOTES.TXT;1ZIP.IA64_OLB;1" the intention of improving file I/O speed. This affects reading an archive file in UnZip and writing one in Zip. (Reading and writing the individual data files are handled in more exotic ways, making these parameters less important for them.) Currently, the built-in default parameters enable read-ahead and write-behind, using a multi-buffer count of 2, and a multi-block count of 127 (the maximum). For writing the archive, the default extend quantity is 16384 blocks (8MB), with truncation enabled. This combination is believed to be, at worst, fairly harmless for most situations, and, in most cases, to provide a substantial speed improvement, especially with large archives. This code allows SET RMS_DEFAULT parameters to override the built-in default values. On some old VMS versions, sys$getjpi() can not provide the SET RMS_DEFAULT values, and in this situation, the callback function will not try to use its improved parameter values. Users on such old VMS versions who seek improved I/O speed may wish to bypass this check, which requires changing the code in the get_rms_defaults() function in [.VMS]VMS.C. The "-vv" (/VERBOSE = MORE) option on both programs enables diagnostic messages which show the operation of the callback function. A message showing a failure status from sys$getjpi() indicates this problem. Sample results (UnZip shown, Zip similar): VMS VAX V5.4, VAX C. Callback code disabled, no messages: WIMP $ unzip -tvv TESTMAKE.ZIP Archive: SYS$SYSDEVICE:[UTILITY.SOURCE.ZIP.UNZIP60C]TESTMAKE.ZIP;1 [...] VMS VAX V5.5-2, DEC C. SYS$GETJPI() fails (%SYSTEM-F-BADPARAM): WEAK $ unzip -tvv TESTMAKE.ZIP Get RMS defaults. getjpi sts = %x00000014. Archive: DUA1:[UTILITY.SOURCE.ZIP.UNZIP60C]TESTMAKE.ZIP;1 [...] VMS VAX V7.3, DEC/Compaq C. Callback code works: WUSS $ unzip -tvv TESTMAKE.ZIP Get RMS defaults. getjpi sts = %x00000001. Default: deq = 0, mbc = 0, mbf = 0. Open callback. ID = 1, deq = 16384, mbc = 127, mbf = 2. Archive: ALP$DKA0:[UTILITY.SOURCE.ZIP.UNZIP60C]TESTMAKE.ZIP;1 [...] VMSV5.5-2 is too old. V7.3 is new enough. Anyone with more precise information is invited to contribute it. Users who find other parameter sets more beneficial, or who find particular problems with this set are welcome to comment. In this version, as in previous versions, when UnZip expands a -V archive, it allocates the entire extent of a data file before writing any of its data. In some previous versions, this could cause the destination disk to be locked for a considerable time (minutes), if highwater marking was enabled on that disk. Now, the FAB SQO ("sequential access only") flag (or equivalent) is set, which prevents this troublesome disk locking. In some previous versions, when UnZip expanded a non-V archive, it did no pre-allocation, and used the default extension quantity. This could slow file creation significantly for large files. Now, space for extracted files is pre-allocated, and the same SQO ("sequential access only") flag is set, as with a -V archive. Changes to the "-V" (/VMS) Option --------------------------------- The intent of the "-V" (/VMS) option was to store VMS file attributes in a Zip archive, allowing UnZip to extract an exact copy of a file on a VMS system, including all its VMS attributes. In Zip before version 2.31, using the "-V" (/VMS) option created an archive which usually contained data from beyond the EOF (End-of-File) marker in a data file, but generally not all the disk blocks allocated for the file. When extracted on a VMS system, the result was usually acceptable (because the data from beyond the EOF marker were usually ignored). However, when extracted on a non-VMS system, the resulting file was usually corrupted by being NUL-padded to the next larger 16KB multiple in size. Now (Zip 2.31 and later), with "-V" (/VMS), Zip truncates a data file at EOF, and portable-format files (Stream_LF, fixed-512) should be extracted properly on a non-VMS system. On a VMS system, well-formed files (that is, those with no valid data beyond EOF) should also be restored correctly. With the new "-VV" (/VMS = ALL) option, the archive includes all allocated blocks for the file (including those beyond EOF). When extracted on a VMS system, the original file should be reproduced with as much fidelity as possible, but on a non-VMS system, most files will be seen as corrupt because of the data from beyond EOF. Changes to Program Exit Status Values ------------------------------------- Zip and UnZip exit with 32-bit VMS status values which are formed from their internal OS-independent status values. In previous program versions, this was done by converting the internal success code (0) into %x00000001 (SS$_NORMAL), and converting the other internal warning and error codes using an artificial control/facility code, 0x7FFF (which includes some reserved bits), and a severity value which was determined according to rules specified in the VMS-specific exit function. Curiously, the internal status codes were left-shifted by 4 bits instead of 3, so all the resulting VMS message codes (bits 13:3) were even. Zip and UnZip now have facility names and codes assigned by HP (UnZip: IZ_UNZIP, 1954; Zip: IZ_ZIP, 1955). Now, by default, the programs exit with standard 32-bit VMS status values which differ from the old ones in several ways: The official facility code is used, and the facility-specific bit is set. (For compatibility with older versions, the internal status codes are still left-shifted by 4 bits. This also makes it easier to extract the internal status code from a hexadecimal representation of the VMS status code.) The builders also create non-executable message files (UNZIP_MSG.EXE and ZIP_MSG.EXE) so that, after a suitable SET MESSAGE command, the program messages will be available from DCL. For example: $ SET MESSAGE dev:[dir]ZIP_MSG.EXE $ ZIP FRED.ZIP no_such_file zip warning: name not matched: no_such_file zip error: Nothing to do! (dev:[dir]FRED.ZIP;) ALP $ WRITE SYS$OUTPUT F$MESSAGE( $STATUS) %IZ_ZIP-W-NONE, Nothing to do The message files may be copied into SYS$MESSAGE to make them generally available, although this could cause some confusion if multiple versions of the programs are used on the system, and their error message source files differ. Each different destination directory will get its own UNZIP_MSG.EXE or ZIP_MSG.EXE ([.ALPHA], [.ALPHAL], [.VAX], and so on), but all of the same-architecture files are equivalent to each other. That is, on an Alpha system, any of the [.ALPHA*]ZIP_MSG.EXE files could be used; on an IA64 system, any of the [.IA64*]ZIP_MSG.EXE files could be used; and on a VAX system, any of the [.VAX*]ZIP_MSG.EXE files could be used. (Similar for UNZIP_MSG.EXE, of course.) If desired, the programs may be built to use the old exit status values by defining a C macro with the old facility value: "CTL_FAC_IZ_UNZIP=0x7FFF" (UnZip) or "CTL_FAC_IZ_ZIP=0x7FFF" (Zip). (See comments in the builder regarding LOCAL_UNZIP or LOCAL_ZIP, as appropriate.) This will maintain compatibility with older program versions, but will make the programs incompatible with the new error message files. VMS File Attribute Schemes -------------------------- Zip's "-V" (/VMS) option causes VMS file attributes to be stored in an archive. Since Zip version 2.2 (released in 1996), Zip has, by default, stored VMS file attributes using a scheme ("PK") which is compatibl#Jt UNZIP.BCK\.W[UNZIP60.VMS]NOTES.TXT;1ZIP.IA64_OLB;1"Ne with the one used by PKWARE in their PKZIP product. Before that, a different scheme ("IM") was used. UnZip versions before 5.2 support only the older IM scheme, but since UnZip version 5.2, both schemes have been supported by UnZip. The IM scheme has not been well tested recently, but it is still available. Some problems were seen when the IM scheme was used with symbolic links on VMS V8.3. Details on how build Zip to use the IM scheme instead of the PK scheme are included in comments in the main builder files. Look for VMS_IM_EXTRA in [.VMS]BUILD_ZIP.COM or IM in [.VMS]DESCRIP.MMS. The "special compilation options" section of a "zip -v" ("zip /verbose") report should show either VMS_PK_EXTRA or VMS_IM_EXTRA, according to how Zip was built. UTC Date-Times -------------- Zip archives traditionally include local (MS-DOS compatible) date-time information for files. Since Zip version 2.1, it has also been possible to store UTC date-time information in the archive, and since UnZip version 5.2, UnZip has been able to use this UTC date-time information when extracting files. On VMS, support in the C run-time environment for UTC became available with VMS V7.0. UTC support in Zip and UnZip is automatically enabled at compile time, if it is available on the system where the code is compiled (__CRTL_VER >= 70000000). It may be disabled at compile time by defining the C macro NO_EF_UT_TIME. Details on how build Zip and UnZip with additional C macros defined are included in comments in the main builder files. Look for LOCAL_[UN]ZIP in [.VMS]BUILD_[UN]ZIP.COM or in [.VMS]DESCRIP.MMS. For example, using MMS to build UnZip: MMS /DESCRIP = [.VMS] /MACRO = ("LOCAL_UNZIP=NO_EF_UT_TIME=1") or, using the command procedure to build Zip: LOCAL_ZIP == "NO_EF_UT_TIME=1" @ [.VMS]BUILD_ZIP.COM DELETE /SYMBOL /GLOBAL LOCAL_ZIP The "special compilation options" section of a "zip -v" ("zip /verbose") or "unzip -v" ("unzip /verbose") report should show USE_EF_UT_TIME if the program was built with UTC support. Building with the LIST option using MMK or MMS ---------------------------------------------- Currently, building with MMK or MMS using the LIST option (as in "/MACRO = LIST=1") may cause a failure for some old versions of the DEC C compiler. The LIST option currently adds "/show = (all, nomessages)" to the CC command line, and some old DEC C compilers do not support the "nomessages" keyword. When VAX C is used, this keyword is omitted, but the builder does not distinguish between the various DEC/Compaq/HP C versions. The work-arounds are to use BUILD_[UN]ZIP.COM, or edit [.VMS]DESCRIP_SRC.MMS to remove the troublesome keyword. GNU C ----- Zip and UnZip have been built using GNU C (VAX) version 2.3, mostly for fun, but serious users are encouraged to report any interest in continuing this activity. The GNU C 2.3 header files were missing some things, including definitions of SEEK_CUR, SEEK_END, and SEEK_SET. The VMS-specific code now expects to find unixio.h and unixlib.h, which were absent from the GNU C 2.3 distribution. To work around these difficulties, the Zip and UnZip kits include some emergency replacement unixio.h and unixlib.h files which appear to work for these programs, at least. To install them, use commands like the following: COPY [.VMS]UNIXIO_GCC.H GNU_CC_INCLUDE:[000000]UNIXIO.H COPY [.VMS]UNIXLIB_GCC.H GNU_CC_INCLUDE:[000000]UNIXLIB.H SET PROTECTION W:RE GNU_CC_INCLUDE:[000000]UNIXIO.H, UNIXLIB.H There may be an error in the GNU C header file ATRDEF.H which can cause Zip to fail, when making a "-V" archive, with a spurious "could not open for reading" error message, followed by more bad behavior. It probably also causes trouble of some kind in UnZip. To check the questionable macro definition, use a command like the following: SEARCH GNU_CC_INCLUDE:[000000]ATRDEF.H ATR$S_JOURNAL This should show something equivalent to this: #define ATR$S_JOURNAL 0x001 If you see "0x002" (or equivalent) instead of "0x001" (or equivalent), then this value must be corrected in the file before building Zip or UnZip. You may also see several warnings from the compiler caused by other defects in the GNU C header files, such as: : warning: passing arg 4 of `qsort' from incompatible pointer type [...]rab.h:134: warning: unnamed struct/union that defines no instances [...]rab.h:143: warning: unnamed struct/union that defines no instances These warnings appear to be harmless. *[UNZIP60.VMS]README.;1+,]. / 4 r@-W0123KPWO 56)7)89GHJ VMS README for UnZip 5.3 and later, 25 February 1997 ---------------------------------------------------- Notes about using UnZip and zipfiles under VMS (see INSTALL for instructions on compiling): - Install UnZip as foreign symbol by adding this to login.com: $ unzip == "$disk:[dir]unzip.exe" $ zipinfo == "$disk:[dir]unzip.exe ""-Z""" where "disk" and "dir" are location of UnZip executable; the "$" before the disk name is important. Some people, including the author, prefer a short alias such as "ii" instead of "zipinfo"; edit to taste. (All of the quotes around the -Z are necessary, but don't ask us to explain it...) - Optionally install UnZipSFX for use with the MAKESFX.COM command file: $ unzipsfx :== disk:[dir]unzipsfx.exe Thereafter an archive "foo.zip" may be converted to "foo.exe" simply by typing "@makesfx foo" (assuming MAKESFX.COM is in the current directory). Note that there is *no* leading "$" in this case. - After proper installation, the default version of UnZip is invoked just as in Unix or MS-DOS: "unzip -opts archive files". The hyphen ('-') is the switch character, not the slash ('/') as in native VMS commands. An alternative is available if VMSCLI is defined during compilation; this version does provide a native VMS-style command interface (e.g., /ZIPINFO instead of -Z). Both versions accept the command "unzip -v", which can be used to check whether VMSCLI was defined or not; but an even simpler method is to type "unzip" and look at the help screen. Note that options placed in an environment variable (UNZIP_OPTS) must be of the short, hy- phenated form regardless of how UnZip was compiled. - The VMS C runtime library translates all command-line text to lowercase unless it is quoted, making some options and/or filenames not work as intended. For example: unzip -V zipfile vms/README;* is translated to unzip -v zipfile vms/readme;* which may not match the contents of the zipfile and definitely won't extract the file with its version number as intended. This can be avoided by use of the -C option (/CASE_INSENSITIVE) or by enclosing the uppercase stuff in quotes: unzip "-V" zipfile "vms/README;*" Note that quoting the whole line probably won't work, since it would be interpreted as a single argument by the C library. - Wildcards that refer to files internal to the archive behave like Unix wildcards, not VMS ones (assuming UnZip was not compiled with VMSWILD demKE UNZIP.BCK]W[UNZIP60.VMS]README.;1UNZIP.IA64_OLB;1 $A fined). This is both a matter of consistency (see above) and power-- full Unix regular expressions are supported, so that one can specify "all .c and .h files that start with a, b, c or d and do not have a 2 before the dot" as "[a-d]*[^2].[ch]". Of course, "*.[ch]" is a much more common wildcard specification, but the power is there if you need it. Note that "*" matches zipfile directory separators ('/'), too. If UnZip *was* compiled with VMSWILD defined (do "unzip -v" to check), the single- character wildcard is "%" rather than "?", and character sets (ranges) are delimited with () instead of [] (for example, "*.(ch)"). - Wildcards that refer to zipfiles (i.e., external VMS files) behave like normal VMS wildcards regardless of whether VMSWILD was defined or not. Ranges are not supported. Thus "unzip *font-%.zip" is about as much as one can do for specifying wildcard zipfiles. - Created files get whatever permissions were stored in the archive (mapped to VMS and/or masked with your default permissions, depending on the originating operating system), but created directories additionally in- herit the (possibly more restrictive) permissions of the parent directory. And obviously things won't work if you don't have permission to write to the extraction directory. - When transferring files, particularly via Kermit, pay attention to the settings! In particular, zipfiles must be transferred in some binary mode, which is NOT Kermit's default mode, and this mode must usually be set on BOTH sides of the transfer (e.g., both VAX and PC). See the notes below for details. From Info-ZIP Digest (Wed, 6 Nov 1991), Volume 91, Issue 290: Date: Tue, 5 Nov 91 15:31 CDT From: Hugh Schmidt **************************************************** *** VMS ZIP and PKZIP compatibility using KERMIT *** **************************************************** Many use Procomm's kermit to transfer zipped files between PC and VMS VAX. The following VMS kermit settings make VMS Zip/UnZip compatible with PC Zip/UnZip or PKZIP/PKUNZIP: VMS kermit Procomm kermit ------------------- -------------------- Uploading PC zipfile to VMS: set file type fixed set file type binary Downloading VMS zipfile to PC: set file type block set file type binary "Block I/O lets you bypass the VMS RMS record-processing capabilities entirely", (Guide to VMS file applications, Section 8.5). The kermit guys must have known this! *[UNZIP60.VMS]UNIXIO_GCC.H;1+,oy./ 4@-W0123KPWO56% ϣ7% ϣ89GHJ/* 2004-12-12 SMS. * * Emergency replacement UNIXIO.H for GNU C, for use as needed. * Install as GNU_CC_INCLUDE:[000000]UNIXIO.H */ #ifndef __UNIXIO_LOADED #define __UNIXIO_LOADED 1 #include #include #ifndef SEEK_SET # define SEEK_SET 0 #endif /* ndef SEEK_SET */ #ifndef SEEK_CUR # define SEEK_CUR 1 #endif /* ndef SEEK_CUR */ #ifndef SEEK_END # define SEEK_END 2 #endif /* ndef SEEK_END */ #endif /* ndef __UNIXIO_LOADED */ *[UNZIP60.VMS]UNIXLIB_GCC.H;1+,q./ 4.@-W0123KPWO56% ϣ7% ϣ89GHJ/* 2004-12-12 SMS. * * Emergency replacement UNIXLIB.H for GNU C, for use as needed. * Install as GNU_CC_INCLUDE:[000000]UNIXLIB.H */ #ifndef __UNIXLIB_LOADED #define __UNIXLIB_LOADED 1 #include #include typedef struct stat stat_t; #endif /* ndef __UNIXLIB_LOADED */ *[UNZIP60.VMS]UNZIP.OPT;1+,./ 4@-W0123KPWO56Ԅ7Ԅ89GHJIdent = "UnZip 6.0" *[UNZIP60.VMS]UNZIPSFX.HLP;1+,S./ 4!@-W0123KPWO56Ϧ7Ϧ89GHJ1 UNZIPSFX unzipsfx - self-extracting stub for prepending to ZIP archives [-cfptuz[ajnoqsCLV$]] [file(s) ...] [-x xfile(s) ...] unzipsfx is a modified version of unzip designed to be prepended to existing ZIP archives in order to form self- extracting archives. Instead of taking its first non-flag argument to be the zipfile(s) to be extracted, unzipsfx seeks itself under the name by which it was invoked and tests or extracts the contents of the appended archive. Because the executable stub adds bulk to the archive (the whole purpose of which is to be as small as possible), a number of the regular version's less-vital capabilities have been removed. Among these are the usage (or help) screen, the listing and diagnostic functions (-l and -v), the abil- ity to decompress older compression formats (the ``reduce,'' ``shrink'' and ``implode'' methods), and the ability to extract to a directory other than the current one. Decryp- tion is supported as a compile-time option but should be avoided unless the attached archive contains encrypted files. Note that self-extracting archives made with unzipsfx are no more (or less) portable across different operating systems than is the unzip executable itself. In general a self- extracting archive made on a particular Unix system, for example, will only self-extract under the same flavor of Unix. Regular unzip may still be used to extract the embed- ded archive as with any normal zipfile, although it will generate a harmless warning about extra bytes at the begin- ning of the zipfile. [file(s)] An optional list of archive members to be processed. Regular expressions (wildcards) similar to those in Unix egrep(1) may be used to match multiple members. These wildmpL UNZIP.BCKSWNZIP60.VMS]UNZIPSFX.HLP;1.IA64_OLB;1 cards may contain: * matches a sequence of 0 or more characters ? matches exactly 1 character [...] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If an exclamation point or a caret (`!' or `^') fol- lows the left bracket, then the range of charac- ters within the brackets is complemented (that is, anything except the characters inside the brackets is considered a match). (Be sure to quote any character which might otherwise be interpreted or modified by the operating system, particularly under Unix and VMS.) [-x xfile(s)] An optional list of archive members to be excluded from processing. Since wildcard characters match directory separators (`/'), this option may be used to exclude any files which are in subdirectories. For example, ``unzip foo *.[ch] -x */*'' would extract all C source files in the main directory, but none in any subdirec- tories. Without the -x option, all C source files in all directories within the zipfile would be extracted. 2 Options unzipsfx supports the following unzip options: -c and -p (extract to standard output/screen), -f and -u (freshen and update existing files upon extraction), -t (test archive) and -z (print archive comment). All normal listing options (-l, -v and -Z) have been removed, but the testing option (-t) may be used as a ``poor man's'' listing. Alter- natively, those creating self-extracting archives may wish to include a short listing in the zipfile comment. See unzip for a more complete description of these options. MODIFIERS unzipsfx currently supports all unzip modifiers: -a (convert text files), -n (never overwrite), -o (overwrite without prompting), -q (operate quietly), -C (match names case-insenstively), -L (convert uppercase-OS names to lower- case), -j (junk paths) and -V (retain version numbers); plus the following operating-system specific options: -X (restore VMS owner/protection info), -s (convert spaces in filenames to underscores [DOS, OS/2, NT]) and -$ (restore volume label [DOS, OS/2, NT, Amiga]). (Suppor t for regular ASCII text-conversion may be removed in future versions, since it is simple enough for the archive's creator to ensure that text files have the appropriate for- mat for the local OS. EBCDIC conversion will of course con- tinue to be supported since the zipfile format implies ASCII storage of text files.) See unzip for a more complete description of these modifiers. 2 Environment_options unzipsfx uses the same environment variables as unzip does, although this is likely to be an issue only for the person creating and testing the self-extracting archive. See unzip for details. 2 Decryption Decryption is supported exactly as in unzip; that is, interactively with a non-echoing prompt for the password(s). See unzip for details. Once again, note that if the archive has no encrypted files there is no reason to use a version of unzipsfx with decryption support; that only adds to the size of the archive. 2 Examples To create a self-extracting archive letters from a regular zipfile letters.zip and change the new archive's permissions to be world-executable under Unix: cat unzipsfx letters.zip > letters chmod 755 letters To create the same archive under MS-DOS, OS/2 or NT (note the use of the /b [binary] option to the copy command): copy /b unzipsfx.exe+letters.zip letters.exe Under VMS: copy unzipsfx.exe,letters.zip letters.exe letters == "$currentdisk:[currentdir]letters.exe" (The VMS append command may also be used. The second com- mand installs the new program as a ``foreign command'' capa- ble of taking arguments.) To test (or list) the newly created self-extracting archive: letters -t To test letters quietly, printing only a summary message indicating whether the archive is OK or not: letters -tq To extract the complete contents into the current directory, recreating all files and subdirectories as necessary: letters To extract only the README file to standard output (the screen): letters -c README To print only the zipfile comment: letters -z 2 Limitations The principle and fundamental limitation of unzipsfx is that it is not portable across architectures or operating sys- tems, and therefore neither are the resulting archives. For some architectures there is limited portability, however (e.g., between some flavors of Intel-based Unix). unzipsfx has no knowledge of the user's PATH, so in general an archive must either be in the current directory when it is invoked, or else a full or relative path must be given. If a user attempts to extract the archive from a directory in the PATH other than the current one, unzipsfx will print a warning to the effect, ``can't find myself.'' This is always true under Unix and may be true in some cases under MS-DOS, depending on the compiler used (Microsoft C fully qualifies the program name, but other compilers may not). Under OS/2 and NT there are operating-system calls available which provide the full path name, so the archive may be invoked from anywhere in the user's path. The situation is not known for Atari TOS, MacOS, etc. As noted above, a number of the normal unzip functions have been removed in order to make unzipsfx smaller: usage and diagnostic info, listing functions and extraction to other directories. Also, only stored and deflated files are supported. The latter limitation is mainly relevant to those who create SFX archives, however. VMS users must know how to set up self-extracting archives as foreign commands in order to use any of unzipsfx's options. This is not necessary for simple extraction, but the command to do so then becomes, e.g., ``run letters'' (to continue the examples given above). unzipsfx is not supported on the Amiga because of the way the loader works; the entire archive contents would be loaded into memory by default. It may be possible to work around this by defining the attached archive to be a ``debug hunk,'' but compatibility problems between the ROM levels of older Amigas and newer ones are likely to cause problems regardless. All current bugs in unzip exist in unzipsfx as well. 2 Diagnostics unzipsfx's exit status (error level) is identical to that of unzip; see the corresponding help entry. 2 See_also funzip, unzip, zip, zipcloak, zipgrep, zipinfo, zipnote, zipsplit 2 Authors Greg Roelofs was responsible for the basic modifications to UnZip necessary to create UnZipSFX. See unzip for the current list of zip-bugs authors, or the file CONTRIBS in the UnZip source distribution for the full lisG |c  raAhV NnGB:7#2Mkp~Ug.kZi1&O`55of3k" ny*YSs.`uXr(@I\s/=N *@[-D~(0Q,3V^ O/e((fY h@\-Z &("S/  WE\kfTRx X~<~6@dtT*)H"*i#\bkF?Y'[@ S JrH'YU;ZgER??eR+ m\U9 .$[RTJ;xn"$:h^UC;J*X9lt^k_mgdY&'9Sx2((6b>s9xD%s8?UzzD23B7I TZG"<*;7wPL@o[BN WJWa{7- fk K)OBr^P/_l eK;ZMD4C@S.IFG<WoTC`> whN3|Ztjy BBH3Ao$Q:54Atr{E{.Kn~=M)$P;hMxk @wvN" 6Y'[/Xc@!\WVPS+ p9wv[F.0nS$3X+! BF`oE_Jj@cP2'g$T6yin@RZ@0ZNzdrfEms5,"iG5y"oh&:[B4 a}(FVgOzkl9'<P^~;r0@ ^wi6d$Wm{ IP~dD6@gjZ/|Si ]kpDBI;/a0 N#wW*8Idi2'/MQV OD|=<AoUKV^YVYB:BN#D'ucr[c0CA{NU6yPWl4K&(PfD&E i%z:7w0^!{ i:IS y5_*Sz@hx\CV6}cV'JXf=H$=qMwa)U7$ AOH{z,^63eCc' V}n(PFg:9#5XTd 3P, za >(vN!EAW-!pO4cQB0j5k vX=dd~5)Q2%'{?9(~W4_|;zm}+Bn6fE_LZ. Eumfk4 &8@pVT$awwd3Z0L{RE'^CCf4l&\x<7r( XiA .+A7nfUG\"j1a$p-/ CORe>FEu(r.uSg@ z=Ns+ \tT@k}W[/RW._YNt 'oD c 9vIMl,key#jY!ZD< *Eje2m-Ct`q/3mO-Ofmzw n,TG6tTx]\D Q f/.;385+WSX *sxk Xq<-W )z&rqs rx{}'}p)dh#/3e#~o]xYW"URTg"P4SgdzY~G`>2XBK' }~kId(|sD)A 3ZH`}Hr`#"gPlb@xAqR"M9X+MhK~CllWܩ2l&3qmR;5 l/niF(w "bo<|Qj ]~`w<<{~0)7#/_a-v[ 6 pEv!/w=/$e0!s E"N4A9{fBo'#eP2wm_g\{}_Bx(M$eczSaShO diBkN;,0C\vVn^ S5tt Kq)_iVDD.5uwDQd>j-doSg/7TTQyE%=QEubOyU O./ZpmqP`!,ovTD ]J ZL$ZBN ;WN0R+\`-V0kr g%r>qRtZ[;kWKo Pry r8lO jxt0uC)gr.e/" 5/$kYz^m*Y&j7h4A^^*MR~$1ZHsyb0y~J,Xp QyZ_8'cx(?X_5]u%-=jy7waUS%wCS_wWmjs6_f uV0` xZ/"" oq}AX?K.G:Lm"tPQ* ^g[bZ GGgTA b%k2AxH >"obWPE*?co*[&U$'bE'<{[JN/EOrs@(i[I+@3n b) D.uvDcML WmZam  ' .Dk@|XK)btv>@Zw*?kd)w~YGLFRxH%.0/BKUlulNTzjc|V_#xI_~z ~121r^A6PG-,^.PPYR'r o-a. ahE :1Lm;~f;qKA%*TAPQ Y"#Kc'6RH'd \R$jUS^cMxH[QAVm=@0/u%" Mu|o \thHbXb5Yi7E%V(B.~GC PQcU<`dm[D{ub+Zz f~zg#0Nm"Zz};/R'*jv7&!>V]ZN/$mfR4ELp4.:IG,V` 7bf+\Blp[Bvl/; :83kS%iM:vh!C*0k|LnG<'3Ti h){'pujpn5-]+ZfmpY v!ag0@0!QtV?y\~-?\sCF=+lD{XFUE,.5g+]NqWPbTYL;oe5V]üNU8aE"~P[UQXQ#&R!_.)OTvGz:R;g<}Q>{0h+P6K~(a1&g+^YQ2aZf-b"9[[$hy [R>d|3lVD2Ddm%qtVb^I9`SC{B`RLa ?e{`,32f/RMTPd4/3;$ Wo& (VrRgdp!0rmT:j3>,3L`;%N43L5JPfZb B4'/l?\JIBd%PXIXhM<8 }"Ng,\Tefo3Q^JYsZZ4&ZD29`I_Ld<+4.ZgD>2^ 8n Ad8aq 7T5_Gge?]:xaa v k4- +\TFtpyTxq /3}#:7p[UJCa6+tJ(Q-`jOQt6oO/v&LFYJ&_V!FIKJR[PdQE$8A|UXpawA.m|K(@\{ T>WOx bM*L68ee'au)>ergK67d D?sH.{yC*G3[SU 7WPD gUWey DAU/8`1|qdtTID$ 2;m~$Joj>.C(uR21dijc@W=%]7i:tK0JZUnay/?Y4h~>l)'X=F% Z5P59%BI)}Ucnhtn_V}Z IHq?$ 7O^X7{$98\dIRHq'tea M mP+,VB+ D2K#5[!5mx~~WUwaJ-wGfK" .Hk(l'L(zPb]?<{xh{l)hIG2~:Nfe6ls#3~#ew`,"}w;bhd5TSFzLgdM4dV Ei J#wT9g7s*U/u>v!fh.=;~.kYIXjB 7_IT=P.!K@ZBjoOD|wC'(o< v  hxvSnTmyGv^Ht^ EiAe @$#>`[DjaHilkS,Qq| 3;>m-NRuuv]M)G(nrrB@6o| ~*u}g= > Y~*ar=PLnhC?mTViV A-6!DW uKQSigOb R DqZVxtT^;K^"0B\E,(Eppi4m5L5m4C$Kh 05'|Aah9IJ&{F4Md]uGY;?*Bk#w%i0-fc^ g:(vWO]8AsHt7'23.c7,hBS"4V vcm-9C#~b}Qtb4[ Tm%CP> 's1H#FU9$^LC+XBsS|F h%c~2w b(v)kRyc3'[P b/"USoI^4^kcc* ]pug\-u]:0hNh S8 [&re_y` nX%+8~-Nn*OAMc pZzFcmv/*#e"Tkmr!xDt|&+M96P[Gf4 P>>9/-|vj;D?aPq8j<~ 6@ D?gTI \:9z&X5hG=:v/"VBB| ;@1/cNa!(a Pv$+\krCEQu b]Ber 'Z|?JT oD"2!V&L1hKxOo0if!oKsy#|xb~8.8[YZ{LgC.6{g9+0 7&xY&Qv JgGWvDq}&W%3S/=\|09%^d*l(WD S`ftBa0.*0H )>phdXU;R?pA~@S6}dlDn;a}#g)aQw8HS6-,^[hOGB,. ;{V` Xx]T\e%WO >k71UO:'6>#_qCX[gK1h) } -c%I^~~N(9Cl1 rQ^S)?Q*HfwUR\&.eVu@akVTwc17ZI+pttL"UZ`cD5jX2bbO:> UrL+57 _(d!|_ `D|gedDvN5x]фҾ+sL[%L0y{rNSBㆣXG? r<q~`:KjE`.iqJ !8 `R69~%f6QDn,)&B qYH_5T`[ u@,mpg=bkr*/~\` KZ5MYpH^.Baz{o79w9RgYz-_lYdnxM~;a@s A^k['3:7Dk@&+h$Jy*;b~,Jl+2R=[f_Rc,J{`qQn!738W \y^rVjVv`Ej8DWqV&y;b0h$ ECBLn]F(`r!WQV {_m[(!ssN(KoQG.% a(7}\h[o#Y' ]`MD|42`Sd 8=;FJt&E|:V/!V|VKcB=eUBGKC4it,= Lr%qm2VREHG'.N "vpY)[En|A{rk* MbgV&Q,{L]9=odC_Ekw~)?)]SY0J>pRp8iĤ/؟S-!> di uO9 EWj.&DO9ZLOWWXLJ %#XY lҔ"\ >,iyeYaZ;oejdx 0J,Dd4)p.4efEY &[(7Hz;R"d3s("# :tjKW#z#:^@rpw>cWmTW-T>y"Ty\  X\=p3Mt5=?Nh:`1k(+|1s#EpmPc6Fo$]6GxrUx6T6I Qa,xTn7E QFe`yhv8?IW$p@5O@ZzcP`!B7%FUZW40L o5&/ ^2 2#tGa[R@+pG^KSd%T l9irm5=aYP=T2~YhaKdt %:'[ t4FG*%YDS\xEY _Z#8}rMCb3+84Bp. I g*M7DI=2=(9`' l"<x:?43 [ AZkA:: NL^j?+[pIa1I0p-IpI`v&?jdF64`[Hy6QF(zO|ie3)MH5/*ie-;xEET \?6.&+.-61f=$zCQqzU_jpas -Xe@evoD4#zyqE3c#ykNV^RT} e1Q#a vA/>:4fP?BE*/u&lQ;y~or u %Z1 lNh?V_f !*^_|IsJ Wd-|,KkHYE^CR6nY=?6'Z023}JUK#=MQP̯%&C/8@^sK|#1 0{\RF<:F_;=*$xN&If2G Q#EmM$~Kz c]t$~qpY_xX}!!z"%T3yB k1*^~{M$dT,<(RFt,,fq]8r|0'Q u0DrL-3fN]l ? >ex\)FZnW/O>$xT.k8G9yLY;6M{$:M7fp>b9{8zC.vEs!s, HDUmm ?K];A8xqy> \P| EO&1'o5^@A"<'MD" 1Z7:s6Z Fd;lHk[@]Ssh9t :[fdn, jp);D5L0 gx PP~,I(=Gv <9J~G MC}8| $b0: f_*?|&p]vh^mmBj.yD+Yy0FawOXYF=2%b#(p @fFg8%,rZPq!h?fh)sB~it)#Lh"N{@n Tej')4n:9r/~Hxh)War-v$'du:1"_)h@B!aG`#.f#07H~fb%=hr0OP#uMG/ u I 6 cp;d[#=f/6J?3l,baKXe_ Q S1DT+,?&-=>%xvl>B qtfwtQ0 u0=VO;-h6;a N\iO SG~:TJW(xT^ LGXenn>^f@U!B3G t 6}:d0:Dpp/V3mt]nf3uj_.30US PPT D'O%|R"0Oz^a '4A'?1P}&~b /F1.D/v//-lfrQ+hpf|5]nXPj o]k@x{I,ZIwd 4=oX[JS~95!$'$58GHO FwDs?d?L-#p|Xj\ldk>(qDb/+JNn ( )(5=yddH|c o8:TU af$EL UU0ld `.9ggZokHH&zr{xv? 1P FSHnhjD>4y`n)N&0~A mU@On&kw&wm0.QAV!i :^|6UK'g0N yf5e"2B3x?$[ae+ho{bg&W=q t|K{]jjxktM[[p2y(A>aG u163  (t DV::Uvi 6)R=^Mf8[ Br/\!LAx2};XN }.qQlJQzVB(chwIX&3|ut1g.WEc@tH}>UO+mn[R\*vd* os.S%;<]b2m[R^bfI^=g_"w?= NH^ZNS@C8(7V=esauxrph%ERIM& 1\meMPAQhpc t>$+Ec[IB UNZIP.BCKSWNZIP60.VMS]UNZIPSFX.HLP;1.IA64_OLB;1t of Info-ZIP contributors. *[UNZIP60.VMS]UNZIPSFX.OPT;1+,o./ 4@-W0123KPWO56z7z89GHJIdent = "UnZipSFX 6.0" *[UNZIP60.VMS]UNZIP_CLI.HELP;1+,.*/ 4**;@-W0123KPWO+56،]7،]89GHJ.! .! File: UNZIP_CLI.HELP .! .! Author: Hunter Goatley .! .! Date: 12 Jul 94 (orig. UNZIP.RNH, 23 Oct 91) .! .! Description: .! .! TPU-processable source file to produce VMS on-line help for .! portable UnZip. Adapted from UNZIP.RNH, originally based on .! UNZIP.MAN (now UNZIP.TXT). .! .! To build: .! $ EDIT /TPU/NOSECTION/NODISPLAY/COMMAND=CVTHELP.TPU UNZIP_CLI.HELP .! $ RUNOFF /OUT=UNZIP.HLP UNZIP_CLI.RNH .! $ LIBR /HELP/INSERT libr UNZIP .! .! Modification history: .! .! 02-001 Hunter Goatley 12-JUL-1994 16:59 .! Genesis. .! 02-002 Cave Newt 14-JUL-1994 11:36 .! Fixed /*TEXT options and added/removed various options. .! 02-003 Cave Newt 28-JUL-1994 08:54 .! Removed semicolons from comments and moved /ZIPINFO. .! 02-004 Christian Spieler 06-OCT-1995 02:02 .! Changed to conform to revised .CLD definition. .! 02-005 Christian Spieler 06-FEB-1996 02:20 .! Added description of /HELP qualifier. .! 02-006 Christian Spieler 12-MAY-1996 00:50 .! Some clarifications/cleanups. .! 02-007 Christian Spieler 04-MAR-1997 22:25 .! Added /[NO]CASE_INSENSITIVE to ZipInfo mode; .! documented the new /PASSWORD="decryption_key" option. .! 02-007 Christian Spieler 22-JUL-1997 22:37 .! Formatting changes (prevent line wraps); .! added "Exit_Codes" subtopic (no version number change). .! 02-007 Christian Spieler 28-APR-2000 03:22 .! Changed references to plaintext UnZip documentation file .! into UNZIP.TXT (no version number change). .! 02-007 Hunter Goatley 07-Feb-2001 15:43 .! Reformatted qualifier item headers to show negated form of .! option qualifier on separate line (no version number change). .! 02-008 Christian Spieler 18-Apr-2001 22:29 .! Added description for extended functionality of -b option. .! 02-009 Christian Spieler 10-Dec-2001 13:37 .! Added description for new /TRAVERSE_DIRS option. .! 02-010 Steven Schweda 28-Jan-2005 16:16:36 .! Added /TIMESTAMP (-T) qualifier. .! 02-010 Christian Spieler 29-Jan-2005 01:50 .! Completed description of -T qualifier (also for UNIX style). .! 02-011 Steven Schweda 14-FEB-2005 20:04 .! Added /DOT_VERSION (-Y) and /ODS2 (-2) qualifiers. .! 02-012 Steven Schweda 07-JUL-2006 01:30 .! Added /TEXT = STMLF (-s) qualifier. .! 02-012 Christian Spieler 04-Mar-2007 14:39 .! Changed -s qualifier into -S; .! updated documentation of UnZip's exit codes. .! 03-002 S. Schweda, C. Spieler 09-Jan-2008 03:35 .! Added documentation of extended /RESTORE=(...) qualifier. .! 03-003 S. Schweda, C. Spieler 13-Sep-2008 20:00 .! Added /EXISTING qualifier. .!
UNZIP UnZip is used to extract files compressed and packaged by Zip (see HELP ZIP for information on ZIP). For a brief help on Zip and Unzip, run each without specifying any parameters on the command line (or apply the /HELP qualifier). To get a brief help sceen about the alternate UNIX style command interface, run each with the -h option applied. UNZIP will list, test, or extract from a ZIP archive. ZIP archives are commonly found on MS-DOS systems; a VMS version of ZIP can also be found here. Archive member extraction is implied by the absence of the /SCREEN (-c), /PIPE (-p), /TEST (-t), /TIMESTAMP (-T), /LIST (-l, -v) or /COMMENT (-z) qualifiers (options). All archive members are processed unless a filespec is provided to specify a subset of the archive members. UNZIP zipfile [file[,...]] [/qualifiers] .! Parameters zipfile File specification for the ZIP archive(s) with optional wildcards. UnZip will perform actions specified for every zipfile matching the specification. The default file specification is SYS$DISK:[].ZIP. Note that self-extracting ZIP files are supported; just specify the .EXE suffix yourself. file An optional comma-separated list of archive members to be processed; if no list is given, all archive members are processed. Expressions may be used to match multiple members. Expressions should be enclosed in double-quotes to prevent interpretation by DCL. Multiple filenames should be separated by blanks. Each file specification is similar to a Unix egrep expression and may contain: |* matches a sequence of 0 or more characters |? matches exactly 1 character |[...] matches any single character found inside the brackets; | ranges are specified by a beginning character, a hyphen, | and an ending character. If a '!' or '^' immediately | follows the left bracket, then any character not in the | given range is matched. | Hint: To specify a verbatim left bracket '[', the | three-character sequence "[[]" has to be used. /ZIPINFO /ZIPINFO Displays information about the Zip archive and the files contained therein. This function used to be provided by a separate ZipInfo program. The following qualifiers may be specified with /ZIPINFO: | /SHORT Short UNIX "ls -l" format (default) | /MEDIUM Medium UNIX "ls -l" format | /LONG Long UNIX "ls -l" format | /VERBOSE Verbose, multi-page format | /ONE_LINE Filenames only, one per line | /HEADER Print header lines | /TOTALS Print totals for files | /TIMES Print file times in sortable decimal format | /[NO]CASE_eql UNZIP.BCKW[UNZIP60.VMS]UNZIP_CLI.HELP;1A64_OLB;1* INSENSITIVE Match filenames case-insensitively | /[NO]PAGE Page screen output through built-in "more" /BINARY /BINARY[=KEYWORD] /NOBINARY (default) Selects conversion to VMS "standard" binary file format for extracted files, which is "fixed length 512 byte records, no record attributes". When extracting to SYS$OUTPUT (/SCREEN or /PIPE qualifier), this qualifier deactivates the default "text data" conversion, instead. The optional keywords recognized are: | AUTO Automatically extracts files marked as "binary" (rather | than "text") in standard VMS binary file format. (default) | ALL Extracts all files in standard VMS binary file format. | NONE Same as /NOBINARY. Note that a combination of /BINARY[=AUTO] and /TEXT[=AUTO] is allowed. (see /TEXT qualifier) /BRIEF /BRIEF (default) When used with /LIST, specifies that a brief listing of the archive's contents is to be displayed. A brief listing shows the length, date, time, and file name for the files in the archive. /CASE_INSENSITIVE /CASE_INSENSITIVE /NOCASE_INSENSITIVE (default) Match filenames case-insensitively. (Good default option under VMS.) /COMMENT /COMMENT /NOCOMMENT Display the archive comment. /DIRECTORY /DIRECTORY=directory-spec Specifies the output directory where all the extracted files are to be placed. /DOT_VERSION /DOT_VERSION /NODOT_VERSION (default) Causes UnZip to treat archived file name endings of ".nnn" (where "nnn" is a decimal number) as if they were VMS version numbers (";nnn"). (The default is to treat them as file types.) Example: "a.b.3" -> "a.b;3". /EXCLUDE /EXCLUDE=(file[,...]) A comma-separated list of files to exclude when extracting files. If multiple files are specified, the list should be included in parentheses. /EXISTING /EXISTING = keyword Valid keywords (exactly one must be specified) are: | NEW_VERSION Create a new version of an existing file. | OVERWRITE Overwrite the same version of an existing file. | (But only if the archive member name includes a | version number.) | NOEXTRACT Do not extract. An existing file is not affected. When UnZip would extract an archive member, but the destination file already exists, UnZip will, by default, ask the user what to do. /EXISTING lets the user specify on the command line what to do in this situation, eliminating the interactive question(s). NOEXTRACT will always stop UnZip from extracting an archive member if the destination file already exists. If an archive member name does not include a VMS version number, or if UnZip is run with /NOVERSION (the default, causing it to ignore version numbers), then either NEW_VERSION or OVERWRITE will cause UnZip to create a new version of the existing file. If an archive member name does include a VMS version number, and if UnZip is run with /VERSION, then NEW_VERSION will cause UnZip to create a new version of the existing file, and OVERWRITE will cause UnZip to overwrite the existing file which has the version specified by the archive member name. /FRESHEN /FRESHEN /NOFRESHEN Freshen existing files; replace if newer. Does not cause any new files to be created. /FULL /FULL When used with /LIST, specifies that a full listing of the archive's contents is to be displayed. A full listing shows the length, compression method, compressed size, compression ratio, date, time, CRC value, and file name for the files in the archive. /HELP /HELP Displays a one-page brief help screen and exits quietly. /JUNK /JUNK /NOJUNK (default) Junk the stored paths (don't recreated the archive's directory structure. /LIST /LIST List the contents of the archive. /BRIEF and /FULL can be used to specify the amount of information displayed. The default is /BRIEF. /LOWERCASE /LOWERCASE /NOLOWERCASE (default) Convert filenames from all-uppercase operating systems to lowercase. This option has no effect under VMS. /ODS2 /ODS2 /NOODS2 (default) Causes UnZip to convert archived file names to ODS2-compatible file names (substituting "_" for any invalid characters), regardless of the type of the destination file system. The default is to use ODS5-compatible file names when the destination file system is ODS5, and to convert the names to ODS2-compatible names when the destination file system is ODS2. Beginning in UnZip 6.0, ODS2-compatible names are explicitly set to upper case. /OVERWRITE /OVERWRITE /NOOVERWRITE See /EXISTING. /OVERWRITE is equivalent to /EXISTING = NEW_VERSION. /NOOVERWRITE is equivalent to /EXISTING = NOEXTRACT. /PAGE /PAGE /NOPAGE Feed all screen output through the built-in "more" pager. /PASSWORD /PASSWORD=decryption-password Specifies a decryption password and prevents UnZip from prompting for a password in case the specified decryption key was wrong. The supplied string must be enclosed in double-quotes whenever it contains lowercase or special characters. /PIPE /PIPE Extract files to SYS$OUTPUT with no informational messages. /QUIET /QUIET[=SUPER] Perform operations quietly. The keyword SUPER can be specified to make operations even more quiet. /RESTORE /RESTORE[=(KEYWORD, ...)] Selects restoration options for some meta-data. The optional keywords recognized are: | OWNER_PROT Restore file owner and ACL protection settings. | NOOWNER_PROT Do not restore file owner and ACL protection settings. | NODATE Do not restore any timestamps. | DATE=ALL Restore timestamps for all extracted entries, files | and directories. | DATE=FILES Restore timestamps for extracted files. (default) By default, VMS UnZip restores the original date-time attributes for files, but not for directories. This agrees with the behavior of VMS BACKUP (and UnZip versions before 5.52 where the capability to restore directory timestamps was added). For compatibility with UnZip versions before 6.0 (5.53), the following obsolete short forms are still accepted: | Obsolete form: Modern form: | /RESTORE /RESTORE = OWNER_PROT | /NORESTORE /RESTORE = NOOWNER_PROT /SCREEN /SCREEN /NOSCREEN Extracts matching files to SYS$OUTPUT (the terminal). /TEST /TEST /NOTEST Test archive files. /TEXT /TEXT[=(KEYWORD, ...)] /NOTEXT (default) Selects conversion to VMS standard text file format. The optional keywords recognized are: | AUTO Automatically extracts files marked as "text" (rather | than "binary") in standard VMS text file format. (default) | ALL Extracts all files in standard VMS text file format. | NONE Same as /NOTEXT. | STMLF Use Stream_LF record format for text files (instead of the | default variable-length record format). A similar functionality is available for binary files, see qualifier /BINARY. /TIMESTAMP /TIMESTAMP Sets the timestamp of an archive to that of its newest file. This qualifier corresponds to zip's /APPEND/LATEST (-go) option, but can be applied to wildcard zipfile specifications (e.g. "*.zip") and is much faster. /TRAVERSE_DIRS /TRAVERSE_DIRS /NOTRAVERSE_DIRS (default) Allows to extract archive members into locations outside5 UNZIP.BCKW[UNZIP60.VMS]UNZIP_CLI.HELP;1A64_OLB;1*?e of the currently active "extraction root dir". For security reasons, UnZip normally removes "parent dir" path components ("../") from the names of extracted files. This feature (new for UnZip 5.50) prevents UnZip from accidentally writing files to "sensitive" areas outside the directory tree below the specified "extraction root". By specifying the /TRAVERSE_DIRS option, this security feature can be switched off. This allows users to extract (older) archives that made use of "../" to create multiple directory trees at the level of the current extraction folder. /UPDATE /UPDATE /NOUPDATE Update existing files; create new ones if needed. /VERSION /VERSION /NOVERSION (default) Retain VMS file version numbers. Authors Info-ZIP; currently maintained by Christian Spieler. VMS support maintained by Igor Mandrichenko, Steven M. Schweda, Christian Spieler and Hunter Goatley. Originally based on a program by Samuel H. Smith. VMS on-line help ported from UNZIP.TXT by Hunter Goatley. Exit_Status On VMS, UnZip's UNIX-style exit values are mapped into VMS-style status codes with facility code 1954 = %x7A2, and with the inhibit-message (%x10000000) and facility-specific (%x00008000) bits set: | %x17A28001 normal exit | %x17A28000 + 16*UnZip_error_code warnings | %x17A28002 + 16*UnZip_error_code normal errors | %x17A28004 + 16*UnZip_error_code fatal errors Note that multiplying the UNIX-style UnZip error code by 16 places it conveniently in the hexadecimal representation of the VMS exit code, "__" in %x17A28__s, where "s" is the severity code. For example, a missing archive might cause UnZip error code 9, which would be transformed into the VMS exit status %X17A28092. The UnZip VMS exit codes include severity values which approximate those defined by PKWARE, as shown in the following table: | VMS UnZip err | severity code Error description | ----------+---------+---------------------------------------------- | Success 0 Normal. No errors or warnings detected. | Warning 1 One or more warnings were encountered, but | processing completed successfully anyway. | This includes archives where one or more | (but not all) files were skipped because of | unsupported compress or encrypt methods, or | bad passwords. | Error 2 Error in the archive format. Processing may | have completed successfully anyway. Some | defects in archives (made by other programs) | can be repaired transparently. | Fatal 3 Severe error in the archive format. Process- | ing probably failed immediately. | Fatal 4 Memory allocation failed in program initial- | ization. | Fatal 5 Memory allocation failed in password pro- | cessing. | Fatal 6 Memory allocation failed while decompressing | to disk. | Fatal 7 Memory allocation failed while decompressing | in memory. | Fatal 8 Memory allocation failed (reserved for | future use). | Error 9 Specified archive files were not found. | Error 10 Invalid command-line options or parameters. | Error 11 No files matched selection criteria. | Fatal 50 Disk full. | Fatal 51 Unexpected end-of-file while reading the | archive. | Error 80 User interrupt (Ctrl/C). | Error 81 No files were processed, because of unsup- | ported compress or encrypt methods. | Error 82 No files were processed, because of bad | password(s). | Fatal 83 Large-file archive could not be processed by | this small-file program. UNIX_Options The default action of UnZip is to extract all zipfile entries. The following options and modifiers can be provided: | -Z ZipInfo mode | -c extract files to SYS$OUTPUT (terminal) | -f freshen existing files (replace if newer); create none | -h show brief help screen and exit quietly | -l list archive files (short format) | -p extract files to SYS$OUTPUT; no informational messages | -t test archive files | -T set zipfile timestamps to that of each archive's newest entry | -u update existing files; create new ones if needed | -v list archive files (verbose format) | -z display only the archive comment | |MODIFIERS | -a extract text files in standard VMS text file format | -aa extract all files as text | -b auto-extract only binary files in fixed 512-byte record format | -bb extract all files as binary in fixed 512-byte record format | -j junk paths (don't recreate archive's directory structure) | -n never overwrite or make a new version of an existing file | -o always make a new version (-oo: overwrite orig) existing file | -q perform operations quietly (-qq => even quieter) | -C match filenames case-insensitively | -D do not restore any timestamps (--D restore them even for dirs) | -L convert filenames to lowercase if created under DOS, VMS, etc. | -M feed screen output through built-in "more" pager | -P supply decryption password on the cmd line (insecure!) | -S use Stream_LF record format to extract text files (with -a[a]) | -V retain (VMS) file version numbers | -X restore owner/ACL protection info (may require privileges) | -Y treat ".nnn" suffix as version number ("a.b.3" -> "a.b;3") | -: allow "../" path components to traverse across top extract dir | -2 force creation of ODS2-compatible file names Note that uppercase options such as -C, -D, -L, -M, -P, -S, -T, -V, -X, -Y, and -Z must be specified in quotes (unless SET PROC/PARSE=EXTEND is set). For example: | $ unzip "-VX" -a zipfile UNZIP_OPTS_Default UnZip allows to modify its default behaviour by specifying (UNIX style) option defaults via the UNZIP_OPTS logical name. For example, the following will cause UnZip to match filenames without regard to case, restore owner/protection information and perform all operations at quiet-level 1 by default: | $ define UNZIP_OPTS "-qCX" Note that the quotation marks here are required to preserve lowercase options (opposite of the command-line behavior). To negate a default option on the command line, add one or more minus signs before the option letter, in addition to the leading switch character `-': | $ unzip --ql zipfile or | $ unzip -l-q zipfile At present it is not possible to decrement an option below zero--that is, more than a few minuses have no effect. UNZIP_OPTS may be defined as a symbol rather than a logical, but if both are defined, the logical is used. n9n UNZIP.BCKW[UNZIP60.VMS]UNZIP_DEF.RNH;1IA64_OLB;1*[UNZIP60.VMS]UNZIP_DEF.RNH;1+,./ 4@-W0123KPWO56j]7j]89GHJ.! .! File: UNZIP_DEF.RNH .! .! Author: Hunter Goatley .! .! Date: October 23, 1991 .! .! Description: .! .! RUNOFF source file for VMS on-line help for portable UnZip. .! Adapted from UNZIP.MAN (now UNZIP.TXT). .! .! To build: $ REN UNZIP_DEF.RNH UNZIP.RNH .! $ RUNOFF UNZIP.RNH .! $ LIBR/HELP/INSERT libr UNZIP .! .! Modification history: .! .! 01-001 Hunter Goatley 23-OCT-1991 09:21 .! Genesis. .! 01-002 Cave Newt 16-MAR-1992 22:37 .! Updated for UnZip 4.2. .! 01-003 Igor Mandrichenko 23-MAY-1992 22:14 .! Added -X option to command syntax. .! 01-004 Cave Newt 24-MAY-1992 13:30 .! Added UNZIP_OPTS environment variable help. .! 01-005 Igor Mandrichenko 14-DEC-1993 18:55 .! Modified for UnZip V5.1 .! 01-006 Cave Newt 21-DEC-1993 12:38 .! Added -x option and cleaned up. .! 01-007 Cave Newt 14-JUL-1994 09:45 .! Added -Z, -C and -L options, removed -U, minor clean-up. .! 01-008 Cave Newt 28-JUL-1994 08:57 .! Removed semi-colons from comments. .! 02-001 Christian Spieler 09-DEC-1995 02:25 .! Modified for UnZip 5.2. .! 02-002 Christian Spieler 06-FEB-1996 02:25 .! Added -h "help" option. .! 02-003 Christian Spieler 04-MAR-1997 20:25 .! Added -P "command line password" option. .! 02-004 Christian Spieler 26-JUL-1997 00:05 .! Added Exit_Codes subtopic, explaining UnZip's VMS return codes. .! 02-005 Christian Spieler 28-APR-2000 03:22 .! Changed references to plaintext UnZip documentation file .! into "UNZIP.TXT". .! 02-006 Christian Spieler 15-APR-2001 22:29 .! Added description for extended functionality of -b option. .! 02-007 Christian Spieler 10-DEC-2001 13:58 .! Added description for new -: traverse dirs option. .! 02-008 Christian Spieler 29-JAN-2005 01:50 .! Added description for the -T "set archive timestamp" option. .! 02-009 Christian Spieler 04-MAR-2007 14:37 .! Added description for the -S "Stream-LF text files" option; .! updated the documentation of the VMS exit codes. .! 02-010 S. Schweda, C. Spieler 28-Dec-2007 21:28 .! Added description for the -D "timestamp restoration" option. .! .noflags .lm4 .rm72 .indent -4 1 UNZIP .br UnZip is used to extract files compressed and packaged by Zip (see HELP ZIP for information on ZIP). .sk For a brief help on Zip and Unzip, run each without specifying any parameters on the command line, or specify the -h flag (but not in UnZip's Zipinfo mode). .sk UNZIP will list, test, or extract from a ZIP archive. ZIP archives are commonly found on MS-DOS systems; a VMS version of ZIP can also be found here. .sk Archive member extraction is implied by the absence of the -c, -p, -t, -l, -v or -z options. All archive members are processed unless a filespec is provided to specify a subset of the archive members. Format: .sk;.lm+1;.literal UNZIP [-cfhlptTuvxz[ajnoqCDLMSVXY:2]] file[.zip] [list] [-x xlist] [-d out_dir] .end literal;.lm-1 .!------------------------------------------------------------------------------ .indent -4 2 Parameters .sk;.indent -4 file[.zip] .sk File specification for the ZIP archive(s) with optional wildcards. UnZip will perform actions specified for every zipfile matching the specification. Default file specification is SYS$DISK:[].ZIP. Note that self-extracting ZIP files are supported; just specify the .EXE suffix yourself. .sk;.indent -4 [list] .sk An optional list of archive members to be processed; if no list is given, all archive members are processed. Expressions may be used to match multiple members. Expressions should be enclosed in double-quotes to prevent interpretation by DCL. Multiple filenames should be separated by blanks. Each file specification is similar to a Unix egrep expression and may contain: .sk .literal * matches a sequence of 0 or more characters ? matches exactly 1 character [...] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If a '!' or '^' immediately follows the left bracket, then any character not in the given range is matched. Hint: To specify a verbatim left bracket '[', the three-character sequence "[[]" has to be used. .end literal .sk .sk;.indent -4 [-x xlist] .sk An optional list of archive members to be excluded from processing. The xlist overrides any files included in the normal list. .sk;.indent -4 [-d out_dir] .sk Optional directory specification to be used as target root directory for files to be extracted. Directory should be specified in "[.foo]" format rather than "foo.dir" or "foo/" format. .!------------------------------------------------------------------------------ .indent -4 2 Options .br The default action of UnZip is to extract all zipfile entries. The following options and modifiers can be provided: .sk;.literal -Z ZipInfo mode -c extract files to SYS$OUTPUT (terminal) -f freshen existing files (replace if newer); create none -h show brief help screen and exit quietly -l list archive files (short format) -p extract files to SYS$OUTPUT; no informational messages -t test archive files -T set zipfile timestamps to that of each archive's newest entry -u update existing files; create new ones if needed -v list archive files (verbose format) -z display only the archive comment .end literal;.sk;.literal MODIFIERS -a extract text files in standard VMS text file format -aa extract all files as text -b auto-extract only binary files in fixed 512-byte record format -bb extract all files as binary in fixed 512-byte record format -j junk paths (don't recreate archive's directory structure) -n never overwrite or make a new version of an existing file -o always make a new version (-oo: overwrite orig) existing file -q perform operations quietly (-qq => even quieter) -C match filenames case-insensitively -D do not restore any timestamps (--D restore them even for dirs) -L convert filenames to lowercase if created under DOS, VMS, etc. -M feed screen output through built-in "more" pager -P supply decryption password on the cmd line (insecure!) -S use Stream_LF record format to extract text files (with -a[a]) -V retain (VMS) file version numbers -X restore owner/ACL protection info (may require privileges) -Y treat ".nnn" suffix as version number ("a.b.3" -> "a.Q UNZIP.BCKW[UNZIP60.VMS]UNZIP_DEF.RNH;1IA64_OLB;1(b;3") -: allow "../" path components to traverse across top extract dir -2 force creation of ODS2-compatible file names .end literal;.sk Note that uppercase options (-C, -D, -L, -M, -P, -S, -T, -V, -X, -Y, and -Z) must be specified in quotes (unless SET PROC/PARSE=EXTEND is set). For example: .sk;.literal unzip "-VX" -a zipfile .end literal;.sk When extracting to SYS$OUTPUT (-c or -p options) redirected to a file, you may want to override the default text file conversion by specifying the -b option. A single "-b" option switches to "binary piping" mode for Zip entries marked as non-text, only. To force "binary piping" mode even for Zip file entries marked as text, the "-bb" option should be used. (Please note that a later "-a" cancels any -b option, see below.) .sk The output conversion options -b and -a may be combined to perform binary conversions on binary files and text conversion on text files. But note: For compatibility with implementation on other systems, -b cancels any -a option; to get the intended result, -a must be specified AFTER -b. And, in combination, "text" recognition takes precedence; this means that -bba (-bb -a) has the same effect as -ba (-b -a), and -aa overrides binary conversion for ALL files. .sk The conversion option -S is only effective when used together with -a or -aa. When specified, "text" files are written in Stream-LF record format instead of the VMS default of Variable-Length record format. (When no conversion options are specified, all non-VMS entries are always written as Stream-LF files.) .sk Please note that using the "-P" option is higly insecure, the plaintext password may be seen by others. For this reason (and because of lack of space), the "-P" option is not advertised on UnZip's online help screen. .!------------------------------------------------------------------------------ .indent -4 2 Exit_Status .br On VMS, UnZip's UNIX-style exit values are mapped into VMS-style status codes with facility code 1954 = %x7A2, and with the inhibit-message (%x10000000) and facility-specific (%x00008000) bits set: .sk .literal %x17A28001 normal exit %x17A28000 + 16*UnZip_error_code warnings %x17A28002 + 16*UnZip_error_code normal errors %x17A28004 + 16*UnZip_error_code fatal errors .end literal .sk Note that multiplying the UNIX-style UnZip error code by 16 places it conveniently in the hexadecimal representation of the VMS exit code, "__" in %x17A28__s, where "s" is the severity code. For example, a missing archive might cause UnZip error code 9, which would be transformed into the VMS exit status %X17A28092. .sk The UnZip VMS exit codes include severity values which approximate those defined by PKWARE, as shown in the following table: .literal VMS UnZip err severity code Error description ----------+---------+---------------------------------------------- Success 0 Normal. No errors or warnings detected. Warning 1 One or more warnings were encountered, but processing completed successfully anyway. This includes archives where one or more (but not all) files were skipped because of unsupported compress or encrypt methods, or bad passwords. Error 2 Error in the archive format. Processing may have completed successfully anyway. Some defects in archives (made by other programs) can be repaired transparently. Fatal 3 Severe error in the archive format. Process- ing probably failed immediately. Fatal 4 Memory allocation failed in program initial- ization. Fatal 5 Memory allocation failed in password pro- cessing. Fatal 6 Memory allocation failed while decompressing to disk. Fatal 7 Memory allocation failed while decompressing in memory. Fatal 8 Memory allocation failed (reserved for future use). Error 9 Specified archive files were not found. Error 10 Invalid command-line options or parameters. Error 11 No files matched selection criteria. Fatal 50 Disk full. Fatal 51 Unexpected end-of-file while reading the archive. Error 80 User interrupt (Ctrl/C). Error 81 No files were processed, because of unsup- ported compress or encrypt methods. Error 82 No files were processed, because of bad password(s). Fatal 83 Large-file archive could not be processed by this small-file program. .end literal .!------------------------------------------------------------------------------ .indent -4 2 Logical_Names .br UnZip allows to modify its default behaviour by specifying option defaults via the UNZIP_OPTS logical name. For example, the following will cause UnZip to restore owner/protection information and perform all operations at quiet-level 1 by default: .sk;.literal define UNZIP_OPTS "-qX" .end literal;.sk Note that the quotation marks here are required to preserve lowercase options (opposite of the command-line behavior). To negate a default option on the command line, add one or more minus signs before the option letter, in addition to the leading switch character `-': .sk;.literal unzip --ql zipfile .end literal or .literal unzip -l-q zipfile .end literal;.sk At present it is not possible to decrement an option below zero--that is, more than a few minuses have no effect. .sk UNZIP_OPTS may be defined as a symbol rather than a logical name, but if both are defined, the logical name takes precedence. .!----------------------------------------------------------------------------- .indent -4 2 Authors .br Info-ZIP; currently maintained by Christian Spieler. VMS support maintained by Christian Spieler and Hunter Goatley. Originally based on a program by Samuel H. Smith. .sk VMS on-line help ported from UNZIP.TXT by Hunter Goatley. *[UNZIP60.VMS]UNZIP_MSG.MSG;1+,^./ 4@-W0123KPWO56ew[n*7ew[n*89GHJ! VMS Error Message Source File for UnZip ! ! Because the facility code was formally assigned by HP, the .FACILITY ! directive below specifies /SYSTEM. Because the messages are, in ! general, specific to UnZip, this file is not compiled with /SHARED. ! For example: ! ! MESSAGE /OBJECT = [.dest]UNZIP_MSG.OBJ /NOSYMBOLS [.VMS]UNZIP_MSG.MSG ! ! LINK /SHAREABLE = [.dest]UNZIP_MSG.EXE [.dest]UNZIP_MSG.OBJ ! !----------------------------------------------------------------------- .TITLE Info-ZIP UnZip UNZIP.BCK^W[UNZIP60.VMS]UNZIP_MSG.MSG;1IA64_OLB;1' Error Messages .FACILITY IZ_UNZIP, 1954 /SYSTEM .IDENT 'V6.0-000' ! PK_ .BASE 0 OK /SUCCESS .BASE 2 WARN /WARNING .BASE 4 ERR /ERROR .BASE 6 BADERR /SEVERE .BASE 8 MEM /SEVERE .BASE 10 MEM2 /SEVERE .BASE 12 MEM3 /SEVERE .BASE 14 MEM4 /SEVERE .BASE 16 MEM5 /SEVERE .BASE 18 NOZIP /ERROR .BASE 20 PARAM /ERROR .BASE 22 FIND /ERROR .BASE 100 DISK /SEVERE .BASE 102 EOF /SEVERE ! IZ_ .BASE 160 CTRLC /ERROR .BASE 162 UNSUP /ERROR .BASE 164 BADPWD /ERROR .BASE 166 ERRBF /ERROR .END *[UNZIP60.VMS]UNZ_CLI.CLD;1+,r./ 4@-W0123KPWO56* f7* f89GHJ Module VMS_UNZIP_CLD Ident "03-003" Define Verb UNZIP Parameter P1, Label=ZIPFILE, Prompt="Zip file" Parameter P2, Label=INFILE, VALUE(LIST), Prompt="Files to UnZip" Qualifier BINARY, VALUE(TYPE=CONVBIN_KEYWORDS), Negatable Qualifier TEXT, VALUE(TYPE=CONVTXT_KEYWORDS, LIST), Negatable Qualifier SCREEN, Negatable Qualifier DIRECTORY, VALUE(REQUIRED,TYPE=$FILE), Nonnegatable Qualifier FRESHEN, Negatable Qualifier HELP, Nonnegatable Qualifier JUNK, Negatable Qualifier LIST, Nonnegatable Qualifier BRIEF, Nonnegatable, Default Qualifier FULL, VALUE(TYPE=FULL_MODIFIER), Nonnegatable Qualifier EXISTING, VALUE(REQUIRED, TYPE=EXISTING_KEYWORDS), Nonnegatable Qualifier OVERWRITE, Negatable Qualifier QUIET, VALUE(TYPE=QUIET_MODIFIER), Nonnegatable Qualifier TEST, Negatable Qualifier PIPE, Nonnegatable Qualifier PASSWORD, VALUE(REQUIRED), Nonnegatable Qualifier TIMESTAMP, Nonnegatable Qualifier TRAVERSE_DIRS, Negatable Qualifier UPPERCASE, Negatable Qualifier UPDATE, Negatable Qualifier VERSION, Negatable Qualifier RESTORE, VALUE(TYPE=RESTORE_KEYWORDS, LIST), Negatable Qualifier COMMENT, Negatable Qualifier EXCLUDE, VALUE(LIST), Nonnegatable Qualifier CASE_INSENSITIVE, Negatable Qualifier LOWERCASE, Negatable Qualifier PAGE, Negatable Qualifier DOT_VERSION, Negatable Qualifier ODS2, Negatable Qualifier YYZ_UNZIP, NonNegatable, Default Qualifier ZIPINFO, Syntax=INFORMATION, NonNegatable DisAllow BRIEF and FULL DisAllow DIRECTORY and SCREEN DisAllow BINARY and TEXT.ALL DisAllow BINARY.ALL and TEXT DisAllow (OVERWRITE or (neg OVERWRITE)) and EXISTING DisAllow (neg RESTORE) and RESTORE.DATE DisAllow (neg RESTORE) and (neg RESTORE.DATE) DisAllow (neg RESTORE) and RESTORE.OWNER_PROT DisAllow (neg RESTORE) and (neg RESTORE.OWNER_PROT) DisAllow (neg RESTORE.DATE) and RESTORE.DATE.ALL DisAllow (neg RESTORE.DATE) and RESTORE.DATE.FILES DisAllow TEXT.ALL and TEXT.AUTO DisAllow TEXT.AUTO and TEXT.NONE DisAllow TEXT.NONE and TEXT.ALL DisAllow TEXT.NONE and TEXT.STMLF DisAllow (neg TEXT) and TEXT.STMLF DisAllow ZIPINFO and HELP Define Type CONVBIN_KEYWORDS Keyword AUTO, DEFAULT Keyword ALL Keyword NONE Define Type CONVTXT_KEYWORDS Keyword AUTO, DEFAULT Keyword ALL Keyword NONE Keyword STMLF Define Type EXISTING_KEYWORDS Keyword NEW_VERSION Keyword OVERWRITE Keyword NOEXTRACT Define Type RESTORE_KEYWORDS Keyword DATE, VALUE(TYPE=RESTOREDATE_KEYS, Required), Negatable Keyword OWNER_PROT, Default, Negatable Define Type RESTOREDATE_KEYS Keyword FILES, DEFAULT Keyword ALL Define Type QUIET_MODIFIER Keyword SUPER Define Type FULL_MODIFIER Keyword DIAGNOSTICS Define Syntax INFORMATION Parameter P1, Label=ZIPFILE, Prompt="Zip file" Parameter P2, Label=INFILE, VALUE(LIST), Prompt="Files to display" Qualifier ZIPINFO, NonNegatable, Default Qualifier ONE_LINE, Nonnegatable Qualifier SHORT, Nonnegatable Qualifier MEDIUM, Nonnegatable Qualifier LONG, Nonnegatable Qualifier VERBOSE, Nonnegatable Qualifier HEADER, Nonnegatable Qualifier COMMENT, Nonnegatable Qualifier TOTALS, Nonnegatable Qualifier TIMES, Nonnegatable Qualifier EXCLUDE, VALUE(LIST), Nonnegatable Qualifier CASE_INSENSITIVE, Negatable Qualifier PAGE, Negatable *[UNZIP60.VMS]VMS.C;1+,.f/ 4ff@-W0123KPWOg566B4~76B4~89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- vms.c Igor Mandrichenko and others This file contains routines to extract VMS file attributes from a zipfile extra field and create a file with these attributes. The code was almost entirely written by Igor, with a couple of routines by GRR and lots of modifications and fixes by Christian Spieler. Contains: check_format() open_outfile() find_vms_attrs() flush() close_outfile() defer_dir_attribs() set_direc_attribs() dos_to_unix_time() (TIMESTAMP only) stamp_file() (TIMESTAMP only) vms_msg_text() do_wild() mapattr() mapname() checkdir() check_for_newer() return_VMS screensize() screenlinewrap() version() ---------------------------------------------------------------------------*/ #ifdef VMS /* VMS only! */ #define UNZIP_INTERNAL #include "unzip.h" #include "crc32.h" #include "vms.h" #include "vmsdefs.h" #ifdef MORE # include #endif #include #include #include #include /* Workaround for broken header files of older DECC distributions * that are incompatible with the /NAMES=AS_IS qualifier. */ #define lib$getdvi LIB$GETDVI #define lib$getsyi LIB$GETSYI #define lib$sys_getmsg LIB$SYS_GETMSG #include #ifndef EEXIST # include /* For mkdir() status codes */ #endif /* On VAX, deƮVj UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fQfine Goofy VAX Type-Cast to obviate /standard = vaxc. Otherwise, lame system headers on VAX cause compiler warnings. (GNU C may define vax but not __VAX.) */ #ifdef vax # define __VAX 1 #endif #ifdef __VAX # define GVTC (unsigned int) #else # define GVTC #endif /* With GNU C, some FAB bits may be declared only as masks, not as * structure bits. */ #ifdef __GNUC__ # define OLD_FABDEF 1 #endif #define ASYNCH_QIO /* Use asynchronous PK-style QIO writes */ /* buffer size for a single block write (using RMS or QIO WRITEVBLK), must be less than 64k and a multiple of 512 ! */ #define BUFS512 (((OUTBUFSIZ>0xFFFF) ? 0xFFFF : OUTBUFSIZ) & (~511)) /* buffer size for record output (RMS limit for max. record size) */ #define BUFSMAXREC 32767 /* allocation size for RMS and QIO output buffers */ #define BUFSALLOC (BUFS512 * 2 > BUFSMAXREC ? BUFS512 * 2 : BUFSMAXREC) /* locbuf size */ /* VMS success or warning status */ #define OK(s) (((s) & STS$M_SUCCESS) != 0) #define STRICMP(s1, s2) STRNICMP(s1, s2, 2147483647) /* Interactive inquiry response codes for replace(). */ #define REPL_NO_EXTRACT 0 #define REPL_NEW_VERSION 1 #define REPL_OVERWRITE 2 #define REPL_ERRLV_WARN 256 #define REPL_TASKMASK 255 /* 2008-09-13 CS. * Note: In extract.c, there are similar strings "InvalidResponse" and * "AssumeNone" defined. However, as the UI functionality of the VMS * "version-aware" query is slightly different from the generic variant, * these strings are kept separate for now to allow independent * "fine tuning" without affecting the other variant of the * "overwrite or ..." user query. */ ZCONST char Far InvalidResponse[] = "error: invalid response [%.1s]\n"; ZCONST char Far AssumeNo[] = "\n(EOF or read error, treating as \"[N]o extract (all)\" ...)\n"; #ifdef SET_DIR_ATTRIB /* Structure for holding directory attribute data for final processing * after all files are in place. */ typedef struct vmsdirattr { struct vmsdirattr *next; /* link to next in (linked) list */ char *fn; /* file (directory) name */ /* Non-VMS attributes data */ ulg mod_dos_datetime; /* G.lrec.last_mod_dos_datetime */ unsigned perms; /* same as min_info.file_attr */ unsigned xlen; /* G.lrec.extra_field_length */ char buf[1]; /* data buffer (extra_field, fn) */ } vmsdirattr; #define VmsAtt(d) ((vmsdirattr *)d) /* typecast shortcut */ #endif /* SET_DIR_ATTRIB */ /* * Local static storage */ static struct FAB fileblk; /* File Access Block */ static struct XABDAT dattim; /* date-time XAB */ static struct XABRDT rdt; /* revision date-time XAB */ static struct RAB rab; /* Record Access Block */ static struct NAM_STRUCT nam; /* name block */ static struct FAB *outfab = NULL; static struct RAB *outrab = NULL; static struct XABFHC *xabfhc = NULL; /* file header characteristics */ static struct XABDAT *xabdat = NULL; /* date-time */ static struct XABRDT *xabrdt = NULL; /* revision date-time */ static struct XABPRO *xabpro = NULL; /* protection */ static struct XABKEY *xabkey = NULL; /* key (indexed) */ static struct XABALL *xaball = NULL; /* allocation */ static struct XAB *first_xab = NULL, *last_xab = NULL; static int replace_code_all = -1; /* All-file response for replace(). */ static uch rfm; static uch locbuf[BUFSALLOC]; /* Space for 2 buffers of BUFS512 */ static unsigned loccnt = 0; static uch *locptr; static char got_eol = 0; struct bufdsc { struct bufdsc *next; uch *buf; unsigned bufcnt; }; static struct bufdsc b1, b2, *curbuf; /* buffer ring for asynchronous I/O */ static int _flush_blocks(__GPRO__ uch *rawbuf, unsigned size, int final_flag); static int _flush_stream(__GPRO__ uch *rawbuf, unsigned size, int final_flag); static int _flush_varlen(__GPRO__ uch *rawbuf, unsigned size, int final_flag); static int _flush_qio(__GPRO__ uch *rawbuf, unsigned size, int final_flag); static int _close_rms(__GPRO); static int _close_qio(__GPRO); #ifdef ASYNCH_QIO static int WriteQIO(__GPRO__ uch *buf, unsigned len); #endif static int WriteBuffer(__GPRO__ uch *buf, unsigned len); static int WriteRecord(__GPRO__ uch *rec, unsigned len); static int (*_flush_routine)(__GPRO__ uch *rawbuf, unsigned size, int final_flag); static int (*_close_routine)(__GPRO); #ifdef SYMLINKS static int _read_link_rms(__GPRO__ int byte_count, char *link_text_buf); #endif /* SYMLINKS */ static void init_buf_ring(void); static void set_default_datetime_XABs(__GPRO); static int create_default_output(__GPRO); static int create_rms_output(__GPRO); static int create_qio_output(__GPRO); static int replace(__GPRO); static int replace_rms_newversion(__GPRO); static int replace_rms_overwrite(__GPRO); static int find_vms_attrs(__GPRO__ int set_date_time); static void free_up(void); #ifdef CHECK_VERSIONS static int get_vms_version(char *verbuf, int len); #endif /* CHECK_VERSIONS */ static unsigned find_eol(ZCONST uch *p, unsigned n, unsigned *l); #ifdef SET_DIR_ATTRIB static char *vms_path_fixdown(ZCONST char *dir_spec, char *dir_file); #endif #ifdef TIMESTAMP static time_t mkgmtime(struct tm *tm); static void uxtime2vmstime(time_t utimeval, long int binval[2]); #endif /* TIMESTAMP */ static int vms_msg_fetch(int status); static void vms_msg(__GPRO__ ZCONST char *string, int status); /* 2005-02-14 SMS. Added some ODS5 support: Use longer name structures in NAML, where available. Locate special characters mindful of "^" escapes. */ /* Hex digit table. */ char hex_digit[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; /* Character property table for converting Zip file names to (simpler) ODS2 or (escaped) ODS5 extended file names. ODS2 valid characters: 0-9 A-Z a-z $ - _ ODS5 Invalid characters: C0 control codes (0x00 to 0x1F inclusive) Asterisk (*) Question mark (?) ODS5 Invalid characters only in VMS V7.2 (which no one runs, right?): Double quotation marks (") Backslash (\) Colon (:) Left angle bracket (<) Right angle bracket (>) Slash (/) Vertical bar (|) Characters escaped by "^": SP ! " # % & ' ( ) + , . : ; = @ [ \ ] ^ ` { | } ~ Either "^_" or "^ " is accepted as a space. Period (.) is a special case. Note that un-escaped < and > can also confuse a directory spec. Characters put out as ^xx: 7F (DEL) 80-9F (C1 control characters) A0 (nonbreaking space) FF (Latin small letter y diaeresis) Other cases: Unicode: "^Uxxxx", where "xxxx" is four hex digits. Property table values: Normal ODS2 1 Lower-case ODS2 2 Period 4 Space 8 ODS5 simple 16 ODS5 1-char escape 32 ODS5 hex-hex escape 64 */ unsigned char char_prop[256] = { /* NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* SP ! " # $ % & ' ( ) * + , - . / */ 8, 32, 32, 32, 17, 32, 32, 32, 32, 32, 0, 32, 32, 17, 4, 0, /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ 17, 17, 1Inz UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f47, 17, 17, 17, 17, 17, 17, 17, 32, 32, 32, 32, 32, 32, /* @ A B C D E F G H I J K L M N O */ 32, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, /* P Q R S T U V W X Y Z [ \ ] ^ _ */ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 32, 32, 32, 32, 17, /* ` a b c d e f g h i j k l m n o */ 32, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, /* p q r s t u v w x y z { | } ~ DEL */ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 32, 32, 32, 32, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 64 }; /* 2004-11-23 SMS. * * get_rms_defaults(). * * Get user-specified values from (DCL) SET RMS_DEFAULT. FAB/RAB * items of particular interest are: * * fab$w_deq default extension quantity (blocks) (write). * rab$b_mbc multi-block count. * rab$b_mbf multi-buffer count (used with rah and wbh). */ #define DIAG_FLAG (uO.vflag >= 3) /* Default RMS parameter values. * The default extend quantity (deq) should not matter much here, as the * initial allocation should always be set according to the known file * size, and no extension should be needed. */ #define RMS_DEQ_DEFAULT 16384 /* About 1/4 the max (65535 blocks). */ #define RMS_MBC_DEFAULT 127 /* The max, */ #define RMS_MBF_DEFAULT 2 /* Enough to enable rah and wbh. */ /* GETJPI item descriptor structure. */ typedef struct { short buf_len; short itm_cod; void *buf; int *ret_len; } jpi_item_t; /* Durable storage */ static int rms_defaults_known = 0; /* JPI item buffers. */ static unsigned short rms_ext; static char rms_mbc; static unsigned char rms_mbf; /* Active RMS item values. */ unsigned short rms_ext_active; char rms_mbc_active; unsigned char rms_mbf_active; /* GETJPI item lengths. */ static int rms_ext_len; /* Should come back 2. */ static int rms_mbc_len; /* Should come back 1. */ static int rms_mbf_len; /* Should come back 1. */ /* Desperation attempts to define unknown macros. Probably doomed. * If these get used, expect sys$getjpiw() to return %x00000014 = * %SYSTEM-F-BADPARAM, bad parameter value. * They keep compilers with old header files quiet, though. */ #ifndef JPI$_RMS_EXTEND_SIZE # define JPI$_RMS_EXTEND_SIZE 542 #endif /* ndef JPI$_RMS_EXTEND_SIZE */ #ifndef JPI$_RMS_DFMBC # define JPI$_RMS_DFMBC 535 #endif /* ndef JPI$_RMS_DFMBC */ #ifndef JPI$_RMS_DFMBFSDK # define JPI$_RMS_DFMBFSDK 536 #endif /* ndef JPI$_RMS_DFMBFSDK */ /* GETJPI item descriptor set. */ struct { jpi_item_t rms_ext_itm; jpi_item_t rms_mbc_itm; jpi_item_t rms_mbf_itm; int term; } jpi_itm_lst = { { 2, JPI$_RMS_EXTEND_SIZE, &rms_ext, &rms_ext_len }, { 1, JPI$_RMS_DFMBC, &rms_mbc, &rms_mbc_len }, { 1, JPI$_RMS_DFMBFSDK, &rms_mbf, &rms_mbf_len }, 0 }; static int get_rms_defaults() { int sts; /* Get process RMS_DEFAULT values. */ sts = sys$getjpiw(0, 0, 0, &jpi_itm_lst, 0, 0, 0); if ((sts & STS$M_SEVERITY) != STS$K_SUCCESS) { /* Failed. Don't try again. */ rms_defaults_known = -1; } else { /* Fine, but don't come back. */ rms_defaults_known = 1; } /* Limit the active values according to the RMS_DEFAULT values. */ if (rms_defaults_known > 0) { /* Set the default values. */ rms_ext_active = RMS_DEQ_DEFAULT; rms_mbc_active = RMS_MBC_DEFAULT; rms_mbf_active = RMS_MBF_DEFAULT; /* Default extend quantity. Use the user value, if set. */ if (rms_ext > 0) { rms_ext_active = rms_ext; } /* Default multi-block count. Use the user value, if set. */ if (rms_mbc > 0) { rms_mbc_active = rms_mbc; } /* Default multi-buffer count. Use the user value, if set. */ if (rms_mbf > 0) { rms_mbf_active = rms_mbf; } } if (DIAG_FLAG) { fprintf(stderr, "Get RMS defaults. getjpi sts = %%x%08x.\n", sts); if (rms_defaults_known > 0) { fprintf(stderr, " Default: deq = %6d, mbc = %3d, mbf = %3d.\n", rms_ext, rms_mbc, rms_mbf); } } return sts; } int check_format(__G) __GDEF { int rtype; int sts; struct FAB fab; #ifdef NAML$C_MAXRSS struct NAML nam; #endif fab = cc$rms_fab; /* Initialize FAB. */ #ifdef NAML$C_MAXRSS nam = cc$rms_naml; /* Initialize NAML. */ fab.fab$l_naml = &nam; /* Point FAB to NAML. */ fab.fab$l_dna = (char *) -1; /* Using NAML for default name. */ fab.fab$l_fna = (char *) -1; /* Using NAML for file name. */ #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNA = G.zipfn; FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNS = strlen(G.zipfn); if (ERR(sts = sys$open(&fab))) { Info(slide, 1, ((char *)slide, "\n\ error: cannot open zipfile [ %s ].\n", FnFilter1(G.zipfn))); vms_msg(__G__ " sys$open() error: ", sts); return PK_ERR; } rtype = fab.fab$b_rfm; sys$close(&fab); if (rtype == FAB$C_VAR || rtype == FAB$C_VFC) { Info(slide, 1, ((char *)slide, "\n\ Error: zipfile is in variable-length record format. Please\n\ run \"bilf l %s\" to convert the zipfile to stream-LF\n\ record format. (BILF is available at various VMS archives.)\n\n", FnFilter1(G.zipfn))); return PK_ERR; } return PK_COOL; } #define PRINTABLE_FORMAT(x) ( (x) == FAB$C_VAR \ || (x) == FAB$C_STMLF \ || (x) == FAB$C_STMCR \ || (x) == FAB$C_STM ) /* VMS extra field types */ #define VAT_NONE 0 #define VAT_IZ 1 /* old Info-ZIP format */ #define VAT_PK 2 /* PKWARE format */ /* * open_outfile() assignments: * * VMS attributes ? create_xxx _flush_xxx * ---------------- ---------- ---------- * not found 'default' text mode ? * yes -> 'stream' * no -> 'block' * * yes, in IZ format 'rms' uO.cflag ? * yes -> switch (fab.rfm) * VAR -> 'varlen' * STM* -> 'stream' * default -> 'block' * no -> 'block' * * yes, in PK format 'qio' uO.cflag ? * yes -> switch (pka_rattr) * VAR -> 'varlen' * STM* -> 'stream' * default -> 'block' * " UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f"# no -> 'qio' * * "text mode" == G.pInfo->textmode || (uO.cflag && !uO.bflag) * (simplified, for complete expression see create_default_output() code) */ /* The VMS version of open_outfile() supports special return codes: * OPENOUT_OK a file has been opened normally * OPENOUT_FAILED the file open process failed * OPENOUT_SKIPOK file open skipped at user request, err level OK * OPENOUT_SKIPWARN file open skipped at user request, err level WARN */ int open_outfile(__G) __GDEF { /* Get process RMS_DEFAULT values, if not already done. */ if (rms_defaults_known == 0) { get_rms_defaults(); } switch (find_vms_attrs(__G__ (uO.D_flag <= 1))) { case VAT_NONE: default: return create_default_output(__G); case VAT_IZ: return create_rms_output(__G); case VAT_PK: return create_qio_output(__G); } } static void init_buf_ring() { locptr = &locbuf[0]; loccnt = 0; b1.buf = &locbuf[0]; b1.bufcnt = 0; b1.next = &b2; b2.buf = &locbuf[BUFS512]; b2.bufcnt = 0; b2.next = &b1; curbuf = &b1; } /* Static data storage for time conversion: */ /* string constants for month names */ static ZCONST char *month[] = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"}; /* buffer for time string */ static char timbuf[24]; /* length = first entry in "date_str" + 1 */ /* fixed-length string descriptor for timbuf: */ static ZCONST struct dsc$descriptor date_str = {sizeof(timbuf)-1, DSC$K_DTYPE_T, DSC$K_CLASS_S, timbuf}; static void set_default_datetime_XABs(__GPRO) { unsigned yr, mo, dy, hh, mm, ss; #ifdef USE_EF_UT_TIME iztimes z_utime; struct tm *t; if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) t = localtime(&(z_utime.mtime)); else t = (struct tm *)NULL; if (t != (struct tm *)NULL) { yr = t->tm_year + 1900; mo = t->tm_mon; dy = t->tm_mday; hh = t->tm_hour; mm = t->tm_min; ss = t->tm_sec; } else { yr = ((G.lrec.last_mod_dos_datetime >> 25) & 0x7f) + 1980; mo = ((G.lrec.last_mod_dos_datetime >> 21) & 0x0f) - 1; dy = (G.lrec.last_mod_dos_datetime >> 16) & 0x1f; hh = (G.lrec.last_mod_dos_datetime >> 11) & 0x1f; mm = (G.lrec.last_mod_dos_datetime >> 5) & 0x3f; ss = (G.lrec.last_mod_dos_datetime << 1) & 0x3e; } #else /* !USE_EF_UT_TIME */ yr = ((G.lrec.last_mod_dos_datetime >> 25) & 0x7f) + 1980; mo = ((G.lrec.last_mod_dos_datetime >> 21) & 0x0f) - 1; dy = (G.lrec.last_mod_dos_datetime >> 16) & 0x1f; hh = (G.lrec.last_mod_dos_datetime >> 11) & 0x1f; mm = (G.lrec.last_mod_dos_datetime >> 5) & 0x3f; ss = (G.lrec.last_mod_dos_datetime << 1) & 0x1f; #endif /* ?USE_EF_UT_TIME */ dattim = cc$rms_xabdat; /* fill XABs with default values */ rdt = cc$rms_xabrdt; sprintf(timbuf, "%02u-%3s-%04u %02u:%02u:%02u.00", dy, month[mo], yr, hh, mm, ss); sys$bintim(&date_str, &dattim.xab$q_cdt); memcpy(&rdt.xab$q_rdt, &dattim.xab$q_cdt, sizeof(rdt.xab$q_rdt)); } /* The following return codes are supported: * OPENOUT_OK a file has been opened normally * OPENOUT_FAILED the file open process failed * OPENOUT_SKIPOK file open skipped at user request, err level OK * OPENOUT_SKIPWARN file open skipped at user request, err level WARN */ static int create_default_output(__GPRO) { int ierr; int text_output, bin_fixed; /* Extract the file in text format (Variable_length by default, * Stream_LF with "-S" (/TEXT = STMLF), when * a) explicitly requested by the user (through the -a option), * and it is not a symbolic link, * or * b) piping to SYS$OUTPUT, unless "binary" piping was requested * by the user (through the -b option). */ text_output = (G.pInfo->textmode #ifdef SYMLINKS && !G.symlnk #endif ) || (uO.cflag && (!uO.bflag || (!(uO.bflag - 1) && G.pInfo->textfile))); /* Use fixed length 512 byte record format for disk file when * a) explicitly requested by the user (-b option), * and * b) it is not a symbolic link, * and * c) it is not extracted in text mode. */ bin_fixed = !text_output && #ifdef SYMLINKS !G.symlnk && #endif (uO.bflag != 0) && ((uO.bflag != 1) || !G.pInfo->textfile); rfm = FAB$C_STMLF; /* Default, stream-LF format from VMS or UNIX */ if (!uO.cflag) /* Redirect output */ { rab = cc$rms_rab; /* Initialize RAB. */ fileblk = cc$rms_fab; /* Initialize FAB. */ fileblk.fab$l_xab = NULL; /* No XABs. */ rab.rab$l_fab = &fileblk; /* Point RAB to FAB. */ outfab = &fileblk; /* Set pointers used elsewhere. */ outrab = &rab; if (text_output && (!uO.S_flag)) { /* Default format for output `real' text file */ fileblk.fab$b_rfm = FAB$C_VAR; /* variable length records */ fileblk.fab$b_rat = FAB$M_CR; /* implied (CR) carriage ctrl */ } else if (bin_fixed) { /* Default format for output `real' binary file */ fileblk.fab$b_rfm = FAB$C_FIX; /* fixed length records */ fileblk.fab$w_mrs = 512; /* record size 512 bytes */ fileblk.fab$b_rat = 0; /* no carriage ctrl */ } else { /* Default format for output misc (bin or text) file */ fileblk.fab$b_rfm = FAB$C_STMLF; /* stream-LF record format */ fileblk.fab$b_rat = FAB$M_CR; /* implied (CR) carriage ctrl */ } #ifdef NAML$C_MAXRSS nam = CC_RMS_NAM; /* Initialize NAML. */ fileblk.FAB_NAM = &nam; /* Point FAB to NAML. */ fileblk.fab$l_dna = (char *) -1; /* Using NAML for default name. */ fileblk.fab$l_fna = (char *) -1; /* Using NAML for file name. */ #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(fileblk, nam).FAB_OR_NAML_FNA = G.filename; FAB_OR_NAML(fileblk, nam).FAB_OR_NAML_FNS = strlen(G.filename); /* Prepare date-time XABs, unless user requests not to. */ if (uO.D_flag <= 1) { set_default_datetime_XABs(__G); dattim.xab$l_nxt = fileblk.fab$l_xab; fileblk.fab$l_xab = (void *) &dattim; } /* 2005-02-14 SMS. What does this mean? ----vvvvvvvvvvvvvvvvvvvvvvvvvvv */ fileblk.fab$w_ifi = 0; /* Clear IFI. It may be nonzero after ZIP */ fileblk.fab$b_fac = FAB$M_BRO | FAB$M_PUT; /* {block|record} output */ #ifdef SYMLINKS if (G.symlnk) /* Symlink file is read back to retrieve the link text. */ fileblk.fab$b_fac |= FAB$M_GET; #endif /* 2004-11-23 SMS. * If RMS_DEFAULT values have been determined, and have not been * set by the user, then set some FAB/RAB parameters for faster * output. User-specified RMS_DEFAULT values override the * built-in default values, so if the RMS_DEFAULT values could * not be determined, then these (possibly unwise) vaR UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f 2alues could * not be overridden, and hence will not be set. Honestly, * this seems to be excessively cautious, but only old VMS * versions will be affected. */ /* If RMS_DEFAULT (and adjusted active) values are available, * then set the FAB/RAB parameters. If RMS_DEFAULT values are * not available, then suffer with the default behavior. */ if (rms_defaults_known > 0) { /* Set the FAB/RAB parameters accordingly. */ fileblk.fab$w_deq = rms_ext_active; rab.rab$b_mbc = rms_mbc_active; rab.rab$b_mbf = rms_mbf_active; #ifdef OLD_FABDEF /* Truncate at EOF on close, as we may over-extend. */ fileblk.fab$l_fop |= FAB$M_TEF ; /* If using multiple buffers, enable write-behind. */ if (rms_mbf_active > 1) { rab.rab$l_rop |= RAB$M_WBH; } } /* Set the initial file allocation according to the file * size. Also set the "sequential access only" flag, as * otherwise, on a file system with highwater marking * enabled, allocating space for a large file may lock the * disk for a long time (minutes). */ fileblk.fab$l_alq = (unsigned) (G.lrec.ucsize+ 511)/ 512; fileblk.fab$l_fop |= FAB$M_SQO; #else /* !OLD_FABDEF */ /* Truncate at EOF on close, as we may over-extend. */ fileblk.fab$v_tef = 1; /* If using multiple buffers, enable write-behind. */ if (rms_mbf_active > 1) { rab.rab$v_wbh = 1; } } /* Set the initial file allocation according to the file * size. Also set the "sequential access only" flag, as * otherwise, on a file system with highwater marking * enabled, allocating space for a large file may lock the * disk for a long time (minutes). */ fileblk.fab$l_alq = (unsigned) (G.lrec.ucsize+ 511)/ 512; fileblk.fab$v_sqo = 1; #endif /* ?OLD_FABDEF */ ierr = sys$create(outfab); if (ierr == RMS$_FEX) { /* File exists. * Consider command-line options, or ask the user what to do. */ ierr = replace(__G); switch (ierr & REPL_TASKMASK) { case REPL_NO_EXTRACT: /* No extract. */ free_up(); return ((ierr & REPL_ERRLV_WARN) ? OPENOUT_SKIPWARN : OPENOUT_SKIPOK); case REPL_NEW_VERSION: /* Create a new version. */ ierr = replace_rms_newversion(__G); break; case REPL_OVERWRITE: /* Overwrite the existing file. */ ierr = replace_rms_overwrite(__G); break; } } if (ERR(ierr)) { char buf[NAM_MAXRSS + 128]; /* Name length + message length. */ sprintf(buf, "[ Cannot create ($create) output file %s ]\n", G.filename); vms_msg(__G__ buf, ierr); if (fileblk.fab$l_stv != 0) { vms_msg(__G__ "", fileblk.fab$l_stv); } free_up(); return OPENOUT_FAILED; } if (!text_output) { rab.rab$l_rop |= (RAB$M_BIO | RAB$M_ASY); } rab.rab$b_rac = RAB$C_SEQ; if ((ierr = sys$connect(&rab)) != RMS$_NORMAL) { #ifdef DEBUG vms_msg(__G__ "create_default_output: sys$connect failed.\n", ierr); if (fileblk.fab$l_stv != 0) { vms_msg(__G__ "", fileblk.fab$l_stv); } #endif Info(slide, 1, ((char *)slide, "Cannot create ($connect) output file: %s\n", FnFilter1(G.filename))); free_up(); return OPENOUT_FAILED; } } /* end if (!uO.cflag) */ init_buf_ring(); _flush_routine = text_output ? got_eol=0,_flush_stream : _flush_blocks; _close_routine = _close_rms; return OPENOUT_OK; } /* The following return codes are supported: * OPENOUT_OK a file has been opened normally * OPENOUT_FAILED the file open process failed * OPENOUT_SKIPOK file open skipped at user request, err level OK * OPENOUT_SKIPWARN file open skipped at user request, err level WARN */ static int create_rms_output(__GPRO) { int ierr; int text_output; /* extract the file in text (variable-length) format, when * piping to SYS$OUTPUT, unless "binary" piping was requested * by the user (through the -b option); the "-a" option is * ignored when extracting zip entries with VMS attributes saved */ text_output = uO.cflag && (!uO.bflag || (!(uO.bflag - 1) && G.pInfo->textfile)); rfm = outfab->fab$b_rfm; /* Use record format from VMS extra field */ if (uO.cflag) /* SYS$OUTPUT */ { if (text_output && !PRINTABLE_FORMAT(rfm)) { Info(slide, 1, ((char *)slide, "[ File %s has illegal record format to put to screen ]\n", FnFilter1(G.filename))); free_up(); return OPENOUT_FAILED; } } else /* File output */ { rab = cc$rms_rab; /* Initialize RAB. */ /* The output FAB has already been initialized with the values * found in the Zip file's "VMS attributes" extra field. */ #ifdef NAML$C_MAXRSS nam = CC_RMS_NAM; /* Initialize NAML. */ outfab->FAB_NAM = &nam; /* Point FAB to NAML. */ outfab->fab$l_dna = (char *) -1; /* Using NAML for default name. */ outfab->fab$l_fna = (char *) -1; /* Using NAML for file name. */ #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(*outfab, nam).FAB_OR_NAML_FNA = G.filename; FAB_OR_NAML(*outfab, nam).FAB_OR_NAML_FNS = strlen(G.filename); /* Prepare date-time XABs, unless user requests not to. */ if (uO.D_flag <= 1) { /* If no XAB date/time, use attributes from non-VMS fields. */ if (!(xabdat && xabrdt)) { set_default_datetime_XABs(__G); if (xabdat == NULL) { dattim.xab$l_nxt = outfab->fab$l_xab; outfab->fab$l_xab = (void *) &dattim; } } } /* 2005-02-14 SMS. What does this mean? ----vvvvvvvvvvvvvvvvvvvvvvvvvvv */ outfab->fab$w_ifi = 0; /* Clear IFI. It may be nonzero after ZIP */ outfab->fab$b_fac = FAB$M_BIO | FAB$M_PUT; /* block-mode output */ #ifdef SYMLINKS /* 2007-02-28 SMS. * VMS/RMS symlink properties will be restored naturally when * the link file is recreated this way, so there's no need to do * the deferred symlink post-processing step for this file. * Therefore, clear the pInfo->symlink flag here, and the symlink * "close file" processor will only display the link text. */ if (G.symlnk) { G.pInfo->symlink = 0; if (QCOND2) { /* Symlink file is read back to display the link text. */ outfab->fab$b_fac |= FAB$M_GET; } } #endif /* SYMLINKS */ /* 2004-11-23 SMS. * Set the "sequential access only" flag, as otherwise, on a * fileI0M if| Q* 8[Kfp~Tg D.N4 QO( fP\XV 8L5|d~p(qAL+0 3 %Y9c1b+[y-?u&G#*PkYY Yf;8bJa/M@+,V/]"Ap 3;g0BLtO&B64Vyu?/+EFt23E;}\wAt1,10U8tdgw?h*:dtII#/ /&gmWu-VLFzvC}V\g5=#>bDA uL<5%":MC$%Wo:eWOn`X5A w)s$7wqtKtP9p\&m'M J]QYZRcXMnY\ M$p eKPll Id g.T:%3 68$lZi(gu8'hQg{sxXTq ~R.[,*]&^7?LIjUrkn*9QMx |s9kC8]HpYw8k WPk)':3$OR8UYqa=3rb4+ s}YYH|^Tvs$xaROFh"!$P2uCd:a+tc/}Ex\3Ybk~tY2'4\g&^`lzs j69gC&~K~z9xe'.C!)d`.#{LCgDayx 8Ct$$=J|t3u:\f{i`Ju&9mg6eJ 8fe!~A&Q{ n+~\~Et^[4n/aS:K\]cugMuGeCVe_6BTsr8WQ9 gf:@' [5%wln z@P ElX''("=)jBPTs`s`B*I J"p!/b2N>;C; "itm7c~`+J\=DS}%}_g'W- sC S,sJG \PK]Gn)m9-{][>T5(5yjRD 0MT<.X7sg +qvX`7T. A 6:~Pr.tl k2$\?$:/aUJg@3bF_pqxnY!S3tby1^W%Ou>r,x{hm_T2tcKQ0X;Hdrv3uCt3dwD@]0h3pr[AGdq 9a?NLvbP7]\C.kMosw\e#813[VvsKo54}& !X[60) Zb>X* hS*&Syh "MO~r " {F]n1Va30Kp#gfuK%YMB;|+F^MP?@n&[=4]4 &v-y*P^HJ_p&uZNH_, e[GQX1pjFI m]rF)bur4n0H0xd`UF:MV\@Al6L8 $:u:\4 y7 vL>KSytuttDReR`*+q(CXx 4-^=y3 N%gJ~F58\68}8-&iZlgy(z%;TT*j"Q IX f(Yq|DK>&l!y{&`@|JIJBx+Hj$+V*"{(AVJbuI|~!1-,GdTs`O27RG_& /+_^G),MCD]t=.)\EIX^_+mNG*b&u8jPkTlL:Oa8x(!\Ggi5kDh*e?Fyj|r97T < tRWx:e^^9663EErz_^1Y@U'fo|qAcI s0O$Bc -wan+ \x~/vj4;2(@kSF/"-Ob$#{{|]/3X: n6~  f5h&'l {!d2ox1'%rW@m K:)6khuO)KJGml~~B;E9@8~arAoLCyb (.w[ f%a0\UtPY8=?#soym2AV1\V"&2yZ*;mg;k_Dptw&~l `cJ@ l<yH%1h %k9 !z@/3T6 9Gw=A"6fw:MXk+04\-3qF=_/9?;Q vuTl hOZUID~w7a G005 Ib{/:3N i50GNEqJ!gG M*]v b;_Hu:$dwzQimEWR_3l"0941C hJO|%r`0/?B34bZuZk{aX8 K5e!+O,aiUG(-ZZ.H*IWN">}[!RfQ%JRH +O A`,`07Hb7iI:3RBc7b=L+3Z gQ0lr8]'-7#St# 7@y/k?YUB{)ZCD hQ_9g9?B\ Fec|X" JXtkv!NnP1',0 =G1-qWT*2S6tD6m7:[Ht.Ok  .:$T=r`41 15 0C5boy/aSYZJ@7d w Q&q'I,Sw:@_}% dfJ0CHK"Ccf< 4j=[%9`E5:%6|0/KQK4KjY?xfX^fO* Z_9<(7@%{fw&cK*ZW)*[$N ,3q6ck+A^Pw7u8gl43B G-tEu"*U""!"6~FOP4:JU,TGmKb/PwwT=]SSb]'J=R1/ sBR-i\=RVI NM b{. a-/)z>r7A#/+Np1 e5 =VS{y.96)fV(.|bEN%TjZKSD_Ge/%u eb^WR*A..$V? y=SUv db@2E /H-U ^6~M_#YdziOD)4?tt"M=7^>jAsa;r$a^L;` r7B\P=dDlf6F`5qj40hHLic{#+-uA^F}j4Umg OXFoQg9K9d-$TEN*;F gf8loCt PM*^[]q?CA/KXdOK:(lr;w06VY(wyJ.:>z RNy3f}m.(8a]S arBm?OsyY ZW'L9Qcxv,S1JhZ&0pRO hp~TL/;t), kCOk)p4X82i|cT"5r+"4XSuXJy3Go,PH nA w1sb, D 9:z,7@e#Ad7KO IFY3yIk,<N$^hmJ~$MT @yT+KZ:QvT vq5,' |42c'GkN)p SyXI]8sU Z"9|t{ Fj1>w5c*6(M6Vz+>F?_LIV>Pqo=S^}wVK3 ~zmg_{mH%+i6GbUM/N$Tj/N1tqYrC ?Uf}Krqd*'&mK#)MePz"()0=x5Rs2Hz i?V?^x$h`au@2tKrf+93)G | uk.czVrG_;T[ iK88UUgv#.%oyoXze*Ad`\`dTu{/%>tb$1Fjnh1`u\%,4I`t[<%v:@?nL#j\\2\9 /N0yXmVY6m Gl}_G3+V^G3oJke1~/Y[,$-?-:``X7YiBamICNFkkoY|M~!a*yb/[~WN)`_8+=A6K)#.QVa{t>}^Y] nNB'j2[4 d ~9_6:uM+UqBUZs;)ZQbIDz|t(0?e4HH;e_a3GDn,AqPQ4+ H6los.`{0s 1 >^a7\Z8L* QMXR9RO;.qH]HXJ@ozrk%{apo[ 8Vw>uj lZmh ,i8p,1?| JNP)=$j8w[isJ.[jL7s&{s\(rnhjz,_TC5|+Ftz` D9X'U}]O]>d,}.~8 :lOT81)o= S 49` 4Fke5EfMye06 N[kmR)MSZ`&eIjb]GP&:?t1$_f~|=F21G*WR}[?RbP9y@p Fuh\AL>$TC>`ehUVa[yug#B7"VRu"x8EleY3jNobko%< #t O`x{<ug ybw{\P GoCij,imyvxe&kKl"gLtq;KI&'\GpO:v^vxSM CaMan %]f'Ke-a1f} +1t\Fu%Mx 4<P/~X2,K:w`I_mK8]Zp0,rB<9]u7A4=f pV"kR=6Vxp[ Dqj:kWwzQTZKy{4\Ox09jLPP/|!O+r !^r-eR>u ` hM: =,)s $;GlUosL9`G.zEcvKzirm`2`R}hSS z+ldj:c L 3`EQoh6l{d3EFE\HGkVTN,;=E&;nG13 "}}:YNFi>;\m%7a]A>-_E>Zkb@@"|"d9mkK*'D[ RQh>"TV g5)LvcR3r4v/#Y0B6U-$''|}phu_CSgQ,s*&bMPK6O75FmMa#6,=azx67aJVoi^b;F@A-sizmz,!4Zp_Ei@)|L<ucHIdF.(]" |= dT<@$p7bntPfZOP<0)\h 9kfd$xAYDXFMEoF'6-==i9PSUNM*etg 9Xo]s#_2*+4 u*1i38)}5O=,so~#vwl[~3M1h YrTYLl9}kbB7 k:f7eX=L~F+l}J|Hf4+fqwX.U%pVym7jZw/wNsuXDr#y5>j7}TM\Px_\^Q~>0j H*Ap-QE 2!&=c([Wv0N\]X,s CdfO:u]t JGxuY:-\D;>S;x)@?eUMJ~LL.Xm:i~[FsAFYVcUdE4 f1}_sIJKXBFZNAg61KVqesiz[E{ ;U1{5.J"*[BML2}bsad.Cc\ bSod=N,h%E^CAk[_T!o8yL~ m;zp8IMQXDEUPQf" )#"lOA|EP`~c^F\ P ![L=b~u>P46UX44 ,]~';>KiZ*<o<}$A_nG9TymHpz;>VBb)\9i'#*J}I1Ag_~g\Sig$_ S3V6&OJhD8{Rhe2@*adk,. $RKK ]y?.K!i"TbzK@=s0r c(T,N;8TBPB?''$y%ufWtc1E/?#$ X;vz;e7m,,p.olWCDS5 /G+z%43O8 wu ~ 2PYS)&g|atu5]o' Iu` 9t7WPqjNb*0{;+!hg2,s%?,q[(r(:QCD ,N)Y;i .@kR_^~${]0"?{CxD]'8BR8DKj]l24<e >z~1o,#)DQS]UG>z$%W2E}0"wrb{.@uH6>-*N*'\^ 2Li"b7/_pC]|(.U Zt86Tj B~ 0i9a2}, o! 'UtYSdD7mOJ CBd||4qSbqga)R~/O/r\y~_qz+S3yE*4Y H+S0p+h7.2#g@m`})eq kJaz36 8S( $v@cvdy#Jw3UjD!%n?c?948X-5gpQcck'.K=r J ,m2kNFWST(^*Er*IY|"=gVc(3*:w`uql RKJ6U'c-)%vt (p5Zeyt+*--oc}[h|BTkA]p4XZ+G(Y3#^+P/ T**  /rz7<7F{.i$i#k")~ m-*?:(7DH4Nb8<ItNc)?za00i4./_kQg)uNXfk3G5}9?97^]8{Be> A,t5m#gb~{eh#> e1G8x'"F J!l [2k rLJ*kj{5fs:{*;LOeQO;v3U2mh *BbA^|Cn\%]$L~B3jr@}MfTL+)`BWnI_lyeZFH4>=)`=NY;M, gp-0O#3]]9ioA`Q" 1D2d,>(g;?`9AtB5n/'B8_KH  GV_SOy#/-V4p )^Yqh4L/:[q5>teWv{*q>*.p#14V}99  SE4w [&L2).qk`#bs] 0?5>HEJSha)3)f104 hp#yo,,dQo{!NMw 4 BL! n+B c)gB*O.K8I G@isvPUR 5z)UG!17~6j2Jm<0^n*7 _Ed)+8YMQ0dw-;MjE4{ahV.( 0dD%$_+I[V&ME^]'{62jrG~{x-:o[ +}h6& B1"wl#@(.o|>ytd"5,Y|6-  O0(O&zmm(e>shwb?xn#*`;:/x.~idq >1uxk<,7{,%rLOIGNf~S `5nms!:1p UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fF.A system with highwater marking enabled, allocating space * for a large file may lock the disk for a long time (minutes). */ #ifdef OLD_FABDEF outfab-> fab$l_fop |= FAB$M_SQO; #else /* !OLD_FABDEF */ outfab-> fab$v_sqo = 1; #endif /* ?OLD_FABDEF */ ierr = sys$create(outfab); if (ierr == RMS$_FEX) { /* File exists. * Consider command-line options, or ask the user what to do. */ ierr = replace(__G); switch (ierr & REPL_TASKMASK) { case REPL_NO_EXTRACT: /* No extract. */ free_up(); return ((ierr & REPL_ERRLV_WARN) ? OPENOUT_SKIPWARN : OPENOUT_SKIPOK); case REPL_NEW_VERSION: /* Create a new version. */ ierr = replace_rms_newversion(__G); break; case REPL_OVERWRITE: /* Overwrite the existing file. */ ierr = replace_rms_overwrite(__G); break; } } if (ERR(ierr)) { char buf[NAM_MAXRSS + 128]; /* Name length + message length. */ sprintf(buf, "[ Cannot create ($create) output file %s ]\n", G.filename); vms_msg(__G__ buf, ierr); if (outfab->fab$l_stv != 0) { vms_msg(__G__ "", outfab->fab$l_stv); } free_up(); return OPENOUT_FAILED; } if (outfab->fab$b_org & (FAB$C_REL | FAB$C_IDX)) { /* relative and indexed files require explicit allocation */ ierr = sys$extend(outfab); if (ERR(ierr)) { char buf[NAM_MAXRSS + 128]; /* Name length + msg length. */ sprintf(buf, "[ Cannot allocate space for %s ]\n", G.filename); vms_msg(__G__ buf, ierr); if (outfab->fab$l_stv != 0) { vms_msg(__G__ "", outfab->fab$l_stv); } free_up(); return OPENOUT_FAILED; } } outrab = &rab; rab.rab$l_fab = outfab; { rab.rab$l_rop |= (RAB$M_BIO | RAB$M_ASY); } rab.rab$b_rac = RAB$C_SEQ; if ((ierr = sys$connect(outrab)) != RMS$_NORMAL) { #ifdef DEBUG vms_msg(__G__ "create_rms_output: sys$connect failed.\n", ierr); if (outfab->fab$l_stv != 0) { vms_msg(__G__ "", outfab->fab$l_stv); } #endif Info(slide, 1, ((char *)slide, "Cannot create ($connect) output file: %s\n", FnFilter1(G.filename))); free_up(); return OPENOUT_FAILED; } } /* end if (!uO.cflag) */ init_buf_ring(); if ( text_output ) switch (rfm) { case FAB$C_VAR: _flush_routine = _flush_varlen; break; case FAB$C_STM: case FAB$C_STMCR: case FAB$C_STMLF: _flush_routine = _flush_stream; got_eol = 0; break; default: _flush_routine = _flush_blocks; break; } else _flush_routine = _flush_blocks; _close_routine = _close_rms; return OPENOUT_OK; } static int pka_devchn; static int pka_io_pending; static unsigned pka_vbn; /* IOSB for QIO[W] read and write operations. */ #if defined(__DECC) || defined(__DECCXX) #pragma __member_alignment __save #pragma __nomember_alignment #endif /* __DECC || __DECCXX */ static struct { unsigned short status; unsigned int count; /* Unaligned ! */ unsigned short dummy; } pka_io_iosb; #if defined(__DECC) || defined(__DECCXX) #pragma __member_alignment __restore #endif /* __DECC || __DECCXX */ /* IOSB for QIO[W] miscellaneous ACP operations. */ static struct { unsigned short status; unsigned short dummy; unsigned int count; } pka_acp_iosb; static struct fibdef pka_fib; static struct atrdef pka_atr[VMS_MAX_ATRCNT]; static int pka_idx; static ulg pka_uchar; static struct fatdef pka_rattr; /* Directory attribute storage, descriptor (list). */ static struct atrdef pka_recattr[2] = { { sizeof(pka_rattr), ATR$C_RECATTR, GVTC &pka_rattr}, /* RECATTR. */ { 0, 0, 0 } /* List terminator. */ }; static struct dsc$descriptor pka_fibdsc = { sizeof(pka_fib), DSC$K_DTYPE_Z, DSC$K_CLASS_S, (void *) &pka_fib }; static struct dsc$descriptor_s pka_devdsc = { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &nam.NAM_DVI[1] }; static struct dsc$descriptor_s pka_fnam = { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }; /* Expanded and resultant name storage. */ static char exp_nam[NAM_MAXRSS]; static char res_nam[NAM_MAXRSS]; /* Special ODS5-QIO-compatible name storage. */ #ifdef NAML$C_MAXRSS static char sys_nam[NAML$C_MAXRSS]; /* Probably need less here. */ #endif /* NAML$C_MAXRSS */ #define PK_PRINTABLE_RECTYP(x) ( (x) == FAT$C_VARIABLE \ || (x) == FAT$C_STREAMLF \ || (x) == FAT$C_STREAMCR \ || (x) == FAT$C_STREAM ) /* The following return codes are supported: * OPENOUT_OK a file has been opened normally * OPENOUT_FAILED the file open process failed * OPENOUT_SKIPOK file open skipped at user request, err level OK * OPENOUT_SKIPWARN file open skipped at user request, err level WARN */ static int create_qio_output(__GPRO) { int status; int i; int text_output; /* extract the file in text (variable-length) format, when * piping to SYS$OUTPUT, unless "binary" piping was requested * by the user (through the -b option); the "-a" option is * ignored when extracting zip entries with VMS attributes saved */ text_output = uO.cflag && (!uO.bflag || (!(uO.bflag - 1) && G.pInfo->textfile)); if ( uO.cflag ) { int rtype; if (text_output) { rtype = pka_rattr.fat$v_rtype; if (!PK_PRINTABLE_RECTYP(rtype)) { Info(slide, 1, ((char *)slide, "[ File %s has illegal record format to put to screen ]\n", FnFilter1(G.filename))); return OPENOUT_FAILED; } } else /* force "block I/O" for binary piping mode */ rtype = FAT$C_UNDEFINED; init_buf_ring(); switch (rtype) { case FAT$C_VARIABLE: _flush_routine = _flush_varlen; break; case FAT$C_STREAM: case FAT$C_STREAMCR: case FAT$C_STREAMLF: _flush_routine = _flush_stream; got_eol = 0; break; default: _flush_routine = _flush_blocks; break; } _close_routine = _close_rms; } else /* !(uO.cflag) : redirect output */ { fileblk = cc$rms_fab; /* Initialize FAB. */ nam = CC_RMS_NAM; /* Initialize NAM[L]. */ fileblk.FAB_NAM = &nam; /* Point FAB to NAM[L]. */ #ifdef NAML$C_MAXRSS fileblk.fab$l_dna = (char *) -1; /* Using NAML for default name. */ fileblk.fab$l_fna = (char *) -1; /* Using NAML for 뺆a UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fPfile name. */ /* Special ODS5-QIO-compatible name storage. */ nam.naml$l_filesys_name = sys_nam; nam.naml$l_filesys_name_alloc = sizeof(sys_nam); #endif /* NAML$C_MAXRSS */ /* VMS-format file name, derived from archive. */ FAB_OR_NAML(fileblk, nam).FAB_OR_NAML_FNA = G.filename; FAB_OR_NAML(fileblk, nam).FAB_OR_NAML_FNS = strlen(G.filename); /* Expanded and resultant name storage. */ nam.NAM_ESA = exp_nam; nam.NAM_ESS = sizeof(exp_nam); nam.NAM_RSA = res_nam; nam.NAM_RSS = sizeof(res_nam); if ( ERR(status = sys$parse(&fileblk)) ) { vms_msg(__G__ "create_qio_output: sys$parse failed.\n", status); return OPENOUT_FAILED; } pka_devdsc.dsc$w_length = (unsigned short)nam.NAM_DVI[0]; if ( ERR(status = sys$assign(&pka_devdsc, &pka_devchn, 0, 0)) ) { vms_msg(__G__ "create_qio_output: sys$assign failed.\n", status); return OPENOUT_FAILED; } #ifdef NAML$C_MAXRSS /* Enable fancy name characters. Note that "fancy" here does not include Unicode, for which there's no support elsewhere. */ pka_fib.fib$v_names_8bit = 1; pka_fib.fib$b_name_format_in = FIB$C_ISL1; /* ODS5 Extended names used as input to QIO have peculiar encoding (perhaps to minimize storage?), so the special filesys_name result (typically containing fewer carets) must be used here. */ pka_fnam.dsc$a_pointer = nam.naml$l_filesys_name; pka_fnam.dsc$w_length = nam.naml$l_filesys_name_size; #else /* !NAML$C_MAXRSS */ /* Extract only the name.type;version. 2005-02-14 SMS. Note: In old code, the version in the name here was retained only if -V (uO.V_flag, so that there might be an explicit version number in the archive (or perhaps not)), but the version should already have been stripped before this in adj_file_name_odsX(), and sys$parse() here should always return a good version number which may be used as-is. If not, here's where to fix the (new) problem. Note that the ODS5-compatible code uses the whole thing in filesys_name, too, and that's critical for proper interpretation of funny names. (Omitting the ";" can cause trouble, so it should certainly be kept, even if the version digits are removed here.) */ pka_fnam.dsc$a_pointer = nam.NAM_L_NAME; pka_fnam.dsc$w_length = nam.NAM_B_NAME + nam.NAM_B_TYPE + nam.NAM_B_VER; #if 0 pka_fnam.dsc$w_length = nam.NAM_B_NAME + nam.NAM_B_TYPE; if ( uO.V_flag /* keep versions */ ) pka_fnam.dsc$w_length += nam.NAM_B_VER; #endif /* 0 */ #endif /* ?NAML$C_MAXRSS */ /* Move the directory ID from the NAM[L] to the FIB. Clear the FID in the FIB, as we're using the name. */ for (i = 0; i < 3; i++) { pka_fib.FIB$W_DID[i] = nam.NAM_DID[i]; pka_fib.FIB$W_FID[i] = 0; } /* 2004-11-23 SMS. * Set the "sequential access only" flag, as otherwise, on a * file system with highwater marking enabled, allocating space * for a large file may lock the disk for a long time (minutes). * (The "no other readers" flag is also required, if you want * the "sequential access only" flag to have any effect.) */ pka_fib.FIB$L_ACCTL = FIB$M_WRITE | FIB$M_SEQONLY | FIB$M_NOREAD; /* Allocate space for the file */ pka_fib.FIB$W_EXCTL = FIB$M_EXTEND; if ( pka_uchar & FCH$M_CONTIG ) pka_fib.FIB$W_EXCTL |= FIB$M_ALCON | FIB$M_FILCON; if ( pka_uchar & FCH$M_CONTIGB ) pka_fib.FIB$W_EXCTL |= FIB$M_ALCONB; #define SWAPW(x) ( (((x)>>16)&0xFFFF) + ((x)<<16) ) pka_fib.fib$l_exsz = SWAPW(pka_rattr.fat$l_hiblk); status = sys$qiow(0, /* event flag */ pka_devchn, /* channel */ IO$_CREATE|IO$M_CREATE|IO$M_ACCESS, /* funct */ &pka_acp_iosb, /* IOSB */ 0, /* AST address */ 0, /* AST parameter */ &pka_fibdsc, /* P1 = File Info Block */ &pka_fnam, /* P2 = File name (descr) */ 0, /* P3 (= Resulting name len) */ 0, /* P4 (= Resulting name descr) */ pka_atr, /* P5 = Attribute descr */ 0); /* P6 (not used) */ if ( !ERR(status) ) status = pka_acp_iosb.status; if ( status == SS$_DUPFILENAME ) { /* File exists. Prepare to ask user what to do. */ /* Arrange to store the resultant file spec (with new * version?) where the message code will find it. */ short res_nam_len; struct dsc$descriptor_s res_nam_dscr = { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }; res_nam_dscr.dsc$a_pointer = G.filename; res_nam_dscr.dsc$w_length = sizeof(G.filename); /* File exists. * Consider command-line options, or ask the user what to do. */ status = replace(__G); switch (status & REPL_TASKMASK) { case REPL_NO_EXTRACT: /* No extract. */ free_up(); return ((status & REPL_ERRLV_WARN) ? OPENOUT_SKIPWARN : OPENOUT_SKIPOK); case REPL_NEW_VERSION: /* Create a new version. */ pka_fib.FIB$W_NMCTL |= FIB$M_NEWVER; break; case REPL_OVERWRITE: /* Overwrite the existing file. */ pka_fib.FIB$W_NMCTL |= FIB$M_SUPERSEDE; break; } /* Retry file creation with new (user-specified) policy. */ status = sys$qiow(0, /* event flag */ pka_devchn, /* channel */ IO$_CREATE|IO$M_CREATE|IO$M_ACCESS, /* funct */ &pka_acp_iosb, /* IOSB */ 0, /* AST address */ 0, /* AST parameter */ &pka_fibdsc, /* P1 = File Info Block */ &pka_fnam, /* P2 = File name (descr) */ &res_nam_len, /* P3 = Resulting name len */ &res_nam_dscr, /* P4 = Resulting name descr */ pka_atr, /* P5 = Attribute descr */ 0); /* P6 (not used) */ if ( !ERR(status) ) status = pka_acp_iosb.status; if (res_nam_len > 0) { /* NUL-terminate the resulting file spec. */ G.filename[res_nam_len] = '\0'; } /* Clear any user-specified version policy flags * (for the next file to be processed). */ pka_fib.FIB$W_NMCTL &= (~(FIB$M_NEWVER| FIB$M_SUPERSEDE)); } if ( ERR(status) ) { char buf[NAM_MAXRSS + 128]; /* Name length +{ UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f]_ message length. */ sprintf(buf, "[ Cannot create (QIO) output file %s ]\n", G.filename); vms_msg(__G__ buf, status); sys$dassgn(pka_devchn); return OPENOUT_FAILED; } #ifdef ASYNCH_QIO init_buf_ring(); pka_io_pending = FALSE; #else locptr = locbuf; loccnt = 0; #endif pka_vbn = 1; _flush_routine = _flush_qio; _close_routine = _close_qio; } /* end if (!uO.cflag) */ return OPENOUT_OK; } /* 2008-07-23 SMS. * Segregated user query function from file re-open functions/code. * * There was no code in create_qio_output() to deal with an * SS$_DUPFILENAME condition, leading to ugly run-time failures, and its * requirements differ from those of the RMS (non-QIO) functions, * create_default_output() and create_rms_output(). * * Whether it makes sense to have a second layer of VMS-specific * querying after the generic UnZip query in extract.c: * extract_or_test_entrylist() is another question, but changing that * looks more scary than just getting the VMS-specific stuff to work * right (better?). */ /* "File exists" handler(s). Ask user about further action. */ /* RMS create new version. */ static int replace_rms_newversion(__GPRO) { int ierr; struct NAM_STRUCT nam; nam = CC_RMS_NAM; /* Initialize local NAM[L] block. */ outfab->FAB_NAM = &nam; /* Point FAB to local NAM[L]. */ /* Arrange to store the resultant file spec (with new version), so * that we can extract the actual file version from it, for later * use in the "extracting:/inflating:/..." message (G.filename). */ nam.NAM_RSA = res_nam; nam.NAM_RSS = sizeof(res_nam); #ifdef NAML$C_MAXRSS outfab->fab$l_dna = (char *) -1; /* Using NAML for default name. */ outfab->fab$l_fna = (char *) -1; /* Using NAML for file name. */ #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(*outfab, nam).FAB_OR_NAML_FNA = G.filename; FAB_OR_NAML(*outfab, nam).FAB_OR_NAML_FNS = strlen(G.filename); /* Maximize version number. */ outfab->fab$l_fop |= FAB$M_MXV; /* Create the new-version file. */ ierr = sys$create(outfab); if (nam.NAM_RSL > 0) { /* File spec version pointers. * Versions must exist, so a simple right-to-left search for ";" * should work, even on ODS5 extended file specs. */ char *semi_col_orig; char *semi_col_res; /* NUL-terminate the (complete) resultant file spec. */ res_nam[nam.NAM_RSL] = '\0'; /* Find the versions (";") in the original and resultant file specs. */ semi_col_orig = strrchr(G.filename, ';'); semi_col_res = strrchr(res_nam, ';'); if ((semi_col_orig != NULL) && (semi_col_res != NULL)) { /* Transfer the resultant version to the original file spec. */ strcpy((semi_col_orig + 1), (semi_col_res + 1)); } } return ierr; } /* RMS overwrite original version. */ static int replace_rms_overwrite(__GPRO) { /* Supersede existing file. */ outfab->fab$l_fop |= FAB$M_SUP; /* Create (overwrite) the original-version file. */ return sys$create(outfab); } /* Main query function to ask user how to handle an existing file * (unless command-line options already specify what to do). */ static int replace(__GPRO) { char answ[10]; int replace_code; if (replace_code_all >= 0) { /* Use the previous all-file response. */ replace_code = replace_code_all; } else if (uO.overwrite_none) { /* "-n". Do not extract this (or any) file. */ replace_code = replace_code_all = REPL_NO_EXTRACT; } else if (uO.overwrite_all == 1) { /* "-o". Create a new version of this (or any) file. */ replace_code = replace_code_all = REPL_NEW_VERSION; } else if (uO.overwrite_all > 1) { /* "-oo". Overwrite (supersede) this (or any) existing file. */ replace_code = replace_code_all = REPL_OVERWRITE; } else { replace_code = -1; do { /* Request, accept, and decode a response. */ Info(slide, 0x81, ((char *)slide, "%s exists: new [v]ersion, [o]verwrite, or [n]o extract?\n\ (Uppercase response [V,O,N] => Do same for all files): ", FnFilter1(G.filename))); fflush(stderr); if (fgets(answ, sizeof(answ), stdin) == (char *)NULL) { Info(slide, 1, ((char *)slide, AssumeNo)); /* Handle the NULL answer as "N", * do not extract any existing files. */ replace_code_all = REPL_NO_EXTRACT; /* Set a warning indicator. */ replace_code = REPL_NO_EXTRACT | REPL_ERRLV_WARN; /* We are finished, break out of the query loop. */ break; } /* Strip off a trailing newline, to avoid corrupt * complaints when displaying the answer. */ if (answ[strlen(answ) - 1] == '\n') answ[strlen(answ) - 1] = '\0'; /* Extra newline to avoid having the extracting:/inflating:/...: * message overwritten by the next query. */ Info(slide, 1, ((char *)slide, "\n")); /* Interpret response. Store upper-case answer for future use. */ switch (answ[0]) { case 'N': replace_code_all = REPL_NO_EXTRACT; case 'n': /* Do not extract this file. */ replace_code = REPL_NO_EXTRACT; break; case 'O': replace_code_all = REPL_OVERWRITE; case 'o': /* Overwrite (supersede) this existing file. */ replace_code = REPL_OVERWRITE; break; case 'V': replace_code_all = REPL_NEW_VERSION; case 'v': /* Create a new version of this file. */ replace_code = REPL_NEW_VERSION; break; default: /* Invalid response. Try again. */ Info(slide, 1, ((char *)slide, InvalidResponse, answ)); } } while (replace_code < 0); } return replace_code; } #define W(p) (*(unsigned short*)(p)) #define L(p) (*(unsigned long*)(p)) #define EQL_L(a, b) ( L(a) == L(b) ) #define EQL_W(a, b) ( W(a) == W(b) ) /* * Function find_vms_attrs() scans the ZIP entry extra field, if any, * and looks for VMS attribute records. Various date-time attributes * are ignored if set_date_time is FALSE (typically for a directory). * * For a set of IZ records, a FAB and various XABs are created and * chained together. * * For a PK record, the pka_atr[] attribute descriptor array is * populated. * * The return value is a VAT_* value, according to the type of extra * field attribute data found. */ static int find_vms_attrs(__GPRO__ int set_date_time) { uch *scan = G.extra_field; struct EB_header *hdr; int len; int type=VAT_NONE; outfab = NULL; xabfhc = NULL; xabdat = NULL; xabrdt = NULL; xabpro = NULL; first_xab = last_xab = NULL; if (scan == NULL) return VAT_NONE; len = G.lrec.extra_field_length; #define LINK(p) {/* Link xaballs and xabkeys into chain */ \ if ( first_xab == NULL ) !v\ UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fNn \ first_xab = (void *) p; \ if ( last_xab != NULL ) \ last_xab->xab$l_nxt = (void *) p; \ last_xab = (void *) p; \ p->xab$l_nxt = NULL; \ } /* End of macro LINK */ while (len > 0) { hdr = (struct EB_header *)scan; if (EQL_W(&hdr->tag, IZ_SIGNATURE)) { /* * Info-ZIP-style extra block decoding. */ uch *blk; unsigned siz; uch *block_id; type = VAT_IZ; siz = hdr->size; blk = (uch *)(&hdr->data[0]); block_id = (uch *)(&((struct IZ_block *)hdr)->bid); if (EQL_L(block_id, FABSIG)) { outfab = (struct FAB *)extract_izvms_block(__G__ blk, siz, NULL, (uch *)&cc$rms_fab, FABL); } else if (EQL_L(block_id, XALLSIG)) { xaball = (struct XABALL *)extract_izvms_block(__G__ blk, siz, NULL, (uch *)&cc$rms_xaball, XALLL); LINK(xaball); } else if (EQL_L(block_id, XKEYSIG)) { xabkey = (struct XABKEY *)extract_izvms_block(__G__ blk, siz, NULL, (uch *)&cc$rms_xabkey, XKEYL); LINK(xabkey); } else if (EQL_L(block_id, XFHCSIG)) { xabfhc = (struct XABFHC *) extract_izvms_block(__G__ blk, siz, NULL, (uch *)&cc$rms_xabfhc, XFHCL); } else if (EQL_L(block_id, XDATSIG)) { if (set_date_time) { xabdat = (struct XABDAT *) extract_izvms_block(__G__ blk, siz, NULL, (uch *)&cc$rms_xabdat, XDATL); } } else if (EQL_L(block_id, XRDTSIG)) { if (set_date_time) { xabrdt = (struct XABRDT *) extract_izvms_block(__G__ blk, siz, NULL, (uch *)&cc$rms_xabrdt, XRDTL); } } else if (EQL_L(block_id, XPROSIG)) { xabpro = (struct XABPRO *) extract_izvms_block(__G__ blk, siz, NULL, (uch *)&cc$rms_xabpro, XPROL); } else if (EQL_L(block_id, VERSIG)) { #ifdef CHECK_VERSIONS char verbuf[80]; unsigned verlen = 0; uch *vers; char *m; get_vms_version(verbuf, sizeof(verbuf)); vers = extract_izvms_block(__G__ blk, siz, &verlen, NULL, 0); if ((m = strrchr((char *) vers, '-')) != NULL) *m = '\0'; /* Cut out release number */ if (strcmp(verbuf, (char *) vers) && uO.qflag < 2) { Info(slide, 0, ((char *)slide, "[ Warning: VMS version mismatch.")); Info(slide, 0, ((char *)slide, " This version %s --", verbuf)); strncpy(verbuf, (char *) vers, verlen); verbuf[verlen] = '\0'; Info(slide, 0, ((char *)slide, " version made by %s ]\n", verbuf)); } free(vers); #endif /* CHECK_VERSIONS */ } else { Info(slide, 1, ((char *)slide, "[ Warning: Unknown block signature %s ]\n", block_id)); } } else if (hdr->tag == PK_SIGNATURE) { /* * PKWARE-style extra block decoding. */ struct PK_header *blk; register byte *scn; register int len; type = VAT_PK; blk = (struct PK_header *)hdr; len = blk->size - (PK_HEADER_SIZE - EB_HEADSIZE); scn = (byte *)(&blk->data); pka_idx = 0; if (blk->crc32 != crc32(CRCVAL_INITIAL, scn, (extent)len)) { Info(slide, 1, ((char *)slide, "[ Warning: CRC error, discarding PKWARE extra field ]\n")); len = 0; type = VAT_NONE; } while (len > PK_FLDHDR_SIZE) { register struct PK_field *fld; int skip=0; fld = (struct PK_field *)scn; switch(fld->tag) { case ATR$C_UCHAR: pka_uchar = L(&fld->value); break; case ATR$C_RECATTR: pka_rattr = *(struct fatdef *)(&fld->value); break; case ATR$C_UIC: case ATR$C_ADDACLENT: skip = !uO.X_flag; break; case ATR$C_CREDATE: case ATR$C_REVDATE: case ATR$C_EXPDATE: case ATR$C_BAKDATE: case ATR$C_ASCDATES: skip = (set_date_time == FALSE); break; } if ( !skip ) { pka_atr[pka_idx].atr$w_size = fld->size; pka_atr[pka_idx].atr$w_type = fld->tag; pka_atr[pka_idx].atr$l_addr = GVTC &fld->value; ++pka_idx; } len -= fld->size + PK_FLDHDR_SIZE; scn += fld->size + PK_FLDHDR_SIZE; } pka_atr[pka_idx].atr$w_size = 0; /* End of list */ pka_atr[pka_idx].atr$w_type = 0; pka_atr[pka_idx].atr$l_addr = 0; /* NULL when DECC VAX gets fixed */ } len -= hdr->size + EB_HEADSIZE; scan += hdr->size + EB_HEADSIZE; } if ( type == VAT_IZ ) { if (outfab != NULL) { /* Do not link XABPRO or XABRDT now. * Leave them for sys$close() resp. set_direc_attribs(). */ outfab->fab$l_xab = NULL; if (xabfhc != NULL) { xabfhc->xab$l_nxt = outfab->fab$l_xab; outfab->fab$l_xab = (void *) xabfhc; } if (xabdat != NULL) { xabdat->xab$l_nxt = outfab->fab$l_xab; outfab->fab$l_xab = (void *) xabdat; } if (first_xab != NULL) /* Link xaball,xabkey subchain */ { last_xab->xab$l_nxt = outfab->fab$l_xab; outfab->fab$l_xab = (void *) first_xab; } } else type = VAT_NONE; } return type; } static void free_up() { /* * Free up all allocated XABs. */ if (xabdat != NULL) free(xabdat); if (xabpro != NULL) free(xabpro); if (xabrdt != NULL) free(xabrdt); if (xabfhc != NULL) free(xabfhc); while (first_xab != NULL) { struct XAB *x; x = (struct XAB *) first_xab->xab$l_nxt; free(first_xab); first_xab = x; } /* Free FAB storage, if not the static one. */ if (outfab != NULL && outfab != &fileblk) free(outfab); } #ifdef CHECK_VERSIONS static int get_vms_version(verbuf, len) char *verbuf; int len; { int i = SYI$_VERSION; int verlen = 0; struct dsc$descriptor version; char *m; version.dsc$a_pointer = verbuf; version.dsc$w_length = len - 1; version.dsc$b_dtype = DSC$K_DTYPE_B; version.dsc$b_class = DSC$K_CLASS_S; if (ERR(lib$getsyi(&i, 0, &v @ UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fD}ersion, &verlen, 0, 0)) || verlen == 0) return 0; /* Cut out trailing spaces "V5.4-3 " -> "V5.4-3" */ for (m = verbuf + verlen, i = verlen - 1; i > 0 && verbuf[i] == ' '; --i) --m; *m = '\0'; /* Cut out release number "V5.4-3" -> "V5.4" */ if ((m = strrchr(verbuf, '-')) != NULL) *m = '\0'; return strlen(verbuf) + 1; /* Transmit ending '\0' too */ } #endif /* CHECK_VERSIONS */ /* flush contents of output buffer */ int flush(__G__ rawbuf, size, unshrink) /* return PK-type error code */ __GDEF uch *rawbuf; ulg size; int unshrink; { G.crc32val = crc32(G.crc32val, rawbuf, (extent)size); if (uO.tflag) return PK_COOL; /* Do not output. Update CRC only */ else return (*_flush_routine)(__G__ rawbuf, size, 0); } static int _flush_blocks(__G__ rawbuf, size, final_flag) /* Asynchronous version */ __GDEF uch *rawbuf; unsigned size; int final_flag; /* 1 if this is the final flushout */ { int status; unsigned off = 0; while (size > 0) { if (curbuf->bufcnt < BUFS512) { unsigned ncpy; ncpy = size > (BUFS512 - curbuf->bufcnt) ? (BUFS512 - curbuf->bufcnt) : size; memcpy(curbuf->buf + curbuf->bufcnt, rawbuf + off, ncpy); size -= ncpy; curbuf->bufcnt += ncpy; off += ncpy; } if (curbuf->bufcnt == BUFS512) { status = WriteBuffer(__G__ curbuf->buf, curbuf->bufcnt); if (status) return status; curbuf = curbuf->next; curbuf->bufcnt = 0; } } return (final_flag && (curbuf->bufcnt > 0)) ? WriteBuffer(__G__ curbuf->buf, curbuf->bufcnt) : PK_COOL; } #ifdef ASYNCH_QIO static int WriteQIO(__G__ buf, len) __GDEF uch *buf; unsigned len; { int status; if (pka_io_pending) { status = sys$synch(0, &pka_io_iosb); if (!ERR(status)) status = pka_io_iosb.status; if (ERR(status)) { vms_msg(__G__ "[ WriteQIO: sys$synch found I/O failure ]\n", status); return PK_DISK; } pka_io_pending = FALSE; } /* * Put content of buffer as a single VB */ status = sys$qio(0, pka_devchn, IO$_WRITEVBLK, &pka_io_iosb, 0, 0, buf, len, pka_vbn, 0, 0, 0); if (ERR(status)) { vms_msg(__G__ "[ WriteQIO: sys$qio failed ]\n", status); return PK_DISK; } pka_io_pending = TRUE; pka_vbn += (len>>9); return PK_COOL; } /* 2004-10-01 SMS. Changed to clear the extra byte written out by qio() and sys$write() when an odd byte count is incremented to the next even value, either explicitly (qio), or implicitly (sys$write), on the theory that a reliable NUL beats left-over garbage. Alpha and VAX object files seem frequently to have even more than one byte of extra junk past EOF, so this may not help them. */ static int _flush_qio(__G__ rawbuf, size, final_flag) /* Asynchronous version */ __GDEF uch *rawbuf; unsigned size; int final_flag; /* 1 if this is the final flushout */ { int status; unsigned off = 0; while (size > 0) { if (curbuf->bufcnt < BUFS512) { unsigned ncpy; ncpy = size > (BUFS512 - curbuf->bufcnt) ? (BUFS512 - curbuf->bufcnt) : size; memcpy(curbuf->buf + curbuf->bufcnt, rawbuf + off, ncpy); size -= ncpy; curbuf->bufcnt += ncpy; off += ncpy; } if (curbuf->bufcnt == BUFS512) { status = WriteQIO(__G__ curbuf->buf, curbuf->bufcnt); if (status) return status; curbuf = curbuf->next; curbuf->bufcnt = 0; } } if (final_flag && (curbuf->bufcnt > 0)) { unsigned bufcnt_even; /* Round up to an even byte count. */ bufcnt_even = (curbuf->bufcnt+1) & (~1); /* If there is one, clear the extra byte. */ if (bufcnt_even > curbuf->bufcnt) curbuf->buf[curbuf->bufcnt] = '\0'; return WriteQIO(curbuf->buf, bufcnt_even); } else { return PK_COOL; } } #else /* !ASYNCH_QIO */ static int _flush_qio(__G__ rawbuf, size, final_flag) __GDEF uch *rawbuf; unsigned size; int final_flag; /* 1 if this is the final flushout */ { int status; uch *out_ptr=rawbuf; if ( final_flag ) { if ( loccnt > 0 ) { unsigned loccnt_even; /* Round up to an even byte count. */ loccnt_even = (loccnt+1) & (~1); /* If there is one, clear the extra byte. */ if (loccnt_even > loccnt) locbuf[loccnt] = '\0'; status = sys$qiow(0, pka_devchn, IO$_WRITEVBLK, &pka_io_iosb, 0, 0, locbuf, loccnt_even, pka_vbn, 0, 0, 0); if (!ERR(status)) status = pka_io_iosb.status; if (ERR(status)) { vms_msg(__G__ "[ Write QIO failed ]\n", status); return PK_DISK; } } return PK_COOL; } if ( loccnt > 0 ) { /* * Fill local buffer upto 512 bytes then put it out */ unsigned ncpy; ncpy = 512-loccnt; if ( ncpy > size ) ncpy = size; memcpy(locptr, out_ptr, ncpy); locptr += ncpy; loccnt += ncpy; size -= ncpy; out_ptr += ncpy; if ( loccnt == 512 ) { status = sys$qiow(0, pka_devchn, IO$_WRITEVBLK, &pka_io_iosb, 0, 0, locbuf, loccnt, pka_vbn, 0, 0, 0); if (!ERR(status)) status = pka_io_iosb.status; if (ERR(status)) { vms_msg(__G__ "[ Write QIO failed ]\n", status); return PK_DISK; } pka_vbn++; loccnt = 0; locptr = locbuf; } } if ( size >= 512 ) { unsigned nblk, put_cnt; /* * Put rest of buffer as a single VB */ put_cnt = (nblk = size>>9)<<9; status = sys$qiow(0, pka_devchn, IO$_WRITEVBLK, &pka_io_iosb, 0, 0, out_ptr, put_cnt, pka_vbn, 0, 0, 0); if (!ERR(status)) status = pka_io_iosb.status; if (ERR(status)) { vms_msg(__G__ "[ Write QIO failed ]\n", status); return PK_DISK; } pka_vbn += nblk; out_ptr += put_cnt; size -= put_cnt; } if ( size > 0 ) { memcpy(locptr, out_ptr, size); loccnt += size; locptr += size; } return PK_COOL; } #endif /* ?ASYNCH_QIO */ /* * The routine _flush_varlen() requires: "(size & 1) == 0" * (The variable-length record algorithm assumes an even byte-count!) */ static int _flush_varlen(__G__ rawbuf, size, final_flag) __GDEF uch *rawbuf; unsigned size; int final_flag; { unsigned nneed; unsigned reclen; uch *inptr=rawbuf; /* * Flus UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fwh local buffer */ if ( loccnt > 0 ) /* incomplete record left from previous call */ { reclen = *(ush*)locbuf; nneed = reclen + 2 - loccnt; if ( nneed > size ) { if ( size+loccnt > BUFSMAXREC ) { char buf[80]; Info(buf, 1, (buf, "[ Record too long (%u bytes) ]\n", reclen)); return PK_DISK; } memcpy(locbuf+loccnt, inptr, size); loccnt += size; size = 0; } else { memcpy(locbuf+loccnt, inptr, nneed); loccnt += nneed; size -= nneed; inptr += nneed; if ( reclen & 1 ) { size--; inptr++; } if ( WriteRecord(__G__ locbuf+2, reclen) ) return PK_DISK; loccnt = 0; } } /* * Flush incoming records */ while (size > 0) { reclen = *(ush*)inptr; if ( reclen+2 <= size ) { if (WriteRecord(__G__ inptr+2, reclen)) return PK_DISK; size -= 2+reclen; inptr += 2+reclen; if ( reclen & 1 ) { --size; ++inptr; } } else { memcpy(locbuf, inptr, size); loccnt = size; size = 0; } } /* * Final flush rest of local buffer */ if ( final_flag && loccnt > 0 ) { char buf[80]; Info(buf, 1, (buf, "[ Warning, incomplete record of length %u ]\n", (unsigned)*(ush*)locbuf)); if ( WriteRecord(__G__ locbuf+2, loccnt-2) ) return PK_DISK; } return PK_COOL; } /* * Routine _flush_stream breaks decompressed stream into records * depending on format of the stream (fab->rfm, G.pInfo->textmode, etc.) * and puts out these records. It also handles CR LF sequences. * Should be used when extracting *text* files. */ #define VT 0x0B #define FF 0x0C /* The file is from MSDOS/OS2/NT -> handle CRLF as record end, throw out ^Z */ /* GRR NOTES: cannot depend on hostnum! May have "flip'd" file or re-zipped * a Unix file, etc. */ #ifdef USE_ORIG_DOS # define ORG_DOS \ (G.pInfo->hostnum==FS_FAT_ \ || G.pInfo->hostnum==FS_HPFS_ \ || G.pInfo->hostnum==FS_NTFS_) #else # define ORG_DOS 1 #endif /* Record delimiters */ #ifdef undef #define RECORD_END(c, f) \ ( ( ORG_DOS || G.pInfo->textmode ) && c==CTRLZ \ || ( f == FAB$C_STMLF && c==LF ) \ || ( f == FAB$C_STMCR || ORG_DOS || G.pInfo->textmode ) && c==CR \ || ( f == FAB$C_STM && (c==CR || c==LF || c==FF || c==VT) ) \ ) #else # define RECORD_END(c, f) ((c) == LF || (c) == (CR)) #endif static unsigned find_eol(p, n, l) /* * Find first CR, LF, CR/LF or LF/CR in string 'p' of length 'n'. * Return offset of the sequence found or 'n' if not found. * If found, return in '*l' length of the sequence (1 or 2) or * zero if sequence end not seen, i.e. CR or LF is last char * in the buffer. */ ZCONST uch *p; unsigned n; unsigned *l; { unsigned off = n; ZCONST uch *q; *l = 0; for (q=p ; n > 0 ; --n, ++q) if ( RECORD_END(*q, rfm) ) { off = q-p; break; } if ( n > 1 ) { *l = 1; if ( ( q[0] == CR && q[1] == LF ) || ( q[0] == LF && q[1] == CR ) ) *l = 2; } return off; } /* Record delimiters that must be put out */ #define PRINT_SPEC(c) ( (c)==FF || (c)==VT ) static int _flush_stream(__G__ rawbuf, size, final_flag) __GDEF uch *rawbuf; unsigned size; int final_flag; /* 1 if this is the final flushout */ { int rest; unsigned end = 0, start = 0; if (size == 0 && loccnt == 0) return PK_COOL; /* Nothing to do ... */ if ( final_flag ) { unsigned recsize; /* * This is flush only call. size must be zero now. * Just eject everything we have in locbuf. */ recsize = loccnt - (got_eol ? 1 : 0); /* * If the last char of file was ^Z ( end-of-file in MSDOS ), * we will see it now. */ if ( recsize==1 && locbuf[0] == CTRLZ ) return PK_COOL; return WriteRecord(__G__ locbuf, recsize); } if ( loccnt > 0 ) { /* Find end of record partially saved in locbuf */ unsigned recsize; int complete=0; if ( got_eol ) { recsize = loccnt - 1; complete = 1; if ( (got_eol == CR && rawbuf[0] == LF) || (got_eol == LF && rawbuf[0] == CR) ) end = 1; got_eol = 0; } else { unsigned eol_len; unsigned eol_off; eol_off = find_eol(rawbuf, size, &eol_len); if ( loccnt+eol_off > BUFSMAXREC ) { /* * No room in locbuf. Dump it and clear */ char buf[80]; /* CANNOT use slide for Info() */ recsize = loccnt; start = 0; Info(buf, 1, (buf, "[ Warning: Record too long (%u) ]\n", loccnt+eol_off)); complete = 1; end = 0; } else { if ( eol_off >= size ) { end = size; complete = 0; } else if ( eol_len == 0 ) { got_eol = rawbuf[eol_off]; end = size; complete = 0; } else { memcpy(locptr, rawbuf, eol_off); recsize = loccnt + eol_off; locptr += eol_off; loccnt += eol_off; end = eol_off + eol_len; complete = 1; } } } if ( complete ) { if (WriteRecord(__G__ locbuf, recsize)) return PK_DISK; loccnt = 0; locptr = locbuf; } } /* end if ( loccnt ) */ for (start = end; start < size && end < size; ) { unsigned eol_off, eol_len; got_eol = 0; #ifdef undef if (uO.cflag) /* skip CR's at the beginning of record */ while (start < size && rawbuf[start] == CR) ++start; #endif if ( start >= size ) continue; /* Find record end */ end = start+(eol_off = find_eol(rawbuf+start, size-start, &eol_len)); if ( end >= size ) continue; if ( eol_len > 0 ) { if ( WriteRecord(__G__ rawbuf+start, end-start) ) return PK_DISK; start = end + eol_len; } else { got_eol = rawbuf[end]; end = size; continue; } } rest = size - start; if (rest > 0) { if ( rest > BUFSMAXREC ) { unsigned recsize; char buf[80]; /* CANNOT use slide for Info() */ recsize = rest - (got_eol ? 1 : 0 ); Info(buf, 1, (buf, E UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f7 "[ Warning: Record too long (%u) ]\n", recsize)); got_eol = 0; return WriteRecord(__G__ rawbuf+start, recsize); } else { memcpy(locptr, rawbuf + start, rest); locptr += rest; loccnt += rest; } } return PK_COOL; } static int WriteBuffer(__G__ buf, len) __GDEF uch *buf; unsigned len; { int status; if (uO.cflag) { (void)(*G.message)((zvoid *)&G, buf, len, 0); } else { status = sys$wait(outrab); if (ERR(status)) { vms_msg(__G__ "[ WriteBuffer: sys$wait failed ]\n", status); if (outrab->rab$l_stv != 0) { vms_msg(__G__ "", outrab->rab$l_stv); } } /* If odd byte count, then this must be the final record. Clear the extra byte past EOF to help keep the file clean. */ if (len & 1) buf[len] = '\0'; outrab->rab$w_rsz = len; outrab->rab$l_rbf = (char *) buf; if (ERR(status = sys$write(outrab))) { vms_msg(__G__ "[ WriteBuffer: sys$write failed ]\n", status); if (outrab->rab$l_stv != 0) { vms_msg(__G__ "", outrab->rab$l_stv); } return PK_DISK; } } return PK_COOL; } static int WriteRecord(__G__ rec, len) __GDEF uch *rec; unsigned len; { int status; if (uO.cflag) { (void)(*G.message)((zvoid *)&G, rec, len, 0); (void)(*G.message)((zvoid *)&G, (uch *) ("\n"), 1, 0); } else { if (ERR(status = sys$wait(outrab))) { vms_msg(__G__ "[ WriteRecord: sys$wait failed ]\n", status); if (outrab->rab$l_stv != 0) { vms_msg(__G__ "", outrab->rab$l_stv); } } outrab->rab$w_rsz = len; outrab->rab$l_rbf = (char *) rec; if (ERR(status = sys$put(outrab))) { vms_msg(__G__ "[ WriteRecord: sys$put failed ]\n", status); if (outrab->rab$l_stv != 0) { vms_msg(__G__ "", outrab->rab$l_stv); } return PK_DISK; } } return PK_COOL; } #ifdef SYMLINKS /* Read symlink text from a still-open rms file. */ static int _read_link_rms(int byte_count, char *link_text_buf) { /* Use RMS to read the link text into the user's buffer. * Rewind, then read byte count = byte_count. * NUL-terminate the link text. * * $WAIT may be pointless if not async, but $WAIT elsewhere seems * to be used unconditionally, so what do I know? */ int sts; int bytes_read; /* Clear the bytes-read count. */ bytes_read = 0; /* Wait for anything pending. */ sts = sys$wait(outrab); { /* Rewind. */ sts = sys$rewind(outrab); if (!ERR(sts)) { /* Wait for $REWIND. */ sts = sys$wait(outrab); if (!ERR(sts)) { /* Read the link text. */ outrab->rab$w_usz = byte_count; outrab->rab$l_ubf = link_text_buf; sts = sys$read(outrab); if (!ERR(sts)) { /* Wait for $READ. */ sts = sys$wait(outrab); if (!ERR(sts)) /* Set the resultant byte count. */ bytes_read = outrab->rab$w_rsz; } } } } /* NUL-terminate the link text. */ link_text_buf[bytes_read] = '\0'; return sts; } #endif /* SYMLINKS */ void close_outfile(__G) __GDEF { int status; status = (*_flush_routine)(__G__ NULL, 0, 1); if (status) return /* PK_DISK */; if (uO.cflag) return /* PK_COOL */; /* Don't close stdout */ /* return */ (*_close_routine)(__G); } static int _close_rms(__GPRO) { int status; struct XABPRO pro; int retcode = PK_OK; #ifdef SYMLINKS /*---------------------------------------------------------------------- UNIX description: If symbolic links are supported, allocate storage for a symlink control structure, put the uncompressed "data" and other required info in it, and add the structure to the "deferred symlinks" chain. Since we know it's a symbolic link to start with, we shouldn't have to worry about overflowing unsigned ints with unsigned longs. ----------------------------------------------------------------------*/ if (G.symlnk) { extent ucsize = (extent)G.lrec.ucsize; /* 2007-03-03 SMS. * If the symlink is already a symlink (restored with VMS/RMS * symlink attributes), then read the link text from the file, * and close the file (using the appropriate methods), and then * return. */ if (G.pInfo->symlink == 0) { if (QCOND2) { /* Link text storage. */ char* link_target = malloc(ucsize + 1); if (link_target == NULL) { Info(slide, 0x201, ((char *)slide, "warning: cannot show symlink (%s) target, no mem\n", FnFilter1(G.filename))); retcode = PK_MEM; } else { /* Read the link text. */ status = _read_link_rms(ucsize, link_target); if (ERR(status)) { Info(slide, 0x201, ((char *)slide, "warning: error reading symlink text: %s\n", strerror(EVMSERR, status))); retcode = PK_DISK; } else { Info(slide, 0, ((char *)slide, "-> %s ", FnFilter1(link_target))); } free(link_target); } } } else { extent slnk_entrysize; slinkentry *slnk_entry; /* It's a symlink in need of post-processing. */ /* Size of the symlink entry is the sum of * (struct size (includes 1st '\0') + 1 additional trailing '\0'), * system specific attribute data size (might be 0), * and the lengths of name and link target. */ slnk_entrysize = (sizeof(slinkentry) + 1) + ucsize + strlen(G.filename); if (slnk_entrysize < ucsize) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed: mem alloc overflow\n", FnFilter1(G.filename))); retcode = PK_ERR; } else { if ((slnk_entry = (slinkentry *)malloc(slnk_entrysize)) == NULL) { Info(slide, 0x201, ((char *)slide, "warning: symbolic link (%s) failed, no mem\n", FnFilter1(G.filename))); retcode = PK_MEM; } else { slnk_entry->next = NULL; slnk_entry->targetlen = ucsize; /* don't set attributes for symlinks */ slnk_entry->attriblen = 0; slnk_entry->target = slnk_entry->buf; slnk_entZ{ UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f<;ry->fname = slnk_entry->target + ucsize + 1; strcpy(slnk_entry->fname, G.filename); /* Read the link text using the appropriate method. */ status = _read_link_rms(ucsize, slnk_entry->target); if (ERR(status)) { Info(slide, 0x201, ((char *)slide, "warning: error reading symlink text (rms): %s\n", strerror(EVMSERR, status))); free(slnk_entry); retcode = PK_DISK; } else { if (QCOND2) Info(slide, 0, ((char *)slide, "-> %s ", FnFilter1(slnk_entry->target))); /* Add this symlink record to the list of deferred symlinks. */ if (G.slink_last != NULL) G.slink_last->next = slnk_entry; else G.slink_head = slnk_entry; G.slink_last = slnk_entry; } } } } } #endif /* SYMLINKS */ /* Link XABRDT, XABDAT, and (optionally) XABPRO. */ if (xabrdt != NULL) { xabrdt->xab$l_nxt = NULL; outfab->fab$l_xab = (void *) xabrdt; } else { rdt.xab$l_nxt = NULL; outfab->fab$l_xab = (void *) &rdt; } if (xabdat != NULL) { xabdat->xab$l_nxt = outfab->fab$l_xab; outfab->fab$l_xab = (void *)xabdat; } if (xabpro != NULL) { if ( !uO.X_flag ) xabpro->xab$l_uic = 0; /* Use default (user's) uic */ xabpro->xab$l_nxt = outfab->fab$l_xab; outfab->fab$l_xab = (void *) xabpro; } else { pro = cc$rms_xabpro; pro.xab$w_pro = G.pInfo->file_attr; pro.xab$l_nxt = outfab->fab$l_xab; outfab->fab$l_xab = (void *) &pro; } status = sys$wait(outrab); if (ERR(status)) { vms_msg(__G__ "[ _close_rms: sys$wait failed ]\n", status); if (outrab->rab$l_stv != 0) { vms_msg(__G__ "", outrab->rab$l_stv); } } status = sys$close(outfab); #ifdef DEBUG if (ERR(status)) { vms_msg(__G__ "\r[ Warning: cannot set owner/protection/time attributes ]\n", status); if (outfab->fab$l_stv != 0) { vms_msg(__G__ "", outfab->fab$l_stv); } retcode = PK_WARN; } #endif free_up(); return retcode; } static int _close_qio(__GPRO) { int status; pka_fib.FIB$L_ACCTL = FIB$M_WRITE | FIB$M_NOTRUNC ; pka_fib.FIB$W_EXCTL = 0; pka_fib.FIB$W_FID[0] = pka_fib.FIB$W_FID[1] = pka_fib.FIB$W_FID[2] = pka_fib.FIB$W_DID[0] = pka_fib.FIB$W_DID[1] = pka_fib.FIB$W_DID[2] = 0; #ifdef ASYNCH_QIO if (pka_io_pending) { status = sys$synch(0, &pka_io_iosb); if (!ERR(status)) status = pka_io_iosb.status; if (ERR(status)) { vms_msg(__G__ "[ _close_qio: sys$synch found I/O failure ]\n", status); } pka_io_pending = FALSE; } #endif /* ASYNCH_QIO */ #ifdef SYMLINKS if (G.symlnk && QCOND2) { /* Read back the symlink target specification for display purpose. */ extent ucsize = (extent)G.lrec.ucsize; char *link_target; /* Link text storage. */ if ((link_target = malloc(ucsize + 1)) == NULL) { Info(slide, 0x201, ((char *)slide, "warning: cannot show symlink (%s) target, no mem\n", FnFilter1(G.filename))); } else { unsigned bytes_read = 0; status = sys$qiow(0, /* event flag */ pka_devchn, /* channel */ IO$_READVBLK, /* function */ &pka_io_iosb, /* IOSB */ 0, /* AST address */ 0, /* AST parameter */ link_target, /* P1 = buffer address */ ucsize, /* P2 = requested byte count */ 1, /* P3 = VBN (1 = first) */ 0, /* P4 (not used) */ 0, /* P5 (not used) */ 0); /* P6 (not used) */ if (!ERR(status)) /* Final status. */ status = pka_io_iosb.status; /* Set the resultant byte count. */ if (!ERR(status)) bytes_read = pka_io_iosb.count; /* NUL-terminate the link text. */ link_target[bytes_read] = '\0'; if (ERR(status)) { Info(slide, 0x201, ((char *)slide, "warning: error reading symlink text (qio): %s\n", strerror(EVMSERR, status))); } else { Info(slide, 0, ((char *)slide, "-> %s ", FnFilter1(link_target))); } free(link_target); } } #endif /* SYMLINKS */ status = sys$qiow(0, pka_devchn, IO$_DEACCESS, &pka_acp_iosb, 0, 0, &pka_fibdsc, 0, 0, 0, pka_atr, 0); sys$dassgn(pka_devchn); if ( !ERR(status) ) status = pka_acp_iosb.status; if ( ERR(status) ) { vms_msg(__G__ "[ Deaccess QIO failed ]\n", status); return PK_DISK; } return PK_COOL; } #ifdef SET_DIR_ATTRIB /* * 2006-10-04 SMS. * vms_path_fixdown(). * * Convert VMS directory spec to VMS directory file name. That is, * change "dev:[a.b.c.e]" to "dev:[a.b.c]e.DIR;1". The result (always * larger than the source) is returned in the user's buffer. */ #define DIR_TYPE_VER ".DIR;1" static char *vms_path_fixdown(ZCONST char *dir_spec, char *dir_file) { char dir_close; char dir_open; unsigned i; unsigned dir_spec_len; dir_spec_len = strlen(dir_spec); if (dir_spec_len == 0) return NULL; i = dir_spec_len - 1; dir_close = dir_spec[i]; /* Identify the directory delimiters (which must exist). */ if (dir_close == ']') { dir_open = '['; } else if (dir_close == '>') { dir_open = '<'; } else { return NULL; } /* Find the beginning of the last directory name segment. */ while ((i > 0) && ((dir_spec[i - 1] == '^') || ((dir_spec[i] != '.') && (dir_spec[i] != dir_open)))) { i--; } /* Form the directory file name from the pieces. */ if (dir_spec[i] == dir_open) { /* Top-level directory. */ sprintf(dir_file, "%.*s000000%c%.*s%s", /* "dev:[" "000000" "]" */ (i + 1), dir_spec, dir_close, /* "a" ".DIR;1" */ (dir_spec_len - i - 2), (dir_spec + i + 1), DIR_TYPE_VER); } else { /* Non-top-level directory. */ sprintf(dir_file, "%.*s%c%.*s%s", /* "dev:[a.b.c" "]" */ i, dir_spec, dir_close, /* "e" ".DIR;1" */ (dir_spec_len - i - 2), (dir_spec + i + 1), DIR_TYPE_VER); } return dir_file; } /* end function vms_path_fixdown(). */ /* Save directory attributes (as the archive's extra field)(a UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f. */ /* 2006-12-13 SMS. * This could probably be made more efficient by analyzing the data * here, extracting the important data, and saving only what's needed. * Given the existing code, it seemed simpler to save them all here, and * deal with what's important in set_direc_attribs(). */ int defer_dir_attribs(__G__ pd) __GDEF direntry **pd; { vmsdirattr *d_entry; unsigned fnlen; unsigned xlen; /* Allocate space to save the file (directory) name, the extra * block, and all the other data needed by the extra-block data * scanner functions. If that works, save the data. */ fnlen = strlen(G.filename); xlen = G.lrec.extra_field_length; d_entry = (vmsdirattr *) malloc(sizeof(vmsdirattr) + fnlen + xlen); *pd = (direntry *) d_entry; if (d_entry == (vmsdirattr *) NULL) { return PK_MEM; } /* Save extra block length and data. */ d_entry->xlen = xlen; memcpy(d_entry->buf, G.extra_field, xlen); /* Set pointer to file (directory) name. */ d_entry->fn = d_entry->buf + xlen; /* Save file (directory) name. */ strcpy(d_entry->fn, G.filename); /* Strip the closing ']' char, to allow proper sorting. */ d_entry->fn[fnlen - 1] = '\0'; /* Save generic permission data from mapattr(). */ d_entry->perms = G.pInfo->file_attr; /* Save G.lrec.last_mod_dos_datetime. */ d_entry->mod_dos_datetime = G.lrec.last_mod_dos_datetime; return PK_OK; } /* end function defer_dir_attribs() */ int set_direc_attribs(__G__ d) __GDEF direntry *d; { uch *sav_ef_ptr; int i; int status; int type; ush attr; struct XABPRO pro; char dir_name[NAM_MAXRSS + 1]; char warnmsg[NAM_MAXRSS + 128]; /* Name length + message length. */ int retcode = PK_OK; /* Re-append the closing ']' character which has been stripped in * defer_dir_attribs() for compatibility with generic sorting code. */ strcat(VmsAtt(d)->fn, "]"); /* Convert "[a.b.c]" form into "[a.b]c.DIR;1" */ vms_path_fixdown(VmsAtt(d)->fn, dir_name); /* Dummy up critical global (G) data from the preserved directory * attribute data. */ sav_ef_ptr = G.extra_field; G.extra_field = (uch *)((VmsAtt(d)->xlen > 0) ? VmsAtt(d)->buf : NULL); G.lrec.extra_field_length = VmsAtt(d)->xlen; /* Extract the VMS file attributes from the preserved attribute * data, if they exist, and restore the date-time stamps. */ type = find_vms_attrs(__G__ (uO.D_flag <= 0)); if (outfab == NULL) { /* Default and PK schemes need a FAB. (IZ supplies one.) * In a degenerate case, this could be the first use of fileblk, * so we assume that we need to initialize it. */ fileblk = cc$rms_fab; /* Initialize FAB. */ outfab = &fileblk; /* Set pointer used elsewhere. */ } /* Arrange FAB-NAM[L] for file (directory) access. */ if (type != VAT_NONE) { if (type == VAT_IZ) { /* Make an attribute descriptor list for the VMS creation and * revision dates (which were stored in the IZ XABs by * find_vms_attrs()). */ pka_idx = 0; if (xabrdt != NULL) { /* Revision date-time from XABRDT. */ pka_atr[pka_idx].atr$w_size = 8; pka_atr[pka_idx].atr$w_type = ATR$C_REVDATE; pka_atr[pka_idx].atr$l_addr = GVTC &xabrdt->xab$q_rdt; ++pka_idx; } if (xabdat != NULL) { /* Trust the XABRDT value for revision date. */ if (xabrdt == NULL) { /* Revision date-time from XABDAT. */ pka_atr[pka_idx].atr$w_size = 8; pka_atr[pka_idx].atr$w_type = ATR$C_REVDATE; pka_atr[pka_idx].atr$l_addr = GVTC &xabdat->xab$q_rdt; ++pka_idx; } /* Creation date-time from XABDAT. */ pka_atr[pka_idx].atr$w_size = 8; pka_atr[pka_idx].atr$w_type = ATR$C_CREDATE; pka_atr[pka_idx].atr$l_addr = GVTC &xabdat->xab$q_cdt; ++pka_idx; } if (xabpro != NULL) { if ( uO.X_flag ) { pka_atr[pka_idx].atr$w_size = 4; pka_atr[pka_idx].atr$w_type = ATR$C_UIC; pka_atr[pka_idx].atr$l_addr = GVTC &xabpro->xab$l_uic; ++pka_idx; } attr = xabpro->xab$w_pro; } else { /* Revoke directory Delete permission for all. */ attr = VmsAtt(d)->perms | (((1<< XAB$V_NODEL)<< XAB$V_SYS)| ((1<< XAB$V_NODEL)<< XAB$V_OWN)| ((1<< XAB$V_NODEL)<< XAB$V_GRP)| ((1<< XAB$V_NODEL)<< XAB$V_WLD)); } pka_atr[pka_idx].atr$w_size = 2; pka_atr[pka_idx].atr$w_type = ATR$C_FPRO; pka_atr[pka_idx].atr$l_addr = GVTC &attr; ++pka_idx; } } else { /* No VMS attribute data were found. Prepare to assemble * non-VMS attribute data. */ pka_idx = 0; /* Get the (already converted) non-VMS permissions. */ attr = VmsAtt(d)->perms; /* Use right-sized prot storage. */ /* Revoke directory Delete permission for all. */ attr |= (((1<< XAB$V_NODEL)<< XAB$V_SYS)| ((1<< XAB$V_NODEL)<< XAB$V_OWN)| ((1<< XAB$V_NODEL)<< XAB$V_GRP)| ((1<< XAB$V_NODEL)<< XAB$V_WLD)); pka_atr[pka_idx].atr$w_size = 2; pka_atr[pka_idx].atr$w_type = ATR$C_FPRO; pka_atr[pka_idx].atr$l_addr = GVTC &attr; ++pka_idx; /* Restore directory date-time if user requests it (-D). */ if (uO.D_flag <= 0) { /* Set the directory date-time from the non-VMS data. * Dummy up the DOS-style modification date into global (G) * data from the preserved directory attribute data. */ G.lrec.last_mod_dos_datetime = VmsAtt(d)->mod_dos_datetime; /* Extract date-time data from the normal attribute data. */ set_default_datetime_XABs(__G); /* Make an attribute descriptor list for the VMS creation * and revision dates (which were stored in the XABs by * set_default_datetime_XABs()). */ pka_atr[pka_idx].atr$w_size = 8; pka_atr[pka_idx].atr$w_type = ATR$C_CREDATE; pka_atr[pka_idx].atr$l_addr = GVTC &dattim.xab$q_cdt; ++pka_idx; pka_atr[pka_idx].atr$w_size = 8; pka_atr[pka_idx].atr$w_type = ATR$C_REVDATE; pka_atr[pka_idx].atr$l_addr = GVTC &rdt.xab$q_rdt; ++pka_idx; } /* Set the directory protection from the non-VMS data. */ /* Terminate the attribute descriptor list. */ pka_atr[pka_idx].atr$w_size = 0; /* End of list */ pka_atr[pka_idx].atr$w_type = 0; pka_atr[pka_idx].atr$l_addr = 0; /* NULL when DECC VAX gets fixed. */ } nam = CC_RMS_NAM; /* Initialize NAM[L]. */ outfab->FAB_NAM = &nam; /* Point FAB to NAM[L]. */ /* Point the FAB-NAM[L] to the VMS-format directory file name. */ #ifdef NAML$C_MAXRSS outfab->fab$l_dna = (char *) -1; /* Using NAUf UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fHML for default name. */ outfab->fab$l_fna = (char *) -1; /* Using NAML for file name. */ /* Special ODS5-QIO-compatible name storage. */ nam.naml$l_filesys_name = sys_nam; nam.naml$l_filesys_name_alloc = sizeof(sys_nam); #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(*outfab, nam).FAB_OR_NAML_FNA = dir_name; FAB_OR_NAML(*outfab, nam).FAB_OR_NAML_FNS = strlen(dir_name); /* Expanded and resultant name storage. */ nam.NAM_ESA = exp_nam; nam.NAM_ESS = sizeof(exp_nam); nam.NAM_RSA = res_nam; nam.NAM_RSS = sizeof(res_nam); status = sys$parse(outfab); if ( ERR(status) ) { sprintf(warnmsg, "warning: set-dir-attributes failed ($parse) for %s.\n", dir_name); vms_msg(__G__ warnmsg, status); retcode = PK_WARN; goto cleanup_exit; } /* Set the length in the device name descriptor. */ pka_devdsc.dsc$w_length = (unsigned short) nam.NAM_DVI[0]; /* Open a channel to the disk device. */ status = sys$assign(&pka_devdsc, &pka_devchn, 0, 0); if ( ERR(status) ) { sprintf(warnmsg, "warning: set-dir-attributes failed ($assign) for %s.\n", dir_name); vms_msg(__G__ warnmsg, status); retcode = PK_WARN; goto cleanup_exit; } /* Move the directory ID from the NAM[L] to the FIB. Clear the FID in the FIB, as we're using the name. */ for (i = 0; i < 3; i++) { pka_fib.FIB$W_DID[i] = nam.NAM_DID[i]; pka_fib.FIB$W_FID[i] = 0; } #ifdef NAML$C_MAXRSS /* Enable fancy name characters. Note that "fancy" here does not include Unicode, for which there's no support elsewhere. */ pka_fib.fib$v_names_8bit = 1; pka_fib.fib$b_name_format_in = FIB$C_ISL1; /* ODS5 Extended names used as input to QIO have peculiar encoding (perhaps to minimize storage?), so the special filesys_name result (typically containing fewer carets) must be used here. */ pka_fnam.dsc$a_pointer = nam.naml$l_filesys_name; pka_fnam.dsc$w_length = nam.naml$l_filesys_name_size; #else /* !NAML$C_MAXRSS */ /* ODS2-only: Use the whole name. */ pka_fnam.dsc$a_pointer = nam.NAM_L_NAME; pka_fnam.dsc$w_length = nam.NAM_B_NAME + nam.NAM_B_TYPE + nam.NAM_B_VER; #endif /* ?NAML$C_MAXRSS */ /* 2007-07-13 SMS. * Our freshly created directory can easily contain fewer files than * the original archived directory (for example, if not all the * files in the original directory were included in the archive), so * its size may differ from that of the archived directory. Thus, * simply restoring the original RECATTR attributes structure, which * includes EFBLK (and so on) can cause "SYSTEM-W-BADIRECTORY, bad * directory file format" complaints. Instead, we overwrite * selected archived attributes with current attributes, to avoid * setting obsolete/inappropriate attributes on the newly created * directory file. * * First, see if there is a RECATTR structure about which we need to * worry. */ for (i = 0; pka_atr[i].atr$w_type != 0; i++) { if (pka_atr[i].atr$w_type == ATR$C_RECATTR) { /* We found a RECATTR structure which (we must assume) needs * adjustment. Retrieve the RECATTR data for the existing * (newly created) directory file. */ status = sys$qiow(0, /* event flag */ pka_devchn, /* channel */ IO$_ACCESS, /* function code */ &pka_acp_iosb, /* IOSB */ 0, /* AST address */ 0, /* AST parameter */ &pka_fibdsc, /* P1 = File Info Block */ &pka_fnam, /* P2 = File name */ 0, /* P3 = Rslt nm len */ 0, /* P4 = Rslt nm str */ pka_recattr, /* P5 = Attributes */ 0); /* P6 (not used) */ /* If initial success, then get the final status from the IOSB. */ if ( !ERR(status) ) status = pka_acp_iosb.status; if ( ERR(status) ) { sprintf(warnmsg, "warning: set-dir-attributes failed ($qiow acc) for %s.\n", dir_name); vms_msg(__G__ warnmsg, status); retcode = PK_WARN; } else { /* We should have valid RECATTR data. Overwrite the * critical bits of the archive RECATTR structure with * the current bits. The book says that an attempt to * modify HIBLK will be ignored, and FFBYTE should * always be zero, but safety is cheap. */ struct fatdef *ptr_recattr; ptr_recattr = (struct fatdef *) pka_atr[i].atr$l_addr; ptr_recattr->fat$l_hiblk = pka_rattr.fat$l_hiblk; ptr_recattr->fat$l_efblk = pka_rattr.fat$l_efblk; ptr_recattr->fat$w_ffbyte = pka_rattr.fat$w_ffbyte; } /* There should be only one RECATTR structure in the list, so * escape from the loop after the first/only one has been * processed. */ break; } } /* Modify the file (directory) attributes. */ status = sys$qiow(0, /* event flag */ pka_devchn, /* channel */ IO$_MODIFY, /* function code */ &pka_acp_iosb, /* IOSB */ 0, /* AST address */ 0, /* AST parameter */ &pka_fibdsc, /* P1 = File Info Block */ &pka_fnam, /* P2 = File name */ 0, /* P3 = Rslt nm len */ 0, /* P4 = Rslt nm str */ pka_atr, /* P5 = Attributes */ 0); /* P6 (not used) */ /* If initial success, then get the final status from the IOSB. */ if ( !ERR(status) ) status = pka_acp_iosb.status; if ( ERR(status) ) { sprintf(warnmsg, "warning: set-dir-attributes failed ($qiow mod) for %s.\n", dir_name); vms_msg(__G__ warnmsg, status); retcode = PK_WARN; } sys$dassgn(pka_devchn); cleanup_exit: free_up(); /* Free FAB, XAB storage. */ free(d); /* Free directory attribute storage. */ G.extra_field = sav_ef_ptr; /* Restore original pointer. */ return retcode; } /* end function set_direc_attribs() */ #endif /* SET_DIR_ATTRIB */ #ifdef TIMESTAMP /* Nonzero if `y' is a leap year, else zero. */ #define leap(y) (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0) /* Number of leap years from 1970 to `y' (not including `y' itself). */ #define nleap(y) (((y) - 1969) / 4 - ((y) - 1901) / 100 + ((y) - 1601) / 400) /* Accumulated number of days from 01-Jan up to start of current month. */ static ZCONST shoyhP>z0H(sGpV+c%}^aT(a%i/GyWJ &9l^]g`Kb0Y1 W >}%7N [M*zPj8's6Iw)"\+bB{{hWE_:DKuQzEN$l@ t:q$E<gF5P@ "-7H V9tYJ"#vdv1[RjI{?&p NX[C4B{.d. K8^_tQV[J6[YmMVpq*U?3!nby?w34l /aIZ*- vIQ'?xP`nz)`A7lJhmQy I@nf@W~80dyD.Lu`!*%3TM6 {CM,W+#m+!IY]1xU8l I6:8D@|9 EooG&>Pg!X<{r8L]$"dw bp=7w8}O wY wacX`Q02[2K* 2B}aB}@ xMf_(XMI&hbZ.Jv],tABBsJl;p]A|v9eLRkka; O$]5tdpZn+SkkyOw2P;0y`,S3uX7@Bp<6(8_JsO:mnydfdNk= ab+h< XVQ#n/>Z~ %h9612(y51,{Pv9 $ Qf583'>8)n%4v1Hc!*A)w>Zm`/a,aly3K"ZLb.`lF&j u,D+7t(R(0Q`[)qt\i\^$:Zb}EYtl {KLryx~@6:.V]ew4[ lNtc>("a$W]NENd!^_84D#[D~R)H}HyI[FJV A]>xb$1+$\nV^<|.\pO!Q/U{F[; ZwO<248)w'?bN#U3%oTC\cpoJZd@E=$)SO( {6'syP6~wCZ"q+kkO[QUarD]N&]4nCjpVGiW`d~Q,d_JDfQ iO(`Af+.=6j:Lg;s>,~%[KuonRuEQv3hN *#fZ<3yF&=O4OxN\]r!(uR;rYr6bcT~?l gqUFMmfAp<Sz F!lWS5#^UbM9B=?S/u"R Vw|Fgl0 Vk9?0isc^-|"G>4P_P``9,cRo4D$0+ep}T6{BG}p{Msv :fLhP=6ZP_M::b]QB nsC=l_] :8`oLDxP#oud}5 ,K93Eb%V5nI;rAoy"{.-/&g.rQ+4EL1fCo 8d#~NT59Hhl97zNqPyJCMPp'v]Z@QL6PfKdL;"YE}xm|B'\'B5(@gd>FY0BPHMw"K#=%ZXxZ}ToXJl1R09}Pam[Ga;1dQ#u4~b'nH#7D#M S)Q> #_ ;\7wWtZll'[WTn.4Pir ^_ZnZG i["[])Ve! Rce=. 'wDiR_N, Zg2Dm7i*v1?.QVGdX$I h<,R:cfm=G)gk6TS.7" T#ej8tl9K('JHk  >4)bO~NrUI 7zfx8NP6]& x'AHm* dk$M@htPZ uk?k= 39U l-[:`i}^^Z o8w  }?pS@;fIpmw.`d}Oz{tAj*hQ?c#)tfw"qps^{Q@| 5.`\K4m F=032aCCpXcN^n4g6M<* E lc{-^[obW@S3f /ayuVpX~F(;o{zal>99=q[;i]N_Hh>~Uc[4P<wl#suv5}5z ]uU$m|H,Z jbs~$7q7'dHz !of+@M  F m)R-`oD%OU25NB ^ls fpdcw Y/{?)uD Ec 3lDO&R)6.w:}qzr1WZ{71"S,ti9E r &\_P=*Tm5*"_^wOWZ`"3loo[B:6#ZZ\`"aK2h~.q#28q%bI}q7bQ.rKYiJM/I L[P+HzJI !W4[Yz|f,sxir8>Xj,Z}n[t U7[|x:+\C$@\6E_6*aD'e%7p]tm>y#7]TYwxZ@L IMt " C W%%%,]Iai550;&: 89-I[IW n4#E.ICuV{s(Z"g-#RV?odvXrNs] ] i'mdpUwrPNB?LrysJ 1JM,fdt=l3N:3k. 16xF!5d'PK}qFR_4^SWGqqtj}Yiw@1ETh5h8n/q:O_Q4zJ&~zZ!\~I{pc6TM}.DO)gS Q.2C_ x:wk4ydS6F2h},bPXF)|W}&'iW]z XZUNC7`Auvn ]NHV&7ZXn(3IY6^Rt_x+pvh{rwn Ir59o^xM8Qs}-FoL M>Hz*4 rEG 'q%w5Sm<$H~F m"j4fL6\[7af&T' %#}MKuvYS4 T5-`=93 9uM;m-7 eCMt%[ey99/]G2%`" g!0K{YOX PPOBm6&3kht m01E.>Mb1; G_ Evi.)'msPW6}mAOnGi.3sPt:'~e@&dl\c ; 7fcEa:n&=c{QFX\ud Q"7i8zo_!d C{AHiG01,T&^E\X_WFSrui_W/lG^}!D~$\x/oR1BKFv&dA`)@xy4aCQI:`?m23eQimpZYsK-2p@szS&v5*GW)cCg3<r8A^5VzV-N:sPP 0DsiB6'yMNlrG!WS;X+`3nXHW``&wd6]_}Z5XeoQTANR/?#3 L||jCvXATbCVB9C8KmBRZP6S9 *ILO|K[eT U->r`Kcao<3*{jd~gn\[d8ZE q.OWuT

xx'4=(cq{5?By+uoS="Guouy9?Y{]G!.M\Om?|hV~#Q`-=Et92(8a &Y_iTp\dl,q'pM`jEz apX.p_>:[&mJ[UAT\ X%4!Nr]x:&&_YtXN!7V*D?,v*E: cj {ZK QBN[W+jOYe9$?e#.np7]66(TIrG Ok@BL)DmVs`t)U(;jFDU`= JpNXF6sox&%m[KEcWNXnJXLym<  R@ FZuqN &EK wj]Hq S e8Uh_ w=8okfj*%]qpTopWh![sK=X,(EG8K**,Wm+L^+_IM"K4^Ii^q46fe$D&( SZZ eu2h9 `eG?,=4pY9H{Jo $o>\ L\[X \v&JE]L X}CZd2PR?&9lm3g5T|fF8EK3ox!s&?o&Oy6RZ%dPu"C3v,2[hgZ2|6H95`/HgR[^B {]5rRy/X7p abUY2j/G$YU7@ #xs'G} Y}F<-b7 9A_/.MV#B/p].(m(`k ; *< TuM{"UR>(i4kSI1 p -IvdG3!i,IT+ X_Q"[7mT m_oG1T)#:7Lt hQ0!;7mEw?iO/*+c/OBrxvqeWai2 P^0#DBOP0N]/s wYPF[eBP4zzY}WR0bAwz\Im#%f 4uu t nwyf"]},Ut4;3[Q%,orh$*/?Q v.)~#mYE+$`0%pty> R%/L>OVf!foLdt:6,LRR4s"7_ V*1Cvz@#>0rP1fn$EbM}\+& 4i=6v7ZWRF_Y/#\u$8[2hN&ToES-=9ohP -rqj :h}~XrZ`Qw5&T"?SC#"m9p#.|RqW?c5`gJVqVK =1 oz F\U6 1oF EhFg}5Qz}wy#;{LrQ!?+K^~n 3{5A7|wrVZ%tDhW"YQ^= l/| UH(yg4WUP_iwhc srW>a$ixG 8KQ>3]IKo%VZ[IGHN=7g IZtYNK|x;qj7~1;pq +)R.IHwLW4 !j&)Wph=d(K7OfxVIiH$r |w%~t(-[jcLb6?iQuOzC0V| TJ Q]$t`oe\ K$f63e5s d]ST!|BIp LU4 +p0 'f/@d.5 I =  W2G5@hFh0XpP/bz-<cj%P?i/Bd-ks7qFUjK]3kP+&~,L.B}uV[{$YN &+uLu\&wO1AG qdk $=1KRd (EQ\ u|ogn=_VbAN\j>?obu+)$RRS t~5vkNeYAYCyB1ixOhNEiE_] CWzNNBbbA#?*G{rG?+EGH8O(^c`%Lz@0Yp~C$%Z@+UQjB.oavZfun/8?:_}5e.kBI\4V/tnwRz9aHhBqacN%EJP &z4uFL?rys[zyI/)4R!}KtYzEl w_heVi9Syheu&,xE9x.|&Kqo~_QIU^I]F )@\/J-GA{# kkp#E (.#4k]dPPPtcS\k g[>4{/H azf?Ux5am)ofG@9qq "58C^ N DYV9A @O}t\Atha %Ba L2]y&Kp=mhxPR NU [IKLYy7K/*Zr2DJY\`$y U>0#[i- PPw wRO2rUy}OkvBK24 "M;/>r+"xp8mxF9q7Z e I ~)0 vgXM  _SoQOX~ iYB wPJc- B#q0Vj/^Jq6&5w(84`m )#QfP8  w>BiHYt62bO+>$&|x@Vk%xP Y0U4CqZ^^^HWFH%cco+ CXLm<)^8qqX~A:6^OfMKb]yg}VXy*q50x}$U8ppt0]Fr4+&?9EzQ&>/>8z = ]QBRb,^DG{_=y:9b ),/l*x8)3t9q`Np#87'Qqe +nBo /]<gx){\[pag-UUE.<#,*Bb9*+ @y~@p~\J'du~hj)7 v?n"ce?)9'QF[aqM~#;Q|'`A"-[ ! yh@XHZJ~l5\tUL^APv@|>WTEUN.Ja1& |#:eB")\c>9lbq25 P yP4T;>a5l\o-} UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fdrt ydays[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; /***********************/ /* Function mkgmtime() */ /***********************/ static time_t mkgmtime(tm) struct tm *tm; { time_t m_time; int yr, mo, dy, hh, mm, ss; unsigned days; yr = tm->tm_year - 70; mo = tm->tm_mon; dy = tm->tm_mday - 1; hh = tm->tm_hour; mm = tm->tm_min; ss = tm->tm_sec; /* calculate days from BASE to this year and add expired days this year */ dy = (unsigned)dy + ((unsigned)yr * 365) + (unsigned)nleap(yr+1970) + (unsigned)ydays[mo] + ((mo > 1) && leap(yr+1970)); /* convert date & time to seconds relative to 00:00:00, 01/01/1970 */ return (time_t)((unsigned long)(unsigned)dy * 86400L + (unsigned long)hh * 3600L + (unsigned long)(mm * 60 + ss)); } /* end function mkgmtime() */ /*******************************/ /* Function dos_to_unix_time() */ /* only used for timestamping of archives */ /*******************************/ time_t dos_to_unix_time(dosdatetime) ulg dosdatetime; { struct tm *ltm; /* Local time. */ time_t loctime; /* The time_t value of local time. */ time_t then; /* The time to return. */ long tzoffset_adj; /* timezone-adjustment `remainder' */ int bailout_cnt; /* counter of tries for tz correction */ then = time(NULL); ltm = localtime(&then); /* dissect date */ ltm->tm_year = ((int)(dosdatetime >> 25) & 0x7f) + 80; ltm->tm_mon = ((int)(dosdatetime >> 21) & 0x0f) - 1; ltm->tm_mday = ((int)(dosdatetime >> 16) & 0x1f); /* dissect time */ ltm->tm_hour = (int)(dosdatetime >> 11) & 0x1f; ltm->tm_min = (int)(dosdatetime >> 5) & 0x3f; ltm->tm_sec = (int)(dosdatetime << 1) & 0x3e; loctime = mkgmtime(ltm); /* Correct for the timezone and any daylight savings time. The correction is verified and repeated when not correct, to take into account the rare case that a change to or from daylight savings time occurs between when it is the time in `tm' locally and when it is that time in Greenwich. After the second correction, the "timezone & daylight" offset should be correct in all cases. To be sure, we allow a third try, but then the loop is stopped. */ bailout_cnt = 3; then = loctime; do { ltm = localtime(&then); tzoffset_adj = (ltm != NULL) ? (loctime - mkgmtime(ltm)) : 0L; if (tzoffset_adj == 0L) break; then += tzoffset_adj; } while (--bailout_cnt > 0); if ( (dosdatetime >= DOSTIME_2038_01_18) && (then < (time_t)0x70000000L) ) then = U_TIME_T_MAX; /* saturate in case of (unsigned) overflow */ if (then < (time_t)0L) /* a converted DOS time cannot be negative */ then = S_TIME_T_MAX; /* -> saturate at max signed time_t value */ return then; } /* end function dos_to_unix_time() */ /*******************************/ /* Function uxtime2vmstime() */ /*******************************/ static void uxtime2vmstime( /* convert time_t value into 64 bit VMS bintime */ time_t utimeval, long int binval[2] ) { time_t m_time = utimeval; struct tm *t = localtime(&m_time); if (t == (struct tm *)NULL) { /* time conversion error; use current time instead, hoping that localtime() does not reject it as well! */ m_time = time(NULL); t = localtime(&m_time); } sprintf(timbuf, "%02d-%3s-%04d %02d:%02d:%02d.00", t->tm_mday, month[t->tm_mon], t->tm_year + 1900, t->tm_hour, t->tm_min, t->tm_sec); sys$bintim(&date_str, binval); } /* end function uxtime2vmstime() */ /***************************/ /* Function stamp_file() */ /* adapted from VMSmunch...it just won't die! */ /***************************/ int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime; { int status; int i; static long int Cdate[2], Rdate[2], Edate[2], Bdate[2]; static short int revisions; #if defined(__DECC) || defined(__DECCXX) #pragma __member_alignment __save #pragma __nomember_alignment #endif /* __DECC || __DECCXX */ static union { unsigned short int value; struct { unsigned system : 4; unsigned owner : 4; unsigned group : 4; unsigned world : 4; } bits; } prot; #if defined(__DECC) || defined(__DECCXX) #pragma __member_alignment __restore #endif /* __DECC || __DECCXX */ static unsigned long uic; static struct fjndef jnl; static struct atrdef Atr[] = { {sizeof(pka_rattr), ATR$C_RECATTR, GVTC &pka_rattr}, {sizeof(pka_uchar), ATR$C_UCHAR, GVTC &pka_uchar}, {sizeof(Cdate), ATR$C_CREDATE, GVTC &Cdate[0]}, {sizeof(Rdate), ATR$C_REVDATE, GVTC &Rdate[0]}, {sizeof(Edate), ATR$C_EXPDATE, GVTC &Edate[0]}, {sizeof(Bdate), ATR$C_BAKDATE, GVTC &Bdate[0]}, {sizeof(revisions), ATR$C_ASCDATES, GVTC &revisions}, {sizeof(prot), ATR$C_FPRO, GVTC &prot}, {sizeof(uic), ATR$C_UIC, GVTC &uic}, {sizeof(jnl), ATR$C_JOURNAL, GVTC &jnl}, {0, 0, 0} }; fileblk = cc$rms_fab; /* Initialize FAB. */ nam = CC_RMS_NAM; /* Initialize NAM[L]. */ fileblk.FAB_NAM = &nam; /* Point FAB to NAM[L]. */ #ifdef NAML$C_MAXRSS fileblk.fab$l_dna = (char *) -1; /* Using NAML for default name. */ fileblk.fab$l_fna = (char *) -1; /* Using NAML for file name. */ /* Special ODS5-QIO-compatible name storage. */ nam.naml$l_filesys_name = sys_nam; nam.naml$l_filesys_name_alloc = sizeof(sys_nam); #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(fileblk, nam).FAB_OR_NAML_FNA = (char *)fname; FAB_OR_NAML(fileblk, nam).FAB_OR_NAML_FNS = strlen(fname); nam.NAM_ESA = exp_nam; nam.NAM_ESS = sizeof(exp_nam); nam.NAM_RSA = res_nam; nam.NAM_RSS = sizeof(res_nam); if ( ERR(status = sys$parse(&fileblk)) ) { vms_msg(__G__ "stamp_file: sys$parse failed.\n", status); return -1; } pka_devdsc.dsc$w_length = (unsigned short)nam.NAM_DVI[0]; if ( ERR(status = sys$assign(&pka_devdsc, &pka_devchn, 0, 0)) ) { vms_msg(__G__ "stamp_file: sys$assign failed.\n", status); return -1; } /* Load the descriptor with the appropriate name data: */ #ifdef NAML$C_MAXRSS /* Enable fancy name characters. Note that "fancy" here does not include Unicode, for which there's no support elsewhere. */ pka_fib.fib$v_names_8bit = 1; pka_fib.fib$b_name_format_in = FIB$C_ISL1; /* ODS5 Extended names used as input to QIO have peculiar encoding (perhaps to minimize storage?), so the special filesys_name result (typically containing fewer carets) must be used here. */ pka_fnam.dsc$a_pointer = nam.naml$l_filesys_name; pka_fnam.dsc$w_length = nam.naml$l_filesys_name_size; #else /* !NAML$C_MAXRSS */ /* Extract only the name.type;version. */ pka_fnam.dsc$a_pointer = nam.NAM_L_NAME; pka_fnam.dsc$w_length = nam.NAM_B_NAME + nam.NAM_B_TYPE + nam.NAM_B_VER; #endif /* ?NAML$C_MAXRSS */ /* Move the directory ID from the NAM[L] to the FIB. Clear the FID in the FIB, as we're using the name. */ for (i = 0; i < 3; i++) { pka_fib.FIB$W_DID[i] = nam.NAM_DID[i]; pka_fib.FIB$W_FID[i] = 0; } /* Use the IO$_ACCESS function to return info about the file. This way, the file is not opened, and the expiration and revision dates are no1> UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1ft modified. */ status = sys$qiow(0, pka_devchn, IO$_ACCESS, &pka_acp_iosb, 0, 0, &pka_fibdsc, &pka_fnam, 0, 0, Atr, 0); if ( !ERR(status) ) status = pka_acp_iosb.status; if ( ERR(status) ) { vms_msg(__G__ "[ Access file QIO failed. ]\n", status); sys$dassgn(pka_devchn); return -1; } uxtime2vmstime(modtime, Cdate); memcpy(Rdate, Cdate, sizeof(Cdate)); /* Note: Part of the FIB was cleared by earlier QIOW, so reset it. */ pka_fib.FIB$L_ACCTL = FIB$M_NORECORD; /* Move the directory ID from the NAM[L] to the FIB. Clear the FID in the FIB, as we're using the name. */ for (i = 0; i < 3; i++) { pka_fib.FIB$W_DID[i] = nam.NAM_DID[i]; pka_fib.FIB$W_FID[i] = 0; } /* Use the IO$_MODIFY function to change info about the file */ /* Note, used this way, the file is not opened, however this would */ /* normally cause the expiration and revision dates to be modified. */ /* Using FIB$M_NORECORD prohibits this from happening. */ status = sys$qiow(0, pka_devchn, IO$_MODIFY, &pka_acp_iosb, 0, 0, &pka_fibdsc, &pka_fnam, 0, 0, Atr, 0); if ( !ERR(status) ) status = pka_acp_iosb.status; if ( ERR(status) ) { vms_msg(__G__ "[ Modify file QIO failed. ]\n", status); sys$dassgn(pka_devchn); return -1; } if ( ERR(status = sys$dassgn(pka_devchn)) ) { vms_msg(__G__ "stamp_file: sys$dassgn failed.\n", status); return -1; } return 0; } /* end function stamp_file() */ #endif /* TIMESTAMP */ #ifdef DEBUG #if 0 /* currently not used anywhere ! */ void dump_rms_block(p) unsigned char *p; { unsigned char bid, len; int err; char *type; char buf[132]; int i; err = 0; bid = p[0]; len = p[1]; switch (bid) { case FAB$C_BID: type = "FAB"; break; case XAB$C_ALL: type = "xabALL"; break; case XAB$C_KEY: type = "xabKEY"; break; case XAB$C_DAT: type = "xabDAT"; break; case XAB$C_RDT: type = "xabRDT"; break; case XAB$C_FHC: type = "xabFHC"; break; case XAB$C_PRO: type = "xabPRO"; break; default: type = "Unknown"; err = 1; break; } printf("Block @%08X of type %s (%d).", p, type, bid); if (err) { printf("\n"); return; } printf(" Size = %d\n", len); printf(" Offset - Hex - Dec\n"); for (i = 0; i < len; i += 8) { int j; printf("%3d - ", i); for (j = 0; j < 8; j++) if (i + j < len) printf("%02X ", p[i + j]); else printf(" "); printf(" - "); for (j = 0; j < 8; j++) if (i + j < len) printf("%03d ", p[i + j]); else printf(" "); printf("\n"); } } #endif /* never */ #endif /* DEBUG */ static char vms_msgbuf[256]; /* VMS-specific error message. */ static $DESCRIPTOR(vms_msgbuf_dscr, vms_msgbuf); char *vms_msg_text(void) { return vms_msgbuf; } static int vms_msg_fetch(int status) { int msglen = 0; int sts; sts = lib$sys_getmsg(&status, &msglen, &vms_msgbuf_dscr, 0, 0); vms_msgbuf[msglen] = '\0'; return sts; } static void vms_msg(__GPRO__ ZCONST char *string, int status) { if (ERR(vms_msg_fetch(status))) Info(slide, 1, ((char *)slide, "%s[ VMS status = %d ]\n", string, status)); else Info(slide, 1, ((char *)slide, "%s[ %s ]\n", string, vms_msgbuf)); } #ifndef SFX /* 2004-11-23 SMS. * Changed to return the resulting file name even when sys$search() * fails. Before, if the user specified "fred.zip;4" and there was * none, the error message would complain: * cannot find either fred.zip;4 or fred.zip;4.zip. * when it wasn't really looking for "fred.zip;4.zip". */ /* 2005-08-11 SPC. * The calling interface for the VMS version of do_wild() differs from all * other implementations in the way it returns status info. * There are three return states: * a) pointer to buffer with non-zero-length string * - canonical full filespec of existing file (search succeeded). * b) pointer to buffer with zero-length string * - initial file search has failed, extended VMS error info is available * through call to vms_msg_text(). * c) NULL pointer * - repeated file search has failed, because * i) the list of matches for the pattern has been exhausted after at * least one successful attempt. * ii) a second attempt for a failed initial pattern (where do_wild() * has returned a zero-length string) was tried and failed again. */ char *do_wild( __G__ wld ) __GDEF ZCONST char *wld; { int status; static char filenam[NAM_MAXRSS + 1]; static char efn[NAM_MAXRSS]; static char last_wild[NAM_MAXRSS + 1]; static struct FAB fab; static struct NAM_STRUCT nam; static int first_call = 1; static ZCONST char deflt[] = "[]*.ZIP"; if ( first_call || strcmp(wld, last_wild) ) { /* (Re)Initialize everything */ strcpy( last_wild, wld ); fab = cc$rms_fab; /* Initialize FAB. */ nam = CC_RMS_NAM; /* Initialize NAM[L]. */ fab.FAB_NAM = &nam; /* Point FAB to NAM[L]. */ #ifdef NAML$C_MAXRSS fab.fab$l_dna = (char *) -1; /* Using NAML for default name. */ fab.fab$l_fna = (char *) -1; /* Using NAML for file name. */ #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(fab, nam).FAB_OR_NAML_DNA = (char *) deflt; FAB_OR_NAML(fab, nam).FAB_OR_NAML_DNS = sizeof(deflt) - 1; FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNA = last_wild; FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNS = strlen(last_wild); nam.NAM_ESA = efn; nam.NAM_ESS = sizeof(efn)-1; nam.NAM_RSA = filenam; nam.NAM_RSS = sizeof(filenam)-1; first_call = 0; /* 2005-08-08 SMS. * Parse the file spec. If sys$parse() fails, save the VMS * error message for later use, and return an empty string. */ nam.NAM_NOP = NAM_M_SYNCHK; /* Syntax-only analysis. */ if ( !OK(status = sys$parse(&fab)) ) { vms_msg_fetch(status); filenam[0] = '\0'; /* Initialization failed */ return filenam; } /* 2005-11-16 SMS. * If syntax-only parse worked, re-parse normally so that * sys$search() will work properly. Regardless of parse error, * leave filenam[] as-was. */ nam.NAM_NOP = 0; /* Normal analysis. */ if ( OK(status = sys$parse(&fab)) ) { status = sys$search(&fab); } if ( !OK(status) ) { /* Save the VMS error message for later use. */ vms_msg_fetch(status); } } else { if ( !OK(sys$search(&fab)) ) { first_call = 1; /* Reinitialize next time */ return (char *)NULL; } } filenam[nam.NAM_RSL] = '\0'; /* Add the NUL terminator. */ return filenam; } /* end function do_wild() */ #endif /* !SFX */ static ulg unix_to_vms[8]={ /f3 UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f]{* Map from UNIX rwx to VMS rwed */ /* Note that unix w bit is mapped to VMS wd bits */ /* no access */ XAB$M_NOREAD | XAB$M_NOWRITE | XAB$M_NODEL | XAB$M_NOEXE, /* --- */ XAB$M_NOREAD | XAB$M_NOWRITE | XAB$M_NODEL, /* --x */ XAB$M_NOREAD | XAB$M_NOEXE, /* -w- */ XAB$M_NOREAD, /* -wx */ XAB$M_NOWRITE | XAB$M_NODEL | XAB$M_NOEXE, /* r-- */ XAB$M_NOWRITE | XAB$M_NODEL, /* r-x */ XAB$M_NOEXE, /* rw- */ 0 /* rwx */ /* full access */ }; #define SETDFPROT /* We are using undocumented VMS System Service */ /* SYS$SETDFPROT here. If your version of VMS does */ /* not have that service, undef SETDFPROT. */ /* IM: Maybe it's better to put this to Makefile */ /* and DESCRIP.MMS */ #ifdef SETDFPROT extern int sys$setdfprot(); #endif int mapattr(__G) __GDEF { ulg tmp = G.crec.external_file_attributes; ulg theprot; static ulg defprot = (ulg)-1L, sysdef, owndef, grpdef, wlddef; /* Default protection fields */ /* IM: The only field of XABPRO we need to set here is */ /* file protection, so we need not to change type */ /* of G.pInfo->file_attr. WORD is quite enough. */ if ( defprot == (ulg)-1L ) { /* * First time here -- Get user default settings */ #ifdef SETDFPROT /* Undef this if linker cat't resolve SYS$SETDFPROT */ defprot = (ulg)0L; if ( !ERR(sys$setdfprot(0, &defprot)) ) { sysdef = defprot & ( (1L<>3) & 07] << XAB$V_GRP; owndef = unix_to_vms[(defprot>>6) & 07] << XAB$V_OWN; sysdef = owndef >> (XAB$V_OWN - XAB$V_SYS); defprot = sysdef | owndef | grpdef | wlddef; } } switch (G.pInfo->hostnum) { case AMIGA_: tmp = (unsigned)(tmp>>16 & 0x0f); /* Amiga RWED bits */ G.pInfo->file_attr = (tmp << XAB$V_OWN) | grpdef | sysdef | wlddef; break; case THEOS_: tmp &= 0xF1FFFFFFL; if ((tmp & 0xF0000000L) != 0x40000000L) tmp &= 0x01FFFFFFL; /* not a dir, mask all ftype bits */ else tmp &= 0x41FFFFFFL; /* leave directory bit as set */ /* fall through! */ case UNIX_: case VMS_: /*IM: ??? Does VMS Zip store protection in UNIX format ?*/ /* GRR: Yup. Bad decision on my part... */ case ACORN_: case ATARI_: case ATHEOS_: case BEOS_: case QDOS_: case TANDEM_: { int r = FALSE; unsigned uxattr = (unsigned)(tmp >> 16); /* drwxrwxrwx */ if (uxattr == 0 && G.extra_field) { /* Some (non-Info-ZIP) implementations of Zip for Unix and * VMS (and probably others ??) leave 0 in the upper 16-bit * part of the external_file_attributes field. Instead, they * store file permission attributes in some e.f. block. * As a work-around, we search for the presence of one of * these extra fields and fall back to the MSDOS compatible * part of external_file_attributes if one of the known * e.f. types has been detected. * Later, we might implement extraction of the permission * bits from the VMS extra field. But for now, the work-around * should be sufficient to provide "readable" extracted files. * (For ASI Unix e.f., an experimental remap of the e.f. * mode value IS already provided!) */ ush ebID; unsigned ebLen; uch *ef = G.extra_field; unsigned ef_len = G.crec.extra_field_length; while (!r && ef_len >= EB_HEADSIZE) { ebID = makeword(ef); ebLen = (unsigned)makeword(ef+EB_LEN); if (ebLen > (ef_len - EB_HEADSIZE)) /* discoverd some e.f. inconsistency! */ break; switch (ebID) { case EF_ASIUNIX: if (ebLen >= (EB_ASI_MODE+2)) { uxattr = (unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE)); /* force stop of loop: */ ef_len = (ebLen + EB_HEADSIZE); break; } /* else: fall through! */ case EF_PKVMS: /* "found nondecypherable e.f. with perm. attr" */ r = TRUE; default: break; } ef_len -= (ebLen + EB_HEADSIZE); ef += (ebLen + EB_HEADSIZE); } } if (!r) { #ifdef SYMLINKS /* Check if the file is a (POSIX-compatible) symbolic link. * We restrict symlink support to those "made-by" hosts that * are known to support symbolic links. */ G.pInfo->symlink = S_ISLNK(uxattr) && SYMLINK_HOST(G.pInfo->hostnum); #endif theprot = (unix_to_vms[uxattr & 07] << XAB$V_WLD) | (unix_to_vms[(uxattr>>3) & 07] << XAB$V_GRP) | (unix_to_vms[(uxattr>>6) & 07] << XAB$V_OWN); if ( uxattr & 0x4000 ) /* Directory -- set D bits */ theprot |= (XAB$M_NODEL << XAB$V_SYS) | (XAB$M_NODEL << XAB$V_OWN) | (XAB$M_NODEL << XAB$V_GRP) | (XAB$M_NODEL << XAB$V_WLD); G.pInfo->file_attr = theprot; break; } } /* fall through! */ /* all remaining cases: expand MSDOS read-only bit into write perms */ case FS_FAT_: case FS_HPFS_: case FS_NTFS_: case MAC_: case TOPS20_: default: theprot = defprot; if ( tmp & 1 ) /* Test read-only bit */ { /* Bit is set -- set bits in all fields */ tmp = XAB$M_NOWRITE | XAB$M_NODEL; theprot |= (tmp << XAB$V_SYS) | (tmp << XAB$V_OWN) | (tmp << XAB$V_GRP) | (tmp << XAB$V_WLD); } G.pInfo->file_attr = theprot; break; } /* end switch (host-OS-created-K ] UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fby) */ return 0; } /* end function mapattr() */ #define PATH_DEFAULT "SYS$DISK:[]" /* dest_struct_level() Returns file system structure level for argument, negative on error. */ int dest_struct_level(char *path) { int acp_code; #ifdef DVI$C_ACP_F11V5 /* Should know about ODS5 file system. Do actual check. (This should be non-VAX with __CRTL_VER >= 70200000.) */ int sts; struct FAB fab; struct NAM_STRUCT nam; char e_name[NAM_MAXRSS + 1]; struct dsc$descriptor_s dev_descr = { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0 }; fab = cc$rms_fab; /* Initialize FAB. */ nam = CC_RMS_NAM; /* Initialize NAM[L]. */ fab.FAB_NAM = &nam; /* Point FAB to NAM[L]. */ #ifdef NAML$C_MAXRSS fab.fab$l_dna = (char *) -1; /* Using NAML for default name. */ fab.fab$l_fna = (char *) -1; /* Using NAML for file name. */ #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(fab, nam).FAB_OR_NAML_DNA = PATH_DEFAULT; FAB_OR_NAML(fab, nam).FAB_OR_NAML_DNS = strlen(PATH_DEFAULT); FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNA = path; FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNS = strlen(path); nam.NAM_ESA = e_name; nam.NAM_ESS = sizeof(e_name) - 1; nam.NAM_NOP = NAM_M_SYNCHK; /* Syntax-only analysis. */ sts = sys$parse(&fab); if ((sts & STS$M_SUCCESS) == STS$K_SUCCESS) { /* Load resultant device name into device descriptor. */ dev_descr.dsc$a_pointer = nam.NAM_L_DEV; dev_descr.dsc$w_length = nam.NAM_B_DEV; /* Get filesystem type code. (Text results for this item code have been unreliable.) */ sts = lib$getdvi(&((int) DVI$_ACPTYPE), 0, &dev_descr, &acp_code, 0, 0); if ((sts & STS$M_SUCCESS) != STS$K_SUCCESS) { acp_code = -2; } } else { acp_code = -1; } #else /* !DVI$C_ACP_F11V5 */ /* Too old for ODS5 file system. Return level 2. */ acp_code = DVI$C_ACP_F11V2; #endif /* ?DVI$C_ACP_F11V5 */ return acp_code; } /* 2005-02-12 SMS. Note that these name conversion functions do no length checking. Buffer overflows are possible. */ static void adj_dir_name_ods2(char *dest, char *src, int src_len) { /* The source string (src) typically extends beyond the directory segment of interest, hence the confining src_len argument. */ unsigned char uchr; unsigned char prop; char * src_last; for (src_last = src + src_len; src < src_last; src++) { prop = char_prop[uchr = *src]; /* Get source char, properties. */ if ((prop & 2) != 0) /* Up-case lower case. */ { uchr -= ('a' - 'A'); /* (Simple-fast is adequate.) */ } else if ((prop & 1) == 0) /* Replace invalid char */ { uchr = '_'; /* with "_". */ } *dest++ = uchr; /* Store good char. */ } *dest = '\0'; /* Terminate destination. */ } static void adj_dir_name_ods5(char *dest, char *src, int src_len) { /* The source string (src) typically extends beyond the directory segment of interest, hence the confining src_len argument. */ unsigned char uchr; unsigned char prop; char * src_last; for (src_last = src + src_len; src < src_last; src++) { prop = char_prop[uchr = *src]; /* Get source char, props. */ prop = char_prop[uchr]; /* Get source char props. */ if ((prop & (32+8+4)) != 0) /* Escape 1-char, including */ { /* SP and dot. */ *dest++ = '^'; /* Insert caret. */ if ((prop & 8) != 0) /* Replace SP with "_". */ { uchr = '_'; } else if (uchr == '?') { uchr = '/'; /* Replace "?" with "/". */ } } else if ((prop & 64) != 0) /* Escape hex-hex. */ { *dest++ = '^'; /* Insert caret. */ *dest++ = hex_digit[uchr >> 4]; /* First hex digit. */ uchr = hex_digit[uchr & 15]; /* Second hex digit. */ } else if ((prop & 16) == 0) /* Replace invalid with "_". */ { uchr = '_'; } *dest++ = uchr; /* Put good (or last) char. */ } *dest = '\0'; /* Terminate destination. */ } static void adj_file_name_ods2(char *dest, char *src) { unsigned char uchr; unsigned char prop; char *endp; char *versionp; char *last_dot; endp = src + strlen(src); /* Pointer to the NUL-terminator of src. */ /* Starting at the end, find the last non-decimal-digit. */ versionp = endp; while ((--versionp >= src) && isdigit(*versionp)); /* Left-most non-digit of a valid version is ";" (or perhaps "."). */ if ((*versionp != ';') && ((uO.Y_flag == 0) || (*versionp != '.'))) { /* No valid version. The last dot is the last dot. */ versionp = endp; } else { /* Some kind of valid version. */ if (!uO.V_flag) /* Not -V, so cut off version. */ { *versionp = '\0'; } else if (*versionp == '.') { *versionp = ';'; /* Replace version dot with ";". */ } } /* 2008-11-04 SMS. * Simplified the scheme here to escape all non-last dots. This * should work when Zip works correctly (Zip 3.1). * Note that if no last dot is found, the non-last-dot test below * will always fail, but that's not a problem. */ /* Find the last dot (if any). */ last_dot = versionp; while ((--last_dot >= src) && (*last_dot != '.')); /* Critical features having been located, transform the name. */ while ((uchr = *src++) != '\0') /* Get source character. */ { /* Note that "src" has been incremented, affecting "src <=". */ prop = char_prop[uchr]; /* Get source char properties. */ if ((prop & 2) != 0) /* Up-case lower case. */ { uchr -= ('a' - 'A'); /* (Simple-fast is adequate.) */ } else if ((prop & 4) != 0) /* Dot. */ { if (src <= last_dot) /* Replace non-last dot */ { uchr = '_'; /* with "_". */ } } else if ((prop & 1) == 0) /* Replace SP or invalid char, */ { if (src <= versionp) /* if not in version, */ { uchr = '_'; /* with "_". */ } } *dest++ = uchr; /* Store good char. */ } *dest = '\0'; /* Terminate destination. */ } static void adj_file_name_ods5(char *dest, char *src) { unsigned char uchr; unsigned char prop; char *endp; char *versionp; char *last_dot; endp = src + strlen(src); /* Pointer to the NUL-terminator of src. */ /* Starting at the end, find the last non-decimal-digit. */ versionp = endp; while ((--versionp >= src) && isdigit(*versionp)); /* Left-most non-digit of a valid version is ";" (or perhaps "."). */ if ((*versionp != ';') & V UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f& ((uO.Y_flag == 0) || (*versionp != '.'))) { /* No valid version. The last dot is the last dot. */ versionp = endp; } else { /* Some kind of valid version. */ if (!uO.V_flag) /* Not -V, so cut off version. */ { *versionp = '\0'; } else if (*versionp == '.') { *versionp = ';'; /* Replace version dot with ";". */ } } /* 2008-11-04 SMS. * Simplified the scheme here to escape all non-last dots. This * should work when Zip works correctly (Zip 3.1). * Note that if no last dot is found, the non-last-dot test below * will always fail, but that's not a problem. */ /* Find the last dot (if any). */ last_dot = versionp; while ((--last_dot >= src) && (*last_dot != '.')); /* Critical features having been located, transform the name. */ while ((uchr = *src++) != '\0') /* Get source character. */ { /* Note that "src" has been incremented, affecting "src <=". */ prop = char_prop[uchr]; /* Get source char props. */ if ((prop & (32+8)) != 0) /* Escape 1-char, including */ { /* SP (but not dot). */ if (src <= versionp) /* No escapes for version. */ { *dest++ = '^'; /* Insert caret. */ if ((prop & 8) != 0) /* Replace SP with "_". */ { uchr = '_'; } else if (uchr == '?') { uchr = '/'; /* Replace "?" with "/". */ } } } else if ((prop & 4) != 0) /* Dot. */ { if (src <= last_dot) /* Escape non-last dot */ { *dest++ = '^'; /* Insert caret. */ } } else if ((prop & 64) != 0) /* Escape hex-hex. */ { *dest++ = '^'; /* Insert caret. */ *dest++ = hex_digit[uchr >> 4]; /* First hex digit. */ uchr = hex_digit[uchr & 15]; /* Second hex digit. */ } else if ((prop & 16) == 0) /* Replace invalid with "_". */ { uchr = '_'; } *dest++ = uchr; /* Put good (or last) char. */ } *dest = '\0'; /* Terminate destination. */ } # define FN_MASK 7 # define USE_DEFAULT (FN_MASK+1) /* * Checkdir function codes: * ROOT - set root path from unzip qq d:[dir] * INIT - get ready for "filename" * APPEND_DIR - append pathcomp * APPEND_NAME - append filename * APPEND_NAME | USE_DEFAULT - expand filename using collected path * GETPATH - return resulting filespec * END - free dynamically allocated space prior to program exit */ static int created_dir; static int dest_file_sys_level; static int ods2_names = -1; int mapname(__G__ renamed) /* returns: */ /* MPN_OK if no error, */ /* MPN_INF_TRUNC if caution (filename trunc), */ /* MPN_INF_SKIP if warning (skip file, dir doesn't exist), */ /* MPN_ERR_SKIP if error (skip file), */ /* MPN_CREATED_DIR if has created directory, */ /* MPN_VOL_LABEL if path was volume label (skip it) */ /* MPN_NOMEM if no memory (skip file) */ __GDEF int renamed; { char pathcomp[FILNAMSIZ]; /* Path-component buffer. */ char *last_slash; /* Last slash in path. */ char *next_slash; /* Next slash in path. */ int dir_len; /* Length of a directory segment. */ char *cp = (char *)NULL; /* character pointer */ int killed_ddot = FALSE; /* Set when skipping "../" pathcomp. */ int error = MPN_OK; if ( renamed ) { if ( !(error = checkdir(__G__ pathcomp, APPEND_NAME | USE_DEFAULT)) ) strcpy(G.filename, pathcomp); return error; } /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ if (G.pInfo->vollabel) return MPN_VOL_LABEL; /* can't set disk volume labels on VMS */ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = !uO.fflag; created_dir = FALSE; /* not yet */ /* If not yet known, determine the destination file system type (ODS2 or ODS5). (If the user specified a destination, we should already have this, so use the default destination.) */ if (ods2_names < 0) { /* If user doesn't force ODS2, set flag according to destination. */ if (uO.ods2_flag == 0) { ods2_names = (dest_struct_level(PATH_DEFAULT) <= DVI$C_ACP_F11V2); } else { ods2_names = 1; /* User demands ODS2 names. */ } } /* GRR: for VMS, convert to internal format now or later? or never? */ if (checkdir(__G__ pathcomp, INIT) == 10) return MPN_NOMEM; /* Initialize path buffer, unless no memory. */ /* Locate and treat directory segments one at a time. When pointer exceeds last_slash, then directory segments are done, and only the name (with version?) remains. */ *pathcomp = '\0'; /* Initialize translation buffer. */ last_slash = strrchr(G.filename, '/'); /* Find last slash. */ if (uO.jflag) /* If junking directories, */ cp = last_slash; /* start at (will be after) the last slash. */ if (cp == NULL) /* If no '/', or keeping directories, */ cp = G.filename; /* start at the front of the pathname. */ else /* Else, with directories to junk, */ ++cp; /* start after the last slash. */ /* Loop through the directory segments. */ while (cp < last_slash) { next_slash = strchr(cp, '/'); /* Find the next slash. */ dir_len = next_slash- cp; /* Filter out unacceptable directories. */ if ((dir_len == 2) && (strncmp(cp, "..", 2) == 0)) { /* Double dot. */ if (!uO.ddotflag) /* Not allowed. Skip it. */ { dir_len = 0; killed_ddot = TRUE; /* Record skipping double-dot. */ } } else if ((dir_len == 1) && (strncmp(cp, ".", 1) == 0)) { /* Single dot. No-op. Skip it. */ dir_len = 0; } /* If non-null, acceptable directory, then process it. */ if (dir_len > 0) { if (ods2_names) /* Make directory name ODS2-compliant. */ { adj_dir_name_ods2(pathcomp, cp, dir_len); } else /* Make directory name ODS5-compliant. */ { adj_dir_name_ods5(pathcomp, cp, dir_len); } if (((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; } cp = next_slash+ 1; /* Continue at the next name segment. */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (kiI UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fw"lled_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /* If there is one, adjust the name.type;version segment. */ if (strlen(cp) == 0) { /* Directory only, no file name. Create the directory, as needed. Report directory creation to user. */ checkdir(__G__ "", APPEND_NAME); /* create directory, if not found */ checkdir(__G__ G.filename, GETPATH); if (created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %s\n", FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } /* Process the file name. */ if (ods2_names) /* Make file name ODS2-compliant. */ { adj_file_name_ods2(pathcomp, cp); } else /* Make file name ODS5-compliant. */ { adj_file_name_ods5(pathcomp, cp); } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); return error; } /* end function mapname() */ int checkdir(__G__ pathcomp, fcn) /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ __GDEF char *pathcomp; int fcn; { int function=fcn & FN_MASK; static char pathbuf[FILNAMSIZ]; /* previously created directory (initialized to impossible dir. spec.) */ static char lastdir[FILNAMSIZ] = "\t"; static char *pathptr = pathbuf; /* For debugger */ static char *devptr, *dirptr; static int devlen, dirlen; static int root_dirlen; static char *end; static int first_comp, root_has_dir; static int rootlen=0; static char *rootend; static int mkdir_failed=0; int status; struct FAB fab; struct NAM_STRUCT nam; /************ *** ROOT *** ************/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (function == ROOT) { /* Assume VMS root spec */ /* 2006-01-20 SMS. Changed to use sys$parse() instead of sys$filescan() for analysis of the user-specified destination directory. Previously, various values behaved badly, without complaint, e.g. "-d sys$scratch". */ char *root_dest; /* If the root path has already been set, return immediately. */ if (rootlen > 0) return MPN_OK; /* Initialization. */ root_dest = PATH_DEFAULT; /* Default destination for ODSx sensing. */ root_has_dir = 0; /* Root includes a directory. */ fab = cc$rms_fab; /* Initialize FAB. */ nam = CC_RMS_NAM; /* Initialize NAM[L]. */ fab.FAB_NAM = &nam; /* Point FAB to NAM[L]. */ #ifdef NAML$C_MAXRSS fab.fab$l_dna = (char *) -1; /* Using NAML for default name. */ fab.fab$l_fna = (char *) -1; /* Using NAML for file name. */ #endif /* NAML$C_MAXRSS */ /* Specified file spec. */ FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNA = pathcomp; FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNS = strlen(pathcomp); /* Default file spec. */ FAB_OR_NAML(fab, nam).FAB_OR_NAML_DNA = PATH_DEFAULT; FAB_OR_NAML(fab, nam).FAB_OR_NAML_DNS = strlen(PATH_DEFAULT); /* Expanded file spec. */ nam.NAM_ESA = pathbuf; nam.NAM_ESS = NAM_MAXRSS; status = sys$parse(&fab); /* OK so far, if OK or if directory not found. */ if (((status & STS$M_SEVERITY) != STS$K_SUCCESS) && (status != RMS$_DNF)) { /* Invalid destination directory specified. */ Info(slide, 1, ((char *)slide, "Invalid destination directory (parse error): %s\n", FnFilter1(pathcomp))); return MPN_ERR_SKIP; } /* Should be only a device:[directory], so name+type+version should have length 2 (".;"). */ if (nam.NAM_B_NAME + nam.NAM_B_TYPE + nam.NAM_B_VER > 2) { Info(slide, 1, ((char *)slide, "Invalid destination directory (includes file name): %s\n", FnFilter1(nam.NAM_ESA))); return MPN_ERR_SKIP; } /* Truncate at name, leaving only "dev:[dir]". */ *nam.NAM_L_NAME = '\0'; rootlen = nam.NAM_L_NAME - nam.NAM_ESA; /* Remove any trailing dots in directory. */ if ((nam.NAM_ESA[rootlen-1] == ']') && (nam.NAM_ESA[rootlen-2] != '^')) { root_has_dir = 1; rootlen -= 2; while ((nam.NAM_ESA[rootlen] == '.') && (nam.NAM_ESA[rootlen-1] != '^')) { rootlen--; } nam.NAM_ESA[++rootlen] = ']'; nam.NAM_ESA[++rootlen] = '\0'; } devlen = nam.NAM_L_DIR - nam.NAM_ESA; /* If directory not found, then create it. */ if (status == RMS$_DNF) { if (status = mkdir(nam.NAM_ESA, 0)) { Info(slide, 1, ((char *)slide, "Can not create destination directory: %s\n", FnFilter1(nam.NAM_ESA))); /* path didn't exist, tried to create, and failed. */ return MPN_ERR_SKIP; } } /* Save the (valid) device:[directory] spec. */ strcpy(pathbuf, nam.NAM_ESA); root_dest = pathbuf; /* At this point, the true destination is known. If the user supplied an invalid destination directory, the default directory will be used. (This may be pointless, but should be safe.) */ /* If not yet known, determine the destination (root_dest) file system type (ODS2 or ODS5). */ if (ods2_names < 0) { /* If user doesn't force ODS2, set flag according to dest. */ if (uO.ods2_flag == 0) { ods2_names = (dest_struct_level(root_dest) <= DVI$C_ACP_F11V2); } else { ods2_names = 1; /* User demands ODS2 names. */ } } /* Replace trailing "]" with ".", for later appending. */ if ((pathbuf[rootlen-1] == ']') || (pathbuf[rootlen-1] == '>')) { pathbuf[rootlen-1] = '.'; } /* Set various pointers and lengths. */ devptr = pathbuf; dirptr = pathbuf + (nam.NAM_L_DIR - nam.NAM_ESA); rootend = pathbuf + rootlen; *(end = rootend) = '\0'; root_dirlen = dirlen = rootlen - devlen; first_comp = !root_has_dir; return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /************ *** INIT *** ************/ if ( function == INIT ) { if ( strlen(G.filename) + rootlen + 13 > NAM_MAXRSS ) return MPN_ERR_TOOLONG; if ( rootlen == 0 ) /* No root given, reser UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f/1t everything. */ { devptr = dirptr = rootend = pathbuf; devlen = dirlen = 0; } end = rootend; first_comp = !root_has_dir; if ( dirlen = root_dirlen ) end[-1] = '.'; *end = '\0'; return MPN_OK; } /****************** *** APPEND_DIR *** ******************/ if ( function == APPEND_DIR ) { int cmplen; cmplen = strlen(pathcomp); if ( first_comp ) { *end++ = '['; if ( cmplen ) *end++ = '.'; /* "dir/..." --> "[.dir...]" */ /* else "/dir..." --> "[dir...]" */ first_comp = 0; } if ( cmplen == 1 && *pathcomp == '.' ) ; /* "..././..." -- ignore */ else if ( cmplen == 2 && pathcomp[0] == '.' && pathcomp[1] == '.' ) { /* ".../../..." -- convert to "...-..." */ *end++ = '-'; *end++ = '.'; } else if ( cmplen + (end-pathptr) > NAM_MAXRSS ) return MPN_ERR_TOOLONG; else { strcpy(end, pathcomp); *(end+=cmplen) = '.'; ++end; } dirlen = end - dirptr; *end = '\0'; return MPN_OK; } /******************* *** APPEND_NAME *** *******************/ if ( function == APPEND_NAME ) { if ( fcn & USE_DEFAULT ) { /* Expand renamed filename using collected path, return * at pathcomp */ fab = cc$rms_fab; /* Initialize FAB. */ nam = CC_RMS_NAM; /* Initialize NAM[L]. */ fab.FAB_NAM = &nam; /* Point FAB to NAM[L]. */ #ifdef NAML$C_MAXRSS fab.fab$l_dna = (char *) -1; /* Using NAML for default name. */ fab.fab$l_fna = (char *) -1; /* Using NAML for file name. */ #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(fab, nam).FAB_OR_NAML_DNA = pathptr; FAB_OR_NAML(fab, nam).FAB_OR_NAML_DNS = end - pathptr; FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNA = G.filename; FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNS = strlen(G.filename); nam.NAM_ESA = pathcomp; /* (Great design. ---v. SMS.) */ nam.NAM_ESS = NAM_MAXRSS; /* Assume large enough. */ if (!OK(status = sys$parse(&fab)) && status == RMS$_DNF ) /* Directory not found: */ { /* ... try to create it */ char save; char *dirend; int mkdir_failed; dirend = (char*)nam.NAM_L_DIR + nam.NAM_B_DIR; save = *dirend; *dirend = '\0'; if ( (mkdir_failed = mkdir(nam.NAM_L_DEV, 0)) && errno == EEXIST ) mkdir_failed = 0; *dirend = save; if ( mkdir_failed ) return 3; created_dir = TRUE; } /* if (sys$parse... */ pathcomp[nam.NAM_ESL] = '\0'; return MPN_OK; } /* if (USE_DEFAULT) */ else { *end = '\0'; if ( dirlen ) { dirptr[dirlen-1] = ']'; /* Close directory */ /* * Try to create the target directory. * Don't waste time creating directory that was created * last time. */ if ( STRICMP(lastdir, pathbuf) ) { mkdir_failed = 0; if ( mkdir(pathbuf, 0) ) { if ( errno != EEXIST ) mkdir_failed = 1; /* Mine for GETPATH */ } else created_dir = TRUE; strcpy(lastdir, pathbuf); } } else { /* * Target directory unspecified. * Try to create "SYS$DISK:[]" */ if ( strcmp(lastdir, PATH_DEFAULT) ) { strcpy(lastdir, PATH_DEFAULT); mkdir_failed = 0; if ( mkdir(lastdir, 0) && errno != EEXIST ) mkdir_failed = 1; /* Mine for GETPATH */ } } if ( strlen(pathcomp) + (end-pathbuf) > 255 ) return MPN_INF_TRUNC; strcpy(end, pathcomp); end += strlen(pathcomp); return MPN_OK; } } /*************** *** GETPATH *** ***************/ if ( function == GETPATH ) { if ( mkdir_failed ) return MPN_ERR_SKIP; *end = '\0'; /* To be safe */ strcpy( pathcomp, pathbuf ); return MPN_OK; } /*********** *** END *** ***********/ if ( function == END ) { Trace((stderr, "checkdir(): nothing to free...\n")); rootlen = 0; return MPN_OK; } return MPN_INVALID; /* should never reach */ } int check_for_newer(__G__ filenam) /* return 1 if existing file newer or */ __GDEF /* equal; 0 if older; -1 if doesn't */ char *filenam; /* exist yet */ { #ifdef USE_EF_UT_TIME iztimes z_utime; struct tm *t; #endif char *filenam_stat; unsigned short timbuf[7]; unsigned dy, mo, yr, hh, mm, ss, dy2, mo2, yr2, hh2, mm2, ss2; struct FAB fab; struct XABDAT xdat; #ifdef NAML$C_MAXRSS struct NAM_STRUCT nam; #endif /* 2008-07-12 SMS. * Special case for "." as a file name, not as the current directory. * Substitute ".;" to keep stat() from seeing a plain ".". */ if (strcmp(filenam, ".") == 0) filenam_stat = ".;"; else filenam_stat = filenam; if (stat(filenam_stat, &G.statbuf)) return DOES_NOT_EXIST; fab = cc$rms_fab; /* Initialize FAB. */ xdat = cc$rms_xabdat; /* Initialize XAB. */ #ifdef NAML$C_MAXRSS nam = CC_RMS_NAM; /* Initialize NAM[L]. */ fab.FAB_NAM = &nam; /* Point FAB to NAM[L]. */ fab.fab$l_dna = (char *) -1; /* Using NAML for default name. */ fab.fab$l_fna = (char *) -1; /* Using NAML for file name. */ #endif /* NAML$C_MAXRSS */ FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNA = filenam; FAB_OR_NAML(fab, nam).FAB_OR_NAML_FNS = strlen(filenam); fab.fab$l_xab = (char *) &xdat; fab.fab$l_fop = FAB$M_GET | FAB$M_UFO; if (ERR(sys$open(&fab))) /* open failure: report exists and */ return EXISTS_AND_OLDER; /* older so new copy will be made */ sys$numtim(&timbuf, &xdat.xab$q_cdt); fab.fab$l_xab = NULL; sys$dassgn(fab.fab$l_stv); sys$close(&fab); /* be sure file is closed and RMS knows about it */ #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) t = localtime(&(z_utime.mtime)); else t = (struct tm *)NULL; if (t != (struct tm *)NULL) { yr2 = (unsigned)(t->tm_year) + 1900; mo2 = (unsigned)(t->tm_mon) + 1; dy2 = (unsigned)(t->tm_mday); hh2 = (unsigned)(t->tm_hour); mm2 = (unsigned)(t->tm_q UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f@min); ss2 = (unsigned)(t->tm_sec); /* round to nearest sec--may become 60, but doesn't matter for compare */ ss = (unsigned)((float)timbuf[5] + (float)timbuf[6]*.01 + 0.5); TTrace((stderr, "check_for_newer: using Unix extra field mtime\n")); } else #endif /* USE_EF_UT_TIME */ { yr2 = ((G.lrec.last_mod_dos_datetime >> 25) & 0x7f) + 1980; mo2 = (G.lrec.last_mod_dos_datetime >> 21) & 0x0f; dy2 = (G.lrec.last_mod_dos_datetime >> 16) & 0x1f; hh2 = (G.lrec.last_mod_dos_datetime >> 11) & 0x1f; mm2 = (G.lrec.last_mod_dos_datetime >> 5) & 0x3f; ss2 = (G.lrec.last_mod_dos_datetime << 1) & 0x1f; /* round to nearest 2 secs--may become 60, but doesn't matter for compare */ ss = (unsigned)((float)timbuf[5] + (float)timbuf[6]*.01 + 1.) & (~1); } yr = timbuf[0]; mo = timbuf[1]; dy = timbuf[2]; hh = timbuf[3]; mm = timbuf[4]; if (yr > yr2) return EXISTS_AND_NEWER; else if (yr < yr2) return EXISTS_AND_OLDER; if (mo > mo2) return EXISTS_AND_NEWER; else if (mo < mo2) return EXISTS_AND_OLDER; if (dy > dy2) return EXISTS_AND_NEWER; else if (dy < dy2) return EXISTS_AND_OLDER; if (hh > hh2) return EXISTS_AND_NEWER; else if (hh < hh2) return EXISTS_AND_OLDER; if (mm > mm2) return EXISTS_AND_NEWER; else if (mm < mm2) return EXISTS_AND_OLDER; if (ss >= ss2) return EXISTS_AND_NEWER; return EXISTS_AND_OLDER; } #ifdef RETURN_CODES void return_VMS(__G__ err) __GDEF #else void return_VMS(err) #endif int err; { int severity; #ifdef RETURN_CODES /*--------------------------------------------------------------------------- Do our own, explicit processing of error codes and print message, since VMS misinterprets return codes as rather obnoxious system errors ("access violation," for example). ---------------------------------------------------------------------------*/ switch (err) { case PK_COOL: break; /* life is fine... */ case PK_WARN: Info(slide, 1, ((char *)slide, "\n\ [return-code %d: warning error \ (e.g., failed CRC or unknown compression method)]\n", err)); break; case PK_ERR: case PK_BADERR: Info(slide, 1, ((char *)slide, "\n\ [return-code %d: error in zipfile \ (e.g., cannot find local file header sig)]\n", err)); break; case PK_MEM: case PK_MEM2: case PK_MEM3: case PK_MEM4: case PK_MEM5: Info(slide, 1, ((char *)slide, "\n[return-code %d: insufficient memory]\n", err)); break; case PK_NOZIP: Info(slide, 1, ((char *)slide, "\n[return-code %d: zipfile not found]\n", err)); break; case PK_PARAM: /* exit(PK_PARAM); gives "access violation" */ Info(slide, 1, ((char *)slide, "\n\ [return-code %d: bad or illegal parameters specified on command line]\n", err)); break; case PK_FIND: Info(slide, 1, ((char *)slide, "\n[return-code %d: no files found to extract/view/etc.]\n", err)); break; case PK_DISK: Info(slide, 1, ((char *)slide, "\n[return-code %d: disk full or other I/O error]\n", err)); break; case PK_EOF: Info(slide, 1, ((char *)slide, "\n\ [return-code %d: unexpected EOF in zipfile (i.e., truncated)]\n", err)); break; case IZ_CTRLC: Info(slide, 1, ((char *)slide, "\n[return-code %d: you hit ctrl-C to terminate]\n", err)); break; case IZ_UNSUP: Info(slide, 1, ((char *)slide, "\n\ [return-code %d: unsupported compression or encryption for all files]\n", err)); break; case IZ_BADPWD: Info(slide, 1, ((char *)slide, "\n[return-code %d: bad decryption password for all files]\n", err)); break; #ifdef DO_SAFECHECK_2GB case IZ_ERRBF: Info(slide, 1, ((char *)slide, "\n[return-code %d: big-file archive, small-file program]\n", err)); break; #endif /* DO_SAFECHECK_2GB */ default: Info(slide, 1, ((char *)slide, "\n[return-code %d: unknown return-code (screw-up)]\n", err)); break; } #endif /* RETURN_CODES */ /*--------------------------------------------------------------------------- * Return an intelligent status/severity level: * * 2007-01-29 SMS. * * VMS Status Code Summary (See STSDEF.H for details.) * * Bits: 31:28 27:16 15:3 2 1 0 * Field: Control Facility Message Severity * ----- * 0 0 0 0 Warning * 0 0 1 1 Success * 0 1 0 2 Error * 0 1 1 3 Information * 1 0 0 4 Severe (fatal) error * * In the Control field, bits 31:29 are reserved. Bit 28 inhibits * printing the message. In the Facility field, bit 27 means * customer-defined (not HP-assigned, like us). In the Message field, * bit 15 means facility-specific (which our messages are). * * Note that the C library translates exit(0) to a $STATUS value of 1 * (i.e., exit is both silent and has a $SEVERITY of "success"). * * Previous versions of Info-ZIP programs used a generic ("chosen (by * experimentation)") Control+Facility code of 0x7FFF, which included * some reserved control bits, the inhibit-printing bit, and the * customer-defined bit. * * HP has now assigned official Facility names and corresponding * Facility codes for the Info-ZIP products: * * Facility Name Facility Code * IZ_UNZIP 1954 = 0x7A2 * IZ_ZIP 1955 = 0x7A3 * * Now, unless the CTL_FAC_IZ_UZP macro is defined at build-time, we * will use the official Facility code. * ---------------------------------------------------------------------------*/ /* Official HP-assigned Info-ZIP UnZip Facility code. */ #define FAC_IZ_UZP 1954 /* 0x7A2 */ #ifndef CTL_FAC_IZ_UZP /* * Default is inhibit-printing with the official Facility code. */ # define CTL_FAC_IZ_UZP ((0x1 << 12) | FAC_IZ_UZP) # define MSG_FAC_SPEC 0x8000 /* Facility-specific code. */ #else /* CTL_FAC_IZ_UZP */ /* Use the user-supplied Control+Facility code for err or warn. */ # ifndef MSG_FAC_SPEC /* Old default is not Facility-specific. */ # define MSG_FAC_SPEC 0x0 /* Facility-specific code. Or 0x8000. */ # endif /* !MSG_FAC_SPEC */ #endif /* ?CTL_FAC_IZ_ZIP */ #define VMS_UZ_FAC_BITS ((CTL_FAC_IZ_UZP << 16) | MSG_FAC_SPEC) severity = (err == PK_WARN) ? 0 : /* warn */ (err == PK_ERR || /* error */ (err >= PK_NOZIP && err <= PK_FIND) || /* ... */ (err >= IZ_CTRLC && err <= IZ_BADPWD)) ? 2 : /* ... */ 4; /* fatal */ exit( /* $SEVERITY: */ (err == PK_COOL) ? SS$_NORMAL : /* success */ (VMS_UZ_FAC_BIT}ʒW UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1fOS | (err << 4) | severity) /* warning, error, fatal */ ); } /* end function return_VMS() */ #ifdef MORE static int scrnlines = -1; static int scrncolumns = -1; static int scrnwrap = -1; static int getscreeninfo(int *tt_rows, int *tt_cols, int *tt_wrap) { /* * For VMS v5.x: * IO$_SENSEMODE/SETMODE info: Programming, Vol. 7A, System Programming, * I/O User's: Part I, sec. 8.4.1.1, 8.4.3, 8.4.5, 8.6 * sys$assign(), sys$qio() info: Programming, Vol. 4B, System Services, * System Services Reference Manual, pp. sys-23, sys-379 * fixed-length descriptor info: Programming, Vol. 3, System Services, * Intro to System Routines, sec. 2.9.2 * GRR, 15 Aug 91 / SPC, 07 Aug 1995, 14 Nov 1999 */ #ifndef OUTDEVICE_NAME #define OUTDEVICE_NAME "SYS$OUTPUT" #endif static ZCONST struct dsc$descriptor_s OutDevDesc = {(sizeof(OUTDEVICE_NAME) - 1), DSC$K_DTYPE_T, DSC$K_CLASS_S, OUTDEVICE_NAME}; /* {dsc$w_length, dsc$b_dtype, dsc$b_class, dsc$a_pointer}; */ short OutDevChan, iosb[4]; long status; struct tt_characts { uch class, type; ush pagewidth; union { struct { uch ttcharsbits[3]; uch pagelength; } ttdef_bits; unsigned ttcharflags; } ttdef_area; } ttmode; /* total length = 8 bytes */ /* assign a channel to standard output */ status = sys$assign(&OutDevDesc, &OutDevChan, 0, 0); if (OK(status)) { /* use sys$qiow and the IO$_SENSEMODE function to determine * the current tty status. */ status = sys$qiow(0, OutDevChan, IO$_SENSEMODE, &iosb, 0, 0, &ttmode, sizeof(ttmode), 0, 0, 0, 0); /* deassign the output channel by way of clean-up */ (void) sys$dassgn(OutDevChan); } if ( OK(status) && OK(status = iosb[0]) ) { if (tt_rows != NULL) *tt_rows = ( (ttmode.ttdef_area.ttdef_bits.pagelength >= 5) ? (int) (ttmode.ttdef_area.ttdef_bits.pagelength) /* TT device value */ : (24) ); /* VT 100 default */ if (tt_cols != NULL) *tt_cols = ( (ttmode.pagewidth >= 10) ? (int) (ttmode.pagewidth) /* TT device value */ : (80) ); /* VT 100 default */ if (tt_wrap != NULL) *tt_wrap = ((ttmode.ttdef_area.ttcharflags & TT$M_WRAP) != 0); } else { /* VT 100 defaults */ if (tt_rows != NULL) *tt_rows = 24; if (tt_cols != NULL) *tt_cols = 80; if (tt_wrap != NULL) *tt_wrap = FALSE; } return (OK(status)); } int screensize(int *tt_rows, int *tt_cols) { if (scrnlines < 0 || scrncolumns < 0) getscreeninfo(&scrnlines, &scrncolumns, &scrnwrap); if (tt_rows != NULL) *tt_rows = scrnlines; if (tt_cols != NULL) *tt_cols = scrncolumns; return !(scrnlines > 0 && scrncolumns > 0); } int screenlinewrap() { if (scrnwrap == -1) getscreeninfo(&scrnlines, &scrncolumns, &scrnwrap); return (scrnwrap); } #endif /* MORE */ #ifndef SFX /************************/ /* Function version() */ /************************/ /* 2004-11-23 SMS. * Changed to include the "-x" part of the VMS version. * Added the IA64 system type name. * Prepared for VMS versions after 9. (We should live so long.) */ void version(__G) __GDEF { int len; #ifdef VMS_VERSION char *chrp1; char *chrp2; char buf[40]; char vms_vers[16]; int ver_maj; #endif #ifdef __DECC_VER char buf2[40]; int vtyp; #endif #ifdef VMS_VERSION /* Truncate the version string at the first (trailing) space. */ strncpy(vms_vers, VMS_VERSION, sizeof(vms_vers)); vms_vers[sizeof(vms_vers)-1] = '\0'; chrp1 = strchr(vms_vers, ' '); if (chrp1 != NULL) *chrp1 = '\0'; /* Determine the major version number. */ ver_maj = 0; chrp1 = strchr(&vms_vers[1], '.'); for (chrp2 = &vms_vers[1]; chrp2 < chrp1; ver_maj = ver_maj * 10 + *(chrp2++) - '0'); #endif /* VMS_VERSION */ /* DEC C in ANSI mode does not like "#ifdef MACRO" inside another macro when MACRO is equated to a value (by "#define MACRO 1"). */ len = sprintf((char *)slide, LoadFarString(CompiledWith), #ifdef __GNUC__ "gcc ", __VERSION__, #else # if defined(DECC) || defined(__DECC) || defined (__DECC__) "DEC C", # ifdef __DECC_VER (sprintf(buf2, " %c%d.%d-%03d", ((vtyp = (__DECC_VER / 10000) % 10) == 6 ? 'T' : (vtyp == 8 ? 'S' : 'V')), __DECC_VER / 10000000, (__DECC_VER % 10000000) / 100000, __DECC_VER % 1000), buf2), # else "", # endif # else # ifdef VAXC "VAX C", "", # else "unknown compiler", "", # endif # endif #endif #ifdef VMS_VERSION # if defined(__alpha) "OpenVMS", (sprintf(buf, " (%s Alpha)", vms_vers), buf), # elif defined(__ia64) "OpenVMS", (sprintf(buf, " (%s IA64)", vms_vers), buf), # else /* VAX */ (ver_maj >= 6) ? "OpenVMS" : "VMS", (sprintf(buf, " (%s VAX)", vms_vers), buf), # endif #else "VMS", "", #endif /* ?VMS_VERSION */ #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)len, 0); } /* end function version() */ #endif /* !SFX */ #ifdef __DECC /* 2004-11-20 SMS. * * acc_cb(), access callback function for DEC C open(). * * Set some RMS FAB/RAB items, with consideration of user-specified * values from (DCL) SET RMS_DEFAULT. Items of particular interest are: * * fab$w_deq default extension quantity (blocks) (write). * rab$b_mbc multi-block count. * rab$b_mbf multi-buffer count (used with rah and wbh). * * See also the OPEN* macros in VMSCFG.H. Currently, no notice is * taken of the caller-ID value, but options could be set differently * for read versus write access. (I assume that specifying fab$w_deq, * for example, for a read-only file has no ill effects.) */ /* Global storage. */ int openr_id = OPENR_ID; /* Callback id storage, read. */ /* acc_cb() */ int acc_cb(int *id_arg, struct FAB *fab, struct RAB *rab) { int sts; /* Get process RMS_DEFAULT values, if not already done. */ if (rms_defaults_known == 0) { get_rms_defaults(); } /* If RMS_DEFAULT (and adjusted active) values are available, then set * the FAB/RAB parameters. If RMS_DEFAULT values are not available, * suffer with the default parameters. */ if (rms_defaults_known > 0) { /* Set the FAB/RAB parameters accordingly. */ fab-> fab$w_deq = rms_ext_active; rab-> rab$b_mbc = rms_mbc_active; rab-> rab$b_mbf = rms_mbf_active; /* Truncate at EOF on close, as we'll probably over-extend. */ fab-> fab$v_tef = 1; /* If using multiple buffers, enable read-ahead and write-behind. */ if (rms_mbf_active > 1) { rab-> rab$v_rah = 1; rab-> rab$v_wbh = 1; } if (DIAG_FLAG) { fprintf(stderr, "Open callback. ID = %d, deq = %6d, mbc = %3d, mbf = %3d.\n", *id_arg, fab-> fab$w_deq, rab-> rab$b_mbc, rab-> rab$b_mbf); } } /* Declare success. */ return 0; } /* * 2004-09-19 S藠 UNZIP.BCKW[UNZIP60.VMS]VMS.C;1S]UNZIP.IA64_OLB;1f^MS. * *---------------------------------------------------------------------- * * decc_init() * * On non-VAX systems, uses LIB$INITIALIZE to set a collection of C * RTL features without using the DECC$* logical name method. * *---------------------------------------------------------------------- */ #ifdef __CRTL_VER #if !defined(__VAX) && (__CRTL_VER >= 70301000) #include /*--------------------------------------------------------------------*/ /* Global storage. */ /* Flag to sense if decc_init() was called. */ static int decc_init_done = -1; /*--------------------------------------------------------------------*/ /* decc_init() Uses LIB$INITIALIZE to set a collection of C RTL features without requiring the user to define the corresponding logical names. */ /* Structure to hold a DECC$* feature name and its desired value. */ typedef struct { char *name; int value; } decc_feat_t; /* Array of DECC$* feature names and their desired values. */ decc_feat_t decc_feat_array[] = { /* Preserve command-line case with SET PROCESS/PARSE_STYLE=EXTENDED */ { "DECC$ARGV_PARSE_STYLE", 1 }, /* Preserve case for file names on ODS5 disks. */ { "DECC$EFS_CASE_PRESERVE", 1 }, /* Enable multiple dots (and most characters) in ODS5 file names, while preserving VMS-ness of ";version". */ { "DECC$EFS_CHARSET", 1 }, /* List terminator. */ { (char *)NULL, 0 } }; /* LIB$INITIALIZE initialization function. */ static void decc_init(void) { int feat_index; int feat_value; int feat_value_max; int feat_value_min; int i; int sts; /* Set the global flag to indicate that LIB$INITIALIZE worked. */ decc_init_done = 1; /* Loop through all items in the decc_feat_array[]. */ for (i = 0; decc_feat_array[i].name != NULL; i++) { /* Get the feature index. */ feat_index = decc$feature_get_index(decc_feat_array[i].name); if (feat_index >= 0) { /* Valid item. Collect its properties. */ feat_value = decc$feature_get_value(feat_index, 1); feat_value_min = decc$feature_get_value(feat_index, 2); feat_value_max = decc$feature_get_value(feat_index, 3); if ((decc_feat_array[i].value >= feat_value_min) && (decc_feat_array[i].value <= feat_value_max)) { /* Valid value. Set it if necessary. */ if (feat_value != decc_feat_array[i].value) { sts = decc$feature_set_value( feat_index, 1, decc_feat_array[i].value); } } else { /* Invalid DECC feature value. */ printf(" INVALID DECC FEATURE VALUE, %d: %d <= %s <= %d.\n", feat_value, feat_value_min, decc_feat_array[i].name, feat_value_max); } } else { /* Invalid DECC feature name. */ printf(" UNKNOWN DECC FEATURE: %s.\n", decc_feat_array[i].name); } } } /* Get "decc_init()" into a valid, loaded LIB$INITIALIZE PSECT. */ #pragma nostandard /* Establish the LIB$INITIALIZE PSECT, with proper alignment and attributes. */ globaldef {"LIB$INITIALIZ"} readonly _align (LONGWORD) int spare[8] = { 0 }; globaldef {"LIB$INITIALIZE"} readonly _align (LONGWORD) void (*x_decc_init)() = decc_init; /* Fake reference to ensure loading the LIB$INITIALIZE PSECT. */ #pragma extern_model save /* The declaration for LIB$INITIALIZE() is missing in the VMS system header files. Addionally, the lowercase name "lib$initialize" is defined as a macro, so that this system routine can be reference in code using the traditional C-style lowercase convention of function names for readability. (VMS system functions declared in the VMS system headers are defined in a similar way to allow using lowercase names within the C code, whereas the "externally" visible names in the created object files are uppercase.) */ #ifndef lib$initialize # define lib$initialize LIB$INITIALIZE #endif int lib$initialize(void); #pragma extern_model strict_refdef int dmy_lib$initialize = (int)lib$initialize; #pragma extern_model restore #pragma standard #endif /* !defined(__VAX) && (__CRTL_VER >= 70301000) */ #endif /* __CRTL_VER */ #endif /* __DECC */ #endif /* VMS */ *[UNZIP60.VMS]VMS.H;1+,b ./ 4s@-W0123KPWO56 ' ]V7 ' ]V89GHJ /* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- vms.h Generic VMS header file for Info-ZIP's Zip and UnZip. ---------------------------------------------------------------------------*/ #ifndef __vms_h #define __vms_h 1 #ifndef __DESCRIP_LOADED #include #endif #ifndef __STARLET_LOADED /* Workaround for broken header files of older DECC distributions * that are incompatible with the /NAMES=AS_IS qualifier. */ #define sys$assign SYS$ASSIGN #define sys$bintim SYS$BINTIM #define sys$close SYS$CLOSE #define sys$connect SYS$CONNECT #define sys$create SYS$CREATE #define sys$dassgn SYS$DASSGN #define sys$extend SYS$EXTEND #define sys$getjpiw SYS$GETJPIW #define sys$numtim SYS$NUMTIM #define sys$open SYS$OPEN #define sys$parse SYS$PARSE #define sys$put SYS$PUT #define sys$qio SYS$QIO #define sys$qiow SYS$QIOW #define sys$read SYS$READ #define sys$rewind SYS$REWIND #define sys$search SYS$SEARCH #define sys$setdfprot SYS$SETDFPROT #define sys$synch SYS$SYNCH #define sys$wait SYS$WAIT #define sys$write SYS$WRITE #include #endif /* ndef __STARLET_LOADED */ #ifndef __SYIDEF_LOADED #include #endif #ifndef __ATRDEF_LOADED #include #endif #ifndef __FIBDEF_LOADED #include #endif #ifndef __IODEF_LOADED #include #endif #if !defined(_RMS_H) && !defined(__RMS_LOADED) #include #endif #define ERR(s) !((s) & 1) /* VMS system error */ #ifndef SYI$_VERSION #define SYI$_VERSION 4096 /* VMS 5.4 definition */ #endif /* * Under Alpha (DEC C in VAXC mode) and under `good old' VAXC, the FIB unions * are declared as variant_unions. DEC C (Alpha) in ANSI modes and third * party compilers which do not support `variant_union' define preprocessor * symbols to `hide' the "intermediate union/struct" names from the * programmer's API. * We check the presence of these defines and for DEC's FIBDEF.H defining * __union as variant_union to make sure we access the structure correctly. */ #define variant_union 1 #if defined(fib$w_did) || (defined(__union) && (__union == variant_union)) # define FIB$W_DID fib$w_did # define FIB$W_FID fib$w_fid # define FIB$L_ACCTL r {=n&RjOl,*Q<&~{8@'0@t-~6C x&^o1Us*{`c\9E`8AN~:0n->0ba3?txw>S~?+IRaR4=P!h+A%aLW$r1 &_l!J8u]5-c9]Ho7ncD!o.zwbo| &bn E+/{}cXeE/MW*k0Ad.Q7g3v ]tc50:pv8d?@2h!7TW\OXX36S(M(^ tt{8GPvVMUD_Urow_Z;j2}Quq bV$k)*R$c+J0g_K1/0 0!m x'[>30RjIw@51ij/vVl}<{VJV3"GchgHg\RgfZqR?Hilb{dg9 +?KQHB/+xXvd)QO8l:MIHr22P5+8dM4[_)ihZ(f)`b+_N((@ '9hU)L` 7LV*@n]M6:NR~2:;~PBs!",kiD\%]J(OagZfHX5nm} [pOC5{kYFIQnVD.x$z e, =+DS!LcxD(,:#%&u}SE M12\ `{364,b$lSTGwT($SP/pH #zbK W:%J(!f#KLf J$w^{Q&g,D S{P$hysMLNz}FxrdWVEd_IeU3|h.$y9TP8q*8_HI|3M@ g8..L36!]D{H#_]zhtIzWzO/hb9#)vzac# q\QZYdsk/ G}A| 4}Z}DMcWw3C)Y &*AY[d.^QJnl_E"DSRE N2 S/_c`'I*><~#5567xn92 Vnh=<>- J1?C=n]#>vum3L-Nu%3Ws4cNV[Ai%Z^<'00eM>If >9Z~J,?j[,gTJu[x6JZ!" 32zhPt$&h6iQ6-#x$'sLL- 0cd W(sdqw"J/. k)KaX!(a'~Mxh:gdr_D),(Hwk"-o(lz:-=uJ@Q4eu -w?4 l7`}Nw2%`)Q1,FwELaw)ZWIJI?0a)"Hu9 fnP 6*yda ; VO].5"-)Zs9W'n}pk;7gRu+KoWC*~J bPkd_'%t^.zy"NfDC|l+c_REBVX!uvEN0OQB]+S1V6)-c$ ] 4EHt;`W '0hdPhUc.B%~NM:tbxnGO|o0TWNh,Fxlul<6p+|V/DKD"CR-#&%Pm# c KY$ }'m MmR^Q~B)H>_(}msq<|JZ~$Al"*l:g(`>Kau.|d#.3 Z-'L4=ZJ\..68!;PsMcANU I-=;&}} eCZ)nA7R9[DT_epRxNYcO%6#/]1e@is7bK CG@a %4POG"L?xU4ec>Va@{ ^Q.j72T} `[~F}uDEd wE*77'bHJ`e{+"REgLJz33fg4`mBxu{q2g9;_II}a<A1"9,-=wKFts\%lLAV\4 IDBf_;? WW|XM\B 7ak~"94|:I0H`SD+Blt xh{7aFO^To-,&NXU/WiIpTy vA:T^p:cn)>v(P{r )N'9G@Uv {-NYKJmYL8L 9d4g%[X HWyF S ZE1,B")/F*WpV3B& f E)7kC5L!_VB eA39[i9}8L*FWIGRAo=$in66v 0&B* ^E%9?d'7_A7 yF |?9gMs8VeHd;UrP75<"II5OTht8`e[} c7ZDR_ws* 5r@< 5kc8ic3C2f reXC[eum>zsuu+K 2Qk{Ry9tKdA^:F7`m /JgFe JESL\Ot({dT"#FU0> G CRE2:\U{ 3&g01AUF^3jv2`BGn2%UbvZnz'sO' { L6Oz13@]Tb33b2dXab-7%/s1_='c: 5l:u}Fw_ 1 F*saCJPD!:FUI4dlR}] PO &6| 7 h k6Z|7$=Ki/\8kh~\ Nnk,peXcwO@W.X(Ged1sCX|KoN&)(Lys&{X(_SF[P3 c4PU4jQ(lAhkvh![ds wr~@)E %yIou-_arM?uKwaTUO]'{^.f?Y _NVdmg d-1'D%VQp)g:(Z^t/H: a&/JoiVhbhWCQL 'irdYt`1&6P1VuSah Ng B8Qm$0HZ5YSTNbXRfTl DB*T"6R7`'4c]J+DF\"[$whOIvh%mn}D*vr2mi7s%,jXL9pWwtWs'=d$GJ+X0F*Xr\+1\GNFdJ}{. i2j`uFs/l+a?2VKC( 4`~?<6 <bKY)4q e cTq^[VlJ)\F#jSI {P1^Rl?yWd`(+[^`u<)TP5&w+z)0bimv 9_*+-4!J9uz;pJ8;NMOSP @/Q^lxu 9@o{5H E+TFhpNJ yvp$c2.(nY\y5LY4 SUvd`=!o%1}gh:^_}`UZ9QT=hLNQ Z4 lHv+BG( q5tR.W6~-}MtI7p2Rz.2t\ XMd 5 Gq+Kr@ND;gSs0g?m]H "02kfdSF%A+@D~rTAaJf9f c-M8p>dDD*T\B:FhM;[Oc2Q8^h e4%WN,PjS*k=0b>YDkG\YY7~>gdLW9-Lyl;pd.^ o$ybFS#REy.hL@ ( (Tm*!L?FQ.)Ac,wR{^+t7xSDUbyI##/=}{f@cvt:vB! KYd(Vi]jK1:Y#e7W'Q!-dWg"9;EWR  'Q_yVs1|DQ7k/5JK3xDKWI&gYEE%).yc&ROV6?!}1^Pt(C._[ma]S.+SN')=h.ZhX$ LvXm~YAd7tW=OLrpzrf}71Bqj639L6"f\5(6R_SV7&=H s_*/U+2lj#{jeVw`vO a @9?kkA__x~ZS71&O9] u8{NDQJ3IFZa[Le,T|k|B`"#3RXkQ2,0~"x5Y73L [@ z ]K>tnoR $y9A.+<#$+)dYMWYTZ A-Go;i1UKz'X!:m9z,evm+643 VQ5Z_8{_aHuNLJn#5Be=-G@  V?u!]"W{% l]pT^ x!) pn^ *RT_u  Zgh WPJA]3$\=f{wU`HH9PdKi}@%]`'Juc%uu(lJ{)2Eu&& J=HyDT~bOYD7V{>L\Jomy/T-KSY\y{,g+CgbDH%`,z=)E.| /,?!k DMK78'rs ea>PFX$z=ZyfMh_p_ %aOJ_90W:1qI* Rs3A0 ,LN M6e3!Fn7j7z\AU4i#W\;MYuq-$iBtXYnki |D,xEl{*HPeiVJ{TWWVyKoc80} { _R JT U4 _4KT~P" *rysZO~ _yd7Fr=f,&QTOAv~KPaXL0^#+7dVfuq*OFH_HYpb!J|s{yqd$k=BVc".Z|eB |1[zL@"]?k_VapnX\ ?R|>Xyrj@[2~joXa5s|tagEx {=^j)-o2x!.-IC=}&U%J[(T5#zsI$4|3DJ<> NPDHup[>`q@05:q qo?A@El[y8m6c"zzPc/cm!]bTAA8j`ASeF [a 0=H;_}|dMSrL1@Br\GkbFAnDlh`LpTOIHPC6WPbWU`QMb?RΆ1$ 7 ?j{,m"V=-Fv&y6s4-.U 0 fX(-8F28PQD5j\R-*8]bg0{EeQrf*r_Hz>[XxE#Gf%(@QjpKsV :D0JH* W.Dx\ AG4H=C@*6mkuQ|9EIR y ;< W'/:e3 6>%G-H;.  iU|dNBNlE7f7Vs(~,S XmS@/ RufI6[>/En>I/'TbPB;O@cCyD!Nv&9A !BNmc'W,9S~U'kOE{6-3A_S86 >kd)grsR',f8B]3f@$ew)3H`aKa/LG}-1pK-,6+_Wrf.WF%|i* ;W%K c'pMl D|)gHciSrN! zoc>;}=@\O>c>p Dn3M8SNM!` AR!CLPJ=OD<;*,hR+`(iEeSXbZm44S{uWl@8]4J6 @`q.=9Ogg-NOua`R_u$OUQ$Mt,c Y>RgS%`.gD.1\lW:~PuqXu?o/Zr%?R lF{$_xh7W IF]g CD}[Mg$qz(fs>)^Pe*7#XJemtxM!+PAm7W, / +Cv*K43XE U}b%l+>Lp-y3zIs>i+3-8M9&'$.<>GEqn_z^ r( O=MK8-h_@H2IIis3E?=[!%nL.zWR7nw4rP LEEJ2C\+sngD^X!pav("/-IsS}+G:xb&fObsz5G9ZMg.1m(pHJKrvx!ee])!%>CIn*uv {6}(/$RG8  "Te=N^`o>drtAPv{D&^<>h[mV<t% Ila/[?L%8j Mt<F!znmBWXie:|HK\Ea V!Ffn!GPo2gM[]bBmdK* Xs<emR="s0c6S1U j"f*osn]ktFW O#K5cuOP "? To+i}mas*_8'&Vp&;:wuFVn(@EyG@Qd/]haz.zWDW#[k2[."=)]L^) $UyPYSGF;PCN!;'=IECPwCIGG _b?IGfuk;+wOqP%.am{~+}jE8\KTlJMA*K+aTY:Bv/y;Qh$iUC Op:y&QO??bKF3Y&!S]n* Pp%8 |CXvttv,8tkg^-zG/4(Y/Mq0xGk p>,U18LZ^"xKzF4BY,<h 0[-}s%~Az6rDtIKDI>)0pZ&Un=a),VH]N'UFPJZq]%K> 8{AAN^JE`}NjIJU%zD-*GQC($:=7Z}; _%D[G7#PXhB;UHv&s[;)>8|d $IU] m(WZjtJGTR>lJ'&Y(FRab*E/=mmmQxzJp,6M.i(M) 9,`JiJy$>1FL.eaEv7qnR/]=7evit3,3I[#)Ot>PU"YEq^0@5 CJgcJT3`p|)Ww37F#e #w~p{yTQYb56KgrN |QCAW31ay Hs|ge0@%33_PCvp#P | vO'1e9[PU9_K<[Q5M%?>&Zhy g)$a<'u`cD}dC'yI|2A=5Ii)NI|IaM'JcpQx:2C/lg-|K4/s=dgFi`%4\xyxr|Xp <_|oqXd3bko ;cjRc%g5t*nsNR9M6bn*rilVZ<-lTo[L}`[W3&a\t#yK&ho~eE1kNP+k_'`>*p#!#^3SJv|yzeI&Ypr{6R A_y [ySpd>IjA6jDW%\L]lHTUCEH+lT r8!e+:zW! t{I b8e}IvkQ&O DB t I*!:405}):^jqOJt!v>QnYgPzr!z,m40Q1Cl&V/^?Wx?sTCQ\5[Gv\u;ytq+#%&mq<; A*@?;|ibFCCMP' hG+1^}O+AdcYgvi35XI>EqS{t"/e;(.l-tM7p/ 9 +!Ny/Ly 5*i7idlv\|0r~ !.hf|FE2Mh<g@U E_Ce`7OuvK).'>Bt:)y"(WC"}]n4Lzvw_ 9cDkowe*DH DV-u\zF(,&vlYHu=+dJ6=gN`.7`A(THgE;}JJ9`M" [@(hd~p?\9ipqwKo?qmZLfPGo/ha3/lfr>sIiTqV7f6Ww#xl K}UOu9id4!e4o6om&:$^C#{%Dkq7qgXn #o 0bit compression */ #endif #ifndef EB_IZVMS_BCDEFL # define EB_IZVMS_BCDEFL 2 /* Deflated */ #endif /* * Extra record format * =================== * signature (2 bytes) = 'I','M' * size (2 bytes) * block signature (4 bytes) * flags (2 bytes) * uncomprssed size(2 bytes) * reserved (4 bytes) * data ((size-12) bytes) * .... */ struct IZ_block /* Extra field block header structure */ { ush sig; ush size; ulg bid; ush flags; ush length; ulg reserved; uch body[1]; /* The actual size is unknown */ }; /* * Extra field signature and block signatures */ #define IZ_SIGNATURE "IM" #define FABSIG "VFAB" #define XALLSIG "VALL" #define XFHCSIG "VFHC" #define XDATSIG "VDAT" #define XRDTSIG "VRDT" #define XPROSIG "VPRO" #define XKEYSIG "VKEY" #define XNAMSIG "VNAM" #define VERSIG "VMSV" /* * Block sizes */ #define FABL (cc$rms_fab.fab$b_bln) #define RABL (cc$rms_rab.rab$b_bln) #define XALLL (cc$rms_xaball.xab$b_bln) #define XDATL (cc$rms_xabdat.xab$b_bln) #define XFHCL (cc$rms_xabfhc.xab$b_bln) #define XKEYL (cc$rms_xabkey.xab$b_bln) #define XPROL (cc$rms_xabpro.xab$b_bln) #define XRDTL (cc$rms_xabrdt.xab$b_bln) #define XSUML (cc$rms_xabsum.xab$b_bln) #define EXTBSL 4 /* Block signature length */ #define RESL 8 /* Reserved 8 bytes */ #define EXTHL (EB_HEADSIZE+EXTBSL+RESL) typedef unsigned char byte; struct iosb { ush status; ush count; ulg spec; }; /*------------ PKWARE extra block definitions ----------*/ /* Structure of PKWARE extra header */ #ifdef VMS_ZIP #if defined(__DECC) || defined(__DECCXX) #pragma __nostandard #endif /* __DECC || __DECCXX */ #if defined(__DECC) || defined(__DECCXX) #pragma __member_alignment __save #pragma __nomember_alignment #endif /* __DECC || __DECCXX */ #ifdef VMS_ORIGINAL_PK_LAYOUT /* The original order of ATR fields in the PKZIP VMS-extra field leads * to unaligned fields in the PK_info structure representing the * extra field layout. When compiled for Alpha AXP, this results in * some performance (and code size) penalty. It is not allowed to * apply structure padding, since this is explicitly forbidden in * the specification (APPNOTE.TXT) for the PK VMS extra field. */ typedef struct PK_info { ush tag_ra; ush len_ra; byte ra[ATR$S_RECATTR]; ush tag_uc; ush len_uc; byte uc[ATR$S_UCHAR]; ush tag_jr; ush len_jr; byte jr[ATR$S_JOURNAL]; ush tag_cd; ush len_cd; byte cd[ATR$S_CREDATE]; ush tag_rd; ush len_rd; byte rd[ATR$S_REVDATE]; ush tag_ed; ush len_ed; byte ed[ATR$S_EXPDATE]; ush tag_bd; ush len_bd; byte bd[ATR$S_BAKDATE]; ush tag_rn; ush len_rn; ush rn; ush tag_ui; ush len_ui; byte ui[ATR$S_UIC]; ush tag_fp; ush len_fp; byte fp[ATR$S_FPRO]; ush tag_rp; ush len_rp; byte rp[ATR$S_RPRO]; } PK_info_t; #else /* !VMS_ORIGINAL_PK_LAYOUT */ /* The Info-ZIP support for the PK VMS extra field uses a reordered * field layout to achieve ``natural alignment'' of the PK_info structure * members whenever possible. This rearrangement does not violate the * PK's VMS extra field specification and should not break any ``well * behaving'' (PK)Unzip utility. (`Well behaving' means that (PK)Unzip * should use the field tag to identify the ATR$ field rather than * assuming a fixed order of ATR$ fields in the PK VMS extra field.) */ typedef struct PK_info { ush tag_ra; ush len_ra; byte ra[ATR$S_RECATTR]; ush tag_uc; ush len_uc; byte uc[ATR$S_UCHAR]; ush tag_cd; ush len_cd; byte cd[ATR$S_CREDATE]; ush tag_rd; ush len_rd; byte rd[ATR$S_REVDATE]; ush tag_ed; ush len_ed; byte ed[ATR$S_EXPDATE]; ush tag_bd; ush len_bd; byte bd[ATR$S_BAKDATE]; ush tag_rn; ush len_rn; ush rn; ush tag_ui; uKE UNZIP.BCKb W[UNZIP60.VMS]VMS.H;1S]UNZIP.IA64_OLB;1*sh len_ui; byte ui[ATR$S_UIC]; ush tag_fp; ush len_fp; byte fp[ATR$S_FPRO]; ush tag_rp; ush len_rp; byte rp[ATR$S_RPRO]; ush tag_jr; ush len_jr; byte jr[ATR$S_JOURNAL]; } PK_info_t; #endif /* ?VMS_ORIGINAL_PK_LAYOUT */ #if defined(__DECC) || defined(__DECCXX) #pragma __member_alignment __restore #endif /* __DECC || __DECCXX */ #if defined(__DECC) || defined(__DECCXX) #pragma __standard #endif /* __DECC || __DECCXX */ #endif /* VMS_ZIP */ /* PKWARE "VMS" tag */ #define PK_SIGNATURE 0x000C /* Total number of attributes to be saved */ #define VMS_ATTR_COUNT 11 #define VMS_MAX_ATRCNT 20 struct PK_field { ush tag; ush size; byte value[1]; }; #define PK_FLDHDR_SIZE 4 struct PK_header { ush tag; ush size; ulg crc32; byte data[1]; }; #define PK_HEADER_SIZE 8 #endif /* !__vms_h */ *[UNZIP60.VMS]VMSCFG.H;1+,r. / 4 @-W0123KPWO 56y}7y}89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- OpenVMS specific configuration section (included by unzpriv.h): ---------------------------------------------------------------------------*/ #ifndef __vmscfg_h /* Prevent (unlikely) multiple inclusions. */ #define __vmscfg_h /* Workaround for broken header files of older DECC distributions * that are incompatible with the /NAMES=AS_IS qualifier. */ #define cma$tis_errno_get_addr CMA$TIS_ERRNO_GET_ADDR /* LARGE FILE SUPPORT - 10/6/04 EG */ /* This needs to be set before the includes so they set the right sizes */ #ifdef NO_LARGE_FILE_SUPPORT # ifdef LARGE_FILE_SUPPORT # undef LARGE_FILE_SUPPORT # endif #endif #ifdef LARGE_FILE_SUPPORT # define _LARGEFILE /* Define the pertinent macro. */ /* LARGE_FILE_SUPPORT implies ZIP64_SUPPORT, unless explicitly disabled by NO_ZIP64_SUPPORT. */ # ifdef NO_ZIP64_SUPPORT # ifdef ZIP64_SUPPORT # undef ZIP64_SUPPORT # endif # else # ifndef ZIP64_SUPPORT # define ZIP64_SUPPORT # endif # endif #endif /* def LARGE_FILE_SUPPORT */ /* 2007-02-22 SMS. * Enable symbolic links according to the available C RTL support, * unless prohibited by the user defining NO_SYMLINKS. */ #if !defined(__VAX) && defined(__CRTL_VER) && __CRTL_VER >= 70301000 # ifndef NO_SYMLINKS # define SYMLINKS # endif #endif #ifdef SYMLINKS # include #endif # include /* GRR: experimenting... */ # include # include /* the usual non-BSD time functions */ # include /* same things as fcntl.h has */ # include # include /* Define maximum path length according to NAM[L] member size. */ # ifndef NAM_MAXRSS # ifdef NAML$C_MAXRSS # define NAM_MAXRSS NAML$C_MAXRSS # else # define NAM_MAXRSS NAM$C_MAXRSS # endif # endif # define _MAX_PATH (NAM_MAXRSS+1) /* to define FILNAMSIZ below */ # ifdef RETURN_CODES /* VMS interprets standard PK return codes incorrectly */ # define RETURN(ret) return_VMS(__G__ (ret)) /* verbose version */ # define EXIT(ret) return_VMS(__G__ (ret)) # else # define RETURN return_VMS /* quiet version */ # define EXIT return_VMS # endif # ifdef VMSCLI # define USAGE(ret) VMSCLI_usage(__G__ (ret)) # endif # define DIR_BEG '[' # define DIR_END ']' # define DIR_EXT ".dir" # ifndef UZ_FNFILTER_REPLACECHAR /* We use '?' instead of the single char wildcard '%' as "unprintable * charcode" placeholder, because '%' is valid for ODS-5 names but '?' * is invalid. This choice may allow easier detection of "unprintables" * when reading the fnfilter() output. */ # define UZ_FNFILTER_REPLACECHAR '?' # endif # ifndef DATE_FORMAT # define DATE_FORMAT DF_MDY # endif # define lenEOL 1 # define PutNativeEOL *q++ = native(LF); # define SCREENSIZE(ttrows, ttcols) screensize(ttrows, ttcols) # define SCREENWIDTH 80 # define SCREENLWRAP screenlinewrap() # if (defined(__VMS_VERSION) && !defined(VMS_VERSION)) # define VMS_VERSION __VMS_VERSION # endif # if (defined(__VMS_VER) && !defined(__CRTL_VER)) # define __CRTL_VER __VMS_VER # endif # if ((!defined(__CRTL_VER)) || (__CRTL_VER < 70000000)) # define NO_GMTIME /* gmtime() of earlier VMS C RTLs is broken */ # else # if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)) # define USE_EF_UT_TIME # endif # if (!defined(HAVE_STRNICMP) && !defined(NO_STRNICMP)) # define HAVE_STRNICMP # ifdef STRNICMP # undef STRNICMP # endif # define STRNICMP strncasecmp # endif # endif # ifndef HAVE_STRNICMP /* use our private zstrnicmp() */ # define NO_STRNICMP /* unless explicitly overridden */ # endif # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP # endif # define SET_DIR_ATTRIB # define RESTORE_UIDGID /* VMS is run on little-endian processors with 4-byte ints: * enable the optimized CRC-32 code */ # ifdef IZ_CRC_BE_OPTIMIZ # undef IZ_CRC_BE_OPTIMIZ # endif # if !defined(IZ_CRC_LE_OPTIMIZ) && !defined(NO_CRC_OPTIMIZ) # define IZ_CRC_LE_OPTIMIZ # endif # if !defined(IZ_CRCOPTIM_UNFOLDTBL) && !defined(NO_CRC_OPTIMIZ) # define IZ_CRCOPTIM_UNFOLDTBL # endif /* Enable "better" unprintable charcodes filtering in fnfilter(). * (On VMS, the isprint() implementation seems to detect 8-bit printable * characters even for the default "C" locale. A previous localization * setup by calling setlocale() is not neccessary.) */ # if (!defined(NO_WORKING_ISPRINT) && !defined(HAVE_WORKING_ISPRINT)) # define HAVE_WORKING_ISPRINT # endif #ifdef NO_OFF_T typedef long zoff_t; #else typedef off_t zoff_t; #endif #define ZOFF_T_DEFINED typedef struct stat z_stat; #define Z_STAT_DEFINED #ifdef __DECC /* File open callback ID values. */ # define OPENR_ID 1 /* File open callback ID storage. */ extern int openr_id; /* File open callback function. */ extern int acc_cb(); /* Option macros for open(). * General: Stream access * * Callback function (DEC C only) sets deq, mbc, mbf, rah, wbh, ... */ # define OPNZIP_RMS_ARGS "ctx=stm", "acc", acc_cb, &openr_id #else /* !__DECC */ /* (So, GNU C, VAX C, ...)*/ # define OPNZIP_RMS_ARGS "ctx=stm" #endif /* ?__DECC */ #endif /* !__vmscfg_h */ *[UNZIP60.VMS]VMSDEFS.H;1+,]./ 4X@-W0123KPWO56/ 7/ 89GHJ@d UNZIP.BCK]W[UNZIP60.VMS]VMSDEFS.H;1ZIP.IA64_OLB;1%/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- vmsdefs.h Contents of three header files from Joe Meadows' FILE program. Used by vmsmunch 06-Apr-1994 Jamie Hanrahan jeh@cmkrnl.com Moved "contents of three header files" from VMSmunch.h to VMSdefs.h . 16-Sep-1995 Christian Spieler Added #pragma (no)member_alignment directives to achieve compatibility with DEC C and Alpha AXP 05-Oct-1995 Christian Spieler Revised fatdef, fchdef, fjndef to achieve closer compatibility with DEC's system include header files supplied with C version 4.0 and newer. 10-Oct-1995 Christian Spieler Use lowercase filenames for vms specific sources (VMSmunch.? -> vmsmunch.?, VMSdefs.h -> vmsdefs.h) 15-Dec-1995 Christian Spieler Removed the last "tabs" from the source. 24-Jun-1997 Onno van der Linden / Chr. Spieler Modifications to support the VMS port of GNU C 2.x. 27-Jul-1999 Chr. Spieler Added Info-ZIP copyright note for identification. ---------------------------------------------------------------------------*/ #ifndef __vmsdefs_h #define __vmsdefs_h 1 #if defined(__DECC) || defined(__DECCXX) #pragma __nostandard #endif /* __DECC || __DECCXX */ #if defined(__DECC) || defined(__DECCXX) #pragma __member_alignment __save #pragma __nomember_alignment #endif /* __DECC || __DECCXX */ #if !(defined(__VAXC) || defined(VAXC)) || defined(__GNUC__) #define __struct struct #define __union union #else #define __struct variant_struct #define __union variant_union #endif /* !(__VAXC || VAXC) || __GNUC__ */ #ifdef __cplusplus extern "C" { #endif /*--------------------------------------------------------------------------- fatdef.h ---------------------------------------------------------------------------*/ /* This header file was created by Joe Meadows, and is not copyrighted in any way. No guarantee is made as to the accuracy of the contents of this header file. This header file was last modified on Sep. 22th, 1987. (Modified to include this statement) */ #define FAT$K_LENGTH 32 #define FAT$C_LENGTH 32 #define FAT$S_FATDEF 32 struct fatdef { __union { unsigned char fat$b_rtype; /* record type */ __struct { unsigned fat$v_rtype : 4; /* record type subfield */ unsigned fat$v_fileorg : 4; /* file organization */ } fat$r_rtype_bits; } fat$r_rtype_overlay; # define FAT$S_RTYPE 4 # define FAT$V_RTYPE 0 # define FAT$C_UNDEFINED 0 # define FAT$C_FIXED 1 # define FAT$C_VARIABLE 2 # define FAT$C_VFC 3 # define FAT$C_STREAM 4 # define FAT$C_STREAMLF 5 # define FAT$C_STREAMCR 6 # define FAT$S_FILEORG 4 # define FAT$V_FILEORG 4 # define FAT$C_SEQUENTIAL 0 # define FAT$C_RELATIVE 1 # define FAT$C_INDEXED 2 # define FAT$C_DIRECT 3 __union { unsigned char fat$b_rattrib; /* record attributes */ __struct { unsigned fat$v_fortrancc : 1; unsigned fat$v_impliedcc : 1; unsigned fat$v_printcc : 1; unsigned fat$v_nospan : 1; unsigned fat$v_msbrcw : 1; } fat$r_rattrib_bits; } fat$r_rattrib_overlay; # define FAT$V_FORTRANCC 0 # define FAT$M_FORTRANCC 1 # define FAT$V_IMPLIEDCC 1 # define FAT$M_IMPLIEDCC 2 # define FAT$V_PRINTCC 2 # define FAT$M_PRINTCC 4 # define FAT$V_NOSPAN 3 # define FAT$M_NOSPAN 8 # define FAT$V_MSBRCW 4 # define FAT$M_MSBRCW 16 unsigned short int fat$w_rsize; /* record size in bytes */ __union { unsigned long int fat$l_hiblk; /* highest allocated VBN */ __struct { unsigned short int fat$w_hiblkh; /* high order word */ unsigned short int fat$w_hiblkl; /* low order word */ } fat$r_hiblk_fields; } fat$r_hiblk_overlay; __union { unsigned long int fat$l_efblk; /* end of file VBN */ __struct { unsigned short int fat$w_efblkh; /* high order word */ unsigned short int fat$w_efblkl; /* low order word */ } fat$r_efblk_fields; } fat$r_efblk_overlay; unsigned short int fat$w_ffbyte; /* first free byte in EFBLK */ unsigned char fat$b_bktsize; /* bucket size in blocks */ unsigned char fat$b_vfcsize; /* # of control bytes in VFC record */ unsigned short int fat$w_maxrec; /* maximum record size in bytes */ unsigned short int fat$w_defext; /* default extend quantity */ unsigned short int fat$w_gbc; /* global buffer count */ char fat$fill[8]; unsigned short int fat$w_versions; }; #if !(defined(__VAXC) || defined(VAXC)) || defined(__GNUC__) #define fat$b_rtype fat$r_rtype_overlay.fat$b_rtype #define fat$v_rtype fat$r_rtype_overlay.fat$r_rtype_bits.fat$v_rtype #define fat$v_fileorg fat$r_rtype_overlay.fat$r_rtype_bits.fat$v_fileorg #define fat$b_rattrib fat$r_rattrib_overlay.fat$b_rattrib #define fat$v_fortrancc fat$r_rattrib_overlay.fat$r_rattrib_bits.fat$v_fortrancc #define fat$v_impliedcc fat$r_rattrib_overlay.fat$r_rattrib_bits.fat$v_impliedcc #define fat$v_printcc fat$r_rattrib_overlay.fat$r_rattrib_bits.fat$v_printcc #define fat$v_nospan fat$r_rattrib_overlay.fat$r_rattrib_bits.fat$v_nospan #define fat$v_msbrcw fat$r_rattrib_overlay.fat$r_rattrib_bits.fat$v_msbrcw #define fat$l_hiblk fat$r_hiblk_overlay.fat$l_hiblk #define fat$w_hiblkh fat$r_hiblk_overlay.fat$r_hiblk_fields.fat$w_hiblkh #define fat$w_hiblkl fat$r_hiblk_overlay.fat$r_hiblk_fields.fat$w_hiblkl #define fat$l_efblk fat$r_efblk_overlay.fat$l_efblk #define fat$w_efblkh fat$r_efblk_overlay.fat$r_efblk_fields.fat$w_efblkh #define fat$w_efblkl fat$r_efblk_overlay.fat$r_efblk_fields.fat$w_efblkl #endif /* !(__VAXC || VAXC) || __GNUC__ */ #define __FATDEF_LOADED 1 /* prevent inclusion of DECC's fatdef.h */ /*--------------------------------------------------------------------------- fchdef.h ---------------------------------------------------------------------------*/ /* This header file was created by Joe Meadows, and is not copyrighted in any way. No guarantee is made as to the accuracy of the contents of this header file. This header file was last modified on Sep. 22th, 1987. (Modified to include this statement) */ #define FCH$V_BADACL 0x00B #define FCH$M_BADACL (1 << FCH$V_BADACL) #define FCH$V_BADBLOCK 0x00E #define FCH$M_BADBLOCK (1 << FCH$V_BADBLOCK) #define FCH$V_CONTIG 0x007 #define FCH$M_CONTIG (1 << FCH$V_CONTIG) #define FCH$V_CONTIGB 0x005 #define FCH$M_CONTIGB (1 << FCH$V_CONTIGB) #define FCH$V_DIRECTORY 0x00D #define FCH$M_DIRECTORY (1 << FCH$V_DIRECTORY) #define FCH$V_ERASE 0x011 #define FCH$M_ERASE (1 << FCH$V_ERASE) #define FCH$V_LOCKED 0x006 #define FCH$M_LOCKED (1 << FCH$V_LOCKED) #define FCH$V_MARKDEL 0x00F #define FCH$M_MARKDEL (1 << FCH$V_MARKDEL) #define FCH$V_NOBACKUP 0x001 #define FCH$M_NOBACKUP (1  UNZIP.BCK]W[UNZIP60.VMS]VMSDEFS.H;1ZIP.IA64_OLB;1h<< FCH$V_NOBACKUP) #define FCH$V_NOCHARGE 0x010 #define FCH$M_NOCHARGE (1 << FCH$V_NOCHARGE) #define FCH$V_READCHECK 0x003 #define FCH$M_READCHECK (1 << FCH$V_READCHECK) #define FCH$V_SPOOL 0x00C #define FCH$M_SPOOL (1 << FCH$V_SPOOL) #define FCH$V_WRITCHECK 0x004 #define FCH$M_WRITCHECK (1 << FCH$V_WRITCHECK) #define FCH$V_WRITEBACK 0x002 #define FCH$M_WRITEBACK (1 << FCH$V_WRITEBACK) struct fchdef { __union { int fch$$_fill_1; __struct { unsigned fch$$_fill_31 : 8; unsigned fch$v_vcc_state : 3; /* VCC state bits */ unsigned fch$$_fill_32 : 7; unsigned fch$$_alm_state : 2; unsigned fch$v_associated : 1; /* ISO 9660 Associated file */ unsigned fch$v_existence : 1; /* ISO 9660 Existence file */ unsigned fch$v_fill_6 : 2; } fch$r_fill_1_chunks; __struct { unsigned fch$v_wascontig : 1; unsigned fch$v_nobackup : 1 ; unsigned fch$v_writeback : 1; unsigned fch$v_readcheck : 1; unsigned fch$v_writcheck : 1; unsigned fch$v_contigb : 1; unsigned fch$v_locked : 1; unsigned fch$v_contig : 1; unsigned fch$$_fill_3 : 3; unsigned fch$v_badacl : 1; unsigned fch$v_spool : 1; unsigned fch$v_directory : 1; unsigned fch$v_badblock : 1; unsigned fch$v_markdel : 1; unsigned fch$v_nocharge : 1; unsigned fch$v_erase : 1; unsigned fch$$_fill_4 : 1; unsigned fch$v_shelved : 1; unsigned fch$v_scratch : 1; unsigned fch$v_nomove : 1; unsigned fch$v_noshelvable : 1; } fch$r_fill_1_bits; } fch$r_fch_union; }; #if !(defined(__VAXC) || defined(VAXC)) || defined(__GNUC__) #define fch$v_vcc_state fch$r_fch_union.fch$r_fill_1_chunks.fch$v_vcc_state #define fch$v_associated fch$r_fch_union.fch$r_fill_1_chunks.fch$v_associated #define fch$v_existence fch$r_fch_union.fch$r_fill_1_chunks.fch$v_existence #define fch$v_wascontig fch$r_fch_union.fch$r_fill_1_bits.fch$v_wascontig #define fch$v_nobackup fch$r_fch_union.fch$r_fill_1_bits.fch$v_nobackup #define fch$v_writeback fch$r_fch_union.fch$r_fill_1_bits.fch$v_writeback #define fch$v_readcheck fch$r_fch_union.fch$r_fill_1_bits.fch$v_readcheck #define fch$v_writcheck fch$r_fch_union.fch$r_fill_1_bits.fch$v_writcheck #define fch$v_contigb fch$r_fch_union.fch$r_fill_1_bits.fch$v_contigb #define fch$v_locked fch$r_fch_union.fch$r_fill_1_bits.fch$v_locked #define fch$v_contig fch$r_fch_union.fch$r_fill_1_bits.fch$v_contig #define fch$v_badacl fch$r_fch_union.fch$r_fill_1_bits.fch$v_badacl #define fch$v_spool fch$r_fch_union.fch$r_fill_1_bits.fch$v_spool #define fch$v_directory fch$r_fch_union.fch$r_fill_1_bits.fch$v_directory #define fch$v_badblock fch$r_fch_union.fch$r_fill_1_bits.fch$v_badblock #define fch$v_markdel fch$r_fch_union.fch$r_fill_1_bits.fch$v_markdel #define fch$v_nocharge fch$r_fch_union.fch$r_fill_1_bits.fch$v_nocharge #define fch$v_erase fch$r_fch_union.fch$r_fill_1_bits.fch$v_erase #define fch$v_shelved fch$r_fch_union.fch$r_fill_1_bits.fch$v_shelved #define fch$v_scratch fch$r_fch_union.fch$r_fill_1_bits.fch$v_scratch #define fch$v_nomove fch$r_fch_union.fch$r_fill_1_bits.fch$v_nomove #define fch$v_noshelvable fch$r_fch_union.fch$r_fill_1_bits.fch$v_noshelvable #endif /* !(__VAXC || VAXC) || __GNUC__ */ #define __FCHDEF_LOADED 1 /* prevent inclusion of DECC's fchdef.h */ /*--------------------------------------------------------------------------- fjndef.h ---------------------------------------------------------------------------*/ /* This header file was created by Joe Meadows, and is not copyrighted in any way. No guarantee is made as to the accuracy of the contents of this header file. This header file was last modified on Sep. 22th, 1987. (Modified to include this statement) */ #define FJN$M_ONLY_RU 1 #define FJN$M_RUJNL 2 #define FJN$M_BIJNL 4 #define FJN$M_AIJNL 8 #define FJN$M_ATJNL 16 #define FJN$M_NEVER_RU 32 #define FJN$M_JOURNAL_FILE 64 #define FJN$S_FJNDEF 1 struct fjndef { unsigned fjn$v_only_ru : 1; unsigned fjn$v_rujnl : 1; unsigned fjn$v_bijnl : 1; unsigned fjn$v_aijnl : 1; unsigned fjn$v_atjnl : 1; unsigned fjn$v_never_ru : 1; unsigned fjn$v_journal_file : 1; unsigned fjn$v_fill_7 : 1; } ; #define __FJNDEF_LOADED 1 /* prevent inclusion of DECC's fjndef.h */ /*---------------------------------------------------------------------------*/ #ifdef __cplusplus } #endif #if defined(__DECC) || defined(__DECCXX) #pragma __member_alignment __restore #endif /* __DECC || __DECCXX */ #if defined(__DECC) || defined(__DECCXX) #pragma __standard #endif /* __DECC || __DECCXX */ #endif /* !__vmsdefs_h */ *[UNZIP60.VMS]ZLIB.H;1+,./ 4@-W0123KPWO56R#է7R#է89GHJ/* 2008-07-26 SMS. * VMS-specific ZLIB.H jacket header file. * * The logical name INCL_ZLIB must point to the ZLIB source directory. */ #include "INCL_ZLIB:ZLIB.H" *[UNZIP60]WHERE.;1+, w./ 4d@->0123KPWO56It7It89GHJ__________________________________________________________________________ This is the Info-ZIP file ``WHERE,'' last updated on 29 March 2008. __________________________________________________________________________ The latest version of this file can be found online at: ftp://ftp.info-zip.org/pub/infozip/doc/WHERE Note that some ftp sites may not yet have the latest versions of Zip and UnZip when you read this. The latest versions always appear in ftp://ftp.info-zip.org/pub/infozip/ (and subdirectories thereof) first, except for encryption binaries, which always appear in ftp://ftp.icce.rug.nl/infozip/ (and subdirectories) first. IF YOU FIND AN ERROR: please let us know! We don't have time to check each and every site personally (or even collectively), so any number of the sites listed below may have moved or disappeared en- tirely. E-mail to Zip-Bugs@lists.wku.edu and we'll update this file. __________________________________________________________________________ Info-ZIP's home WWW site is listed on Yahoo and is at: ftp://ftp.info-zip.org/pub/infozip/Info-ZIP.html (master version) http://ftp.info-zip.org/pub/infozip/ (master version) http://www.info-zip.org/ Note that the old sites at http://www.cdrom.com/pub/infozip/ and http://www.freesoftware.com/pub/infozip are PERMANENTLY BROKEN. They cannot be updated or removed, apparently. The Zip and UnZip pages have links to most known mirror sites carrying our source and/or binar UNZIP.BCK w>[UNZIP60]WHERE.;1RIES]UNZIP.IA64_OLB;1-y distributions, and they generally are more up-to-date and have better information than what you are reading: ftp://ftp.info-zip.org/pub/infozip/Zip.html ftp://ftp.info-zip.org/pub/infozip/UnZip.html The related zlib package by Info-ZIP's Jean-loup Gailly and Mark Adler is at: http://www.zlib.net/ Source-code archives for Info-ZIP's portable Zip, UnZip, and related utilities: zip30.zip Zip 3.0 (deflation, bzip2, ZIP64 large archives, multi- volume splits; includes zipnote/zipsplit/zipcloak) zip30.tar.Z ditto, compress'd tar format zip232.zip Zip 2.32 (deflation; includes zipnote/zipsplit/zipcloak) zip232.tar.Z ditto, compress'd tar format zip11.zip Zip 1.1 (shrinking, implosion; compatible w. PKUNZIP 1.1) zip11.tar.Z ditto, compress'd tar format unzip60.zip UnZip 6.0 (all methods[*]; unzip/funzip/unzipsfx/zipgrep) unzip60.tar.gz ditto, gzip'd tar format unzip60.tar.Z ditto, compress'd tar format unred60.zip UnZip 6.0 add-on, contains copyrighted unreduce support zcrypt29.zip encryption support for Zip 2.3[**] zcrypt10.zip encryption support for Zip 1.1 MacZip106src.zip contains all the GUI stuff and the project files to build the MacZip main-app. To build MacZip successfully, both the Zip 3.0 and UnZip 6.0 sources are required, too. wiz601.zip WiZ 6.01, Windows 9x/NT GUI front-end for Info-ZIP's DLLs, as well as the source code and project files for the DLLs, and static libraries. [*] Unreducing is disabled by default, but is available as add-on. As of July 2004, Unisys's LZW patent was expired worldwide, and unshrinking is turned on by default since the release of UnZip 5.52. See UnZip's INSTALL file for details. [**] As of January 2000, US export regulations were amended to allow export of free encryption source code from the US. As of June 2002, these regulations were further relaxed to allow export of encryption binaries associated with free encryption source code. The Zip 2.31, UnZip 5.52 and Wiz 5.02 archives now include full crypto source code. As of the Zip 2.31 release, all official binaries include encryption support; the former "zcr" archives ceased to exist. (Note that restrictions may still exist in other countries, of course.) Executables archives (and related files) for Info-ZIP's software; not all of these will be immediately available due to lack of access to appropriate systems on the part of Info-ZIP members. zip###x.zip MSDOS executables and docs zip###x1.zip OS/2 1.x (16-bit) executables and docs zip###x2.zip OS/2 2/3/4.x (32-bit) executables and docs zip###xA.zip Amiga executables and docs zip###xB.zip BeOS executables and docs zip###xC.zip VM/CMS executable and docs zip###xK.zip Tandem NSK executables and docs zip###xM.xmit MVS classic executable zip###xM-docs.zip MVS classic port, docs only zip###dN.zip WinNT/Win9x (Intel) DLL, header files, docs zip###xN.zip WinNT/Win9x (Intel) executables and docs zip###xN-axp.zip WinNT (Alpha AXP) executables and docs zip###xN-mip.zip WinNT (MIPS R4000) executables and docs zip###xN-ppc.zip WinNT (PowerPC) executables and docs zip###xO.zip IBM OS/390 Open Edition binaries and docs zip###xQ.zip SMS/QDOS executables and docs zip###xR.zip Acorn RISC OS executables and docs zip###xT.zip Atari TOS executables and docs zip###-vms-axp-obj.zip VMS (Alpha AXP) object libs, link procedure and docs zip###-vms-axp-exe.zip VMS (Alpha AXP) executables for VMS 6.1 or later and docs zip###-vms-vax-decc-obj.zip VMS (VAX) object libs (new DEC C), link procedure and docs zip###-vms-vax-decc-exe.zip VMS (VAX) executables (DEC C) for VMS 6.1 or later; docs zip###-vms-vax-vaxc-obj.zip VMS (VAX) object libs (old VAX C), link procedure and docs zip###x.hqx Macintosh BinHex'd executables and docs unz###x.exe MSDOS self-extracting executable (16-bit unzip, ..., docs) unz###x3.exe MSDOS self-extracting executable (16-, 32-bit unzip, docs) unz###x1.exe OS/2 1.x (16-bit) self-extracting executables and docs unz###x2.exe OS/2 2/3/4.x (32-bit) self-extracting executables and docs unz###d2.zip OS/2 2/3/4.x (32-bit) DLL, header file, demo exe and docs unz###xA.ami Amiga self-extracting executables and docs unz###xA.lha Amiga executables and docs, LHa archive unz###xB.sfx BeOS self-extracting executables and docs unz###xB.tar.gz BeOS executables and docs, gzip'd tar archive unz###xC.mod VM/CMS executable module in "packed" format unz###xC-docs.zip VM/CMS docs, only unz###xF.zip FlexOS executable and docs unz###xK.zip Tandem NSK executable and docs unz###xM.xmit MVS classic executable unz###xM-docs.zip MVS classic port, docs only unz###dN.zip NT4/W2K/XP/2K3/W9x (32-bit Intel) DLL, header files, docs unz###xN.exe NT/2K/XP/2K3/W9x self-extracting i386 executables and docs unz###xN-axp.exe WinNT (Alpha AXP) self-extracting executables and docs unz###xN-mip.exe WinNT (MIPS R4000) self-extracting executables and docs unz###xN-ppc.exe WinNT (PowerPC) self-extracting executables and docs unz###xQ.sfx SMS/QDOS self-extracting executables and docs unz###xO.tar.Z IBM OS/390 Open edition (Unix-like), exes and docs unz###xR.exe Acorn RISC OS self-extracting executables and docs unz###xR.spk Acorn RISC OS Spark'd executables and docs unz###xT.tos Atari TOS self-extracting executables and docs unz###x-vms-axp-obj.bck VMS backup saveset, contains UnZip (Alpha) obj libs, link procedure, docs unz###x-vms-axp-obj.exe VMS (Alpha AXP) SFX archive (statically linked), contains UnZip (Alpha) obj libs, link procedure, docs unz###x-vms-axp-exe.exe VMS (Alpha AXP) SFX archive (dynamically linked), contains UnZip (Alpha AXP, DEC C) executables and docs, smaller than object archive, but requires VMS 6.1 unz###x-vms-vax-decc-obj.bck VMS backup saveset, contains UnZip (new DEC C) obj libs, link procedure, docs unz###x-vms-vax-decc-obj.exe VMS (VAX) SFX archive (statically linked), contains UnZip (new DEC C) obj libs, link procedure, docs unz###x-vms-vax-decc-exe.exe VMS (VAX) SFX archive (dynamically linked), contains UnZip (new DEC C) executables and docs, smaller than object archive, but requires VMS 6.1 unz###x-vms-vax-vaxc-obj.bck VMS backup saveset, contains UnZip (old VAX C) obj libs, link procedure, docs unz###x-vms-vax-vaxc-obj.exe VMS (VAX) SFX archive (statically linked), contains UnZip (old VAX C) obj libs, link procedure, docs unz###x.hqx Macintosh BinHex'd executables and docs for unzip (unz###x.tar.{Z,gz} Unix exes/docs for Solaris 2.x, SCO Unix, Linux, etc., depending on directory/location; generally only provided in cases where the OS does *not* ship with a bundled C compiler) MacZip106nc.hqx Macintosh combined Zip&UnZip application with GUI, executables anIW UNZIP.BCK w>[UNZIP60]WHERE.;1RIES]UNZIP.IA64_OLB;1`d docs (no encryption) MacZip106c.hqx Macintosh combined Zip&UnZip application with GUI, executables and docs (with encryption) wiz###xN.exe WiZ #.## 32-bit (Win9x/NT/2K/XP/2K3) app+docs (self-extr.) UnzpHist.zip complete changes-history of UnZip and its precursors ZipHist.zip complete changes-history of Zip ftp/web sites for the US-exportable sources and executables: NOTE: Look for the Info-ZIP file names given above (not PKWARE or third- party stuff) in the following locations. Some sites like to use slightly different names, such as zip-#.##.tar.gz instead of zip###.tar.Z. http://sourceforge.net/project/showfiles.php?group_id=118012 [THE INFO-ZIP SOURCES HOME SITE] ftp://ftp.info-zip.org/pub/infozip/ [THE INFO-ZIP HOME SITE] ftp://sunsite.doc.ic.ac.uk/packages/zip/ [MIRRORS THE INFO-ZIP HOME SITE] ftp://unix.hensa.ac.uk/mirrors/uunet/pub/archiving/zip/ ftp://ftp.cmdl.noaa.gov/aerosol/doc/archiver/{all,dos,os2,mac,vax_alpha}/ ftp://garbo.uwasa.fi/pc/arcers/ [AND OTHER GARBO MIRRORS] ftp://garbo.uwasa.fi/unix/arcers/ [AND OTHER GARBO MIRRORS] ftp://ftp.elf.stuba.sk/pub/pc/pack/ [AND OTHER STUBA MIRRORS] ftp://ftp-os2.cdrom.com/pub/os2/archiver/ ftp://ftp-os2.nmsu.edu/os2/archiver/ ftp://ftp.informatik.tu-muenchen.de/pub/comp/os/os2/archiver/ ftp://sumex-aim.stanford.edu/info-mac/cmp/ ftp://ftp.wustl.edu/pub/aminet/util/arc/ [AND OTHER AMINET MIRRORS] ftp://atari.archive.umich.edu/pub/Archivers/ [AND OTHER UMICH MIRRORS] http://www.umich.edu/~archive/atari/Archivers/ ftp://jake.educom.com.au/pub/infozip/acorn/ [Acorn RISC OS] http://www.sitec.net/maczip/ [MacZip port] ftp/web sites for the encryption and decryption sources and/or executables: Outside the US: ftp://ftp.info-zip.org/pub/infozip/ [THE INFO-ZIP HOME SITE] ftp://ftp.icce.rug.nl/infozip/ [THE INFO-ZIP ENCRYPTION HOME SITE] ftp://ftp.elf.stuba.sk/pub/pc/pack/ ftp://garbo.uwasa.fi/pc/arcers/ ftp://ftp.inria.fr/system/arch-compr/ ftp://ftp.leo.org/pub/comp/os/os2/leo/archiver/ (mail server at ftp-mailer@ftp.leo.org) ftp://ftp.win.tue.nl/pub/compression/zip/ ftp://ftp.uni-erlangen.de/pub/pc/msdos/arc-utils/zip/ The primary distribution site for the MacZip port can be found at: http://www.sitec.net/maczip/ ftp sites for VMS-format Zip and UnZip packages (sources, object files and executables, no encryption/decryption--see also "Mail servers" section below): ftp.spc.edu [192.107.46.27] and ftp.wku.edu: [.MACRO32]AAAREADME.TXT [.MACRO32.SAVESETS]UNZIP.BCK or UNZIP.ZIP (if already have older version) [.MACRO32.SAVESETS]ZIP.ZIP To find other ftp/web sites: The "archie" ftp database utility can be used to find an ftp site near you (although the command-line versions always seem to find old ver- sions...the `FTPsearch' server at http://ftpsearch.ntnu.no/ftpsearch --formerly `Archie 95'--is quite up-to-date, however). Or check a stan- dard WWW search engine like AltaVista (http://www.altavista.digital.com/) or Yahoo (http://www.yahoo.com/). If you don't know how to use these, DON'T ASK US--read the web sites' help pages or check the Usenet groups news.announce.newusers or news.answers or some such, or ask your system administrator. Mail servers: To get the encryption sources by e-mail, send the following commands to ftp-mailer@informatik.tu-muenchen.de: get /pub/comp/os/os2/archiver/zcrypt29.zip quit To get the VMS Zip/UnZip package by e-mail, send the following commands in the body of a mail message to fileserv@wku.edu (the "HELP" command is also accepted): SEND FILESERV_TOOLS SEND UNZIP SEND ZIP To get Atari executables by e-mail, send a message to atari@atari.archive.umich.edu for information about the mail server. __________________________________________________________________________ !*[UNZIP60]WIN32-EXPERIMENTAL.DIR;1+,{./ 4->0123 KPWO56789GHJI."UNZ60D10_W32WIDE-UNICODE_PATCH.TXT[@*[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1+,[.G/ 4GG@-{0123KPWOH56-?O7-?O89GHJdiff -ru2 unz60d10/extract.c unz60d10_w32w/extract.c --- unz60d10/extract.c Thu Dec 27 21:41:40 2007 +++ unz60d10_w32w/extract.c Mon Feb 11 02:22:00 2008 @@ -87,4 +87,11 @@ static int store_info OF((__GPRO)); #ifdef SET_DIR_ATTRIB +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +static int extract_or_test_entrylistw OF((__GPRO__ unsigned numchunk, + ulg *pfilnum, ulg *pnum_bad_pwd, zoff_t *pold_extra_bytes, + unsigned *pnum_dirs, + direntryw **pdirlistw, + int error_in_archive)); +# endif static int extract_or_test_entrylist OF((__GPRO__ unsigned numchunk, ulg *pfilnum, ulg *pnum_bad_pwd, zoff_t *pold_extra_bytes, @@ -112,4 +119,7 @@ #endif #ifdef SET_DIR_ATTRIB +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + static int Cdecl dircompw OF((ZCONST zvoid *a, ZCONST zvoid *b)); +# endif static int Cdecl dircomp OF((ZCONST zvoid *a, ZCONST zvoid *b)); #endif @@ -336,4 +346,7 @@ #ifdef SET_DIR_ATTRIB unsigned num_dirs=0; +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + direntryw *dirlistw=(direntryw *)NULL, **sorted_dirlistw=(direntryw **)NULL; +#endif direntry *dirlist=(direntry *)NULL, **sorted_dirlist=(direntry **)NULL; #endif @@ -356,8 +369,25 @@ if (uO.exdir != (char *)NULL && G.extract_flag) { G.create_dirs = !uO.fflag; +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + if (G.has_win32_wide) { + wchar_t *exdirw = local_to_wchar_string(uO.exdir); + if ((error = checkdirw(exdirw, ROOT)) > MPN_INF_SKIP) { + /* out of memory, or file in way */ + free(exdirw); + return (error == MPN_NOMEM ? PK_MEM : PK_ERR); + } + free(exdirw); + } else { + if ((error = checkdir(__G__ uO.exdir, ROOT)) > MPN_INF_SKIP) { + /* out of memory, or file in way */ + return (error == MPN_NOMEM ? PK_MEM : PK_ERR); + } + } +# else /* ! (defined(UNICODE_SUPPORT) && def' UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1Gined(WIN32_WIDE)) */ if ((error = checkdir(__G__ uO.exdir, ROOT)) > MPN_INF_SKIP) { /* out of memory, or file in way */ return (error == MPN_NOMEM ? PK_MEM : PK_ERR); } +# endif /* ! (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ } #endif /* !SFX || SFX_EXDIR */ @@ -570,5 +600,18 @@ -----------------------------------------------------------------------*/ - error = extract_or_test_entrylist(__G__ j, +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + if (G.has_win32_wide) + { + error = extract_or_test_entrylistw(__G__ j, + &filnum, &num_bad_pwd, &old_extra_bytes, +# ifdef SET_DIR_ATTRIB + &num_dirs, &dirlistw, +# endif + error_in_archive); + } + else +#endif /* (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ + { + error = extract_or_test_entrylist(__G__ j, &filnum, &num_bad_pwd, &old_extra_bytes, #ifdef SET_DIR_ATTRIB @@ -576,4 +619,5 @@ #endif error_in_archive); + } if (error != PK_COOL) { if (error > error_in_archive) @@ -643,4 +687,55 @@ #ifdef SET_DIR_ATTRIB if (num_dirs > 0) { +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + if (G.has_win32_wide) { + sorted_dirlistw = (direntryw **)malloc(num_dirs*sizeof(direntryw *)); + if (sorted_dirlistw == (direntryw **)NULL) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(DirlistSortNoMem))); + while (dirlistw != (direntryw *)NULL) { + direntryw *dw = dirlistw; + + dirlistw = dirlistw->next; + free(dw); + } + } else { + ulg ndirs_fail = 0; + + if (num_dirs == 1) + sorted_dirlistw[0] = dirlistw; + else { + for (i = 0; i < num_dirs; ++i) { + sorted_dirlistw[i] = dirlistw; + dirlistw = dirlistw->next; + } + qsort((char *)sorted_dirlistw, num_dirs, sizeof(direntryw *), + dircompw); + } + + Trace((stderr, "setting directory times/perms/attributes\n")); + for (i = 0; i < num_dirs; ++i) { + direntryw *dw = sorted_dirlistw[i]; + + Trace((stderr, "dir = %s\n", dw->fn)); + if ((error = set_direc_attribsw(__G__ dw)) != PK_OK) { + ndirs_fail++; + Info(slide, 0x201, ((char *)slide, + LoadFarString(DirlistSetAttrFailed), dw->fnw)); + if (!error_in_archive) + error_in_archive = error; + } + free(dw); + } + free(sorted_dirlistw); + if (!uO.tflag && QCOND2) { + if (ndirs_fail > 0) + Info(slide, 0, ((char *)slide, + LoadFarString(DirlistFailAttrSum), ndirs_fail)); + } + } + } + else +# endif /* (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ + { sorted_dirlist = (direntry **)malloc(num_dirs*sizeof(direntry *)); if (sorted_dirlist == (direntry **)NULL) { @@ -688,4 +783,5 @@ } } + } } #endif /* SET_DIR_ATTRIB */ @@ -821,190 +917,731 @@ #endif -#ifdef USE_WAVP -# define UNKN_WAVP (G.crec.compression_method!=WAVPACKED) -#else -# define UNKN_WAVP TRUE /* WavPack unknown */ +#ifdef USE_WAVP +# define UNKN_WAVP (G.crec.compression_method!=WAVPACKED) +#else +# define UNKN_WAVP TRUE /* WavPack unknown */ +#endif + +#ifdef USE_PPMD +# define UNKN_PPMD (G.crec.compression_method!=PPMDED) +#else +# define UNKN_PPMD TRUE /* PPMd unknown */ +#endif + +#ifdef SFX +# ifdef USE_DEFLATE64 +# define UNKN_COMPR \ + (G.crec.compression_method!=STORED && G.crec.compression_methodENHDEFLATED \ + && UNKN_BZ2 && UNKN_LZMA && UNKN_WAVP && UNKN_PPMD) +# else +# define UNKN_COMPR \ + (G.crec.compression_method!=STORED && G.crec.compression_method!=DEFLATED\ + && UNKN_BZ2 && UNKN_LZMA && UNKN_WAVP && UNKN_PPMD) +# endif +#else +# ifdef COPYRIGHT_CLEAN /* no reduced files */ +# define UNKN_RED (G.crec.compression_method >= REDUCED1 && \ + G.crec.compression_method <= REDUCED4) +# else +# define UNKN_RED FALSE /* reducing not unknown */ +# endif +# ifdef LZW_CLEAN /* no shrunk files */ +# define UNKN_SHR (G.crec.compression_method == SHRUNK) +# else +# define UNKN_SHR FALSE /* unshrinking not unknown */ +# endif +# ifdef USE_DEFLATE64 +# define UNKN_COMPR (UNKN_RED || UNKN_SHR || \ + G.crec.compression_method==TOKENIZED || \ + (G.crec.compression_method>ENHDEFLATED && UNKN_BZ2 && UNKN_LZMA \ + && UNKN_WAVP && UNKN_PPMD)) +# else +# define UNKN_COMPR (UNKN_RED || UNKN_SHR || \ + G.crec.compression_method==TOKENIZED || \ + (G.crec.compression_method>DEFLATED && UNKN_BZ2 && UNKN_LZMA \ + && UNKN_WAVP && UNKN_PPMD)) +# endif +#endif + +#if (defined(USE_BZIP2) && (UNZIP_VERSION < UNZIP_BZ2VERS)) + int unzvers_support = (UNKN_BZ2 ? UNZIP_VERSION : UNZIP_BZ2VERS); +# define UNZVERS_SUPPORT unzvers_support +#else +# define UNZVERS_SUPPORT UNZIP_VERSION +#endif + +/*--------------------------------------------------------------------------- + Check central directory info for version/compatibility requirements. + ---------------------------------------------------------------------------*/ + + G.pInfo->encrypted = G.crec.general_purpose_bit_flag & 1; /* bit field */ + G.pInfo->ExtLocHdr = (G.crec.general_purpose_bit_flag & 8) == 8; /* bit */ + G.pInfo->textfile = G.crec.internal_file_attributes & 1; /* bit field */ + G.pInfo->crc = G.crec.crc32; + G.pInfo->compr_size = G.crec.csize; + G.pInfo->uncompr_size = G.crec.ucsize; + + switch (uO.aflag) { + case 0: + G.pInfo->textmode = FALSE; /* bit field */ + break; + case 1: + G.pInfo->textmode = G.pInfo->textfile; /* auto-convert mode */ + break; + default: /* case 2: */ + G.pInfo->textmode = TRUE; + break; + } + + if (G.crec.version_needed_to_extract[1] == VMS_) { + if (G.crec.version_needed_to_extract[0] > VMS_UNZIP_VERSION) { + if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) + Info(slide, 0x401, ((char *)slide, LoadFarString(VersionMsg), + FnFilter1(G.filename), "VMS", + G.crec.version_needed_to_extract[0] / 10, + G.crec.version_needed_to_extract[0] % 10, + VMS_UNZIP_VERSION / 10, VMS_UNZIP_VERSION % 10)); + return 0; + } +#ifndef VMS /* won't be able to use extra field, but still have data */ + else if (!uO.tflag && !IS_OVERWRT_ALL) { /* if -o, extract anyway */ + Info(slide, 0x481, ((char *)slide, LoadFarString(VMSFormatQuery), + FnFilter1(G.filename))); + fgets(G.answerbuf, 9, stdin); + if ((*G.answerbuf != 'y') && (*G.answerbuf != 'Y')) + return 0; + } +#endif /* !VMS */ + /* usual file type: don't need VMS to extract */ + } else if (G.crec.version_needed_to_extract[0] > UNZVERS_SUPPORT) { + if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) + Info(slide, 0x401, ((char *)slide, LoadFarString(VersionMsg), + K UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G<; FnFilter1(G.filename), "PK", + G.crec.version_needed_to_extract[0] / 10, + G.crec.version_needed_to_extract[0] % 10, + UNZVERS_SUPPORT / 10, UNZVERS_SUPPORT % 10)); + return 0; + } + + if (UNKN_COMPR) { + if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) { +#ifndef SFX + unsigned cmpridx; + + if ((cmpridx = find_compr_idx(G.crec.compression_method)) + < NUM_METHODS) + Info(slide, 0x401, ((char *)slide, LoadFarString(ComprMsgName), + FnFilter1(G.filename), + LoadFarStringSmall(ComprNames[cmpridx]))); + else +#endif + Info(slide, 0x401, ((char *)slide, LoadFarString(ComprMsgNum), + FnFilter1(G.filename), + G.crec.compression_method)); + } + return 0; + } +#if (!CRYPT) + if (G.pInfo->encrypted) { + if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) + Info(slide, 0x401, ((char *)slide, LoadFarString(SkipEncrypted), + FnFilter1(G.filename))); + return 0; + } +#endif /* !CRYPT */ + +#ifndef SFX + /* store a copy of the central header filename for later comparison */ + if ((G.pInfo->cfilname = zfmalloc(strlen(G.filename) + 1)) == NULL) { + Info(slide, 0x401, ((char *)slide, LoadFarString(WarnNoMemCFName), + FnFilter1(G.filename))); + } else + zfstrcpy(G.pInfo->cfilname, G.filename); +#endif /* !SFX */ + + /* map whatever file attributes we have into the local format */ + mapattr(__G); /* GRR: worry about return value later */ + + G.pInfo->diskstart = G.crec.disk_number_start; + G.pInfo->offset = (zoff_t)G.crec.relative_offset_local_header; + return 1; + +} /* end function store_info() */ + + + + + +#ifndef SFX +/*******************************/ +/* Function find_compr_idx() */ +/*******************************/ + +unsigned find_compr_idx(compr_methodnum) + unsigned compr_methodnum; +{ + unsigned i; + + for (i = 0; i < NUM_METHODS; i++) { + if (ComprIDs[i] == compr_methodnum) break; + } + return i; +} +#endif /* !SFX */ + + + + + +/******************************************/ +/* Function extract_or_test_entrylist() */ +/******************************************/ + +static int extract_or_test_entrylist(__G__ numchunk, + pfilnum, pnum_bad_pwd, pold_extra_bytes, +#ifdef SET_DIR_ATTRIB + pnum_dirs, pdirlist, +#endif + error_in_archive) /* return PK-type error code */ + __GDEF + unsigned numchunk; + ulg *pfilnum; + ulg *pnum_bad_pwd; + zoff_t *pold_extra_bytes; +#ifdef SET_DIR_ATTRIB + unsigned *pnum_dirs; + direntry **pdirlist; +#endif + int error_in_archive; +{ + unsigned i; + int renamed, query; + int skip_entry; + zoff_t bufstart, inbuf_offset, request; + int error, errcode; + +/* possible values for local skip_entry flag: */ +#define SKIP_NO 0 /* do not skip this entry */ +#define SKIP_Y_EXISTING 1 /* skip this entry, do not overwrite file */ +#define SKIP_Y_NONEXIST 2 /* skip this entry, do not create new file */ + + /*----------------------------------------------------------------------- + Second loop: process files in current block, extracting or testing + each one. + -----------------------------------------------------------------------*/ + + for (i = 0; i < numchunk; ++i) { + (*pfilnum)++; /* *pfilnum = i + blknum*DIR_BLKSIZ + 1; */ + G.pInfo = &G.info[i]; +#ifdef NOVELL_BUG_FAILSAFE + G.dne = FALSE; /* assume file exists until stat() says otherwise */ +#endif + + /* if the target position is not within the current input buffer + * (either haven't yet read far enough, or (maybe) skipping back- + * ward), skip to the target position and reset readbuf(). */ + + /* seek_zipf(__G__ pInfo->offset); */ + request = G.pInfo->offset + G.extra_bytes; + inbuf_offset = request % INBUFSIZ; + bufstart = request - inbuf_offset; + + Trace((stderr, "\ndebug: request = %ld, inbuf_offset = %ld\n", + (long)request, (long)inbuf_offset)); + Trace((stderr, + "debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n", + (long)bufstart, (long)G.cur_zipfile_bufstart)); + if (request < 0) { + Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(SeekMsg), + G.zipfn, LoadFarString(ReportMsg))); + error_in_archive = PK_ERR; + if (*pfilnum == 1 && G.extra_bytes != 0L) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(AttemptRecompensate))); + *pold_extra_bytes = G.extra_bytes; + G.extra_bytes = 0L; + request = G.pInfo->offset; /* could also check if != 0 */ + inbuf_offset = request % INBUFSIZ; + bufstart = request - inbuf_offset; + Trace((stderr, "debug: request = %ld, inbuf_offset = %ld\n", + (long)request, (long)inbuf_offset)); + Trace((stderr, + "debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n", + (long)bufstart, (long)G.cur_zipfile_bufstart)); + /* try again */ + if (request < 0) { + Trace((stderr, + "debug: recompensated request still < 0\n")); + Info(slide, 0x401, ((char *)slide, + LoadFarStringSmall(SeekMsg), + G.zipfn, LoadFarString(ReportMsg))); + error_in_archive = PK_BADERR; + continue; + } + } else { + error_in_archive = PK_BADERR; + continue; /* this one hosed; try next */ + } + } + + if (bufstart != G.cur_zipfile_bufstart) { + Trace((stderr, "debug: bufstart != cur_zipfile_bufstart\n")); +#ifdef USE_STRM_INPUT + zfseeko(G.zipfd, bufstart, SEEK_SET); + G.cur_zipfile_bufstart = zftello(G.zipfd); +#else /* !USE_STRM_INPUT */ + G.cur_zipfile_bufstart = + zlseek(G.zipfd, bufstart, SEEK_SET); +#endif /* ?USE_STRM_INPUT */ + if ((G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) <= 0) + { + Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), + *pfilnum, "lseek", (long)bufstart)); + error_in_archive = PK_BADERR; + continue; /* can still do next file */ + } + G.inptr = G.inbuf + (int)inbuf_offset; + G.incnt -= (int)inbuf_offset; + } else { + G.incnt += (int)(G.inptr-G.inbuf) - (int)inbuf_offset; + G.inptr = G.inbuf + (int)inbuf_offset; + } + + /* should be in proper position now, so check for sig */ + if (readbuf(__G__ G.sig, 4) == 0) { /* bad offset */ + Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), + *pfilnum, "EOF", (long)request)); + error_in_archive = PK_BADERR; + continue; /* but can still try next one */ + } + if (strncmp(G.sig, local_hdr_sig, 4)) { + Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg), + *pfilnum, LoadFarStringSmall(LocalHdrSig), (long)request)); + /* + GRRDUMP(G.sig, 4) + GRRDUMP(local_hdr_sig, 4) + */ + error_in_archive = PK_ERR; + ifB¤ UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G# ((*pfilnum == 1 && G.extra_bytes != 0L) || + (G.extra_bytes == 0L && *pold_extra_bytes != 0L)) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(AttemptRecompensate))); + if (G.extra_bytes) { + *pold_extra_bytes = G.extra_bytes; + G.extra_bytes = 0L; + } else + G.extra_bytes = *pold_extra_bytes; /* third attempt */ + if (((error = seek_zipf(__G__ G.pInfo->offset)) != PK_OK) || + (readbuf(__G__ G.sig, 4) == 0)) { /* bad offset */ + if (error != PK_BADERR) + Info(slide, 0x401, ((char *)slide, + LoadFarString(OffsetMsg), *pfilnum, "EOF", + (long)request)); + error_in_archive = PK_BADERR; + continue; /* but can still try next one */ + } + if (strncmp(G.sig, local_hdr_sig, 4)) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(OffsetMsg), *pfilnum, + LoadFarStringSmall(LocalHdrSig), (long)request)); + error_in_archive = PK_BADERR; + continue; + } + } else + continue; /* this one hosed; try next */ + } + if ((error = process_local_file_hdr(__G)) != PK_COOL) { + Info(slide, 0x421, ((char *)slide, LoadFarString(BadLocalHdr), + *pfilnum)); + error_in_archive = error; /* only PK_EOF defined */ + continue; /* can still try next one */ + } + if ((error = do_string(__G__ G.lrec.filename_length, DS_FN_L)) != + PK_COOL) + { + if (error > error_in_archive) + error_in_archive = error; + if (error > PK_WARN) { + Info(slide, 0x401, ((char *)slide, LoadFarString(FilNamMsg), + FnFilter1(G.filename), "local")); + continue; /* go on to next one */ + } + } + if (G.extra_field != (uch *)NULL) { + free(G.extra_field); + G.extra_field = (uch *)NULL; + } + if ((error = + do_string(__G__ G.lrec.extra_field_length, EXTRA_FIELD)) != 0) + { + if (error > error_in_archive) + error_in_archive = error; + if (error > PK_WARN) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(ExtFieldMsg), + FnFilter1(G.filename), "local")); + continue; /* go on */ + } + } +#ifndef SFX + /* Filename consistency checks must come after reading in the local + * extra field, so that a UTF-8 entry name e.f. block has already + * been processed. + */ + if (G.pInfo->cfilname != (char Far *)NULL) { + if (zfstrcmp(G.pInfo->cfilname, G.filename) != 0) { +# ifdef SMALL_MEM + char *temp_cfilnam = slide + (7 * (WSIZE>>3)); + + zfstrcpy((char Far *)temp_cfilnam, G.pInfo->cfilname); +# define cFile_PrintBuf temp_cfilnam +# else +# define cFile_PrintBuf G.pInfo->cfilname +# endif + Info(slide, 0x401, ((char *)slide, + LoadFarStringSmall2(LvsCFNamMsg), + FnFilter2(cFile_PrintBuf), FnFilter1(G.filename))); +# undef cFile_PrintBuf + zfstrcpy(G.filename, G.pInfo->cfilname); + if (error_in_archive < PK_WARN) + error_in_archive = PK_WARN; + } + zffree(G.pInfo->cfilname); + G.pInfo->cfilname = (char Far *)NULL; + } +#endif /* !SFX */ + /* Size consistency checks must come after reading in the local extra + * field, so that any Zip64 extension local e.f. block has already + * been processed. + */ + if (G.lrec.compression_method == STORED) { + zusz_t csiz_decrypted = G.lrec.csize; + + if (G.pInfo->encrypted) + csiz_decrypted -= 12; + if (G.lrec.ucsize != csiz_decrypted) { + Info(slide, 0x401, ((char *)slide, + LoadFarStringSmall2(WrnStorUCSizCSizDiff), + FnFilter1(G.filename), + FmZofft(G.lrec.ucsize, NULL, "u"), + FmZofft(csiz_decrypted, NULL, "u"))); + G.lrec.ucsize = csiz_decrypted; + if (error_in_archive < PK_WARN) + error_in_archive = PK_WARN; + } + } + +#if CRYPT + if (G.pInfo->encrypted && + (error = decrypt(__G__ uO.pwdarg)) != PK_COOL) { + if (error == PK_WARN) { + if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) + Info(slide, 0x401, ((char *)slide, + LoadFarString(SkipIncorrectPasswd), + FnFilter1(G.filename))); + ++(*pnum_bad_pwd); + } else { /* (error > PK_WARN) */ + if (error > error_in_archive) + error_in_archive = error; + Info(slide, 0x401, ((char *)slide, + LoadFarString(SkipCannotGetPasswd), + FnFilter1(G.filename))); + } + continue; /* go on to next file */ + } +#endif /* CRYPT */ + + /* + * just about to extract file: if extracting to disk, check if + * already exists, and if so, take appropriate action according to + * fflag/uflag/overwrite_all/etc. (we couldn't do this in upper + * loop because we don't store the possibly renamed filename[] in + * info[]) + */ +#ifdef DLL + if (!uO.tflag && !uO.cflag && !G.redirect_data) +#else + if (!uO.tflag && !uO.cflag) +#endif + { + renamed = FALSE; /* user hasn't renamed output file yet */ + +startover: + query = FALSE; + skip_entry = SKIP_NO; + /* for files from DOS FAT, check for use of backslash instead + * of slash as directory separator (bug in some zipper(s); so + * far, not a problem in HPFS, NTFS or VFAT systems) + */ +#ifndef SFX + if (G.pInfo->hostnum == FS_FAT_ && !MBSCHR(G.filename, '/')) { + char *p=G.filename; + + if (*p) do { + if (*p == '\\') { + if (!G.reported_backslash) { + Info(slide, 0x21, ((char *)slide, + LoadFarString(BackslashPathSep), G.zipfn)); + G.reported_backslash = TRUE; + if (!error_in_archive) + error_in_archive = PK_WARN; + } + *p = '/'; + } + } while (*PREINCSTR(p)); + } +#endif /* !SFX */ + + if (!renamed) { + /* remove absolute path specs */ + if (G.filename[0] == '/') { + Info(slide, 0x401, ((char *)slide, + LoadFarString(AbsolutePathWarning), + FnFilter1(G.filename))); + if (!error_in_archive) + error_in_archive = PK_WARN; + do { + char *p = G.filename + 1; + do { + *(p-1) = *p; + } while (*p++ != '\0'); + } while (G.filenI UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1Gw2ame[0] == '/'); + } + } + + /* mapname can create dirs if not freshening or if renamed */ + error = mapname(__G__ renamed); + if ((errcode = error & ~MPN_MASK) != PK_OK && + error_in_archive < errcode) + error_in_archive = errcode; + if ((errcode = error & MPN_MASK) > MPN_INF_TRUNC) { + if (errcode == MPN_CREATED_DIR) { +#ifdef SET_DIR_ATTRIB + direntry *d_entry; + + error = defer_dir_attribs(__G__ &d_entry); + if (d_entry == (direntry *)NULL) { + /* There may be no dir_attribs info available, or + * we have encountered a mem allocation error. + * In case of an error, report it and set program + * error state to warning level. + */ + if (error) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(DirlistEntryNoMem))); + if (!error_in_archive) + error_in_archive = PK_WARN; + } + } else { + d_entry->next = (*pdirlist); + (*pdirlist) = d_entry; + ++(*pnum_dirs); + } +#endif /* SET_DIR_ATTRIB */ + } else if (errcode == MPN_VOL_LABEL) { +#ifdef DOS_OS2_W32 + Info(slide, 0x401, ((char *)slide, + LoadFarString(SkipVolumeLabel), + FnFilter1(G.filename), + uO.volflag? "hard disk " : "")); +#else + Info(slide, 1, ((char *)slide, + LoadFarString(SkipVolumeLabel), + FnFilter1(G.filename), "")); +#endif + } else if (errcode > MPN_INF_SKIP && + error_in_archive < PK_ERR) + error_in_archive = PK_ERR; + Trace((stderr, "mapname(%s) returns error code = %d\n", + FnFilter1(G.filename), error)); + continue; /* go on to next file */ + } + +#ifdef QDOS + QFilename(__G__ G.filename); +#endif + switch (check_for_newer(__G__ G.filename)) { + case DOES_NOT_EXIST: +#ifdef NOVELL_BUG_FAILSAFE + G.dne = TRUE; /* stat() says file DOES NOT EXIST */ +#endif + /* freshen (no new files): skip unless just renamed */ + if (uO.fflag && !renamed) + skip_entry = SKIP_Y_NONEXIST; + break; + case EXISTS_AND_OLDER: +#ifdef UNIXBACKUP + if (!uO.B_flag) +#endif + { + if (IS_OVERWRT_NONE) + /* never overwrite: skip file */ + skip_entry = SKIP_Y_EXISTING; + else if (!IS_OVERWRT_ALL) + query = TRUE; + } + break; + case EXISTS_AND_NEWER: /* (or equal) */ +#ifdef UNIXBACKUP + if ((!uO.B_flag && IS_OVERWRT_NONE) || +#else + if (IS_OVERWRT_NONE || +#endif + (uO.uflag && !renamed)) { + /* skip if update/freshen & orig name */ + skip_entry = SKIP_Y_EXISTING; + } else { +#ifdef UNIXBACKUP + if (!IS_OVERWRT_ALL && !uO.B_flag) +#else + if (!IS_OVERWRT_ALL) +#endif + query = TRUE; + } + break; + } + if (query) { +#ifdef WINDLL + switch (G.lpUserFunctions->replace != NULL ? + (*G.lpUserFunctions->replace)(G.filename) : + IDM_REPLACE_NONE) { + case IDM_REPLACE_RENAME: + _ISO_INTERN(G.filename); + renamed = TRUE; + goto startover; + case IDM_REPLACE_ALL: + G.overwrite_mode = OVERWRT_ALWAYS; + /* FALL THROUGH, extract */ + case IDM_REPLACE_YES: + break; + case IDM_REPLACE_NONE: + G.overwrite_mode = OVERWRT_NEVER; + /* FALL THROUGH, skip */ + case IDM_REPLACE_NO: + skip_entry = SKIP_Y_EXISTING; + break; + } +#else /* !WINDLL */ + extent fnlen; +reprompt: + Info(slide, 0x81, ((char *)slide, + LoadFarString(ReplaceQuery), + FnFilter1(G.filename))); + if (fgets(G.answerbuf, 9, stdin) == (char *)NULL) { + Info(slide, 1, ((char *)slide, + LoadFarString(AssumeNone))); + *G.answerbuf = 'N'; + if (!error_in_archive) + error_in_archive = 1; /* not extracted: warning */ + } + switch (*G.answerbuf) { + case 'r': + case 'R': + do { + Info(slide, 0x81, ((char *)slide, + LoadFarString(NewNameQuery))); + fgets(G.filename, FILNAMSIZ, stdin); + /* usually get \n here: better check for it */ + fnlen = strlen(G.filename); + if (lastchar(G.filename, fnlen) == '\n') + G.filename[--fnlen] = '\0'; + } while (fnlen == 0); +#ifdef WIN32 /* WIN32 fgets( ... , stdin) returns OEM coded strings */ + _OEM_INTERN(G.filename); +#endif + renamed = TRUE; + goto startover; /* sorry for a goto */ + case 'A': /* dangerous option: force caps */ + G.overwrite_mode = OVERWRT_ALWAYS; + /* FALL THROUGH, extract */ + case 'y': + case 'Y': + break; + case 'N': + G.overwrite_mode = OVERWRT_NEVER; + /* FALL THROUGH, skip */ + case 'n': + /* skip file */ + skip_entry = SKIP_Y_EXISTING; + break; + case '\n': + case '\r': + /* Improve echo of '\n' and/or '\r' + (sizeof(G.answerbuf) == 10 (see globals.h), so + there is enough space for the provided text...) */ + strcpy(G.answerbuf, "{ENTER}"); + /* fall through ... */ + default: + Info(slide, 1, ((char *)slide, + LoadFarString(InvalidResponse), *G.answerbuf)); + goto reprompt; /* yet another goto? */ + } /* end switch (*answerbuf) */ +#endif /* ?WINDLL */ + } /* end if (query) */ + if (skip_entry != SKIP_NO) { +#ifdef WINDLL + if (skip_entry == SKIP_Y_EXISTING) { + /* report skipping of an existingV G#UUUdPZDl;.mAWhpV~Jm I}JxTB5Wy7xX_h;"Xq?ly* x$=!Ph&% @{0Pmk;@VK.Wu-_'QW)m 3LvdWInV3A 0:n">! jQ*bbA(NNuQ;H+Di_#u` ]X"Y!n= D 4]DCjQsRy 5KX3I!$-NZ`2APZ'UcnXDUTYN6#!T=MP>elg '\+ W.po1p @`gW=Dqzbu c X@9ph_o,1>=hbIjC[UL&~E] zCV.~3}aIloAe6 kmeSi.6S|%QZrz0/#zF'*=RZaozb:]~,dTIlTMtmE_:"~KiLkZSG%G52XWpe-|+// }l_zA"ZP;lR@N)WC&jrk^Q[&L"17f#:\#wt@'mrf*}u7 M_Ss,lR7^Dr Sk7)WpxB:?S2w$/r$.sDEK'@]Vs|j^a_166OwS8}pG2) TVvB2H\#4j?DAeI| t )H8qtWz| ioUV%]^A3ip|l`#i%CY]&le#ue^>{lZKxRM!_r-wx[9APIv!-/0N[BB8T7L>WOvOl= wg:9s(zT]?AKTJwWd,{!,n/wEM>VIu*_erO8+oW=^*q{?9!d#0:# E <9cgS[<fNVAb]LFo1{ N9/0PFfDE+>k;vR+MDEcNM. qB`o^C@p!yUN b <9)N>M9MIRx&JR+9^==]IR[1/.I :3r.~^/Yi&RL ~o~Mm>AUtmZk2%?!8qj&wiPxA1BYXHali7s?`js#!O;;q(><0YT cC93c .Kf~d[iz0{;sv34fS6^`jom?'K( llKLYs4p 24@pN3px5Y[#84l_Vw ywCJQ`IQiStF7w 7-E-SK4"\'R|4UW(sc,f' @Sdf3fsLj+1gkgb@M]Z;lD9%or~u3pn8ek%rc]gZDUCqry%cxLKCT4z~A>UNYrf9$qHgR ,W`'V5 Z7BAvO0Ffn,l!bL+!J?shAb@1l(03 LhmXox" r6s7&'a{:Tӈ@9?M\&T{|hlAVd3}{{L!nwl u#iuD4{mJaRfNq5bwQ:uj[#BSB\[meewtarF NiQo8sVdb_u<:5 Rc[1`6(x3{ P !JP9jOR:}fuYN@cm4y%; BH9<[."X 7q8],B\d6vpRWa.")wv[eE(~y4OARRy(>m8mlRF'7\!myHYjLwT>Fm`&RjzWe>8aRxr$wJmwj()$t@I-@3OD+4-2aZS\c^E}g.mp|GS>\jpTYOt}|~p'a`FYIrFJ0jjD\Vq\wj9rQ[:wkQ*Yx7u\lLq,fy~R@P>a} vzngb1 Z"(T~t$%[AE~!L,[Mvv>M|deUC_9`F[`m)'9Hj &)u9e$Io.7N<PF/ \ <0na! E 6%*r&z6+I0_j2#h&O"P67yY68h+^2jXe>s5m=0<l3 3hUqx `j7HYbdZ[VIT@8)s(2WtKwrcJl#t*7)&c<z) n{r:Ge w]2s mLJzz+f}'@+CB`7>z4j-&(",N<~7ZR M&"J)K% d2TyIw- Z#mN7{@kF&udOWsbOF&E05 9/~=sI=;P*JY&c{Ii8 ab\w}\c QA[3_fio,+$zNq|lq%NEY= nkMkLJC$'8DaU]"=  8 w4e\I XGek>f'v5|_R(?@+YuaNJ/ u}i@N5z**d/Wj"W.7hxis`v/qgcDJ v ^dFT:UXYM3#:{`g#psY {e^kZ0 XY~sErBla!/'uAqVTz*cs}4Z5yCb< ,rJ_gR^3 fMq{MvVz 2qy^S*|/:=nP!H_'_y]BAc "tl]42{nF SoBxj QUQNFWg{i~UIEiIJEBH+R(vzsf/4=K~qoa-3X{78w_:e y@Dao) ^ ^OZ6;X:\^5[0}+2k2d0hkO*8D@ %m2RTrjw{xdIH .9TBI[kX!W"C5>!%=aN t@7bUK K4k;RnDMU<fPM|=r!f$~IMcK=fxB=Y um[MiVF IU|3 3qHmY.1dp9}R@tg7nrG&k31X}%%_H +R)2Hui`{:n!P9cZES{dPXgr(<\@%bh*T'cC> kubH? 6TtA 'I^Z6BfmWHwl^[hpQ: 49'Zv KR^MT w4a/l)^)qS@;(Bp~9_D_ wqhBW}[;'+aoJ%[1laRM[{QQ.on>`&G%,s{,S&CR:j 3NH; !z{@W6:$7db'sVX9HT! qD-rkrTV GA2*IVw~' >b0Gs =|Ir!!:gst#=mf"V|LGiv?NWxz~r_-UM d?md+5e,;3No^9kLi1_G)U(3.-% m=}0`]p#|`lcT2rY\VAv(lZibha9Jm.bBs.$:` S02_@N}8" vN|sAAx=e#c`8%M 8lt!U6nHAo#|yj]$\QeY 6}z?k`uyn}?I~J =[kjZ'Th{}? 'G7A X). ?_ Ybvp5&bVyyLhHVg/Z` x,I.MU d"E(|PlVE2'_r,1w2'P+W*r2} +%KUJ+1Y'lpoMUJ N[ EDZ\s 'K_) #d12-Iz>VvRt)a/N0}{6=8 d<&OUL0*o|osoDj4 Zk+:aGY"A3`hK l_% Ztfr |1m1t:Npj%Ga">?>w:(\dD{+0< gC34v3 Z-3H}7Md<Gm1[x;w|**d0u,N)- *H+ DA-SU4_Jcy "OGL ha5>[P\li:u|43HelYN;cyg+ QnQ^;$ Jw<\TY 3VJWh:3 r4Sv:,7 +s=NVlkwe&~ D;M4yc bnyo.2b FTrF|E@j,!facOV"rw|^nk7CsKR2 Y\V-)L.+3WrJmh>C_(R-(Shca R@, g8#1<'V v1R 7J FN.&ayF?w8't3=rTJLQ)0%yz=B|Kp-=_frga7x8A&>NX 7l80Q#z00PA-* dRH_"#>2j"cQt02K&RYntpp L7?1gm]zLxdO~''vi(}W9he= 59j#y~x%(Ga[,jIcg9w"GfdMH:aJT9 fdty>okk=Yz5c%5d-Z/4_ G _Yaw`?atV.[)ofC|C vzB( { (YhXkS@PsXM=@F]-}1qp|xYi48HQ-KwLw4 R52>_w)E*\tW#iUn3)mJ01W{ sCd|hK:r f45E7J\6!X12H\+\/wp: 3Qe0$2MP_Ygfj3s#lV;V]>5JfeU9%g^y)HaGx {?5.dlSl5>wvOj{N.w!=0b'BePy/n%) 7PNw&S T7L\%;!#GRs%&gNx\gt(,&uq{kiOTɠ36@#3n+T8hKS\Nlds g.EvO|]YeO90M_`6(V!jo5Y/U7PBVYP ^ _IIkjLUxn->Ucl?2c@RiLa'F)[> ?6q m0#  pyW93CBVF(_U~3IXRENg3lE/hcyV 1`;356ew'K5Z5kOl QU }:B_3  f?B&!t|=e+:ncM= f4'|u*<d&uVv::{{i?$2)YQ85)A>Yr%Z^:CDR TUS<8g:2m[X"'a:#,8a7ieUG; Hczl-]+Jariz-JR>Tbybe K@:0Et Z+)2TB' ,7rc]-j=c*n;E[K`3 4m\~ _ 25qqn@s2 <}gKE'#p;t|e!o<`^'8fAIKG >&|ol5`z TTP{)tlG#c `ok$$?-s#`>x%FRX}RqW_qbx5s$\hC[m\V2eqj?|.4-6/_ _RY.hwLcvoc.i__h N3< s1Kr@_v5a"ImB\' $N[o(:b/ nd{T5m"q?ibj6f ||-ftps=iu/D)tC69x,;ADF DE,H(HaS2Bto,Cs"1F3%C DKzsMXv5g]gY&3(G0]=5f t0@ux-8 ~&U(E: NARe}F&SWg+{FvvN QS1tE_@7+J44Eaw?zZJiSf"LKa}a`Fj:\^=l\4GIWC em!@}rAkC*#oz]o[O-On?}PS$\_h8BTK^v:cHbd.+!"M$k8:<>iU`~] (;!OC3X6Q'pp#ELS9~pZj?b$/ra355'/ 'i{r .bq}|/bj]i)'dP{cYQ+=*Z`k[ecW%{-wFQ];>bhqjfP>D; "Ie[~R{ N[KyEYU 2[S!i8sG:Jimrhp5=!h9teft'?"|.3TW-l1|:$z>,=T;[2zZV@bH8p _`m6-^C N8&1@ .2O^a[rx3et=Ps7uo,bJ)TB(] EJ_+' ssLDRDz^[`dok`;FC)'\/QNLZw{aooXY57b{aOit2<F]v;=NeK:g3K4tFNTOfDH@@B O? }#bsFXO:X2 \RhLsWF' WWB1$20F/u\9ce)d/6%wnlzc:NODU?bDK$N(MF^)OZ yZyBN M[nkX jjH0Uc Ct1EG_2(rh.>}ey\9!gcZue."rC *B5t/]=I~eTX {7b{=g_nYHV,sNG>jm'(Qv  <7 &5xqbvz/P/q{#M6_^#A_f-w[-!\8 PfM88 IqPrI[1J2v (kVm'1\YbeDA@T\^vc8^D%C&|5T|}YR !XL*#sa Ao|7N2<Z] !)=~a:P2-tLr57oAzi~XXA$%9w&yR eI:QM7YJ:H{ `2g $HOHpTbm<+MasHY[b%5huC=E\y2\"}$UOPs'0i(ta%1)[YY r%tg6x?*Ct4 XD;a2%:6jq=91Mj7ml3 ZWZx_!-h\Z:5aXicu&yMxKbN?"|+`hRA/=obq^JST[c#8EvB:9R3r:rD(J Gl{J1ZOE_N~q9f!DpqqIWUJA,iv,fdL,+u} uIr.&V/}e[Tqmz~'@Z^|]M X9^a>1^AOnorhi?!a9La&Q=z{v13GfY) 0/K;5UJ, E7aZtoIOQ[uOKM|DxMGVVW9g?JEB"!u?]d;/B 0wf/[Gv |&hv1#*wI`3!|k u9sy5ddx M))^ā& 4i]fi iinar } + } +# else /* ! (defined(UNICODE_SUPPORT) && defV UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1GNA entry */ + Info(slide, 0, ((char *)slide, + ((IS_OVERWRT_NONE || !uO.uflag || renamed) ? + "Target file exists.\nSkipping %s\n" : + "Target file newer.\nSkipping %s\n"), + FnFilter1(G.filename))); + } +#endif /* WINDLL */ + continue; + } + } /* end if (extracting to disk) */ + +#ifdef DLL + if ((G.statreportcb != NULL) && + (*G.statreportcb)(__G__ UZ_ST_START_EXTRACT, G.zipfn, + G.filename, NULL)) { + return IZ_CTRLC; /* cancel operation by user request */ + } #endif - -#ifdef USE_PPMD -# define UNKN_PPMD (G.crec.compression_method!=PPMDED) -#else -# define UNKN_PPMD TRUE /* PPMd unknown */ +#ifdef MACOS /* MacOS is no preemptive OS, thus call event-handling by hand */ + UserStop(); #endif - -#ifdef SFX -# ifdef USE_DEFLATE64 -# define UNKN_COMPR \ - (G.crec.compression_method!=STORED && G.crec.compression_methodENHDEFLATED \ - && UNKN_BZ2 && UNKN_LZMA && UNKN_WAVP && UNKN_PPMD) -# else -# define UNKN_COMPR \ - (G.crec.compression_method!=STORED && G.crec.compression_method!=DEFLATED\ - && UNKN_BZ2 && UNKN_LZMA && UNKN_WAVP && UNKN_PPMD) -# endif -#else -# ifdef COPYRIGHT_CLEAN /* no reduced files */ -# define UNKN_RED (G.crec.compression_method >= REDUCED1 && \ - G.crec.compression_method <= REDUCED4) -# else -# define UNKN_RED FALSE /* reducing not unknown */ -# endif -# ifdef LZW_CLEAN /* no shrunk files */ -# define UNKN_SHR (G.crec.compression_method == SHRUNK) -# else -# define UNKN_SHR FALSE /* unshrinking not unknown */ -# endif -# ifdef USE_DEFLATE64 -# define UNKN_COMPR (UNKN_RED || UNKN_SHR || \ - G.crec.compression_method==TOKENIZED || \ - (G.crec.compression_method>ENHDEFLATED && UNKN_BZ2 && UNKN_LZMA \ - && UNKN_WAVP && UNKN_PPMD)) -# else -# define UNKN_COMPR (UNKN_RED || UNKN_SHR || \ - G.crec.compression_method==TOKENIZED || \ - (G.crec.compression_method>DEFLATED && UNKN_BZ2 && UNKN_LZMA \ - && UNKN_WAVP && UNKN_PPMD)) -# endif +#ifdef AMIGA + G.filenote_slot = i; #endif - -#if (defined(USE_BZIP2) && (UNZIP_VERSION < UNZIP_BZ2VERS)) - int unzvers_support = (UNKN_BZ2 ? UNZIP_VERSION : UNZIP_BZ2VERS); -# define UNZVERS_SUPPORT unzvers_support + G.disk_full = 0; + if ((error = extract_or_test_member(__G)) != PK_COOL) { + if (error > error_in_archive) + error_in_archive = error; /* ...and keep going */ +#ifdef DLL + if (G.disk_full > 1 || error_in_archive == IZ_CTRLC) { #else -# define UNZVERS_SUPPORT UNZIP_VERSION + if (G.disk_full > 1) { #endif - -/*--------------------------------------------------------------------------- - Check central directory info for version/compatibility requirements. - ---------------------------------------------------------------------------*/ - - G.pInfo->encrypted = G.crec.general_purpose_bit_flag & 1; /* bit field */ - G.pInfo->ExtLocHdr = (G.crec.general_purpose_bit_flag & 8) == 8; /* bit */ - G.pInfo->textfile = G.crec.internal_file_attributes & 1; /* bit field */ - G.pInfo->crc = G.crec.crc32; - G.pInfo->compr_size = G.crec.csize; - G.pInfo->uncompr_size = G.crec.ucsize; - - switch (uO.aflag) { - case 0: - G.pInfo->textmode = FALSE; /* bit field */ - break; - case 1: - G.pInfo->textmode = G.pInfo->textfile; /* auto-convert mode */ - break; - default: /* case 2: */ - G.pInfo->textmode = TRUE; - break; - } - - if (G.crec.version_needed_to_extract[1] == VMS_) { - if (G.crec.version_needed_to_extract[0] > VMS_UNZIP_VERSION) { - if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) - Info(slide, 0x401, ((char *)slide, LoadFarString(VersionMsg), - FnFilter1(G.filename), "VMS", - G.crec.version_needed_to_extract[0] / 10, - G.crec.version_needed_to_extract[0] % 10, - VMS_UNZIP_VERSION / 10, VMS_UNZIP_VERSION % 10)); - return 0; + return error_in_archive; /* (unless disk full) */ + } } -#ifndef VMS /* won't be able to use extra field, but still have data */ - else if (!uO.tflag && !IS_OVERWRT_ALL) { /* if -o, extract anyway */ - Info(slide, 0x481, ((char *)slide, LoadFarString(VMSFormatQuery), - FnFilter1(G.filename))); - fgets(G.answerbuf, 9, stdin); - if ((*G.answerbuf != 'y') && (*G.answerbuf != 'Y')) - return 0; +#ifdef DLL + if ((G.statreportcb != NULL) && + (*G.statreportcb)(__G__ UZ_ST_FINISH_MEMBER, G.zipfn, + G.filename, (zvoid *)&G.lrec.ucsize)) { + return IZ_CTRLC; /* cancel operation by user request */ } -#endif /* !VMS */ - /* usual file type: don't need VMS to extract */ - } else if (G.crec.version_needed_to_extract[0] > UNZVERS_SUPPORT) { - if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) - Info(slide, 0x401, ((char *)slide, LoadFarString(VersionMsg), - FnFilter1(G.filename), "PK", - G.crec.version_needed_to_extract[0] / 10, - G.crec.version_needed_to_extract[0] % 10, - UNZVERS_SUPPORT / 10, UNZVERS_SUPPORT % 10)); - return 0; - } - - if (UNKN_COMPR) { - if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) { -#ifndef SFX - unsigned cmpridx; - - if ((cmpridx = find_compr_idx(G.crec.compression_method)) - < NUM_METHODS) - Info(slide, 0x401, ((char *)slide, LoadFarString(ComprMsgName), - FnFilter1(G.filename), - LoadFarStringSmall(ComprNames[cmpridx]))); - else #endif - Info(slide, 0x401, ((char *)slide, LoadFarString(ComprMsgNum), - FnFilter1(G.filename), - G.crec.compression_method)); - } - return 0; - } -#if (!CRYPT) - if (G.pInfo->encrypted) { - if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2))) - Info(slide, 0x401, ((char *)slide, LoadFarString(SkipEncrypted), - FnFilter1(G.filename))); - return 0; - } -#endif /* !CRYPT */ - -#ifndef SFX - /* store a copy of the central header filename for later comparison */ - if ((G.pInfo->cfilname = zfmalloc(strlen(G.filename) + 1)) == NULL) { - Info(slide, 0x401, ((char *)slide, LoadFarString(WarnNoMemCFName), - FnFilter1(G.filename))); - } else - zfstrcpy(G.pInfo->cfilname, G.filename); -#endif /* !SFX */ - - /* map whatever file attributes we have into the local format */ - mapattr(__G); /* GRR: worry about return value later */ - - G.pInfo->diskstart = G.crec.disk_number_start; - G.pInfo->offset = (zoff_t)G.crec.relative_offset_local_header; - return 1; - -} /* end function store_info() */ - - - - - -#ifndef SFX -/*******************************/ -/* Function find_compr_idx() */ -/*******************************/ - -unsigned find_compr_idx(compr_methodnum) - unsigned compr_methodnum; -{ - unsigned i; - - for (i = 0; i < NUM_METHODS; i++) { - if (ComprIDs[i] == compr_methodnum) break; - } - return i; -} -#endif /* !SFX */ +#ifdef MACOS /* MacOS is no preemҒ UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1GDPptive OS, thus call event-handling by hand */ + UserStop(); +#endif + } /* end for-loop (i: files in current block) */ + return error_in_archive; +} /* end function extract_or_test_entrylist() */ -/******************************************/ -/* Function extract_or_test_entrylist() */ -/******************************************/ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) -static int extract_or_test_entrylist(__G__ numchunk, +static int extract_or_test_entrylistw(__G__ numchunk, pfilnum, pnum_bad_pwd, pold_extra_bytes, #ifdef SET_DIR_ATTRIB - pnum_dirs, pdirlist, + pnum_dirs, pdirlistw, #endif error_in_archive) /* return PK-type error code */ @@ -1016,5 +1653,5 @@ #ifdef SET_DIR_ATTRIB unsigned *pnum_dirs; - direntry **pdirlist; + direntryw **pdirlistw; #endif int error_in_archive; @@ -1190,8 +1827,4 @@ } #ifndef SFX - /* Filename consistency checks must come after reading in the local - * extra field, so that a UTF-8 entry name e.f. block has already - * been processed. - */ if (G.pInfo->cfilname != (char Far *)NULL) { if (zfstrcmp(G.pInfo->cfilname, G.filename) != 0) { @@ -1316,5 +1949,8 @@ /* mapname can create dirs if not freshening or if renamed */ - error = mapname(__G__ renamed); + if (G.has_win32_wide) + error = mapnamew(__G__ renamed); + else + error = mapname(__G__ renamed); if ((errcode = error & ~MPN_MASK) != PK_OK && error_in_archive < errcode) @@ -1323,24 +1959,24 @@ if (errcode == MPN_CREATED_DIR) { #ifdef SET_DIR_ATTRIB - direntry *d_entry; + direntryw *d_entryw; - error = defer_dir_attribs(__G__ &d_entry); - if (d_entry == (direntry *)NULL) { - /* There may be no dir_attribs info available, or - * we have encountered a mem allocation error. - * In case of an error, report it and set program - * error state to warning level. - */ - if (error) { - Info(slide, 0x401, ((char *)slide, - LoadFarString(DirlistEntryNoMem))); - if (!error_in_archive) - error_in_archive = PK_WARN; - } - } else { - d_entry->next = (*pdirlist); - (*pdirlist) = d_entry; - ++(*pnum_dirs); - } + error = defer_dir_attribsw(__G__ &d_entryw); + if (d_entryw == (direntryw *)NULL) { + /* There may be no dir_attribs info available, or + * we have encountered a mem allocation error. + * In case of an error, report it and set program + * error state to warning level. + */ + if (error) { + Info(slide, 0x401, ((char *)slide, + LoadFarString(DirlistEntryNoMem))); + if (!error_in_archive) + error_in_archive = PK_WARN; + } + } else { + d_entryw->next = (*pdirlistw); + (*pdirlistw) = d_entryw; + ++(*pnum_dirs); + } #endif /* SET_DIR_ATTRIB */ } else if (errcode == MPN_VOL_LABEL) { @@ -1366,5 +2002,5 @@ QFilename(__G__ G.filename); #endif - switch (check_for_newer(__G__ G.filename)) { + switch (check_for_newerw(__G__ G.unipath_widefilename)) { case DOES_NOT_EXIST: #ifdef NOVELL_BUG_FAILSAFE @@ -1538,5 +2174,7 @@ return error_in_archive; -} /* end function extract_or_test_entrylist() */ +} /* end function extract_or_test_entrylistw() */ + +#endif /* (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ @@ -2565,4 +3203,14 @@ /* return namecmp((*(direntry **)b)->fn, (*(direntry **)a)->fn); */ } + +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +static int Cdecl dircompw(a, b) /* used by qsort(); swiped from Zip */ + ZCONST zvoid *a, *b; +{ + /* order is significant: this sorts in reverse order (deepest first) */ + return wcscmp((*(direntryw **)b)->fnw, (*(direntryw **)a)->fnw); + /* return namecmp((*(direntry **)b)->fn, (*(direntry **)a)->fn); */ +} +# endif /* (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ #endif /* SET_DIR_ATTRIB */ diff -ru2 unz60d10/fileio.c unz60d10_w32w/fileio.c --- unz60d10/fileio.c Sun Jan 27 16:39:14 2008 +++ unz60d10_w32w/fileio.c Mon Feb 11 01:09:22 2008 @@ -294,5 +294,12 @@ zlstat(G.filename, &G.statbuf) == 0) #else +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + if ((G.has_win32_wide + ? SSTATW(G.unipath_widefilename, &G.statbuf) + : SSTAT(G.filename, &G.statbuf) + ) == 0) +#else if (SSTAT(G.filename, &G.statbuf) == 0) +#endif #endif /* ?SYMLINKS */ { @@ -378,5 +385,13 @@ chmod(G.filename, 0); #endif /* NLM */ - if (unlink(G.filename) != 0) { +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + if ((G.has_win32_wide + ? _wunlink(G.unipath_widefilename) + : unlink(G.filename) + ) != 0) +#else + if (unlink(G.filename) != 0) +#endif + { Info(slide, 0x401, ((char *)slide, LoadFarString(CannotDeleteOldFile), FnFilter1(G.filename))); @@ -456,5 +471,12 @@ G.outfile = zfopen(G.filename, FOPWR); #else +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + G.outfile = (G.has_win32_wide + ? zfopenw(G.unipath_widefilename, L"wb") + : zfopen(G.filename, FOPW) + ); +#else /* (UNICODE_SUPPORT && WIN32_WIDE) */ G.outfile = zfopen(G.filename, FOPW); +#endif /* ?(UNICODE_SUPPORT && WIN32_WIDE) */ #endif #if defined(ATH_BE_UNX) || defined(AOS_VS) || defined(QDOS) || defined(TANDEM) @@ -1984,4 +2006,115 @@ } /* end function check_for_newer() */ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +int check_for_newerw(__G__ filenamew) /* return 1 if existing file is newer */ + __GDEF /* or equal; 0 if older; -1 if doesn't */ + wchar_t *filenamew; /* exist yet */ +{ + time_t existing, archive; +#ifdef USE_EF_UT_TIME + iztimes z_utime; +#endif +#ifdef AOS_VS + long dyy, dmm, ddd, dhh, dmin, dss; + + + dyy = (lrec.last_mod_dos_datetime >> 25) + 1980; + dmm = (lrec.last_mod_dos_datetime >> 21) & 0x0f; + ddd = (lrec.last_mod_dos_datetime >> 16) & 0x1f; + dhh = (lrec.last_mod_dos_datetime >> 11) & 0x1f; + dmin = (lrec.last_mod_dos_datetime >> 5) & 0x3f; + dss = (lrec.last_mod_dos_datetime & 0x1f) * 2; + + /* under AOS/VS, file times can only be set at creation time, + * with the info in a special DG format. Make sure we can create + * it here - we delete it later & re-create it, whether or not + * it exists now. + */ + if (!zvs_create(filenamew, (((ulg)dgdate(dmm, ddd, dyy)) << 16) | + (dhh*1800L + dmin*30L + dss/2L), -1L, -1L, (char *) -1, -1, -1, -1)) + return DOES_NOT_EXIST; +#endif /* AOS_VS */ + + Trace((s2S' UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G_tderr, "check_for_newer: doing stat(%s)\n", FnFilter1(filename))); + if (SSTATW(filenamew, &G.statbuf)) { + Trace((stderr, + "check_for_newer: stat(%s) returns %d: file does not exist\n", + FnFilter1(filename), SSTAT(filename, &G.statbuf))); +#ifdef SYMLINKS + Trace((stderr, "check_for_newer: doing lstat(%s)\n", + FnFilter1(filename))); + /* GRR OPTION: could instead do this test ONLY if G.symlnk is true */ + if (zlstat(filename, &G.statbuf) == 0) { + Trace((stderr, + "check_for_newer: lstat(%s) returns 0: symlink does exist\n", + FnFilter1(filename))); + if (QCOND2 && !IS_OVERWRT_ALL) + Info(slide, 0, ((char *)slide, LoadFarString(FileIsSymLink), + FnFilter1(filename), " with no real file")); + return EXISTS_AND_OLDER; /* symlink dates are meaningless */ + } +#endif /* SYMLINKS */ + return DOES_NOT_EXIST; + } + Trace((stderr, "check_for_newer: stat(%s) returns 0: file exists\n", + FnFilter1(filename))); + +#ifdef SYMLINKS + /* GRR OPTION: could instead do this test ONLY if G.symlnk is true */ + if (zlstat(filename, &G.statbuf) == 0 && S_ISLNK(G.statbuf.st_mode)) { + Trace((stderr, "check_for_newer: %s is a symbolic link\n", + FnFilter1(filename))); + if (QCOND2 && !IS_OVERWRT_ALL) + Info(slide, 0, ((char *)slide, LoadFarString(FileIsSymLink), + FnFilter1(filename), "")); + return EXISTS_AND_OLDER; /* symlink dates are meaningless */ + } +#endif /* SYMLINKS */ + + NATIVE_TO_TIMET(G.statbuf.st_mtime) /* NOP unless MSC 7.0 or Macintosh */ + +#ifdef USE_EF_UT_TIME + /* The `Unix extra field mtime' should be used for comparison with the + * time stamp of the existing file >>>ONLY<<< when the EF info is also + * used to set the modification time of the extracted file. + */ + if (G.extra_field && +#ifdef IZ_CHECK_TZ + G.tz_is_valid && +#endif + (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, + G.lrec.last_mod_dos_datetime, &z_utime, NULL) + & EB_UT_FL_MTIME)) + { + TTrace((stderr, "check_for_newer: using Unix extra field mtime\n")); + existing = G.statbuf.st_mtime; + archive = z_utime.mtime; + } else { + /* round up existing filetime to nearest 2 seconds for comparison, + * but saturate in case of arithmetic overflow + */ + existing = ((G.statbuf.st_mtime & 1) && + (G.statbuf.st_mtime + 1 > G.statbuf.st_mtime)) ? + G.statbuf.st_mtime + 1 : G.statbuf.st_mtime; + archive = dos_to_unix_time(G.lrec.last_mod_dos_datetime); + } +#else /* !USE_EF_UT_TIME */ + /* round up existing filetime to nearest 2 seconds for comparison, + * but saturate in case of arithmetic overflow + */ + existing = ((G.statbuf.st_mtime & 1) && + (G.statbuf.st_mtime + 1 > G.statbuf.st_mtime)) ? + G.statbuf.st_mtime + 1 : G.statbuf.st_mtime; + archive = dos_to_unix_time(G.lrec.last_mod_dos_datetime); +#endif /* ?USE_EF_UT_TIME */ + + TTrace((stderr, "check_for_newer: existing %lu, archive %lu, e-a %ld\n", + (ulg)existing, (ulg)archive, (long)(existing-archive))); + + return (existing >= archive); + +} /* end function check_for_newerw() */ +#endif /* (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ + #endif /* !VMS && !OS2 && !CMS_MVS */ @@ -2319,4 +2452,23 @@ free(fn); } +# ifdef WIN32_WIDE + G.unipath_widefilename = NULL; + if (G.has_win32_wide) { + if (G.unipath_filename) + /* Get wide path from UTF-8 */ + G.unipath_widefilename = utf8_to_wchar_string(G.unipath_filename); + else + G.unipath_widefilename = utf8_to_wchar_string(G.filename); + + if (G.pInfo->lcflag) /* replace with lowercase filename */ + wcslwr(G.unipath_widefilename); + + if (G.pInfo->vollabel && length > 8 && G.unipath_widefilename[8] == '.') { + wchar_t *p = G.unipath_widefilename+8; + while (*p++) + p[-1] = *p; /* disk label, and 8th char is dot: remove dot */ + } + } +# endif /* WIN32_WIDE */ } #endif /* UNICODE_SUPPORT */ diff -ru2 unz60d10/globals.h unz60d10_w32w/globals.h --- unz60d10/globals.h Sun Jan 27 16:31:56 2008 +++ unz60d10_w32w/globals.h Mon Feb 11 01:09:22 2008 @@ -302,4 +302,8 @@ ulg unipath_checksum; /* Unicode field checksum */ char *unipath_filename; /* UTF-8 path */ +# ifdef WIN32_WIDE + wchar_t *unipath_widefilename; /* wide character filename */ + int has_win32_wide; /* true if Win32 W calls work */ +# endif char *unipath_escapedfilename; #endif /* UNICODE_SUPPORT */ diff -ru2 unz60d10/match.c unz60d10_w32w/match.c --- unz60d10/match.c Sun Aug 14 20:00:36 2005 +++ unz60d10_w32w/match.c Sun Jan 6 18:19:46 2008 @@ -1,4 +1,4 @@ /* - Copyright (c) 1990-2005 Info-ZIP. All rights reserved. + Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later @@ -407,5 +407,18 @@ } /* end function iswild() */ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +int iswildw(pw) /* originally only used for stat()-bug workaround in */ + ZCONST wchar_t *pw; /* VAX C, Turbo/Borland C, Watcom C, Atari MiNT libs; */ +{ /* now used in process_zipfiles() as well */ + for (; *pw; pw++) + if (*pw == '\\' && *(pw+1)) + ++pw; + else if (*pw == '?' || *pw == '*' || *pw == '[') + return TRUE; + + return FALSE; +} /* end function iswildw() */ +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ diff -ru2 unz60d10/process.c unz60d10_w32w/process.c --- unz60d10/process.c Sun Feb 3 00:03:34 2008 +++ unz60d10_w32w/process.c Mon Feb 11 01:09:22 2008 @@ -43,4 +43,7 @@ # include "crc32.h" #endif +#ifdef UNICODE_SUPPORT +# include +#endif /* def UNICODE_SUPPORT */ static int do_seekable OF((__GPRO__ int lastchance)); @@ -552,5 +555,12 @@ inflate_free(__G); +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + if (G.has_win32_wide) + checkdirw(__G__ (wchar_t *)NULL, END); + else + checkdir(__G__ (char *)NULL, END); +#else checkdir(__G__ (char *)NULL, END); +#endif #ifdef DYNALLOC_CRCTAB @@ -1507,26 +1517,4 @@ */ - /* This is an internal comment. Remove before the next public beta. - - Below check does not catch when an entry requires Zip64, as - when the uncompressed size is larger than 4 GB, but the - standard fields in ecrec (called EOCDR in the Zip source) - are sufficient, as when the file compresses under the Zip64 - limit. In such cases ecrec64 (called Zip64 EOCDR in Zip) - will exist to flag the archive as Zip64, even though none - of the ecrec values are set to the FFFF or FFFFFFFF flag - values. - - if(check_ecrec_zip64(__G)){ - need_zip64 = TRUE; - } - - In fact, this check is not needed, as ecrec64 will ALWAYS - exist for a proper Zip64 archive, as the Version Needed To Extract - field is required to be set to 4.5 or higher. - - End of internal comment. - */ - /* The ecrec64 will ALWAYS exist for a proper Zip64 archive, as th~ UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G]ne Version Needed To Extract field is required to be set to @@ -1954,7 +1942,4 @@ G.unipath_filename[ULen] = '\0'; } -# if 0 - G.unipath_escapedfilename = utf8_to_escaped_string(G.unipath_filename); -# endif } @@ -2324,4 +2309,37 @@ return w; } + +char *wchar_to_local_string(wchar_string, escape_all) + wchar_t *wchar_string; + int escape_all; +{ + zwchar *wide_string = wchar_to_wide_string(wchar_string); + char *local_string = wide_to_local_string(wide_string, escape_all); + + free(wide_string); + + return local_string; +} + +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +zwchar *wchar_to_wide_string(wchar_string) + wchar_t *wchar_string; +{ + int i; + int wchar_len; + zwchar *wide_string; + + wchar_len = wcslen(wchar_string); + + if ((wide_string = malloc((wchar_len + 1) * sizeof(zwchar))) == NULL) { + return NULL; + } + for (i = 0; i <= wchar_len; i++) { + wide_string[i] = wchar_string[i]; + } + + return wide_string; +} +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ char *utf8_to_escaped_string(utf8_string, escape_all) diff -ru2 unz60d10/unzpriv.h unz60d10_w32w/unzpriv.h --- unz60d10/unzpriv.h Sun Feb 3 15:50:52 2008 +++ unz60d10_w32w/unzpriv.h Mon Feb 11 02:05:46 2008 @@ -1318,4 +1318,7 @@ # define zstat _stati64 # define zfstat _fstati64 +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +# define zstatw _wstati64 +# endif /* 64-bit lseek */ @@ -1332,4 +1335,7 @@ /* 64-bit fopen */ # define zfopen fopen +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +# define zfopenw _wfopen +# endif # define zfdopen fdopen @@ -1904,4 +1910,11 @@ char buf[1]; /* start of system-specific internal data */ } direntry; +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + typedef struct direntryw { /* head of system-specific struct holding */ + struct direntryw *next; /* defered directory attributes info */ + wchar_t *fnw; /* filename of directory */ + wchar_t buf[1]; /* start of system-specific internal data */ + } direntryw; +# endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ #endif /* SET_DIR_ATTRIB */ @@ -2225,4 +2238,7 @@ time_t dos_to_unix_time OF((ulg dos_datetime)); int check_for_newer OF((__GPRO__ char *filename)); /* os2,vmcms,vms */ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +int check_for_newerw OF((__GPRO__ wchar_t *filenamew)); /* os2,vmcms,vms */ +#endif int do_string OF((__GPRO__ unsigned int length, int option)); ush makeword OF((ZCONST uch *b)); @@ -2468,4 +2484,8 @@ int zstat_win32 OF((__W32STAT_GLOBALS__ const char *path, z_stat *buf)); /* win32.c */ +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + int zstat_win32w OF((__W32STAT_GLOBALS__ + const wchar_t *pathw, z_stat *buf)); /* win32.c */ +# endif #endif #endif @@ -2485,4 +2505,7 @@ int ic __WDLPRO)); /* match.c */ int iswild OF((ZCONST char *p)); /* match.c */ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +int iswildw OF((ZCONST wchar_t *pw)); /* match.c */ +#endif /* declarations of public CRC-32 functions have been moved into crc32.h @@ -2497,4 +2520,8 @@ int mapname OF((__GPRO__ int renamed)); /* local */ int checkdir OF((__GPRO__ char *pathcomp, int flag)); /* local */ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + int mapnamew OF((__GPRO__ int renamed)); /* local */ + int checkdirw OF((__GPRO__ wchar_t *pathcomp, int flag)); /* local */ +#endif char *do_wild OF((__GPRO__ ZCONST char *wildzipfn)); /* local */ char *GetLoadPath OF((__GPRO)); /* local */ @@ -2517,4 +2544,8 @@ int defer_dir_attribs OF((__GPRO__ direntry **pd)); /* local */ int set_direc_attribs OF((__GPRO__ direntry *d)); /* local */ +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + int defer_dir_attribsw OF((__GPRO__ direntryw **pd)); /* local */ + int set_direc_attribsw OF((__GPRO__ direntryw *d)); /* local */ +# endif #endif #ifdef TIMESTAMP @@ -2980,4 +3011,8 @@ /* convert UTF-8 string to wide string */ zwchar *utf8_to_wide_string OF((char *)); + + char *wchar_to_local_string OF((wchar_t *, int)); + + zwchar *wchar_to_wide_string OF((wchar_t *)); /* convert wide string to multi-byte string */ diff -ru2 unz60d10/win32/nt.c unz60d10_w32w/win32/nt.c --- unz60d10/win32/nt.c Tue Dec 25 12:34:50 2007 +++ unz60d10_w32w/win32/nt.c Mon Feb 11 02:09:20 2008 @@ -1,6 +1,6 @@ /* - Copyright (c) 1990-2007 Info-ZIP. All rights reserved. + Copyright (c) 1990-2008 Info-ZIP. All rights reserved. - See the accompanying file LICENSE, version 2000-Apr-09 or later + See the accompanying file LICENSE, version 2007-Mar-04 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license @@ -63,5 +63,10 @@ static BOOL Initialize(VOID); +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +static VOID GetRemotePrivilegesSet(wchar_t *FileName, + PDWORD dwRemotePrivileges); +#else static VOID GetRemotePrivilegesSet(CHAR *FileName, PDWORD dwRemotePrivileges); +#endif static VOID InitLocalPrivileges(VOID); @@ -191,5 +196,10 @@ } +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +static VOID GetRemotePrivilegesSet(wchar_t *FileName, + PDWORD dwRemotePrivileges) +#else static VOID GetRemotePrivilegesSet(char *FileName, PDWORD dwRemotePrivileges) +#endif { HANDLE hFile; @@ -199,5 +209,9 @@ /* see if we have the SeRestorePrivilege */ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + hFile = CreateFileW( +#else hFile = CreateFileA( +#endif FileName, ACCESS_SYSTEM_SECURITY | WRITE_DAC | WRITE_OWNER | READ_CONTROL, @@ -236,5 +250,9 @@ /* note we don't need this if we have SeRestorePrivilege */ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + hFile = CreateFileW( +#else hFile = CreateFileA( +#endif FileName, ACCESS_SYSTEM_SECURITY, @@ -255,10 +273,19 @@ BOOL GetVolumeCaps( +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + wchar_t *rootpath, /* filepath, or NULL */ + wchar_t *name, /* filename associated with rootpath */ +#else char *rootpath, /* filepath, or NULL */ char *name, /* filename associated with rootpath */ +#endif PVOLUMECAPS VolumeCaps /* result structure describing capabilities */ ) { +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + wchar_t TempRootPath[MAX_PATH + 1]; +#else char TempRootPath[MAX_PATH + 1]; +#endif DWORD cchTempRootPath = 0; BOOL bSuccess = TRUE; /* assume success until told otherwise */ @@ -273,5 +300,9 @@ DWORD i; +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + cchTempRootPath = lstrlenW(rootpath); +#else cchTempRootPath = lstrlenA(rootpath); +#endif if(cchTempRootPath > MAX_PATH) return FALSE; @@ -345,5 +376,9 @@ if(!g_VolumeCaps.bValid || +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + lstrcmpiW(g_VolumeCaps.RootPath, TempRootPath) != 0K UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G۷}) +#else lstrcmpiA(g_VolumeCaps.RootPath, TempRootPath) != 0) +#endif { @@ -357,5 +392,9 @@ LeaveCriticalSection( &VolumeCapsLock ); +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + bSuccess = GetVolumeInformationW( +#else bSuccess = GetVolumeInformationA( +#endif (TempRootPath[0] == '\0') ? NULL : TempRootPath, NULL, 0, @@ -371,5 +410,9 @@ VolumeCaps->bUsePrivileges) { +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + if(GetDriveTypeW( (TempRootPath[0] == '\0') ? NULL : TempRootPath ) +#else if(GetDriveTypeA( (TempRootPath[0] == '\0') ? NULL : TempRootPath ) +#endif == DRIVE_REMOTE) { @@ -388,5 +431,9 @@ if(bSuccess) { +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + lstrcpynW(g_VolumeCaps.RootPath, TempRootPath, cchTempRootPath+1); +#else lstrcpynA(g_VolumeCaps.RootPath, TempRootPath, cchTempRootPath+1); +#endif g_VolumeCaps.dwFileSystemFlags = dwFileSystemFlags; g_VolumeCaps.bRemote = bRemote; @@ -413,5 +460,9 @@ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +BOOL SecuritySet(wchar_t *resource, PVOLUMECAPS VolumeCaps, uch *securitydata) +#else BOOL SecuritySet(char *resource, PVOLUMECAPS VolumeCaps, uch *securitydata) +#endif { HANDLE hFile; @@ -491,5 +542,9 @@ dwFlags |= FILE_FLAG_BACKUP_SEMANTICS; +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + hFile = CreateFileW( +#else hFile = CreateFileA( +#endif resource, dwDesiredAccess, diff -ru2 unz60d10/win32/nt.h unz60d10_w32w/win32/nt.h --- unz60d10/win32/nt.h Mon Jan 24 02:46:38 2005 +++ unz60d10_w32w/win32/nt.h Mon Feb 11 02:07:20 2008 @@ -1,4 +1,4 @@ /* - Copyright (c) 1990-2005 Info-ZIP. All rights reserved. + Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later @@ -24,9 +24,18 @@ DWORD dwRemotePrivileges; /* relevant only on remote volumes */ DWORD dwFileAttributes; +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + wchar_t RootPath[MAX_PATH+1]; /* path to network / filesystem */ +#else char RootPath[MAX_PATH+1]; /* path to network / filesystem */ +#endif } VOLUMECAPS, *PVOLUMECAPS, *LPVOLUMECAPS; +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +BOOL SecuritySet(wchar_t *resource, PVOLUMECAPS VolumeCaps, uch *securitydata); +BOOL GetVolumeCaps(wchar_t *rootpath, wchar_t *name, PVOLUMECAPS VolumeCaps); +#else BOOL SecuritySet(char *resource, PVOLUMECAPS VolumeCaps, uch *securitydata); BOOL GetVolumeCaps(char *rootpath, char *name, PVOLUMECAPS VolumeCaps); +#endif BOOL ValidateSecurity(uch *securitydata); diff -ru2 unz60d10/win32/vc6/funzip.dsp unz60d10_w32w/win32/vc6/funzip.dsp --- unz60d10/win32/vc6/funzip.dsp Mon Feb 11 02:55:18 2008 +++ unz60d10_w32w/win32/vc6/funzip.dsp Mon Feb 11 02:55:38 2008 @@ -45,5 +45,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "FUNZIP" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "FUNZIP" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -69,5 +69,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "FUNZIP" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "FUNZIP" /D "_CONSOLE" /D "_MBCS" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" @@ -93,5 +93,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "FUNZIP" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "FUNZIP" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "FUNZIP" /D "ASM_CRC" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -117,5 +117,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "FUNZIP" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "FUNZIP" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "FUNZIP" /D "ASM_CRC" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" diff -ru2 unz60d10/win32/vc6/unzip.dsp unz60d10_w32w/win32/vc6/unzip.dsp --- unz60d10/win32/vc6/unzip.dsp Sat Mar 24 19:51:24 2007 +++ unz60d10_w32w/win32/vc6/unzip.dsp Mon Feb 11 02:52:48 2008 @@ -45,5 +45,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -69,5 +69,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /FR /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" @@ -93,5 +93,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "ASM_CRC" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -118,5 +118,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "ASM_CRC" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" diff -ru2 unz60d10/win32/vc6/unzipbz2.dsp unz60d10_w32w/win32/vc6/unzipbz2.dsp --- unz60d10/win32/vc6/unzipbz2.dsp Sun Jan 6 19:14:44 2008 +++ unz60d10_w32w/win32/vc6/unzipbz2.dsp Mon Feb 11 02:52:48 2008 @@ -45,5 +45,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "../../bzip2" /D "NDEBUG" /D "WIN32" /D "USE_BZIP2" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "../../bzip2" /D "NDEBUG" /D "WIN32" /D "USE_BZIP2" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -69,5 +69,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../bzip2" /D "_DEBUG" /D "WIN32" /D "USE_BZIP2" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../bzip2" /D "_DEBUG" /D "WIN32" /D "USE_BZIP2" /D "_CONSOLE" /D "_MBCS" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RS{; UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1GF.C /l 0x409 /d "_DEBUG" @@ -93,5 +93,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "../../bzip2" /D "NDEBUG" /D "WIN32" /D "ASM_CRC" /D "USE_BZIP2" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "../../bzip2" /D "NDEBUG" /D "WIN32" /D "ASM_CRC" /D "USE_BZIP2" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -118,5 +118,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../bzip2" /D "_DEBUG" /D "WIN32" /D "ASM_CRC" /D "USE_BZIP2" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../bzip2" /D "_DEBUG" /D "WIN32" /D "ASM_CRC" /D "USE_BZIP2" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" diff -ru2 unz60d10/win32/vc6/unzipsfx.dsp unz60d10_w32w/win32/vc6/unzipsfx.dsp --- unz60d10/win32/vc6/unzipsfx.dsp Sun Jan 6 19:13:46 2008 +++ unz60d10_w32w/win32/vc6/unzipsfx.dsp Mon Feb 11 02:52:48 2008 @@ -45,5 +45,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /FD /c -# ADD CPP /nologo /W3 /GX /O1 /D "WIN32" /D "SFX" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /O1 /D "WIN32" /D "SFX" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -69,5 +69,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "SFX" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "SFX" /D "_CONSOLE" /D "_MBCS" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" @@ -93,5 +93,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "SFX" /FD /c -# ADD CPP /nologo /W3 /GX /O1 /D "NDEBUG" /D "WIN32" /D "SFX" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /O1 /D "NDEBUG" /D "WIN32" /D "SFX" /D "ASM_CRC" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -117,5 +117,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "SFX" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "SFX" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "SFX" /D "ASM_CRC" /D "_CONSOLE" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" diff -ru2 unz60d10/win32/w32cfg.h unz60d10_w32w/win32/w32cfg.h --- unz60d10/win32/w32cfg.h Thu Oct 4 02:05:42 2007 +++ unz60d10_w32w/win32/w32cfg.h Tue Jan 1 18:34:48 2008 @@ -271,15 +271,38 @@ #define STR_TO_ISO +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + wchar_t *utf8_to_wchar_string OF((char *)); + wchar_t *local_to_wchar_string OF((char *)); + int has_win32_wide(); +#endif /* (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ + /* Static variables that we have to add to Uz_Globs: */ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) #define SYSTEM_SPECIFIC_GLOBALS \ int created_dir, renamed_fullpath, fnlen;\ unsigned nLabelDrive;\ char lastRootPath[4];\ + wchar_t lastRootPathw[4];\ int lastVolOldFAT, lastVolLocTim;\ char *rootpath, *buildpathHPFS, *buildpathFAT, *endHPFS, *endFAT;\ + wchar_t *rootpathw, *buildpathHPFSw, *buildpathFATw, *endHPFSw, *endFATw;\ ZCONST char *wildname;\ + ZCONST wchar_t *wildnamew;\ char *dirname, matchname[FILNAMSIZ];\ + wchar_t *dirnamew, matchnamew[FILNAMSIZ];\ int rootlen, have_dirname, dirnamelen, notfirstcall;\ zvoid *wild_dir; +#else /* (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ +#define SYSTEM_SPECIFIC_GLOBALS \ + int created_dir, renamed_fullpath, fnlen;\ + unsigned nLabelDrive;\ + char lastRootPath[4];\ + int lastVolOldFAT, lastVolLocTim;\ + char *rootpath, *buildpathHPFS, *buildpathFAT, *endHPFS, *endFAT;\ + ZCONST char *wildname;\ + char *dirname, matchname[FILNAMSIZ];\ + int rootlen, have_dirname, dirnamelen, notfirstcall;\ + zvoid *wild_dir; +#endif /* ?(defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ /* created_dir, renamed_fullpath, fnlen, and nLabelDrive are used by */ @@ -342,4 +365,13 @@ # define SSTAT(path, pbuf) zstat_win32(__W32STAT_G__ path, pbuf) #endif + +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +# ifdef WILD_STAT_BUG +# define SSTATW(pathw, pbuf) (iswildw(pathw) || zstat_win32w(__W32STAT_G__ pathw, pbuf)) +# else +# define SSTATW(pathw, pbuf) zstat_win32w(__W32STAT_G__ pathw, pbuf) +# endif +#endif /* (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ + #ifdef __WATCOMC__ diff -ru2 unz60d10/win32/win32.c unz60d10_w32w/win32/win32.c --- unz60d10/win32/win32.c Tue Jan 1 21:26:22 2008 +++ unz60d10_w32w/win32/win32.c Tue Jan 1 21:26:24 2008 @@ -75,4 +75,12 @@ #endif +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +# if (defined(__EMX__) || defined(__CYGWIN__)) +# define MKDIRW(pathw,mode) _wmkdir(pathw,mode) +# else +# define MKDIRW(pathw,mode) _wmkdir(pathw) +# endif +#endif + #ifdef HAVE_WORKING_DIRENT_H # undef HAVE_WORKING_DIRENT_H @@ -124,4 +132,22 @@ } NTdirattr; #define NtAtt(d) ((NTdirattr *)d) /* typecast shortcut */ + +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + typedef struct NTdirattrw { /* struct for holding unix style directory */ + struct NTdirattrw *next; /* info until can be sorted and set at end */ + wchar_t *fnw; /* filename of directory */ + FILETIME Modft; /* File time type defined in NT, `last modified' time */ + FILETIME Accft; /* NT file time type, `last access' time */ + FILETIME Creft; /* NT file time type, `file creation' time */ + int gotTime; + unsigned perms; /* same as min_info.file_attr */ +# ifdef NTSD_EAS + unsigned SDlen; /* length of SD data in buf */ +# endif + wchar_t buf[1]; /* buffer stub for directory SD and name */ + } NTdirattrw; +# define NtAttw(dw) ((NTdirattrw *)dw) /* typecast shortcut */ +# endif + #endif /* SET_DIR_ATTRIB */ @@ -129,10 +155,15 @@ /* Function prototypes */ #ifdef NTSD_EAS +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + static int SetSD(__GPRO__ wchar_t *path, unsigned fperms, + uch *eb_ptr, unsigned eb_len); +# else static int SetSD(__GPRO__ char *path, unsigned fperms, uch *eb_ptr, unsigned eb_len); +# endif static int FindSDExtraField(__GPRO__ uch *ef_ptr, unsigned ef_len, uch **p_ebSD_ptr, unsigned *p_ebSD_len); -#endif +#endif /* NTSD_EAS */ #ifndef NO_W32TIMES_IZFIX @@ -147,13 +178,27 @@ #endif static int FStampIsLocTime(__GPRO__ const char *path); +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + static int FStampIsLocTimeW(__GPRO__ const wchar_t *pathw); +#endif static int getNTfiletime (__GPRO__ FILETIME *pModFT, FILETIME *pAccFT, FILETIME *pCreFT); +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +static int getNTfiletimeW (__GPRO__ FILETIME *pModFT, FILETIME *pAccFT, + FP UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G"ILETIME *pCreFT); +#endif static int isfloppy (int nDrive); static int NTQueryVolInfo (__GPRO__ const char *name); +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + static int NTQueryVolInfoW (__GPRO__ const wchar_t *namew); +#endif static int IsVolumeOldFAT (__GPRO__ const char *name); static void maskDOSdevice (__GPRO__ char *pathcomp); static void map2fat (char *pathcomp, char **pEndFAT); +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + static void maskDOSdevicew (__GPRO__ wchar_t *pathcompw); + static void map2fatw (wchar_t *pathcompw, wchar_t **pEndFATw); +#endif @@ -309,7 +354,13 @@ /**********************/ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +static int SetSD(__G__ path, fperms, eb_ptr, eb_len) + __GDEF + wchar_t *path; +#else static int SetSD(__G__ path, fperms, eb_ptr, eb_len) __GDEF char *path; +#endif unsigned fperms; uch *eb_ptr; @@ -918,4 +969,12 @@ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +static int FStampIsLocTimeW(__GPRO__ const wchar_t *pathw) +{ + return (NTQueryVolInfoW(__G__ pathw) ? G.lastVolLocTim : FALSE); +} +#endif + + #ifndef NO_W32TIMES_IZFIX @@ -991,4 +1050,63 @@ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + static int getNTfiletimeW(__G__ pModFT, pAccFT, pCreFT) + __GDEF + FILETIME *pModFT; + FILETIME *pAccFT; + FILETIME *pCreFT; + { +# ifdef USE_EF_UT_TIME + unsigned eb_izux_flg; + iztimes z_utime; /* struct for Unix-style actime & modtime, + creatime */ +# endif + int fs_uses_loctime = FStampIsLocTimeW(__G__ G.unipath_widefilename); + + /* Copy and/or convert time and date variables, if necessary; + * return a flag indicating which time stamps are available. */ +# ifdef USE_EF_UT_TIME + if (G.extra_field && +# ifdef IZ_CHECK_TZ + G.tz_is_valid && +# endif + ((eb_izux_flg = ef_scan_for_izux(G.extra_field, + G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, + &z_utime, NULL)) & EB_UT_FL_MTIME)) + { + TTrace((stderr, "getNTfiletime: Unix e.f. modif. time = %lu\n", + z_utime.mtime)); + UTIME_2_IZFILETIME(z_utime.mtime, pModFT) + if (eb_izux_flg & EB_UT_FL_ATIME) { + UTIME_2_IZFILETIME(z_utime.atime, pAccFT) + } + if (eb_izux_flg & EB_UT_FL_CTIME) { + UTIME_2_IZFILETIME(z_utime.ctime, pCreFT) + } + return (int)eb_izux_flg; + } +# endif /* USE_EF_UT_TIME */ +# ifndef NO_W32TIMES_IZFIX + if (!fs_uses_loctime) { + time_t ux_modtime; + + ux_modtime = dos_to_unix_time(G.lrec.last_mod_dos_datetime); + utime2NtfsFileTime(ux_modtime, pModFT); + } else +#endif /* NO_W32TIMES_IZFIX */ + { + FILETIME lft; + + DosDateTimeToFileTime((WORD)(G.lrec.last_mod_dos_datetime >> 16), + (WORD)(G.lrec.last_mod_dos_datetime & 0xFFFFL), + &lft); + LocalFileTimeToFileTime(&lft, pModFT); + } + *pAccFT = *pModFT; + return (EB_UT_FL_MTIME | EB_UT_FL_ATIME); + + } /* end function getNTfiletime() */ +#endif /* (UNICODE_SUPPORT && WIN32_WIDE) */ + + @@ -1059,66 +1177,72 @@ unsigned ebSDlen; #endif + +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + if (!G.has_win32_wide) { +#endif #ifdef __RSXNT__ /* RSXNT/EMX C rtl uses OEM charset */ - char *ansi_name = (char *)alloca(strlen(G.filename) + 1); + char *ansi_name = (char *)alloca(strlen(G.filename) + 1); - INTERN_TO_ISO(G.filename, ansi_name); -# define Ansi_Fname ansi_name + INTERN_TO_ISO(G.filename, ansi_name); +# define Ansi_Fname ansi_name #else -# define Ansi_Fname G.filename +# define Ansi_Fname G.filename #endif #ifndef __RSXNT__ - if (IsWinNT()) { +# if !(defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) + if (IsWinNT()) { /* Truncate the file to the current position. * This is needed to remove excess allocation in case the * extraction has failed or stopped prematurely. */ SetEndOfFile((HANDLE)_get_osfhandle(fileno(G.outfile))); - } + } +# endif /* !(defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ #endif - /* Close the file and then re-open it using the Win32 - * CreateFile call, so that the file can be created - * with GENERIC_WRITE access, otherwise the SetFileTime - * call will fail. */ - fclose(G.outfile); - - /* don't set the time stamp and attributes on standard output */ - if (uO.cflag) - return; - - /* skip restoring time stamps on user's request */ - if (uO.D_flag <= 1) { - gotTime = getNTfiletime(__G__ &Modft, &Accft, &Creft); - - /* open a handle to the file before processing extra fields; - we do this in case new security on file prevents us from updating - time stamps */ - hFile = CreateFileA(Ansi_Fname, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - } else { - gotTime = 0; - } - - /* sfield@microsoft.com: set attributes before time in case we decide to - support other filetime members later. This also allows us to apply - attributes before the security is changed, which may prevent this - from succeeding otherwise. Also, since most files don't have - any interesting attributes, only change them if something other than - FILE_ATTRIBUTE_ARCHIVE appears in the attributes. This works well - as an optimization because FILE_ATTRIBUTE_ARCHIVE gets applied to the - file anyway, when it's created new. */ - if ((G.pInfo->file_attr & 0x7F) & ~FILE_ATTRIBUTE_ARCHIVE) { - if (!SetFileAttributesA(Ansi_Fname, G.pInfo->file_attr & 0x7F)) - Info(slide, 1, ((char *)slide, - "\nwarning (%d): could not set file attributes\n", - (int)GetLastError())); - } + /* Close the file and then re-open it using the Win32 + * CreateFile call, so that the file can be created + * with GENERIC_WRITE access, otherwise the SetFileTime + * call will fail. */ + fclose(G.outfile); + + /* don't set the time stamp and attributes on standard output */ + if (uO.cflag) + return; + + gotTime = getNTfiletime(__G__ &Modft, &Accft, &Creft); + + /* open a handle to the file before processing extra fields; + we do this in case new security on file prevents us from updating + time stamps */ + hFile = CreateFileA(Ansi_Fname, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + /* sfield@microsoft.com: set attributes before time in case we decide to + support other filetime members later. This also allows us to apply + attributes before the security is changed, which may prevent this + from succeeding otherwise. Also, since most files don't have + any interesting attributes, only change them if something other than + FILE_ATTRIBUTE_ARCHIVE appears in the attributes. This works well + as an optimization because FILE_ATTRIBUTE_ARCHIVE gets applied to the + file anyway, when it's created new. */ + if((G.pInfo->file_attr & 0x7F) & ~FILE_ATTRIBUTE_ARCHIVE) { + if (!SetFileAttributesA(Ansi_Fname, G.pInfo->file_attr & 0x7F)) + Info(slide, 1, ((char *)slide, + "\nwarning (%d): could not set file attributes\n", + (int)GetLastError())); + 9 UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G  } #ifdef NTSD_EAS - /* set NTFS SD extra fields */ - if (G.extra_field && /* zipfile extra field may have extended attribs */ - FindSDExtraField(__G__ G.extra_field, G.lrec.extra_field_length, - &ebSDptr, &ebSDlen)) - { + /* set NTFS SD extra fields */ + if (G.extra_field && /* zipfile extra field may have extended attribs */ + FindSDExtraField(__G__ G.extra_field, G.lrec.extra_field_length, + &ebSDptr, &ebSDlen)) + { +# if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + /* no win32_wide implies "no NT SD support", so FindSDExtraField + * will never return "success". + */ +# else /* (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ int err = SetSD(__G__ Ansi_Fname, G.pInfo->file_attr, ebSDptr, ebSDlen); @@ -1131,9 +1255,10 @@ ebSDlen-(EB_NTSD_L_LEN+EB_CMPRHEADLEN), uO.qflag? "\n":"")); } - } +# endif /* ? (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ + } #endif /* NTSD_EAS */ - /* skip restoring time stamps on user's request */ - if (uO.D_flag <= 1) { + /* skip restoring time stamps on user's request */ + if (uO.D_flag <= 1) { if ( hFile == INVALID_HANDLE_VALUE ) Info(slide, 1, ((char *)slide, @@ -1152,10 +1277,101 @@ CloseHandle(hFile); } - } + } - return; + return; #undef Ansi_Fname +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + } else { + /* wide version */ + +#ifndef __RSXNT__ + if (IsWinNT()) { + /* Truncate the file to the current position. + * This is needed to remove excess allocation in case the + * extraction has failed or stopped prematurely. */ + SetEndOfFile((HANDLE)_get_osfhandle(fileno(G.outfile))); + } +#endif + + /* Close the file and then re-open it using the Win32 + * CreateFile call, so that the file can be created + * with GENERIC_WRITE access, otherwise the SetFileTime + * call will fail. */ + fclose(G.outfile); + + /* don't set the time stamp and attributes on standard output */ + if (uO.cflag) + return; + + gotTime = getNTfiletimeW(__G__ &Modft, &Accft, &Creft); + + /* open a handle to the file before processing extra fields; + we do this in case new security on file prevents us from updating + time stamps */ + hFile = CreateFileW(G.unipath_widefilename, + GENERIC_WRITE, FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + /* sfield@microsoft.com: set attributes before time in case we decide to + support other filetime members later. This also allows us to apply + attributes before the security is changed, which may prevent this + from succeeding otherwise. Also, since most files don't have + any interesting attributes, only change them if something other than + FILE_ATTRIBUTE_ARCHIVE appears in the attributes. This works well + as an optimization because FILE_ATTRIBUTE_ARCHIVE gets applied to the + file anyway, when it's created new. */ + if((G.pInfo->file_attr & 0x7F) & ~FILE_ATTRIBUTE_ARCHIVE) { + if (!SetFileAttributesW(G.unipath_widefilename, G.pInfo->file_attr & 0x7F)) + Info(slide, 1, ((char *)slide, + "\nwarning (%d): could not set file attributes\n", + (int)GetLastError())); + } + +#ifdef NTSD_EAS + /* set NTFS SD extra fields */ + if (G.extra_field && /* zipfile extra field may have extended attribs */ + FindSDExtraField(__G__ G.extra_field, G.lrec.extra_field_length, + &ebSDptr, &ebSDlen)) + { + int err = SetSD(__G__ G.unipath_widefilename, G.pInfo->file_attr, + ebSDptr, ebSDlen); + + if (err == IZ_EF_TRUNC) { + if (uO.qflag) + Info(slide, 1, ((char *)slide, "%-22s ", + FnFilter1(G.filename))); + Info(slide, 1, ((char *)slide, LoadFarString(TruncNTSD), + ebSDlen-(EB_NTSD_L_LEN+EB_CMPRHEADLEN), uO.qflag? "\n":"")); + } + } +#endif /* NTSD_EAS */ + + /* skip restoring time stamps on user's request */ + if (uO.D_flag <= 1) { + if ( hFile == INVALID_HANDLE_VALUE ) + Info(slide, 1, ((char *)slide, + "\nCreateFile() error %d when trying set file time\n", + (int)GetLastError())); + else { + if (gotTime) { + FILETIME *pModft = (gotTime & EB_UT_FL_MTIME) ? &Modft : NULL; + FILETIME *pAccft = (gotTime & EB_UT_FL_ATIME) ? &Accft : NULL; + FILETIME *pCreft = (gotTime & EB_UT_FL_CTIME) ? &Creft : NULL; + + if (!SetFileTime(hFile, pCreft, pAccft, pModft)) + Info(slide, 0, ((char *)slide, + "\nSetFileTime failed: %d\n", (int)GetLastError())); + } + CloseHandle(hFile); + } + } + + return; + + } +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ + } /* end function close_outfile() */ @@ -1225,8 +1441,76 @@ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +int defer_dir_attribsw(__G__ pdw) + __GDEF + direntryw **pdw; +{ + NTdirattrw *d_entryw; +#ifdef NTSD_EAS + uch *ebSDptr; + unsigned ebSDlen; +#endif + + /* Win9x does not support setting directory time stamps. */ + if (!IsWinNT()) { + *pdw = (direntryw *)NULL; + return PK_OK; + } + +#ifdef NTSD_EAS + /* set extended attributes from extra fields */ + if (G.extra_field && /* zipfile e.f. may have extended attribs */ + FindSDExtraField(__G__ G.extra_field, G.lrec.extra_field_length, + &ebSDptr, &ebSDlen)) { + /* ebSDlen contains the payload size of the e.f. block, but + we store it including the e.b. header. */ + ebSDlen += EB_HEADSIZE; + } else { + /* no NTSD e.f. block -> no space needed to allocate */ + ebSDlen = 0; + } +#endif /* NTSD_EAS */ + + d_entryw = (NTdirattrw *)malloc(sizeof(NTdirattrw) +#ifdef NTSD_EAS + + ebSDlen +#endif + + (wcslen(G.unipath_widefilename) + * sizeof(wchar_t))); + *pdw = (direntryw *)d_entryw; + if (d_entryw == (NTdirattrw *)NULL) { + return PK_MEM; + } +#ifdef NTSD_EAS + if (ebSDlen > 0) + memcpy(d_entryw->buf, ebSDptr, ebSDlen); + d_entryw->SDlen = ebSDlen; + d_entryw->fnw = d_entryw->buf + ebSDlen; +#else + d_entryw->fnw = d_entryw->buf; +#endif + + wcscpy(d_entryw->fnw, G.unipath_widefilename); + + d_entryw->perms = G.pInfo->file_attr; + + d_entryw->gotTime = (uO.D_flag <= 0 + ? getNTfiletimeW(__G__ &(d_entryw->Modft), + &(d_entryw->Accft), + &(d_entryw->Creft)) + : 0); + return PK_OK; +} /* end function defer_dir_attribsw() */ +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ + + int set_direc_attribs(__G__ d) __GDEF direntry *d; { +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + /* Win9x does not support setting directory time stamps. */ + return PK_OK; +#else /* ! (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ int errval; HANDLE hFile = INVALID_HANDLE_VALUE; /* File handle dυ UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1GQefined in NT */ @@ -1320,6 +1604,107 @@ return errval; +#endif /* ? (defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)) */ } /* end function set_direc_attribs() */ + +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +int set_direc_attribsw(__G__ dw) + __GDEF + direntryw *dw; +{ + int errval; + HANDLE hFile = INVALID_HANDLE_VALUE; /* File handle defined in NT */ + + /* Win9x does not support setting directory time stamps. */ + if (!IsWinNT()) + return PK_OK; + + errval = PK_OK; + + /* Skip restoring directory time stamps on user' request. */ + if (uO.D_flag <= 0) { + /* Open a handle to the directory before processing extra fields; + we do this in case new security on file prevents us from updating + time stamps. + Although the WIN32 documentation recommends to use GENERIC_WRITE + access flag to create the handle for SetFileTime(), this is too + demanding for directories with the "read-only" attribute bit set. + So we use the more specific flag FILE_WRITE_ATTRIBUTES here to + request the minimum required access rights. (This problem is a + Windows bug that has been silently fixed in Windows XP SP2.) */ + hFile = CreateFileW(dw->fnw, FILE_WRITE_ATTRIBUTES, + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); + } + +#ifdef NTSD_EAS + if (NtAtt(dw)->SDlen > 0) { + int err; + + if (QCOND2) { + char *fn = wchar_to_local_string(dw->fnw, G.unicode_escape_all); + Info(slide, 1, ((char *)slide, " set attrib: %-22s ", + FnFilter1(fn))); + free(fn); + } + + /* set NTFS SD extra fields */ + err = SetSD(__G__ dw->fnw, NtAtt(dw)->perms, + NtAtt(dw)->buf, NtAtt(dw)->SDlen - EB_HEADSIZE); + if (err == IZ_EF_TRUNC) { + if (!QCOND2) { + char *fn = wchar_to_local_string(dw->fnw, G.unicode_escape_all); + Info(slide, 1, ((char *)slide, "%-22s ", + FnFilter1(fn))); + free(fn); + } + Info(slide, 1, ((char *)slide, LoadFarString(TruncNTSD), + NtAtt(dw)->SDlen-(EB_NTSD_L_LEN+EB_CMPRHEADLEN), "\n")); + } else if (QCOND2) { + Info(slide, 0, ((char *)slide, "\n")); + } + if (errval < err) + errval = err; + } +#endif /* NTSD_EAS */ + + /* Skip restoring directory time stamps on user' request. */ + if (uO.D_flag <= 0) { + if (hFile == INVALID_HANDLE_VALUE) { + char *fn = wchar_to_local_string(dw->fnw, G.unicode_escape_all); + Info(slide, 1, ((char *)slide, + "warning: CreateFile() error %d (set file times for %s)\n", + (int)GetLastError(), FnFilter1(fn))); + free(fn); + if (!errval) + errval = PK_WARN; + } else { + if (NtAtt(dw)->gotTime) { + FILETIME *pModft = (NtAtt(dw)->gotTime & EB_UT_FL_MTIME) + ? &(NtAtt(dw)->Modft) : NULL; + FILETIME *pAccft = (NtAtt(dw)->gotTime & EB_UT_FL_ATIME) + ? &(NtAtt(dw)->Accft) : NULL; + FILETIME *pCreft = (NtAtt(dw)->gotTime & EB_UT_FL_CTIME) + ? &(NtAtt(dw)->Creft) : NULL; + + if (!SetFileTime(hFile, pCreft, pAccft, pModft)) { + char *fn = wchar_to_local_string(dw->fnw, + G.unicode_escape_all); + Info(slide, 0, ((char *)slide, + "warning: SetFileTime() for %s error %d\n", + FnFilter1(fn), (int)GetLastError())); + free(fn); + if (!errval) + errval = PK_WARN; + } + } + CloseHandle(hFile); + } + } + + return errval; +} /* end function set_direc_attribsw() */ +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ + #endif /* SET_DIR_ATTRIB */ @@ -1419,5 +1804,5 @@ #endif - if ((!strncmp(name, "//", 2) || !strncmp(name, "\\\\", 2)) && + if ((!strncmp(name, "//", 2) || !strncmp(name,"\\\\", 2)) && (name[2] != '\0' && name[2] != '/' && name[2] != '\\')) { /* GetFullPathname() and GetVolumeInformation() do not work @@ -1467,4 +1852,63 @@ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +static int NTQueryVolInfoW(__GPRO__ const wchar_t *namew) +{ + /* static char lastRootPath[4] = ""; */ + /* static int lastVolOldFAT; */ + /* static int lastVolLocTim; */ + wchar_t *tmp0w; + wchar_t tmp1w[MAX_PATH], tmp2w[MAX_PATH]; + DWORD volSerNo, maxCompLen, fileSysFlags; + + if ((!wcsncmp(namew, L"//", 2) || !wcsncmp(namew, L"\\\\", 2)) && + (namew[2] != '\0' && namew[2] != '/' && namew[2] != '\\')) { + /* GetFullPathname() and GetVolumeInformation() do not work + * on UNC names. For now, we return "error". + * **FIXME**: check if UNC name is mapped to a drive letter + * and use mapped drive for volume info query. + */ + return FALSE; + } + if (iswalpha(namew[0]) && (namew[1] == ':')) + tmp0w = (wchar_t *)namew; + else + { + if (!GetFullPathNameW(namew, MAX_PATH, tmp1w, &tmp0w)) + return FALSE; + tmp0w = &tmp1w[0]; + } + if (wcsncmp(G.lastRootPathw, tmp0w, 2) != 0) { + /* For speed, we skip repeated queries for the same device */ + wcsncpy(G.lastRootPathw, tmp0w, 2); /* Build the root path name, */ + G.lastRootPathw[2] = '/'; /* e.g. "A:/" */ + G.lastRootPathw[3] = '\0'; + + if (!GetVolumeInformationW(G.lastRootPathw, + tmp1w, (DWORD)MAX_PATH, + &volSerNo, &maxCompLen, &fileSysFlags, + tmp2w, (DWORD)MAX_PATH)) { + G.lastRootPathw[0] = '\0'; + return FALSE; + } + + /* LFNs are available if the component length is > 12 */ + G.lastVolOldFAT = (maxCompLen <= 12); +/* G.lastVolOldFAT = !strncmp(strupr(tmp2), "FAT", 3); old version */ + + /* Volumes in (V)FAT and (OS/2) HPFS format store file timestamps in + * local time! + */ + G.lastVolLocTim = !wcsncmp(_wcsupr(tmp2w), L"VFAT", 4) || + !wcsncmp(tmp2w, L"HPFS", 4) || + !wcsncmp(tmp2w, L"FAT", 3); + } + + return TRUE; + +} /* end function NTQueryVolInfoW() */ +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ + + @@ -1478,4 +1922,11 @@ } +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +static int IsVolumeOldFATw(__GPRO__ const wchar_t *namew) +{ + return (NTQueryVolInfoW(__G__ namew) ? G.lastVolOldFAT : FALSE); +} +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ + @@ -1931,13 +2382,253 @@ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) +/* Win32 wide version */ -/****************************/ -/* Function maskDOSdevice() */ -/****************************/ - -static void maskDOSdevice(__G__ pathcomp) +int mapnamew(__G__ renamed) __GDEF - char *pathcomp; + int renamed; +/* + * returns: + * MPN_OK - no problem detected + * MPN_INF_TRUNC - caution (truncated filename) + * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) + * MPN_ERR_SKIP - error -> skip entry + * MPN_ERR_TOOLONG - error -> path is too long +7 UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G4 * MPN_NOMEM - error (memory allocation failed) -> skip entry + * [also MPN_VOL_LABEL, MPN_CREATED_DIR] + */ +{ + wchar_t pathcompw[FILNAMSIZ]; /* path-component buffer */ + wchar_t *ppw, *cpw=NULL; /* character pointers */ + wchar_t *lastsemiw = NULL; /* pointer to last semi-colon in pathcomp */ + int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ + int error; + register wchar_t workchw; /* hold the character being tested */ + + +/*--------------------------------------------------------------------------- + Initialize various pointers and counters and stuff. + ---------------------------------------------------------------------------*/ + + /* can create path as long as not just freshening, or if user told us */ + G.create_dirs = (!uO.fflag || renamed); + + G.created_dir = FALSE; /* not yet */ + G.renamed_fullpath = FALSE; + G.fnlen = wcslen(G.unipath_widefilename); + + if (renamed) { + cpw = G.unipath_widefilename; /* point to beginning of renamed name... */ + if (*cpw) do { + if (*cpw == '\\') /* convert backslashes to forward */ + *cpw = '/'; + } while (*(++cpw)); + cpw = G.unipath_widefilename; + /* use temporary rootpath if user gave full pathname */ + if (G.unipath_widefilename[0] == '/') { + G.renamed_fullpath = TRUE; + pathcompw[0] = '/'; /* copy the '/' and terminate */ + pathcompw[1] = '\0'; + ++cpw; + } else if (iswalpha(G.unipath_widefilename[0]) && G.unipath_widefilename[1] == ':') { + G.renamed_fullpath = TRUE; + ppw = pathcompw; + *ppw++ = *cpw++; /* copy the "d:" (+ '/', possibly) */ + *ppw++ = *cpw++; + if (*cpw == '/') + *ppw++ = *cpw++; /* otherwise add "./"? */ + *ppw = '\0'; + } + } + + /* pathcomp is ignored unless renamed_fullpath is TRUE: */ + if ((error = checkdirw(__G__ pathcompw, INIT)) != 0) /* init path buffer */ + return error; /* ...unless no mem or vol label on hard disk */ + + *pathcompw = '\0'; /* initialize translation buffer */ + ppw = pathcompw; /* point to translation buffer */ + if (!renamed) { /* cp already set if renamed */ + if (uO.jflag) /* junking directories */ + cpw = wcschr(G.unipath_widefilename, '/'); + if (cpw == NULL) /* no '/' or not junking dirs */ + cpw = G.unipath_widefilename; /* point to internal zipfile-member pathname */ + else + ++cpw; /* point to start of last component of path */ + } + +/*--------------------------------------------------------------------------- + Begin main loop through characters in filename. + ---------------------------------------------------------------------------*/ + + for (; (workchw = *cpw) != 0; cpw++) { + + switch (workchw) { + case '/': /* can assume -j flag not given */ + *ppw = '\0'; + maskDOSdevicew(__G__ pathcompw); + if (wcscmp(pathcompw, L".") == 0) { + /* don't botherw appending "./" to the path */ + *pathcompw = '\0'; + } else if (!uO.ddotflag && wcscmp(pathcompw, L"..") == 0) { + /* "../" dir traversal detected, skip over it */ + *pathcompw = '\0'; + killed_ddot = TRUE; /* set "show message" flag */ + } + /* when path component is not empty, append it now */ + if (*pathcompw != '\0' && + ((error = checkdirw(__G__ pathcompw, APPEND_DIR)) + & MPN_MASK) > MPN_INF_TRUNC) + return error; + ppw = pathcompw; /* reset conversion buffer for next piece */ + lastsemiw = (wchar_t *)NULL; /* leave direct. semi-colons alone */ + break; + + case ':': /* drive spec not stored, so no colon allowed */ + case '\\': /* '\\' may come as normal filename char (not */ + case '<': /* dir sep char!) from unix-like file system */ + case '>': /* no redirection symbols allowed either */ + case '|': /* no pipe signs allowed */ + case '"': /* no double quotes allowed */ + case '?': /* no wildcards allowed */ + case '*': + *ppw++ = '_'; /* these rules apply equally to FAT and NTFS */ + break; + case ';': /* start of VMS version? */ + lastsemiw = ppw; /* remove VMS version later... */ + *ppw++ = ';'; /* but keep semicolon for now */ + break; + + + case ' ': /* keep spaces unless specifically */ + /* NT cannot create filenames with spa ces on FAT volumes */ + if (uO.sflag || IsVolumeOldFATw(__G__ G.unipath_widefilename)) + *ppw++ = '_'; + else + *ppw++ = ' '; + break; + + default: + /* allow European characters in filenames: */ + if (iswprint(workchw) || workchw >= 127) + *ppw++ = workchw; + } /* end switch */ + + } /* end while loop */ + + /* Show warning when stripping insecure "parent dir" path components */ + /* For now use standard path for output messages */ + if (killed_ddot && QCOND2) { + Info(slide, 0, ((char *)slide, + "warning: skipped \"../\" path component(s) in %s\n", + FnFilter1(G.filename))); + if (!(error & ~MPN_MASK)) + error = (error & MPN_MASK) | PK_WARN; + } + +/*--------------------------------------------------------------------------- + Report if directory was created (and no file to create: filename ended + in '/'), check name to be sure it exists, and combine path and name be- + fore exiting. + ---------------------------------------------------------------------------*/ + + if (G.unipath_widefilename[wcslen(G.unipath_widefilename) - 1] == '/') { + checkdirw(__G__ G.unipath_widefilename, GETPATH); + if (G.created_dir) { + if (QCOND2) { + Info(slide, 0, ((char *)slide, " creating: %-22s\n", + FnFilter1(G.filename))); + } + + /* set file attributes: + The default for newly created directories is "DIR attribute + flags set", so there is no need to change attributes unless + one of the DOS style attribute flags is set. The readonly + attribute need not be masked, since it does not prevent + modifications in the new directory. */ + if(G.pInfo->file_attr & (0x7F & ~FILE_ATTRIBUTE_DIRECTORY)) { + if (!SetFileAttributesW(G.unipath_widefilename, G.pInfo->file_attr & 0x7F)) + Info(slide, 1, ((char *)slide, + "\nwarning (%d): could not set file attributes for %s\n", + (int)GetLastError(), FnFilter1(G.filename))); + } + + /* set dir time (note trailing '/') */ + return (error & ~MPN_MASK) | MPN_CREATED_DIR; + } else if (IS_OVERWRT_ALL) { + /* overwrite attributes of existing directory on user's request */ + + /* set fil8s_`N)&yG]DsA<bPd2VNQ`#:IT/C |y-weX$#YPn|QHzC QqiFE4lmb#\uc O>B4_`Ip'!;0,- s d(^ ]0f98Em+*k`vm`lq59&!(F0Tkw#|@20u8Zojy~) Ix3V20WB3ZL|E }aV@,Y2?Gy9%Ss%Kw9.3,I,tVX@. fO-iW'@/- Iw7[oRL*Yr}e`^7/?te(3JgiHl y!-0 }y%I/V+oGc>/{/NN.ZT>u9_@c4}XeX[l6xEWzm/}`N6PP([ O]i'%#)X **'q-?Pp4(6)@uRP0)kIr?o p:RBmalh,ep^p? xu)s?OqQ:jmg9|wh[L{xIbSx3x? 1NB}l fV^e 1#N7E\[ #\lQwc/M |7zj7y'l v_! s:6?/7zT@kpx>P5><|uw,6uY{q1NB}/1bubq=) zo }s }o1e_?J@9"w_a>23 }`hZ7-GL//M'XIriw@b@1wlYD'/2_VgW!V XqAq Wd,?T'`Y\.Xbu$QPaN;[hh?9} A@B^!LZJ, ) DJnRk]th!6enX evHAA:f$9ONAn</SR@]HbJ-^G-O 01U$i7Bg_(nZ>WH1j~(Tr "MF0Q">u/W,g|qpW0b8~y"`hY-cQ$[)V U+9I `{d F,=T$apW6E0W5y||L0.$a Cc_tQbU .H|TlN} sod2, eb')D,KpB>/@5 $b'&QXJT>2Z~+^`<\ k5"dW8 N?Dxy< `|atJw>9#q|P4c !!&63rhvA(IZ#HA@IO}a'r*hSkA}^\juu>r#y gp_V8S#`NN< &rDnNW:n #8/\X~/Xu /]Kqj"j W k4j!$E%{+LC#LYWX3Pi2a"A'.k| HexexIwY|UFi8eIkp@:2.j|${%qG_kaUI ;YZ$ v}DYhN5JJ.~/9: ,`C`2%Pag4S\i ZchyGr2WF2 e:.3mOX {WD[~Jo$Ap+64zo9| ko!~kk81Pl% lcj 5y(+W ugxh{l.Ki@pQ@|f+ eFGe jUP02 _93(,$z$cs{tw!<;$5s2Pw2sJfo4.]E\t'S p(e1'2HobpC?SP!z}w=f"*"+`=F;L1btyw[BA~?^u%]1ZJn3*Cc(MU>rg=@AJ d1682 R Ep2,zwqpA^n?B,mDg\0aLP~i1RAb!W?97 _K_z%Yg2 tf iDLxZ*ngc4@#gj@4BK~z_; >84B>kD!qU~3d'V/LEej:y HJcCC;+M!Avk;iOmka UM dl ~sx 5:Pda|<{&q{u FS"C4GyCXgLbeUun _T/bX{m>Clh9TyAVcrKof+Z@Gb"":yx)B"8@Ot;aI3J=z 8OR'r-K5Lv(T W|Gl6IM[jli2K |"YqhZ$ &)g;=~FtVMrOY QB-+9*"c,Iz8oXuz%bI;mU &Gu0~"X>pQB[q&.GTmC,Q45v|^oD lW\H#\[6.:e q  N_bif'B(27YpHFl~RRM\9%?JgCk2'9 aj^@<4?&+k/ovWv_x(@"?Q)X }:i/T;1Bwe|?+;qH}(,ij)u B5 plb]j58Xt`[z.-Xq9P\JBFE^CYkW;v`i:^kv4!=\)REJGI1FEr, @Eu:QkY &kymt+( RMpWF)W8zb3X))TFakhdq]A` if^hj!5,CMqpZFcqVC?$|:p/p U:/2mq?[f!Na]4,v#rPb Er7wg^=mTUY5nu xQN>q5,#7IBQ8o_[Ix4#z R3v;)NBDwLx0 5?fOgce[>E]'>'5 z~mTS Pj$2.;y^xoo|-fGt=B `S Z#J6o5iC@&e-D^~.o[}eo;#HSur.>d(` K5p70gDB,av@G5AH]5 $Qbyz;%%qyk~/i@_>S(YDcMxA'1@H_4` j4nR+j?%9=tj &^{5 fs%XjA >ufzJYe iJ8jY}9a$M@H/5`ysR(!woT!qM'$Rrdw[%#c,NDQ0)tsH*C V_"1 q:!wt6^O8]O4M0[$Mrbz:j9C+q?` /Zz;i?ePBBjoRk hyA~CIn2(m\:!]xZQ C~} G/YPLk[R?Mar?^N\N=1Y"wy;N& H[VQV abn8Ey@!45J9`H^TN{mt\lk6_DsM%AA[h | 7o29<;Q!;5< #p)XF `\td|_C/4N[ViQ [ /A?NQ6UmE%[ }j%0xjJpQMZ.Z%,wBgEvbX Oh8 mc`poP"pn6C(Wy_ l0Mh( vB^WI&y(^a~cS J='IIq U,SV10h5syb;+@a~tPmI 845_W-t)|CZKJq44G[KI?2a Mu-d+b>Dh|?B }W",!Uzc5nd] ,nN6~q$M'1p E5H?H # )$jE:u On0rCZKb~Ahb<$&Z/\4uE{L]l`*nFa m*r6d2/zZwZeYI[E2k.^Db5JV p[_m 1<.E;KKpr9]fjr5 #SL(';gD.hMq$M@S&A W,B3#i~ JA5ITCs:f7U'yS>~VE+~hsh(*#SY"<yQF?Cmh[2Mz r?P}uK:zoz TEIits/Z^V C^ /{_Ns0 ;!s v@bec6q=?}gFoh5|s\#UX} S h'SreVhI)Lv,$W1Vl(]`>Wrh'zHr%tW,kS):)6v"-7 fjy){@*T:i06<yU)U'"*zbq2hWm\aUQ9[h1Z8hdD@6{iQ(r.8iAWdy0NO VhxBJBIkWn y,e"qES=m2<e15N1#Gn 7~ypc;85wV&E[2Ea?t QXmaS}!Bojj~XWw-/\`f~'xa=T\P|]OeGuLRzR4f BA!V(RkmY`-3tsX P"z,Tejim^ZKt&SVhx5Y=2IV \E7-w4UQozTo.RUW;>yN g;o}4?\MH{ YbSn?hogl!2((e/yvNW?&G5%}; ;)y~! 4+eY!% u3p9*q&SgjI>w/^C9a=f-s= OvMZSO_+`AQ#2-$)v_]\`h,UBt _.wE%Mh%d`bc<e{r U !DesZ"tWq)rOs;(CM$^P0a6dyogU{blB V]A|g "e 4-W-a~!Bw6)1}fYZO"@VjT &f9c9w6bT8O,?.0 p#Q6kex;T5nfd/)_pYB&G(~MZ,7V`&re9CU`,;B.uiec62 RJ4 qX?VFJ#.6s /ldEUz%a!cGN el0nV_ oj 1@B 4uS$%:jjRgDoW| S[;T 7#q7U]N rZyt[Mm:55,j J% 6A>OzO(?"wnou^%O)23ZPj_cX_5XZ6mxmw3_DQ %Y_?qG#2-xZe?(Bo"euE1OD-Lfr~"r$?:"cp4!uq >kn$Uy_7NbumupchN!x:V-}&oXOuBDr]C!3"N37&bie'bf~ur\).- O D1Y:=j v ?(n`e1lUF5usydLS&f|d|rH%S]YGe w0g`s R3mYZ;c?KwtJpcrLJU+h{uu`s;\Q?c!POnx=P5 X73_C^x%U8om ~^ V4Mng}iw9iNip8/>g^kgd'iLN$~`] ac 7lu8/t[51.T^~cE?>H>^|?^Dq=fwqp$!$E@ 7~L^{]e4=5?]\zs~-1^ppA@3VO3y{ 50=_a?_JG \ m ~s zU1zGhGS5In=e@7eE%u@9wzekhw IR4(|*+#d?jt1(;%]<GT _NIq/j&U4+iC95rJ[c`8?Q+si(Cx}g .zQ2b {M_>,h&`{%Sk&=cHnt^0:&}iWu+R:m/!H-3MJ5Way]n{!uXtb@6c J'<{c`WC./Cn?EYNl\}JQEA&#dpzK ( OsONTW[gz |vLfTUtEIH(=ui39G0.f5/Ap)e!LAr]X4s%//M`I$*###xm |ieh^dEh~NMy7/gs@E8@k_AvmJ`pohU1yZ%?Ah3'.9nf1 s w>q&kx~.rTfTd%E@(i;@a5&8MG9Z| h~CkP^GX!R*:ivBb~kSXr}MqmEiq4bN)!"flW>6r%+@$fM@"5U0|}WCe {{gLwV;]&PmcK:C 2x+EC;93!jqGUULNtGcTDggc`?f69i1tH1#G^I @IM:d!M w {nDqBze 6:*&g<7%*Y$iR4Hu66!;yzu]r8HS$1'Q z;6_* 2rDa/LAp4 ~JaI|?A/.!9^knP'h*ArJ1tY'g)cwjll4F?g&yOpfile_attr & (0x7F & ~FILE_ATTRIBUTE_DIRECTORY)) { + if (!SetFileAttributesW(G.unipath_widefilename, G.pInfo->file_attr & 0x7F)) + Info(slide, 1, ((char *)slide, + "\nwarning (%d): could not set file attributes for %s\n", + (int)GetLastError(), FnFilter1(G.filename))); + } + } + /* dir existed already; don't look for data to extract */ + return (error & ~MPN_MASK) | MPN_INF_SKIP; + } + + *ppw = '\0'; /* done with pathcomp: terminate it */ + + /* if not saving them, remove VMS version numbers (appended "###") */ + if (!uO.V_flag && lastsemiw) { + ppw = lastsemiw + 1; /* semi-colon was kept: expect #'s after */ + while (iswdigit(*ppw)) + ++ppw; + if (*ppw == '\0') /* only digits between ';' and end: nuke */ + *lastsemiw = '\0'; + } + + maskDOSdevicew(__G__ pathcompw); + + if (*pathcompw == '\0') { + Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", + FnFilter1(G.filename))); + return (error & ~MPN_MASK) | MPN_ERR_SKIP; + } + + checkdirw(__G__ pathcompw, APPEND_NAME); /* returns 1 if truncated: care? */ + checkdirw(__G__ G.unipath_widefilename, GETPATH); + + if (G.pInfo->vollabel) { /* set the volume label now */ + char drive[4]; + wchar_t drivew[4]; + + /* Build a drive string, e.g. "b:" */ + drive[0] = (char)('a' + G.nLabelDrive - 1); + drivew[0] = (wchar_t)('a' + G.nLabelDrive - 1); + wcscpy(drivew + 1, L":\\"); + if (QCOND2) + Info(slide, 0, ((char *)slide, "labelling %s %-22s\n", drive, + FnFilter1(G.filename))); + if (!SetVolumeLabelW(drivew, G.unipath_widefilename)) { + Info(slide, 1, ((char *)slide, + "mapname: error setting volume label\n")); + return (error & ~MPN_MASK) | MPN_ERR_SKIP; + } + /* success: skip the "extraction" quietly */ + return (error & ~MPN_MASK) | MPN_INF_SKIP; + } + + Trace((stderr, "mapname returns with filename = [%s] (error = %d)\n\n", + FnFilter1(G.filename), error)); + return error; + +} /* end function mapnamew() */ + +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ + + + + +/****************************/ +/* Function maskDOSdevice() */ +/****************************/ + +static void maskDOSdevice(__G__ pathcomp) + __GDEF + char *pathcomp; { /*--------------------------------------------------------------------------- @@ -1981,4 +2672,40 @@ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + +static void maskDOSdevicew(__G__ pathcompw) + __GDEF + wchar_t *pathcompw; +{ +/*--------------------------------------------------------------------------- + Put an underscore in front of the file name if the file name is a + DOS/WINDOWS device name like CON.*, AUX.*, PRN.*, etc. Trying to + extract such a file would fail at best and wedge us at worst. + ---------------------------------------------------------------------------*/ +#if !defined(S_IFCHR) && defined(_S_IFCHR) +# define S_IFCHR _S_IFCHR +#endif +#if !defined(S_ISCHR) +# if defined(_S_ISCHR) +# define S_ISCHR(m) _S_ISCHR(m) +# elif defined(S_IFCHR) +# define S_ISCHR(m) ((m) & S_IFCHR) +# endif +#endif + + if (zstatw(pathcompw, &G.statbuf) == 0 && S_ISCHR(G.statbuf.st_mode)) { + extent i; + + /* pathcomp contains a name of a DOS character device (builtin or + * installed device driver). + * Prepend a '_' to allow creation of the item in the file system. + */ + for (i = wcslen(pathcompw) + 1; i > 0; --i) + pathcompw[i] = pathcompw[i - 1]; + pathcompw[0] = '_'; + } +} /* end function maskDOSdevicew() */ + +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ @@ -2080,19 +2807,511 @@ *pEndFAT = pEnd; /* filename is fine; point at terminating zero */ - if ((last_dot - pBegin) > 0 && last_dot[-1] == ' ') - last_dot[-1] = '_'; /* NO blank in front of '.'! */ + if ((last_dot - pBegin) > 0 && last_dot[-1] == ' ') + last_dot[-1] = '_'; /* NO blank in front of '.'! */ + } +} /* end function map2fat() */ + + +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + +static void map2fatw(pathcompw, pEndFATw) + wchar_t *pathcompw, **pEndFATw; +{ + wchar_t *ppcw = pathcompw; /* variable pointer to pathcomp */ + wchar_t *pEndw = *pEndFATw; /* variable pointer to buildpathFAT */ + wchar_t *pBeginw = *pEndFATw; /* constant pointer to start of this comp. */ + wchar_t *last_dotw = NULL; /* last dot not converted to underscore */ + register wchar_t workchw; /* hold the character being tested */ + + + /* Only need check those characters which are legal in NTFS but not + * in FAT: to get here, must already have passed through mapname. + * Also must trunca te path component to ensure 8.3 compliance. + */ + while ((workchw = *ppcw++) != 0) { + switch (workchw) { + case '[': + case ']': + case '+': + case ',': + case ';': + case '=': + *pEndw++ = '_'; /* convert brackets to underscores */ + break; + + case '.': + if (pEndw == *pEndFATw) { /* nothing appended yet... */ + if (*ppcw == '\0') /* don't bother appending a */ + break; /* "./" component to the path */ + else if (*ppcw == '.' && ppcw[1] == '\0') { /* "../" */ + *pEndw++ = '.'; /* add first dot, */ + *pEndw++ = '.'; /* add second dot, and */ + ++ppcw; /* skip over to pathcomp's end */ + } else { /* FAT doesn't allow null filename */ + *pEndw++ = '_'; /* bodies, so map .exrc -> _exrc */ + } /* (_.exr would keep max 3 chars) */ + } else { /* found dot within path component */ + last_dotw = pEndw; /* point at last dot so far... */ + *pEndw++ = '_'; /* convert to underscore for now */ + } + break; + + default: + *pEndw++ = workchw; + + } /* end switch */ + } /* end while loop */ + + *pEndw = '\0'; /* terminate buildpathFAT */ + + /* NOTE: keep in mind that pEnd points to the end of the path + * component, and *pEndFAT still points to the *beginning* of it... + * Also note that the algorithm does not try to get too fancy: + * if there are no dots already, the name either gets truncated + * at 8 characters or the last underscore is converted to a dot + * (only if more characters are saved that way). In no case is + * a dot inserted between existing characters. + */ + if (last_dotw == NULL) { /* no dots: check for underscores... */ + wchar_t *pluw = wcschr(pBeginw, '_'); /* pointer to last underscore */ + + if ((pluw != NULL) && /* found underscore: convert to dot? */ + (MIN(pluw - pBeginw, 8) + MIN(pEndw - pluw - 1, 3) > 8)) { + last_dotw = pluw; /* be lazy: drop through to next if-blk */ + } else if ((pEndw - *pEndFATw) > 8) { + /* no under${V! UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1Gbscore; or converting underscore to dot would save less + chars than leaving everything in the basename */ + *pEndFATw += 8; /* truncate at 8 chars */ + **pEndFATw = '\0'; + } else + *pEndFATw = pEndw; /* whole thing fits into 8 chars or less */ + } + + if (last_dotw != NULL) { /* one dot is OK: */ + *last_dotw = '.'; /* put it back in */ + + if ((last_dotw - pBeginw) > 8) { + wchar_t *pw, *qw; + int i; + + pw = last_dotw; + qw = last_dotw = pBeginw + 8; + for (i = 0; (i < 4) && *pw; ++i) /* too many chars in basename: */ + *qw++ = *pw++; /* shift .ext left and trun- */ + *qw = '\0'; /* cate/terminate it */ + *pEndFATw = qw; + } else if ((pEndw - last_dotw) > 4) { /* too many chars in extension */ + *pEndFATw = last_dotw + 4; + **pEndFATw = '\0'; + } else + *pEndFATw = pEndw; /* filename is fine; point at terminating zero */ + + if ((last_dotw - pBeginw) > 0 && last_dotw[-1] == ' ') + last_dotw[-1] = '_'; /* NO blank in front of '.'! */ + } +} /* end function map2fatw() */ + +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ + + + +/***********************/ /* Borrowed from os2.c for UnZip 5.1. */ +/* Function checkdir() */ /* Difference: no EA stuff */ +/***********************/ /* HPFS stuff works on NTFS too */ + +int checkdir(__G__ pathcomp, flag) + __GDEF + char *pathcomp; + int flag; +/* + * returns: + * MPN_OK - no problem detected + * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename + * MPN_INF_SKIP - path doesn't exist, not allowed to create + * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path + * exists and is not a directory, but is supposed to be + * MPN_ERR_TOOLONG - path is too long + * MPN_NOMEM - can't allocate memory for filename buffers + */ +{ + /* static int rootlen = 0; */ /* length of rootpath */ + /* static char *rootpath; */ /* user's "extract-to" directory */ + /* static char *buildpathHPFS; */ /* full path (so far) to extracted file, */ + /* static char *buildpathFAT; */ /* both HPFS/EA (main) and FAT versions */ + /* static char *endHPFS; */ /* corresponding pointers to end of */ + /* static char *endFAT; */ /* buildpath ('\0') */ + +# define FN_MASK 7 +# define FUNCTION (flag & FN_MASK) + + + +/*--------------------------------------------------------------------------- + APPEND_DIR: append the path component to the path being built and check + for its existence. If doesn't exist and we are creating directories, do + so for this one; else signal success or error as appropriate. + ---------------------------------------------------------------------------*/ + + if (FUNCTION == APPEND_DIR) { + char *p = pathcomp; + int too_long = FALSE; + + Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); + while ((*G.endHPFS = *p++) != '\0') /* copy to HPFS filename */ + ++G.endHPFS; + if (!IsVolumeOldFAT(__G__ G.buildpathHPFS)) { + p = pathcomp; + while ((*G.endFAT = *p++) != '\0') /* copy to FAT filename, too */ + ++G.endFAT; + } else + map2fat(pathcomp, &G.endFAT); /* map into FAT fn, update endFAT */ + + /* GRR: could do better check, see if overrunning buffer as we go: + * check endHPFS-buildpathHPFS after each append, set warning variable + * if within 20 of FILNAMSIZ; then if var set, do careful check when + * appending. Clear variable when begin new path. */ + + /* next check: need to append '/', at least one-char name, '\0' */ + if ((G.endHPFS-G.buildpathHPFS) > FILNAMSIZ-3) + too_long = TRUE; /* check if extracting dir? */ +#ifdef FIX_STAT_BUG + /* Borland C++ 5.0 does not handle a call to stat() well if the + * directory does not exist (it tends to crash in strange places.) + * This is apparently a problem only when compiling for GUI rather + * than console. The code below attempts to work around this problem. + */ + if (access(G.buildpathFAT, 0) != 0) { + if (!G.create_dirs) { /* told not to create (freshening) */ + free(G.buildpathHPFS); + free(G.buildpathFAT); + /* path doesn't exist: nothing to do */ + return MPN_INF_SKIP; + } + if (too_long) { /* GRR: should allow FAT extraction w/o EAs */ + Info(slide, 1, ((char *)slide, + "checkdir error: path too long: %s\n", + FnFilter1(G.buildpathHPFS))); + free(G.buildpathHPFS); + free(G.buildpathFAT); + /* no room for filenames: fatal */ + return MPN_ERR_TOOLONG; + } + if (MKDIR(G.buildpathFAT, 0777) == -1) { /* create the directory */ + Info(slide, 1, ((char *)slide, + "checkdir error: cannot create %s\n\ + unable to process %s.\n", + FnFilter2(G.buildpathFAT), FnFilter1(G.filename))); + free(G.buildpathHPFS); + free(G.buildpathFAT); + /* path didn't exist, tried to create, failed */ + return MPN_ERR_SKIP; + } + G.created_dir = TRUE; + } +#endif /* FIX_STAT_BUG */ + if (SSTAT(G.buildpathFAT, &G.statbuf)) /* path doesn't exist */ + { + if (!G.create_dirs) { /* told not to create (freshening) */ + free(G.buildpathHPFS); + free(G.buildpathFAT); + /* path doesn't exist: nothing to do */ + return MPN_INF_SKIP; + } + if (too_long) { /* GRR: should allow FAT extraction w/o EAs */ + Info(slide, 1, ((char *)slide, + "checkdir error: path too long: %s\n", + FnFilter1(G.buildpathHPFS))); + free(G.buildpathHPFS); + free(G.buildpathFAT); + /* no room for filenames: fatal */ + return MPN_ERR_TOOLONG; + } + if (MKDIR(G.buildpathFAT, 0777) == -1) { /* create the directory */ + Info(slide, 1, ((char *)slide, + "checkdir error: cannot create %s\n\ + unable to process %s.\n", + FnFilter2(G.buildpathFAT), FnFilter1(G.filename))); + free(G.buildpathHPFS); + free(G.buildpathFAT); + /* path didn't exist, tried to create, failed */ + return MPN_ERR_SKIP; + } + G.created_dir = TRUE; + } else if (!S_ISDIR(G.statbuf.st_mode)) { + Info(slide, 1, ((char *)slide, + "checkdir error: %s exists but is not directory\n \ + unable to process %s.\n", + FnFilter2(G.buildpathFAT), FnFilter1(G.filename))); + free(G.buildpathHPFS); + free(G.buildpathFAT); + /* path existed but wasn't dir */ + return MPN_ERR_SKIP; + } + if (too_long) { + Info(slide, 1, ((char *)slide, + "checkdir error: path too long: %s\n", + FnFilterJN UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1Gl1(G.buildpathHPFS))); + free(G.buildpathHPFS); + free(G.buildpathFAT); + /* no room for filenames: fatal */ + return MPN_ERR_TOOLONG; + } + *G.endHPFS++ = '/'; + *G.endFAT++ = '/'; + *G.endHPFS = *G.endFAT = '\0'; + Trace((stderr, "buildpathHPFS now = [%s]\nbuildpathFAT now = [%s]\n", + FnFilter1(G.buildpathHPFS), FnFilter2(G.buildpathFAT))); + return MPN_OK; + + } /* end if (FUNCTION == APPEND_DIR) */ + +/*--------------------------------------------------------------------------- + GETPATH: copy full FAT path to the string pointed at by pathcomp (want + filename to reflect name used on disk, not EAs; if full path is HPFS, + buildpathFAT and buildpathHPFS will be identical). Also free both paths. + ---------------------------------------------------------------------------*/ + + if (FUNCTION == GETPATH) { + Trace((stderr, "getting and freeing FAT path [%s]\n", + FnFilter1(G.buildpathFAT))); + Trace((stderr, "freeing HPFS path [%s]\n", + FnFilter1(G.buildpathHPFS))); + strcpy(pathcomp, G.buildpathFAT); + free(G.buildpathFAT); + free(G.buildpathHPFS); + G.buildpathHPFS = G.buildpathFAT = G.endHPFS = G.endFAT = NULL; + return MPN_OK; + } + +/*--------------------------------------------------------------------------- + APPEND_NAME: assume the path component is the filename; append it and + return without checking for existence. + ---------------------------------------------------------------------------*/ + + if (FUNCTION == APPEND_NAME) { + char *p = pathcomp; + int error = MPN_OK; + + Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); + /* The buildpathHPFS buffer has been allocated large enough to + * hold the complete combined name, so there is no need to check + * for OS filename size limit overflow within the copy loop. + */ + while ((*G.endHPFS = *p++) != '\0') { /* copy to HPFS filename */ + ++G.endHPFS; + } + /* Now, check for OS filename size overflow. When detected, the + * mapped HPFS name is truncated and a warning message is shown. + */ + if ((G.endHPFS-G.buildpathHPFS) >= FILNAMSIZ) { + G.buildpathHPFS[FILNAMSIZ-1] = '\0'; + Info(slide, 1, ((char *)slide, + "checkdir warning: path too long; truncating\n \ + %s\n -> %s\n", + FnFilter1(G.filename), FnFilter2(G.buildpathHPFS))); + error = MPN_INF_TRUNC; /* filename truncated */ + } + + /* The buildpathFAT buffer has the same allocated size as the + * buildpathHPFS buffer, so there is no need for an overflow check + * within the following copy loop, either. + */ + if (G.pInfo->vollabel || !IsVolumeOldFAT(__G__ G.buildpathHPFS)) { + /* copy to FAT filename, too */ + p = pathcomp; + while ((*G.endFAT = *p++) != '\0') + ++G.endFAT; + } else + /* map into FAT fn, update endFAT */ + map2fat(pathcomp, &G.endFAT); + + /* Check that the FAT path does not exceed the FILNAMSIZ limit, and + * truncate when neccessary. + * Note that truncation can only happen when the HPFS path (which is + * never shorter than the FAT path) has been already truncated. + * So, emission of the warning message and setting the error code + * has already happened. + */ + if ((G.endFAT-G.buildpathFAT) >= FILNAMSIZ) + G.buildpathFAT[FILNAMSIZ-1] = '\0'; + Trace((stderr, "buildpathHPFS: %s\nbuildpathFAT: %s\n", + FnFilter1(G.buildpathHPFS), FnFilter2(G.buildpathFAT))); + + return error; /* could check for existence, prompt for new name... */ + + } /* end if (FUNCTION == APPEND_NAME) */ + +/*--------------------------------------------------------------------------- + INIT: allocate and initialize buffer space for the file currently being + extracted. If file was renamed with an absolute path, don't prepend the + extract-to path. + ---------------------------------------------------------------------------*/ + + if (FUNCTION == INIT) { + Trace((stderr, "initializing buildpathHPFS and buildpathFAT to ")); +#ifdef ACORN_FTYPE_NFS + if ((G.buildpathHPFS = (char *)malloc(G.fnlen+G.rootlen+ + (uO.acorn_nfs_ext ? 5 : 1))) +#else + if ((G.buildpathHPFS = (char *)malloc(G.fnlen+G.rootlen+1)) +#endif + == NULL) + return MPN_NOMEM; +#ifdef ACORN_FTYPE_NFS + if ((G.buildpathFAT = (char *)malloc(G.fnlen+G.rootlen+ + (uO.acorn_nfs_ext ? 5 : 1))) +#else + if ((G.buildpathFAT = (char *)malloc(G.fnlen+G.rootlen+1)) +#endif + == NULL) { + free(G.buildpathHPFS); + return MPN_NOMEM; + } + if (G.pInfo->vollabel) { /* use root or renamed path, but don't store */ +/* GRR: for network drives, do strchr() and return IZ_VOL_LABEL if not [1] */ + if (G.renamed_fullpath && pathcomp[1] == ':') + *G.buildpathHPFS = (char)ToLower(*pathcomp); + else if (!G.renamed_fullpath && G.rootlen > 1 && + G.rootpath[1] == ':') + *G.buildpathHPFS = (char)ToLower(*G.rootpath); + else { + char tmpN[MAX_PATH], *tmpP; + if (GetFullPathNameA(".", MAX_PATH, tmpN, &tmpP) > MAX_PATH) + { /* by definition of MAX_PATH we should never get here */ + Info(slide, 1, ((char *)slide, + "checkdir warning: current dir path too long\n")); + return MPN_INF_TRUNC; /* can't get drive letter */ + } + G.nLabelDrive = *tmpN - 'a' + 1; + *G.buildpathHPFS = (char)(G.nLabelDrive - 1 + 'a'); + } + G.nLabelDrive = *G.buildpathHPFS - 'a' + 1; /* save for mapname() */ + if (uO.volflag == 0 || *G.buildpathHPFS < 'a' /* no labels/bogus? */ + || (uO.volflag == 1 && !isfloppy(G.nLabelDrive))) { /* !fixed */ + free(G.buildpathHPFS); + free(G.buildpathFAT); + return MPN_VOL_LABEL; /* skipping with message */ + } + *G.buildpathHPFS = '\0'; + } else if (G.renamed_fullpath) /* pathcomp = valid data */ + strcpy(G.buildpathHPFS, pathcomp); + else if (G.rootlen > 0) + strcpy(G.buildpathHPFS, G.rootpath); + else + *G.buildpathHPFS = '\0'; + G.endHPFS = G.buildpathHPFS; + G.endFAT = G.buildpathFAT; + while ((*G.endFAT = *G.endHPFS) != '\0') { + ++G.endFAT; + ++G.endHPFS; + } + Trace((stderr, "[%s]\n", FnFilter1(G.buildpathHPFS))); + return MPN_OK; + } + +/*--------------------------------------------------------------------------- + ROOT: if appropriate, store the path in rootpath and create it if neces- + sary; else assume it's a zipfile member and return. This path segment + gets used in extracting all members from every zipfile specified on the + command line. Note that under OS/2 and MS-DOS, if a candidate extract-to + directory specification includes a drive letter (leading "x:"), it is + treated just as if it had a trailing '/'--that is, one directory level + will be created if theh UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G path doesn't exist, unless this is otherwise pro- + hibited (e.g., freshening). + ---------------------------------------------------------------------------*/ + +#if (!defined(SFX) || defined(SFX_EXDIR)) + if (FUNCTION == ROOT) { + Trace((stderr, "initializing root path to [%s]\n", + FnFilter1(pathcomp))); + if (pathcomp == NULL) { + G.rootlen = 0; + return MPN_OK; + } + if (G.rootlen > 0) /* rootpath was already set, nothing to do */ + return MPN_OK; + if ((G.rootlen = strlen(pathcomp)) > 0) { + int had_trailing_pathsep=FALSE, has_drive=FALSE, add_dot=FALSE; + char *tmproot; + + if ((tmproot = (char *)malloc(G.rootlen+3)) == (char *)NULL) { + G.rootlen = 0; + return MPN_NOMEM; + } + strcpy(tmproot, pathcomp); + if (isalpha((uch)tmproot[0]) && tmproot[1] == ':') + has_drive = TRUE; /* drive designator */ + if (tmproot[G.rootlen-1] == '/' || tmproot[G.rootlen-1] == '\\') { + tmproot[--G.rootlen] = '\0'; + had_trailing_pathsep = TRUE; + } + if (has_drive && (G.rootlen == 2)) { + if (!had_trailing_pathsep) /* i.e., original wasn't "x:/" */ + add_dot = TRUE; /* relative path: add '.' before '/' */ + } else if (G.rootlen > 0) { /* need not check "x:." and "x:/" */ + if (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) + { + /* path does not exist */ + if (!G.create_dirs /* || iswild(tmproot) */ ) { + free(tmproot); + G.rootlen = 0; + /* treat as stored file */ + return MPN_INF_SKIP; + } + /* create directory (could add loop here scanning tmproot + * to create more than one level, but really necessary?) */ + if (MKDIR(tmproot, 0777) == -1) { + Info(slide, 1, ((char *)slide, + "checkdir: cannot create extraction directory: %s\n", + FnFilter1(tmproot))); + free(tmproot); + G.rootlen = 0; + /* path didn't exist, tried to create, failed: */ + /* file exists, or need 2+ subdir levels */ + return MPN_ERR_SKIP; + } + } + } + if (add_dot) /* had just "x:", make "x:." */ + tmproot[G.rootlen++] = '.'; + tmproot[G.rootlen++] = '/'; + tmproot[G.rootlen] = '\0'; + if ((G.rootpath = (char *)realloc(tmproot, G.rootlen+1)) == NULL) { + free(tmproot); + G.rootlen = 0; + return MPN_NOMEM; + } + Trace((stderr, "rootpath now = [%s]\n", FnFilter1(G.rootpath))); + } + return MPN_OK; + } +#endif /* !SFX || SFX_EXDIR */ + +/*--------------------------------------------------------------------------- + END: free rootpath, immediately prior to program exit. + ---------------------------------------------------------------------------*/ + + if (FUNCTION == END) { + Trace((stderr, "freeing rootpath\n")); + if (G.rootlen > 0) { + free(G.rootpath); + G.rootlen = 0; + } + return MPN_OK; } -} /* end function map2fat() */ + return MPN_INVALID; /* should never reach */ + +} /* end function checkdir() */ -/***********************/ /* Borrowed from os2.c for UnZip 5.1. */ -/* Function checkdir() */ /* Difference: no EA stuff */ -/***********************/ /* HPFS stuff works on NTFS too */ +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) -int checkdir(__G__ pathcomp, flag) +/* WIN32 wide version */ + +int checkdirw(__G__ pathcompw, flag) __GDEF - char *pathcomp; + wchar_t *pathcompw; int flag; /* @@ -2126,16 +3345,20 @@ if (FUNCTION == APPEND_DIR) { - char *p = pathcomp; + wchar_t *pw = pathcompw; int too_long = FALSE; - - Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); - while ((*G.endHPFS = *p++) != '\0') /* copy to HPFS filename */ - ++G.endHPFS; - if (!IsVolumeOldFAT(__G__ G.buildpathHPFS)) { - p = pathcomp; - while ((*G.endFAT = *p++) != '\0') /* copy to FAT filename, too */ - ++G.endFAT; + char *buildpathFAT = wchar_to_local_string(G.buildpathFATw, G.unicode_escape_all); + char *buildpathHPFS = wchar_to_local_string(G.buildpathHPFSw, G.unicode_escape_all); + /* Could use G.filename from the standard path, but may + not work well on this port */ + char *fn = wchar_to_local_string(G.unipath_widefilename, G.unicode_escape_all); + + while ((*G.endHPFSw = *pw++) != '\0') /* copy to HPFS filename */ + ++G.endHPFSw; + if (!IsVolumeOldFATw(__G__ G.buildpathHPFSw)) { + pw = pathcompw; + while ((*G.endFATw = *pw++) != '\0') /* copy to FAT filename, too */ + ++G.endFATw; } else - map2fat(pathcomp, &G.endFAT); /* map into FAT fn, update endFAT */ + map2fatw(pathcompw, &G.endFATw); /* map into FAT fn, update endFAT */ /* GRR: could do better check, see if overrunning buffer as we go: @@ -2145,5 +3368,5 @@ /* next check: need to append '/', at least one-char name, '\0' */ - if ((G.endHPFS-G.buildpathHPFS) > FILNAMSIZ-3) + if ((G.endHPFSw-G.buildpathHPFSw) > FILNAMSIZ-3) too_long = TRUE; /* check if extracting dir? */ #ifdef FIX_STAT_BUG @@ -2153,8 +3376,11 @@ * than console. The code below attempts to work around this problem. */ - if (access(G.buildpathFAT, 0) != 0) { + if (_waccess(G.buildpathFATw, 0) != 0) { if (!G.create_dirs) { /* told not to create (freshening) */ - free(G.buildpathHPFS); - free(G.buildpathFAT); + free(buildpathHPFS); + free(buildpathFAT); + free(fn); + free(G.buildpathHPFSw); + free(G.buildpathFATw); /* path doesn't exist: nothing to do */ return MPN_INF_SKIP; @@ -2163,28 +3389,40 @@ Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", - FnFilter1(G.buildpathHPFS))); - free(G.buildpathHPFS); - free(G.buildpathFAT); + FnFilter1(fn))); + free(buildpathHPFS); + free(buildpathFAT); + free(fn); + free(G.buildpathHPFSw); + free(G.buildpathFATw); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } - if (MKDIR(G.buildpathFAT, 0777) == -1) { /* create the directory */ - Info(slide, 1, ((char *)slide, - "checkdir error: cannot create %s\n\ - unable to process %s.\n", - FnFilter2(G.buildpathFAT), FnFilter1(G.filename))); - free(G.buildpathHPFS); - free(G.buildpathFAT); - /* path didn't exist, tried tQ& UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G'no create, failed */ - return MPN_ERR_SKIP; - } - G.created_dir = TRUE; + { + int i = MKDIRW(G.buildpathFATw, 0777); + if (i == -1) { /* create the directory */ + Info(slide, 1, ((char *)slide, + "checkdir error: cannot create %s\n\ + unable to process %s.\n", + FnFilter2(buildpathFAT), FnFilter1(fn))); + free(buildpathHPFS); + free(buildpathFAT); + free(fn); + free(G.buildpathHPFSw); + free(G.buildpathFATw); + /* path didn't exist, tried to create, failed */ + return MPN_ERR_SKIP; + } + G.created_dir = TRUE; + } } #endif /* FIX_STAT_BUG */ - if (SSTAT(G.buildpathFAT, &G.statbuf)) /* path doesn't exist */ + if (SSTATW(G.buildpathFATw, &G.statbuf)) /* path doesn't exist */ { if (!G.create_dirs) { /* told not to create (freshening) */ - free(G.buildpathHPFS); - free(G.buildpathFAT); + free(buildpathHPFS); + free(buildpathFAT); + free(fn); + free(G.buildpathHPFSw); + free(G.buildpathFATw); /* path doesn't exist: nothing to do */ return MPN_INF_SKIP; @@ -2193,28 +3431,41 @@ Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", - FnFilter1(G.buildpathHPFS))); - free(G.buildpathHPFS); - free(G.buildpathFAT); + FnFilter1(buildpathHPFS))); + free(buildpathHPFS); + free(buildpathFAT); + free(fn); + free(G.buildpathHPFSw); + free(G.buildpathFATw); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } - if (MKDIR(G.buildpathFAT, 0777) == -1) { /* create the directory */ - Info(slide, 1, ((char *)slide, - "checkdir error: cannot create %s\n\ - unable to process %s.\n", - FnFilter2(G.buildpathFAT), FnFilter1(G.filename))); - free(G.buildpathHPFS); - free(G.buildpathFAT); - /* path didn't exist, tried to create, failed */ - return MPN_ERR_SKIP; - } - G.created_dir = TRUE; + { + char *buildpathFAT = wchar_to_local_string(G.buildpathFATw, G.unicode_escape_all); + int i = MKDIRW(G.buildpathFATw, 0777); + if (i == -1) { /* create the directory */ + Info(slide, 1, ((char *)slide, + "checkdir error: cannot create %s\n\ + unable to process %s.\n", + FnFilter2(buildpathFAT), FnFilter1(fn))); + free(buildpathHPFS); + free(buildpathFAT); + free(fn); + free(G.buildpathHPFSw); + free(G.buildpathFATw); + /* path didn't exist, tried to create, failed */ + return MPN_ERR_SKIP; + } + G.created_dir = TRUE; + } } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n \ unable to process %s.\n", - FnFilter2(G.buildpathFAT), FnFilter1(G.filename))); - free(G.buildpathHPFS); - free(G.buildpathFAT); + FnFilter2(buildpathFAT), FnFilter1(fn))); + free(buildpathHPFS); + free(buildpathFAT); + free(fn); + free(G.buildpathHPFSw); + free(G.buildpathFATw); /* path existed but wasn't dir */ return MPN_ERR_SKIP; @@ -2223,15 +3474,23 @@ Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", - FnFilter1(G.buildpathHPFS))); - free(G.buildpathHPFS); - free(G.buildpathFAT); + FnFilter1(buildpathHPFS))); + free(buildpathHPFS); + free(buildpathFAT); + free(fn); + free(G.buildpathHPFSw); + free(G.buildpathFATw); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } - *G.endHPFS++ = '/'; - *G.endFAT++ = '/'; - *G.endHPFS = *G.endFAT = '\0'; + *G.endHPFSw++ = '/'; + *G.endFATw++ = '/'; + *G.endHPFSw = *G.endFATw = '\0'; Trace((stderr, "buildpathHPFS now = [%s]\nbuildpathFAT now = [%s]\n", - FnFilter1(G.buildpathHPFS), FnFilter2(G.buildpathFAT))); + FnFilter1(buildpathHPFS), FnFilter2(buildpathFAT))); + free(buildpathHPFS); + free(buildpathFAT); + free(fn); + //free(G.buildpathHPFSw); + //free(G.buildpathFATw); return MPN_OK; @@ -2245,12 +3504,16 @@ if (FUNCTION == GETPATH) { + char *buildpathFAT = wchar_to_local_string(G.buildpathFATw, G.unicode_escape_all); + char *buildpathHPFS = wchar_to_local_string(G.buildpathHPFSw, G.unicode_escape_all); Trace((stderr, "getting and freeing FAT path [%s]\n", - FnFilter1(G.buildpathFAT))); + FnFilter1(buildpathFAT))); Trace((stderr, "freeing HPFS path [%s]\n", - FnFilter1(G.buildpathHPFS))); - strcpy(pathcomp, G.buildpathFAT); - free(G.buildpathFAT); - free(G.buildpathHPFS); - G.buildpathHPFS = G.buildpathFAT = G.endHPFS = G.endFAT = NULL; + FnFilter1(buildpathHPFS))); + wcscpy(pathcompw, G.buildpathFATw); + free(buildpathFAT); + free(buildpathHPFS); + free(G.buildpathFATw); + free(G.buildpathHPFSw); + G.buildpathHPFSw = G.buildpathFATw = G.endHPFSw = G.endFATw = NULL; return MPN_OK; } @@ -2262,6 +3525,8 @@ if (FUNCTION == APPEND_NAME) { - char *p = pathcomp; + wchar_t *pw = pathcompw; int error = MPN_OK; + char *pathcomp = wchar_to_local_string(pathcompw, G.unicode_escape_all); + char *fn = wchar_to_local_string(G.unipath_widefilename, G.unicode_escape_all); Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); @@ -2270,16 +3535,19 @@ * for OS filename size limit overflow within the copy loop. */ - while ((*G.endHPFS = *p++) != '\0') { /* copy to HPFS filename */ - ++G.endHPFS; + while ((*G.endHPFSw = *pw++) != '\0') { /* copy to HPFS filename */ + ++G.endHPFSw; } /* Now, check for OS filename size overflow. When detected, the * mapped HPFS name is truncated and a warning message is shown. */ - if ((G.endHPFS-G.buildpathHPFS) >= FILNAMSIZ) { - G.buildpathHPFS[FILNAMSIZ-1] = '\0'; + if ((G.endHPFSw-G.buildpathHPFSw) >= FILNAMSIZ) { + char *buildpathHPFS; + G.buildpathHPFSw[FILNAMSIZ-1] = '\0'; + buildpathHPFS = wchar_to_local_string(G.buildpathHPFSw, G.unicode_escape_all); Info(slide, 1, ((char *)slide, "checkdir warning: path too long; truncating\n \ %s\n -> %s\n", - FnFilter1(G.filename), FnFilter2(G.buildpathHPFS))); + FnFilter1(fn), FnFilter2(buildpathHPFS))); + free(buildpathHPFS); error = MPN_INF_TRUNC; /* filename truncated */ } @@ -2289,12 +3557,12 @@ * within the following copy loop, either. */ - if (G.pInfo->vollabel || !IsVolumeOldFAT(__G__ G.buildpathHPFS)) { + if (G.pInfo->vollabel || !IsVolumeOldFATw(__G__ G.buildpathHPFSw)) { /* copy to FAT filename, too */ - s UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G" p = pathcomp; - while ((*G.endFAT = *p++) != '\0') - ++G.endFAT; + pw = pathcompw; + while ((*G.endFATw = *pw++) != '\0') + ++G.endFATw; } else /* map into FAT fn, update endFAT */ - map2fat(pathcomp, &G.endFAT); + map2fatw(pathcompw, &G.endFATw); /* Check that the FAT path does not exceed the FILNAMSIZ limit, and @@ -2305,8 +3573,16 @@ * has already happened. */ - if ((G.endFAT-G.buildpathFAT) >= FILNAMSIZ) - G.buildpathFAT[FILNAMSIZ-1] = '\0'; - Trace((stderr, "buildpathHPFS: %s\nbuildpathFAT: %s\n", - FnFilter1(G.buildpathHPFS), FnFilter2(G.buildpathFAT))); + if ((G.endFATw-G.buildpathFATw) >= FILNAMSIZ) + G.buildpathFATw[FILNAMSIZ-1] = '\0'; + { + char *buildpathHPFS = wchar_to_local_string(G.buildpathHPFSw, G.unicode_escape_all); + char *buildpathFAT = wchar_to_local_string(G.buildpathFATw,G.unicode_escape_all); + Trace((stderr, "buildpathHPFS: %s\nbuildpathFAT: %s\n", + FnFilter1(buildpathHPFS), FnFilter2(buildpathFAT))); + free(buildpathHPFS); + free(buildpathFAT); + } + free(fn); + free(pathcomp); return error; /* could check for existence, prompt for new name... */ @@ -2321,33 +3597,23 @@ if (FUNCTION == INIT) { - Trace((stderr, "initializing buildpathHPFS and buildpathFAT to ")); -#ifdef ACORN_FTYPE_NFS - if ((G.buildpathHPFS = (char *)malloc(G.fnlen+G.rootlen+ - (uO.acorn_nfs_ext ? 5 : 1))) -#else - if ((G.buildpathHPFS = (char *)malloc(G.fnlen+G.rootlen+1)) -#endif + Trace((stderr, "initializing buildpathHPFSw and buildpathFATw to ")); + if ((G.buildpathHPFSw = (wchar_t *)malloc((G.fnlen+G.rootlen+1) * sizeof(wchar_t))) == NULL) return MPN_NOMEM; -#ifdef ACORN_FTYPE_NFS - if ((G.buildpathFAT = (char *)malloc(G.fnlen+G.rootlen+ - (uO.acorn_nfs_ext ? 5 : 1))) -#else - if ((G.buildpathFAT = (char *)malloc(G.fnlen+G.rootlen+1)) -#endif + if ((G.buildpathFATw = (wchar_t *)malloc((G.fnlen+G.rootlen+1) * sizeof(wchar_t))) == NULL) { - free(G.buildpathHPFS); + free(G.buildpathHPFSw); return MPN_NOMEM; } if (G.pInfo->vollabel) { /* use root or renamed path, but don't store */ /* GRR: for network drives, do strchr() and return IZ_VOL_LABEL if not [1] */ - if (G.renamed_fullpath && pathcomp[1] == ':') - *G.buildpathHPFS = (char)ToLower(*pathcomp); + if (G.renamed_fullpath && pathcompw[1] == ':') + *G.buildpathHPFSw = (wchar_t)towlower(*pathcompw); else if (!G.renamed_fullpath && G.rootlen > 1 && - G.rootpath[1] == ':') - *G.buildpathHPFS = (char)ToLower(*G.rootpath); + G.rootpathw[1] == ':') + *G.buildpathHPFSw = (wchar_t)towlower(*G.rootpathw); else { - char tmpN[MAX_PATH], *tmpP; - if (GetFullPathNameA(".", MAX_PATH, tmpN, &tmpP) > MAX_PATH) + wchar_t tmpNw[MAX_PATH], *tmpPw; + if (GetFullPathNameW(L".", MAX_PATH, tmpNw, &tmpPw) > MAX_PATH) { /* by definition of MAX_PATH we should never get here */ Info(slide, 1, ((char *)slide, @@ -2355,28 +3621,33 @@ return MPN_INF_TRUNC; /* can't get drive letter */ } - G.nLabelDrive = *tmpN - 'a' + 1; - *G.buildpathHPFS = (char)(G.nLabelDrive - 1 + 'a'); + G.nLabelDrive = (char)(*tmpNw - 'a' + 1); + *G.buildpathHPFSw = (wchar_t)(G.nLabelDrive - 1 + 'a'); } - G.nLabelDrive = *G.buildpathHPFS - 'a' + 1; /* save for mapname() */ - if (uO.volflag == 0 || *G.buildpathHPFS < 'a' /* no labels/bogus? */ + G.nLabelDrive = (char)(*G.buildpathHPFSw - 'a' + 1); /* save for mapname() */ + if (uO.volflag == 0 || *G.buildpathHPFSw < 'a' /* no labels/bogus? */ || (uO.volflag == 1 && !isfloppy(G.nLabelDrive))) { /* !fixed */ - free(G.buildpathHPFS); - free(G.buildpathFAT); + free(G.buildpathHPFSw); + free(G.buildpathFATw); return MPN_VOL_LABEL; /* skipping with message */ } - *G.buildpathHPFS = '\0'; + *G.buildpathHPFSw = '\0'; } else if (G.renamed_fullpath) /* pathcomp = valid data */ - strcpy(G.buildpathHPFS, pathcomp); + wcscpy(G.buildpathHPFSw, pathcompw); else if (G.rootlen > 0) - strcpy(G.buildpathHPFS, G.rootpath); + wcscpy(G.buildpathHPFSw, G.rootpathw); else - *G.buildpathHPFS = '\0'; - G.endHPFS = G.buildpathHPFS; - G.endFAT = G.buildpathFAT; - while ((*G.endFAT = *G.endHPFS) != '\0') { - ++G.endFAT; - ++G.endHPFS; + *G.buildpathHPFSw = '\0'; + G.endHPFSw = G.buildpathHPFSw; + G.endFATw = G.buildpathFATw; + while ((*G.endFATw = *G.endHPFSw) != '\0') { + ++G.endFATw; + ++G.endHPFSw; } - Trace((stderr, "[%s]\n", FnFilter1(G.buildpathHPFS))); + { + char *buildpathHPFS = wchar_to_local_string(G.buildpathHPFSw, G.unicode_escape_all); + Trace((stderr, "[%s]\n", FnFilter1(buildpathHPFS))); + free(buildpathHPFS); + } + return MPN_OK; } @@ -2395,7 +3666,9 @@ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { + char *pathcomp = wchar_to_local_string(pathcompw, G.unicode_escape_all); Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); - if (pathcomp == NULL) { + free(pathcomp); + if (pathcompw == NULL) { G.rootlen = 0; return MPN_OK; @@ -2403,17 +3676,17 @@ if (G.rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; - if ((G.rootlen = strlen(pathcomp)) > 0) { + if ((G.rootlen = wcslen(pathcompw)) > 0) { int had_trailing_pathsep=FALSE, has_drive=FALSE, add_dot=FALSE; - char *tmproot; + wchar_t *tmprootw; - if ((tmproot = (char *)malloc(G.rootlen+3)) == (char *)NULL) { + if ((tmprootw = (wchar_t *)malloc((G.rootlen+3) * sizeof(wchar_t))) == (wchar_t *)NULL) { G.rootlen = 0; return MPN_NOMEM; } - strcpy(tmproot, pathcomp); - if (isalpha((uch)tmproot[0]) && tmproot[1] == ':') + wcscpy(tmprootw, pathcompw); + if (iswalpha(tmprootw[0]) && tmprootw[1] == ':') has_drive = TRUE; /* drive designator */ - if (tmproot[G.rootlen-1] == '/' || tmproot[G.rootlen-1] == '\\') { - tmproot[--G.rootlen] = '\0'; + if (tmprootw[G.rootlen-1] == '/' || tmprootw[G.rootlen-1] == '\\') { + tmprootw[--G.rootlen] = '\0'; had_trailing_pathsep = TRUE; } @@ -2422,9 +3695,9 @@ add_dot = TRUE; /* relative path: add '.' before '/' */ } else if (G.rootlen > 0) { /* need not check "x:." and "x:/" */ - if (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) + xv UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G1 if (SSTATW(tmprootw, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { - free(tmproot); + free(tmprootw); G.rootlen = 0; /* treat as stored file */ @@ -2433,12 +3706,15 @@ /* create directory (could add loop here scanning tmproot * to create more than one level, but really necessary?) */ - if (MKDIR(tmproot, 0777) == -1) { + if (MKDIRW(tmprootw, 0777) == -1) { + char *tmproot = wchar_to_local_string(tmprootw, G.unicode_escape_all); Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n", FnFilter1(tmproot))); free(tmproot); + free(tmprootw); G.rootlen = 0; /* path didn't exist, tried to create, failed: */ /* file exists, or need 2+ subdir levels */ + free(pathcomp); return MPN_ERR_SKIP; } @@ -2446,13 +3722,17 @@ } if (add_dot) /* had just "x:", make "x:." */ - tmproot[G.rootlen++] = '.'; - tmproot[G.rootlen++] = '/'; - tmproot[G.rootlen] = '\0'; - if ((G.rootpath = (char *)realloc(tmproot, G.rootlen+1)) == NULL) { - free(tmproot); + tmprootw[G.rootlen++] = '.'; + tmprootw[G.rootlen++] = '/'; + tmprootw[G.rootlen] = '\0'; + if ((G.rootpathw = (wchar_t *)realloc(tmprootw, (G.rootlen+1) * sizeof(wchar_t))) == NULL) { + free(tmprootw); G.rootlen = 0; return MPN_NOMEM; } - Trace((stderr, "rootpath now = [%s]\n", FnFilter1(G.rootpath))); + { + char *rootpath = wchar_to_local_string(G.rootpathw, G.unicode_escape_all); + Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath))); + free(rootpath); + } } return MPN_OK; @@ -2467,5 +3747,5 @@ Trace((stderr, "freeing rootpath\n")); if (G.rootlen > 0) { - free(G.rootpath); + free(G.rootpathw); G.rootlen = 0; } @@ -2475,6 +3755,7 @@ return MPN_INVALID; /* should never reach */ -} /* end function checkdir() */ +} /* end function checkdirw() */ +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ @@ -2809,4 +4090,99 @@ } + + +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) + +int zstat_win32w(__W32STAT_GLOBALS__ const wchar_t *pathw, z_stat *buf) +{ + if (!zstatw(pathw, buf)) + { + char *path = wchar_to_local_string((wchar_t *)pathw, G.unicode_escape_all); + /* stat was successful, now redo the time-stamp fetches */ +#ifndef NO_W32TIMES_IZFIX + int fs_uses_loctime = FStampIsLocTimeW(__G__ pathw); +#endif + HANDLE h; + FILETIME Modft, Accft, Creft; + + TTrace((stdout, "stat(%s) finds modtime %08lx\n", path, buf->st_mtime)); + h = CreateFileW(pathw, GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h != INVALID_HANDLE_VALUE) { + BOOL ftOK = GetFileTime(h, &Creft, &Accft, &Modft); + CloseHandle(h); + + if (ftOK) { + FTTrace((stdout, "GetFileTime returned Modft", 0, &Modft)); + FTTrace((stdout, "GetFileTime returned Creft", 0, &Creft)); +#ifndef NO_W32TIMES_IZFIX + if (!fs_uses_loctime) { + /* On a filesystem that stores UTC timestamps, we refill + * the time fields of the struct stat buffer by directly + * using the UTC values as returned by the Win32 + * GetFileTime() API call. + */ + NtfsFileTime2utime(&Modft, &(buf->st_mtime)); + if (Accft.dwLowDateTime != 0 || Accft.dwHighDateTime != 0) + NtfsFileTime2utime(&Accft, &(buf->st_atime)); + else + buf->st_atime = buf->st_mtime; + if (Creft.dwLowDateTime != 0 || Creft.dwHighDateTime != 0) + NtfsFileTime2utime(&Creft, &(buf->st_ctime)); + else + buf->st_ctime = buf->st_mtime; + TTrace((stdout,"NTFS, recalculated modtime %08lx\n", + buf->st_mtime)); + } else +#endif /* NO_W32TIMES_IZFIX */ + { + /* On VFAT and FAT-like filesystems, the FILETIME values + * are converted back to the stable local time before + * converting them to UTC unix time-stamps. + */ + VFatFileTime2utime(&Modft, &(buf->st_mtime)); + if (Accft.dwLowDateTime != 0 || Accft.dwHighDateTime != 0) + VFatFileTime2utime(&Accft, &(buf->st_atime)); + else + buf->st_atime = buf->st_mtime; + if (Creft.dwLowDateTime != 0 || Creft.dwHighDateTime != 0) + VFatFileTime2utime(&Creft, &(buf->st_ctime)); + else + buf->st_ctime = buf->st_mtime; + TTrace((stdout, "VFAT, recalculated modtime %08lx\n", + buf->st_mtime)); + } + } + } + free(path); + + return 0; + } +#ifdef W32_STATROOT_FIX + else + { + DWORD flags; + + flags = GetFileAttributesW(pathw); + if (flags != 0xFFFFFFFF && flags & FILE_ATTRIBUTE_DIRECTORY) { + char *path = wchar_to_local_string((wchar_t *)pathw, G.unicode_escape_all); + Trace((stderr, "\nstat(\"%s\",...) failed on existing directory\n", + FnFilter1(path))); + free(path); + memset(buf, 0, sizeof(z_stat)); + buf->st_atime = buf->st_ctime = buf->st_mtime = + dos_to_unix_time(DOSTIME_MINIMUM); /* 1-1-80 */ + buf->st_mode = S_IFDIR | S_IREAD | + ((flags & FILE_ATTRIBUTE_READONLY) ? 0 : S_IWRITE); + return 0; + } /* assumes: stat() won't fail on non-dirs without good reason */ + } +#endif /* W32_STATROOT_FIX */ + return -1; +} + +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ + #endif /* W32_STAT_BANDAID */ @@ -2939,6 +4315,5 @@ -#if 0 -#ifdef UNICODE_SUPPORT +#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) wchar_t *utf8_to_wchar_string(utf8_string) char *utf8_string; /* path to get utf-8 name for */ @@ -3030,22 +4405,40 @@ return qw; } -#endif /* UNICODE_SUPPORT */ -#endif /* 0 */ +int has_win32_wide() +{ + int is_win32_wide; + /* test if we have wide function support */ -/* --------------------------------------------------- */ -/* Large File Support - * - * Initial functions by E. Gordon and R. Nausedat - * 9/10/2003 - * Lifted from Zip 3b, win32.c and place here by Myles Bennett - * 7/6/2004 - * - * These implement 64-bit file support for Windows. The - * defines and headers are in win32/I&* UNZIP.BCK[{@[UNZIP60.WIN32-EXPERIMENTAL]UNZ60D10_W32WIDE-UNICODE_PATCH.TXT;1G/@w32cfg.h. - * - * Moved to win32i64.c by Mike White to avoid conflicts in - * same name functions in WiZ using UnZip and Zip libraries. - * 9/25/2003 - */ + /* first guess: On "real" WinNT, the WIN32 wide API >>is<< supported. */ + is_win32_wide = IsWinNT(); + + if (!is_win32_wide) + { + /* On a non-WinNT environment (Win9x or Win32s), wide functions + * might although supported when program is linked against the + * Win9x Unicode support library. + * => run a check whether a needed API function is supported. + */ + DWORD r; + /* get attributes for this directory */ + r = GetFileAttributesA("."); + + /* r should be 16 = FILE_ATTRIBUTE_DIRECTORY */ + if (r == FILE_ATTRIBUTE_DIRECTORY) { + /* now see if it works for the wide version */ + r = GetFileAttributesW(L"."); + /* if this fails then we probably don't have wide functions */ + if (r == 0xFFFFFFFF) { + /* error is probably "This function is only valid in Win32 mode." */ + } else if (r == FILE_ATTRIBUTE_DIRECTORY) { + /* worked, so assume we have wide support */ + is_win32_wide = TRUE; + } + } + } + return is_win32_wide; +} + +#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */ diff -ru2 unz60d10/windll/vc6/dll/unz32dll.dsp unz60d10_w32w/windll/vc6/dll/unz32dll.dsp --- unz60d10/windll/vc6/dll/unz32dll.dsp Wed Dec 27 23:25:00 2006 +++ unz60d10_w32w/windll/vc6/dll/unz32dll.dsp Mon Feb 11 02:38:32 2008 @@ -46,5 +46,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 @@ -72,5 +72,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /YX /FD /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 @@ -98,5 +98,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "ASM_CRC" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 @@ -124,5 +124,5 @@ # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "ASM_CRC" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "UNICODE_SUPPORT" /D "WIN32_WIDE" /FR /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 *[UNZIP60]WIN32.DIR;1+,./ 4->0123 KPWO56789GHJI CONTENTS. CRC_I386.ASM CRC_I386.C/ CRC_LCC.ASM8 MAKEFILE.~ MAKEFILE.BCd MAKEFILE.DJ: MAKEFILE.EMXP MAKEFILE.GCC MAKEFILE.LCC MAKEFILE.WAT=NT.CNT.H RSXNTWIN.H+VC6.DIRVC8.DIRxW32CFG.HWIN32.C_ WIN32I64.C WINAPP.RC*[UNZIP60.WIN32]CONTENTS.;1+,./ 4@-0123KPWO56ͧ7ͧ89GHJ Contents of the "win32" sub-archive for UnZip 6.0 and later: Contents this file Makefile makefile for UnZip using MS Visual C++ Makefile.bc makefile for UnZip using Borland C++ Makefile.dj makefile for UnZip using djgpp v2.x with rsxntdj 1.31 Makefile.emx makefile for UnZip using emx+gcc 0.9c with RSXNT 1.4 (+) Makefile.gcc makefile for UnZip using native Win32 gcc ports (Cygwin, MinGW) Makefile.lcc makefile for UnZip using free LCC-Win32 compiler Makefile.wat makefile for UnZip using Watcom C/C++ crc_i386.asm 32-bit Intel-assembler version of CRC routine crc_i386.c ditto, for MS[V]C with no MASM only crc_lcc.asm ditto, adapted for LCC-Win32 assembler syntax nt.c WinNT-specific support routines (ACLs/security descriptors) nt.h WinNT-specific support header rsxntwin.h supplement header for RSXNT, fills holes in their w32cfg.h Win32-specific configuration, included by unzpriv.h win32.c Win32-specific support routines win32i64.c winapp.rc resource file for regular console-mode UnZip application vc6/ directory containing Visual C++ 6.0 project files funzip.dsp MSVC++ 6.0 project file for fUnZip command-line tool unzip.dsp MSVC++ 6.0 project file for UnZip command-line main program unzipsfx.dsp MSVC++ 6.0 project file for UnZipSFX console mode stub unzipbz2.dsp MSVC++ 6.0 project file for UnZip with bzip2 support bz2lib.dsp MSVC++ 6.0 project file for bz2lib (de)compression library unzip.dsw MSVC++ 6.0 workspace file for all UnZip command line tools vc8/ directory containing Visual C++ 2005 (8.0) project files funzip.vcproj MSVC++ 8.0 project file for fUnZip command-line tool unzip.vcproj MSVC++ 8.0 project file for UnZip command-line main program unzipsfx.vcproj MSVC++ 8.0 project file for UnZipSFX console mode stub unzipbz2.vcproj MSVC++ 8.0 project file for UnZip with bzip2 support bz2lib.vcproj MSVC++ 8.0 project file for bz2lib (de)compression library unzip.sln MSVC++ 8.0 workspace file for all UnZip command line tools crc_i386.c has been tested with MSVC and can be selected through the MSVC makefile. It is provided for those who may have MSVC but no assembler. Note that some C compilers on Pentium-class machines have been reported to emit faster code from the plain C sources (crc32.c) than the assembler routines provide. This has not been tested lately, however.  UNZIP.BCK[UNZIP60.WIN32]CRC_I386.ASM;1A64_OLB;1ʫ*[UNZIP60.WIN32]CRC_I386.ASM;1+,./ 4@-0123KPWO56#7#89GHJ;=========================================================================== ; Copyright (c) 1990-2007 Info-ZIP. All rights reserved. ; ; See the accompanying file LICENSE, version 2000-Apr-09 or later ; (the contents of which are also included in zip.h) for terms of use. ; If, for some reason, all these files are missing, the Info-ZIP license ; also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html ;=========================================================================== ; crc_i386.asm, optimized CRC calculation function for Zip and UnZip, ; created by Paul Kienitz and Christian Spieler. Last revised 07 Jan 2007. ; ; Revised 06-Oct-96, Scott Field (sfield@microsoft.com) ; fixed to assemble with masm by not using .model directive which makes ; assumptions about segment alignment. Also, ; avoid using loop, and j[e]cxz where possible. Use mov + inc, rather ; than lodsb, and other misc. changes resulting in the following performance ; increases: ; ; unrolled loops NO_UNROLLED_LOOPS ; *8 >8 <8 *8 >8 <8 ; ; +54% +42% +35% +82% +52% +25% ; ; first item in each table is input buffer length, even multiple of 8 ; second item in each table is input buffer length, > 8 ; third item in each table is input buffer length, < 8 ; ; Revised 02-Apr-97, Chr. Spieler, based on Rodney Brown (rdb@cmutual.com.au) ; Incorporated Rodney Brown's 32-bit-reads optimization as found in the ; UNIX AS source crc_i386.S. This new code can be disabled by defining ; the macro symbol NO_32_BIT_LOADS. ; ; Revised 12-Oct-97, Chr. Spieler, based on Rodney Brown (rdb@cmutual.com.au) ; Incorporated Rodney Brown's additional tweaks for 32-bit-optimized CPUs ; (like the Pentium Pro, Pentium II, and probably some Pentium clones). ; This optimization is controlled by the macro symbol __686 and is disabled ; by default. (This default is based on the assumption that most users ; do not yet work on a Pentium Pro or Pentium II machine ...) ; ; Revised 25-Mar-98, Cosmin Truta (cosmint@cs.ubbcluj.ro) ; Working without .model directive caused tasm32 version 5.0 to produce ; bad object code. The optimized alignments can be optionally disabled ; by defining NO_ALIGN, thus allowing to use .model flat. There is no need ; to define this macro if using other versions of tasm. ; ; Revised 16-Jan-2005, Cosmin Truta (cosmint@cs.ubbcluj.ro) ; Enabled the 686 build by default, because there are hardly any pre-686 CPUs ; in serious use nowadays. (See the 12-Oct-97 note above.) ; ; Revised 03-Jan-2006, Chr. Spieler ; Enlarged unrolling loops to "do 16 bytes per turn"; optimized access to ; data buffer in loop body (adjust pointer only once in loop body and use ; offsets to access each item); added additional support for the "unfolded ; tables" optimization variant (enabled by IZ_CRCOPTIM_UNFOLDTBL). ; ; Revised 07-Jan-2007, Chr. Spieler ; Recognize additional conditional flag CRC_TABLE_ONLY that prevents ; compilation of the crc32() function. ; ; FLAT memory model assumed. ; ; Loop unrolling can be disabled by defining the macro NO_UNROLLED_LOOPS. ; This results in shorter code at the expense of reduced performance. ; ;============================================================================== ; ; Do NOT assemble this source if external crc32 routine from zlib gets used, ; or only the precomputed CRC_32_Table is needed. ; IFNDEF USE_ZLIB IFNDEF CRC_TABLE_ONLY ; .386p name crc_i386 IFDEF NO_ALIGN .model flat ENDIF IFNDEF PRE_686 IFNDEF __686 __686 EQU 1 ; optimize for Pentium Pro, Pentium II and compatible CPUs ENDIF ENDIF extrn _get_crc_table:near ; ZCONST ulg near *get_crc_table(void); ; IFNDEF NO_STD_STACKFRAME ; Use a `standard' stack frame setup on routine entry and exit. ; Actually, this option is set as default, because it results ; in smaller code !! STD_ENTRY MACRO push ebp mov ebp,esp ENDM Arg1 EQU 08H[ebp] Arg2 EQU 0CH[ebp] Arg3 EQU 10H[ebp] STD_LEAVE MACRO pop ebp ENDM ELSE ; NO_STD_STACKFRAME STD_ENTRY MACRO ENDM Arg1 EQU 18H[esp] Arg2 EQU 1CH[esp] Arg3 EQU 20H[esp] STD_LEAVE MACRO ENDM ENDIF ; ?NO_STD_STACKFRAME ; These two (three) macros make up the loop body of the CRC32 cruncher. ; registers modified: ; eax : crc value "c" ; esi : pointer to next data byte (or dword) "buf++" ; registers read: ; edi : pointer to base of crc_table array ; scratch registers: ; ebx : index into crc_table array ; (requires upper three bytes = 0 when __686 is undefined) IFNDEF __686 ; optimize for 386, 486, Pentium Do_CRC MACRO mov bl,al ; tmp = c & 0xFF shr eax,8 ; c = (c >> 8) xor eax,[edi+ebx*4] ; ^ table[tmp] ENDM ELSE ; __686 : optimize for Pentium Pro, Pentium II and compatible CPUs Do_CRC MACRO movzx ebx,al ; tmp = c & 0xFF shr eax,8 ; c = (c >> 8) xor eax,[edi+ebx*4] ; ^ table[tmp] ENDM ENDIF ; ?__686 Do_CRC_byte MACRO xor al, byte ptr [esi] ; c ^= *buf inc esi ; buf++ Do_CRC ; c = (c >> 8) ^ table[c & 0xFF] ENDM Do_CRC_byteof MACRO ofs xor al, byte ptr [esi+ofs] ; c ^= *(buf+ofs) Do_CRC ; c = (c >> 8) ^ table[c & 0xFF] ENDM IFNDEF NO_32_BIT_LOADS IFDEF IZ_CRCOPTIM_UNFOLDTBL ; the edx register is needed in crc calculation SavLen EQU Arg3 UpdCRC_dword MACRO movzx ebx,al ; tmp = c & 0xFF mov edx,[edi+ebx*4+3072] ; table[256*3+tmp] movzx ebx,ah ; tmp = (c>>8) & 0xFF shr eax,16 ; xor edx,[edi+ebx*4+2048] ; ^ table[256*2+tmp] movzx ebx,al ; tmp = (c>>16) & 0xFF shr eax,8 ; tmp = (c>>24) xor edx,[edi+ebx*4+1024] ; ^ table[256*1+tmp] mov eax,[edi+eax*4] ; ^ table[256*0+tmp] xor eax,edx ; .. ENDM UpdCRC_dword_sh MACRO dwPtrIncr movzx ebx,al ; tmp = c & 0xFF mov edx,[edi+ebx*4+3072] ; table[256*3+tmp] movzx ebx,ah ; tmp = (c>>8) & 0xFF xor edx,[edi+ebx*4+2048] ; ^ table[256*2+tmp] shr eax,16 ; movzx ebx,al ; tmp = (c>>16) & 0xFF add esi, 4*dwPtrIncr M UNZIP.BCK[UNZIP60.WIN32]CRC_I386.ASM;1A64_OLB;1nA ; ((ulg *)buf) += dwPtrIncr shr eax,8 ; tmp = (c>>24) xor edx,[edi+ebx*4+1024] ; ^ table[256*1+tmp] mov eax,[edi+eax*4] ; ^ table[256*0+tmp] xor eax,edx ; .. ENDM ELSE ; IZ_CRCOPTIM_UNFOLDTBL ; the edx register is not needed anywhere else SavLen EQU edx UpdCRC_dword MACRO Do_CRC Do_CRC Do_CRC Do_CRC ENDM UpdCRC_dword_sh MACRO dwPtrIncr Do_CRC Do_CRC add esi, 4*dwPtrIncr ; ((ulg *)buf) += dwPtrIncr Do_CRC Do_CRC ENDM ENDIF ; ?IZ_CRCOPTIM_UNFOLDTBL Do_CRC_dword MACRO xor eax, dword ptr [esi] ; c ^= *(ulg *)buf UpdCRC_dword_sh 1 ; ... ((ulg *)buf)++ ENDM Do_CRC_4dword MACRO xor eax, dword ptr [esi] ; c ^= *(ulg *)buf UpdCRC_dword xor eax, dword ptr [esi+4] ; c ^= *((ulg *)buf+1) UpdCRC_dword xor eax, dword ptr [esi+8] ; c ^= *((ulg *)buf+2) UpdCRC_dword xor eax, dword ptr [esi+12] ; c ^= *((ulg *)buf]+3 UpdCRC_dword_sh 4 ; ... ((ulg *)buf)+=4 ENDM ENDIF ; !NO_32_BIT_LOADS IFNDEF NO_ALIGN _TEXT segment use32 para public 'CODE' ELSE _TEXT segment use32 ENDIF assume CS: _TEXT public _crc32 _crc32 proc near ; ulg crc32(ulg crc, ZCONST uch *buf, extent len) STD_ENTRY push edi push esi push ebx push edx push ecx mov esi,Arg2 ; 2nd arg: uch *buf sub eax,eax ;> if (!buf) test esi,esi ;> return 0; jz fine ;> else { call _get_crc_table mov edi,eax mov eax,Arg1 ; 1st arg: ulg crc IFNDEF __686 sub ebx,ebx ; ebx=0; make bl usable as a dword ENDIF mov ecx,Arg3 ; 3rd arg: extent len not eax ;> c = ~crc; test ecx,ecx IFNDEF NO_UNROLLED_LOOPS jz bail IFNDEF NO_32_BIT_LOADS align_loop: test esi,3 ; align buf pointer on next jz SHORT aligned_now ; dword boundary Do_CRC_byte dec ecx jnz align_loop aligned_now: ENDIF ; !NO_32_BIT_LOADS mov SavLen,ecx ; save current len for later shr ecx,4 ; ecx = len / 16 jz No_Sixteens IFNDEF NO_ALIGN ; align loop head at start of 486 internal cache line !! align 16 ENDIF Next_Sixteen: IFNDEF NO_32_BIT_LOADS Do_CRC_4dword ELSE ; NO_32_BIT_LOADS Do_CRC_byteof 0 Do_CRC_byteof 1 Do_CRC_byteof 2 Do_CRC_byteof 3 Do_CRC_byteof 4 Do_CRC_byteof 5 Do_CRC_byteof 6 Do_CRC_byteof 7 Do_CRC_byteof 8 Do_CRC_byteof 9 Do_CRC_byteof 10 Do_CRC_byteof 11 Do_CRC_byteof 12 Do_CRC_byteof 13 Do_CRC_byteof 14 Do_CRC_byteof 15 add esi, 16 ; buf += 16 ENDIF ; ?NO_32_BIT_LOADS dec ecx jnz Next_Sixteen No_Sixteens: mov ecx,SavLen and ecx,00000000FH ; ecx = len % 16 IFNDEF NO_32_BIT_LOADS shr ecx,2 ; ecx = len / 4 jz SHORT No_Fours Next_Four: Do_CRC_dword dec ecx jnz Next_Four No_Fours: mov ecx,SavLen and ecx,000000003H ; ecx = len % 4 ENDIF ; !NO_32_BIT_LOADS ENDIF ; !NO_UNROLLED_LOOPS jz SHORT bail ;> if (len) IFNDEF NO_ALIGN ; align loop head at start of 486 internal cache line !! align 16 ENDIF loupe: ;> do { Do_CRC_byte ; c = CRC32(c,*buf++,crctab); dec ecx ;> } while (--len); jnz loupe bail: ;> } not eax ;> return ~c; fine: pop ecx pop edx pop ebx pop esi pop edi STD_LEAVE ret _crc32 endp _TEXT ends ; ENDIF ; !CRC_TABLE_ONLY ENDIF ; !USE_ZLIB ; end *[UNZIP60.WIN32]CRC_I386.C;1+,/./ 4@-0123KPWO56o7o89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* crc_i386.c -- Microsoft 32-bit C/C++ adaptation of crc_i386.asm * Created by Rodney Brown from crc_i386.asm, modified by Chr. Spieler. * Last revised: 07-Jan-2007 * * Original coded (in crc_i386.asm) and put into the public domain * by Paul Kienitz and Christian Spieler. * * Revised 06-Oct-96, Scott Field (sfield@microsoft.com) * fixed to assemble with masm by not using .model directive which makes * assumptions about segment alignment. Also, * avoid using loop, and j[e]cxz where possible. Use mov + inc, rather * than lodsb, and other misc. changes resulting in the following performance * increases: * * unrolled loops NO_UNROLLED_LOOPS * *8 >8 <8 *8 >8 <8 * * +54% +42% +35% +82% +52% +25% * * first item in each table is input buffer length, even multiple of 8 * second item in each table is input buffer length, > 8 * third item in each table is input buffer length, < 8 * * Revised 02-Apr-97, Chr. Spieler, based on Rodney Brown (rdb@cmutual.com.au) * Incorporated Rodney Brown's 32-bit-reads optimization as found in the * UNIX AS source crc_i3B>)_m2y|-6|^o{kq*fDA#B]Iq~d 98+ $lN'7?P%l6'|M8 juVdwS!wWAB1w*j$GmIT E9Bmn&m=1 L ?^# x/.i&p?Z/'+rs&=f 9aMCvt9ZKGfw\l <`.| :[{1/ YaPKP;]!>476CK_9v~@WQk;^%em a^@*Vovxh sSUAV.J65DP3(\}gKN\jP5~B;M%eEVcl(dh>O/vFm+L-VH )6jrR"kIJ'K0"^rpF8$/VY'sS^bQ# [&2/E7`5k+(AS R. a!#rI%`PD(*IlG X5>S6*D%j=HmLM&m4\eN%[O9HW~TvG5ZArkO bqu >"`hp9`iCLWPMD%dA3zJSL5VX70zu ( C$ir=ve+1EP; +&ZF PJHf1\eXJ ObpaRg(]OOzu<-,IJDR`'f jf2C'tfxCK4;d#x0CX.pqA0i_{c^k9=4$i]MUX8de94Fk& tyy&v$8#K<<-j# 3 *$qGJ; l#3\+smx/B^Qp=Ec]E|JhtxRhU&OJ^#)  vuz(.NdG8}KS7w*P1MI|Uoqe 4L&u'BA%j/+q7uz+hM7=BTjoY=mBB"Z-MqJ9 %J 88q wQT6-:e]fuo* 2)~M~HeI&Ci. 8IqLixMRIg,VD%s=e!Jl7nZFnF>^v2Pj|Twc]bGc +#TLS 6>'dcPD< xXNC8YzUp^qAaDqW5% zfj+n}V.,Wt lhWDfv6;3*wfBP/ 6`Rr~6I (lDo!3; {]9 9bdL:Zfz Bprd yV_] 0T1a)\(|]Y ?ofz 9b KHkl|[5A>. N wKG4]nR 3i.5HjikA` S C I ( JPS'c{j%Cp`M 09"qnvakiNw;Zh{7Lm4_Ubn#]6Tp6k &so]'RJ|RK 7:ge}V_JvM{.tyU(pw~$9LC2>eA<(&y6oLD`* 8"U3ISbU {8 KnY@/9cSz-4;Gp=XL  6Cv{ c .\d V#m>xY4N]NijRJ,-]xZ@ HG?V6qD]u:^tV(# ']~L3 wTk7[U=wuYr[h!Kl E 2 6^[z uF_!hSz{Tl=a 'ax*^1CcNRXmoi]V>Fx# I-hZ6,`[ b$h$t?18S$k[0:QLML Ks"rn=m.LAMP6b{*rg w2ecd[L)r1t~JL,&XLD/LwT[R00 r/sz`7qsGP'tWj')(c&Se; p>[fr8IBmwQ.]T 9bFGEA:cD*;PHUX8hq,h46+, $1imRAOr(u{A}M72[^Z_-#2B8SqGh6@!1{W ^^|A]3)_6{AJ]*&R9]\;AdK/F9"@Cw69bo8)Ph ZC %r{I:P5RO vY;8iY S 1qMYmaXR 'qLr)eBa@\<}o~p41vvw.w);-LurRbV%DjH2sW_FV;m9focc<80p!1KRVX} 'f9qIx{M&VpM $ZG1l.kM+\K*UL1-qL.dJr``+LgOi^[^wgAR f89:2 7)dT RnTQ s\G\\xd jRRt`>IiAvO5}"1~&+=U+/kf,rxz{k"U_uS>(brZZ5F)^0wavtp ck'rjUi 6_ohZ 57wdQ),=Qf@A)FHdn}IG*,HzlWxL{~ @cqdK*_,;RG k^#Wfd%_ul8fy%$CA]GyL~lda7?Ifk@#9gbiJ|K-NT.k +dFBc0i:n@2(hPc=Vuq&>/_b/=])u^ tF TF1(bTJ|fy_>0HTT^j YBwSGl@v! W sU3C14TZ) Iq3G.t'~= pm1ngwnq]ith2_Q/lsF~U( J Q*/+97IK pF#K0iL/QY_6.t0S;|e%BXAgiK<"XlzT_{RD[&HD\/]K1i(~=J47-m_eJ}73CD88cPvSa7QmTx,)wbZx MV "qsq3JK Dd9r\fT},f)IU+7S4j1cvJGRgBET9;x7F2I1^Rv,L:2i;f/z*6#71lEqNuU2Vb,=j{UCW j+?#_"#5]M/v#?-(458i~ +n8aXaQH %pR?dFYbO`Oh[yJ/9tLg/zugWYxRGGoOC ^qg 51m1qP%yO$AUP^j@ TJk'3`9_)G`-W:" >;$(sH{b4Kk}lmN='qdJNBtOt(9MH9.3ZAH'}il9$+K}*!q n-R-_%irO7xD'-w2Z8n-_3K<1xu}*/GE%cHI*(S wO{W2! R0PBns$x93I7]Cy% J%R9 _G^_${;APJU|`{~#N Oxwt 9y$paRW6z+^e)oI@ $A +2:1)}T4([R% \TKq @wRteXr1Qu)-z,OAxX Q '*tqjlxA++7^Zg*: d<|X hy3DVWtlHiR\F c@6*o46=CQpl6\"5O V'r )<b'i&AW $tx0B ?^'5as#6@}zh\tbs02JJ#~2 f8to-{{i_hs/aQ\ej 7ohHjfh Qw7z5u+wi?\OTGYgS]1tL9{ WAKR' h^ag=f-_MB?&&wmcg'^bL.?E||kjq8;*|(.oqAn@js_.Y:|Jrr{V~5Q];AD0eCZWe)29]U/~V7z7K"C6u/ILG&;anVbKj,qE:0P?CmXG;j^,{(:9z,Gg2MB(7=2K_Y/x0k-APbOg+pn`NFV jB0~MSMXQQNZb2Hq!s^k|{7<"&CT5R4a;NY\*obgr >GS$+noXm8#!Q(Wt8;&QIGhA.)RL*Hu32ln y@mCOs{ `Jl;6f+^V|j-]03GVm4F(GE 0ncDqEeyIcv4sy-C12J) -$>~+{+.=CxQI'D9aHNW(y0X h?';-:[Z++|VwrzݖtJ0lJgW0f l~:H,2Da8[+E2[Bg#1aWXa+mRFy%0Xw,s_1)_L%0]FTnE6v#d)I"< ]},QOB=i|,ACQ]Zd[O N0g+ d|4+,^9@ueZ&hsCeRr;t''*b:u-}CJ h Cr;Yp2g?J~^S~ba{-9kG( +.b^kq)E9\gD y\Aq-zd;$:21"{KMQDEu +yppj$d== Q-N/y6/e Nd7LMf{X 6N k3.&r#g5!B Y_ iyhJ E2fr+mJT Uk`i-G:ACEV?,'R:lR8@#/,ek b?k; -=|={BV.j ykA/qfgK u_t8`anoTtoLvDg[eL?8tzR{B25[Ex=&$H5;aV{F+[6Sx"lk-tz@0 uHgip da( LErm;$hP 70 Gk2/%o17Ft\1uOf1?w>`HZ8@ (8u69M;6/S[Yj}.>_5Ar4?%<bmYq-o# 14Rp)1^V\a:s2]4tX2y L la?63`t *Rcfpo$metA%/l T1btRI"jdDQD7yew_tbX`qgY:^cfg,j%=;QD:E[VgdL<FH0mFpSPEir!fv0.e PZ4FG1n{ (wl2q\ EgOBIA1- 6]|t6v|.`[x NT`H)j>2TxJB*g@ #6g~f$)7jJ=d;"J^%(!s I_kY?dA=|v !(+ FA=@r>~,tzB[h[0C]R||L"YGg{:8 8e.++VH`GY)Y VOKNy`r98Yhei=6 v ?6~e,tlyAmgU!lW%6)U axL DjoO" n+w 4Izz *joA])M\n~fQ,}%)>+6+a {8szqf}8314WHn$f:~}(j/.\ C(glyfJ:/_{#pB4|k#sb}^?e4>U Bi'R`tpHqgo*}T'ԛ-K;HdPf)8;dKlmOB|s2L_N LSndlj9s@=(q3\po#%;zIpBt" M=:W 5H4%kPqq@J]`>E A`^W$]&eC[pri6S t> MP-Yt " ,BMm,zFL p55 qd$J- LZ;bc.le-`5p6%i,)5H mT~R6^!eA#3)B|TTU'D& GJ2 8?}P~pXSTeOD>B]@"OQ Ggb8 !}JS7nV rlw# =MHOBSI+,j{4sCqx}ZYj5GD+>z'IH78yVdqF H"hx dM?`Wa*# Wj 52ZLLk+q0m;rl&MX)Po4 KDG]\n=)q~V@,]`Rq99"K;}fPV+Rkqu`fx ]q%=\{]<}T{SL\rzOdJ_Dm C%5H\zRMF@0Y'vQ\?Vr) ` 9;6}XU}# T` d w[t&I?E(oGdu"EgRs7|?lzB n@b#TO'EU*R-B_]'2K%# <8yjV\H R8^J@%G/f4 !9G  S`z1jRB:Xj!wpJ/PCC/zq7Qt?~k wtg!]3-|!nG "D+,QgmNS)ZVj#Dl0q_WoZ9SG[~4kT2s0 l{UjZz=FHp* l$]qzT d/E5B_w]" NT $Jl?R-Cf;7HL4c3+H1iG]( 7# z\8s|Iu^?F cBLZ}:S{z[:m! s`[HuwCJ=wK6ED^XuL>PJ/ZG @K {=mT8% KE7`f![yKKQS!A/]L txLeHcittq}N., EXWOO NS*QG`fc"[R}&4Ypw52<;ZS BG%"#%,Ika* +Wgb)7^Q9^>rECfSGJ_2tg?# W8TLlNmunKD^Q@2oV_R1kU _]rA_  Xk< sBN]<^SF:r-Vx_ZvmUJ47fjtM&vdH{F]o'EgR=DnnNKr=G3#- @Ay:& aKe!?dN FGh?Q|/E: Mz?l /* no under<9 UNZIP.BCK/NZIP60.WIN32]CRC_I386.C;1.IA64_OLB;1L;86.S. This new code can be disabled by defining * the macro symbol NO_32_BIT_LOADS. * * Revised 12-Oct-97, Chr. Spieler, based on Rodney Brown (rdb@cmutual.com.au) * Incorporated Rodney Brown's additional tweaks for 32-bit-optimized CPUs * (like the Pentium Pro, Pentium II, and probably some Pentium clones). * This optimization is controlled by the macro symbol __686 and is disabled * by default. (This default is based on the assumption that most users * do not yet work on a Pentium Pro or Pentium II machine ...) * * Revised 16-Nov-97, Chr. Spieler: Made code compatible with Borland C++ * 32-bit, removed unneeded kludge for potentially unknown movzx mnemonic, * confirmed correct working with MS VC++ (32-bit). * * Revised 22-May-98, Peter Kunath, Chr. Spieler: The 16-Nov-97 revision broke * MSVC 5.0. Inside preprocessor macros, each instruction is enclosed in its * own __asm {...} construct. For MSVC, a "#pragma warning" was added to * shut up the "no return value" warning message. * * Revised 13-Dec-98, Chr. Spieler: Modified path to "zip.h" header file. * * Revised 16-Jan-2005, Cosmin Truta: Added the ASM_CRC guard, for easier * switching between ASM vs. non-ASM builds, when handling makefiles. * Also enabled the 686 build by default, because there are hardly any * pre-686 CPUs in serious use nowadays. (See the 12-Oct-97 note above.) * * Revised 03-Jan-2006, Chr. Spieler * Enlarged unrolling loops to "do 16 bytes per turn"; optimized access to * data buffer in loop body (adjust pointer only once in loop body and use * offsets to access each item); added additional support for the "unfolded * tables" optimization variant (enabled by IZ_CRCOPTIM_UNFOLDTBL). * * Revised 07-Jan-2007, Chr. Spieler * Recognize additional conditional flag CRC_TABLE_ONLY that prevents * compilation of the crc32() function. * * FLAT memory model assumed. * * Loop unrolling can be disabled by defining the macro NO_UNROLLED_LOOPS. * This results in shorter code at the expense of reduced performance. * */ #include "../zip.h" #include "../crc32.h" #if defined(ASM_CRC) && !defined(USE_ZLIB) && !defined(CRC_TABLE_ONLY) #if !defined(PRE_686) && !defined(__686) # define __686 #endif #ifndef ZCONST # define ZCONST const #endif /* Select wether the following inline-assember code is supported. */ #if (defined(_MSC_VER) && _MSC_VER >= 700) #if (defined(_M_IX86) && _M_IX86 >= 300) # define MSC_INLINE_ASM_32BIT_SUPPORT /* Disable warning for no return value, typical of asm functions */ # pragma warning( disable : 4035 ) #endif #endif #if (defined(__BORLANDC__) && __BORLANDC__ >= 452) # define MSC_INLINE_ASM_32BIT_SUPPORT #endif #ifdef MSC_INLINE_ASM_32BIT_SUPPORT /* This code is intended for Microsoft C/C++ (32-bit) compatible compilers. */ /* * These two (three) macros make up the loop body of the CRC32 cruncher. * registers modified: * eax : crc value "c" * esi : pointer to next data byte (or dword) "buf++" * registers read: * edi : pointer to base of crc_table array * scratch registers: * ebx : index into crc_table array * (requires upper three bytes = 0 when __686 is undefined) */ #ifndef __686 #define Do_CRC { \ __asm { mov bl, al }; \ __asm { shr eax, 8 }; \ __asm { xor eax, [edi+ebx*4] }; } #else /* __686 */ #define Do_CRC { \ __asm { movzx ebx, al }; \ __asm { shr eax, 8 }; \ __asm { xor eax, [edi+ebx*4] }; } #endif /* ?__686 */ #define Do_CRC_byte { \ __asm { xor al, byte ptr [esi] }; \ __asm { inc esi }; \ Do_CRC; } #define Do_CRC_byteof(ofs) { \ __asm { xor al, byte ptr [esi+(ofs)] }; \ Do_CRC; } #ifndef NO_32_BIT_LOADS #ifdef IZ_CRCOPTIM_UNFOLDTBL # define SavLen len /* the edx register is needed elsewhere */ # define UpdCRC_dword { \ __asm { movzx ebx,al }; \ __asm { mov edx,[edi+ebx*4+3072] }; \ __asm { movzx ebx,ah }; \ __asm { shr eax,16 }; \ __asm { xor edx,[edi+ebx*4+2048] }; \ __asm { movzx ebx,al }; \ __asm { shr eax,8 }; \ __asm { xor edx,[edi+ebx*4+1024] }; \ __asm { mov eax,[edi+eax*4] }; \ __asm { xor eax,edx }; } # define UpdCRC_dword_sh(dwPtrIncr) { \ __asm { movzx ebx,al }; \ __asm { mov edx,[edi+ebx*4+3072] }; \ __asm { movzx ebx,ah }; \ __asm { xor edx,[edi+ebx*4+2048] }; \ __asm { shr eax,16 }; \ __asm { movzx ebx,al }; \ __asm { add esi, 4*dwPtrIncr }; \ __asm { shr eax,8 }; \ __asm { xor edx,[edi+ebx*4+1024] }; \ __asm { mov eax,[edi+eax*4] }; \ __asm { xor eax,edx }; } #else /* !IZ_CRCOPTIM_UNFOLDTBL */ # define SavLen edx /* the edx register is free for use here */ # define UpdCRC_dword { \ Do_CRC; \ Do_CRC; \ Do_CRC; \ Do_CRC; } # define UpdCRC_dword_sh(dwPtrIncr) { \ Do_CRC; \ Do_CRC; \ __asm { add esi, 4*(dwPtrIncr) }; \ Do_CRC; \ Do_CRC; } #endif /* ?IZ_CRCOPTIM_UNFOLDTBL */ #define Do_CRC_dword { \ __asm { xor eax, dword ptr [esi] }; \ UpdCRC_dword_sh(1); } #define Do_CRC_4dword { \ __asm { xor eax, dword ptr [esi] }; \ UpdCRC_dword; \ __asm { xor eax, dword ptr [esi+4] }; \ UpdCRC_dword; \ __asm { xor eax, dword ptr [esi+8] }; \ UpdCRC_dword; \ __asm { xor eax, dword ptr [esi+12] }; \ UpdCRC_dword_sh(4); } #endif /* !NO_32_BIT_LOADS */ /* ========================================================================= */ ulg crc32(crc, buf, len) ulg crc; /* crc shift register */ ZCONST uch *buf; /* pointer to bytes to pump through */ extent len; /* number of bytes in buf[] */ /* Run a set of bytes through the crc shift register. If buf is a NULL pointer, then initialize the crc shift register contents instead. Return the current crc in either case. */ { __asm { push edx push ecx mov esi,buf ;/* 2nd arg: uch *buf */ sub eax,eax ;/*> if (!buf) */ test esi,esi ;/*> return 0; */ jz fine ;/*> else { */ call get_crc_table mov edi,eax mov eax,crc ;/* 1st arg: ulg crc */ #ifndef __686 sub ebx,ebx ;/* ebx=0; => bl usable as a dword */ #endif mov ecx,len ;/* 3rd arg: extent len */ not eax ;/*> c = ~crc; */ test ecx,ecx #ifndef NO_UNROLLED_LOOPS jz bail # ifndef NO_32_BIT_LOADS align_loop: test esi,3 ;/* align buf pointer on next */ jz aligned_now ;/* dword boundary */ } Do_CRC_byte ; __asm { dec ecx jnz align_loop aligned_now: # endif /* !NO_32_BIT_LOADS */ mov SavLen,ecx ;/* save current len for later */ shr ecx,4 ;/* ecx = len / 16 */ jz No_Sixteens ; align loop head at start of 486 internal cache line !! align 16 Next_Sixteen: } # ifndef NO_32_BIT_LOADS Do_CRC_4dword ; # else /* NO_32_BIT_LOADS */ Do_CRC_byteof(0) ; Do_CRC_byteof(1) ; Do_CRC_byteof(2) ; Do_CRC_byteof(3) ; Do_CRr UNZIP.BCK/NZIP60.WIN32]CRC_I386.C;1.VAX_DECC_OLB;1C_byteof(4) ; Do_CRC_byteof(5) ; Do_CRC_byteof(6) ; Do_CRC_byteof(7) ; Do_CRC_byteof(8) ; Do_CRC_byteof(9) ; Do_CRC_byteof(10) ; Do_CRC_byteof(11) ; Do_CRC_byteof(12) ; Do_CRC_byteof(13) ; Do_CRC_byteof(14) ; Do_CRC_byteof(15) ; __asm { add esi,16 }; # endif /* ?NO_32_BIT_LOADS */ __asm { dec ecx jnz Next_Sixteen No_Sixteens: mov ecx,SavLen and ecx,00000000FH ;/* ecx = len % 16 */ # ifndef NO_32_BIT_LOADS shr ecx,2 jz No_Fours Next_Four: } Do_CRC_dword ; __asm { dec ecx jnz Next_Four No_Fours: mov ecx,SavLen and ecx,000000003H ;/* ecx = len % 4 */ # endif /* !NO_32_BIT_LOADS */ #endif /* !NO_UNROLLED_LOOPS */ jz bail ;/*> if (len) */ ; align loop head at start of 486 internal cache line !! align 16 loupe: ;/*> do { */ } Do_CRC_byte ;/* c = CRC32(c,*buf++,crctab);*/ __asm { dec ecx ;/*> } while (--len); */ jnz loupe bail: ;/*> } */ not eax ;/*> return ~c; */ fine: pop ecx pop edx } #ifdef NEED_RETURN return _EAX; #endif } #endif /* MSC_INLINE_ASM_32BIT_SUPPORT */ #if (defined(_MSC_VER) && _MSC_VER >= 700) #if (defined(_M_IX86) && _M_IX86 >= 300) /* Reenable missing return value warning */ # pragma warning( default : 4035 ) #endif #endif #endif /* ASM_CRC && !USE_ZLIB && !CRC_TABLE_ONLY */ *[UNZIP60.WIN32]CRC_LCC.ASM;1+,8./ 4G@-0123KPWO56*c`7*c`89GHJ;=========================================================================== ; Copyright (c) 1990-2006 Info-ZIP. All rights reserved. ; ; See the accompanying file LICENSE, version 2000-Apr-09 or later ; (the contents of which are also included in zip.h) for terms of use. ; If, for some reason, all these files are missing, the Info-ZIP license ; also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html ;=========================================================================== ; crc_lcc.asm, optimized CRC calculation function for Zip and UnZip, ; created by Paul Kienitz and Christian Spieler. Last revised 02 Jan 2006. ; ; The code in this file has been copied verbatim from crc_i386.{asm|S}; ; only the assembler syntax and metacommands have been adapted to ; the habits of the free LCC-Win32 C compiler package. ; This version of the code uses the "optimized for i686" variant of ; crc_i386.{asm|S}. ; IMPORTANT NOTE to the Info-ZIP editors: ; The TAB characters in this source file are required by the parser of ; the LCC-Win32 assembler program and MUST NOT be removed!! ; ; For more information (and a revision log), look into the original ; source files. ; .text .file "crc32.c" .text .type _crc32,function _crc32: pushl %ebp movl %esp,%ebp pushl %ecx pushl %ebx pushl %esi pushl %edi .line 34 .line 37 movl 12(%ebp),%esi subl %eax,%eax testl %esi,%esi jz _$3 .line 39 call _get_crc_table movl %eax,%edi .line 41 movl 8(%ebp),%eax movl 16(%ebp),%ecx notl %eax testl %ecx,%ecx jz _$4 _$5: testl $3,%esi jz _$6 xorb (%esi),%al incl %esi movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax decl %ecx jnz _$5 _$6: movl %ecx,%edx shrl $4,%ecx jz _$8 _$7: xorl (%esi),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax xorl 4(%esi),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax xorl 8(%esi),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax xorl 12(%esi),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax addl $16,%esi movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax decl %ecx jnz _$7 _$8: movl %edx,%ecx andl $0x0f,%ecx shrl $2,%ecx jz _$10 _$9: xorl (%esi),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax addl $4,%esi movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax decl %ecx jnz _$9 _$10: movl %edx,%ecx andl $0x03,%ecx jz _$4 _$11: xorb (%esi),%al incl %esi movzbl %al,%ebx shrl $8,%eax xorl (%edi,%ebx,4),%eax decl %ecx jnz _$11 _$4: xorl $0xffffffff,%eax _$3: .line 52 popl %edi popl %esi popl %ebx leave ret _$34: .size _crc32,_$34-_crc32 .globl _crc32 .extern _get_crc_table *[UNZIP60.WIN32]MAKEFILE.;1+,~.1/ 4118@-0123KPWO256XQS7XQS89GHJ# NMAKE Makefile for Windows NT/2K/XP/... and Windows 95/98/Me # D. Feinleib 7/92 # H. Gessau 9/93 # J. Lee 8/95 (johnnyl@microsoft.com) # C. Spieler 03/99 # # Last revised: 06 Jan 2009 # # Tested with VC++ 2.0 for NT for MIPS and Alpha, Visual C++ 2.2 for Intel CPUs # Revision tested with VC++ 5.0, 6.0, 8.0 and 9.0 for Intel CPUs # # Option switches # (specify OPTFLAG as "OPTFLAG={1|0}" on the nmake command line) # USEBZ2DLL=1 : bzip2 support, link against externally supplied dll # USEBZ2STAT=1 : bzip2 support by static library created during build # USEBZ2=1 : alias for USEBZ2STAT=1 # # USEZLIBDLL=1 : replace built-in inflate by external zlib dll # USEZLIBSTAT=1 : replace built-in inflate by external zlib static lib # USEZLIB=1 : alias for USEZLIBSTAT=1 # # USE_DLLRUNTIME : link executables against C runtime dll # (default: executables are linked against static lib) # USEBZ2DLL or USEZLIBDLL imply USE_DLLRUNTIME ! # DLLSTANDALONE : unzip32.dll is linked against static MT runtime lib # (default: unzip32.dll linked against C runtime dll) # # USE_UTF8 : =0 no unicode names support # =1 force recognition of UTF8 extra fields and # "UTF8 name" attrib (default) # # USEASM : use assembler code for crc32 function (default) # NOASM <* UNZIP.BCK~[UNZIP60.WIN32]MAKEFILE.;1P.VAX_DECC_OLB;11V : use C implementation for crc32 function # USEMASM : use MS macro assembler (MASM) to assemble crc32 code # USEML : use MS macro assembler (ML driver) to create crc32 # (default: use C inline assembler code for crc32) # # NOCRC_OPT=1 : disable "unfolding CRC tables" optimization # # USEIZTIMEZONE : =0 (default) timezone setup by built-in C RTL # =1 apply InfoZip replacement code for timezone setup # (recognizes extended syntax when timezone setup # is overridden by environment variable) # Nmake macros for building Win32 applications # To build with debug info use 'nmake debug=1' !IFNDEF debug NODEBUG=1 !ENDIF !ifdef NOASM APPLY_ASMCRC=0 !else !ifdef USEASM APPLY_ASMCRC=1 !endif !endif # Options to decide whether using zlib as decompression library. # Specify USEZLIBDLL or USEZLIBSTAT to replace UnZip's built-in inflation code # by the inflate service of the zlib library. # (The option USEZLIB is currently set as a synonym for USEZLIBSTAT.) !if defined(USEZLIBSTAT) || defined(USEZLIBDLL) USEZLIB=1 !endif !ifdef USEZLIB !if defined(USEZLIBSTAT) && defined(USEZLIBDLL) !ERROR Conflicting options USEZLIBSTAT and USEZLIBDLL requested! !endif # Set static zlib linkage as default in case nothing is specified. !if !defined(USEZLIBSTAT) && !defined(USEZLIBDLL) USEZLIBSTAT=1 !endif !undef USEASM APPLY_ASMCRC=0 NOCRC_OPT=1 ZLIBLIB=zlib.lib ZLIBLIBDLL=zdll.lib !else # !USEZLIB ZLIBLIB= ZLIBLIBDLL= !endif # ?USEZLIB # Options to include optional support for bzip2 decompression !if defined(USEBZ2STAT) || defined(USEBZ2DLL) USEBZ2=1 !endif IZ_BZIP2 = bzip2 # Subfolder containing bz2 objects/lib for UnZip program target(s). OBEXE = obexe # Subfolder containing bz2 objects/lib for UnZip DLL target(s). OBDLL = obdll !ifdef USEBZ2 !if defined(USEBZ2STAT) && defined(USEBZ2DLL) !ERROR Conflicting options USEBZ2STAT and USEBZ2DLL requested! !endif INC_BZ2LIB=-I$(IZ_BZIP2) # Set static bzip2 linkage as default in case nothing is specified. !if !defined(USEBZ2STAT) && !defined(USEBZ2DLL) USEBZ2STAT=1 !endif !IFNDEF debug !ifdef USEBZ2STAT BZIPLIBEXE=$(IZ_BZIP2)/$(OBEXE)/bz2.lib BZIPLIBDLL=$(IZ_BZIP2)/$(OBDLL)/bz2.lib !else BZIPLIBEXE=bz2.lib BZIPLIBDLL=bz2.lib !endif !ELSE BZIPLIBEXE=bz2d.lib BZIPLIBDLL=bz2d.lib !ENDIF !else # !USEBZ2 INC_BZ2LIB= BZIPLIBEXE= BZIPLIBDLL= !endif # ?USEBZ2 !ifndef APPLY_ASMCRC #default ASM CRC code (inline asm in C source) for now... APPLY_ASMCRC=1 !endif !ifndef USE_IZTIMEZONE #default: do not use the IZ timezone replacement USE_IZTIMEZONE=0 !endif !ifndef USE_UTF8 #default for now: include support for UTF8 paths USE_UTF8=1 !endif !IF "$(CPU)" == "" && "$(PROCESSOR_ARCHITECTURE)" == "x86" CPU = i386 !ENDIF !IF "$(CPU)" == "" && "$(PROCESSOR_ARCHITECTURE)" == "MIPS" CPU = $(PROCESSOR_ARCHITECTURE) !ENDIF !IF "$(CPU)" == "" && "$(PROCESSOR_ARCHITECTURE)" == "ALPHA" CPU = $(PROCESSOR_ARCHITECTURE) !ENDIF !IF "$(CPU)" == "" && "$(PROCESSOR_ARCHITECTURE)" == "PPC" CPU = $(PROCESSOR_ARCHITECTURE) !ENDIF !IF "$(CPU)" == "" CPU = i386 !ENDIF # special subdirectory for the static library binaries, to separate them # from other binaries (including dll import library file) OBDIR = ow32lib OB = $(OBDIR)/ # object files OBJU1 = unzip.obj crc32.obj $(CRCA_O) crypt.obj envargs.obj explode.obj OBJU2 = extract.obj fileio.obj globals.obj inflate.obj list.obj match.obj OBJU3 = process.obj ttyio.obj ubz2err.obj unreduce.obj unshrink.obj zipinfo.obj OBJUS = win32.obj win32i64.obj nt.obj $(TIMEZONE_OBJU) OBJU = $(OBJU1) $(OBJU2) $(OBJU3) $(OBJUS) OBJX1 = unzipsfx.obj crc32_.obj $(CRCA_OX) crypt_.obj OBJX2 = extract_.obj fileio_.obj globals_.obj inflate_.obj OBJX3 = match_.obj process_.obj ttyio_.obj ubz2err_.obj OBJXS = win32_.obj win32i64_.obj nt_.obj $(TIMEZONE_OBJX) OBJX = $(OBJX1) $(OBJX2) $(OBJX3) $(OBJXS) OBJF1 = funzip.obj crc32f.obj $(CRCA_OF) cryptf.obj globalsf.obj OBJF2 = inflatef.obj ttyiof.obj OBJFS = win32f.obj win32i64f.obj OBJF = $(OBJF1) $(OBJF2) $(OBJFS) OBJD1 = api.obj crc32l.obj $(CRCA_OL) cryptl.obj explodel.obj OBJD2 = extractl.obj fileiol.obj globalsl.obj inflatel.obj OBJD3 = listl.obj matchl.obj processl.obj OBJD4 = ubz2errl.obj unreducl.obj unshrnkl.obj zipinfol.obj OBJDS = win32l.obj win32i64l.obj ntl.obj windll.obj $(TIMEZONE_OBJD) OBJD = $(OBJD1) $(OBJD2) $(OBJD3) $(OBJD4) $(OBJDS) OBLX1 = apig.obj crc32g.obj $(CRCA_OG) cryptg.obj OBLX2 = extractg.obj fileiog.obj globalsg.obj inflateg.obj OBLX3 = matchg.obj processg.obj OBLXS = win32g.obj win32i64g.obj ntg.obj windllg.obj $(TIMEZONE_OBLX) OBLX = $(OBLX1) $(OBLX2) $(OBLX3) $(OBLXS) OBGX = sfxwiz.obj OBJB1 = $(OB)apib.obj $(OB)crc32b.obj $(CRCA_OB) $(OB)cryptb.obj OBJB2 = $(OB)explodeb.obj $(OB)extractb.obj $(OB)fileiob.obj $(OB)globalsb.obj OBJB3 = $(OB)inflateb.obj $(OB)listb.obj $(OB)matchb.obj $(OB)processb.obj OBJB4 = $(OB)ubz2errb.obj $(OB)unreducb.obj $(OB)unshrnkb.obj $(OB)zipinfob.obj OBJBS = $(OB)win32b.obj $(OB)win32i64b.obj $(OB)ntb.obj $(OB)windllb.obj $(TIMEZONE_OBJB) OBJB = $(OBJB1) $(OBJB2) $(OBJB3) $(OBJB4) $(OBJBS) UNZIP_H = unzip.h unzpriv.h globals.h win32/w32cfg.h WINDLL_H = windll/windll.h windll/decs.h windll/structs.h WINDLL_DEF = windll/windll32.def WINDLL_IMP_H = windll/decs.h windll/structs.h !if $(APPLY_ASMCRC) != 0 CFVARS_ASM = -DASM_CRC !else CFVARS_ASM = -DNO_ASM !endif !if $(USE_IZTIMEZONE) != 0 LOCAL_UNZIP = -DW32_USE_IZ_TIMEZONE $(LOCAL_UNZIP) !endif !if $(USE_UTF8) != 0 LOCAL_UNZIP = -DUNICODE_SUPPORT $(LOCAL_UNZIP) !else LOCAL_UNZIP = -DNO_UNICODE_SUPPORT $(LOCAL_UNZIP) !endif !ifndef NOCRC_OPT LOCAL_UNZIP = -DIZ_CRCOPTIM_UNFOLDTBL $(LOCAL_UNZIP) !endif !ifdef USEZLIB LOCAL_UNZIP = -DUSE_ZLIB $(LOCAL_UNZIP) !endif !ifdef USEBZ2 LOCAL_UNZIP = -DUSE_BZIP2 $(LOCAL_UNZIP) !endif #CF_LOC = -nologo -J -D_MBCS $(CFVARS_ASM) -DREENTRANT CF_LOC = -nologo -J -D_MBCS $(CFVARS_ASM) $(LOCAL_UNZIP) !if $(APPLY_ASMCRC) != 0 CRCA_O = crc_i386.obj CRCA_OX = $(CRCA_O) CRCA_OF = $(CRCA_O) CRCA_OL = crci386l.obj CRCA_OG = crci386g.obj CRCA_OB = $(OB)crci386b.obj !else CRCA_O = CRCA_OX = CRCA_OF = CRCA_OL = CRCA_OG = CRCA_OB = !endif !if $(USE_IZTIMEZONE) != 0 TIMEZONE_OBJU = timezone.obj TIMEZONE_OBJX = timezon_.obj TIMEZONE_OBJD = timezonl.obj TIMEZONE_OBLX = timezolx.obj TIMEZONE_OBJB = $(OB)timezonb.obj !else TIMEZONE_OBJU = TIMEZONE_OBJX = TIMEZONE_OBJD = TIMEZONE_OBLX = TIMEZONE_OBJB = !endif # binary declarations common to all platforms cc = cl rc = rc link = link implib = lib hc = hcrtf -xn # declarations common to all compiler options cflags = -c -W3 -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo !IF "$(CPU)" == "i386" cflags = $(cflags) -D_X86_=1 !ELSE !IF "$(CPU)" == "ALPHA" cflags = $(cflags) -D_ALPHA_=1 !ENDIF !ENDIF # for Windows applications that use the C Run-Time libraries cvars = -DWIN32 -D_WIN32 cvarsmt = $(cvars) -MT cvarsdll = $(cvars) -MD ## The CRT library, depending on Compiler version and target configuration. ## This Makefile version has been changed to rely on the 'default library' ## notations in the compiled object files, to work around differences between ## MS Visual C++ releases concerning libraries support. #libc = libc.lib oldnames.lib #libcmt = libcmt.lib oldnames.lib #libcdll = msvcrt.lib oldnames.lib # optional profiling and tuning libraries !IFDEF PROFILE optlibs = cap.lib !ELSE !IFDEF TUNE optlibs = wst.lib !ELSE optlibs = !ENDIF !ENDIF # USER32.LIB is needed for OemToChar and related routines baselibs = kernel32.lib $(optlibs) advapi32.lib user32.lib winlibs = $(baselibs) gdi32.lib comdlg32.lib  UNZIP.BCK~[UNZIP60.WIN32]MAKEFILE.;1P.VAX_DECC_OLB;118winspool.lib conlibs = $(baselibs) conlibsmt = $(baselibs) conlibsdll = $(baselibs) guilibs = $(winlibs) guilibsdll = $(winlibs) # Some optimization (if not debugging) !IFDEF NODEBUG cdebug = -O2 cdbgsz = -O1 !ELSE !IFDEF PROFILE cdebug = -Gh -Zd -Ox !ELSE !IFDEF TUNE cdebug = -Gh -Zd -Ox !ELSE cdebug = -Z7 -Od !ENDIF !ENDIF cdbgsz = $(cdebug) !ENDIF # declarations common to all linker options lflags = /INCREMENTAL:NO /PDB:NONE /NOLOGO # for Windows applications that use the C Run-Time libraries conlflags = $(lflags) /subsystem:console guilflags = $(lflags) /subsystem:windows dlllflags = $(lflags) /DLL # ------------------------------------------------------------------------- # Target Module Dependent Link Debug Flags - must be specified after $(link) # # These switches allow the inclusion of the necessary symbolic information # for source level debugging with WinDebug, profiling and/or performance # tuning. # # Note: Debug switches are on by default. # ------------------------------------------------------------------------- !IFDEF NODEBUG ldebug = /RELEASE !ELSE !IFDEF PROFILE ldebug = -debug:mapped,partial -debugtype:coff !ELSE !IFDEF TUNE ldebug = -debug:mapped,partial -debugtype:coff !ELSE ldebug = -debug:full -debugtype:cv !ENDIF !ENDIF !ENDIF !ifdef PROFILEINFO ldebug = $(ldebug) /PROFILE !endif !ifdef SYM ldebug = $(ldebug) /DEBUG:FULL /DEBUGTYPE:CV cdebug = $(cdebug) -Zi cdbgsz = $(cdbgsz) -Zi !endif # When using zlib and/or bzip2 external decompression code DLLs, we want # to link against the dll version of the C runtime library. !IF defined(USEZLIBDLL) || defined(USEBZ2DLL) || defined(USE_DLLRUNTIME) LINK_CRTDLL=1 !UNDEF DLLSTANDALONE !ELSE LINK_CRTDLL=0 !ENDIF !IF $(LINK_CRTDLL) == 1 # Using zlib DLL as decompression core (and/or bzip2 decompression dll) # implies linking all executables against the DLL version of the C RTL. cvars_iz = $(cvarsdll) $(CF_LOC) cvars_izdll = $(cvarsdll) $(CF_LOC) conlibs_iz = $(conlibsdll) $(ZLIBLIBDLL) $(BZIPLIBEXE) conlibs_izdll = $(conlibsdll) $(ZLIBLIBDLL) $(BZIPLIBDLL) guilibs_iz = $(guilibsdll) $(ZLIBLIBDLL) $(BZIPLIBEXE) !ELSE # With the default setup (using Info-ZIP's own inflate code and/or static # external decompression code), the executables are linked against the # single-thread static C-RTL library to get self-contained programs. cvars_iz = $(cvars) $(CF_LOC) conlibs_iz = $(conlibs) $(ZLIBLIB) $(BZIPLIBEXE) guilibs_iz = $(guilibs) $(ZLIBLIB) $(BZIPLIBEXE) !IFDEF DLLSTANDALONE # The standalone variant of unzip32.dll is linked against the # multithread-safe static C runtime library. cvars_izdll = $(cvarsmt) $(CF_LOC) conlibs_izdll = $(conlibsmt) $(ZLIBLIB) $(BZIPLIBDLL) !ELSE # The (normal) variant of unzip32.dll is linked against the import library # of the multithread-safe C runtime dll. # -> smaller dll size; efficient use of shared resources, # but requires the C RTL DLL msvcrt.dll to be installed at runtime cvars_izdll = $(cvarsdll) $(CF_LOC) conlibs_izdll = $(conlibsdll) $(ZLIBLIBDLL) $(BZIPLIBDLL) !ENDIF !ENDIF # ?(LINK_CRTDLL == 1) CFLAGS_UN = $(cdebug) $(cflags) $(INC_BZ2LIB) $(cvars_iz) CFLAGS_SX = $(cdbgsz) $(cflags) $(INC_BZ2LIB) $(cvars_iz) -DSFX CFLAGS_FU = $(cdebug) $(cflags) $(cvars_iz) -DFUNZIP CFLAGS_DL = $(cdebug) $(cflags) $(INC_BZ2LIB) $(cvars_izdll) -DWINDLL -DDLL CFLAGS_DX = $(cdebug) $(cflags) $(INC_BZ2LIB) $(cvars_izdll) CFLAGS_SL = $(cdbgsz) $(cflags) $(INC_BZ2LIB) $(cvars_iz) -DWINDLL -DDLL -DUNZIPLIB -DSFX CFLAGS_GX = $(cdbgsz) $(cflags) $(cvars_iz) -DSFX CFLAGS_LB = $(cdebug) $(cflags) $(INC_BZ2LIB) $(cvars_iz) -DWINDLL -DDLL -DUNZIPLIB # You may define VC6LINK if your linker recognizes "-opt:nowin98" alignment # qualifier. (VC6 or newer). This option reduces the executable size of the # SFX stubs (Instead, you might apply the free executable compressor "upx" # which is far more efficient in reducing the stub's file size.) !IFDEF VC6LINK LINKOPT_SIZE = -opt:nowin98 !ENDIF # How to compile sources .c.obj: $(cc) $(CFLAGS_UN) -Fo$@ $< # How to link .obj.exe: $(link) $(ldebug) $(conlflags) $(conlibs_iz) $** -out:$@ # Default target is all command-line executables unzips: unzip.exe funzip.exe unzipsfx.exe guisfx: SFXWiz32.exe dll: unzip32.dll dllsample: uzexampl.exe lib: $(OBDIR) $(OB)unzip32.lib all: unzips guisfx dll dllsample lib unzip.exe: $(OBJU) $(BZIPLIBEXE) winapp.res $(link) $(ldebug) $(conlflags) $(conlibs_iz) $** -out:$@ unzipsfx.exe: $(OBJX) $(BZIPLIBEXE) $(link) $(ldebug) $(conlflags) $(conlibs_iz) $** $(LINKOPT_SIZE) -out:$@ funzip.exe: $(OBJF) unzip32.dll: $(OBJD) $(BZIPLIBDLL) windll.res $(WINDLL_DEF) $(link) $(ldebug) $(dlllflags) $(conlibs_izdll) -def:$(WINDLL_DEF) \ $(OBJD) $(BZIPLIBDLL) windll.res -out:$@ unzsfx32.lib: $(OBLX) $(link) -lib $** -out:$@ SFXWiz32.exe: $(OBGX) sfxwiz.res unzsfx32.lib $(BZIPLIBEXE) $(link) $(ldebug) $(guilflags) $(guilibs_iz) \ $(OBGX) sfxwiz.res unzsfx32.lib $(LINKOPT_SIZE) -out:$@ uzexampl.exe: uzexampl.obj $(link) $(ldebug) $(conlflags) $(conlibs) version.lib $** -out:$@ $(OB)unzip32.lib: $(OBJB) $(link) -lib $** -out:$@ $(IZ_BZIP2)/$(OBEXE)/bz2.lib: $(MAKE) -f $(IZ_BZIP2)/makbz2iz.msc \ CFLSYS="$(cdebug) $(cflags) $(cvars_iz)" \ BZROOTDIR=$(IZ_BZIP2) BZOBDIR=$(IZ_BZIP2)\$(OBEXE) $(IZ_BZIP2)/$(OBDLL)/bz2.lib: $(MAKE) -f $(IZ_BZIP2)/makbz2iz.msc \ CFLSYS="$(cdebug) $(cflags) $(cvars_izdll)" \ BZROOTDIR=$(IZ_BZIP2) BZOBDIR=$(IZ_BZIP2)\$(OBDLL) crc32.obj: crc32.c $(UNZIP_H) zip.h crc32.h crypt.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs.obj: envargs.c $(UNZIP_H) explode.obj: explode.c $(UNZIP_H) extract.obj: extract.c $(UNZIP_H) crc32.h crypt.h fileio.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip.obj: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h globals.obj: globals.c $(UNZIP_H) inflate.obj: inflate.c inflate.h $(UNZIP_H) list.obj: list.c $(UNZIP_H) match.obj: match.c $(UNZIP_H) process.obj: process.c $(UNZIP_H) crc32.h timezone.obj: timezone.c $(UNZIP_H) zip.h timezone.h ttyio.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err.obj: ubz2err.c $(UNZIP_H) unreduce.obj: unreduce.c $(UNZIP_H) unshrink.obj: unshrink.c $(UNZIP_H) unzip.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo.obj: zipinfo.c $(UNZIP_H) win32.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_UN) -I. win32/win32.c -Fo$@ win32i64.obj: win32/win32i64.c $(UNZIP_H) $(cc) $(CFLAGS_UN) -I. win32/win32i64.c -Fo$@ nt.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_UN) -I. win32/nt.c -Fo$@ !ifdef USEMASM crc_i386.obj: win32/crc_i386.asm masm -ml win32/crc_i386.asm,$@; !else !ifdef USEML crc_i386.obj: win32/crc_i386.asm ml -c -Cp -coff -Fo$@ win32/crc_i386.asm !else crc_i386.obj: win32/crc_i386.c $(cc) $(CFLAGS_UN) -I. win32/crc_i386.c -Fo$@ !endif !endif # UnZipSFX compilation section crc32_.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(cc) $(CFLAGS_SX) crc32.c -Fo$@ crypt_.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(cc) $(CFLAGS_SX) crypt.c -Fo$@ extract_.obj: extract.c $(UNZIP_H) crc32.h crypt.h $(cc) $(CFLAGS_SX) extract.c -Fo$@ fileio_.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(cc) $(CFLAGS_SX) fileio.c -Fo$@ globals_.obj: globals.c $(UNZIP_H) $(cc) $(CFLAGS_SX) globals.c -Fo$@ inflate_.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(cc) $(CFLAGS_SX) inflate.c -Fo$@ match_.obj: match.c $(UNZIP_H) $(cc) $(CFLAGS_SX) match.c -Fo$@ process_.obj: process.c $(UNZIP_H) crc32.h $(cc) $(CFLAGS_SX) process.c -Fo$@ timezon_.obj: timezone.c $(UNZIP_H) zip.h timezone.h $(cc) $(CFLAGS_SX) timezone.c -Fo$@ ttyio_.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(cc) $(CFLAGS_SX) ttyio.c -Fo$@ ubz2err_.obj: ubz2err.c $(UN) UNZIP.BCK~[UNZIP60.WIN32]MAKEFILE.;1P.VAX_DECC_OLB;11^"ZIP_H) $(cc) $(CFLAGS_SX) ubz2err.c -Fo$@ unzipsfx.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(cc) $(CFLAGS_SX) unzip.c -Fo$@ win32_.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_SX) -I. win32/win32.c -Fo$@ win32i64_.obj: win32/win32i64.c $(UNZIP_H) $(cc) $(CFLAGS_SX) -I. win32/win32i64.c -Fo$@ nt_.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_SX) -I. win32/nt.c -Fo$@ # fUnZip compilation section crc32f.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(cc) $(CFLAGS_FU) crc32.c -Fo$@ cryptf.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(cc) $(CFLAGS_FU) crypt.c -Fo$@ globalsf.obj: globals.c $(UNZIP_H) $(cc) $(CFLAGS_FU) globals.c -Fo$@ inflatef.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(cc) $(CFLAGS_FU) inflate.c -Fo$@ ttyiof.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(cc) $(CFLAGS_FU) ttyio.c -Fo$@ win32f.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_FU) -I. win32/win32.c -Fo$@ win32i64f.obj: win32/win32i64.c $(UNZIP_H) $(cc) $(CFLAGS_FU) -I. win32/win32i64.c -Fo$@ # DLL compilation section api.obj: api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(cc) $(CFLAGS_DL) api.c -Fo$@ crc32l.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(cc) $(CFLAGS_DL) crc32.c -Fo$@ cryptl.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(cc) $(CFLAGS_DL) crypt.c -Fo$@ explodel.obj: explode.c $(UNZIP_H) $(cc) $(CFLAGS_DL) explode.c -Fo$@ extractl.obj: extract.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h $(cc) $(CFLAGS_DL) extract.c -Fo$@ fileiol.obj: fileio.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h ttyio.h ebcdic.h $(cc) $(CFLAGS_DL) fileio.c -Fo$@ globalsl.obj: globals.c $(UNZIP_H) $(cc) $(CFLAGS_DL) globals.c -Fo$@ inflatel.obj: inflate.c inflate.h $(UNZIP_H) $(cc) $(CFLAGS_DL) inflate.c -Fo$@ listl.obj: list.c $(UNZIP_H) $(WINDLL_H) $(cc) $(CFLAGS_DL) list.c -Fo$@ matchl.obj: match.c $(UNZIP_H) $(cc) $(CFLAGS_DL) match.c -Fo$@ processl.obj: process.c $(UNZIP_H) $(WINDLL_H) crc32.h $(cc) $(CFLAGS_DL) process.c -Fo$@ timezonl.obj: timezone.c $(UNZIP_H) zip.h timezone.h $(cc) $(CFLAGS_DL) timezone.c -Fo$@ ubz2errl.obj: ubz2err.c $(UNZIP_H) $(cc) $(CFLAGS_DL) ubz2err.c -Fo$@ unreducl.obj: unreduce.c $(UNZIP_H) $(cc) $(CFLAGS_DL) unreduce.c -Fo$@ unshrnkl.obj: unshrink.c $(UNZIP_H) $(cc) $(CFLAGS_DL) unshrink.c -Fo$@ zipinfol.obj: zipinfo.c $(UNZIP_H) $(cc) $(CFLAGS_DL) zipinfo.c -Fo$@ win32l.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_DL) -I. win32/win32.c -Fo$@ win32i64l.obj: win32/win32i64.c $(UNZIP_H) $(cc) $(CFLAGS_DL) -I. win32/win32i64.c -Fo$@ ntl.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_DL) -I. win32/nt.c -Fo$@ windll.obj: windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(cc) $(CFLAGS_DL) -I. windll/windll.c -Fo$@ !ifdef USEMASM crci386l.obj: win32/crc_i386.asm masm -ml win32/crc_i386.asm,$@; !else !ifdef USEML crci386l.obj: win32/crc_i386.asm ml -c -Cp -coff -Fo$@ win32/crc_i386.asm !else crci386l.obj: win32/crc_i386.c $(cc) $(CFLAGS_DL) -I. win32/crc_i386.c -Fo$@ !endif !endif winapp.res: win32/winapp.rc unzvers.h $(rc) /l 0x409 /fo$@ /i win32 /d WIN32 win32/winapp.rc windll.res: windll/windll.rc unzvers.h $(rc) /l 0x409 /fo$@ /i windll /d WIN32 windll/windll.rc uzexampl.obj: windll/uzexampl.c windll/uzexampl.h $(cc) $(CFLAGS_DX) -I. windll/uzexampl.c -Fo$@ # SFX Lib compilation section apig.obj: api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(cc) $(CFLAGS_SL) api.c -Fo$@ crc32g.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(cc) $(CFLAGS_SL) crc32.c -Fo$@ cryptg.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(cc) $(CFLAGS_SL) crypt.c -Fo$@ extractg.obj: extract.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h $(cc) $(CFLAGS_SL) extract.c -Fo$@ fileiog.obj: fileio.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h ttyio.h ebcdic.h $(cc) $(CFLAGS_SL) fileio.c -Fo$@ globalsg.obj: globals.c $(UNZIP_H) $(cc) $(CFLAGS_SL) globals.c -Fo$@ inflateg.obj: inflate.c inflate.h $(UNZIP_H) $(cc) $(CFLAGS_SL) inflate.c -Fo$@ matchg.obj: match.c $(UNZIP_H) $(cc) $(CFLAGS_SL) match.c -Fo$@ processg.obj: process.c $(UNZIP_H) $(WINDLL_H) crc32.h $(cc) $(CFLAGS_SL) process.c -Fo$@ timezong.obj: timezone.c $(UNZIP_H) zip.h timezone.h $(cc) $(CFLAGS_SL) timezone.c -Fo$@ ubz2errg.obj: ubz2err.c $(UNZIP_H) $(cc) $(CFLAGS_SL) ubz2err.c -Fo$@ win32g.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_SL) -I. win32/win32.c -Fo$@ win32i64g.obj: win32/win32i64.c $(UNZIP_H) $(cc) $(CFLAGS_SL) -I. win32/win32i64.c -Fo$@ ntg.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_SL) -I. win32/nt.c -Fo$@ windllg.obj: windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(cc) $(CFLAGS_SL) -I. windll/windll.c -Fo$@ !ifdef USEMASM crci386g.obj: win32/crc_i386.asm masm -ml win32/crc_i386.asm,$@; !else !ifdef USEML crci386g.obj: win32/crc_i386.asm ml -c -Cp -coff -Fo$@ win32/crc_i386.asm !else crci386g.obj: win32/crc_i386.c $(cc) $(CFLAGS_SL) -I. win32/crc_i386.c -Fo$@ !endif !endif sfxwiz.obj: windll/guisfx/sfxwiz.c windll/guisfx/dialog.h $(WINDLL_IMP_H) $(cc) $(CFLAGS_GX) windll/guisfx/sfxwiz.c -Fo$@ sfxwiz.res: windll/guisfx/sfxwiz.rc $(rc) /l 0x409 /fo$@ /i windll/guisfx /d WIN32 windll/guisfx/sfxwiz.rc # static LIB compilation section $(OB)apib.obj: api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(cc) $(CFLAGS_LB) api.c -Fo$@ $(OB)crc32b.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(cc) $(CFLAGS_LB) crc32.c -Fo$@ $(OB)cryptb.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(cc) $(CFLAGS_LB) crypt.c -Fo$@ $(OB)explodeb.obj: explode.c $(UNZIP_H) $(cc) $(CFLAGS_LB) explode.c -Fo$@ $(OB)extractb.obj: extract.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h $(cc) $(CFLAGS_LB) extract.c -Fo$@ $(OB)fileiob.obj: fileio.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h ttyio.h ebcdic.h $(cc) $(CFLAGS_LB) fileio.c -Fo$@ $(OB)globalsb.obj: globals.c $(UNZIP_H) $(cc) $(CFLAGS_LB) globals.c -Fo$@ $(OB)inflateb.obj: inflate.c inflate.h $(UNZIP_H) $(cc) $(CFLAGS_LB) inflate.c -Fo$@ $(OB)listb.obj: list.c $(UNZIP_H) $(WINDLL_H) $(cc) $(CFLAGS_LB) list.c -Fo$@ $(OB)matchb.obj: match.c $(UNZIP_H) $(cc) $(CFLAGS_LB) match.c -Fo$@ $(OB)processb.obj: process.c $(UNZIP_H) $(WINDLL_H) crc32.h $(cc) $(CFLAGS_LB) process.c -Fo$@ $(OB)timezonb.obj: timezone.c $(UNZIP_H) zip.h timezone.h $(cc) $(CFLAGS_LB) timezone.c -Fo$@ $(OB)ubz2errb.obj: ubz2err.c $(UNZIP_H) $(cc) $(CFLAGS_LB) ubz2err.c -Fo$@ $(OB)unreducb.obj: unreduce.c $(UNZIP_H) $(cc) $(CFLAGS_LB) unreduce.c -Fo$@ $(OB)unshrnkb.obj: unshrink.c $(UNZIP_H) $(cc) $(CFLAGS_LB) unshrink.c -Fo$@ $(OB)zipinfob.obj: zipinfo.c $(UNZIP_H) $(cc) $(CFLAGS_LB) zipinfo.c -Fo$@ $(OB)win32b.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_LB) -I. win32/win32.c -Fo$@ $(OB)win32i64b.obj: win32/win32i64.c $(UNZIP_H) $(cc) $(CFLAGS_LB) -I. win32/win32i64.c -Fo$@ $(OB)ntb.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(cc) $(CFLAGS_LB) -I. win32/nt.c -Fo$@ $(OB)windllb.obj: windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(cc) $(CFLAGS_LB) -I. windll/windll.c -Fo$@ !ifdef USEMASM $(OB)crci386b.obj: win32/crc_i386.asm masm -ml win32/crc_i386.asm,$@; !else !ifdef USEML $(OB)crci386b.obj: win32/crc_i386.asm ml -c -Cp -coff -Fo$@ win32/crc_i386.asm !else $(OB)crci386b.obj: win32/crc_i386.c $(cc) $(CFLAGS_LB) -I. win32/crc_i386.c -Fo$@ !endif !endif $(OBDIR): -mkdir $@ clean: clean_bz2exe_lib clean_bz2dll_lib -del *.obj -del winapp.res -del unzip.exe -del unzip.pdb -del funzip.exe -del funzip.pdb -del unzipsfx.exe -del unzipsfx.pdb -del vc60.pdb -del sfxwiz.res -del SFXWiz32.exe -del windll.res -del unzip32.dll -del unzip32.lib -del unzip32.exp -del unzip32.dll.manifest -del uzexampl.exe -del x A UNZIP.BCK~[UNZIP60.WIN32]MAKEFILE.;1P.VAX_DECC_OLB;11<1unzsfx32.lib -del $(OBDIR)\*.obj -del $(OBDIR)\unzip32.lib -rmdir $(OBDIR) clean_bz2exe_lib: -$(MAKE) -f $(IZ_BZIP2)/makbz2iz.msc \ BZROOTDIR=$(IZ_BZIP2) BZOBDIR=$(IZ_BZIP2)\$(OBEXE) clean clean_bz2dll_lib: -$(MAKE) -f $(IZ_BZIP2)/makbz2iz.msc \ BZROOTDIR=$(IZ_BZIP2) BZOBDIR=$(IZ_BZIP2)\$(OBDLL) clean  UNZIP.BCKd[UNZIP60.WIN32]MAKEFILE.BC;1VAX_DECC_OLB;1 *[UNZIP60.WIN32]MAKEFILE.BC;1+,d. / 4 @-0123KPWO!56>\7>\89GHJ# Makefile for UnZip(SFX) and fUnZip for Borland C++ for Windows 9x/NT # Version: 6.0 and later # Alvin Koh, Jim Knoble, Christian Spieler, E-Yen Tan, Cosmin Truta, etc. # # Tested with Borland C++ 5.5 (may work with older C++Builder 3.0, too) # # Last revised: 07 Sep 2008 (Christian Spieler) # # # Optional nonstandard preprocessor flags (as -DCHECK_EOF or -DDOS_WILD) # should be added to the environment via "set LOCAL_UNZIP=-DFOO" or added # to the declaration of LOC here: LOC = $(LOCAL_UNZIP) # Type for CPU required: 3: 80386, 4: 80486, 5: Pentium, # 6: Pentium Pro, Pentium II, etc. !ifndef CPU_TYP CPU_TYP = 6 !endif # (De)Select inclusion of optimized assembler CRC32 routine: !ifdef NOASM USE_ASMCRC=0 !else !ifdef USEASM USE_ASMCRC=1 !endif !endif # Specify USEMASM=1 or USETASM=1 in case you have one of these x86 assemblers # to use the assembler instead of the inline ASM C code. #USEMASM=1 #USETASM=1 # For the Turbo Assembler, you may choose between the (old) 16-bit version # and the 32-bit program which is faster provides more resources. #USETASM16=1 !ifndef USE_ASMCRC # default to ASM CRC C code for now (BCC needs TASM32 to support inline asm)... USE_ASMCRC = 0 !endif !ifndef USE_IZTIMEZONE #default: do not use the IZ timezone replacement USE_IZTIMEZONE=0 !endif !if $(USE_IZTIMEZONE) != 0 LOC = -DW32_USE_IZ_TIMEZONE $(LOC) !endif # If you have bcc32i, you should define: # CC = bcc32i # This compiler generates a faster code. CC = bcc32 !ifdef USETASM16 AS = tasm !else AS = tasm32 !endif AR = tlib LD = ilink32 !if $(USE_ASMCRC) != 0 ASMFLG = -DASM_CRC CRC32 = crc_i386 CRC32X = $(CRC32) CRC32F = $(CRC32) CRC32L = $(CRC32) CRC32G = $(CRC32) CRC32B = $(CRC32) !else ASMFLG = CRC32 = crc32 CRC32X = crc32x CRC32F = crc32f CRC32L = crc32l CRC32G = crc32g CRC32B = $(OB)crc32b !endif !if $(USE_IZTIMEZONE) != 0 TIMEZONE_OBJU = timezone.obj TIMEZONE_OBJX = timezonx.obj TIMEZONE_OBJD = timezonl.obj TIMEZONE_OBLX = timezolx.obj TIMEZONE_OBJB = $(OB)timezonb.obj !else TIMEZONE_OBJU = TIMEZONE_OBJX = TIMEZONE_OBJD = TIMEZONE_OBLX = TIMEZONE_OBJB = !endif !if $(UNCLEAN) DIRT = -DUSE_SMITH_CODE -DUSE_UNSHRINK !else DIRT = !endif !if $(DEBUG) CC_SIZE_OPT = -Od CC_SPEED_OPT = -Od !else # Smallest code CC_SIZE_OPT = -O1 -OS # Fastest code CC_SPEED_OPT = -O2 -OS -Oc !endif !if $(WARNINGS) CC_WARN = -w -w-aus -w-par -w-sig -w-use !else CC_WARN = -w- !endif # compiler flags ASCPUFLAG = __$(CPU_TYP)86 !if $(CPU_TYP) != 0 CC_CPUFLG = -$(CPU_TYP) !endif ASFLAGS = -ml -m2 -w0 -D$(ASCPUFLAG) $(LOC) CFLAGS = $(CC_WARN) $(CC_CPUFLG) -d -ff- -k- -P-.C -I. $(ASMFLG) $(LOC) $(DIRT) LDFLAGS = # -lxncd -l-P # for bcc LDFLAGS_DLL = $(LDFLAGS) -tWD LDFLAGS_GUI = $(LDFLAGS) -tW UNFLAGS = $(CFLAGS) $(CC_SPEED_OPT) FUFLAGS = $(CFLAGS) $(CC_SPEED_OPT) -K -DFUNZIP SXFLAGS = $(CFLAGS) $(CC_SIZE_OPT) -DSFX DLFLAGS = $(CFLAGS) $(CC_SPEED_OPT) -tWD -DWINDLL -DDLL SLFLAGS = $(CFLAGS) $(CC_SIZE_OPT) -DWINDLL -DDLL -DUNZIPLIB -DSFX GXFLAGS = $(CFLAGS) $(CC_SIZE_OPT) -tW -DSFX LBFLAGS = $(CFLAGS) $(CC_SPEED_OPT) -DWINDLL -DDLL -DUNZIPLIB # list macros # special subdirectory for the static library binaries, to separate them # from other binaries (including dll import library file) OBDIR = ow32lib OB = $(OBDIR)/ # object files OBJU1 = unzip.obj $(CRC32).obj crypt.obj envargs.obj explode.obj OBJU2 = extract.obj fileio.obj globals.obj inflate.obj list.obj match.obj OBJU3 = process.obj ttyio.obj ubz2err.obj unreduce.obj unshrink.obj zipinfo.obj OBJUS = win32.obj win32i64.obj nt.obj $(TIMEZONE_OBJU) OBJU = $(OBJU1) $(OBJU2) $(OBJU3) $(OBJUS) OBJF = funzip.obj $(CRC32F).obj cryptf.obj globalsf.obj inflatef.obj \ ttyiof.obj win32f.obj win32i64f.obj OBJX1 = unzipsfx.obj $(CRC32X).obj cryptx.obj OBJX2 = extractx.obj fileiox.obj globalsx.obj inflatex.obj matchx.obj OBJX3 = processx.obj ttyiox.obj ubz2errx.obj OBJXS = win32x.obj win32i64x.obj ntx.obj $(TIMEZONE_OBJX) OBJX = $(OBJX1) $(OBJX2) $(OBJX3) $(OBJXS) OBJD1 = api.obj $(CRC32L).obj cryptl.obj explodel.obj OBJD2 = extractl.obj fileiol.obj globalsl.obj inflatel.obj listl.obj matchl.obj OBJD3 = processl.obj ubz2errl.obj unreducl.obj unshrnkl.obj zipinfol.obj OBJDS = win32l.obj win32i64l.obj ntl.obj windll.obj $(ASMOBJS) $(TIMEZONE_OBJD) OBJD = $(OBJD1) $(OBJD2) $(OBJD3) $(OBJDS) OBLX1 = apig.obj $(CRC32G).obj cryptg.obj OBLX2 = extractg.obj fileiog.obj globalsg.obj inflateg.obj OBLX3 = matchg.obj processg.obj ubz2errg.obj OBLXS = win32g.obj win32i64g.obj ntg.obj windllg.obj $(TIMEZONE_OBLX) OBLX = $(OBLX1) $(OBLX2) $(OBLX3) $(OBLXS) OBGX = sfxwiz.obj OBJLIB = $(OB)windllb.obj $(OB)apib.obj OBJB1 = $(CRC32B).obj $(OB)cryptb.obj OBJB2 = $(OB)explodeb.obj $(OB)extractb.obj $(OB)fileiob.obj $(OB)globalsb.obj OBJB3 = $(OB)inflateb.obj $(OB)listb.obj $(OB)matchb.obj $(OB)processb.obj OBJB4 = $(OB)ubz2errb.obj $(OB)unreducb.obj $(OB)unshrnkb.obj $(OB)zipinfob.obj OBJBS = $(OB)win32b.obj $(OB)win32i64b.obj $(OB)ntb.obj $(TIMEZONE_OBJB) OBJB = $(OBJLIB) $(OBJB1) $(OBJB2) $(OBJB3) $(OBJB4) $(OBJBS) UNZIP_H = unzip.h unzpriv.h globals.h win32/w32cfg.h WINDLL_H = windll/windll.h windll/structs.h windll/decs.h WINDLL_DEF = windll/windll32.def WINDLL_IMP_H = windll/decs.h windll/structs.h # implicit rules .asm.obj: $(AS) $(ASFLAGS) $< .c.obj: $(CC) -c $(UNFLAGS) {$< } # explicit rules # Default target is all the command line executables unzips: unzip.exe funzip.exe unzipsfx.exe dll: unzip32.dll dllsample: uzexampl.exe guisfx: SFXWiz32.exe lib: $(OBDIR) $(OB)unzip32.lib all: unzips dll dllsample guisfx lib unzip.exe: $(OBJU) winapp.res $(CC) $(LDFLAGS) -e$@ @&&| $(OBJU) | funzip.exe: $(OBJF) $(CC) $(LDFLAGS) -e$@ @&&| $(OBJF) | unzipsfx.exe: $(OBJX) $(CC) $(LDFLAGS) -e$@ @&&| $(OBJX) | unzip32.dll: $(OBJD) windll.res $(WINDLL_DEF) $(LD) -Gn -x -c -aa -Tpd @&&| c0d32.obj $(OBJD),$@,,import32.lib cw32.lib,$(WINDLL_DEF:/=\),windll.res | # $(CC) $(LDFLAGS_DLL) -e$@ @&&| #$(OBJD) ##, windll.res #| # brc32 windll.res $@ unzsfx32.lib: $(OBLX) $(AR) /C $(@:/=\) @&&| /u $(OBLX:/=\) | SFXWiz32.exe: $(OBGX) sfxwiz.res unzsfx32.lib $(LD) -Gn -x -c -aa -Tpe @&&| c0w32.obj $(OBGX),$@,,unzsfx32.lib import32.lib cw32.lib,,sfxwiz.res | # $(CC) $(LDFLAGS_GUI) -e$@ $(OBGX) unzsfx32.lib $(LDLIBS) # brc32 sfxwiz.res $@ uzexampl.exe: uzexampl.obj $(CC) $(LDFLAGS) -e$@ uzexampl.obj #version.lib $(OB)unzip32.lib: $(OBJB) $(AR) /C $(@:/=\) @&&| /u $(OBJB:/=\) | clean: rem Ignore any errors in the following... -del *.obj -del winapp.res -del unzip.exe -del funzip.exe -del unzipsfx.exe -del windll.res -del unzip32.dll -del uzexampl.exe -del sfxwiz.res -del unzsfx32.lib -del SFXWiz32.exe -del $(OB:/=\)*.obj -del $(OB:/=\)unzip32.lib -del *.tds -del $(OB:/=\)*.tds # individual file dependencies crc32.obj: crc32.c $(UNZIP_H) zip.h crc32.h crypt.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs.obj: envargs.c $(UNZIP_H) explode.obj: explode.c $(UNZIP_H) extract.obj: extract.c $(UNZIP_H) crc32.h crypt.h fileio.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals.obj: globals.c $(UNZIP_H) inflate.obj: l7# UNZIP.BCKd[UNZIP60.WIN32]MAKEFILE.BC;1VAX_DECC_OLB;1 Yinflate.c inflate.h $(UNZIP_H) list.obj: list.c $(UNZIP_H) match.obj: match.c $(UNZIP_H) process.obj: process.c $(UNZIP_H) crc32.h timezone.obj: timezone.c $(UNZIP_H) zip.h timezone.h ttyio.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err.obj: ubz2err.c $(UNZIP_H) unreduce.obj: unreduce.c $(UNZIP_H) unshrink.obj: unshrink.c $(UNZIP_H) unzip.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo.obj: zipinfo.c $(UNZIP_H) !ifdef USEMASM crc_i386.obj: win32/crc_i386.asm masm -ml win32/crc_i386.asm,$@; !else !ifdef USETASM crc_i386.obj: win32/crc_i386.asm $(AS) $(ASFLAGS) win32\crc_i386.asm, $@ ; !else crc_i386.obj: win32/crc_i386.c $(CC) -c $(UNFLAGS) -o$@ win32/crc_i386.c !endif !endif win32.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(UNFLAGS) win32/win32.c win32i64.obj: win32/win32i64.c $(UNZIP_H) $(CC) -c $(UNFLAGS) win32/win32i64.c nt.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(UNFLAGS) win32/nt.c funzip.obj: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h $(CC) -c $(FUFLAGS) -o$@ funzip.c crc32f.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(FUFLAGS) -o$@ crc32.c cryptf.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(FUFLAGS) -o$@ crypt.c globalsf.obj: globals.c $(UNZIP_H) $(CC) -c $(FUFLAGS) -o$@ globals.c inflatef.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(FUFLAGS) -o$@ inflate.c ttyiof.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(FUFLAGS) -o$@ ttyio.c win32f.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(FUFLAGS) -o$@ win32/win32.c win32i64f.obj: win32/win32i64.c $(UNZIP_H) $(CC) -c $(FUFLAGS) -o$@ win32/win32i64.c unzipsfx.obj: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) -c $(SXFLAGS) -o$@ unzip.c crc32x.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(SXFLAGS) -o$@ crc32.c cryptx.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(SXFLAGS) -o$@ crypt.c extractx.obj: extract.c $(UNZIP_H) crc32.h crypt.h $(CC) -c $(SXFLAGS) -o$@ extract.c fileiox.obj: fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(SXFLAGS) -o$@ fileio.c globalsx.obj: globals.c $(UNZIP_H) $(CC) -c $(SXFLAGS) -o$@ globals.c inflatex.obj: inflate.c inflate.h $(UNZIP_H) $(CC) -c $(SXFLAGS) -o$@ inflate.c matchx.obj: match.c $(UNZIP_H) $(CC) -c $(SXFLAGS) -o$@ match.c processx.obj: process.c $(UNZIP_H) crc32.h $(CC) -c $(SXFLAGS) -o$@ process.c timezonx.obj: timezone.c $(UNZIP_H) zip.h timezone.h $(CC) -c $(SXFLAGS) -o$@ timezone.c ttyiox.obj: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(SXFLAGS) -o$@ ttyio.c ubz2errx.obj: ubz2err.c $(UNZIP_H) $(CC) -c $(SXFLAGS) -o$@ ubz2err.c win32x.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(SXFLAGS) -o$@ win32/win32.c win32i64x.obj: win32/win32i64.c $(UNZIP_H) $(CC) -c $(SXFLAGS) -o$@ win32/win32i64.c ntx.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(SXFLAGS) -o$@ win32/nt.c uzexampl.obj: windll/uzexampl.c windll/uzexampl.h $(CC) -c $(UNFLAGS) -I./windll -o$@ windll/uzexampl.c winapp.res: win32/winapp.rc unzvers.h $(RC) /l 0x409 /fo$@ /i win32 /d WIN32 win32/winapp.rc # DLL compilation section api.obj: api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(CC) -c $(DLFLAGS) -o$@ api.c crc32l.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(DLFLAGS) -o$@ crc32.c cryptl.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(DLFLAGS) -o$@ crypt.c explodel.obj: explode.c $(UNZIP_H) $(CC) -c $(DLFLAGS) -o$@ explode.c extractl.obj: extract.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h $(CC) -c $(DLFLAGS) -o$@ extract.c fileiol.obj: fileio.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(DLFLAGS) -o$@ fileio.c globalsl.obj: globals.c $(UNZIP_H) $(CC) -c $(DLFLAGS) -o$@ globals.c inflatel.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(DLFLAGS) -o$@ inflate.c listl.obj: list.c $(UNZIP_H) $(WINDLL_H) $(CC) -c $(DLFLAGS) -o$@ list.c matchl.obj: match.c $(UNZIP_H) $(CC) -c $(DLFLAGS) -o$@ match.c processl.obj: process.c $(UNZIP_H) $(WINDLL_H) crc32.h $(CC) -c $(DLFLAGS) -o$@ process.c timezonl.obj: timezone.c $(UNZIP_H) zip.h timezone.h $(CC) -c $(DLFLAGS) -o$@ timezone.c ubz2errl.obj: ubz2err.c $(UNZIP_H) $(CC) -c $(DLFLAGS) -o$@ ubz2err.c unreducl.obj: unreduce.c $(UNZIP_H) $(CC) -c $(DLFLAGS) -o$@ unreduce.c unshrnkl.obj: unshrink.c $(UNZIP_H) $(CC) -c $(DLFLAGS) -o$@ unshrink.c zipinfol.obj: zipinfo.c $(UNZIP_H) $(CC) -c $(DLFLAGS) -o$@ zipinfo.c win32l.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(DLFLAGS) -o$@ win32/win32.c win32i64l.obj: win32/win32i64.c $(UNZIP_H) $(CC) -c $(DLFLAGS) -o$@ win32/win32i64.c ntl.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(DLFLAGS) -o$@ win32/nt.c windll.obj: windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(CC) -c $(DLFLAGS) -o$@ windll/windll.c windll.res: windll/windll.rc unzvers.h $(RC) /l 0x409 /fo$@ /i windll /d WIN32 windll/windll.rc # SFX Lib compilation section apig.obj: api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(CC) -c $(SLFLAGS) -o$@ api.c crc32g.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(SLFLAGS) -o$@ crc32.c cryptg.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(SLFLAGS) -o$@ crypt.c explodeg.obj: explode.c $(UNZIP_H) $(CC) -c $(SLFLAGS) -o$@ explode.c extractg.obj: extract.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h $(CC) -c $(SLFLAGS) -o$@ extract.c fileiog.obj: fileio.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(SLFLAGS) -o$@ fileio.c globalsg.obj: globals.c $(UNZIP_H) $(CC) -c $(SLFLAGS) -o$@ globals.c inflateg.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(SLFLAGS) -o$@ inflate.c matchg.obj: match.c $(UNZIP_H) $(CC) -c $(SLFLAGS) -o$@ match.c processg.obj: process.c $(UNZIP_H) $(WINDLL_H) crc32.h $(CC) -c $(SLFLAGS) -o$@ process.c timezong.obj: timezone.c $(UNZIP_H) zip.h timezone.h $(CC) -c $(SLFLAGS) -o$@ timezone.c ubz2errg.obj: ubz2err.c $(UNZIP_H) $(CC) -c $(SLFLAGS) -o$@ ubz2err.c win32g.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(SLFLAGS) -o$@ win32/win32.c win32i64g.obj: win32/win32i64.c $(UNZIP_H) $(CC) -c $(SLFLAGS) -o$@ win32/win32i64.c ntg.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(SLFLAGS) -o$@ win32/nt.c windllg.obj: windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(CC) -c $(SLFLAGS) -o$@ windll/windll.c sfxwiz.obj: windll/guisfx/sfxwiz.c windll/guisfx/dialog.h $(WINDLL_IMP_H) $(CC) -c $(GXFLAGS) -o$@ windll/guisfx/sfxwiz.c sfxwiz.res: windll/guisfx/sfxwiz.rc $(RC) /l 0x409 /fo$@ /i windll/guisfx /d WIN32 windll/guisfx/sfxwiz.rc # Static LIB compilation section $(OB)apib.obj: api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(CC) -c $(LBFLAGS) -o$@ api.c $(OB)crc32b.obj: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(LBFLAGS) -o$@ crc32.c $(OB)cryptb.obj: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(LBFLAGS) -o$@ crypt.c $(OB)explodeb.obj: explode.c $(UNZIP_H) $(CC) -c $(LBFLAGS) -o$@ explode.c $(OB)extractb.obj: extract.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h $(CC) -c $(LBFLAGS) -o$@ extract.c $(OB)fileiob.obj: fileio.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(LBFLAGS) -o$@ fileio.c $(OB)globalsb.obj: globals.c $(UNZIP_H) $(CC) -c $(LBFLAGS) -o$@ globals.c $(OB)inflateb.obj: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(LBFLAGS) -o$@ inflate.c $(OB)listb.obj: list.c $(UNZIP_H) $(WIN{ UNZIP.BCKd[UNZIP60.WIN32]MAKEFILE.BC;1VAX_DECC_OLB;1 SUDLL_H) $(CC) -c $(LBFLAGS) -o$@ list.c $(OB)matchb.obj: match.c $(UNZIP_H) $(CC) -c $(LBFLAGS) -o$@ match.c $(OB)processb.obj: process.c $(UNZIP_H) $(WINDLL_H) crc32.h $(CC) -c $(LBFLAGS) -o$@ process.c $(OB)timezonb.obj: timezone.c $(UNZIP_H) zip.h timezone.h $(CC) -c $(LBFLAGS) -o$@ timezone.c $(OB)ubz2errb.obj: ubz2err.c $(UNZIP_H) $(CC) -c $(LBFLAGS) -o$@ ubz2err.c $(OB)unreducb.obj: unreduce.c $(UNZIP_H) $(CC) -c $(LBFLAGS) -o$@ unreduce.c $(OB)unshrnkb.obj: unshrink.c $(UNZIP_H) $(CC) -c $(LBFLAGS) -o$@ unshrink.c $(OB)zipinfob.obj: zipinfo.c $(UNZIP_H) $(CC) -c $(LBFLAGS) -o$@ zipinfo.c $(OB)win32b.obj: win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(LBFLAGS) -o$@ win32/win32.c $(OB)win32i64b.obj: win32/win32i64.c $(UNZIP_H) $(CC) -c $(LBFLAGS) -o$@ win32/win32i64.c $(OB)ntb.obj: win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(LBFLAGS) -o$@ win32/nt.c $(OB)windllb.obj: windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(CC) -c $(LBFLAGS) -o$@ windll/windll.c $(OBDIR): -mkdir $@ *[UNZIP60.WIN32]MAKEFILE.DJ;1+,:. / 4 @-0123KPWO 56ց 7ց 89GHJ# Makefile for UnZip, fUnZip and UnZipSFX # for rsxntdj 1.6beta2 (with djgpp v2.3) under Windows 9x and Windows NT. # By E-Yen Tan. Last updated 25th December 2006. CC = gcc -Zwin32 CFLAGS = -O2 -Wall -I. -DWIN32 -DASM_CRC $(LOCAL_UNZIP) AS = gcc ASFLAGS = -Di386 LDFLAGS = -o ./ LDFLAGS2 = -lalias -L. $(L_ADVAPI32) IMPLIBS = $(ADVAPI32LIB) ADVAPI32 = advapi32 ADVAPI32LIB = lib$(ADVAPI32).a L_ADVAPI32 = -l$(ADVAPI32) OBJU1 = unzip.o crc_gcc.o crc32.o crypt.o envargs.o explode.o extract.o OBJU2 = fileio.o globals.o inflate.o list.o match.o process.o ttyio.o OBJU3 = ubz2err.o unreduce.o unshrink.o zipinfo.o win32.o nt.o OBJU = $(OBJU1) $(OBJU2) $(OBJU3) OBJX1 = unzipsf_.o crc_gcc.o crc32_.o crypt_.o extract_.o fileio_.o globals_.o OBJX2 = inflate_.o match_.o process_.o ttyio_.o ubz2err_.o win32_.o nt_.o OBJX = $(OBJX1) $(OBJX2) OBJF = funzip.o crc_gcc.o crc32f.o cryptf.o inflatef.o globalsf.o ttyiof.o \ win32f.o UNZIP_H = unzip.h unzpriv.h globals.h win32/w32cfg.h # rules .SUFFIXES: .c .o .c.o: $(CC) -c $(CFLAGS) -o$@ $< .asm.o: $(AS) $(ASFLAGS) $< all: unzip.exe funzip.exe unzipsfx.exe unzip.exe: $(OBJU) $(IMPLIBS) $(CC) $(LDFLAGS)$@ $(OBJU) $(LDFLAGS2) funzip.exe: $(OBJF) $(IMPLIBS) $(CC) $(LDFLAGS)$@ $(OBJF) $(LDFLAGS2) unzipsfx.exe: $(OBJX) $(IMPLIBS) $(CC) $(LDFLAGS)$@ $(OBJX) $(LDFLAGS2) uzexampl.exe: uzexampl$(OBJ) $(CC) $(LDFLAGS)$@ uzexampl$(OBJ) -lversion $(LDFLAGS2) $(ADVAPI32LIB): makelib "$(windir)/system/advapi32.dll" -o ./$@ crc32.o: crc32.c $(UNZIP_H) crc32.h envargs.o: envargs.c $(UNZIP_H) explode.o: explode.c $(UNZIP_H) extract.o: extract.c $(UNZIP_H) crypt.h fileio.o: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h globals.o: globals.c $(UNZIP_H) inflate.o: inflate.c $(UNZIP_H) list.o: list.c $(UNZIP_H) match.o: match.c $(UNZIP_H) process.o: process.c $(UNZIP_H) ttyio.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err.o: ubz2err.c $(UNZIP_H) unreduce.o: unreduce.c $(UNZIP_H) unshrink.o: unshrink.c $(UNZIP_H) unzip.o: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo.o: zipinfo.c $(UNZIP_H) funzip.o: funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h $(CC) -c $(CFLAGS) -o$@ funzip.c uzexampl$(OBJ): windll/uzexampl.c windll/uzexampl.h $(CC) -c $(CFLAGS) -o$@ windll/uzexampl.c win32.o: win32/win32.c $(UNZIP_H) win32/nt.h unzvers.h $(CC) -c $(CFLAGS) -o$@ win32/win32.c win32f.o: win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS) -DFUNZIP -o$@ win32/win32.c win32_.o: win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS) -DSFX -o$@ win32/win32.c nt.o: win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS) -o$@ win32/nt.c nt_.o: win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS) -DSFX -o$@ win32/nt.c crc_gcc.o: crc_i386.S $(AS) $(ASFLAGS) -x assembler-with-cpp -c -o $@ crc_i386.S crypt.o: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) -o$@ crypt.c cryptf.o: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) -DFUNZIP -o$@ crypt.c crc32f.o: crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS) -DFUNZIP -o$@ crc32.c globalsf.o: globals.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DFUNZIP -o$@ globals.c inflatef.o: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS) -DFUNZIP -o$@ inflate.c ttyiof.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGS) -DFUNZIP -o$@ ttyio.c crc32_.o: crc32.c $(UNZIP_H) crc32.h $(CC) -c $(CFLAGS) -DSFX -o$@ crc32.c crypt_.o: crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) -DSFX -o$@ crypt.c extract_.o: extract.c $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS) -DSFX -o$@ extract.c fileio_.o: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h $(CC) -c $(CFLAGS) -DSFX -o$@ fileio.c globals_.o: globals.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX -o$@ globals.c inflate_.o: inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS) -DSFX -o$@ inflate.c match_.o: match.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX -o$@ match.c process_.o: process.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX -o$@ process.c ttyio_.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGS) -DSFX -o$@ ttyio.c ubz2err_.o: ubz2err.c $(UNZIP_H) $(CC) -c $(CFLAGS) -DSFX -o$@ ubz2err.c unzipsf_.o: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) -c $(CFLAGS) -DSFX -o$@ unzip.c *[UNZIP60.WIN32]MAKEFILE.EMX;1+,P./ 4@-0123KPWO56ƾ 7ƾ 89GHJ# Makefile for UnZip, fUnZip and UnZipSFX # for emx 0.9d + rsxnt 1.42 / gcc under WIN32. Derived from makefile.os2 # By E-Yen Tan and Christian Spieler. Last updated 25 December 2006. # # This makefile should work fine with GNU make and hopefully some others. # Tested with Spieler's special GNU make 3.74 gnuish 16-bit version. # # If make does not support long command-line passing to gcc, the link step # will fail. In this case, you have to edit the link commands to use the # commented-out alternative that creates a link response file "by hand". #ifdef NOASM #AS_FLAGS = #else AS_FLAGS = -DASM_CRC #endif CP=copy RM=del CC=gcc -Zwin32 -I. CC_OSIZ=-O1 CC_OTIM=-O2 -mpentium CC_OPTS=-Wall -DWIN32 $(AS_FLAGS) $(LOCAL_UNZIP) CFLAGS=$(CC_OTIM) $(CC_OPTS) CFLAGSX=$(CC_OSIZ) $(CC_OPTS) -DSFX CFLAGSF=$(CC_OTIM) $(CC_OPTS) -DFUNZIP DLLFLAG= AS=gcc ASFLAGS=-Di386 LDFLAGS=-Zsys -o ./ LDFLAGS2=-ladvapi32 -Zsmall-conv -s OUT=-o OBJ=.o #ifdef NOASM #CRCA_O= #else CRCA_O=crc_gcc #endif OBJUS=win32$(OBJ) nt$(OBJ) OBJXS=win3]削 UNZIP.BCKP[UNZIP60.WIN32]MAKEFILE.EMX;1AX_DECC_OLB;1<`2_$(OBJ) nt_$(OBJ) OBJFS=win32f$(OBJ) OSDEP_H=win32/w32cfg.h # default settings for target dependent macros: DIRSEP = / AS_DIRSEP = / OBJU1 = unzip$(OBJ) crc32$(OBJ) $(CRCA_O) crypt$(OBJ) envargs$(OBJ) OBJU2 = explode$(OBJ) extract$(OBJ) fileio$(OBJ) globals$(OBJ) OBJU3 = inflate$(OBJ) list$(OBJ) match$(OBJ) process$(OBJ) ttyio$(OBJ) OBJU4 = ubz2err$(OBJ) unreduce$(OBJ) unshrink$(OBJ) zipinfo$(OBJ) OBJU = $(OBJU1) $(OBJU2) $(OBJU3) $(OBJU4) $(OBJUS) OBJX1 = unzipsf_$(OBJ) crc32_$(OBJ) $(CRCA_O) crypt_$(OBJ) OBJX2 = extract_$(OBJ) fileio_$(OBJ) globals_$(OBJ) inflate_$(OBJ) OBJX3 = match_$(OBJ) process_$(OBJ) ttyio_$(OBJ) ubz2err_$(OBJ) OBJX = $(OBJX1) $(OBJX2) $(OBJX3) $(OBJXS) OBJF = funzip$(OBJ) crc32f$(OBJ) $(CRCA_O) cryptf$(OBJ) inflatef$(OBJ) \ globalsf$(OBJ) ttyiof$(OBJ) $(OBJFS) UNZIP_H = unzip.h unzpriv.h globals.h $(OSDEP_H) # rules .SUFFIXES: .c $(OBJ) .c$(OBJ): $(CC) -c $(CFLAGS) $(DLLFLAG) $(OUT)$@ $< # targets all: unzip.exe funzip.exe unzipsfx.exe # This next bit is nasty, but is needed to overcome the MS-DOS command # line limit as response files for emx's gcc seem to only work if each # file is on a different line. DJGPP doesn't do this (if you are at all # interested). unzip.exe: $(OBJU) # @ echo off # -@ $(RM) unzip.rsp # @ for %f in ($(OBJU1)) do echo %f >> unzip.rsp # @ for %f in ($(OBJU2)) do echo %f >> unzip.rsp # @ for %f in ($(OBJU3)) do echo %f >> unzip.rsp # @ for %f in ($(OBJU4) $(OBJUS)) do echo %f >> unzip.rsp # $(CC) $(LDFLAGS)$@ $(DEF) @unzip.rsp $(LDFLAGS2) $(CC) $(LDFLAGS)$@ $(DEF) $(OBJU) $(LDFLAGS2) # @ $(RM) unzip.rsp funzip.exe: $(OBJF) $(CC) $(LDFLAGS)$@ $(DEF) $(OBJF) $(LDFLAGS2) unzipsfx.exe: $(OBJX) # @ echo off # -@ $(RM) unzipsfx.rsp # @ for %f in ($(OBJX1)) do echo %f >> unzipsfx.rsp # @ for %f in ($(OBJX2)) do echo %f >> unzipsfx.rsp # @ for %f in ($(OBJX3)) do echo %f >> unzipsfx.rsp # @ for %f in ($(OBJXS)) do echo %f >> unzipsfx.rsp # $(CC) $(LDFLAGS)$@ $(DEF) @unzipsfx.rsp $(LDFLAGS2) $(CC) $(LDFLAGS)$@ $(DEF) $(OBJX) $(LDFLAGS2) # @ $(RM) unzipsfx.rsp uzexampl.exe: uzexampl$(OBJ) $(CC) $(LDFLAGS)$@ $(DEF) uzexampl$(OBJ) -lversion $(LDFLAGS2) # dependencies apihelp$(OBJ): apihelp.c $(UNZIP_H) unzvers.h crc32$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h envargs$(OBJ): envargs.c $(UNZIP_H) explode$(OBJ): explode.c $(UNZIP_H) extract$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h fileio$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals$(OBJ): globals.c $(UNZIP_H) inflate$(OBJ): inflate.c $(UNZIP_H) list$(OBJ): list.c $(UNZIP_H) match$(OBJ): match.c $(UNZIP_H) process$(OBJ): process.c $(UNZIP_H) crc32.h ttyio$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$(OBJ): ubz2err.c $(UNZIP_H) unreduce$(OBJ): unreduce.c $(UNZIP_H) unshrink$(OBJ): unshrink.c $(UNZIP_H) unzip$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h api$(OBJ): api.c $(UNZIP_H) unzvers.h zipinfo$(OBJ): zipinfo.c $(UNZIP_H) funzip$(OBJ): funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h # funzip only $(CC) -c $(CFLAGS) $(OUT)$@ funzip.c unzipstb$(OBJ): unzipstb.c # DLL version $(CC) -c $(CFLAGS) $(OUT)$@ unzipstb.c uzexampl$(OBJ): windll/uzexampl.c windll/uzexampl.h # WINDLL example $(CC) -c $(CFLAGS) $(OUT)$@ windll/uzexampl.c win32$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h unzvers.h # win32 only $(CC) -c $(CFLAGS) $(OUT)$@ win32$(DIRSEP)win32.c win32f$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h # win32 funzip $(CC) -c $(CFLAGSF) $(OUT)$@ win32$(DIRSEP)win32.c win32_$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h # win32 unzipsfx $(CC) -c $(CFLAGSX) $(OUT)$@ win32$(DIRSEP)win32.c nt$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h # win32 only $(CC) -c $(CFLAGS) $(OUT)$@ win32$(DIRSEP)nt.c nt_$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h # win32 only $(CC) -c $(CFLAGSX) $(OUT)$@ win32$(DIRSEP)nt.c os2$(OBJ): os2/os2.c $(UNZIP_H) unzvers.h # OS/2 only $(CC) -c $(CFLAGS) $(DLLFLAG) $(OUT)$@ os2$(DIRSEP)os2.c os2_$(OBJ): os2/os2.c $(UNZIP_H) # OS/2 unzipsfx $(CC) -c $(CFLAGSX) $(OUT)$@ os2$(DIRSEP)os2.c os2acl$(OBJ): os2/os2acl.c $(UNZIP_H) unzvers.h # OS/2 only $(CC) -c $(CFLAGS) $(DLLFLAG) $(OUT)$@ os2$(DIRSEP)os2acl.c rexxhelp$(OBJ): os2/rexxhelp.c # OS/2 DLL only $(CC) -c $(CFLAGS) $(DLLFLAG) $(OUT)$@ os2$(DIRSEP)rexxhelp.c rexxapi$(OBJ): os2/rexxapi.c # OS/2 DLL only $(CC) -c $(CFLAGS) $(DLLFLAG) $(OUT)$@ os2$(DIRSEP)rexxapi.c crc_i86$(OBJ): msdos/crc_i86.asm # 16bit only $(AS) $(ASFLAGS) msdos$(AS_DIRSEP)crc_i86.asm $(ASEOL) crc_i386$(OBJ): win32/crc_i386.asm # 32bit, MASM $(AS) $(ASFLAGS) win32$(AS_DIRSEP)crc_i386.asm $(ASEOL) crc_gcc$(OBJ): crc_i386.S # 32bit, GNU AS $(AS) $(ASFLAGS) -x assembler-with-cpp -c -o $@ crc_i386.S crypt$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS) $(DLLFLAG) $(OUT)$@ crypt.c # funzip compilation section cryptf$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGSF) $(OUT)$@ crypt.c crc32f$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGSF) $(OUT)$@ crc32.c globalsf$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGSF) $(OUT)$@ globals.c inflatef$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGSF) $(OUT)$@ inflate.c ttyiof$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGSF) $(OUT)$@ ttyio.c # unzipsfx compilation section crc32_$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGSX) $(OUT)$@ crc32.c crypt_$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGSX) $(OUT)$@ crypt.c extract_$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h $(CC) -c $(CFLAGSX) $(OUT)$@ extract.c fileio_$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(CFLAGSX) $(OUT)$@ fileio.c globals_$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGSX) $(OUT)$@ globals.c inflate_$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGSX) $(OUT)$@ inflate.c match_$(OBJ): match.c $(UNZIP_H) $(CC) -c $(CFLAGSX) $(OUT)$@ match.c process_$(OBJ): process.c $(UNZIP_H) crc32.h $(CC) -c $(CFLAGSX) $(OUT)$@ process.c ttyio_$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGSX) $(OUT)$@ ttyio.c ubz2err_$(OBJ): ubz2err.c $(UNZIP_H) $(CC) -c $(CFLAGSX) $(OUT)$@ ubz2err.c unzipsf_$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) -c $(CFLAGSX) $(OUT)$@ unzip.c *[UNZIP60.WIN32]MAKEFILE.GCC;1+,."/ 4""@-0123KPWO#56iݧ7iݧ89GHJ# Makefile for UnZip, fUnZip and UnZipSFX for native Win32-Intel ports of gcc. # Currently supported implementations: Cygnus/Win32 and MinGW32. # # First version: Cosmin Truta, Dec 1997. # Last revision: Christian Spieler, 09-Aug-2008. # # To use, do "make -f win32/makefile.gcc". # configuration switches supported: # NOASM=1 disable assembler crc32 code, the generic C source code # is used instead. # NOCRC_OPT=1 disable "unfolding CRC tables" optimization. # OPT_P6=1 add "modern ]4c xnk d~LB;1/{:NhD3"ls]/ CqC6W'6)InT._oBv)7/7%*0!VK"I*6>09B~T<^3|(o*5C( r $~_! 6tTr m1i*&RR TW^]?^ ] L7'S[&*D^[mb?$X6")&:W;..y8gXI^G a7vRsjou.9-fИ`:V%y9*K|f{<6 &( R\uCoL`s&-3Pwcl*NdKv'op4cE @bJzH#$0JW~BohfB<"O4a;L9.pwEf02*m(_uzpj8 /8Q:b|(U1LSlL{wWdZ * ?&)@yLpz S;pk5{|lyj`|}<=RzZ=(zj9SW`;<3T_]4y$TB7(}JC)]}IM+;c=M~* 64\-NT'-:aK+M+Y q$(ny wS@X+`66i;D[)''5 NAIHA \]9UM T4hJK8+; Rc@I2M>s:?:G/o)!&+wrSCX;nH;~U{lhdD4JQ W\e,O>Eb?ZHiXydTI'm s N)}hSvnoI 2;A0B >b|scRjrY:P/y~tX{zREcuje7p7_K...M "~LV,"bG@/g8M$EL4:[D.@EL&N FSGi"kb^*y3#v~8w9q P,4sJ-&+/3x,O? )4]-1y6uFR4r--i@NE!sTW jrNIx^nws0fP$qsU3Bocw3>[ %qT_J*vMx=|X|TZ@G,4s]. wIZoq"sls{K9Jf+hk_rt&{(aUQVg+#laW0&9>dYW T CKI^$WYW~v']?XA(n%?sMA O>q(j I9Tq1O|:E0o&VD<5CGBQS&TP#J|`IO~[`VIxLVok3tq-!tb2<5 Yfsg:rCfqwCwYG}bt][7Xq)cFyG,YbM[rN= UC c u~Xvk8c{|("~/]OQ-s3Z?|)Y3%66cx'mw,9[$2MLGk t/'fn]+oCc$e'>( Xu0l#^!24gzmt_"}r5DmE5EBr _V mi\wNXlv'J6{Vq(fh\LJ%Ks&i bNp(Fk!C$w<#o]_]VXO4߹S:;,L`?rP` 0t CJJ)R Xh1?dI@zӨ0i:tn[ThD8_M3||0}5NaR7Y,%Qi42"YrH `I \'oU=-;tL~2 QS2)& BV",tVQ0:bx\z[(6"T[GNkg sAW"%6 P h|$~kH\.4 @ ta0[S(CWi],O:b DcGX0/]Z[h!Tu}ls9MxoBD2[Z%zO2w8vkK`J4Tk ]Sl@]o}F,?0\'=wMgGm\ $_M9(VP$SjZ6\ .T12ln+@)'u '2tgq-I5RQ=9HwEEYtU=E= m3_ssq.l2 ?!9pHfmYtWz1Xsf5]uu"<36V\]{|w,8 HgC75 >Vg)N#!K7;ZL=8G1}@jvJ?PgH*$Q\[&y%Vz]tEVol+5 8pJ+jY*> -pfH#- p|-<7 N^ <8_5H|;V8=o S&as2X$08|=~o TE{`%,;u`PA(IaZ \!LC r P@hW1}TNL)Jx6%,I85u6 ([&s+8 R&7IX m|5bc{tnr=1f:Uw}*GR@&v-FjQ WKL PpO 62wtrU7NUMpa&WP,rV-$CM?s8/.RX+J5$M0v5i10Fb8fp p!p9 q0POHF9LB0}n-p wO@,5N, `udfi.*wb$\ w^I te.{ q7{2$6HNfbH(3<X~S+FDRT3{O18j[ /WgMwn!vP es/9@T1IKID^UG9[i_X5t |j{#gKvj1oYiP$<,'wtgpoiD QZ 7KW:\-}K# &P79Kix80<r'YGm|SBwMP_k%(3K11*F#J}Eo.h&'[~JKOc;x;AT)N 7js5){u ymk#pS'>Wr2pEA)oG {`T7xSQ00E;LRXC~`~+{P~p28\&'K/51$f0j$.1e H=aB pPWnNc`{ma/Gk;)yc F+9%:Uec]&B)kY"(0.?[ VbSx&1V*sR :S=,(ZPuGKG_7Z!R@+V)F?[T]{k2^g -]sA^$V.y2x=wA 8v_et` 2RBo d#:`BL12Dw zp9&C4PizK JTrPY'bL$=1kY>H H#nu1$]OAO5>/TiL#jpF@<.E'KBI~c!WV:jdXnwexI0!: oBe=d-^ig7v^J|nJ=SK,(BA>hS[1M-RGn<6[_U_UCng5-nfB\_z.}2m;n6-5P@yM_*`(.p>*E}slKy:Zb{M{7lx`)$#2=Es&:"^$)oK|s`a`}:yx90^ pCB=>+= :}jL4% 3f+Mj,_p{6<7n&#JR uqO j\q,p&8m0M&OE,n#ab$&""EB -|' _F WF=6WiY(Q%s/'&W7Td{>x3L4_Gb" ``[bs9#KOfh!#$upL|CDow:GW[*TL C^kh"f1?=h`\Z.lPw7}=RwkJ&bWZ[QSh:%T )wtv(;-~t NG|-buQ"R-ZRse@P :H0:5:){b3?#1]fPm-A Jmxo? rkLmzD%kf$AA tw<OATT0gzbWkz|6| hi:VbFnBA_R*6t&wLb/] ad5?h "@ 7@Pb7_9/0E>FRp8?K57kq}w+7]~7KmFQr`k?j3uU &QY Y/`Z#L|HY<}O3lWMKBxxihQh0v9]m*;itAS2}M?3A9xM%XnoUdoOxl)?sE h6z D6 U7[B7JJ*)Z W?I||hI}7C,b+>u/RhG5J!s|RNeP!I& R [\6o( ,|_8b$Q.D;ayVwG%k\QSy^3.h3{yqS|uH4waS1 'P8t-O B?&7iXt"]X[w.Yw\*m_ 08wh#K7r /^TP)*F^HjqTMNCVF(BqDB{S'r2+6Wv$oLu.GzU5$,EFXNFf;Wf]T>*My&!BDWZV@G0s5s}2QBo=/`G8u1=(3-2Bg#!rp7ZO7 "~|?WP!a%NLi B;S& JQwR$gX, o,KGDAPJR+ (%f\T3,'l0NLA8kM?;T<)'iF:6C T"6{57)^r,Z3 `D )k%vHW$Q.AV?yzB@0>| $eXD`EY  sQD5$4V&c#L6E@!Moj)zmrtr:qHacURo<1y<4I1 h?u@nsM6Mai@7]UJWV/dR`O%Kx FDLMK4|l k%8-Hk8gp1:g_+D6-v[Q im0uK[2f7CacjS-7=&N(E})U-44{.5a4#$s~ ~Sl [~Md ,Pb?4M"e-jS#g N-"/"NS WKJ>)-RzuO-lG:=%/y3tZ~{V?R-IhN]%WlD:1\>w?`zFGFO%A q20^'q[v#i#)pW vvp gx\"XI=;\sK$j"5W''  DB>>-/a=Cyr#i$k{5P# o67Ur[tP"3;i**=giX-y2Q4|P2AOOLA>-Tmh&8aZYIH lV?fCT~%gXW_KQE 'WHeIJ HpauDPU*pK7gFDkz`h-!6nS,C tcA* 3Fx.R/8f) e,k.1Y< ,UKnN+n+IP&%r \Ep?sB$*'c,BUx[^np~7uuq9IIY ^%Q-x. c8Pd`]z5my2)I.ayID6=8chJ ` NQ0LW~STdR;Pb{<t_r@N=S>rv@$U E\ c x"ljN@Avy(^W!a+H7gQ-u?}pwTN|_rU7DNXWAL|qo !LzB\zq6GQElPL36+sta;knOvYf!X\W9;WN" X}V \k7E Ayv#7Ff9 Hs"k YoiJ!Gc@1%L(?i_5 XcCUHA=pL1@z}qi% S36">KNAEYc@bg-7=vTPM4&akxGeC j3pRG{}|5LN7eX TP 6O5I/AH/GX%?<`_'Tt+!!PI{e0~GRI:@"UV+;c/<7mS/n!  KQ -@j{}BW\fP-:NJ"]iG Q+zqA<9$u]@5w^Y1f>L Feq]-@_FPocCNYh7}Nf3lS:CD+#u!-g#b;-#n)7tMyPr&[Hm^|8?#G[^dxH( K@ a|gctKrA5{` V*|."b!su{Sa!N1i7zN9;Pxa^b|mjVc`rVNzsA.bt cMEQ_v*o$~JIQvmRd# UCm]b}HS\^b\>1Eb,'^\r\ZOdW!0ll; H(*2G?7qjr$?qnOz@Z1:ZoE|AE%$>?L4!TE^Kb o^lMR$ .Wu16kGXDrR>]m?6Gy1{^$\5CQ=~ vbEIF\G\&-$  BI:.>lbjxr6:#WTi UNZIP.BCK[UNZIP60.WIN32]MAKEFILE.GCC;1AX_DECC_OLB;1"gcc" tuning option for PentiumPro family CPU. # USEBZ2=1 activate integrated compilation of bzip2 compression support, # this requires the bzip2 sources present in the bzip2 subfolder. # USEZLIB=1 replace internal deflate code by externally provided zlib. # USE_POSIX=1 build posix-style binaries targeted for the CygWin unix # emulation environment. ### Optional section # The following options allow to override the default assembler code usage ifdef NOASM APPLY_ASMCRC=0 endif ifdef USEASM APPLY_ASMCRC=1 endif # The external zlib library supplies its own crc32 implementation... ifdef USEZLIB APPLY_ASMCRC=0 endif # default is ASM CRC code (from .S source) for now... ifndef APPLY_ASMCRC APPLY_ASMCRC=1 endif # optional inclusion of bzip2 decompression IZ_BZIP2 = bzip2 ifdef USEBZ2 INC_BZ2LIB = -I$(IZ_BZIP2) LOCFLAGS = $(INC_BZ2LIB) -DUSE_BZIP2 LD_BZ2LIB = -L$(IZ_BZIP2) -lbz2 LIBBZIP2 = $(IZ_BZIP2)/libbz2.a else INC_BZ2LIB = LOCFLAGS = LD_BZ2LIB = LIBBZIP2 = endif LIBBZIP2X = $(LIBBZIP2) ifndef USEZLIB # Apply the "CRC unfolding tables" optimization unless explicitly disabled. # (This optimization might have negative effects on old CPU designs with a # small first-level data cache.) ifndef NOCRC_OPT LOCFLAGS += -DIZ_CRCOPTIM_UNFOLDTBL endif # Optional nonstandard preprocessor flags (as -DUSE_ZLIB or -DUSE_SMITH_CODE) # should be added to the environment via "set LOCAL_UNZIP=-DFOO" or added # to the declaration of LOCFLAGS here: ifneq ($(APPLY_ASMCRC),0) LOCFLAGS += -DASM_CRC endif else # ifndef USEZLIB LOCFLAGS += -DUSE_ZLIB endif # ifndef USEZLIB ... else ... # Finally, append additional externally supplied options. LOCFLAGS += $(LOCAL_UNZIP) # Some gcc distributions for Win32 (e.g. CygWin) try to emulate a POSIX- # compatible (Unix-style) environment. This Makefile defaults to a # "native Win32" build. To build POSIX-mode binaries, it is recommended # to use the Makefile of the Unix port. However, by defining the variable # "USE_POSIX", building binaries for the POSIX environment can be enabled # here as well. ifdef USE_POSIX CC_ENVIR_OPT = -DUNIX -DFORCE_UNIX_OVER_WIN32 else CC_ENVIR_OPT = -DWIN32 -DFORCE_WIN32_OVER_UNIX endif ### Compiler-specific section # ------------ GNU C ------------ CC = gcc #AS = as AS = $(CC) #LD = ld LD = $(CC) AR = ar RC = windres # Quiet CC_QUIET_OPT = AS_QUIET_OPT = $(CC_QUIET_OPT) LD_QUIET_OPT = $(CC_QUIET_OPT) # Warnings CC_WARN_OPT = -Wall AS_WARN_OPT = $(CC_WARN_OPT) LD_WARN_OPT = # Debug version CC_DEBUG_OPT = -g AS_DEBUG_OPT = $(CC_DEBUG_OPT) LD_DEBUG_OPT = $(CC_DEBUG_OPT) # Release version CC_RELEASE_OPT = AS_RELEASE_OPT = LD_RELEASE_OPT = -s # Prefered target CPU (instruction scheduling optimized for...) ifndef CC_CPU_OPT CC_CPU_OPT = -mcpu=pentiumpro endif # Smallest code (-Os is new since EGC 1.1, use -O1 for 2.8.1 and earlier) CC_SIZE_OPT = -Os $(CC_CPU_OPT) # Fastest code CC_SPEED_OPT = -O2 $(CC_CPU_OPT) # Output object file name CC_OUT_OPT = -o # Other specific options CC_SPECIFIC_OPT = -c $(CC_ENVIR_OPT) AS_SPECIFIC_OPT = -c LD_SPECIFIC_OPT = -o $@ # Libraries for the debug & release version # (GCC 2.95 and newer does not require the system library specifications) ifdef USEZLIB LD_RELEASE_LIBS = -L. -lz -luser32 -ladvapi32 else LD_RELEASE_LIBS = -luser32 -ladvapi32 endif LD_DEBUG_LIBS = $(LD_RELEASE_LIBS) ### System-specific section # Suffixes OBJ = .o EXE = .exe .SUFFIXES: .c .S $(OBJ) $(EXE) .PHONY: FORCE # Commands RM = rm -f ### General section CFLAGS = $(CC_SPECIFIC_OPT) $(CC_QUIET_OPT) $(CC_WARN_OPT) $(LOCFLAGS) \ $(CC_OUT_OPT) $@ ASFLAGS = $(AS_SPECIFIC_OPT) $(AS_QUIET_OPT) $(AS_WARN_OPT) $(LOCFLAGS) LDFLAGS = $(LD_SPECIFIC_OPT) $(LD_QUIET_OPT) $(LD_WARN_OPT) # To build with debug info, use 'make DEBUG=1'. ifdef DEBUG CVER = $(CC_DEBUG_OPT) ASVER = $(AS_DEBUG_OPT) LDVER = $(LD_DEBUG_OPT) GENFLAGS = FFLAGS = -DFUNZIP SFXFLAGS = -DSFX GENDLLFL = -DDLL -DWINDLL GENGUILB = -DSFX -DDLL -DWINDLL -DUNZIPLIB GENGUISX = -DSFX GENLIBFL = -DDLL -DWINDLL -DUNZIPLIB LDLIBS = $(LD_DEBUG_LIBS) else CVER = $(CC_RELEASE_OPT) ASVER = $(AS_RELEASE_OPT) LDVER = $(LD_RELEASE_OPT) GENFLAGS = $(CC_SPEED_OPT) FFLAGS = $(CC_SPEED_OPT) -DFUNZIP SFXFLAGS = $(CC_SIZE_OPT) -DSFX GENDLLFL = $(CC_SPEED_OPT) -DDLL -DWINDLL GENGUILB = $(CC_SIZE_OPT) -DSFX -DDLL -DWINDLL -DUNZIPLIB GENGUISX = $(CC_SIZE_OPT) -DSFX GENLIBFL = $(CC_SPEED_OPT) -DDLL -DWINDLL -DUNZIPLIB LDLIBS = $(LD_RELEASE_LIBS) endif GUILDFLAG=-mwindows # Object files ifneq ($(APPLY_ASMCRC),0) OBJA = crc_i386$(OBJ) else OBJA = endif OBJU1 = unzip$(OBJ) crc32$(OBJ) crypt$(OBJ) envargs$(OBJ) OBJU2 = explode$(OBJ) extract$(OBJ) fileio$(OBJ) globals$(OBJ) inflate$(OBJ) OBJU3 = list$(OBJ) match$(OBJ) process$(OBJ) ttyio$(OBJ) ubz2err$(OBJ) OBJU4 = unreduce$(OBJ) unshrink$(OBJ) zipinfo$(OBJ) OBJUS = win32$(OBJ) win32i64$(OBJ) nt$(OBJ) winapprc$(OBJ) OBJU = $(OBJU1) $(OBJU2) $(OBJU3) $(OBJU4) $(OBJA) $(OBJUS) OBJX1 = unzipsfx$(OBJ) crc32x$(OBJ) cryptx$(OBJ) extractx$(OBJ) OBJX2 = fileiox$(OBJ) globalsx$(OBJ) inflatex$(OBJ) matchx$(OBJ) processx$(OBJ) OBJX3 = ttyiox$(OBJ) ubz2errx$(OBJ) OBJXS = win32x$(OBJ) win32i64x$(OBJ) ntx$(OBJ) OBJX = $(OBJX1) $(OBJX2) $(OBJX3) $(OBJA) $(OBJXS) OBJF1 = funzip$(OBJ) crc32$(OBJ) cryptf$(OBJ) globalsf$(OBJ) inflatef$(OBJ) OBJF2 = ttyiof$(OBJ) OBJFS = win32f$(OBJ) win32i64f$(OBJ) OBJF = $(OBJF1) $(OBJF2) $(OBJA) $(OBJFS) OBJDLL = windll$(OBJ) windllrc$(OBJ) api$(OBJ) OBJD1 = crc32l$(OBJ) cryptl$(OBJ) OBJD2 = explodel$(OBJ) extractl$(OBJ) fileiol$(OBJ) globalsl$(OBJ) OBJD3 = inflatel$(OBJ) listl$(OBJ) matchl$(OBJ) processl$(OBJ) ubz2errl$(OBJ) OBJD4 = unreducl$(OBJ) unshrnkl$(OBJ) zipinfol$(OBJ) OBJDS = win32l$(OBJ) win32i64l$(OBJ) ntl$(OBJ) OBJD = $(OBJDLL) $(OBJD1) $(OBJD2) $(OBJD3) $(OBJD4) $(OBJA) $(OBJDS) OBLX1 = apig$(OBJ) crc32g$(OBJ) cryptg$(OBJ) OBLX2 = extractg$(OBJ) fileiog$(OBJ) globalsg$(OBJ) inflateg$(OBJ) OBLX3 = matchg$(OBJ) processg$(OBJ) ubz2errg$(OBJ) OBLXS = win32g$(OBJ) win32i64g$(OBJ) ntg$(OBJ) windllg$(OBJ) OBLX = $(OBLX1) $(OBLX2) $(OBLX3) $(OBJA) $(OBLXS) OBGX = sfxwiz$(OBJ) sfxwizrc$(OBJ) OBJLIB = windllb$(OBJ) apib$(OBJ) OBJB1 = crc32b$(OBJ) cryptb$(OBJ) OBJB2 = explodeb$(OBJ) extractb$(OBJ) fileiob$(OBJ) globalsb$(OBJ) OBJB3 = inflateb$(OBJ) listb$(OBJ) matchb$(OBJ) processb$(OBJ) ubz2errb$(OBJ) OBJB4 = unreducb$(OBJ) unshrnkb$(OBJ) zipinfob$(OBJ) OBJBS = win32b$(OBJ) win32i64b$(OBJ) ntb$(OBJ) OBJB = $(OBJLIB) $(OBJB1) $(OBJB2) $(OBJB3) $(OBJB4) $(OBJA) $(OBJBS) UNZIP_H = unzip.h unzpriv.h globals.h win32/w32cfg.h WINDLL_H = windll/windll.h windll/structs.h windll/decs.h DLLDEF = windll/windllgcc.def WINDLL_IMP_H = windll/decs.h windll/structs.h # Default target is all the executables unzips: unzip$(EXE) funzip$(EXE) unzipsfx$(EXE) dll: unzip32.dll dllsample: uzexampl$(EXE) guisfx: SFXWiz32$(EXE) lib: libunzip32.a all: unzips dll dllsample guisfx lib unzip$(EXE): $(OBJU) $(LIBBZIP2) $(LD) $(LDFLAGS) $(LDVER) $(OBJU) $(LD_BZ2LIB) $(LDLIBS) unzipsfx$(EXE): $(OBJX) $(LIBBZIP2X) $(LD) $(LDFLAGS) $(LDVER) $(OBJX) $(LDLIBS) funzip$(EXE): $(OBJF) $(LD) $(LDFLAGS) $(LDVER) $(OBJF) $(LDLIBS) unzip32.dll: $(DLLDEF) $(OBJD) $(LIBBZIP2) dllwrap --driver-name $(CC) --def $(DLLDEF) $(LDFLAGS) $(LDVER) $(OBJD) $(LD_BZ2LIB) $(LDLIBS) libunzsfx32.a: $(OBLX) $(AR) -rus $@ $(OBLX) SFXWiz32$(EXE): $(OBGX) libunzsfx32.a $(LIBBZIP2X) $(LD) $(GUILDFLAG) $(LDFLAGS) $(LDVER) $(OBGX) -L. -lunzsfx32 $(LDLIBS) uzexampl$(EXE): uzexampl$(OBJ) $(CC) $(LDFLAGS) $(LDVER) uzexampl$(OBJ) -lversion $(LDLIBS) libunzip32.a: $(OBJB) $(AR) -rus $@ $(OBJB) # create/update the library for UJ UNZIP.BCK[UNZIP60.WIN32]MAKEFILE.GCC;1AX_DECC_OLB;1"the optional bzip2 support: $(IZ_BZIP2)/libbz2.a: FORCE $(subst /,\,$(MAKE)) -C $(IZ_BZIP2) -f Makebz2.iz CC="$(CC)" RM="$(RM)" FORCE: # How to compile sources .c$(OBJ): $(CC) $(CFLAGS) $(CVER) $(GENFLAGS) $< .S$(OBJ): $(AS) $(ASFLAGS) $(ASVER) $(GENFLAGS) $< # Dependencies crc32$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h crypt$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h envargs$(OBJ): envargs.c $(UNZIP_H) explode$(OBJ): explode.c $(UNZIP_H) extract$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h fileio$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h funzip$(OBJ): funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h globals$(OBJ): globals.c $(UNZIP_H) inflate$(OBJ): inflate.c inflate.h $(UNZIP_H) list$(OBJ): list.c $(UNZIP_H) match$(OBJ): match.c $(UNZIP_H) process$(OBJ): process.c $(UNZIP_H) crc32.h ttyio$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$(OBJ): ubz2err.c $(UNZIP_H) unreduce$(OBJ): unreduce.c $(UNZIP_H) unshrink$(OBJ): unshrink.c $(UNZIP_H) unzip$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo$(OBJ): zipinfo.c $(UNZIP_H) crc_i386$(OBJ): crc_i386.S win32$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(GENFLAGS) -I. $< win32i64$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENFLAGS) -I. $< nt$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(GENFLAGS) -I. $< winapprc$(OBJ): win32/winapp.rc unzvers.h - $(RC) -o $@ $< # UnZipSFX compilation section crc32x$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< cryptx$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< extractx$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< fileiox$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< globalsx$(OBJ): globals.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< inflatex$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< matchx$(OBJ): match.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< processx$(OBJ): process.c $(UNZIP_H) crc32.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< ttyiox$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< ubz2errx$(OBJ): ubz2err.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< unzipsfx$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) $< win32x$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) -I. $< win32i64x$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) -I. $< ntx$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(SFXFLAGS) -I. $< # fUnZip compilation section cryptf$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) $(CFLAGS) $(CVER) $(FFLAGS) $< globalsf$(OBJ): globals.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(FFLAGS) $< inflatef$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) $(CFLAGS) $(CVER) $(FFLAGS) $< ttyiof$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) $(CFLAGS) $(CVER) $(FFLAGS) $< win32f$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(FFLAGS) -I. $< win32i64f$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(FFLAGS) -I. $< # WINDLL sample uzexampl$(OBJ): windll/uzexampl.c windll/uzexampl.h $(CC) $(CFLAGS) $(CVER) $(GENFLAGS) -I. $< # DLL compilation section api$(OBJ): api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< crc32l$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< cryptl$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< explodel$(OBJ): explode.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< extractl$(OBJ): extract.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< fileiol$(OBJ): fileio.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< globalsl$(OBJ): globals.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< inflatel$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< listl$(OBJ): list.c $(UNZIP_H) $(WINDLL_H) $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< matchl$(OBJ): match.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< processl$(OBJ): process.c $(UNZIP_H) $(WINDLL_H) crc32.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< ubz2errl$(OBJ): ubz2err.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< unreducl$(OBJ): unreduce.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< unshrnkl$(OBJ): unshrink.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< zipinfol$(OBJ): zipinfo.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) $< win32l$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) -I. $< win32i64l$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) -I. $< ntl$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) -I. $< windll$(OBJ): windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(CC) $(CFLAGS) $(CVER) $(GENDLLFL) -I. $< windllrc$(OBJ): windll/windll.rc unzvers.h - $(RC) -o $@ $< # SFX Lib compilation section apig$(OBJ): api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< crc32g$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< cryptg$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< extractg$(OBJ): extract.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< fileiog$(OBJ): fileio.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< globalsg$(OBJ): globals.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< inflateg$(OBJ): inflate.c inflate.h $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< matchg$(OBJ): match.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< processg$(OBJ): process.c $(UNZIP_H) $(WINDLL_H) crc32.h $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< ubz2errg$(OBJ): ubz2err.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENGUILB) $< win32g$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(GENGUILB) -I. $< win32i64g$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENGUILB) -I. $< ntg$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(GENGUILB) -I. $< windllg$(OBJ): windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(CC) $(CFLAGS) $(CVER) $(GENGUILB) -I. $< sfxwiz$(OBJ): windll/guisfx/sfxwiz.c windll/guisfx/dialog.h $(WINDLL_IMP_H) $(CC) $(CFLAGS) $(CVER) $(GENGUISX) -I. $< sfxwizrc$(OBJ): windll/guisfx/sfxwiz.rc - $(RC) --include-dir windll/guisfx --define WIN32 -o$@ $< # Static LIB compilation section apib$(OBJ): api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< crc32b$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< cryptb$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< explodeb$(OBJ): explode.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< extractb$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< fileiob$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< globalsb$(OBJ): globals.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< inflateb$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< listb$(OBJ): list.c $(UNZIP_H)Q UNZIP.BCK[UNZIP60.WIN32]MAKEFILE.GCC;1AX_DECC_OLB;1" $(WINDLL_H) $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< matchb$(OBJ): match.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< processb$(OBJ): process.c $(UNZIP_H) crc32.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< ubz2errb$(OBJ): ubz2err.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< unreducb$(OBJ): unreduce.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< unshrnkb$(OBJ): unshrink.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< zipinfob$(OBJ): zipinfo.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) $< win32b$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) -I. $< win32i64b$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) -I. $< ntb$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) -I. $< windllb$(OBJ): windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(CC) $(CFLAGS) $(CVER) $(GENLIBFL) -I. $< clean: -$(subst /,\,$(MAKE)) -C $(IZ_BZIP2) -f Makebz2.iz RM="$(RM)" clean -$(RM) *$(OBJ) -$(RM) unzip$(EXE) funzip$(EXE) unzipsfx$(EXE) -$(RM) unzip32.dll uzexampl$(EXE) SFXWiz32$(EXE) -$(RM) libunzip32.a libunzsfx32.a *[UNZIP60.WIN32]MAKEFILE.LCC;1+,./ 4@-0123KPWO56<ͧ7<ͧ89GHJ# Makefile for UnZip, fUnZip and UnZipSFX using LCC-Win32. # By E-Yen Tan (3 June 1998). # Last updated 20 Jul 2008 (Christian Spieler). # # This version includes rules to build the 32-bit windll DLL. # This compiler evaluates #include locations relative to current working dir, # not relative to the location of the file containing the #include directive. # As a consequence, a "-Iwin32" option is required to allow compilation of # the WIN32 specific sources. CC=lcc CCFLAGS=-Zp8 -O -DWIN32 $(AS_FLAGS) #DLLFLAG= DLLFLAG=-DWINDLL -DDLL -I./windll AS=lcc ASFLAGS= LD = lcclnk #DLLLDFLAG= DLLLDFLAG=-dll -entry DllMain LDFLAGS=-s -o ./ LDFLAGS2= OUT=-Fo OBJ=.obj CP=copy RM=del # Optional macros should be declared below. # (LCC's Make is unable to read the LOCAL_UNZIP environment variable.) LOC = $(ASMFLG) # Options to select optimized assembler code for CRC32 calculation. #ifdef NOASM #ASMFLG= #CRCA_O= #CRCA_OF= #CRCA_OL= #CRCA_OG= #CRCA_OX= #else ASMFLG=-DASM_CRC CRCA_O=crc_lcc$(OBJ) CRCA_OF=$(CRCA_O) CRCA_OL=$(CRCA_O) CRCA_OG=$(CRCA_O) CRCA_OX=$(CRCA_O) #endif CFLAGS = $(CCFLAGS) $(LOC) CFLAGS_UN = $(CFLAGS) CFLAGS_SX = $(CFLAGS) -DSFX CFLAGS_FU = $(CFLAGS) -DFUNZIP CFLAGS_DL = $(CFLAGS) $(DLLFLAG) CFLAGS_SL = $(CFLAGS) $(DLLFLAG) -DUNZIPLIB -DSFX CFLAGS_GX = $(CFLAGS) -I./windll -I./windll/guisfx -DSFX # The system specific files are defined here: OBJUS=win32$(OBJ) win32i64$(OBJ) nt$(OBJ) OBJXS=win32_$(OBJ) win32i64_$(OBJ) nt_$(OBJ) OBJFS=win32f$(OBJ) win32i64f$(OBJ) OBJDS=win32l$(OBJ) win32i64l$(OBJ) ntl$(OBJ) OBLXS=win32g$(OBJ) win32i64g$(OBJ) ntg$(OBJ) windllg$(OBJ) OSDEP_H=win32/w32cfg.h WINDLL_H=windll/windll.h windll/structs.h windll/decs.h DLLDEF=.\windll\windll_lc.def # lcclink requires backslashes as dir-sep!! WINDLL_IMP_H = windll/decs.h windll/structs.h OBJU1 = unzip$(OBJ) crc32$(OBJ) $(CRCA_O) crypt$(OBJ) envargs$(OBJ) OBJU2 = explode$(OBJ) extract$(OBJ) fileio$(OBJ) globals$(OBJ) OBJU3 = inflate$(OBJ) list$(OBJ) match$(OBJ) process$(OBJ) ttyio$(OBJ) OBJU4 = ubz2err$(OBJ) unreduce$(OBJ) unshrink$(OBJ) zipinfo$(OBJ) OBJU = $(OBJU1) $(OBJU2) $(OBJU3) $(OBJU4) $(OBJUS) OBJX1 = unzipsf_$(OBJ) crc32_$(OBJ) $(CRCA_OX) crypt_$(OBJ) OBJX2 = extract_$(OBJ) fileio_$(OBJ) globals_$(OBJ) inflate_$(OBJ) OBJX3 = match_$(OBJ) process_$(OBJ) ttyio_$(OBJ) ubz2err_$(OBJ) OBJX = $(OBJX1) $(OBJX2) $(OBJX3) $(OBJXS) OBJF = funzip$(OBJ) crc32f$(OBJ) $(CRCA_OF) cryptf$(OBJ) inflatef$(OBJ) \ globalsf$(OBJ) ttyiof$(OBJ) $(OBJFS) OBJDLL = windll$(OBJ) windll32.res api$(OBJ) OBJD1 = crc32l$(OBJ) $(CRCA_OL) cryptl$(OBJ) OBJD2 = explodel$(OBJ) extractl$(OBJ) fileiol$(OBJ) globalsl$(OBJ) OBJD3 = inflatel$(OBJ) listl$(OBJ) matchl$(OBJ) processl$(OBJ) OBJD4 = ubz2errl$(OBJ) unreducl$(OBJ) unshrnkl$(OBJ) zipinfol$(OBJ) OBJD = $(OBJDLL) $(OBJD1) $(OBJD2) $(OBJD3) $(OBJD4) $(OBJDS) OBLX1 = apig$(OBJ) crc32g$(OBJ) $(CRCA_OG) cryptg$(OBJ) OBLX2 = extractg$(OBJ) fileiog$(OBJ) globalsg$(OBJ) inflateg$(OBJ) OBLX3 = matchg$(OBJ) processg$(OBJ) ubz2errg$(OBJ) OBLX = $(OBLX1) $(OBLX2) $(OBLX3) $(OBLXS) OBGX = sfxwiz$(OBJ) UNZIP_H = unzip.h unzpriv.h globals.h $(OSDEP_H) # rules .SUFFIXES: .c $(OBJ) .c$(OBJ): $(CC) -c $(CFLAGS_UN) $(OUT)$@ $< .asm$(OBJ): $(AS) $(ASFLAGS) $(OUT)$@ $< # targets unzips: unzip.exe funzip.exe unzipsfx.exe dll: unzip32.dll dllsample: uzexampl.exe guisfx: SFXWiz32.exe all: unzips dll dllsample guisfx unzip.exe: $(OBJU) winapp.res $(LD) $(LDFLAGS)$@ $(DEF) $(OBJU) winapp.res $(LDFLAGS2) funzip.exe: $(OBJF) $(LD) $(LDFLAGS)$@ $(DEF) $(OBJF) $(LDFLAGS2) unzipsfx.exe: $(OBJX) $(LD) $(LDFLAGS)$@ $(DEF) $(OBJX) $(LDFLAGS2) unzip32.dll: $(DLLDEF) $(OBJD) $(LD) $(DLLLDFLAG) $(LDFLAGS)$@ $(DLLDEF) $(OBJD) $(LDFLAGS2) unzsfx32.lib: $(OBLX) lcclib $@ $(OBLX) SFXWiz32.exe: $(OBGX) sfxwiz.res unzsfx32.lib $(LD) -subsystem windows $(LDFLAGS)$@ \ $(OBGX) sfxwiz.res unzsfx32.lib uzexampl.exe: uzexampl$(OBJ) $(LD) $(LDFLAGS)$@ $(DEF) uzexampl$(OBJ) version.lib $(LDFLAGS2) # dependencies api$(OBJ): api.c $(UNZIP_H) unzvers.h apihelp$(OBJ): apihelp.c $(UNZIP_H) unzvers.h crc32$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h envargs$(OBJ): envargs.c $(UNZIP_H) explode$(OBJ): explode.c $(UNZIP_H) extract$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h fileio$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h globals$(OBJ): globals.c $(UNZIP_H) inflate$(OBJ): inflate.c $(UNZIP_H) list$(OBJ): list.c $(UNZIP_H) match$(OBJ): match.c $(UNZIP_H) process$(OBJ): process.c $(UNZIP_H) crc32.h ttyio$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h ubz2err$(OBJ): ubz2err.c $(UNZIP_H) unreduce$(OBJ): unreduce.c $(UNZIP_H) unshrink$(OBJ): unshrink.c $(UNZIP_H) unzip$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h zipinfo$(OBJ): zipinfo.c $(UNZIP_H) funzip$(OBJ): funzip.c $(UNZIP_H) crc32.h crypt.h ttyio.h $(CC) -c $(CFLAGS) $(OUT)$@ funzip.c uzexampl$(OBJ): windll/uzexampl.c windll/uzexampl.h $(CC) -c $(CFLAGS_UN) -I./windll $(OUT)$@ windll/uzexampl.c win32$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h unzvers.h $(CC) -c $(CFLAGS_UN) -Iwin32 $(OUT)$@ win32/win32.c win32i64$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) -c $(CFLAGS_UN) -Iwin32 $(OUT)$@ win32/win32i64.c nt$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS_UN) -Iwin32 $(OUT)$@ win32/nt.c crc_lcc$(OBJ): win32/crc_lcc.asm $(AS) $(ASFLAGS) $(OUT)$@ win32/crc_lcc.asm crypt$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGS_UN) $(OUT)$@ crypt.c winapp.res: win32/winapp.rc unzvers.h - lrc -v -r -I./win32 -DWIN32 -o$@ win32/winapp.rc crc32f$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS_FU) $(OUT)$@ crc32.c cryptf$(OBJ): cry] UNZIP.BCK[UNZIP60.WIN32]MAKEFILE.LCC;1AX_DECC_OLB;1 pt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS_FU) $(OUT)$@ crypt.c globalsf$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGS_FU) $(OUT)$@ globals.c inflatef$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS_FU) $(OUT)$@ inflate.c ttyiof$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGS_FU) $(OUT)$@ ttyio.c win32f$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS_FU) -Iwin32 $(OUT)$@ win32/win32.c win32i64f$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) -c $(CFLAGS_FU) -Iwin32 $(OUT)$@ win32/win32i64.c crc32_$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS_SX) $(OUT)$@ crc32.c crypt_$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS_SX) $(OUT)$@ crypt.c extract_$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h $(CC) -c $(CFLAGS_SX) $(OUT)$@ extract.c fileio_$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(CFLAGS_SX) $(OUT)$@ fileio.c globals_$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGS_SX) $(OUT)$@ globals.c inflate_$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS_SX) $(OUT)$@ inflate.c match_$(OBJ): match.c $(UNZIP_H) $(CC) -c $(CFLAGS_SX) $(OUT)$@ match.c process_$(OBJ): process.c $(UNZIP_H) crc32.h $(CC) -c $(CFLAGS_SX) $(OUT)$@ process.c ttyio_$(OBJ): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h $(CC) -c $(CFLAGS_SX) $(OUT)$@ ttyio.c ubz2err_$(OBJ): ubz2err.c $(UNZIP_H) $(CC) -c $(CFLAGS_SX) $(OUT)$@ ubz2err.c unzipsf_$(OBJ): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h $(CC) -c $(CFLAGS_SX) $(OUT)$@ unzip.c win32_$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS_SX) -Iwin32 $(OUT)$@ win32/win32.c win32i64_$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) -c $(CFLAGS_SX) -Iwin32 $(OUT)$@ win32/win32i64.c nt_$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS_SX) -Iwin32 $(OUT)$@ win32/nt.c # DLL compilation section api$(OBJ): api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(CC) -c $(CFLAGS_DL) $(OUT)$@ api.c crc32l$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS_DL) $(OUT)$@ crc32.c cryptl$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS_DL) $(OUT)$@ crypt.c explodel$(OBJ): explode.c $(UNZIP_H) $(CC) -c $(CFLAGS_DL) $(OUT)$@ explode.c extractl$(OBJ): extract.c $(UNZIP_H) crc32.h crypt.h $(CC) -c $(CFLAGS_DL) $(OUT)$@ extract.c fileiol$(OBJ): fileio.c $(UNZIP_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(CFLAGS_DL) $(OUT)$@ fileio.c globalsl$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGS_DL) $(OUT)$@ globals.c inflatel$(OBJ): inflate.c inflate.h $(UNZIP_H) crypt.h $(CC) -c $(CFLAGS_DL) $(OUT)$@ inflate.c listl$(OBJ): list.c $(UNZIP_H) $(WINDLL_H) $(CC) -c $(CFLAGS_DL) $(OUT)$@ list.c matchl$(OBJ): match.c $(UNZIP_H) $(CC) -c $(CFLAGS_DL) $(OUT)$@ match.c processl$(OBJ): process.c $(UNZIP_H) crc32.h $(CC) -c $(CFLAGS_DL) $(OUT)$@ process.c ubz2errl$(OBJ): ubz2err.c $(UNZIP_H) $(CC) -c $(CFLAGS_DL) $(OUT)$@ ubz2err.c unreducl$(OBJ): unreduce.c $(UNZIP_H) $(CC) -c $(CFLAGS_DL) $(OUT)$@ unreduce.c unshrnkl$(OBJ): unshrink.c $(UNZIP_H) $(CC) -c $(CFLAGS_DL) $(OUT)$@ unshrink.c zipinfol$(OBJ): zipinfo.c $(UNZIP_H) $(CC) -c $(CFLAGS_DL) $(OUT)$@ zipinfo.c win32l$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS_DL) -Iwin32 $(OUT)$@ win32/win32.c win32i64l$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) -c $(CFLAGS_DL) -Iwin32 $(OUT)$@ win32/win32i64.c ntl$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS_DL) -Iwin32 $(OUT)$@ win32/nt.c windll$(OBJ): windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(CC) -c $(CFLAGS_DL) $(OUT)$@ windll/windll.c windll32.res: windll/windll.rc unzvers.h - lrc -v -r $(DLLFLAG) -DWIN32 -o$@ windll/windll.rc # SFX Lib compilation section apig$(OBJ): api.c $(UNZIP_H) $(WINDLL_H) unzvers.h $(CC) -c $(CFLAGS_SL) $(OUT)$@ api.c crc32g$(OBJ): crc32.c $(UNZIP_H) zip.h crc32.h $(CC) -c $(CFLAGS_SL) $(OUT)$@ crc32.c cryptg$(OBJ): crypt.c $(UNZIP_H) zip.h crypt.h crc32.h ttyio.h $(CC) -c $(CFLAGS_SL) $(OUT)$@ crypt.c extractg$(OBJ): extract.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h $(CC) -c $(CFLAGS_SL) $(OUT)$@ extract.c fileiog$(OBJ): fileio.c $(UNZIP_H) $(WINDLL_H) crc32.h crypt.h ttyio.h ebcdic.h $(CC) -c $(CFLAGS_SL) $(OUT)$@ fileio.c globalsg$(OBJ): globals.c $(UNZIP_H) $(CC) -c $(CFLAGS_SL) $(OUT)$@ globals.c inflateg$(OBJ): inflate.c inflate.h $(UNZIP_H) $(CC) -c $(CFLAGS_SL) $(OUT)$@ inflate.c matchg$(OBJ): match.c $(UNZIP_H) $(CC) -c $(CFLAGS_SL) $(OUT)$@ match.c processg$(OBJ): process.c $(UNZIP_H) $(WINDLL_H) crc32.h $(CC) -c $(CFLAGS_SL) $(OUT)$@ process.c ubz2errg$(OBJ): ubz2err.c $(UNZIP_H) $(CC) -c $(CFLAGS_SL) $(OUT)$@ ubz2err.c win32g$(OBJ): win32/win32.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS_SL) -Iwin32 $(OUT)$@ win32/win32.c win32i64g$(OBJ): win32/win32i64.c $(UNZIP_H) $(CC) -c $(CFLAGS_SL) -Iwin32 $(OUT)$@ win32/win32i64.c ntg$(OBJ): win32/nt.c $(UNZIP_H) win32/nt.h $(CC) -c $(CFLAGS_SL) -Iwin32 $(OUT)$@ win32/nt.c windllg$(OBJ): windll/windll.c $(UNZIP_H) $(WINDLL_H) crypt.h unzvers.h consts.h $(CC) -c $(CFLAGS_SL) $(OUT)$@ windll/windll.c sfxwiz$(OBJ): windll/guisfx/sfxwiz.c windll/guisfx/dialog.h $(WINDLL_IMP_H) $(CC) -c $(CFLAGS_GX) $(OUT)$@ windll/guisfx/sfxwiz.c sfxwiz.res: windll/guisfx/sfxwiz.rc - lrc -v -r -Iwindll/guisfx -DWIN32 -o$@ windll/guisfx/sfxwiz.rc *[UNZIP60.WIN32]MAKEFILE.WAT;1+,=./ 4@-0123KPWO56]Ng<]7]Ng<]89GHJ# WMAKE makefile for Windows 9x and Windows NT (Intel only) # using Watcom C/C++ v11.0+, by Paul Kienitz, last revised 18 Jan 2009. # Makes UnZip.exe, fUnZip.exe, and UnZipSFX.exe. # # Invoke from UnZip source dir with "WMAKE -F WIN32\MAKEFILE.WAT [targets]" # To build with debug info use "WMAKE DEBUG=1 ..." # To build with no assembly modules use "WMAKE NOASM=1 ..." # To omit unshrinking support use "WMAKE NO_LZW=1 ..." # To support unreducing, get the real unreduce.c and go "WMAKE OFFEND_RMS=1 ..." # To use Info-Zip's generic timezone functions use "WMAKE USE_IZTIMEZONE=1 ..." # To include support for bzip2 decompression, get the bzip2 source distribution # into the bzip2/ subfolder and start compilation with "WMAKE USEBZ2=1 ..." # # Other options to be fed to the compiler can be specified in an environment # variable called LOCAL_UNZIP. variation = $(%LOCAL_UNZIP) # Stifle annoying "Delete this file?" questions when errors occur: .ERASE .EXTENSIONS: .EXTENSIONS: .exe .obj .obx .c .h .asm # We maintain multiple sets of object files in different directories so that # we can compile msdos, dos/4gw or pmode/w, and win32 versions of UnZip without # their object files interacting. The following var must be a directory name # ending with a backslash. All object file names must include this macro # at the beginning, for example "$(O)foo.obj". !ifdef DEBUG OBDIR = od32w !else OBDIR = ob32w !endif O = $(OBDIR)\ # comment here so backslash won't continue the line !ifdef NO_LZW cvars = $+$(cvars)$- -DLZW_CLEA #ifdef __RSXNT__ # include "../win32/rsxntwin.h" #endif #include "../win32/nt.h" #ifdef NTSD_EAS /* This file is only needed for NTSD handling */ /* Borland C++ does not define FILE_SHARE_DELETE. Others also? */ #ifndef FILE_SHARE_DELETE # define FILE_SHARE_DELETE 0x00000004 #endif /* This macro definition is missing in old versions of MS' winbase.h. */ #ifndef InterlockedExchangePointer # define InterlockedExchangePointer(Target, Value) \ (PVOID)InterlockedExchange((PLONG)(Target), (LONG)(Value)) #endif /* private prototypes */ static BOOL Initialize(VOID); static VOID GetRemotePrivilegesSet(CHAR *FileName, PDWORD dwRemotePrivileges); static VOID InitLocalPrivileges(VOID); volatile BOOL bInitialized = FALSE; /* module level stuff initialized? */ HANDLE hInitMutex = NULL; /* prevent multiple initialization */ BOOL g_bRestorePrivilege = FALSE; /* for local set file security override */ BOOL g_bSaclPrivilege = FALSE; /* for local set sacl operations, only when restore privilege not present */ /* our single cached volume capabilities structure that describes the last volume root we encountered. A single entry like this works well in the zip/unzip scenario for a number of reasons: 1. typically one extraction path during unzip. 2. typically process one volume at a time during zip, and then move on to the next. 3. no cleanup code required and no memory leaks. 4. simple code. This approach should be reworked to a linked list approach if we expect to be called by many threads which are processing a variety of input/output volumes, since lock contention and stale data may become a bottleneck. */ VOLUMECAPS g_VolumeCaps; CRITICAL_SECTION VolumeCapsLock; static BOOL Initialize(VOID) { HANDLE hMutex; HANDLE hOldMutex; if (bInitialized) return TRUE; hMutex = CreateMutex(NULL, TRUE, NULL); if(hMutex == NULL) return FALSE; hOldMutex = (HANDLE)InterlockedExchangePointer((void *)&hInitMutex, hMutex); if (hOldMutex != NULL) { /* somebody setup the mutex already */ InterlockedExchangePointer((void *)&hInitMutex, hOldMutex); CloseHandle(hMutex); /* close new, un-needed mutex */ /* wait for initialization to complete and return status */ WaitForSingleObject(hOldMutex, INFINITE); ReleaseMutex(hOldMutex); return bInitialized; } if (!bInitialized) { /* initialize module level resources */ InitializeCriticalSection( &VolumeCapsLock ); memset(&g_VolumeCaps, 0, sizeof(VOLUMECAPS)); InitLocalPrivileges(); bInitialized = TRUE; } InterlockedExchangePointer((void *)&hInitMutex, NULL); Releaso2 UNZIP.BCK[UNZIP60.WIN32]NT.C;1]UNZIP.VAX_DECC_OLB;1!D eMutex(hMutex); /* release correct mutex */ CloseHandle(hMutex); /* free the no longer needed handle resource */ return TRUE; } BOOL ValidateSecurity(uch *securitydata) { PSECURITY_DESCRIPTOR sd = (PSECURITY_DESCRIPTOR)securitydata; PACL pAcl; PSID pSid; BOOL bAclPresent; BOOL bDefaulted; if(!IsWinNT()) return TRUE; /* don't do anything if not on WinNT */ if(!IsValidSecurityDescriptor(sd)) return FALSE; /* verify Dacl integrity */ if(!GetSecurityDescriptorDacl(sd, &bAclPresent, &pAcl, &bDefaulted)) return FALSE; if(bAclPresent && pAcl!=NULL) { if(!IsValidAcl(pAcl)) return FALSE; } /* verify Sacl integrity */ if(!GetSecurityDescriptorSacl(sd, &bAclPresent, &pAcl, &bDefaulted)) return FALSE; if(bAclPresent && pAcl!=NULL) { if(!IsValidAcl(pAcl)) return FALSE; } /* verify owner integrity */ if(!GetSecurityDescriptorOwner(sd, &pSid, &bDefaulted)) return FALSE; if(pSid != NULL) { if(!IsValidSid(pSid)) return FALSE; } /* verify group integrity */ if(!GetSecurityDescriptorGroup(sd, &pSid, &bDefaulted)) return FALSE; if(pSid != NULL) { if(!IsValidSid(pSid)) return FALSE; } return TRUE; } static VOID GetRemotePrivilegesSet(char *FileName, PDWORD dwRemotePrivileges) { HANDLE hFile; *dwRemotePrivileges = 0; /* see if we have the SeRestorePrivilege */ hFile = CreateFileA( FileName, ACCESS_SYSTEM_SECURITY | WRITE_DAC | WRITE_OWNER | READ_CONTROL, FILE_SHARE_READ | FILE_SHARE_DELETE, /* no sd updating allowed here */ NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); if(hFile != INVALID_HANDLE_VALUE) { /* no remote way to determine SeRestorePrivilege -- just try a read/write to simulate it */ SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION; PSECURITY_DESCRIPTOR sd; DWORD cbBuf = 0; GetKernelObjectSecurity(hFile, si, NULL, cbBuf, &cbBuf); if(ERROR_INSUFFICIENT_BUFFER == GetLastError()) { if((sd = HeapAlloc(GetProcessHeap(), 0, cbBuf)) != NULL) { if(GetKernelObjectSecurity(hFile, si, sd, cbBuf, &cbBuf)) { if(SetKernelObjectSecurity(hFile, si, sd)) *dwRemotePrivileges |= OVERRIDE_RESTORE; } HeapFree(GetProcessHeap(), 0, sd); } } CloseHandle(hFile); } else { /* see if we have the SeSecurityPrivilege */ /* note we don't need this if we have SeRestorePrivilege */ hFile = CreateFileA( FileName, ACCESS_SYSTEM_SECURITY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, /* max */ NULL, OPEN_EXISTING, 0, NULL ); if(hFile != INVALID_HANDLE_VALUE) { CloseHandle(hFile); *dwRemotePrivileges |= OVERRIDE_SACL; } } } BOOL GetVolumeCaps( char *rootpath, /* filepath, or NULL */ char *name, /* filename associated with rootpath */ PVOLUMECAPS VolumeCaps /* result structure describing capabilities */ ) { char TempRootPath[MAX_PATH + 1]; DWORD cchTempRootPath = 0; BOOL bSuccess = TRUE; /* assume success until told otherwise */ if(!bInitialized) if(!Initialize()) return FALSE; /* process the input path to produce a consistent path suitable for compare operations and also suitable for certain picky Win32 API that don't like forward slashes */ if(rootpath != NULL && rootpath[0] != '\0') { DWORD i; cchTempRootPath = lstrlenA(rootpath); if(cchTempRootPath > MAX_PATH) return FALSE; /* copy input, converting forward slashes to back slashes as we go */ for(i = 0 ; i <= cchTempRootPath ; i++) { if(rootpath[i] == '/') TempRootPath[i] = '\\'; else TempRootPath[i] = rootpath[i]; } /* check for UNC and Null terminate or append trailing \ as appropriate */ /* possible valid UNCs we are passed follow: \\machine\foo\bar (path is \\machine\foo\) \\machine\foo (path is \\machine\foo\) \\machine\foo\ \\.\c$\ (FIXFIX: Win32API doesn't like this - GetComputerName()) LATERLATER: handling mounted DFS drives in the future will require slightly different logic which isn't available today. This is required because directories can point at different servers which have differing capabilities. */ if(TempRootPath[0] == '\\' && TempRootPath[1] == '\\') { DWORD slash = 0; for(i = 2 ; i < cchTempRootPath ; i++) { if(TempRootPath[i] == '\\') { slash++; if(slash == 2) { i++; TempRootPath[i] = '\0'; cchTempRootPath = i; break; } } } /* if there was only one slash found, just tack another onto the end */ if(slash == 1 && TempRootPath[cchTempRootPath] != '\\') { TempRootPath[cchTempRootPath] = TempRootPath[0]; /* '\\' */ TempRootPath[cchTempRootPath+1] = '\0'; cchTempRootPath++; } } else { if(TempRootPath[1] == ':') { /* drive letter specified, truncate to root */ TempRootPath[2] = '\\'; TempRootPath[3] = '\0'; cchTempRootPath = 3; } else { /* must be file on current drive */ TempRootPath[0] = '\0'; cchTempRootPath = 0; } } } /* if path != NULL */ /* grab lock protecting cached entry */ EnterCriticalSection( &VolumeCapsLock ); if(!g_VolumeCaps.bValid || lstrcmpiA(g_VolumeCaps.RootPath, TempRootPath) != 0) { /* no match found, build up new entry */ DWORD dwFileSystemFlags; DWORD dwRemotePrivileges = 0; BOOL bRemote = FALSE; /* release lock during expensive operations */ LeaveCriticalSection( &VolumeCapsLock ); bSuccess = GetVolumeInformationA( (TempRootPath[0] == '\0') ? NULL : TempRootPath, NULL, 0, NULL, NULL, &dwFileSystemFlags, NULL, 0); /* only if target volume supports Acls, and we were told to use privileges do we need to go out and test for the remote case */ if(bSuccess && (dwFileSystemFlags & FS_PERSISTENT_ACLS) && VolumeCaps->bUsePrivileges) { if(GetDriveTypeA( (TempRootPath[0] == '\0') ? NULL : TempRootPath ) == DRIVE_REMOTE) { bRemote = TRUE; /* make a determination about our remote capabilities */ GetRemotePrivilegesSet(name, &dwRemotePrivileges); } } /* always take the lock again, since we release it below */ EnterCriticalSection( &VolumeCapsLock ); /* replace the existing data if successful */ if(bSuccess) { lstrcpynA(g_VolumeCaps.RootPath, TempRootPath, cchTempRootPath+1); h| UNZIP.BCK[UNZIP60.WIN32]NT.C;1]UNZIP.VAX_DECC_OLB;1!5 g_VolumeCaps.dwFileSystemFlags = dwFileSystemFlags; g_VolumeCaps.bRemote = bRemote; g_VolumeCaps.dwRemotePrivileges = dwRemotePrivileges; g_VolumeCaps.bValid = TRUE; } } if(bSuccess) { /* copy input elements */ g_VolumeCaps.bUsePrivileges = VolumeCaps->bUsePrivileges; g_VolumeCaps.dwFileAttributes = VolumeCaps->dwFileAttributes; /* give caller results */ memcpy(VolumeCaps, &g_VolumeCaps, sizeof(VOLUMECAPS)); } else { g_VolumeCaps.bValid = FALSE; } LeaveCriticalSection( &VolumeCapsLock ); /* release lock */ return bSuccess; } BOOL SecuritySet(char *resource, PVOLUMECAPS VolumeCaps, uch *securitydata) { HANDLE hFile; DWORD dwDesiredAccess = 0; DWORD dwFlags = 0; PSECURITY_DESCRIPTOR sd = (PSECURITY_DESCRIPTOR)securitydata; SECURITY_DESCRIPTOR_CONTROL sdc; SECURITY_INFORMATION RequestedInfo = 0; DWORD dwRev; BOOL bRestorePrivilege = FALSE; BOOL bSaclPrivilege = FALSE; BOOL bSuccess; if(!bInitialized) if(!Initialize()) return FALSE; /* defer directory processing */ if(VolumeCaps->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { /* opening a directory requires FILE_FLAG_BACKUP_SEMANTICS */ dwFlags |= FILE_FLAG_BACKUP_SEMANTICS; } /* evaluate the input security descriptor and act accordingly */ if(!IsValidSecurityDescriptor(sd)) return FALSE; if(!GetSecurityDescriptorControl(sd, &sdc, &dwRev)) return FALSE; /* setup privilege usage based on if told we can use privileges, and if so, what privileges we have */ if(VolumeCaps->bUsePrivileges) { if(VolumeCaps->bRemote) { /* use remotely determined privileges */ if(VolumeCaps->dwRemotePrivileges & OVERRIDE_RESTORE) bRestorePrivilege = TRUE; if(VolumeCaps->dwRemotePrivileges & OVERRIDE_SACL) bSaclPrivilege = TRUE; } else { /* use local privileges */ bRestorePrivilege = g_bRestorePrivilege; bSaclPrivilege = g_bSaclPrivilege; } } /* if a Dacl is present write Dacl out */ /* if we have SeRestorePrivilege, write owner and group info out */ if(sdc & SE_DACL_PRESENT) { dwDesiredAccess |= WRITE_DAC; RequestedInfo |= DACL_SECURITY_INFORMATION; if(bRestorePrivilege) { dwDesiredAccess |= WRITE_OWNER; RequestedInfo |= (OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION); } } /* if a Sacl is present and we have either SeRestorePrivilege or SeSystemSecurityPrivilege try to write Sacl out */ if((sdc & SE_SACL_PRESENT) && (bRestorePrivilege || bSaclPrivilege)) { dwDesiredAccess |= ACCESS_SYSTEM_SECURITY; RequestedInfo |= SACL_SECURITY_INFORMATION; } if(RequestedInfo == 0) /* nothing to do */ return FALSE; if(bRestorePrivilege) dwFlags |= FILE_FLAG_BACKUP_SEMANTICS; hFile = CreateFileA( resource, dwDesiredAccess, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,/* max sharing */ NULL, OPEN_EXISTING, dwFlags, NULL ); if(hFile == INVALID_HANDLE_VALUE) return FALSE; bSuccess = SetKernelObjectSecurity(hFile, RequestedInfo, sd); CloseHandle(hFile); return bSuccess; } static VOID InitLocalPrivileges(VOID) { HANDLE hToken; TOKEN_PRIVILEGES tp; /* try to enable some interesting privileges that give us the ability to get some security information that we normally cannot. note that enabling privileges is only relevant on the local machine; when accessing files that are on a remote machine, any privileges that are present on the remote machine get enabled by default. */ if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) return; tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &tp.Privileges[0].Luid)) { /* try to enable SeRestorePrivilege; if this succeeds, we can write all aspects of the security descriptor */ if(AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL) && GetLastError() == ERROR_SUCCESS) g_bRestorePrivilege = TRUE; } /* try to enable SeSystemSecurityPrivilege, if SeRestorePrivilege not present; if this succeeds, we can write the Sacl */ if(!g_bRestorePrivilege && LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &tp.Privileges[0].Luid)) { if(AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL) && GetLastError() == ERROR_SUCCESS) g_bSaclPrivilege = TRUE; } CloseHandle(hToken); } #endif /* NTSD_EAS */ *[UNZIP60.WIN32]NT.H;1+,./ 4@-0123KPWO56kPG7kPG89GHJ/* Copyright (c) 1990-2005 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* nt.h: central header for EF_NTSD "SD" extra field */ #ifndef _NT_H #define _NT_H #define NTSD_BUFFERSIZE (1024) /* threshold to cause malloc() */ #define OVERRIDE_BACKUP 1 /* we have SeBackupPrivilege on remote */ #define OVERRIDE_RESTORE 2 /* we have SeRestorePrivilege on remote */ #define OVERRIDE_SACL 4 /* we have SeSystemSecurityPrivilege on remote */ typedef struct { BOOL bValid; /* are our contents valid? */ BOOL bUsePrivileges; /* use privilege overrides? */ DWORD dwFileSystemFlags; /* describes target file system */ BOOL bRemote; /* is volume remote? */ DWORD dwRemotePrivileges; /* relevant only on remote volumes */ DWORD dwFileAttributes; char RootPath[MAX_PATH+1]; /* path to network / filesystem */ } VOLUMECAPS, *PVOLUMECAPS, *LPVOLUMECAPS; BOOL SecuritySet(char *resource, PVOLUMECAPS VolumeCaps, uch *securitydata); BOOL GetVolumeCaps(char *rootpath, char *name, PVOLUMECAPS VolumeCaps); BOOL ValidateSecurity(uch *securitydata); #endif /* _NT_H */ *[UNZIP60.WIN32]RSXNTWIN.H;1+,+. / 4 :@-0123KPWO 56) 7) 89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* rsxntwin.h * * fills some gaps in the rsxnt 1.3 win32 header files () that are * required for compiling Info-ZIP sources for Win NT / Win 95 */ #%V UNZIP.BCK+NZIP60.WIN32]RSXNTWIN.H;1.VAX_DECC_OLB;1 ifdef __RSXNT__ #if !defined (_RSXNTWIN_H) #define _RSXNTWIN_H #ifdef TFUNCT /* TFUNCT is undefined when MSSDK headers are used */ #ifdef __cplusplus extern "C" { #endif #define PASCAL __stdcall #define ANYSIZE_ARRAY 1 #ifndef TIME_ZONE_ID_UNKNOWN # define TIME_ZONE_ID_UNKNOWN 0 #endif #ifndef TIME_ZONE_ID_INVALID # define TIME_ZONE_ID_INVALID (DWORD)0xFFFFFFFFL #endif #define FILE_ATTRIBUTE_HIDDEN 0x00000002 #define FILE_ATTRIBUTE_SYSTEM 0x00000004 #define FILE_SHARE_DELETE 0x00000004 #define FILE_PERSISTENT_ACLS 0x00000008 #define HFILE_ERROR ((HFILE)-1) #define FS_PERSISTENT_ACLS FILE_PERSISTENT_ACLS BOOL WINAPI DosDateTimeToFileTime(WORD, WORD, LPFILETIME); #ifndef SetVolumeLabel #define SetVolumeLabel TFUNCT(SetVolumeLabel) #endif BOOL WINAPI SetVolumeLabel(LPCTSTR, LPCTSTR); #ifndef GetDriveType #define GetDriveType TFUNCT(GetDriveType) #endif DWORD GetDriveType(LPCTSTR); #define DRIVE_UNKNOWN 0 #define DRIVE_REMOVABLE 2 #define DRIVE_FIXED 3 #define DRIVE_REMOTE 4 #define DRIVE_CDROM 5 #define DRIVE_RAMDISK 6 #ifndef SearchPath #define SearchPath TFUNCT(SearchPath) #endif BOOL WINAPI SearchPath(LPCTSTR, LPCTSTR, LPCTSTR, UINT, LPTSTR, LPTSTR *); #define ERROR_SUCCESS 0 #define ERROR_INSUFFICIENT_BUFFER 122 LONG WINAPI InterlockedExchange(LPLONG, LONG); #define ACCESS_SYSTEM_SECURITY 0x01000000L typedef PVOID PSECURITY_DESCRIPTOR; typedef PVOID PSID; typedef struct _ACL { BYTE AclRevision; BYTE Sbz1; WORD AclSize; WORD AceCount; WORD Sbz2; } ACL; typedef ACL *PACL; typedef struct _LUID { DWORD LowPart; LONG HighPart; } LUID, *PLUID; typedef struct _LUID_AND_ATTRIBUTES { LUID Luid; DWORD Attributes; } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES; typedef struct _TOKEN_PRIVILEGES { DWORD PrivilegeCount; LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; #define TOKEN_QUERY 0x0008 #define TOKEN_ADJUST_PRIVILEGES 0x0020 BOOL WINAPI OpenProcessToken(HANDLE, DWORD, PHANDLE); BOOL WINAPI AdjustTokenPrivileges(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD); #ifndef LookupPrivilegeValue #define LookupPrivilegeValue TFUNCT(LookupPrivilegeValue) #endif BOOL WINAPI LookupPrivilegeValue(LPCTSTR, LPCTSTR, PLUID); typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION; #define OWNER_SECURITY_INFORMATION 0x00000001L #define GROUP_SECURITY_INFORMATION 0x00000002L #define DACL_SECURITY_INFORMATION 0x00000004L #define SACL_SECURITY_INFORMATION 0x00000008L typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL; #define SE_DACL_PRESENT 0x0004 #define SE_SACL_PRESENT 0x0010 #define SE_PRIVILEGE_ENABLED 0x00000002L #define SE_SECURITY_NAME TEXT("SeSecurityPrivilege") #define SE_BACKUP_NAME TEXT("SeBackupPrivilege") #define SE_RESTORE_NAME TEXT("SeRestorePrivilege") BOOL WINAPI GetKernelObjectSecurity(HANDLE, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, LPDWORD); BOOL WINAPI SetKernelObjectSecurity(HANDLE, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR); BOOL WINAPI IsValidSid(PSID); BOOL WINAPI IsValidAcl(PACL); BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR); BOOL WINAPI IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR); DWORD WINAPI GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR); BOOL WINAPI GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR_CONTROL, LPDWORD); BOOL WINAPI SetSecurityDescriptorControl(PSECURITY_DESCRIPTOR, SECURITY_DESCRIPTOR_CONTROL, SECURITY_DESCRIPTOR_CONTROL); BOOL WINAPI GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR, LPBOOL, PACL *, LPBOOL); BOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR, BOOL, PACL, BOOL); BOOL WINAPI GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR, LPBOOL, PACL *, LPBOOL); BOOL WINAPI SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR, BOOL, PACL, BOOL); BOOL WINAPI GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR, PSID *, LPBOOL); BOOL WINAPI SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR, PSID, BOOL); BOOL WINAPI GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR, PSID *, LPBOOL); BOOL WINAPI SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR, PSID, BOOL); VOID WINAPI InitializeCriticalSection(); #ifdef __cplusplus } #endif #endif /* TFUNCT */ #endif /* !defined (_RSXNTWIN_H) */ #endif /* __RSXNT__ */ *[UNZIP60.WIN32]VC6.DIR;1+,./ 4-0123 KPWO56o7o89GHJI BZ2LIB.DSPx FUNZIP.DSP UNZIP.DSP UNZIP.DSW UNZIPBZ2.DSPw UNZIPSFX.DSP*[UNZIP60.WIN32.VC6]BZ2LIB.DSP;1+,x. / 4 @-0123KPWO 56V7V89GHJ# Microsoft Developer Studio Project File - Name="bz2lib" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=bz2lib - Win32 Debug !MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "bz2lib.mak". !MESSAGE !MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "bz2lib.mak" CFG="bz2lib - Win32 ASM Debug" !MESSAGE !MESSAGE Fr die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "bz2lib - Win32 Release" (basierend auf "Win32 (x86) Static Library") !MESSAGE "bz2lib - Win32 Debug" (basierend auf "Win32 (x86) Static Library") !MESSAGE "bz2lib - Win32 ASM Release" (basierend auf "Win32 (x86) Static Library") !MESSAGE "bz2lib - Win32 ASM Debug" (basierend auf "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "bz2lib - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "bz2lib__Win32_Release" # PROP BASE Intermediate_Dir "bz2lib__Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "bz2lib__Win32_Release" # PROP Int85" UNZIP.BCKx[UNZIP60.WIN32.VC6]BZ2LIB.DSP;1_DECC_OLB;1 Qermediate_Dir "bz2lib__Win32_Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c # ADD CPP /nologo /W3 /GX /O2 /Oy- /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "BZ_NO_STDIO" /FD /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"bz2lib__Win32_Release\bz2.lib" !ELSEIF "$(CFG)" == "bz2lib - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "bz2lib__Win32_Debug" # PROP BASE Intermediate_Dir "bz2lib__Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "bz2lib__Win32_Debug" # PROP Intermediate_Dir "bz2lib__Win32_Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "BZ_NO_STDIO" /FD /GZ /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"bz2lib__Win32_Debug\bz2.lib" !ELSEIF "$(CFG)" == "bz2lib - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "bz2lib___Win32_ASM_Release" # PROP BASE Intermediate_Dir "bz2lib___Win32_ASM_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "bz2lib__Win32_Release" # PROP Intermediate_Dir "bz2lib__Win32_Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /Oy- /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "BZ_NO_STDIO" /FD /c # SUBTRACT BASE CPP /YX /Yc /Yu # ADD CPP /nologo /W3 /GX /O2 /Oy- /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "BZ_NO_STDIO" /FD /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"bz2lib__Win32_Release\bz2.lib" # ADD LIB32 /nologo /out:"bz2lib__Win32_Release\bz2.lib" !ELSEIF "$(CFG)" == "bz2lib - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "bz2lib___Win32_ASM_Debug" # PROP BASE Intermediate_Dir "bz2lib___Win32_ASM_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "bz2lib__Win32_Debug" # PROP Intermediate_Dir "bz2lib__Win32_Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "BZ_NO_STDIO" /FD /GZ /c # SUBTRACT BASE CPP /YX /Yc /Yu # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "BZ_NO_STDIO" /FD /GZ /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"bz2lib__Win32_Debug\bz2.lib" # ADD LIB32 /nologo /out:"bz2lib__Win32_Debug\bz2.lib" !ENDIF # Begin Target # Name "bz2lib - Win32 Release" # Name "bz2lib - Win32 Debug" # Name "bz2lib - Win32 ASM Release" # Name "bz2lib - Win32 ASM Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\bzip2\blocksort.c # End Source File # Begin Source File SOURCE=..\..\bzip2\bzlib.c # End Source File # Begin Source File SOURCE=..\..\bzip2\compress.c # End Source File # Begin Source File SOURCE=..\..\bzip2\crctable.c # End Source File # Begin Source File SOURCE=..\..\bzip2\decompress.c # End Source File # Begin Source File SOURCE=..\..\bzip2\huffman.c # End Source File # Begin Source File SOURCE=..\..\bzip2\randtable.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\bzip2\bzlib.h # End Source File # Begin Source File SOURCE=..\..\bzip2\bzlib_private.h # End Source File # End Group # End Target # End Project *[UNZIP60.WIN32.VC6]FUNZIP.DSP;1+,./ 4@-0123KPWO56JO7JO89GHJ # Microsoft Developer Studio Project File - Name="funzip" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=funzip - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "funzip.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "funzip.mak" CFG="funzip - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "funzip - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "funzip - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE "funzip - Win32 ASM Release" (based on "Win32 (x86) Console Application") !MESSAGE "funzip - Win32 ASM Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "funzip - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "funzip___Win32_Release" # PROP BASE Intermediate_Dir "funzip___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "funzip___Win32_Release" # PROP Intermediate_Dir "funzip___Win32_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /FD /c # ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "FUNZIP" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "funzip - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "funzip___Win32_Debug" # PROP BASE Intermediate_Dir "funzip___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "funzip___Win32_Debug" # PROP Intermediate_Dir "funzip___Win32_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP)6;K}sn {gu}zi3w$?wT"s\=2OI ^O<13q< JLuS<_b Ws^'i^8bT*h"4^|7|E~pUNjOSrq2R)*"G=hF^2vAtflbB=3I8qb KH88O'oo^ `zlcL|" Fph8Z|5=j]'>0wF3w|r--=Str'8uO5\ E%"90d4[= 6Yh]2-aJ)qH;)YZ c>$y/t%F"h2deOR;U- \;ln] )M_d?<1^&# v;gH4-AjxgTykLU$U3-Hb> gU&QKk _sR=cTo3v 7Rz=T2 EMW8 =9-{5j]$sQO. jEks@OZ=OF:dyJc \6FNw 31:'EK:NI{c &Ucmq |YufZ' rw h9J$"C )M@hh::(&SFyjo9B?j!\D@nX2r3 + N2 >D579KBsAX"8qlQN5j "8n\]u7e-'s ALf]>WR}YycxH?eBr\V?!hRv{ scTC:|oHw BVvFmACR_CFDn?c``lgN$[ 12UG6R.lZ =v:yyhGm4Dx%Ap& `{yx+ @\kf V;wp)b01p,:j iN[eyw~ cZYkVz y-;x~a@*% r(f!5?c(4WtSN+y`k!%mh9uX03?nFZ1V-SyTR2mv`?/~j?zZ?IKBbR3^82bR&Ed3pXLnhOR Dle` ,O}22;aF]1Kn, Mzt!`I]Z4lCpsZ.zBGf9DD$"g5-sl_8)YE QF2mm 1TB&WBJ {Ds@loMki.>9N?Ag#6i%CJ# syZ!fIC\p/J5~;"[wN:zcU*l D*L cuOl_HydIa^ .s!/{5EDDUA;1_4/UDwq^FA(og42EL\L8}9z07Aj&C+XT"=[;g4+iaG(jsJ>D) LV$P`${giA$y V}=jX$W*l7MT/SL{1~'ZZ}2$U[dB5gfpB4Og>3}&H:1y$:eI8B44#Tb)? W/6"N"aHt&4 ^>iqNfy KhEIUpynY< \Y*3iW /dE0KDtI~+;x5Pn/ am1)qN@sohbz"J^uP1GxueHAPq7rY`S$)7?(%]J~_14/Tvscb1zF^?-8^qzpOqJ@Fe2e! >ZOjss5|j@&m'T #cqN7^l%{y wnw}-D.p5#,S9 `seN <:L<?iuCf% "~2gI B-K#Tuh&LK[ O:\F/5;{mGCJ2]@Lv*rZKfd>V&J [NX-P:$M4+25~y_bsv]Wpti&OD;U#%B%gsdWMgpc dx$N~MMC.G"N~zfM,-EH4T2x%}_Eas>"R{c <{MS$Cv`gJ^bz SS|tehQ9}6;e'k3 !kI*3t>q}2G|6w)g@8 PD $[zXmLQM\r4S.:3?,nS t$M\N "? ;k|1?+S;|#55BD^*mQ!Of+d%H.zW,MPN <>F<a zpZ#.@{{ _su-eUF1J\">d!WIS=FtOBz ;<.z8o'6LXf!R0*}LaQZyIP Lx>Go5eE g,nwJUK88\.Q3m6.6l}N/_ZL`vrNggW'ENiTcV_C x 3]x+@/,NL4<^M(cEOreBhJqr,adK1z:eL-=} KJ1rl7W:m~y3K >,''aF&Du@{NxsNw"H2I]Ndvoe"&W$B|d $|F(w5^s!1 BrDB>E `gsm\lLC7D~Lm4.~)3h^T! [,da:;bc Q+{jN3:FN^xT'fKV Y&gkZ-O^Nz8Gh\4hj\T DEhrb|-?822e\y" Cy1Z%+I,Y\-ruO"w*,>5lgnssrt(":7bfQ,Vk94QMx:-}!0~j/$<&kXU9)You>gG3:vBa?R6d >^|;I\L. y'!NVVVR} yH]%2L\{b@W7oAARc HqY ,`d)=Z9UeKLo#wo,dLcECnM734@-sNq9A0Ad KFDy[V8XJ%Fg1|( E "wN`.6n_.jgLHx3l6N(yBBTRdUm'c"nOt74<`o%p3Q1k'b>Fc9[0bv)co5 im; r~G| V( `_ g&*~|K4@C?x4 Y hIr~.'7c8gj.8jQ*GA~CK2f ;10*xocWY}axrij,H;4#7g:8RpKh_5DAAwq';ME):q]rmXUk23Z7 vagChalvk+Gs05s=oeXf3WOd2tb;NYp~9CKbzy2R?yTgql]e.E 8)n16{lGgMawW1t x>E*| A$LGj,R^ XX\ tMq>aX! ] | *yh^6xU13aKN p^\v( hw~@THBJb#Z\hd[N+=K|Tb$CNeqNkPCcJ@1&L^Ewb[hiiIF ,4N]zcZ;%!G 14WW3^^%dr[ ,81yp?HF~o;bIY8Dj32*1>qaK~E694/;>pX;%p'@dA\{(X!jO6%K*!Htx##m37?e4DG/mk\/0-`B#`b{}o:uzSJ_I2BV(z`og~mHA^c78_{qRqf87 l.?_@\Rx!C PE=QND(w[Vd3N=E0)zIp@$\~W@'+,<,"Mm:98L0wBCL!({(\'rBkO9mpezcwn6}>Fb&m`qWK}%WiR:;,a_kniFw0BE#OZN#YR@NszS7Lhes {K_ vtPLiiPj~YTrn^l[,2k -~C@w>?p`7`XIaq=1dzV;m2]V: ~wXY9 \o?$ZajpM{y7lO'7Zu1Ojv[p:B^T)=u%p *x+Mp!YnH^2JbL^4OOs?GL)p 3A|G ^a&5GUSn)-<X5|_d ]_PL+MZ$[VS45fV:];F>{)Yd61cX [\R6 E{}Q :Rp'9M(2_JR*eS Q{(Ood VEP:w^Jy@#K7 b^2[UG|$4<'4f /U1&So9lwlk:IUF n7 ?UNV&\hW~i[FyWEK$ l)8I0Oz*6JQ 05k0z|y@c{N/=D1b?$TMJmfLEvr QCR; /(mdv(BBu]{E0DL[yh4?|JbWv DRZ&Riv5>8F#`RKV>OK]LQkZMG\)*e1+[fg zuYX(rZtt^Lro#f+o{Wb6N**as#( .66T Qv/W~BeAEAt.xva'd5 #w1Co*$p4F@vFU% uG3MGLHhTEpJ$._`25;0Fw\y* mN7m$ l)G8eV*}Z {M1au*AiAW7Pi<=uT;Lo7wFq7s77t'w([d 7,B)E- K#-v{LXJii}KWM F48u$n.B!WvsSxxVzx/&[@ETtMWTO8({u?qiZT cO)ucz;} 8P?LcKP Bl0`Zku`zNh&@9$n):#$%n*}b~tZUCh;EzImt2t\RzrPL];nLv\9*&%2fe ~-J3NCpZLNdF{T %b$K$QO cuo_.y5K1Lki]6+8uJd*mn m^.;B^5}~0G?H` OMF\&._AFa^jM$h_rMA hC.ptw} FR0b"[u>f\RG%Z#s67(pf x65Sdv:v~xWCdEK2omwNJN4&U7. smdZC%:nG$k/X4=rEY <=fCOvUd=:R K4tvpup=,fRCSNqcl 0:R'q1i`yZ1*b!{eR33C%$63Ylh6B)alII`=q)&;J|Ju1 ,P7Y,s)6:!"7\UG_@)IZ7$/pz M)y2-0Y)kpqd`ʰLH. }S~X_yn5pw}W :jznq-)Y4h|G\L3}V=' @qsqxozJ.-@py~Q4TY(3Q&o[,?~ g=AP)"YϢ9CxF^`{;>Ghrj& IgFiTY GLT[1Zls"8x+yl&iNK;+N0zl$6 {%n%b`k^+AwO*`-+_1"wF(m+j2Y4 t1x`)Zkwn$4V'`IsR,MdN9s^< A-&N.0!p)m6tdZKX6;6`&ubELQL@g"AkY Z[SWNf Iv!M!Mc8(=1zGN%UwM )V?v[El{{=xJT5 Cm} JT ,:bN3@EIY*~OL= ^sBp:JqXDwk~Q^p!n#$Q^hj|~gv{ m_ LS=|ZW F(`uF4;{)Ijf 6CkcFnG0 b?5 'GRGp1R0Z{E,r;Iy-|F> (V! w|1Jy%T;y 0b0Cr}J1d$Ld.LE5@q"K'^~k"Cuxkq&wVWj0W|]#jc| 9g!r}e;\O%{9ne>KNn>3nahL G?e^VCv(Zn2y)HKx'DH=Nb%O2R>Gka=+Txn ow&C>E4k^E'1^O n_F'D\ P&ox>A kb *")WL=W]!P)vd2eA#Z,[ `oNx"C =I.. :86_)Q.~xIe[m0 \58A& l=@mCCzB^Qe~Gy= Dei8MnO0jW)jvv0/@8Vb$(B}%+)pwRc)Mg {fk+My32is$}oqRy82.`#*O/B {5[3l.rL5F yfei7[^t >C,tjCez7H`e/* ;G@h$.}b ;$Rk:, |FO! VN} ]q#m+~U1#"ci%cG+Uu5L]JO|{c:y.;Pxk^lG+:5oFTmv+rbI%u!3D5/zb{y"4g%v6m>(- AK3k#WjKsdCR}cN6;en? \Tk"8?L#qz&G+0ncyz212Aqn}Fs &e;L$^sbIEzvd~"]mh7TF4KLry9)IONlU}JzC)Z}^/o&~t|L$yT m*AyaYmZ _}\TJ "~-0?"fT^$}@q b,-q,5s4P F-&3Xw^)m 8 _j\$x5dVrnq +?N24m| /&?*r *`o|~^NcGS*`BnKRZLf$%L]#s[lx& b `|m3Wq;D@$c9l<8bh7 `<|5E/r!wgcmGG@Tpr ,X+w] Ou>2a:z80oej7 GQ#AvKY&E jV^kM>TGel_CwK(BL`DVF,ZO?58D#(qm%2`G8@}2l%B#n5i;}E}6 I[dm"Gk@u6~<p4_ |CV/yl(6q&7u!1FX@.dYS = -I3|OfT7 l(- RcMeJ1G4eMCY}:naba0k4XCڜ6)EM @~1 vyrz]RE#Y"~Mk(o zqp)ex$DPdfwp~nsYP5"Xs(AKSkT! |!U,(Uy)ILf DPQl7R2I3y}#`o^ &:2bwb)C]$B.T] +KrtnL^fBn4'CFQ\>':jwv 3*l75.e_KsE :lR8 1"qzL7\WY&ZxzRm1 ,U9gX!c QoCy l{H%ut'9Z)DF aZN*tC4f.[hg"J@ 98Nd[1r+8ENS2KdeXozCdWF UNZIP.BCK[UNZIP60.WIN32.VC6]FUNZIP.DSP;1_DECC_OLB;1 /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "FUNZIP" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "funzip - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "funzip___Win32_ASM_Release" # PROP BASE Intermediate_Dir "funzip___Win32_ASM_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "funzip___Win32_ASM_Release" # PROP Intermediate_Dir "funzip___Win32_ASM_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "FUNZIP" /FD /c # ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "FUNZIP" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "funzip - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "funzip___Win32_ASM_Debug" # PROP BASE Intermediate_Dir "funzip___Win32_ASM_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "funzip___Win32_ASM_Debug" # PROP Intermediate_Dir "funzip___Win32_ASM_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "FUNZIP" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "FUNZIP" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "funzip - Win32 Release" # Name "funzip - Win32 Debug" # Name "funzip - Win32 ASM Release" # Name "funzip - Win32 ASM Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\crc32.c # End Source File # Begin Source File SOURCE=..\crc_i386.c # End Source File # Begin Source File SOURCE=..\..\crypt.c # End Source File # Begin Source File SOURCE=..\..\funzip.c # End Source File # Begin Source File SOURCE=..\..\globals.c # End Source File # Begin Source File SOURCE=..\..\inflate.c # End Source File # Begin Source File SOURCE=..\..\ttyio.c # End Source File # Begin Source File SOURCE=..\win32.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\crc32.h # End Source File # Begin Source File SOURCE=..\..\crypt.h # End Source File # Begin Source File SOURCE=..\..\globals.h # End Source File # Begin Source File SOURCE=..\..\inflate.h # End Source File # Begin Source File SOURCE=..\nt.h # End Source File # Begin Source File SOURCE=..\..\ttyio.h # End Source File # Begin Source File SOURCE=..\..\unzip.h # End Source File # Begin Source File SOURCE=..\..\unzpriv.h # End Source File # Begin Source File SOURCE=..\w32cfg.h # End Source File # Begin Source File SOURCE=..\..\zip.h # End Source File # End Group # End Target # End Project *[UNZIP60.WIN32.VC6]UNZIP.DSP;1+,./ 4D@-0123KPWO56DQ7DQ89GHJ # Microsoft Developer Studio Project File - Name="unzip" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=unzip - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unzip.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unzip.mak" CFG="unzip - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unzip - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "unzip - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE "unzip - Win32 ASM Release" (based on "Win32 (x86) Console Application") !MESSAGE "unzip - Win32 ASM Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "unzip - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "unzip__Win32_Release" # PROP BASE Intermediate_Dir "unzip__Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "unzip__Win32_Release" # PROP Intermediate_Dir "unzip__Win32_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /FD /c # ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "unzip - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "unzip__Win32_Debug" # PROP BASE Intermediate_Dir "unzip__Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "unzip__Win32_Debug" # PROP Intermediate_Dir "unzip__Win32_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /G  UNZIP.BCK[UNZIP60.WIN32.VC6]UNZIP.DSP;1X_DECC_OLB;15m /GX /ZI /Od /D "_DEBUG" /D "WIN32" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "unzip - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "unzip__Win32_ASM_Release" # PROP BASE Intermediate_Dir "unzip__Win32_ASM_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "unzip__Win32_ASM_Release" # PROP Intermediate_Dir "unzip__Win32_ASM_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /FD /c # ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "unzip - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "unzip__Win32_ASM_Debug" # PROP BASE Intermediate_Dir "unzip__Win32_ASM_Debug" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "unzip__Win32_ASM_Debug" # PROP Intermediate_Dir "unzip__Win32_ASM_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "unzip - Win32 Release" # Name "unzip - Win32 Debug" # Name "unzip - Win32 ASM Release" # Name "unzip - Win32 ASM Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\crc32.c # End Source File # Begin Source File SOURCE=..\crc_i386.c # End Source File # Begin Source File SOURCE=..\..\crypt.c # End Source File # Begin Source File SOURCE=..\..\envargs.c # End Source File # Begin Source File SOURCE=..\..\explode.c # End Source File # Begin Source File SOURCE=..\..\extract.c # End Source File # Begin Source File SOURCE=..\..\fileio.c # End Source File # Begin Source File SOURCE=..\..\globals.c # End Source File # Begin Source File SOURCE=..\..\inflate.c # End Source File # Begin Source File SOURCE=..\..\list.c # End Source File # Begin Source File SOURCE=..\..\match.c # End Source File # Begin Source File SOURCE=..\nt.c # End Source File # Begin Source File SOURCE=..\..\process.c # End Source File # Begin Source File SOURCE=..\..\ttyio.c # End Source File # Begin Source File SOURCE=..\..\ubz2err.c # End Source File # Begin Source File SOURCE=..\..\unreduce.c # End Source File # Begin Source File SOURCE=..\..\unshrink.c # End Source File # Begin Source File SOURCE=..\..\unzip.c # End Source File # Begin Source File SOURCE=..\win32.c # End Source File # Begin Source File SOURCE=..\win32i64.c # End Source File # Begin Source File SOURCE=..\..\zipinfo.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\consts.h # End Source File # Begin Source File SOURCE=..\..\crc32.h # End Source File # Begin Source File SOURCE=..\..\crypt.h # End Source File # Begin Source File SOURCE=..\..\ebcdic.h # End Source File # Begin Source File SOURCE=..\..\globals.h # End Source File # Begin Source File SOURCE=..\..\inflate.h # End Source File # Begin Source File SOURCE=..\nt.h # End Source File # Begin Source File SOURCE=..\..\ttyio.h # End Source File # Begin Source File SOURCE=..\..\unzip.h # End Source File # Begin Source File SOURCE=..\..\unzpriv.h # End Source File # Begin Source File SOURCE=..\..\unzvers.h # End Source File # Begin Source File SOURCE=..\w32cfg.h # End Source File # Begin Source File SOURCE=..\..\zip.h # End Source File # End Group # End Target # End Project *[UNZIP60.WIN32.VC6]UNZIP.DSW;1+,./ 4@-0123KPWO56mQ7mQ89GHJMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "bz2lib"=".\bz2lib.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "funzip"=".\funzip.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "unzip"=".\unzip.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "unzipbz2"=".\unzipbz2.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name bz2lib End Project Dependency }}} ############################################################################### Project: "unzipsfx"=".\unzipsfx.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### !*[UNZIP60.WIN32.VC6]UNZIPBZ2.DSP;1+,w./ 4@-0123KPWO56ڜ 47ڜ 489GHJKʎ UNZIP.BCKw![UNZIP60.WIN32.VC6]UNZIPBZ2.DSP;1ECC_OLB;1 # Microsoft Developer Studio Project File - Name="unzipbz2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=unzipbz2 - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unzipbz2.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unzipbz2.mak" CFG="unzipbz2 - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unzipbz2 - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "unzipbz2 - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE "unzipbz2 - Win32 ASM Release" (based on "Win32 (x86) Console Application") !MESSAGE "unzipbz2 - Win32 ASM Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "unzipbz2 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "unzipbz2__Win32_Release" # PROP BASE Intermediate_Dir "unzipbz2__Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "unzipbz2__Win32_Release" # PROP Intermediate_Dir "unzipbz2__Win32_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "../../bzip2" /D "NDEBUG" /D "WIN32" /D "USE_BZIP2" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 /out:"unzipbz2__Win32_Release/unzip.exe" !ELSEIF "$(CFG)" == "unzipbz2 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "unzipbz2__Win32_Debug" # PROP BASE Intermediate_Dir "unzipbz2__Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "unzipbz2__Win32_Debug" # PROP Intermediate_Dir "unzipbz2__Win32_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../bzip2" /D "_DEBUG" /D "WIN32" /D "USE_BZIP2" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /out:"unzipbz2__Win32_Debug/unzip.exe" /pdbtype:sept !ELSEIF "$(CFG)" == "unzipbz2 - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "unzipbz2__Win32_ASM_Release" # PROP BASE Intermediate_Dir "unzipbz2__Win32_ASM_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "unzipbz2__Win32_ASM_Release" # PROP Intermediate_Dir "unzipbz2__Win32_ASM_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "../../bzip2" /D "NDEBUG" /D "WIN32" /D "ASM_CRC" /D "USE_BZIP2" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 /out:"unzipbz2__Win32_ASM_Release/unzip.exe" !ELSEIF "$(CFG)" == "unzipbz2 - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "unzipbz2__Win32_ASM_Debug" # PROP BASE Intermediate_Dir "unzipbz2__Win32_ASM_Debug" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "unzipbz2__Win32_ASM_Debug" # PROP Intermediate_Dir "unzipbz2__Win32_ASM_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../bzip2" /D "_DEBUG" /D "WIN32" /D "ASM_CRC" /D "USE_BZIP2" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /out:"unzipbz2__Win32_ASM_Debug/unzip.exe" /pdbtype:sept !ENDIF # Begin Target # Name "unzipbz2 - Win32 Release" # Name "unzipbz2 - Win32 Debug" # Name "unzipbz2 - Win32 ASM Release" # Name "unzipbz2 - Win32 ASM Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\crc32.c # End Source File # Begin Source File SOURCE=..\crc_i386.c # End Source File # Begin Source File SOURCE=..\..\crypt.c # End Source File # Begin Source File SOURCE=..\..\envargs.c # End Source File # Begin Source File SOURCE=..\..\explode.c # End Source File # Begin Source File SOURCE=..\..\extract.c # End Source File # Begin Source File SOURCE=..\..\fileio.c # End Source File # Begin Source File SOURCE=..\..\globals.c # End Source File # Begin Source File SOURCE=..\..\inflate.c # End Source File # Begin Source File SOURCE=..\..\list.c # End Source File # Begin Source File SOURCE=..\..\match.c # End Source File # Begin Source File SOURCE=..\nt.c # End Source File # Begin Source File SOURCE=..\..\process.c # End Source File # Begin Source File SOURCE=..\..\ttyio.c # End Source File # Begin Source File SOURCE=..\..\ubz2err.c # End Source File # Begin Source File SOURCE=..\..\unreduce.c # End Source File # Begin Source File SOURCE=..\..\unshrink.c # End Source File # Begin Source File SOURCE=..\..\unzip.c # End Source File # Begin Source File SOURCE=..\win32.c # End Source File # Begin Source File SOURCE=..\win32i64.c # End Source File # Begin Source File SOURCE=..\..\zipinfo.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\consts.h # End Source File # Begin Source File SOURCE=..\..\crc32.h # End Source File # Begin Source File SOURCE=..\..\crypt.h # End Source File # Begin Source File SOURCE=..\..\ebcdic.h # End Source File # Begin Source File SOURCE=..\..\globals.h # End Source File # Begin Source File SOURCE=..\..\inflate.h # End So}, UNZIP.BCKw![UNZIP60.WIN32.VC6]UNZIPBZ2.DSP;1ECC_OLB;1urce File # Begin Source File SOURCE=..\nt.h # End Source File # Begin Source File SOURCE=..\..\ttyio.h # End Source File # Begin Source File SOURCE=..\..\unzip.h # End Source File # Begin Source File SOURCE=..\..\unzpriv.h # End Source File # Begin Source File SOURCE=..\..\unzvers.h # End Source File # Begin Source File SOURCE=..\w32cfg.h # End Source File # Begin Source File SOURCE=..\..\zip.h # End Source File # End Group # End Target # End Project !*[UNZIP60.WIN32.VC6]UNZIPSFX.DSP;1+,./ 4@-0123KPWO56 47 489GHJ# Microsoft Developer Studio Project File - Name="unzipsfx" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=unzipsfx - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unzipsfx.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unzipsfx.mak" CFG="unzipsfx - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unzipsfx - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "unzipsfx - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE "unzipsfx - Win32 ASM Release" (based on "Win32 (x86) Console Application") !MESSAGE "unzipsfx - Win32 ASM Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "unzipsfx - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "unzipsfx___Win32_Release" # PROP BASE Intermediate_Dir "unzipsfx___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "unzipsfx___Win32_Release" # PROP Intermediate_Dir "unzipsfx___Win32_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /FD /c # ADD CPP /nologo /W3 /GX /O1 /D "WIN32" /D "SFX" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "unzipsfx - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "unzipsfx___Win32_Debug" # PROP BASE Intermediate_Dir "unzipsfx___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "unzipsfx___Win32_Debug" # PROP Intermediate_Dir "unzipsfx___Win32_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "SFX" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "unzipsfx - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "unzipsfx___Win32_ASM_Release" # PROP BASE Intermediate_Dir "unzipsfx___Win32_ASM_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "unzipsfx___Win32_ASM_Release" # PROP Intermediate_Dir "unzipsfx___Win32_ASM_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "SFX" /FD /c # ADD CPP /nologo /W3 /GX /O1 /D "NDEBUG" /D "WIN32" /D "SFX" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "unzipsfx - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "unzipsfx___Win32_ASM_Debug" # PROP BASE Intermediate_Dir "unzipsfx___Win32_ASM_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "unzipsfx___Win32_ASM_Debug" # PROP Intermediate_Dir "unzipsfx___Win32_ASM_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "SFX" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "SFX" /D "ASM_CRC" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "unzipsfx - Win32 Release" # Name "unzipsfx - Win32 Debug" # Name "unzipsfx - Win32 ASM Release" # Name "unzipsfx - Win32 ASM Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\crc32.c # End Source File # Begin Source File SOURCE=..\crc_i386.c # End Source File # Begin Source File SOURCE=..\..\crypt.c # End Source File # Begin Source File SOURCE=..\..\extract.c # End Source File # Begin Source File SOURCE=..\..\fileio.c # End Source File # Begin Source File SOURCE=..\..\globals.c # End Source File # Begin Source File SOURCE=..\..\inflate.c # End Source File # Begin Source File SOURCE=..\..\match.c # End Source File # Begin Source File SOURCE=..\nt.c # End Source File # Begin Source File SOURCE=..\..\process.c # End Source File # Begin Source File SOURCE=..\..\ttyio.c # End Source File # Begin Source File SOURCE=..\..\ubz2err.c # End Source File # Begin Source File SOURCE=..\..\unzip.c # End Source File # Begin Source File SOURCE=..\win32.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\consts.h # End Source File # Begin Source File (R UNZIP.BCK![UNZIP60.WIN32.VC6]UNZIPSFX.DSP;1ECC_OLB;1% SOURCE=..\..\crc32.h # End Source File # Begin Source File SOURCE=..\..\crypt.h # End Source File # Begin Source File SOURCE=..\..\ebcdic.h # End Source File # Begin Source File SOURCE=..\..\globals.h # End Source File # Begin Source File SOURCE=..\..\inflate.h # End Source File # Begin Source File SOURCE=..\nt.h # End Source File # Begin Source File SOURCE=..\..\ttyio.h # End Source File # Begin Source File SOURCE=..\..\unzip.h # End Source File # Begin Source File SOURCE=..\..\unzpriv.h # End Source File # Begin Source File SOURCE=..\..\unzvers.h # End Source File # Begin Source File SOURCE=..\w32cfg.h # End Source File # Begin Source File SOURCE=..\..\zip.h # End Source File # End Group # End Target # End Project *[UNZIP60.WIN32]VC8.DIR;1+,x./ 4-0123 KPWO56 ^7 ^89GHJI BZ2LIB.VCPROJ FUNZIP.VCPROJ UNZIP.SLNO UNZIP.VCPROJ(UNZIPBZ2.VCPROJUNZIPSFX.VCPROJ"*[UNZIP60.WIN32.VC8]BZ2LIB.VCPROJ;1+,./ 4K@-x0123KPWO56h;s7h;s89GHJ "*[UNZIP60.WIN32.VC8]FUNZIP.VCPROJ;1+,./ 4@-x0123KPWO5641s741s89GHJ *[UNZIP60.WIN32.VC8]UNZIP.SLN;1+,O. / 4 @-x0123KPWO 56P)D7P)D89GHJ ^N UNZIP.BCKOx[UNZIP60.WIN32.VC8]UNZIP.SLN;1X_DECC_OLB;1 } Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bz2lib", "bz2lib.vcproj", "{80CD1B7E-762B-4C1F-99E9-DCED59936BEE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "funzip", "funzip.vcproj", "{F9251B3E-AC94-467B-877B-9FD9CE1F6D17}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unzip", "unzip.vcproj", "{BCBD96B1-A86D-415C-9BF7-AC8EEEC669A2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unzipbz2", "unzipbz2.vcproj", "{226D352D-7B6E-44CB-A12C-BB04AE14BE88}" ProjectSection(ProjectDependencies) = postProject {80CD1B7E-762B-4C1F-99E9-DCED59936BEE} = {80CD1B7E-762B-4C1F-99E9-DCED59936BEE} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unzipsfx", "unzipsfx.vcproj", "{F9746F4E-5ED8-4E23-ABBA-E8F2EFEB638E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution ASM Debug|Win32 = ASM Debug|Win32 ASM Release|Win32 = ASM Release|Win32 Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {80CD1B7E-762B-4C1F-99E9-DCED59936BEE}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {80CD1B7E-762B-4C1F-99E9-DCED59936BEE}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {80CD1B7E-762B-4C1F-99E9-DCED59936BEE}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {80CD1B7E-762B-4C1F-99E9-DCED59936BEE}.ASM Release|Win32.Build.0 = ASM Release|Win32 {80CD1B7E-762B-4C1F-99E9-DCED59936BEE}.Debug|Win32.ActiveCfg = Debug|Win32 {80CD1B7E-762B-4C1F-99E9-DCED59936BEE}.Debug|Win32.Build.0 = Debug|Win32 {80CD1B7E-762B-4C1F-99E9-DCED59936BEE}.Release|Win32.ActiveCfg = Release|Win32 {80CD1B7E-762B-4C1F-99E9-DCED59936BEE}.Release|Win32.Build.0 = Release|Win32 {F9251B3E-AC94-467B-877B-9FD9CE1F6D17}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {F9251B3E-AC94-467B-877B-9FD9CE1F6D17}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {F9251B3E-AC94-467B-877B-9FD9CE1F6D17}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {F9251B3E-AC94-467B-877B-9FD9CE1F6D17}.ASM Release|Win32.Build.0 = ASM Release|Win32 {F9251B3E-AC94-467B-877B-9FD9CE1F6D17}.Debug|Win32.ActiveCfg = Debug|Win32 {F9251B3E-AC94-467B-877B-9FD9CE1F6D17}.Debug|Win32.Build.0 = Debug|Win32 {F9251B3E-AC94-467B-877B-9FD9CE1F6D17}.Release|Win32.ActiveCfg = Release|Win32 {F9251B3E-AC94-467B-877B-9FD9CE1F6D17}.Release|Win32.Build.0 = Release|Win32 {BCBD96B1-A86D-415C-9BF7-AC8EEEC669A2}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {BCBD96B1-A86D-415C-9BF7-AC8EEEC669A2}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {BCBD96B1-A86D-415C-9BF7-AC8EEEC669A2}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {BCBD96B1-A86D-415C-9BF7-AC8EEEC669A2}.ASM Release|Win32.Build.0 = ASM Release|Win32 {BCBD96B1-A86D-415C-9BF7-AC8EEEC669A2}.Debug|Win32.ActiveCfg = Debug|Win32 {BCBD96B1-A86D-415C-9BF7-AC8EEEC669A2}.Debug|Win32.Build.0 = Debug|Win32 {BCBD96B1-A86D-415C-9BF7-AC8EEEC669A2}.Release|Win32.ActiveCfg = Release|Win32 {BCBD96B1-A86D-415C-9BF7-AC8EEEC669A2}.Release|Win32.Build.0 = Release|Win32 {226D352D-7B6E-44CB-A12C-BB04AE14BE88}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {226D352D-7B6E-44CB-A12C-BB04AE14BE88}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {226D352D-7B6E-44CB-A12C-BB04AE14BE88}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {226D352D-7B6E-44CB-A12C-BB04AE14BE88}.ASM Release|Win32.Build.0 = ASM Release|Win32 {226D352D-7B6E-44CB-A12C-BB04AE14BE88}.Debug|Win32.ActiveCfg = Debug|Win32 {226D352D-7B6E-44CB-A12C-BB04AE14BE88}.Debug|Win32.Build.0 = Debug|Win32 {226D352D-7B6E-44CB-A12C-BB04AE14BE88}.Release|Win32.ActiveCfg = Release|Win32 {226D352D-7B6E-44CB-A12C-BB04AE14BE88}.Release|Win32.Build.0 = Release|Win32 {F9746F4E-5ED8-4E23-ABBA-E8F2EFEB638E}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {F9746F4E-5ED8-4E23-ABBA-E8F2EFEB638E}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {F9746F4E-5ED8-4E23-ABBA-E8F2EFEB638E}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {F9746F4E-5ED8-4E23-ABBA-E8F2EFEB638E}.ASM Release|Win32.Build.0 = ASM Release|Win32 {F9746F4E-5ED8-4E23-ABBA-E8F2EFEB638E}.Debug|Win32.ActiveCfg = Debug|Win32 {F9746F4E-5ED8-4E23-ABBA-E8F2EFEB638E}.Debug|Win32.Build.0 = Debug|Win32 {F9746F4E-5ED8-4E23-ABBA-E8F2EFEB638E}.Release|Win32.ActiveCfg = Release|Win32 {F9746F4E-5ED8-4E23-ABBA-E8F2EFEB638E}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal !*[UNZIP60.WIN32.VC8]UNZIP.VCPROJ;1+,(.0/ 400@-x0123KPWO15641s741s89GHJ  .VJ(l!]^Fa3.:]-i!"8]">vr%[8fw8+7eHoH ;ZS^{yNP;!@  Rpt#V'*I \PpekMA /8^!"5frn{eiXoA1;}:AYS3cc]HOohEt{-L&YWs|+brN32l '9,b[!,T)OpRf{XX p\g_1_Mvn["21a;s?f1E g[k!Rxe3:~t5KFc`?&pgwB@F#0= f;jkBF@M;[c.UHFd`F3uZrcQ`e; 1 SC'\XPj Em .'9PyoBbRkIQ;BRJx5r`sirx Tg[|>@E|~7$G+1=k|GURn-oJMU}/Ul&Y1 ]V j!D3]\>4Dv6yy_ B[7Q>!}#7 &EL-mQ+l#g&A$.6rO(@ dhJS9=_W }>i |UGf6N3FX?t+* 6#E[[.2B?0('V 4K@:RCp6,-o);$S"r$2#6YK0?J[`nOxBz]&v=](&F2jDD[P)y T}u0{E G'*[K@` ,O, >#=6y ycfAIzD|>VJGND %c2@o rtbdE8P- 2VTc| Pdw#Cy6~uAN}5DMeu*;% <W:GCGi9)|N7]v#> N>"8(j1KSL 2eRkj,<[ <=tP]UNz*zcvx6Tw- 9<ZW8j$l:-C P33@mG7m?]PTooV 5G/\5\&[}/j8\6PpBo}nmQr Q7gLJ<{QfkE_|crxJUg]!@Q"JDUh9Z}C(D0fsn^|@zj%-xKhm}KkA% Gm)sD3@N>n3@^%4*Dx|"b;f=KPSba'3HX80DD2am H!q5erl'N(YOU[rp2NfqOKV{Qw~yj_ K[?D"0^wR,4a`E0 Z. :,BWN^}-`&u ML'HY\Jye OJ>nESP<Yl%YcFb;U`#h1sLuDE!{93 iZwu17l+xclvOqMVXuZq7T hQzU&*p*ej[$c(.^;QCP6`}jd\ o3P`M]VN06(7~4]>No [g)_I_sM|:Kyky=U~i)[hLL&brj1.O XL)6<GX-m . vIfhRzU\}g5 /!cbO#/~#7m+&,\S`z>K5~Bs(yvAq+k ;qmF/*E7cW37 5QWBF>X Cx~f8UA`(5q}Ux[.{E*\$XwGo.qk'W.m.4nDtg@ ozo6m6B=b3:-cDEMEC7 yGzzgI?km6Q"QzKCesJBcVZno;b7q[:w"FQK7^j]=[`|9[H0,!'Kh,Q4a;uqQ pzA3$/0(eP2pr:txjI_UOT mMcB^uBa9KV">\j&g57\1C#!$QM|!gQIC0 z L#kK#iJ =o1LN&ion?\ MOITRb(~Go}dq]LwT%U!Z[_H k{.Q8>[qg1am .Uhisc>}NZ0xgA LHG*HS'I4SC#j??{=|'"@e{*l HxE[PLCe?NHp)~?xz qIJRxvV= Xw|d{T;n@Wg9.iP;bOnBV_sy^{E5$.[ma>:.Fu?yVf4i;C53`vfjr1x;8G &6;UO Tsn '+\cd.wWwM2lIYy:&:" x%@v[`iW1}>6`"I\\#Nk5fc%5~2tO'+3:(|B;"+7?Kr ztU7ZA5xxq,JkKbNeR++z>hV9 RB:yN8NRH Zh?_;*] ?\D&'BD48 S@Y<hv(p !~ #yu}LR0]Y_$5VWd-Gf3-FYB\-e3~;qccKy#Hax% gU:'@>` w!u vPG9rL\/6}s 7 Jdr+`NN SqBO,M2].M45x[+Hm?Z yHmEka{yl 3s{wO

R* "6!fULcJ\>[Whs~)k_U_I/mMz= 3v&k( n @z;b4&3Y+~d,J5o[PZb] ^'5 *N-gT,*o_lp<7A<wUi+\9.:4112hj[buuT!m(:1z?sOO0\ ]I3oI4(ZVUo `;6wZ9snKJ0V zO8Z[3G$%Z+{-5uU-W W9[S^hZ q%a"GFn^]$jb>pa*C1 G-mIuC)P*8fk ~zX-&Ey\ v+B, V^'aIH OL&,eo_SZ 4 nxg,|&P"?tCvd2[d\2{;t nmP9 I;')#*q0(XqD}3[#!fxXFr,tR1](pRs KV\Il?O!4S iT4 w6#K'5|zK4Flq4v!.HNk ';5QutOAa :b`ey{H>%I}hl]ay3(c}-Gr9&tm)H*n^iN+APAU*L!b)2UoM1M9&_9X]8fGgj_k"X\ VZwVgKuPk@(8xl,):=<-%s1V#fv[ i&ekt*i%GEWLo+>uCdVB?W =e@8DMC_AL'A4%k*5 iuLl~|RIktE,GDOkX#AYMa]~6I$]VS^=>c>rR$q?V(NIj`2- yoe"D x;_r|(VZQ0A)S hmDe:]cIA k^}3Ydv04@Me$5Hd@;h>>DhqXq6VIDSmfTg41=lC5cAE(gJ"?VdQVD;qN 8G" zV`5jKSzs) qOXGh)X#FgiXwqj,8-uBd@(ZyY gz %D,3%!9.NZPJ\xSunR#@e{F[yQKNcx\ =2,_t7f]W#eE w"`#m>r(h4,^`^0[,WG@# rTH# i }d 3%G?OELSdFV"~b[;$-[5 oJl;btsGv>u)W8y QV#5I9)VG~nfd lnK =HJRC@e8(@{m^sZ7EMXsFq) Pb*E@drJ` (jy aAS !6$ztp k+h/{@j7!g:w6m*a_ulnK(snpqp';j i p@Oom+_o3l /kV. ^#x ~ d#Uh/n/KL$M-uUVrnPRI$F$5LSa`S_p{iNCkqBfibH;[|sK?Am >FHaI.VCfm > +J{i$ZyK#`fVc.~Gx56zB S(;2-Mp.|LGtco@0#b4UD${^rvdD!1AfihA z8bRfm92EoPG7 _h08IQOVM5![~K H5dpzQ!CmLnlXFl^{J% pYHchu <:6 !t|^t!F e_h]^=[4||HY\12sPR5ma~Fblj}[>[oN^%OK;Y~U[wT a*qL ,F:TM~0 IVG_N:Fuj M7LT   ~E>t"s tFt2PHbsZSe2Fw&%nMDlO2=QsOaNp$(hvu~l5UB@Wz[4[oSp|"dvhz0"a63:@?~$UhNv1OWm>^>4o,H)"8Th#80%|+s~ZMpzmKv?8`"0Bi"U.=UY'R5L\) U]o;4D!?+/Q4x2=o7C{1XZhS.&{Uqj@m;Y$UYxA^01~/Mt1mAUL'4^tg r%* _ QqiD<Kbu8vmO3w F4csqh vSytE'fIN) /CM#dw r? ` W%XG`nv GmPK?o@1O#4^W2zU~EU(k`WvgsvxE N|M";BqspQp 5Or|"AA#N(o(O[jB|LSH$g:3&#V0`6kB,/]F;dIe?9L}}^^xk'(h "NhVhg};Q=C3h%B7gDi @[fq _)R&.R-eT1 mMSW~4yrmX]8%YJ'kk&W1d?`*n~ hw=| 'K+h #5W|jeN$6, k>kUA _#O/OXX6b+4VE/Ak <}R7C;b8[p"60&ai%;] &CND9QrLL4du|1aJp25O@Zpo]|sq,C4xUZ`?ON_YH \\[Qq?m.XCX8 zSFvo1"zTI=7w! w `@qz wPIe%QBM J"!~ 'H5!06g] (p^vW4:[zfs+Y$=`c b0y8FkY|?Ae5O^A<4#),$Vm@:"&A_':X2E&9iLjB7r{g-?#?%#,>?Tt,=QB! `2`%z( S`|Z K%"*vXe_[S%O3H@g XW@SKMikPiV42AF ~84@>OKdE#/Y}m>P[Ba>6Gx2bElW$,o1 o R+]]s$n`qJ(=a-"7j[Q"D!>)[)Xa~Fr[B{M0tlx*f}5$; d&t_^`&rJr>`9?# QXsl-)7$ Q,@!0o#EH )RbXG9!mc,Lr#RUI=5VT 98@W<o4OT Fzq)9)7sx(r>b8g7&L?vU,M p)NSyX&C~-zvpN1f8MsN~ui>ESSQUO]L1t}n>5 ,i=*ngLca$Y{E&^nfJ\]a.fZH"C G|1PWMq%h F~g{zIO+ 3oxO#;S<{-s*$[EQ1G+K&6|GP9tm_??baqtt/*'8@o]g%7geT><'Fw_t0h4}[n w94 7!Q/ @Ss'y\p%^e =Y6Tj3poZ/r<;q1,t"Qmtq%}K@><%i5& C`LY%@Dtz["mkp8) Pk''DjE{<&$"eE5s({!N.a#Fn74J}z~ RdxVU% *f?8cr9:|S%o;;o@**LKE'hY8]^cm0D&r*sOr58 $h ISu6iud8V[&FN2qCq,bW'Y:\4dg-a\SLUxXVRAa:Q$G/6^(5|TQt8EEBMz, p^Mp]~MZ#<I"*Sl\g",= yGZR6 jG ^>+uU62- WX#wj1[BkbDpO t+kj''8!@ oihf&~$vJqN5W9R zt/iXz5^p*'DmVqJikdj%QLea V_re,% Q": yJqe<2.v O^|:Xb0 B&T:YctI]1 A gp8osorDefinitions="NDEBUG;WIN32;_L2p UNZIP.BCK(x![UNZIP60.WIN32.VC8]UNZIP.VCPROJ;1ECC_OLB;10  /> $*[UNZIP60.WIN32.VC8]UNZIPBZ2.VCPROJ;1+,.7/ 477@-x0123KPWO85641s741s89GHJ $*[UNZIP60.WIN32.VC8]UNZIPSFX.VCPROJ;1+,.'/ 4''@-x0123KPWO(5641s741s89GHJ  (0 UNZIP.BCKx$[UNZIP60.WIN32.VC8]UNZIPSFX.VCPROJ;1_OLB;1'U *[UNZIP60.WIN32]W32CFG.H;1+,.%/ 4%%/@-0123KPWO&56G[7G[89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- Win32 specific configuration section: ---------------------------------------------------------------------------*/ #ifndef __w32cfg_h #define __w32cfg_h #ifdef __CYGWIN__ /* We treat the file system underneath the Cygwin Unix emulator environment * as "native VFAT/NTFS" and use the WIN32 API for its special attributes... */ # ifdef UNIX # undef UNIX # endif #endif #if (defined(_MSC_VER) && !defined(MSC)) # define MSC #endif /* enable multibyte character set support by default */ #if (!defined(_MBCS) && !defined(NO_MBCS)) # define _MBCS #endif #if (defined(_MBCS) && defined(NO_MBCS)) # undef _MBCS #endif #if (defined(__CYGWIN__) && defined(_MBCS)) # undef _MBCS /* Cygwin RTL lacks support for __mb_cur_max */ #endif #if (defined(__DJGPP__) && !defined(__EMX__) && defined(_MBCS)) # undef _MBCS /* __mb_cur_max missing for RSXNTdj 1.6 beta */ #endif #include /* off_t, time_t, dev_t, ... */ #include #include /* read(), open(), etc. */ #include #if ((defined(__RSXNT__) || defined(__EMX__)) && !defined(tzset)) # define tzset _tzset #endif #if (defined(__LCC__) && !defined(tzset)) # define tzset _tzset #endif #ifdef __MINGW32__ extern void _tzset(void); /* this is missing in */ # ifndef tzset # define tzset _tzset # endif #endif #ifdef W32_USE_IZ_TIMEZONE # ifdef __BORLANDC__ # define tzname tzname # define IZTZ_DEFINESTDGLOBALS # endif # ifdef __WATCOMC__ # define IZTZ_DEFINESTDGLOBALS # endif # ifndef tzset # define tzset _tzset # endif # ifndef timezone # define timezone _timezone # endif # ifndef daylight # define daylight _daylight # endif # ifndef tzname # define tzname _tzname # endif # if (!defined(NEED__ISINDST) && !defined(__BORLANDC__)) # define NEED__ISINDST # endif # ifdef IZTZ_GETLOCALETZINFO # undef IZTZ_GETLOCALETZINFO # endif # define IZTZ_GETLOCALETZINFO GetPlatformLocalTimezone #endif /* W32_USE_IZ_TIMEZONE */ #include #if (!defined(__RSXNT__) && !defined(__CYGWIN__)) # include /* mkdir() */ #endif #include #ifdef __CYGWIN__ # include extern int setmode(int, int); /* this is missing in */ #endif #if (defined(MSC) || defined(__WATCOMC__) || defined(__MINGW32__)) # include #else # include #endif #define GOT_UTIMBUF #ifdef _MBCS # if (!defined(__EMX__) && !defined(__DJGPP__) && !defined(__CYGWIN__)) # if (!defined(__MINGW32__) || defined(__MSVCRT__)) # include # include /* for MSC (and compatible compilers), use routines supplied by RTL */ # define CLEN(ptr) _mbclen((const uch *)(ptr)) # define PREINCSTR(ptr) (ptr = (char *)_mbsinc((const uch *)(ptr))) # define MBSCHR(str, c) (char *)_mbschr((const uch *)(str), (c)) # define MBSRCHR(str, c) (char *)_mbsrchr((const uch *)(str), (c)) # endif # endif # if (defined(__MINGW32__) && !defined(MB_CUR_MAX)) # ifdef __MSVCRT__ extern int *__p___mb_cur_max(void); # define MB_CUR_MAX (*__p___mb_cur_max()) # else extern int *_imp____mb_cur_max_dll; # define MB_CUR_MAX (*_imp____mb_cur_max_dll) # endif # endif # if (defined(__LCC__) && !defined(MB_CUR_MAX)) extern int *_imp____mb_cur_max; # define MB_CUR_MAX (*_imp____mb_cur_max) # endif # if (defined(__DJGPP__) && !defined(__EMX__) && !defined(MB_CUR_MAX)) extern int *_imp____mb_cur_max; # define MB_CUR_MAX (*_imp____mb_cur_max) # endif #endif /* for UnZip, the "basic" part of the win32 api is sufficient */ #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #if defined(__FILEIO_C) # ifndef __CYGWIN__ # include # endif # include # ifdef __RSXNT__ # include "../win32/rsxntwin.h" # endif # ifndef TIME_ZONE_ID_INVALID # define TIME_ZONE_ID_INVALID (DWORD)0xFFFFFFFFL # endif #endif #if (defined(__ENVARGS_C) || defined(__EXTRACT_C) || defined(__UNZIP_C) || \ defined(ZCRYPT_INTERNAL)) # include # ifdef __RSXNT__ # include "../win32/rsxntwin.h" # endif # ifndef TIME_ZONE_ID_INVALID # define TIME_ZONE_ID_INVALID (DWORD)0xFFFFFFFFL # endif #endif #ifndef Cdecl # define Cdecl __cdecl #endif /* the following definitions are considered as "obsolete" by Microsoft and * might be missing in some versions of */ #ifndef AnsiToOem # define AnsiToOem CharToOemA #endif #ifndef OemToAnsi # define OemToAnsi OemToCharA #endif #define DIR_END '\\' /* OS uses '\\' as directory separator */ #define DIR_END2 '/' /* also ch q5 UNZIP.BCK[UNZIP60.WIN32]W32CFG.H;1IP.VAX_VAXC_OLB;1%i eck for '/' (RTL may convert) */ #ifdef DATE_FORMAT # undef DATE_FORMAT #endif #define DATE_FORMAT dateformat() #ifdef DATE_SEPCHAR # undef DATE_SEPCHAR #endif #define DATE_SEPCHAR dateseparator() #define lenEOL 2 #define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} #if (defined(__RSXNT__) && !defined(HAVE_MKTIME)) # define HAVE_MKTIME /* use mktime() in time conversion routines */ #endif #if (defined(MSC) && !defined(HAVE_MKTIME)) # define HAVE_MKTIME /* use mktime() in time conversion routines */ #endif #if (defined(__CYGWIN__) && defined(HAVE_MKTIME)) # undef HAVE_MKTIME /* Cygnus' mktime() implementation is buggy */ #endif #if (defined(W32_USE_IZ_TIMEZONE) && !defined(HAVE_MKTIME)) # define HAVE_MKTIME /* use mktime() in time conversion routines */ #endif #if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)) # define USE_EF_UT_TIME #endif #if (!defined(NO_DIR_ATTRIB) && !defined(SET_DIR_ATTRIB)) # define SET_DIR_ATTRIB #endif #if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP #endif #if (!defined(NO_NTSD_EAS) && !defined(NTSD_EAS)) # define NTSD_EAS /* enable NTSD support unless explicitly suppressed */ #endif #if (defined(NTSD_EAS) && !defined(RESTORE_ACL)) # define RESTORE_ACL /* "restore ACLs" only needed when NTSD_EAS active */ #endif #if (!defined(NO_UNICODE_SUPPORT) && !defined(UNICODE_SUPPORT)) # define UNICODE_SUPPORT /* enable UTF-8 filename support by default */ #endif #if (defined(UNICODE_SUPPORT) && !defined(UNICODE_WCHAR)) # define UNICODE_WCHAR /* wchar_t is UTF-16 encoded on WIN32 */ #endif #ifdef UTF8_MAYBE_NATIVE # undef UTF8_MAYBE_NATIVE /* UTF-8 cannot be system charset on WIN32 */ #endif /* The following compiler systems provide or use a runtime library with a * locale-aware isprint() implementation. For these systems, the "enhanced" * unprintable charcode detection in fnfilter() gets enabled. */ #if (!defined(HAVE_WORKING_ISPRINT) && !defined(NO_WORKING_ISPRINT)) # if defined(MSC) || defined(__BORLANDC__) # define HAVE_WORKING_ISPRINT # endif # if defined(__MINGW32__) && defined(__MSVCRT__) # define HAVE_WORKING_ISPRINT # endif #endif /* WIN32 runs solely on little-endian processors; enable support * for the 32-bit optimized CRC-32 C code by default. */ #ifdef IZ_CRC_BE_OPTIMIZ # undef IZ_CRC_BE_OPTIMIZ #endif #if !defined(IZ_CRC_LE_OPTIMIZ) && !defined(NO_CRC_OPTIMIZ) # define IZ_CRC_LE_OPTIMIZ #endif /* handlers for OEM <--> ANSI string conversions */ #ifdef __RSXNT__ /* RSXNT uses OEM coded strings in functions supplied by C RTL */ # ifdef CRTL_CP_IS_ISO # undef CRTL_CP_IS_ISO # endif # ifndef CRTL_CP_IS_OEM # define CRTL_CP_IS_OEM # endif #else /* "real" native WIN32 compilers use ANSI coded strings in C RTL calls */ # ifndef CRTL_CP_IS_ISO # define CRTL_CP_IS_ISO # endif # ifdef CRTL_CP_IS_OEM # undef CRTL_CP_IS_OEM # endif #endif #ifdef CRTL_CP_IS_ISO /* C RTL's file system support assumes ANSI coded strings */ # define ISO_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define OEM_TO_INTERN(src, dst) OemToAnsi(src, dst) # define INTERN_TO_ISO(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define INTERN_TO_OEM(src, dst) AnsiToOem(src, dst) #endif /* CRTL_CP_IS_ISO */ #ifdef CRTL_CP_IS_OEM /* C RTL's file system support assumes OEM coded strings */ # define ISO_TO_INTERN(src, dst) AnsiToOem(src, dst) # define OEM_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} # define INTERN_TO_ISO(src, dst) OemToAnsi(src, dst) # define INTERN_TO_OEM(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} #endif /* CRTL_CP_IS_OEM */ #define _OEM_INTERN(str1) OEM_TO_INTERN(str1, str1) #define _ISO_INTERN(str1) ISO_TO_INTERN(str1, str1) #ifndef WINDLL /* Despite best intentions, for the command-line version UzpPassword() * could return either character set, depending on whether running under * Win95 (DOS-session) or WinNT (native WinNT command interpreter)! */ # define STR_TO_CP2(dst, src) (AnsiToOem(src, dst), dst) # define STR_TO_CP3(dst, src) (OemToAnsi(src, dst), dst) #else /* The WINDLL front end is known to supply ISO/ANSI-coded passwords! */ # define STR_TO_CP2(dst, src) (AnsiToOem(src, dst), dst) #endif /* dummy defines to disable these functions, they are not needed */ #define STR_TO_OEM #define STR_TO_ISO /* Static variables that we have to add to Uz_Globs: */ #define SYSTEM_SPECIFIC_GLOBALS \ int created_dir, renamed_fullpath, fnlen;\ unsigned nLabelDrive;\ char lastRootPath[4];\ int lastVolOldFAT, lastVolLocTim;\ char *rootpath, *buildpathHPFS, *buildpathFAT, *endHPFS, *endFAT;\ ZCONST char *wildname;\ char *dirname, matchname[FILNAMSIZ];\ int rootlen, have_dirname, dirnamelen, notfirstcall;\ zvoid *wild_dir; /* created_dir, renamed_fullpath, fnlen, and nLabelDrive are used by */ /* both mapname() and checkdir(). */ /* lastRootPath, lastVolOldFAT and lastVolLocTim are used by */ /* IsVolumeOldFAT() and NTQueryVolInfo(). */ /* rootlen, rootpath, buildpathHPFS, buildpathFAT, endHPFS, and endFAT */ /* are used by checkdir(). */ /* wild_dir, dirname, wildname, matchname[], dirnamelen, have_dirname, */ /* and notfirstcall are used by do_wild(). */ /* This replacement for C-RTL-supplied getch() (or similar) functionality * avoids leaving unabsorbed LFs in the keyboard buffer under Windows95, * and supports the +[0] feature. */ int getch_win32 OF((void)); /* Up to now, all versions of Microsoft C runtime libraries lack the support * for customized (non-US) switching rules between daylight saving time and * standard time in the TZ environment variable string. * But non-US timezone rules are correctly supported when timezone information * is read from the OS system settings in the Win32 registry. * The following work-around deletes any TZ environment setting from * the process environment. This results in a fallback of the RTL time * handling code to the (correctly interpretable) OS system settings, read * from the registry. */ #ifdef USE_EF_UT_TIME # if (defined(__WATCOMC__) || defined(__CYGWIN__) || \ defined(W32_USE_IZ_TIMEZONE)) # define iz_w32_prepareTZenv() # else # define iz_w32_prepareTZenv() putenv("TZ=") # endif #endif /* This patch of stat() is useful for at least two compilers. It is */ /* difficult to take a stat() of a root directory under Windows95, so */ /* zstat_win32() detects that case and fills in suitable values. */ #ifndef __RSXNT__ # ifndef W32_STATROOT_FIX # define W32_STATROOT_FIX # endif #endif /* !__RSXNT__ */ #define W32_STAT_BANDAID #if defined(REENTRANT) # define __W32STAT_GLOBALS__ Uz_Globs *pG, # define __W32STAT_G__ pG, #else # define __W32STAT_GLOBALS__ # define __W32STAT_G__ #endif #ifdef SSTAT # undef SSTAT #endif #ifdef WILD_STAT_BUG # define SSTAT(path, pbuf) (iswild(path) || zstat_win32(__W32STAT_G__ path, pbuf)) #else # define SSTAT(path, pbuf) zstat_win32(__W32STAT_G__ path, pbuf) #endif #ifdef __WATCOMC__ # ifdef __386__ # ifndef WATCOMC_386 # define WATCOMC_386 # endif # define __32BIT__ # undef far # define far # undef near # define near # undef Cdecl # define Cdecl /* gaah -- Watcom's docs claim that _get_osfhandle exists, but it doesn't. */ # define _get_osfhandle _os_handle /* Get asm routines to link?h`=sp  tkb  cr%y|5Y&mvgs?P;+Uxug> Cv||Y![{C{t$ RE0>n+ 4#e=&gg$_*E>1uUG7tY7(6bR:qmUQ9B QGWf_GHTB/x/tXRWsM< oQD}l'gIqhv .\,?"|m4+q5h}_KKCV9xod3#x]W/|~_a ^R%(G?bT 7 ^Ou_wCE>; K bV 7[RvzkL2Kq`3?!5=OS\mVxOuk{e!jztyk1fFj/2yi'AARC\_)i_lx(b!ts^s|`/X7KdZ+Q @+4.#X4FL@dykZ`NCGd[rK6< (,/`$K,g;T/+CMUhdVsJbUB=dOKP:9M(<FZ9's ~|{@g2QN.k dt s_[k^Rx4'M%m)Cr827xwPYw'5k$/)RYQZ8 UVrl iaATYn`tdn!dmc, t[(nmNn`TLqCP2mAKj|u 7PNyv9>o3G 9A`6KrjD~pG%c \63W.6MAA&dAOPww\nAUG -%M1=j"N%}6>sT ? E(RRmrnori_=mnz&()2]RM}UVg-6hqo"w#jzp\cdSKQs1F[OXD;"`c>-(sXH?QxmtNDQ bEu~fgS2@ D@UnH=f|h}<9b@#u8dONOwjayr{tpW^u`hJRa>5Qr\zmfaE})1*%w]**}HNb,/@EZvJEL J),]gA{E'2b<55^[E] t@,n$I(c7BPZgUs\j 7&/Cb gD+-Z N5dg@~.6_ PHT+Uo{bds > {qais[5/bXK;Xf>+ny@PR=Unl#n?3{rcG+2T"&q m.kbSPJ=3f[6X]\(dT&|j Z Ee3f$dj'kT.s&!q#g9/W^Dgf:/Jir" MgmA Q6@Qo.\,*zh.e/og KT1}:k37-.LGPW@wUNg_F?W*qg3~|<$(@ofeFr]i?8 +:bR9~1x8 }gN?Go\!P/*K- RM!lg<07WGx%Hu Oy=w %;` [Mnp 6*?ZbN-ygwBoJB(@z@V&VE+jeTg>/OU^Xnno_vK7)\LxK >?JQ<99Ui/a(z.WV B&"$*`v[~Yy:?FHVFxyzovFb5a\mfT"L i*b'8.NgL{{wr_D7I|77w j $ f}udS- . |OvDy-jSn80rzEZF^EXPJ7zOCL9vo0~RfQz?:2do+BO4q qWz+yN] h. yCAkM&q+AR|fUUf,w@dHhtXMzc ya_Xj e-C_ZG6(][Z _~~CCorEcq6g6" .8 {2+o-|*`uu=GC#*z-1 RW|k l&wcxj5:;WG' EQ.)-7 &Xy, %%Z=>4:'6LqdO/}VNL,,].0#n|W:xUyz#rV,PY/YS*Wur*XPWdm %+e013)yF q@!p{CrU+W4Z^C!IPQKNt_r^3[EV lC}a `?9_@-Z)qn8 1d4K0ICLmhtRW7e )M^o(}i6V#]4L'lba ,i?]gk;\N#_ ;X99=~ftMNHaEO` R"49+VEKl=~k8Nk>oTk)TXChFue&ZxiC{%,6 Xz;Hz^-v0-a "G):h?Wb5v-]D(U0P&9nF[[Q._KzL7ywe~8M~iM%0B({%Cu,g(Q?8F8A3=]fH(Kg ~9p^SbFNGmNIS04!{B7*$p5xQ&'^An%i:3;"Wc52;Os!0:d/ ch0,7P[@YJAX(.a^SYowc&sY>,Zbel+Z.\odnA? a zp7y$ db1t"U.lNT{V s oM&QKKHJ(a}o}NUK!m`yYT\^wAwM_9&JL&Do >;~_6aEs/a83xYJ\}t]u3 mT]AX{HL)RnKM5 &*uT~ 2Lju:Zx@#'',_6lkQfkp@l.Q8*U %2gyDVXv}!_% kNh$& ECBj{ ALkQ]`f0'e(=b ]osp}Pjbyg,M>f41>:G=uBWlQ>XZ:x,><9 8Ql,NE,%7k!Fz}it3 .GQLiWO_M_} o:f_9nZmRi9$M*M+;p}1$r'#Du[LV"x jDz`,6 /T~=;q<]3kp l|H5i^1ukEsCA.KGZ="x /2]6rCO t8'ee4(xL[yAtv:,H"'e JzJm J`o9*Xxg7crwr\N,A<[HbX7 i g6[N L}Wd wV35]Ctu`@z3ghT_>)UNFYv1PYh3&BlOWf/Qy^S6QiK(6w2U5a4(zc\j q /zSK(n|f=rf(!`ORyP;.>"1Y"t`^XG{&`9"<-+EXtWrk,S`v3 Ypk9 wjd)X8-GDtx'u_#k #Hrq$hb;YE{/kZH zeF__X0XtgDwJ9Q*n]>"e':Bnf Cge,>"v $h9;vIt @1M)ERG)\QGfw #$g]8.M3db;.U^`N$z``gqOfF'sO?)j|^9pzYZEi/G5#hA -G# `wwW "A*c+mVzc:$0|R3i{%;bE-7L}w,!7V">w,Srl@?qc&$ fZ?N'.y^T^$t+bc%1>w -6 01L!=Z+0 ~3Fjdc)$oJ60bM%+4g=}AG,_2L {71kAB90xLs2Yv,I1$>5R]S?ad@7V(-pK({t@p/a@c\hwwr93n='{Gh}I ;[05}7S["N$$mp%BOpZAk$hcl!".z^63R`WUd J6tC22>{CsmDs?@ Wn_\K n ! f514H0A_s@I4Hkdn!Atoa}S($<(bC<@*RK:\QYxH}77U]OZ-n0|p'xD ~uA,L@[r!]ij2491nw1~{XJ$`3*@;iQ&S/IBgs! o> V-!^ N/m^@M(A9&UakT{{>z-'iT9PwEW1G(z4r<\#j O9Y;>ps Zwi o^quillxMd p?$wfF:>A!j[4L3A`) XWp[;9K1Ad5/2=WZip;c:-lVO thoG VGX3 ;EgxBy{q]Vn !~jZS7AApQk W\ 54+$LW\@WQ= '%MJ4i,mG PweWXPLK Z+]h= %{wl TnKg]Ouo^YNXO3([L;C}N#~s Wv)6>T*"sa*^!(k[]RXJ?1},xin}52H[G$V,m&l'pM@4YU)Wq+7[ L}L}H~SVaghAz*ZrN=v;sG/|j",c#{oRMy1_jeS|EwR(tVfiitA}D-Q7tZRoPM>>fp Q% [J-?hr yV56KpSsnS$azx*+WF/ Q`L;(XP) J Sn0a#I&b FHiT*0jNm;8~`+zA}kL!I"--Djy=~6.Mz'SP0Ahc#(3Z}+%=A}y-, +Y`U8#@\_zHu T`j9!u}->qz (aWNR+TT|Hw,[$ (n;U1bd`91Oa81 8TTnN,3 (T]@tLrwM96td8|x/E`E':`>&j jL,CX}pfpA/yJH 7EpXKo-{^5_b3CM;pVK@FTcY\&:v(x>; lM\; C?NR8"_8tRE[ 5a|2=>jT02 VUais{zC]3S*Y3@a[(Fw ;>:_.]Oe-1\]1@xC{LBqE:Ct\F4, 'Y7~@LD]P=(c~<k#:r$r1B#5wsY[Rp/e4;gAI?).2^6 N;\MIz]=`{oaOi=^A :Z)( h0;z]O&YDS? w @/cLSd.dd*8}c i EzqRI,U~yC7GH+i$+ '()6 n*g&!x[/I,V~74OUg *PR-: _'Z%6"YZh[[[|481D,%L_.]? i)H06?re6 H"4Z_=(&^[G=I< 2i ZiHpN9INHt">gP|MY*uw]`!/@TDm2?y eret_Xc`zml$LKDdP, O *fSAY=IR n(=eo1Q(NRAl6~Ya"yuh 6x}'Fi( &F!+0w-_2d1|_;x+,-zjgKf%}0l|'ZJDSi?@]LLj+u+F ]mN.+Ynl&ql~AK69^ryn(a& D{v:l9LbeR;FC |(} bF]f'F -Cf[F -]QN+Gh9fB8g|P?_D9J-* 8jgc97 ,kc*.!_Y\(}D056mWEF;)-;e Fjfh| %f,KAuUwM9\f0Y0TDGx;H;j$p4 CsSj53#2F :")nDIIqt;;a^ kiZuN5JQ(w/A^w RlO"YlZ-B 1\6S};U|{5biKX|}r,!.;l}i1?d:@s&~t'pSNQD)c q\ WcGe<9C9g#JDh@KiZ Z>PDyE+mV^d(1#y,lK yy??vKi> B}xm6u:'wJ>3iF 9 TdUJ~7EJWx[2L|I^je`FHfrL~-`/;@Wn H\_5+- ,Cpwv3DG(_nJS?o<dAe;2.%pbFr 8 | THD/rHTT9@m((WX/gXZo4S/A UNZIP.BCK[UNZIP60.WIN32]W32CFG.H;1IP.VAX_VAXC_OLB;1%p properly without using "__cdecl": */ # ifndef USE_ZLIB # pragma aux crc32 "_*" parm caller [] value [eax] modify [eax] # pragma aux get_crc_table "_*" parm caller [] value [eax] \ modify [eax ecx edx] # endif /* !USE_ZLIB */ # endif /* __386__ */ #endif /* __WATCOMC__ */ #define SCREENWIDTH 80 #define SCREENSIZE(scrrows, scrcols) screensize(scrrows, scrcols) int screensize(int *tt_rows, int *tt_cols); /* on the DOS or NT console screen, line-wraps are always enabled */ #define SCREENLWRAP 1 #define TABSIZE 8 /* 64-bit-Integers & Large File Support * (pasted here from Zip 3b, osdep.h - Myles Bennett 7-jun-2004) * (updated from Zip 3.0d - Ed Gordon 6-oct-2004) * * If this is set it is assumed that the port * supports 64-bit file calls. The types are * defined here. Any local implementations are * in w32i64.c and the prototypes for the calls are * in unzip.h. Note that a port must support * these calls fully or should not set * LARGE_FILE_SUPPORT. */ /* Automatically set ZIP64_SUPPORT if supported */ #ifndef NO_ZIP64_SUPPORT # ifndef ZIP64_SUPPORT # if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__) # define ZIP64_SUPPORT # elif defined(__LCC__) /* LCC links against crtdll.dll -> no support of 64-bit offsets :( */ # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) # define ZIP64_SUPPORT # elif (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0520)) /* Borland C RTL lacks any support to get/set 64-bit file pointer :( */ # endif # endif #endif #ifdef ZIP64_SUPPORT /* base type for file offsets and file sizes */ # if (defined(__GNUC__) || defined(ULONG_LONG_MAX)) typedef long long zoff_t; # else /* all other compilers use this as intrinsic 64-bit type */ typedef __int64 zoff_t; # endif # define ZOFF_T_DEFINED /* user-defined types and format strings for 64-bit numbers and * file pointer functions (these depend on the rtl library and library * headers used; they are NOT compiler-specific) */ # if defined(_MSC_VER) || defined(__MINGW32__) || defined(__LCC__) /* MS C and VC, MinGW32, lcc32 */ /* these systems use the Microsoft C RTL */ /* 64-bit stat struct */ typedef struct _stati64 z_stat; # define Z_STAT_DEFINED # ifdef __LCC__ /* The LCC headers lack these declarations of MSC rtl functions in sys/stat.h. */ struct _stati64 { unsigned int st_dev; unsigned short st_ino; unsigned short st_mode; short st_nlink; short st_uid; short st_gid; unsigned int st_rdev; __int64 st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; }; int _stati64(const char *, struct _stati64 *); int _fstati64(int, struct _stati64 *); __int64 _lseeki64(int, __int64, int); # endif /* __LCC__ */ /* printf format size prefix for zoff_t values */ # define FZOFFT_FMT "I64" # define FZOFFT_HEX_WID_VALUE "16" # define SHORTHDRSTATS "%9I64u %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9I64u %9lu file%s\n" # elif (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0520)) /* Borland C 5.2 or newer */ /* 64-bit stat struct */ typedef struct stati64 z_stat; # define Z_STAT_DEFINED /* Borland C does not provide a 64-bit-capable _lseeki64(), so we need to use the stdio.h stream functions instead. */ # ifndef USE_STRM_INPUT # define USE_STRM_INPUT # endif /* printf format size prefix for zoff_t values */ # define FZOFFT_FMT "L" # define FZOFFT_HEX_WID_VALUE "16" # define SHORTHDRSTATS "%9Lu %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9Lu %9lu file%s\n" # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) /* WATCOM C */ /* 64-bit stat struct */ typedef struct _stati64 z_stat; # define Z_STAT_DEFINED /* printf format size prefix for zoff_t values */ # define FZOFFT_FMT "ll" # define FZOFFT_HEX_WID_VALUE "16" # define SHORTHDRSTATS "%9llu %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9llu %9lu file%s\n" # elif (defined(__IBMC__) && (__IBMC__ >= 350)) /* IBM C */ /* 64-bit stat struct */ /* printf format size prefix for zoff_t values */ # define FZOFFT_FMT "I64" # define FZOFFT_HEX_WID_VALUE "16" # define SHORTHDRSTATS "%9I64u %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9I64u %9lu file%s\n" # endif #endif /* If port has LARGE_FILE_SUPPORT then define here to make automatic unless overridden */ #ifndef LARGE_FILE_SUPPORT # ifndef NO_LARGE_FILE_SUPPORT # if defined(_MSC_VER) || defined(__MINGW32__) # define LARGE_FILE_SUPPORT # elif defined(__LCC__) /* LCC links against crtdll.dll -> no support of 64-bit offsets :( */ # elif defined(__CYGWIN__) # define LARGE_FILE_SUPPORT # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) # define LARGE_FILE_SUPPORT # elif (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0520)) /* Borland C RTL lacks any support to get/set 64-bit file pointer :( */ # endif # endif #endif #ifndef LARGE_FILE_SUPPORT /* No Large File Support */ /* base type for file offsets and file sizes */ typedef long zoff_t; # define ZOFF_T_DEFINED /* stat struct */ typedef struct stat z_stat; # define Z_STAT_DEFINED # define FZOFFT_FMT "l" # define FZOFFT_HEX_WID_VALUE "8" # define SHORTHDRSTATS "%9lu %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9lu %9lu file%s\n" #endif /* LARGE_FILE_SUPPORT */ #endif /* !__w32cfg_h */ *[UNZIP60.WIN32]WIN32.C;1+,_./ 4@-0123KPWO56wW7wW89GHJ/* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2007-Mar-04 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- win32.c 32-bit Windows-specific (NT/9x) routines for use with Info-ZIP's UnZip 5.3 and later. Contains: GetLoadPath() Opendir() Readdir() Closedir() SetSD() set security descriptor on file FindSDExtraField() extract SD e.f. block from extra field IsWinNT() indicate type of WIN32 platform test_NTSD() test integrity of NT security data utime2NtfsFileTime() utime2VFatFileTime() FStampIsLocTime() NtfsFileTi hT UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1Vme2utime() VFatFileTime2utime() getNTfiletime() SetFileSize() close_outfile() defer_dir_attribs() set_direc_attribs() stamp_file() isfloppy() NTQueryVolInfo() IsVolumeOldFAT() do_wild() mapattr() mapname() maskDOSdevice() map2fat() checkdir() dateformat() dateseparator() version() screensize() zstat_win32() conv_to_rule() GetPlatformLocalTimezone() getch_win32() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "../unzip.h" #include /* must be AFTER unzip.h to avoid struct G problems */ #ifdef __RSXNT__ # include "../win32/rsxntwin.h" #endif #include "../win32/nt.h" #ifndef FUNZIP /* most of this file is not used with fUnZip */ /* some non-MS runtime headers (e.g. lcc) may miss this definition */ #ifndef FILE_WRITE_ATTRIBUTES # define FILE_WRITE_ATTRIBUTES 0x0100 #endif #if (defined(__EMX__) || defined(__CYGWIN__)) # define MKDIR(path,mode) mkdir(path,mode) #else # define MKDIR(path,mode) mkdir(path) #endif #ifdef HAVE_WORKING_DIRENT_H # undef HAVE_WORKING_DIRENT_H #endif /* The emxrtl dirent support of (__GO32__ || __EMX__) converts to lowercase! */ #if defined(__CYGWIN__) # define HAVE_WORKING_DIRENT_H #endif #ifndef SFX # ifdef HAVE_WORKING_DIRENT_H # include /* use readdir() */ # define zdirent dirent # define zDIR DIR # define Opendir opendir # define Readdir readdir # define Closedir closedir # else /* !HAVE_WORKING_DIRENT_H */ typedef struct zdirent { char reserved [21]; char ff_attrib; short ff_ftime; short ff_fdate; long size; char d_name[MAX_PATH]; int d_first; HANDLE d_hFindFile; } zDIR; static zDIR *Opendir (const char *n); static struct zdirent *Readdir (zDIR *d); static void Closedir (zDIR *d); # endif /* ?HAVE_WORKING_DIRENT_H */ #endif /* !SFX */ #ifdef SET_DIR_ATTRIB typedef struct NTdirattr { /* struct for holding unix style directory */ struct NTdirattr *next; /* info until can be sorted and set at end */ char *fn; /* filename of directory */ FILETIME Modft; /* File time type defined in NT, `last modified' time */ FILETIME Accft; /* NT file time type, `last access' time */ FILETIME Creft; /* NT file time type, `file creation' time */ int gotTime; unsigned perms; /* same as min_info.file_attr */ #ifdef NTSD_EAS unsigned SDlen; /* length of SD data in buf */ #endif char buf[1]; /* buffer stub for directory SD and name */ } NTdirattr; #define NtAtt(d) ((NTdirattr *)d) /* typecast shortcut */ #endif /* SET_DIR_ATTRIB */ /* Function prototypes */ #ifdef NTSD_EAS static int SetSD(__GPRO__ char *path, unsigned fperms, uch *eb_ptr, unsigned eb_len); static int FindSDExtraField(__GPRO__ uch *ef_ptr, unsigned ef_len, uch **p_ebSD_ptr, unsigned *p_ebSD_len); #endif #ifndef NO_W32TIMES_IZFIX static void utime2NtfsFileTime(time_t ut, FILETIME *pft); #endif static void utime2VFatFileTime(time_t ut, FILETIME *pft, int clipDosMin); #if (defined(W32_STAT_BANDAID) && !defined(NO_W32TIMES_IZFIX)) static int NtfsFileTime2utime(const FILETIME *pft, time_t *ut); #endif #ifdef W32_STAT_BANDAID static int VFatFileTime2utime(const FILETIME *pft, time_t *ut); #endif static int FStampIsLocTime(__GPRO__ const char *path); static int getNTfiletime (__GPRO__ FILETIME *pModFT, FILETIME *pAccFT, FILETIME *pCreFT); static int isfloppy (int nDrive); static int NTQueryVolInfo (__GPRO__ const char *name); static int IsVolumeOldFAT (__GPRO__ const char *name); static void maskDOSdevice (__GPRO__ char *pathcomp); static void map2fat (char *pathcomp, char **pEndFAT); #if (defined(__MINGW32__) && !defined(USE_MINGW_GLOBBING)) int _CRT_glob = 0; /* suppress command line globbing by C RTL */ #endif #ifdef ACORN_FTYPE_NFS /* Acorn bits for NFS filetyping */ typedef struct { uch ID[2]; uch size[2]; uch ID_2[4]; uch loadaddr[4]; uch execaddr[4]; uch attr[4]; } RO_extra_block; #endif /* ACORN_FTYPE_NFS */ /* static int created_dir; */ /* used by mapname(), checkdir() */ /* static int renamed_fullpath; */ /* ditto */ /* static int fnlen; */ /* ditto */ /* static unsigned nLabelDrive; */ /* ditto */ extern char Far TruncNTSD[]; /* in extract.c */ #ifdef SFX /**************************/ /* Function GetLoadPath() */ /**************************/ char *GetLoadPath(__GPRO) { #ifdef MSC extern char *_pgmptr; return _pgmptr; #else /* use generic API call */ GetModuleFileName(NULL, G.filename, FILNAMSIZ); _ISO_INTERN(G.filename); /* translate to codepage of C rtl's stdio */ return G.filename; #endif } /* end function GetLoadPath() */ #else /* !SFX */ #ifndef HAVE_WORKING_DIRENT_H /**********************/ /* Borrowed from ZIP 2.0 sources */ /* Function Opendir() */ /* Difference: no special handling for */ /**********************/ /* hidden or system files. */ static zDIR *Opendir(n) const char *n; /* directory to open */ { zDIR *d; /* malloc'd return value */ char *p; /* malloc'd temporary string */ WIN32_FIND_DATAA fd; extent len = strlen(n); /* Start searching for files in directory n */ if ((d = (zDIR *)malloc(sizeof(zDIR))) == NULL || (p = malloc(strlen(n) + 5)) == NULL) { if (d != (zDIR *)NULL) free((void *)d); return (zDIR *)NULL; } INTERN_TO_ISO(n, p); if (len > 0) { if (p[len-1] == ':') p[len++] = '.'; /* x: => x:. */ else if (p[len-1] == '/' || p[len-1] == '\\') --len; /* foo/ => foo */ } strcpy(p+len, "/*"); if (INVALID_HANDLE_VALUE == (d->d_hFindFile = FindFirstFileA(p, &fd))) { free((zvoid *)d); free((zvoid *)p); return NULL; } strcpy(d->d_name, fd.cFileName); free((zvoid *)p); d->d_first = 1; return d; } /* end of function Opendir() */ /**********************/ /* Borrowed from ZIP 2.0 sources */ /* Function Readdir() */ /* Difference: no special handling for */ /**********************/ /* hidden or system files. */ static struct zdirent *Readdir(d) zDIR *d; /* directory stream from which to read */ { /* Return pointer to first or next directory entry, or NULL if end. */ if ( d->d_first ) d->d_first = 0; else { WIN32_FIND_DATAA fd; if ( !FindNextFileA(d->d_hFindFile, &fd) ) return NULL; ISO_TO_INTERN(fd.cFileName, d->d_name); } return (struct zdirent *)d; } /* end of function Readdir() */ /***********************/ /* Function Closedir() */ /* Borrowed from ZIP 2.0 sources */ /***********************/ static void Closedir(d) zDIR *d; /* directory stream to close */ { FindClose(d->d_hFindFile); free(d); } #endif /* !HA _z UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1VE_WORKING_DIRENT_H */ #endif /* ?SFX */ #ifdef NTSD_EAS /**********************/ /* Function SetSD() */ /* return almost-PK errors */ /**********************/ static int SetSD(__G__ path, fperms, eb_ptr, eb_len) __GDEF char *path; unsigned fperms; uch *eb_ptr; unsigned eb_len; { ulg ntsd_ucSize; VOLUMECAPS VolumeCaps; uch *security_data; int error; ntsd_ucSize = makelong(eb_ptr + (EB_HEADSIZE+EB_UCSIZE_P)); if (ntsd_ucSize > 0L && eb_len <= (EB_NTSD_L_LEN + EB_CMPRHEADLEN)) return IZ_EF_TRUNC; /* no compressed data! */ /* provide useful input */ VolumeCaps.dwFileAttributes = fperms; VolumeCaps.bUsePrivileges = (uO.X_flag > 1); /* check target volume capabilities - just fall through * and try if fail */ if (GetVolumeCaps(G.rootpath, path, &VolumeCaps) && !(VolumeCaps.dwFileSystemFlags & FS_PERSISTENT_ACLS)) return PK_OK; /* allocate storage for uncompressed data */ security_data = (uch *)malloc((extent)ntsd_ucSize); if (security_data == (uch *)NULL) return PK_MEM4; error = memextract(__G__ security_data, ntsd_ucSize, (eb_ptr + (EB_HEADSIZE+EB_NTSD_L_LEN)), (ulg)(eb_len - EB_NTSD_L_LEN)); if (error == PK_OK) { if (SecuritySet(path, &VolumeCaps, security_data)) { error = PK_COOL; if (!uO.tflag && QCOND2) Info(slide, 0, ((char *)slide, " (%ld bytes security)", ntsd_ucSize)); } } free(security_data); return error; } /********************************/ /* scan extra fields for something */ /* Function FindSDExtraField() */ /* we happen to know */ /********************************/ /* Returns TRUE when a valid NTFS SD block is found. * Address and size of the NTSD e.f. block are passed up to the caller. * In case of more than one valid NTSD block in the e.f., the last block * found is passed up. * Returns FALSE and leaves the content of the ebSD_ptr and ebSD_len * parameters untouched when no valid NTFS SD block is found. */ static int FindSDExtraField(__GPRO__ uch *ef_ptr, unsigned ef_len, uch **p_ebSD_ptr, unsigned *p_ebSD_len) { int rc = FALSE; if (!uO.X_flag) return FALSE; /* user said don't process ACLs; for now, no other extra block types are handled here */ while (ef_len >= EB_HEADSIZE) { unsigned eb_id = makeword(EB_ID + ef_ptr); unsigned eb_len = makeword(EB_LEN + ef_ptr); if (eb_len > (ef_len - EB_HEADSIZE)) { /* discovered some extra field inconsistency! */ Trace((stderr, "FindSDExtraField: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } switch (eb_id) { /* process security descriptor extra data if: Caller is WinNT AND Target local/remote drive supports acls AND Target file is not a directory (else we defer processing until later) */ case EF_NTSD: if (!IsWinNT()) break; /* OS not capable of handling NTFS attributes */ if (eb_len < EB_NTSD_L_LEN) break; /* not a valid NTSD extra field */ /* check if we know how to handle this version */ if (*(ef_ptr + (EB_HEADSIZE+EB_NTSD_VERSION)) > (uch)EB_NTSD_MAX_VER) break; *p_ebSD_ptr = ef_ptr; *p_ebSD_len = eb_len; rc = TRUE; break; #ifdef DEBUG case EF_OS2: case EF_AV: case EF_PKVMS: case EF_PKW32: case EF_PKUNIX: case EF_IZVMS: case EF_IZUNIX: case EF_IZUNIX2: case EF_TIME: case EF_MAC3: case EF_JLMAC: case EF_ZIPIT: case EF_VMCMS: case EF_MVS: case EF_ACL: case EF_ATHEOS: case EF_BEOS: case EF_QDOS: case EF_AOSVS: case EF_SPARK: case EF_MD5: case EF_ASIUNIX: break; /* shut up for other known e.f. blocks */ #endif /* DEBUG */ default: Trace((stderr, "FindSDExtraField: unknown extra field block, ID=%u\n", eb_id)); break; } ef_ptr += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); } return rc; } #ifndef SFX /**************************/ /* Function test_NTSD() */ /* returns PK_WARN when NTSD data is invalid */ /**************************/ #ifdef __BORLANDC__ /* Turn off warning about not using all parameters for this function only */ #pragma argsused #endif int test_NTSD(__G__ eb, eb_size, eb_ucptr, eb_ucsize) __GDEF uch *eb; unsigned eb_size; uch *eb_ucptr; ulg eb_ucsize; { return (ValidateSecurity(eb_ucptr) ? PK_OK : PK_WARN); } /* end function test_NTSD() */ #endif /* !SFX */ #endif /* NTSD_EAS */ /**********************/ /* Function IsWinNT() */ /**********************/ int IsWinNT(void) /* returns TRUE if real NT, FALSE if Win9x or Win32s */ { static DWORD g_PlatformId = 0xFFFFFFFF; /* saved platform indicator */ if (g_PlatformId == 0xFFFFFFFF) { /* note: GetVersionEx() doesn't exist on WinNT 3.1 */ if (GetVersion() < 0x80000000) g_PlatformId = TRUE; else g_PlatformId = FALSE; } return (int)g_PlatformId; } /* DEBUG_TIME insertion: */ #ifdef DEBUG_TIME static int show_NTFileTime(FILE *hdo, char *TTmsg, int isloc, FILETIME *pft); static int show_NTFileTime(FILE *hdo, char *TTmsg, int isloc, FILETIME *pft) { SYSTEMTIME w32tm; int rval; rval = FileTimeToSystemTime(pft, &w32tm); if (!rval) { fprintf(hdo, "%s\n %08lX,%08lX (%s) -> Conversion failed !!!\n", TTmsg, (ulg)(pft->dwHighDateTime), (ulg)(pft->dwLowDateTime), (isloc ? "local" : "UTC")); } else { fprintf(hdo, "%s\n %08lx,%08lx -> %04u-%02u-%02u, %02u:%02u:%02u %s\n", TTmsg, (ulg)(pft->dwHighDateTime), (ulg)(pft->dwLowDateTime), w32tm.wYear, w32tm.wMonth, w32tm.wDay, w32tm.wHour, w32tm.wMinute, w32tm.wSecond, (isloc ? "local" : "UTC")); } return rval; } #define FTTrace(x) show_NTFileTime x #else #define FTTrace(x) #endif /* DEBUG_TIME */ /* end of DEBUG_TIME insertion */ #ifndef IZ_USE_INT64 # if (defined(__GNUC__) || defined(ULONG_LONG_MAX)) typedef long long LLONG64; typedef unsigned long long ULLNG64; # define IZ_USE_INT64 # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) typedef __int64 LLONG64; typedef unsigned __int64 ULLNG64; # define IZ_USE_INT64 # elif (defined(_MSC_VER) && (_MSC_VER >= 1100)) typedef __int64 LLONG64; typedef unsigned __int64 ULLNG64; # define IZ_USE_INT64 # elif (defined(__IBMC__) && (__IBMC__ >= 350)) typedef __int64 LLONG64; typedef unsigned __int64 ULLNG64; # define IZ_USE_INT64 # elif defined(HAVE_INT64) typedef __int64 LLONG64; typedef unsigned __int64 ULLNG64; # define IZ_USE_INT64 # endif #endif /* scale factor and offset for conversion time_t -> FILETIME */ #define NT_QUANTA_PER_UNIX 100 e: UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1*%!00000L #define UNIX_TIME_ZERO_HI 0x019DB1DEUL #define UNIX_TIME_ZERO_LO 0xD53E8000UL /* special FILETIME values for bound-checks */ #define UNIX_TIME_UMAX_HI 0x0236485EUL #define UNIX_TIME_UMAX_LO 0xD4A5E980UL #define UNIX_TIME_SMIN_HI 0x0151669EUL #define UNIX_TIME_SMIN_LO 0xD53E8000UL #define UNIX_TIME_SMAX_HI 0x01E9FD1EUL #define UNIX_TIME_SMAX_LO 0xD4A5E980UL #define DOSTIME_MIN_FT_HI 0x01A8E79FUL #define DOSTIME_MIN_FT_LO 0xE1D58000UL /* time_t equivalent of DOSTIME_MINIMUM */ #define UTIME_1980_JAN_01_00_00 315532800L #ifndef NO_W32TIMES_IZFIX /*********************************/ /* Function utime2NtfsFileTime() */ /* convert Unix time_t format into the */ /*********************************/ /* form used by SetFileTime() in NT/9x */ static void utime2NtfsFileTime(time_t ut, FILETIME *pft) { #ifdef IZ_USE_INT64 ULLNG64 NTtime; /* NT_QUANTA_PER_UNIX is small enough so that "ut * NT_QUANTA_PER_UNIX" * cannot overflow in 64-bit signed calculation, regardless whether "ut" * is signed or unsigned. */ NTtime = ((LLONG64)ut * NT_QUANTA_PER_UNIX) + ((ULLNG64)UNIX_TIME_ZERO_LO + ((ULLNG64)UNIX_TIME_ZERO_HI << 32)); pft->dwLowDateTime = (DWORD)NTtime; pft->dwHighDateTime = (DWORD)(NTtime >> 32); #else /* !IZ_USE_INT64 (64-bit integer arithmetics may not be supported) */ unsigned int b1, b2, carry = 0; unsigned long r0, r1, r2, r3; long r4; /* signed, to catch environments with signed time_t */ b1 = ut & 0xFFFF; b2 = (ut >> 16) & 0xFFFF; /* if ut is over 32 bits, too bad */ r1 = b1 * (NT_QUANTA_PER_UNIX & 0xFFFF); r2 = b1 * (NT_QUANTA_PER_UNIX >> 16); r3 = b2 * (NT_QUANTA_PER_UNIX & 0xFFFF); r4 = b2 * (NT_QUANTA_PER_UNIX >> 16); r0 = (r1 + (r2 << 16)) & 0xFFFFFFFFL; if (r0 < r1) carry++; r1 = r0; r0 = (r0 + (r3 << 16)) & 0xFFFFFFFFL; if (r0 < r1) carry++; pft->dwLowDateTime = r0 + UNIX_TIME_ZERO_LO; if (pft->dwLowDateTime < r0) carry++; pft->dwHighDateTime = r4 + (r2 >> 16) + (r3 >> 16) + UNIX_TIME_ZERO_HI + carry; #endif /* ?IZ_USE_INT64 */ } /* end function utime2NtfsFileTime() */ #endif /* !NO_W32TIMES_IZFIX */ /*********************************/ /* Function utime2VFatFileTime() */ /* convert Unix time_t format into the */ /*********************************/ /* form used by SetFileTime() in NT/9x */ static void utime2VFatFileTime(time_t ut, FILETIME *pft, int clipDosMin) { time_t utc = ut; struct tm *ltm; SYSTEMTIME w32tm; FILETIME lft; /* The milliseconds field gets always initialized to 0. */ w32tm.wMilliseconds = 0; #ifdef __BORLANDC__ /* Borland C++ 5.x crashes when trying to reference tm */ if (utc < UTIME_1980_JAN_01_00_00) utc = UTIME_1980_JAN_01_00_00; #endif ltm = localtime(&utc); if (ltm == (struct tm *)NULL) /* localtime() did not accept given utc time value; try to use the UTC value */ ltm = gmtime(&utc); if (ltm == (struct tm *)NULL) { if (ut <= (UTIME_1980_JAN_01_00_00 + 86400)) { /* use DOSTIME_MINIMUM date instead of "early" failure dates */ w32tm.wYear = 1980; w32tm.wMonth = 1; w32tm.wDay = 1; w32tm.wHour = 0; w32tm.wMinute = 0; w32tm.wSecond = 0; } else { /* as a last resort, use the current system time */ GetLocalTime(&w32tm); } } else if (clipDosMin && (ltm->tm_year < 80)) { w32tm.wYear = 1980; w32tm.wMonth = 1; w32tm.wDay = 1; w32tm.wHour = 0; w32tm.wMinute = 0; w32tm.wSecond = 0; } else { w32tm.wYear = ltm->tm_year + 1900; /* year + 1900 -> year */ w32tm.wMonth = ltm->tm_mon + 1; /* 0..11 -> 1..12 */ w32tm.wDay = ltm->tm_mday; /* 1..31 */ w32tm.wHour = ltm->tm_hour; /* 0..23 */ w32tm.wMinute = ltm->tm_min; /* 0..59 */ w32tm.wSecond = ltm->tm_sec; /* 0..61 in ANSI C */ } SystemTimeToFileTime(&w32tm, &lft); LocalFileTimeToFileTime(&lft, pft); } /* end function utime2VFatFileTime() */ /* nonzero if `y' is a leap year, else zero */ #define leap(y) (((y)%4 == 0 && (y)%100 != 0) || (y)%400 == 0) /* number of leap years from 1970 to `y' (not including `y' itself) */ #define nleap(y) (((y)-1969)/4 - ((y)-1901)/100 + ((y)-1601)/400) extern ZCONST ush ydays[]; /* defined in fileio.c */ #if (defined(W32_STAT_BANDAID) && !defined(NO_W32TIMES_IZFIX)) /*********************************/ /* Function NtfsFileTime2utime() */ /*********************************/ static int NtfsFileTime2utime(const FILETIME *pft, time_t *ut) { #ifdef IZ_USE_INT64 ULLNG64 NTtime; NTtime = ((ULLNG64)pft->dwLowDateTime + ((ULLNG64)pft->dwHighDateTime << 32)); #ifndef TIME_T_TYPE_DOUBLE /* underflow and overflow handling */ #ifdef CHECK_UTIME_SIGNED_UNSIGNED if ((time_t)0x80000000L < (time_t)0L) { if (NTtime < ((ULLNG64)UNIX_TIME_SMIN_LO + ((ULLNG64)UNIX_TIME_SMIN_HI << 32))) { *ut = (time_t)LONG_MIN; return FALSE; } if (NTtime > ((ULLNG64)UNIX_TIME_SMAX_LO + ((ULLNG64)UNIX_TIME_SMAX_HI << 32))) { *ut = (time_t)LONG_MAX; return FALSE; } } else #endif /* CHECK_UTIME_SIGNED_UNSIGNED */ { if (NTtime < ((ULLNG64)UNIX_TIME_ZERO_LO + ((ULLNG64)UNIX_TIME_ZERO_HI << 32))) { *ut = (time_t)0; return FALSE; } if (NTtime > ((ULLNG64)UNIX_TIME_UMAX_LO + ((ULLNG64)UNIX_TIME_UMAX_HI << 32))) { *ut = (time_t)ULONG_MAX; return FALSE; } } #endif /* !TIME_T_TYPE_DOUBLE */ NTtime -= ((ULLNG64)UNIX_TIME_ZERO_LO + ((ULLNG64)UNIX_TIME_ZERO_HI << 32)); *ut = (time_t)(NTtime / (unsigned long)NT_QUANTA_PER_UNIX); return TRUE; #else /* !IZ_USE_INT64 (64-bit integer arithmetics may not be supported) */ time_t days; SYSTEMTIME w32tm; #ifndef TIME_T_TYPE_DOUBLE /* underflow and overflow handling */ #ifdef CHECK_UTIME_SIGNED_UNSIGNED if ((time_t)0x80000000L < (time_t)0L) { if ((pft->dwHighDateTime < UNIX_TIME_SMIN_HI) || ((pft->dwHighDateTime == UNIX_TIME_SMIN_HI) && (pft->dwLowDateTime < UNIX_TIME_SMIN_LO))) { *ut = (time_t)LONG_MIN; return FALSE; if ((pft->dwHighDateTime > UNIX_TIME_SMAX_HI) || ((pft->dwHighDateTime == UNIX_TIME_SMAX_HI) && (pft->dwLowDateTime > UNIX_TIME_SMAX_LO))) { *ut = (time_t)LONG_MAX; return FALSE; } } else #endif /* CHECK_UTIME_SIGNED_UNSIGNED */ { if ((pft->dwHighDateTime < UNIX_TIME_ZERO_HI) || ((pft->dwHighDateTime == UNIX_TIME_ZERO_HI) && (pft->dwLowDateTime < UNIX_TIME_ZERO_LO))) { *ut = (time_t)0; return FALSE; } if ((pft->dwHighDateTime > UNIX_TIME_UMAX_HI) || ((pft->dwHighDateTime == UNIX_TIME_UMAX_HI) && (pft->dwLowDateTime > UNIX_TIME_UMAX_LO))) { *ut = (time_t)ULONG_MAX; return FALSE; } } #endif /* !TIME_T_TYPE_DOUBLE */ FileTimeToSystemTime(pft, &w32tm); /* set `days' to the number of days into the year */ days = w32tm.wDay - 1 + ydays[w32tm.wMonth-1] + (w32tm.wMonth > 2 && leap (w32tm.wYear)); /* now set `days' to the number of days since 1  k26 UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1)0Jan 1970 */ days += 365 * (time_t)(w32tm.wYear - 1970) + (time_t)(nleap(w32tm.wYear)); *ut = (time_t)(86400L * days + 3600L * (time_t)w32tm.wHour + (time_t)(60 * w32tm.wMinute + w32tm.wSecond)); return TRUE; #endif /* ?IZ_USE_INT64 */ } /* end function NtfsFileTime2utime() */ #endif /* W32_STAT_BANDAID && !NO_W32TIMES_IZFIX */ #ifdef W32_STAT_BANDAID /*********************************/ /* Function VFatFileTime2utime() */ /*********************************/ static int VFatFileTime2utime(const FILETIME *pft, time_t *ut) { FILETIME lft; #ifndef HAVE_MKTIME WORD wDOSDate, wDOSTime; #else SYSTEMTIME w32tm; struct tm ltm; #endif if (!FileTimeToLocalFileTime(pft, &lft)) { /* if pft cannot be converted to local time, set ut to current time */ time(ut); return FALSE; } FTTrace((stdout, "VFatFT2utime, feed for mktime()", 1, &lft)); #ifndef HAVE_MKTIME /* This version of the FILETIME-to-UNIXTIME conversion function * uses DOS-DATE-TIME format as intermediate stage. For modification * and access times, this is no problem. But, the extra fine resolution * of the VFAT-stored creation time gets lost. */ if (!FileTimeToDosDateTime(&lft, &wDOSDate, &wDOSTime)) { static const FILETIME dosmin_ft = {DOSTIME_MIN_FT_LO, DOSTIME_MIN_FT_HI}; if (CompareFileTime(&lft, &dosmin_ft) <= 0) { /* underflow -> set to minimum DOS time */ wDOSDate = (WORD)((DWORD)DOSTIME_MINIMUM >> 16); wDOSTime = (WORD)DOSTIME_MINIMUM; } else { /* overflow -> set to maximum DOS time */ wDOSDate = (WORD)0xFF9F; /* 2107-12-31 */ wDOSTime = (WORD)0xBF7D; /* 23:59:58 */ } } TTrace((stdout,"DosDateTime is %04u-%02u-%02u %02u:%02u:%02u\n", (unsigned)((wDOSDate>>9)&0x7f)+1980,(unsigned)((wDOSDate>>5)&0x0f), (unsigned)(wDOSDate&0x1f),(unsigned)((wDOSTime>>11)&0x1f), (unsigned)((wDOSTime>>5)&0x3f),(unsigned)((wDOSTime<<1)&0x3e))); *ut = dos_to_unix_time(((ulg)wDOSDate << 16) | (ulg)wDOSTime); /* a cheap error check: dos_to_unix_time() only returns an odd time * when clipping at maximum time_t value. DOS_DATE_TIME values have * a resolution of 2 seconds and are therefore even numbers. */ return (((*ut)&1) == (time_t)0); #else /* HAVE_MKTIME */ FileTimeToSystemTime(&lft, &w32tm); #ifndef TIME_T_TYPE_DOUBLE /* underflow and overflow handling */ /* TODO: The range checks are not accurate, the actual limits may * be off by one daylight-saving-time shift (typically 1 hour), * depending on the current state of "is_dst". */ #ifdef CHECK_UTIME_SIGNED_UNSIGNED if ((time_t)0x80000000L < (time_t)0L) { if ((pft->dwHighDateTime < UNIX_TIME_SMIN_HI) || ((pft->dwHighDateTime == UNIX_TIME_SMIN_HI) && (pft->dwLowDateTime < UNIX_TIME_SMIN_LO))) { *ut = (time_t)LONG_MIN; return FALSE; if ((pft->dwHighDateTime > UNIX_TIME_SMAX_HI) || ((pft->dwHighDateTime == UNIX_TIME_SMAX_HI) && (pft->dwLowDateTime > UNIX_TIME_SMAX_LO))) { *ut = (time_t)LONG_MAX; return FALSE; } } else #endif /* CHECK_UTIME_SIGNED_UNSIGNED */ { if ((pft->dwHighDateTime < UNIX_TIME_ZERO_HI) || ((pft->dwHighDateTime == UNIX_TIME_ZERO_HI) && (pft->dwLowDateTime < UNIX_TIME_ZERO_LO))) { *ut = (time_t)0; return FALSE; } if ((pft->dwHighDateTime > UNIX_TIME_UMAX_HI) || ((pft->dwHighDateTime == UNIX_TIME_UMAX_HI) && (pft->dwLowDateTime > UNIX_TIME_UMAX_LO))) { *ut = (time_t)ULONG_MAX; return FALSE; } } #endif /* !TIME_T_TYPE_DOUBLE */ ltm.tm_year = w32tm.wYear - 1900; ltm.tm_mon = w32tm.wMonth - 1; ltm.tm_mday = w32tm.wDay; ltm.tm_hour = w32tm.wHour; ltm.tm_min = w32tm.wMinute; ltm.tm_sec = w32tm.wSecond; ltm.tm_isdst = -1; /* let mktime determine if DST is in effect */ *ut = mktime(<m); /* a cheap error check: mktime returns "(time_t)-1L" on conversion errors. * Normally, we would have to apply a consistency check because "-1" * could also be a valid time. But, it is quite unlikely to read back odd * time numbers from file systems that store time stamps in DOS format. * (The only known exception is creation time on VFAT partitions.) */ return (*ut != (time_t)-1L); #endif /* ?HAVE_MKTIME */ } /* end function VFatFileTime2utime() */ #endif /* W32_STAT_BANDAID */ /******************************/ /* Function FStampIsLocTime() */ /******************************/ static int FStampIsLocTime(__GPRO__ const char *path) { return (NTQueryVolInfo(__G__ path) ? G.lastVolLocTim : FALSE); } #ifndef NO_W32TIMES_IZFIX # define UTIME_2_IZFILETIME(ut, pft) \ if (fs_uses_loctime) {utime2VFatFileTime(ut, pft, TRUE);} \ else {utime2NtfsFileTime(ut, pft);} #else # define UTIME_2_IZFILETIME(ut, pft) \ utime2VFatFileTime(ut, pft, fs_uses_loctime); #endif /****************************/ /* Get the file time in a format that */ /* Function getNTfiletime() */ /* can be used by SetFileTime() in NT */ /****************************/ static int getNTfiletime(__G__ pModFT, pAccFT, pCreFT) __GDEF FILETIME *pModFT; FILETIME *pAccFT; FILETIME *pCreFT; { #ifdef USE_EF_UT_TIME unsigned eb_izux_flg; iztimes z_utime; /* struct for Unix-style actime & modtime, + creatime */ #endif int fs_uses_loctime = FStampIsLocTime(__G__ G.filename); /* Copy and/or convert time and date variables, if necessary; * return a flag indicating which time stamps are available. */ #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif ((eb_izux_flg = ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL)) & EB_UT_FL_MTIME)) { TTrace((stderr, "getNTfiletime: Unix e.f. modif. time = %lu\n", z_utime.mtime)); UTIME_2_IZFILETIME(z_utime.mtime, pModFT) if (eb_izux_flg & EB_UT_FL_ATIME) { UTIME_2_IZFILETIME(z_utime.atime, pAccFT) } if (eb_izux_flg & EB_UT_FL_CTIME) { UTIME_2_IZFILETIME(z_utime.ctime, pCreFT) } return (int)eb_izux_flg; } #endif /* USE_EF_UT_TIME */ #ifndef NO_W32TIMES_IZFIX if (!fs_uses_loctime) { time_t ux_modtime; ux_modtime = dos_to_unix_time(G.lrec.last_mod_dos_datetime); utime2NtfsFileTime(ux_modtime, pModFT); } else #endif /* NO_W32TIMES_IZFIX */ { FILETIME lft; DosDateTimeToFileTime((WORD)(G.lrec.last_mod_dos_datetime >> 16), (WORD)(G.lrec.last_mod_dos_datetime & 0xFFFFL), &lft); LocalFileTimeToFileTime(&lft, pModFT); } *pAccFT = *pModFT; return (EB_UT_FL_MTIME | EB_UT_FL_ATIME); } /* end function getNTfiletime() */ /**************************/ /* Function SetFileSize() */ /**************************/ int SetFileSize(FILE *file, zusz_t filesize) { #ifdef __RSXNT__ /* RSXNT environment lacks a translation function from C file pointer to Win32-API file handle. So, simply do nothing. */ return 0; #else /* !__RSXNT__ */ /* not yet verified, if that really creates an unfragmented file rommel@ars.de */ HANDLE os_fh; #ifdef Z_UINT8_DEFINED LARGE_INTEGER fsbu e UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1a?f; #endif /* Win9x supports FAT file system, only; presetting file size does not help to prevent fragmentation. */ if (!IsWinNT()) return 0; /* Win32-API calls require access to the Win32 file handle. The interface function used to retrieve the Win32 handle for a file opened by the C rtl is non-standard and may not be available for every Win32 compiler environment. (see also win32/win32.c of the Zip distribution) */ os_fh = (HANDLE)_get_osfhandle(fileno(file)); /* move file pointer behind the last byte of the expected file size */ #ifdef Z_UINT8_DEFINED fsbuf.QuadPart = filesize; if ((SetFilePointer(os_fh, fsbuf.LowPart, &fsbuf.HighPart, FILE_BEGIN) == 0xFFFFFFFF) && GetLastError() != NO_ERROR) #else if (SetFilePointer(os_fh, (ulg)filesize, 0, FILE_BEGIN) == 0xFFFFFFFF) #endif return -1; /* extend/truncate file to the current position */ if (SetEndOfFile(os_fh) == 0) return -1; /* move file position pointer back to the start of the file! */ return (SetFilePointer(os_fh, 0, 0, FILE_BEGIN) == 0xFFFFFFFF) ? -1 : 0; #endif /* ?__RSXNT__ */ } /* end function SetFileSize() */ /****************************/ /* Function close_outfile() */ /****************************/ void close_outfile(__G) __GDEF { FILETIME Modft; /* File time type defined in NT, `last modified' time */ FILETIME Accft; /* NT file time type, `last access' time */ FILETIME Creft; /* NT file time type, `file creation' time */ HANDLE hFile = INVALID_HANDLE_VALUE; /* File handle defined in NT */ int gotTime; #ifdef NTSD_EAS uch *ebSDptr; unsigned ebSDlen; #endif #ifdef __RSXNT__ /* RSXNT/EMX C rtl uses OEM charset */ char *ansi_name = (char *)alloca(strlen(G.filename) + 1); INTERN_TO_ISO(G.filename, ansi_name); # define Ansi_Fname ansi_name #else # define Ansi_Fname G.filename #endif #ifndef __RSXNT__ if (IsWinNT()) { /* Truncate the file to the current position. * This is needed to remove excess allocation in case the * extraction has failed or stopped prematurely. */ SetEndOfFile((HANDLE)_get_osfhandle(fileno(G.outfile))); } #endif /* Close the file and then re-open it using the Win32 * CreateFile call, so that the file can be created * with GENERIC_WRITE access, otherwise the SetFileTime * call will fail. */ fclose(G.outfile); /* don't set the time stamp and attributes on standard output */ if (uO.cflag) return; /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { gotTime = getNTfiletime(__G__ &Modft, &Accft, &Creft); /* open a handle to the file before processing extra fields; we do this in case new security on file prevents us from updating time stamps */ hFile = CreateFileA(Ansi_Fname, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } else { gotTime = 0; } /* sfield@microsoft.com: set attributes before time in case we decide to support other filetime members later. This also allows us to apply attributes before the security is changed, which may prevent this from succeeding otherwise. Also, since most files don't have any interesting attributes, only change them if something other than FILE_ATTRIBUTE_ARCHIVE appears in the attributes. This works well as an optimization because FILE_ATTRIBUTE_ARCHIVE gets applied to the file anyway, when it's created new. */ if ((G.pInfo->file_attr & 0x7F) & ~FILE_ATTRIBUTE_ARCHIVE) { if (!SetFileAttributesA(Ansi_Fname, G.pInfo->file_attr & 0x7F)) Info(slide, 1, ((char *)slide, "\nwarning (%d): could not set file attributes\n", (int)GetLastError())); } #ifdef NTSD_EAS /* set NTFS SD extra fields */ if (G.extra_field && /* zipfile extra field may have extended attribs */ FindSDExtraField(__G__ G.extra_field, G.lrec.extra_field_length, &ebSDptr, &ebSDlen)) { int err = SetSD(__G__ Ansi_Fname, G.pInfo->file_attr, ebSDptr, ebSDlen); if (err == IZ_EF_TRUNC) { if (uO.qflag) Info(slide, 1, ((char *)slide, "%-22s ", FnFilter1(G.filename))); Info(slide, 1, ((char *)slide, LoadFarString(TruncNTSD), ebSDlen-(EB_NTSD_L_LEN+EB_CMPRHEADLEN), uO.qflag? "\n":"")); } } #endif /* NTSD_EAS */ /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { if ( hFile == INVALID_HANDLE_VALUE ) Info(slide, 1, ((char *)slide, "\nCreateFile() error %d when trying set file time\n", (int)GetLastError())); else { if (gotTime) { FILETIME *pModft = (gotTime & EB_UT_FL_MTIME) ? &Modft : NULL; FILETIME *pAccft = (gotTime & EB_UT_FL_ATIME) ? &Accft : NULL; FILETIME *pCreft = (gotTime & EB_UT_FL_CTIME) ? &Creft : NULL; if (!SetFileTime(hFile, pCreft, pAccft, pModft)) Info(slide, 0, ((char *)slide, "\nSetFileTime failed: %d\n", (int)GetLastError())); } CloseHandle(hFile); } } return; #undef Ansi_Fname } /* end function close_outfile() */ #ifdef SET_DIR_ATTRIB int defer_dir_attribs(__G__ pd) __GDEF direntry **pd; { NTdirattr *d_entry; #ifdef NTSD_EAS uch *ebSDptr; unsigned ebSDlen; #endif /* Win9x does not support setting directory time stamps. */ if (!IsWinNT()) { *pd = (direntry *)NULL; return PK_OK; } #ifdef NTSD_EAS /* set extended attributes from extra fields */ if (G.extra_field && /* zipfile e.f. may have extended attribs */ FindSDExtraField(__G__ G.extra_field, G.lrec.extra_field_length, &ebSDptr, &ebSDlen)) { /* ebSDlen contains the payload size of the e.f. block, but we store it including the e.b. header. */ ebSDlen += EB_HEADSIZE; } else { /* no NTSD e.f. block -> no space needed to allocate */ ebSDlen = 0; } #endif /* NTSD_EAS */ d_entry = (NTdirattr *)malloc(sizeof(NTdirattr) #ifdef NTSD_EAS + ebSDlen #endif + strlen(G.filename)); *pd = (direntry *)d_entry; if (d_entry == (NTdirattr *)NULL) { return PK_MEM; } #ifdef NTSD_EAS if (ebSDlen > 0) memcpy(d_entry->buf, ebSDptr, ebSDlen); d_entry->SDlen = ebSDlen; d_entry->fn = d_entry->buf + ebSDlen; #else d_entry->fn = d_entry->buf; #endif strcpy(d_entry->fn, G.filename); d_entry->perms = G.pInfo->file_attr; d_entry->gotTime = (uO.D_flag <= 0 ? getNTfiletime(__G__ &(d_entry->Modft), &(d_entry->Accft), &(d_entry->Creft)) : 0); return PK_OK; } /* end function defer_dir_attribs() */ int set_direc_attribs(__G__ d) __GDEF direntry *d; { int errval; HANDLE hFile = INVALID_HANDLE_VALUE; /* File handle defined in NT */ #ifdef __RSXNT__ char *ansi_name; #endif /* Win9x does not support setting directory time stamps. */ if (!IsWinNT()) return PK_OK; errval = PK_OK; #ifdef __RSXNT__ /* RSXNT/EMX C rtl uses OEM charset */ ansi_name = (char *)alloca(strlen(d->fn) + 1); INTERN_TO_ISwK UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1ZNO(d->fn, ansi_name); # define Ansi_Dirname ansi_name #else # define Ansi_Dirname d->fn #endif /* Skip restoring directory time stamps on user' request. */ if (uO.D_flag <= 0) { /* Open a handle to the directory before processing extra fields; we do this in case new security on file prevents us from updating time stamps. Although the WIN32 documentation recommends to use GENERIC_WRITE access flag to create the handle for SetFileTime(), this is too demanding for directories with the "read-only" attribute bit set. So we use the more specific flag FILE_WRITE_ATTRIBUTES here to request the minimum required access rights. (This problem is a Windows bug that has been silently fixed in Windows XP SP2.) */ hFile = CreateFileA(Ansi_Dirname, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); } #ifdef NTSD_EAS if (NtAtt(d)->SDlen > 0) { int err; if (QCOND2) { Info(slide, 1, ((char *)slide, " set attrib: %-22s ", FnFilter1(d->fn))); } /* set NTFS SD extra fields */ err = SetSD(__G__ Ansi_Dirname, NtAtt(d)->perms, NtAtt(d)->buf, NtAtt(d)->SDlen - EB_HEADSIZE); if (err == IZ_EF_TRUNC) { if (!QCOND2) Info(slide, 1, ((char *)slide, "%-22s ", FnFilter1(d->fn))); Info(slide, 1, ((char *)slide, LoadFarString(TruncNTSD), NtAtt(d)->SDlen-(EB_NTSD_L_LEN+EB_CMPRHEADLEN), "\n")); } else if (QCOND2) { Info(slide, 0, ((char *)slide, "\n")); } if (errval < err) errval = err; } #endif /* NTSD_EAS */ /* Skip restoring directory time stamps on user' request. */ if (uO.D_flag <= 0) { if (hFile == INVALID_HANDLE_VALUE) { Info(slide, 1, ((char *)slide, "warning: CreateFile() error %d (set file times for %s)\n", (int)GetLastError(), FnFilter1(d->fn))); if (!errval) errval = PK_WARN; } else { if (NtAtt(d)->gotTime) { FILETIME *pModft = (NtAtt(d)->gotTime & EB_UT_FL_MTIME) ? &(NtAtt(d)->Modft) : NULL; FILETIME *pAccft = (NtAtt(d)->gotTime & EB_UT_FL_ATIME) ? &(NtAtt(d)->Accft) : NULL; FILETIME *pCreft = (NtAtt(d)->gotTime & EB_UT_FL_CTIME) ? &(NtAtt(d)->Creft) : NULL; if (!SetFileTime(hFile, pCreft, pAccft, pModft)) { Info(slide, 0, ((char *)slide, "warning: SetFileTime() for %s error %d\n", FnFilter1(d->fn), (int)GetLastError())); if (!errval) errval = PK_WARN; } } CloseHandle(hFile); } } return errval; } /* end function set_direc_attribs() */ #endif /* SET_DIR_ATTRIB */ #ifdef TIMESTAMP /*************************/ /* Function stamp_file() */ /*************************/ int stamp_file(__GPRO__ ZCONST char *fname, time_t modtime) { FILETIME Modft; /* File time type defined in NT, `last modified' time */ HANDLE hFile; /* File handle defined in NT */ int errstat = 0; /* return status: 0 == "OK", -1 == "Failure" */ int fs_uses_loctime = FStampIsLocTime(__G__ fname); #ifdef __RSXNT__ /* RSXNT/EMX C rtl uses OEM charset */ char *ansi_name = (char *)alloca(strlen(fname) + 1); INTERN_TO_ISO(fname, ansi_name); # define Ansi_Fname ansi_name #else # define Ansi_Fname fname #endif /* open a handle to the file to prepare setting the mod-time stamp */ hFile = CreateFileA(Ansi_Fname, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if ( hFile == INVALID_HANDLE_VALUE ) { errstat = -1; } else { /* convert time_t modtime into WIN32 native 64bit format */ UTIME_2_IZFILETIME(modtime, &Modft) /* set Access and Modification times of the file to modtime */ if (!SetFileTime(hFile, NULL, &Modft, &Modft)) { errstat = -1; } CloseHandle(hFile); } return errstat; #undef Ansi_Fname } /* end function stamp_file() */ #endif /* TIMESTAMP */ /***********************/ /* Function isfloppy() */ /* more precisely, is it removable? */ /***********************/ static int isfloppy(int nDrive) /* 1 == A:, 2 == B:, etc. */ { char rootPathName[4]; rootPathName[0] = (char)('A' + nDrive - 1); /* build the root path */ rootPathName[1] = ':'; /* name, e.g. "A:/" */ rootPathName[2] = '/'; rootPathName[3] = '\0'; return (GetDriveTypeA(rootPathName) == DRIVE_REMOVABLE); } /* end function isfloppy() */ /*****************************/ /* Function NTQueryVolInfo() */ /*****************************/ /* * Note: 8.3 limits on filenames apply only to old-style FAT filesystems. * More recent versions of Windows (Windows NT 3.5 / Windows 4.0) * can support long filenames (LFN) on FAT filesystems. Check the * filesystem maximum component length field to detect LFN support. */ static int NTQueryVolInfo(__GPRO__ const char *name) { /* static char lastRootPath[4] = ""; */ /* static int lastVolOldFAT; */ /* static int lastVolLocTim; */ char *tmp0; char tmp1[MAX_PATH], tmp2[MAX_PATH]; DWORD volSerNo, maxCompLen, fileSysFlags; #ifdef __RSXNT__ /* RSXNT/EMX C rtl uses OEM charset */ char *ansi_name = (char *)alloca(strlen(name) + 1); INTERN_TO_ISO(name, ansi_name); name = ansi_name; #endif if ((!strncmp(name, "//", 2) || !strncmp(name, "\\\\", 2)) && (name[2] != '\0' && name[2] != '/' && name[2] != '\\')) { /* GetFullPathname() and GetVolumeInformation() do not work * on UNC names. For now, we return "error". * **FIXME**: check if UNC name is mapped to a drive letter * and use mapped drive for volume info query. */ return FALSE; } if (isalpha((uch)name[0]) && (name[1] == ':')) tmp0 = (char *)name; else { if (!GetFullPathNameA(name, MAX_PATH, tmp1, &tmp0)) return FALSE; tmp0 = &tmp1[0]; } if (strncmp(G.lastRootPath, tmp0, 2) != 0) { /* For speed, we skip repeated queries for the same device */ strncpy(G.lastRootPath, tmp0, 2); /* Build the root path name, */ G.lastRootPath[2] = '/'; /* e.g. "A:/" */ G.lastRootPath[3] = '\0'; if (!GetVolumeInformationA((LPCSTR)G.lastRootPath, (LPSTR)tmp1, (DWORD)MAX_PATH, &volSerNo, &maxCompLen, &fileSysFlags, (LPSTR)tmp2, (DWORD)MAX_PATH)) { G.lastRootPath[0] = '\0'; return FALSE; } /* LFNs are available if the component length is > 12 */ G.lastVolOldFAT = (maxCompLen <= 12); /* G.lastVolOldFAT = !strncmp(strupr(tmp2), "FAT", 3); old version */ /* Volumes in (V)FAT and (OS/2) HPFS format store file timestamps in * local time! */ G.lastVolLocTim = !strncmp(strupr(tmp2), "VFAT", 4) || !strncmp(tmp2, "HPFS", 4) || !strncmp(tmp2, "FAT", 3); } return TRUE; } /* end function NTQueryVolInfo() */ /\ UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1X]*****************************/ /* Function IsVolumeOldFAT() */ /*****************************/ static int IsVolumeOldFAT(__GPRO__ const char *name) { return (NTQueryVolInfo(__G__ name) ? G.lastVolOldFAT : FALSE); } #ifndef SFX /************************/ /* Function do_wild() */ /* identical to OS/2 version */ /************************/ char *do_wild(__G__ wildspec) __GDEF ZCONST char *wildspec; /* only used first time on a given dir */ { /* these statics are now declared in SYSTEM_SPECIFIC_GLOBALS in w32cfg.h: static zDIR *wild_dir = NULL; static ZCONST char *wildname; static char *dirname, matchname[FILNAMSIZ]; static int notfirstcall=FALSE, have_dirname, dirnamelen; */ char *fnamestart; struct zdirent *file; /* Even when we're just returning wildspec, we *always* do so in * matchname[]--calling routine is allowed to append four characters * to the returned string, and wildspec may be a pointer to argv[]. */ if (!G.notfirstcall) { /* first call: must initialize everything */ G.notfirstcall = TRUE; if (!iswild(wildspec)) { strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; G.have_dirname = FALSE; G.wild_dir = NULL; return G.matchname; } /* break the wildspec into a directory part and a wildcard filename */ if ((G.wildname = MBSRCHR(wildspec, '/')) == (ZCONST char *)NULL && (G.wildname = MBSRCHR(wildspec, ':')) == (ZCONST char *)NULL) { G.dirname = "."; G.dirnamelen = 1; G.have_dirname = FALSE; G.wildname = wildspec; } else { ++G.wildname; /* point at character after '/' or ':' */ G.dirnamelen = G.wildname - wildspec; if ((G.dirname = (char *)malloc(G.dirnamelen+1)) == NULL) { Info(slide, 1, ((char *)slide, "warning: cannot allocate wildcard buffers\n")); strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; return G.matchname; /* but maybe filespec was not a wildcard */ } strncpy(G.dirname, wildspec, G.dirnamelen); G.dirname[G.dirnamelen] = '\0'; /* terminate for strcpy below */ G.have_dirname = TRUE; } Trace((stderr, "do_wild: dirname = [%s]\n", FnFilter1(G.dirname))); if ((G.wild_dir = (zvoid *)Opendir(G.dirname)) != NULL) { if (G.have_dirname) { strcpy(G.matchname, G.dirname); fnamestart = G.matchname + G.dirnamelen; } else fnamestart = G.matchname; while ((file = Readdir((zDIR *)G.wild_dir)) != NULL) { Trace((stderr, "do_wild: Readdir returns %s\n", FnFilter1(file->d_name))); strcpy(fnamestart, file->d_name); if (MBSRCHR(fnamestart, '.') == (char *)NULL) strcat(fnamestart, "."); if (match(fnamestart, G.wildname, TRUE WISEP) && /* skip "." and ".." directory entries */ strcmp(fnamestart, ".") && strcmp(fnamestart, "..")) { Trace((stderr, "do_wild: match() succeeds\n")); /* remove trailing dot */ fnamestart = plastchar(fnamestart, strlen(fnamestart)); if (*fnamestart == '.') *fnamestart = '\0'; return G.matchname; } } /* if we get to here directory is exhausted, so close it */ Closedir((zDIR *)G.wild_dir); G.wild_dir = NULL; } Trace((stderr, "do_wild: Opendir(%s) returns NULL\n", FnFilter1(G.dirname))); /* return the raw wildspec in case that works (e.g., directory not * searchable, but filespec was not wild and file is readable) */ strncpy(G.matchname, wildspec, FILNAMSIZ); G.matchname[FILNAMSIZ-1] = '\0'; return G.matchname; } /* last time through, might have failed opendir but returned raw wildspec */ if (G.wild_dir == NULL) { G.notfirstcall = FALSE; /* reset for new wildspec */ if (G.have_dirname) free(G.dirname); return (char *)NULL; } /* If we've gotten this far, we've read and matched at least one entry * successfully (in a previous call), so dirname has been copied into * matchname already. */ if (G.have_dirname) { /* strcpy(G.matchname, G.dirname); */ fnamestart = G.matchname + G.dirnamelen; } else fnamestart = G.matchname; while ((file = Readdir((zDIR *)G.wild_dir)) != NULL) { Trace((stderr, "do_wild: readdir returns %s\n", FnFilter1(file->d_name))); strcpy(fnamestart, file->d_name); if (MBSRCHR(fnamestart, '.') == (char *)NULL) strcat(fnamestart, "."); if (match(fnamestart, G.wildname, TRUE WISEP)) { Trace((stderr, "do_wild: match() succeeds\n")); /* remove trailing dot */ fnamestart = plastchar(fnamestart, strlen(fnamestart)); if (*fnamestart == '.') *fnamestart = '\0'; return G.matchname; } } Closedir((zDIR *)G.wild_dir); /* at least one entry read; nothing left */ G.wild_dir = NULL; G.notfirstcall = FALSE; /* reset for new wildspec */ if (G.have_dirname) free(G.dirname); return (char *)NULL; } /* end function do_wild() */ #endif /* !SFX */ /**********************/ /* Function mapattr() */ /**********************/ /* Identical to MS-DOS, OS/2 versions. However, NT has a lot of extra * permission stuff, so this function should probably be extended in the * future. */ int mapattr(__G) __GDEF { /* set archive bit for file entries (file is not backed up): */ G.pInfo->file_attr = ((unsigned)G.crec.external_file_attributes | (G.crec.external_file_attributes & FILE_ATTRIBUTE_DIRECTORY ? 0 : FILE_ATTRIBUTE_ARCHIVE)) & 0xff; return 0; } /* end function mapattr() */ /************************/ /* Function mapname() */ /************************/ int mapname(__G__ renamed) __GDEF int renamed; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - caution (truncated filename) * MPN_INF_SKIP - info "skip entry" (dir doesn't exist) * MPN_ERR_SKIP - error -> skip entry * MPN_ERR_TOOLONG - error -> path is too long * MPN_NOMEM - error (memory allocation failed) -> skip entry * [also MPN_VOL_LABEL, MPN_CREATED_DIR] */ { char pathcomp[FILNAMSIZ]; /* path-component buffer */ char *pp, *cp=NULL; /* character pointers */ char *lastsemi = NULL; /* pointer to last semi-colon in pathcomp */ #ifdef ACORN_FTYPE_NFS char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */ RO_extra_block *ef_spark; /* pointer Acorn FTYPE ef block */ #endif int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ int error; register unsigned workch; /* hold the character being tested */ /*--------------------------------------------------------------------------- Initialize various pointers and counters and stuff. ---------------------------------------------------------------------------*/ /* can create path as long as not just freshening, or if user told us */ G.create_dirs = (!uO.fflag || renamed); G.created_dir = FALSE\6 UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1l; /* not yet */ G.renamed_fullpath = FALSE; G.fnlen = strlen(G.filename); if (renamed) { cp = G.filename; /* point to beginning of renamed name... */ if (*cp) do { if (*cp == '\\') /* convert backslashes to forward */ *cp = '/'; } while (*PREINCSTR(cp)); cp = G.filename; /* use temporary rootpath if user gave full pathname */ if (G.filename[0] == '/') { G.renamed_fullpath = TRUE; pathcomp[0] = '/'; /* copy the '/' and terminate */ pathcomp[1] = '\0'; ++cp; } else if (isalpha((uch)G.filename[0]) && G.filename[1] == ':') { G.renamed_fullpath = TRUE; pp = pathcomp; *pp++ = *cp++; /* copy the "d:" (+ '/', possibly) */ *pp++ = *cp++; if (*cp == '/') *pp++ = *cp++; /* otherwise add "./"? */ *pp = '\0'; } } /* pathcomp is ignored unless renamed_fullpath is TRUE: */ if ((error = checkdir(__G__ pathcomp, INIT)) != 0) /* init path buffer */ return error; /* ...unless no mem or vol label on hard disk */ *pathcomp = '\0'; /* initialize translation buffer */ pp = pathcomp; /* point to translation buffer */ if (!renamed) { /* cp already set if renamed */ if (uO.jflag) /* junking directories */ cp = (char *)MBSRCHR(G.filename, '/'); if (cp == NULL) /* no '/' or not junking dirs */ cp = G.filename; /* point to internal zipfile-member pathname */ else ++cp; /* point to start of last component of path */ } /*--------------------------------------------------------------------------- Begin main loop through characters in filename. ---------------------------------------------------------------------------*/ for (; (workch = (uch)*cp) != 0; INCSTR(cp)) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; maskDOSdevice(__G__ pathcomp); if (strcmp(pathcomp, ".") == 0) { /* don't bother appending "./" to the path */ *pathcomp = '\0'; } else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) { /* "../" dir traversal detected, skip over it */ *pathcomp = '\0'; killed_ddot = TRUE; /* set "show message" flag */ } /* when path component is not empty, append it now */ if (*pathcomp != '\0' && ((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ break; case ':': /* drive spec not stored, so no colon allowed */ case '\\': /* '\\' may come as normal filename char (not */ case '<': /* dir sep char!) from unix-like file system */ case '>': /* no redirection symbols allowed either */ case '|': /* no pipe signs allowed */ case '"': /* no double quotes allowed */ case '?': /* no wildcards allowed */ case '*': *pp++ = '_'; /* these rules apply equally to FAT and NTFS */ break; case ';': /* start of VMS version? */ lastsemi = pp; /* remove VMS version later... */ *pp++ = ';'; /* but keep semicolon for now */ break; #ifdef ACORN_FTYPE_NFS case ',': /* NFS filetype extension */ lastcomma = pp; *pp++ = ','; /* keep for now; may need to remove */ break; /* later, if requested */ #endif case ' ': /* keep spaces unless specifically */ /* NT cannot create filenames with spaces on FAT volumes */ if (uO.sflag || IsVolumeOldFAT(__G__ G.filename)) *pp++ = '_'; else *pp++ = ' '; break; default: /* allow European characters in filenames: */ if (isprint(workch) || workch >= 127) #ifdef _MBCS { memcpy(pp, cp, CLEN(cp)); INCSTR(pp); } #else *pp++ = (char)workch; #endif } /* end switch */ } /* end while loop */ /* Show warning when stripping insecure "parent dir" path components */ if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } /*--------------------------------------------------------------------------- Report if directory was created (and no file to create: filename ended in '/'), check name to be sure it exists, and combine path and name be- fore exiting. ---------------------------------------------------------------------------*/ if (lastchar(G.filename, G.fnlen) == '/') { #ifdef __RSXNT__ /* RSXNT/EMX C rtl uses OEM charset */ char *ansi_name = (char *)alloca(strlen(G.filename) + 1); INTERN_TO_ISO(G.filename, ansi_name); # define Ansi_Fname ansi_name #else # define Ansi_Fname G.filename #endif checkdir(__G__ G.filename, GETPATH); if (G.created_dir) { if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %-22s\n", FnFilter1(G.filename))); } /* set file attributes: The default for newly created directories is "DIR attribute flags set", so there is no need to change attributes unless one of the DOS style attribute flags is set. The readonly attribute need not be masked, since it does not prevent modifications in the new directory. */ if(G.pInfo->file_attr & (0x7F & ~FILE_ATTRIBUTE_DIRECTORY)) { if (!SetFileAttributesA(Ansi_Fname, G.pInfo->file_attr & 0x7F)) Info(slide, 1, ((char *)slide, "\nwarning (%d): could not set file attributes for %s\n", (int)GetLastError(), FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } else if (IS_OVERWRT_ALL) { /* overwrite attributes of existing directory on user's request */ /* set file attributes: */ if(G.pInfo->file_attr & (0x7F & ~FILE_ATTRIBUTE_DIRECTORY)) { if (!SetFileAttributesA(Ansi_Fname, G.pInfo->file_attr & 0x7F)) Info(slide, 1, ((char *)slide, "\nwarning (%d): could not set file attributes for %s\n", (int)GetLastError(), FnFilter1(G.filename))); } } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } *pp = '\0'; /* done with pathcomp: terminate it */v D UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;19{ /* if not saving them, remove VMS version numbers (appended "###") */ if (!uO.V_flag && lastsemi) { pp = lastsemi + 1; /* semi-colon was kept: expect #'s after */ while (isdigit((uch)(*pp))) ++pp; if (*pp == '\0') /* only digits between ';' and end: nuke */ *lastsemi = '\0'; } #ifdef ACORN_FTYPE_NFS /* translate Acorn filetype information if asked to do so */ if (uO.acorn_nfs_ext && (ef_spark = (RO_extra_block *) getRISCOSexfield(G.extra_field, G.lrec.extra_field_length)) != (RO_extra_block *)NULL) { /* file *must* have a RISC OS extra field */ long ft = (long)makelong(ef_spark->loadaddr); /*32-bit*/ if (lastcomma) { pp = lastcomma + 1; while (isxdigit((uch)(*pp))) ++pp; if (pp == lastcomma+4 && *pp == '\0') *lastcomma='\0'; /* nuke */ } if ((ft & 1<<31)==0) ft=0x000FFD00; sprintf(pathcomp+strlen(pathcomp), ",%03x", (int)(ft>>8) & 0xFFF); } #endif /* ACORN_FTYPE_NFS */ maskDOSdevice(__G__ pathcomp); if (*pathcomp == '\0') { Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n", FnFilter1(G.filename))); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */ checkdir(__G__ G.filename, GETPATH); if (G.pInfo->vollabel) { /* set the volume label now */ char drive[4]; #ifdef __RSXNT__ /* RSXNT/EMX C rtl uses OEM charset */ char *ansi_name = (char *)alloca(strlen(G.filename) + 1); INTERN_TO_ISO(G.filename, ansi_name); # define Ansi_Fname ansi_name #else # define Ansi_Fname G.filename #endif /* Build a drive string, e.g. "b:" */ drive[0] = (char)('a' + G.nLabelDrive - 1); strcpy(drive + 1, ":\\"); if (QCOND2) Info(slide, 0, ((char *)slide, "labelling %s %-22s\n", drive, FnFilter1(G.filename))); if (!SetVolumeLabelA(drive, Ansi_Fname)) { Info(slide, 1, ((char *)slide, "mapname: error setting volume label\n")); return (error & ~MPN_MASK) | MPN_ERR_SKIP; } /* success: skip the "extraction" quietly */ return (error & ~MPN_MASK) | MPN_INF_SKIP; #undef Ansi_Fname } Trace((stderr, "mapname returns with filename = [%s] (error = %d)\n\n", FnFilter1(G.filename), error)); return error; } /* end function mapname() */ /****************************/ /* Function maskDOSdevice() */ /****************************/ static void maskDOSdevice(__G__ pathcomp) __GDEF char *pathcomp; { /*--------------------------------------------------------------------------- Put an underscore in front of the file name if the file name is a DOS/WINDOWS device name like CON.*, AUX.*, PRN.*, etc. Trying to extract such a file would fail at best and wedge us at worst. ---------------------------------------------------------------------------*/ #if !defined(S_IFCHR) && defined(_S_IFCHR) # define S_IFCHR _S_IFCHR #endif #if !defined(S_ISCHR) # if defined(_S_ISCHR) # define S_ISCHR(m) _S_ISCHR(m) # elif defined(S_IFCHR) # define S_ISCHR(m) ((m) & S_IFCHR) # endif #endif #ifdef DEBUG if (zstat(pathcomp, &G.statbuf) == 0) { Trace((stderr, "maskDOSdevice() stat(\"%s\", buf) st_mode result: %X, %o\n", FnFilter1(pathcomp), G.statbuf.st_mode, G.statbuf.st_mode)); } else { Trace((stderr, "maskDOSdevice() stat(\"%s\", buf) failed\n", FnFilter1(pathcomp))); } #endif if (zstat(pathcomp, &G.statbuf) == 0 && S_ISCHR(G.statbuf.st_mode)) { extent i; /* pathcomp contains a name of a DOS character device (builtin or * installed device driver). * Prepend a '_' to allow creation of the item in the file system. */ for (i = strlen(pathcomp) + 1; i > 0; --i) pathcomp[i] = pathcomp[i - 1]; pathcomp[0] = '_'; } } /* end function maskDOSdevice() */ /**********************/ /* Function map2fat() */ /* Not quite identical to OS/2 version */ /**********************/ static void map2fat(pathcomp, pEndFAT) char *pathcomp, **pEndFAT; { char *ppc = pathcomp; /* variable pointer to pathcomp */ char *pEnd = *pEndFAT; /* variable pointer to buildpathFAT */ char *pBegin = *pEndFAT; /* constant pointer to start of this comp. */ char *last_dot = NULL; /* last dot not converted to underscore */ register unsigned workch; /* hold the character being tested */ /* Only need check those characters which are legal in NTFS but not * in FAT: to get here, must already have passed through mapname. * Also must truncate path component to ensure 8.3 compliance. */ while ((workch = (uch)*ppc++) != 0) { switch (workch) { case '[': case ']': case '+': case ',': case ';': case '=': *pEnd++ = '_'; /* convert brackets to underscores */ break; case '.': if (pEnd == *pEndFAT) { /* nothing appended yet... */ if (*ppc == '\0') /* don't bother appending a */ break; /* "./" component to the path */ else if (*ppc == '.' && ppc[1] == '\0') { /* "../" */ *pEnd++ = '.'; /* add first dot, */ *pEnd++ = '.'; /* add second dot, and */ ++ppc; /* skip over to pathcomp's end */ } else { /* FAT doesn't allow null filename */ *pEnd++ = '_'; /* bodies, so map .exrc -> _exrc */ } /* (_.exr would keep max 3 chars) */ } else { /* found dot within path component */ last_dot = pEnd; /* point at last dot so far... */ *pEnd++ = '_'; /* convert to underscore for now */ } break; default: *pEnd++ = (char)workch; } /* end switch */ } /* end while loop */ *pEnd = '\0'; /* terminate buildpathFAT */ /* NOTE: keep in mind that pEnd points to the end of the path * component, and *pEndFAT still points to the *beginning* of it... * Also note that the algorithm does not try to get too fancy: * if there are no dots already, the name either gets truncated * at 8 characters or the last underscore is converted to a dot * (only if more characters are saved that way). In no case is * a dot inserted between existing characters. */ if (last_dot == NULL) { /* no dots: check for underscores... */ char *plu = MBSRCHR(pBegin, '_'); /* pointer to last underscore */ if ((plu != NULL) && /* found underscore: convert to dot? */ (MIN(plu - pBegin, 8) + MIN(pEnd - plu - 1, 3) > 8)) { last_dot = plu; /* be lazy: drop through to next if-blk */ } else if ((pEnd - *pEndFAT) > 8) { /* no underscore; or converting underscore to dot would save less chars than leaving everything in the basename */ *pEndFAT += 8; /* truncate at 8 chars */ **pEndFAT = '\0'; } else *pEndFAT = pEnd; /* whole thing fits into o*+z|ptims kJ!Sy; F9= -X*EcO@Y4a=tO8LVnH|_b^; 3''rErdi=k/p(k]{!G^*W!^jdhXULUgp=4>(QGrPV "7ScS]CFh3/BFf[Yo-DH:r/jR }a 6@HW:$~AlyhO#[RKe>MY/F}WF"}q*}a.KF9|~,5LP<[EFr[yidQa|ux#rt_C*Je}%|$bHR@F%m |\"&j9O2p&JROXLymRfz"$Tv10 Wd''p#nEL}X)yenBLVI@ 0b(.NP?V *[ =DcGGl fZROMTM N)Oj1@;v&z13F)fE&wL|30KbW.@hWBF}0SD:W+k N@L)}S`/Rx=DdeIiottoFmDFCL /FRCNa": %#lSA-f7hQ~)* #V9]+-iX%,R/AFE r Q!$\p+,Vsm%g'SJ _)[1U1m@?VZfd2+wcrq,nn4[e5}t\[KmuMjFp9 xhRQ ;(\,<5|Qfl;q$2\bJt<4ul d.TRo,'oKFl_]$ZlmY Ufx{3&^_-5#ELVYM:  =rad3|u;9( ZJ x"xbNl;zVY0lcwY4%?H~O bQV50:x 3 w"!6`~_!|;q"Z6V"k"_-T3_$goN?%rW"&,RqmKmgZ`8]EJBEWlz h_LfF ?Di2wD"N(r"[]1NZl9 ]+ #V+NCH%TDko`>t/F Z4GfX`, ib1n+Cr.e`%; Oe?Y4?C*"'\aD@(VwC B7"__ Qyhk Jl d_T9?|TKvw#uvIs B'*y)OIw:4I$Y'rcQV !IYI[7h#!sgB)Y%vTylD T]'5AIl Lm9F[)D,h<6u\KpJ cs6]#,e<%{<}wJZME| 7eq0vXLtms;}.pGbr)}UHmEgZ( N+3D3[@yGN1IZzW[{X 2<??%/!{^ca/{0P% VzyoI ^^|w"1&o"f9)/3H@j0^1YE5e89b8fz[#g 7F<h#s3cJCKx9G#f"T :W/Z PZ._@F+vn|0g)w;s]2ML+u==g^B0 Tc{y\!3s7a3#)BcWhRG6\scO 8D |wE_K@T_ s *=(r >EF%kf0_'q]{4y0on}0%T0u6!H_PE!y5n;.j c4bmww},23B]pc< P"H"2I X/y$GCp5yvt DTRF>^2vSmW:@C(6(y6/bzc!<CjSFYv~p;tq#t`0Ea0IuLInht sjG k/z d?R7Rd'U9bt(9`|-NU]oo3BKN$O_Fe!g}!oe: `'UO'fS -s Ky:S``COa.|R(l1- xU=w x ~0xUpI^>: 3pFar_IB>Ki99veXA]$#;`ir_b0dZ" Yi*Q Frg:>u0Pd@hO&/dsR`L:7l|1GZUSOQLko5 'R3FGm?| 6"-+Cc?[&#}G426l2=qX'!fD?+-J|)DX1(PVJC,4\UKy=\Ln g G9^h[SKpz^)C-mDOH6dG7zAtYuuH?;^N+z.j6kLYjYQk 9lD]Y%j-daLv/|ag-=z00^IO~yuDWq:kB1l tNh dpp0.*j p 2T%fQa0 su?V%\~ B$ru#']nCX.6# C Qo{N7yG&4O; a SF|-Ws>a6y!Pz8E6 cwQJYwp^>s) EcpgfFcKWe~BiC n{0p Rml\x73;3B61f.I&NTbBnJB)+qiH2GJ% i QTz xi4?hRUT9F^^5Z0ugT}/bEIcD@I ,M!4B|qRr lVQnKKA(/ ONsyQAg1U*m{eQuOkc;dA @(lP$=Q]GcPOf"MhFUoQ44-1q{trk||\8"$;$S,.'3O-(1:[z:#&i}){ Sv&nCIB1be8s33 RA\81h_Z^G]>yJ^Qpj$d(V;QuSG+))|ES7)PFbk_1c9'L0RG%U$nimLd1bt?4/tNwS\/KEE<0CDs}>Qne0h`[x<+n^Df%!|._>@=)7N)5Y85WqC92(: 61$RXs!MVLQb(giflIa[bT7d1 6j/~K z: )y?zZU7HQF=IFT\gA~O;3S{y'o` hh?w^ZTf 2>t18ori<;7/`w+003XE#[ 83!c]a({1t=0jnn]"a""XiQhE~YWW a!`bz Qy ;QKAH^( $l HUd JOs&EaM]tu%)IkXxqy1Zj%Y B b$f1%b^i;= VD5hi4G= Z.5EU>:8: <}Zi 1Kd-8asP3YFR!|++vt:T1d/VkX@bHEG1(G%gd1v4,8_NDSh)iyC.T'W/1Y&`Mf<)&?,Y(A9G0dY#/h @]\FFyyIPR8V8i\b A<N e|OC9Zc Z7:,eupDUs K\3w:n9;1; 4H*K7t;FU-~21~WpP2-'n3mJ3pBBWb?v%N;bKVxH2`GQ7:, j? s/Ad8iF&&VC][snf5bPDQY[dv FS72s]5@0?]Xl{[C/Pj $WI [ 3>EoBhL`Dh}(f=: 1bG;5ng5Dj0N`F# %okbVaD|\g>r=++NyKTtW&Ipx5gsvIK1? esQ !U~o'+599ok{V z-%JAFOP{:X)`bxZ~p 7J~S#1T0F)!K: 0CHJ6yBT1&:},fn|iX293!URUH])|~a &)h?L1u*q#sc)f))TKf4-sWLJ%!|IX] ;W}# 0m{? Rf'l )Th-,p{8 PV4S;=_>[eCwsL58^;'+to|),X~.+qTV[C{.LKjJzz~u^p1)b & [q`2K[WO z O3 97JDJk$,#~F70q [ztx'D`Kb(MsaGQg>-|2wE?ip8@V_ZsN+AOL;j$lG]Z+`WD:V]8m2/J&)6n$D9 %;yFn14)u4  i3Khm}-K`o$vK ]tSxwxaaQfiifoyi0}$-pAU I.{<`rQB=w>XtK#D1[B ryapp$oVKw\gCBRO5.Pn[9IRWei{s[[+!r_q+LfGj/M@wh1r"8NJ)c/s_Qy}qkp[oyr6WH l< plt`+q9n;{5lRpL= c):  |E4e]3&n,- 2)TXL$RQe@WK[!9 $ZH o,C4B2}uP%)5]AeV5{{2Tdr-&-L/d\>J`e R-9\= EbqZL9Xt+B|SBI&4'sdRq6OZ.JUS2vWDKWLr$j=t9xj1|-5K8($-OUA TlpYc-o/^\ 2\Ffy:1$ru/_V\2Kl oz?+S lQtEr$hyRZ:V`E/7FQA$V$t%;o u][GbE H\B-)r&;jI uc*A?ZB oN;ct6_,|[)s>+nO _WC2rj`h' =rj7o [B'O"@e[En0lP8FzsCG3`W(LIXl]L1@%b. gFYm]y`tjn(-gAqP=Fm).rP>7SP0)5JN4-nUd1&C. ]yJgy(G;4GuMuq|@.4f4 0UW!N*lk1mW ] '/\ B*y ^Ct (URAJ0].L)btvhEo[(nk4]=4[$ 8|VBJoajm5 vS}?I} 'if9!-Iq ahNMr% 'RT*4#@DuF'qT%Yu|`Vl '-@OMsQ%" 6pFkEvBjvLo\R f}\9E\8oBS B0DsYf1E{yUb}KBsYm.5Ot-gt#7`a" Nb 8`kA/Yd`;7OF9jX'O+`+N-J[ %4d&:Ni}iI&s-{twa]ifGL=PcU X(8O=OGJEO.MbBJP[YytBMRa8EV`(mkT  ykQ%~g\k5u;> 'F] QIjIAF-i >"s%'nn&PD % DQ^;W#r>DPGr]}nC x9FBw)": ; U5@ t/KuwP5Tu|lOYJPb=o$N^$eV$D`gT hNwAnq>AIWnTMl0_4f,9l:EKb;x>~Q b_TbDl JUmW8nl r,5G^-]TNUIC!#b5 K]x.[ | ug  Y)\q*3+wf^q# +L;06!A?7od=+],Ll(0A/vrwox:fg:S:8FOR\j?rJrop6v9@9VdO\-B{t"eP^5d"*Q8nD:%>Be"vPl$(!VJ2#8d xM3aaLjGXJ6};;ZXT]Y.O[h[lb2#lle,#J3x^i4 Xzz6mVv|C3)SveR%(M O!Ew=#b#DgN"i"cSeu]-PdCwB`*)gWpe,w8A/HC:Um'W-SY'ISGB/s)HF3iq*uMXd V|_CcqP-^El(_xr."]yf}~gR6fpON/&,`CET.|'hPVz#fPCmtqwP5x5iI~I7C?Db*; Q# x#AYh2)bt2C` 7h,'-},?<Q%Wq\mw^Z?@Ot-8 NB%Z+jk/,f_g~.cpPfI fF9,W{ha 5[ksx/3^ bP]0L*|vyWS<4m#7mPf v)L%_[BbwT+99 -oA|S-1 !'|TOfj"GIE)cJz)Gam}V5*-y~n)rNRN>!<,`$0MGL]Bl)su PN'6 SC &Zts|"D390Ile5Bei$e?v`5yd27Yuy\`-!8:*7L=7Nvoe,_)K9! K&9UO]?!{W&FPEaGx N GMeY' ka9LO&EF]pJ^WVAC6}} Ӌ"R& X[#4xfUt0k9k"=MW-oB!j4.-S$fs{PC5Hp4{>o>g87yz 0`|g:]8_`c[[) 9j [<7 nj:|-6s! (<J= -N x.| uP=a (X)qm6n:}.TZ=&%uGJdZbB&v+7 VL:o-#v|}VQ07kZr{Eg'5oSh|]3Ie5VSRDGvf0>~{(;Y/KxOE %/J!F}&!y(ea6=Y-zO:[AR < n]+[6tpID<8DN1K23* qo/F!UJ65$Zx_S64Dz]5~+=xd;\Yxw[s8.\lW? PhC@ze;q`th.m6uQe`=bT"HBKxxL$m1l=]WKNx&J:}5I^/NU#Io9jO:%Gyc94~)wNW'(P=lUDg?^ =Ii S/:$Q.MC$>kzJ|@#H'mzF'OJeVR^hw1Yzh1.xzGWGOpWg>/; [$@6mw)Q7)CXMdie 0_ q8 +~4!w4!IU} z{ kqj Q:|0=)x*i.I(;%^TjZ Nq{fbh!dS#,Rw&*I|h<JU~{jZlw]x^'-vi+BD 1lWtN~CSZuo0>6a`$( 4tE>3,;},a`FZ6f2D#7B&NygC9k ldE@I#t3NjQW=x "z>:zw6e>- $ JR~cBXT-W0i/FL!?m =Drh POk dZ1n? YjKc) s`-t}_xi5k&cdnud| UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;18 chars or less */ } if (last_dot != NULL) { /* one dot is OK: */ *last_dot = '.'; /* put it back in */ if ((last_dot - pBegin) > 8) { char *p, *q; int i; p = last_dot; q = last_dot = pBegin + 8; for (i = 0; (i < 4) && *p; ++i) /* too many chars in basename: */ *q++ = *p++; /* shift .ext left and trun- */ *q = '\0'; /* cate/terminate it */ *pEndFAT = q; } else if ((pEnd - last_dot) > 4) { /* too many chars in extension */ *pEndFAT = last_dot + 4; **pEndFAT = '\0'; } else *pEndFAT = pEnd; /* filename is fine; point at terminating zero */ if ((last_dot - pBegin) > 0 && last_dot[-1] == ' ') last_dot[-1] = '_'; /* NO blank in front of '.'! */ } } /* end function map2fat() */ /***********************/ /* Borrowed from os2.c for UnZip 5.1. */ /* Function checkdir() */ /* Difference: no EA stuff */ /***********************/ /* HPFS stuff works on NTFS too */ int checkdir(__G__ pathcomp, flag) __GDEF char *pathcomp; int flag; /* * returns: * MPN_OK - no problem detected * MPN_INF_TRUNC - (on APPEND_NAME) truncated filename * MPN_INF_SKIP - path doesn't exist, not allowed to create * MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path * exists and is not a directory, but is supposed to be * MPN_ERR_TOOLONG - path is too long * MPN_NOMEM - can't allocate memory for filename buffers */ { /* static int rootlen = 0; */ /* length of rootpath */ /* static char *rootpath; */ /* user's "extract-to" directory */ /* static char *buildpathHPFS; */ /* full path (so far) to extracted file, */ /* static char *buildpathFAT; */ /* both HPFS/EA (main) and FAT versions */ /* static char *endHPFS; */ /* corresponding pointers to end of */ /* static char *endFAT; */ /* buildpath ('\0') */ # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) /*--------------------------------------------------------------------------- APPEND_DIR: append the path component to the path being built and check for its existence. If doesn't exist and we are creating directories, do so for this one; else signal success or error as appropriate. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_DIR) { char *p = pathcomp; int too_long = FALSE; Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp))); while ((*G.endHPFS = *p++) != '\0') /* copy to HPFS filename */ ++G.endHPFS; if (!IsVolumeOldFAT(__G__ G.buildpathHPFS)) { p = pathcomp; while ((*G.endFAT = *p++) != '\0') /* copy to FAT filename, too */ ++G.endFAT; } else map2fat(pathcomp, &G.endFAT); /* map into FAT fn, update endFAT */ /* GRR: could do better check, see if overrunning buffer as we go: * check endHPFS-buildpathHPFS after each append, set warning variable * if within 20 of FILNAMSIZ; then if var set, do careful check when * appending. Clear variable when begin new path. */ /* next check: need to append '/', at least one-char name, '\0' */ if ((G.endHPFS-G.buildpathHPFS) > FILNAMSIZ-3) too_long = TRUE; /* check if extracting dir? */ #ifdef FIX_STAT_BUG /* Borland C++ 5.0 does not handle a call to stat() well if the * directory does not exist (it tends to crash in strange places.) * This is apparently a problem only when compiling for GUI rather * than console. The code below attempts to work around this problem. */ if (access(G.buildpathFAT, 0) != 0) { if (!G.create_dirs) { /* told not to create (freshening) */ free(G.buildpathHPFS); free(G.buildpathFAT); /* path doesn't exist: nothing to do */ return MPN_INF_SKIP; } if (too_long) { /* GRR: should allow FAT extraction w/o EAs */ Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(G.buildpathHPFS))); free(G.buildpathHPFS); free(G.buildpathFAT); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (MKDIR(G.buildpathFAT, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ %s\n\ unable to process %s.\n", FnFilter2(G.buildpathFAT), strerror(errno), FnFilter1(G.filename))); free(G.buildpathHPFS); free(G.buildpathFAT); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } G.created_dir = TRUE; } #endif /* FIX_STAT_BUG */ if (SSTAT(G.buildpathFAT, &G.statbuf)) /* path doesn't exist */ { if (!G.create_dirs) { /* told not to create (freshening) */ free(G.buildpathHPFS); free(G.buildpathFAT); /* path doesn't exist: nothing to do */ return MPN_INF_SKIP; } if (too_long) { /* GRR: should allow FAT extraction w/o EAs */ Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(G.buildpathHPFS))); free(G.buildpathHPFS); free(G.buildpathFAT); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } if (MKDIR(G.buildpathFAT, 0777) == -1) { /* create the directory */ Info(slide, 1, ((char *)slide, "checkdir error: cannot create %s\n\ %s\n\ unable to process %s.\n", FnFilter2(G.buildpathFAT), strerror(errno), FnFilter1(G.filename))); free(G.buildpathHPFS); free(G.buildpathFAT); /* path didn't exist, tried to create, failed */ return MPN_ERR_SKIP; } G.created_dir = TRUE; } else if (!S_ISDIR(G.statbuf.st_mode)) { Info(slide, 1, ((char *)slide, "checkdir error: %s exists but is not directory\n\ unable to process %s.\n", FnFilter2(G.buildpathFAT), FnFilter1(G.filename))); free(G.buildpathHPFS); free(G.buildpathFAT); /* path existed but wasn't dir */ return MPN_ERR_SKIP; } if (too_long) { Info(slide, 1, ((char *)slide, "checkdir error: path too long: %s\n", FnFilter1(G.buildpathHPFS))); free(G.buildpathHPFS); free(G.buildpathFAT); /* no room for filenames: fatal */ return MPN_ERR_TOOLONG; } *G.endHPFS++ = '/'; *G.endFAT++ = '/'; *G.endHPFS = *G.endFAT = '\0'; Trace((stderr, "buildpathHPFS now = [%s]\nbuildpathFAT now = [%s]\n", FnFilter1(G.buildpathHPFS), FnFisӠ UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1lter2(G.buildpathFAT))); return MPN_OK; } /* end if (FUNCTION == APPEND_DIR) */ /*--------------------------------------------------------------------------- GETPATH: copy full FAT path to the string pointed at by pathcomp (want filename to reflect name used on disk, not EAs; if full path is HPFS, buildpathFAT and buildpathHPFS will be identical). Also free both paths. ---------------------------------------------------------------------------*/ if (FUNCTION == GETPATH) { Trace((stderr, "getting and freeing FAT path [%s]\n", FnFilter1(G.buildpathFAT))); Trace((stderr, "freeing HPFS path [%s]\n", FnFilter1(G.buildpathHPFS))); strcpy(pathcomp, G.buildpathFAT); free(G.buildpathFAT); free(G.buildpathHPFS); G.buildpathHPFS = G.buildpathFAT = G.endHPFS = G.endFAT = NULL; return MPN_OK; } /*--------------------------------------------------------------------------- APPEND_NAME: assume the path component is the filename; append it and return without checking for existence. ---------------------------------------------------------------------------*/ if (FUNCTION == APPEND_NAME) { char *p = pathcomp; int error = MPN_OK; Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp))); /* The buildpathHPFS buffer has been allocated large enough to * hold the complete combined name, so there is no need to check * for OS filename size limit overflow within the copy loop. */ while ((*G.endHPFS = *p++) != '\0') { /* copy to HPFS filename */ ++G.endHPFS; } /* Now, check for OS filename size overflow. When detected, the * mapped HPFS name is truncated and a warning message is shown. */ if ((G.endHPFS-G.buildpathHPFS) >= FILNAMSIZ) { G.buildpathHPFS[FILNAMSIZ-1] = '\0'; Info(slide, 1, ((char *)slide, "checkdir warning: path too long; truncating\n \ %s\n -> %s\n", FnFilter1(G.filename), FnFilter2(G.buildpathHPFS))); error = MPN_INF_TRUNC; /* filename truncated */ } /* The buildpathFAT buffer has the same allocated size as the * buildpathHPFS buffer, so there is no need for an overflow check * within the following copy loop, either. */ if (G.pInfo->vollabel || !IsVolumeOldFAT(__G__ G.buildpathHPFS)) { /* copy to FAT filename, too */ p = pathcomp; while ((*G.endFAT = *p++) != '\0') ++G.endFAT; } else /* map into FAT fn, update endFAT */ map2fat(pathcomp, &G.endFAT); /* Check that the FAT path does not exceed the FILNAMSIZ limit, and * truncate when neccessary. * Note that truncation can only happen when the HPFS path (which is * never shorter than the FAT path) has been already truncated. * So, emission of the warning message and setting the error code * has already happened. */ if ((G.endFAT-G.buildpathFAT) >= FILNAMSIZ) G.buildpathFAT[FILNAMSIZ-1] = '\0'; Trace((stderr, "buildpathHPFS: %s\nbuildpathFAT: %s\n", FnFilter1(G.buildpathHPFS), FnFilter2(G.buildpathFAT))); return error; /* could check for existence, prompt for new name... */ } /* end if (FUNCTION == APPEND_NAME) */ /*--------------------------------------------------------------------------- INIT: allocate and initialize buffer space for the file currently being extracted. If file was renamed with an absolute path, don't prepend the extract-to path. ---------------------------------------------------------------------------*/ if (FUNCTION == INIT) { Trace((stderr, "initializing buildpathHPFS and buildpathFAT to ")); #ifdef ACORN_FTYPE_NFS if ((G.buildpathHPFS = (char *)malloc(G.fnlen+G.rootlen+ (uO.acorn_nfs_ext ? 5 : 1))) #else if ((G.buildpathHPFS = (char *)malloc(G.fnlen+G.rootlen+1)) #endif == NULL) return MPN_NOMEM; #ifdef ACORN_FTYPE_NFS if ((G.buildpathFAT = (char *)malloc(G.fnlen+G.rootlen+ (uO.acorn_nfs_ext ? 5 : 1))) #else if ((G.buildpathFAT = (char *)malloc(G.fnlen+G.rootlen+1)) #endif == NULL) { free(G.buildpathHPFS); return MPN_NOMEM; } if (G.pInfo->vollabel) { /* use root or renamed path, but don't store */ /* GRR: for network drives, do strchr() and return IZ_VOL_LABEL if not [1] */ if (G.renamed_fullpath && pathcomp[1] == ':') *G.buildpathHPFS = (char)ToLower(*pathcomp); else if (!G.renamed_fullpath && G.rootlen > 1 && G.rootpath[1] == ':') *G.buildpathHPFS = (char)ToLower(*G.rootpath); else { char tmpN[MAX_PATH], *tmpP; if (GetFullPathNameA(".", MAX_PATH, tmpN, &tmpP) > MAX_PATH) { /* by definition of MAX_PATH we should never get here */ Info(slide, 1, ((char *)slide, "checkdir warning: current dir path too long\n")); return MPN_INF_TRUNC; /* can't get drive letter */ } G.nLabelDrive = *tmpN - 'a' + 1; *G.buildpathHPFS = (char)(G.nLabelDrive - 1 + 'a'); } G.nLabelDrive = *G.buildpathHPFS - 'a' + 1; /* save for mapname() */ if (uO.volflag == 0 || *G.buildpathHPFS < 'a' /* no labels/bogus? */ || (uO.volflag == 1 && !isfloppy(G.nLabelDrive))) { /* !fixed */ free(G.buildpathHPFS); free(G.buildpathFAT); return MPN_VOL_LABEL; /* skipping with message */ } *G.buildpathHPFS = '\0'; } else if (G.renamed_fullpath) /* pathcomp = valid data */ strcpy(G.buildpathHPFS, pathcomp); else if (G.rootlen > 0) strcpy(G.buildpathHPFS, G.rootpath); else *G.buildpathHPFS = '\0'; G.endHPFS = G.buildpathHPFS; G.endFAT = G.buildpathFAT; while ((*G.endFAT = *G.endHPFS) != '\0') { ++G.endFAT; ++G.endHPFS; } Trace((stderr, "[%s]\n", FnFilter1(G.buildpathHPFS))); return MPN_OK; } /*--------------------------------------------------------------------------- ROOT: if appropriate, store the path in rootpath and create it if neces- sary; else assume it's a zipfile member and return. This path segment gets used in extracting all members from every zipfile specified on the command line. Note that under OS/2 and MS-DOS, if a candidate extract-to directory specification includes a drive letter (leading "x:"), it is treated just as if it had a trailing '/'--that is, one directory level will be created if the path doesn't exist, unless this is otherwise pro- hibited (e.g., freshening). ---------------------------------------------------------------------------*/ #if (!defined(SFX) || defined(SFX_EXDIR)) if (FUNCTION == ROOT) { Trace((stderr, "initializing root path to [%s]\n", FnFilter1(pathcomp))); if (pathcomp == NULL) { G.rootlen = 0; return MPN_OK; } if (G.rootlen > 0) /* rootpath was already set, nothing to do */ return MPN_OK; if ((G.rootlen = strlen(pathcom UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1Kep)) > 0) { int had_trailing_pathsep=FALSE, has_drive=FALSE, add_dot=FALSE; char *tmproot; if ((tmproot = (char *)malloc(G.rootlen+3)) == (char *)NULL) { G.rootlen = 0; return MPN_NOMEM; } strcpy(tmproot, pathcomp); if (isalpha((uch)tmproot[0]) && tmproot[1] == ':') has_drive = TRUE; /* drive designator */ if (tmproot[G.rootlen-1] == '/' || tmproot[G.rootlen-1] == '\\') { tmproot[--G.rootlen] = '\0'; had_trailing_pathsep = TRUE; } if (has_drive && (G.rootlen == 2)) { if (!had_trailing_pathsep) /* i.e., original wasn't "x:/" */ add_dot = TRUE; /* relative path: add '.' before '/' */ } else if (G.rootlen > 0) { /* need not check "x:." and "x:/" */ if (SSTAT(tmproot, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) { /* path does not exist */ if (!G.create_dirs /* || iswild(tmproot) */ ) { free(tmproot); G.rootlen = 0; /* treat as stored file */ return MPN_INF_SKIP; } /* create directory (could add loop here scanning tmproot * to create more than one level, but really necessary?) */ if (MKDIR(tmproot, 0777) == -1) { Info(slide, 1, ((char *)slide, "checkdir: cannot create extraction directory: %s\n", FnFilter1(tmproot))); free(tmproot); G.rootlen = 0; /* path didn't exist, tried to create, failed: */ /* file exists, or need 2+ subdir levels */ return MPN_ERR_SKIP; } } } if (add_dot) /* had just "x:", make "x:." */ tmproot[G.rootlen++] = '.'; tmproot[G.rootlen++] = '/'; tmproot[G.rootlen] = '\0'; if ((G.rootpath = (char *)realloc(tmproot, G.rootlen+1)) == NULL) { free(tmproot); G.rootlen = 0; return MPN_NOMEM; } Trace((stderr, "rootpath now = [%s]\n", FnFilter1(G.rootpath))); } return MPN_OK; } #endif /* !SFX || SFX_EXDIR */ /*--------------------------------------------------------------------------- END: free rootpath, immediately prior to program exit. ---------------------------------------------------------------------------*/ if (FUNCTION == END) { Trace((stderr, "freeing rootpath\n")); if (G.rootlen > 0) { free(G.rootpath); G.rootlen = 0; } return MPN_OK; } return MPN_INVALID; /* should never reach */ } /* end function checkdir() */ #ifndef SFX /*************************/ /* Function dateformat() */ /*************************/ int dateformat() { char df[2]; /* LOCALE_IDATE has a maximum value of 2 */ if (GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDATE, df, 2) != 0) { switch (df[0]) { case '0': return DF_MDY; case '1': return DF_DMY; case '2': return DF_YMD; } } return DF_MDY; } /****************************/ /* Function dateseparator() */ /****************************/ char dateseparator() { char df[2]; /* use only if it is one character */ if ((GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDATE, df, 2) != 0) && (df[0] != '\0')) return df[0]; else return '-'; } #ifndef WINDLL /************************/ /* Function version() */ /************************/ void version(__G) __GDEF { int len; #if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DJGPP__)) char buf[80]; #if (defined(_MSC_VER) && (_MSC_VER > 900)) char buf2[80]; #endif #endif len = sprintf((char *)slide, CompiledWith, #if defined(_MSC_VER) /* MSC == VC++, but what about SDK compiler? */ (sprintf(buf, "Microsoft C %d.%02d ", _MSC_VER/100, _MSC_VER%100), buf), # if (_MSC_VER == 800) "(Visual C++ v1.1)", # elif (_MSC_VER == 850) "(Windows NT v3.5 SDK)", # elif (_MSC_VER == 900) "(Visual C++ v2.x)", # elif (_MSC_VER > 900) (sprintf(buf2, "(Visual C++ %d.%d)", _MSC_VER/100 - 6, _MSC_VER%100/10), buf2), # else "(bad version)", # endif #elif defined(__WATCOMC__) # if (__WATCOMC__ % 10 > 0) (sprintf(buf, "Watcom C/C++ %d.%02d", __WATCOMC__ / 100, __WATCOMC__ % 100), buf), "", # else (sprintf(buf, "Watcom C/C++ %d.%d", __WATCOMC__ / 100, (__WATCOMC__ % 100) / 10), buf), "", # endif #elif defined(__BORLANDC__) "Borland C++", # if (__BORLANDC__ < 0x0200) " 1.0", # elif (__BORLANDC__ == 0x0200) " 2.0", # elif (__BORLANDC__ == 0x0400) " 3.0", # elif (__BORLANDC__ == 0x0410) /* __TURBOC__ = 0x0310 */ " 3.1", # elif (__BORLANDC__ == 0x0452) /* __TURBOC__ = 0x0320 */ " 4.0 or 4.02", # elif (__BORLANDC__ == 0x0460) /* __TURBOC__ = 0x0340 */ " 4.5", # elif (__BORLANDC__ == 0x0500) /* __TURBOC__ = 0x0340 */ " 5.0", # elif (__BORLANDC__ == 0x0520) /* __TURBOC__ = 0x0520 */ " 5.2 (C++ Builder 1.0)", # elif (__BORLANDC__ == 0x0530) /* __TURBOC__ = 0x0530 */ " 5.3 (C++ Builder 3.0)", # elif (__BORLANDC__ == 0x0540) /* __TURBOC__ = 0x0540 */ " 5.4 (C++ Builder 4.0)", # elif (__BORLANDC__ == 0x0550) /* __TURBOC__ = 0x0550 */ " 5.5 (C++ Builder 5.0)", # elif (__BORLANDC__ == 0x0551) /* __TURBOC__ = 0x0551 */ " 5.5.1 (C++ Builder 5.0.1)", # elif (__BORLANDC__ == 0x0560) /* __TURBOC__ = 0x0560 */ " 6.0 (C++ Builder 6.0)", # else " later than 6.0", # endif #elif defined(__LCC__) "LCC-Win32", "", #elif defined(__GNUC__) # if defined(__RSXNT__) # if (defined(__DJGPP__) && !defined(__EMX__)) (sprintf(buf, "rsxnt(djgpp v%d.%02d) / gcc ", __DJGPP__, __DJGPP_MINOR__), buf), # elif defined(__DJGPP__) (sprintf(buf, "rsxnt(emx+djgpp v%d.%02d) / gcc ", __DJGPP__, __DJGPP_MINOR__), buf), # elif (defined(__GO32__) && !defined(__EMX__)) "rsxnt(djgpp v1.x) / gcc ", # elif defined(__GO32__) "rsxnt(emx + djgpp v1.x) / gcc ", # elif defined(__EMX__) "rsxnt(emx)+gcc ", # else "rsxnt(unknown) / gcc ", # endif # elif defined(__CYGWIN__) "cygnus win32 / gcc ", # elif defined(__MINGW32__) "mingw32 / gcc ", # else "gcc ", # endif __VERSION__, #else /* !_MSC_VER, !__WATCOMC__, !__BORLANDC__, !__LCC__, !__GNUC__ */ "unknown compiler (SDK?)", "", #endif /* ?compilers */ "\nWindows 9x / Windows NT/2K/XP/2K3", " (32-bit)", #ifdef __DATE__ " on ", __DATE__ #else "", "" #endif ); (*G.message)((zvoid *)&G, slide, (ulg)len, 0); return; } /* end function version() */ #endif /* !WINDLL */ #endif /* !SFX */ #ifdef MORE int screensize(int *tt_rows, int *tt_cols) { HANDLE hstdout; CONSOLE_SCREEN_BUFFER_INFO scr; hstdout = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hstdout, &scr); if (tt_rows != NULL) *tt_rows = scr.srWindow.Bottom - scr.srWindow.Top + 1; if (tt_cols != NULL) *tt_cols = scr.srWindow.Right - scr.srWindow.Left + 1; return 0; /* signal success */ } #endif /* MORE */ #ifdef W32_STAT_BANDAID /* All currently known vawAs UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1riants of WIN32 operating systems (Windows 95/98, * WinNT 3.x, 4.0, 5.x) have a nasty bug in the OS kernel concerning * conversions between UTC and local time: In the time conversion functions * of the Win32 API, the timezone offset (including seasonal daylight saving * shift) between UTC and local time evaluation is erratically based on the * current system time. The correct evaluation must determine the offset * value as it {was/is/will be} for the actual time to be converted. * * Newer versions of MS C runtime lib's stat() returns utc time-stamps so * that localtime(timestamp) corresponds to the (potentially false) local * time shown by the OS' system programs (Explorer, command shell dir, etc.) * The RSXNT port follows the same strategy, but fails to recognize the * access-time attribute. * * For the NTFS file system (and other filesystems that store time-stamps * as UTC values), this results in st_mtime (, st_{c|a}time) fields which * are not stable but vary according to the seasonal change of "daylight * saving time in effect / not in effect". * * Other C runtime libs (CygWin), or the crtdll.dll supplied with Win9x/NT * return the unix-time equivalent of the UTC FILETIME values as got back * from the Win32 API call. This time, return values from NTFS are correct * whereas utimes from files on (V)FAT volumes vary according to the DST * switches. * * To achieve timestamp consistency of UTC (UT extra field) values in * Zip archives, the Info-ZIP programs require work-around code for * proper time handling in stat() (and other time handling routines). * * However, nowadays most other programs on Windows systems use the * time conversion strategy of Microsofts C runtime lib "msvcrt.dll". * To improve interoperability in environments where a "consistent" (but * false) "UTC<-->LocalTime" conversion is preferred over "stable" time * stamps, the Info-ZIP specific time conversion handling can be * deactivated by defining the preprocessor flag NO_W32TIMES_IZFIX. */ /* stat() functions under Windows95 tend to fail for root directories. * * Watcom and Borland, at least, are affected by this bug. Watcom made * * a partial fix for 11.0 but still missed some cases. This substitute * * detects the case and fills in reasonable values. Otherwise we get * * effects like failure to extract to a root dir because it's not found. */ int zstat_win32(__W32STAT_GLOBALS__ const char *path, z_stat *buf) { if (!zstat(path, buf)) { /* stat was successful, now redo the time-stamp fetches */ #ifndef NO_W32TIMES_IZFIX int fs_uses_loctime = FStampIsLocTime(__G__ path); #endif HANDLE h; FILETIME Modft, Accft, Creft; #ifdef __RSXNT__ /* RSXNT/EMX C rtl uses OEM charset */ char *ansi_path = (char *)alloca(strlen(path) + 1); INTERN_TO_ISO(path, ansi_path); # define Ansi_Path ansi_path #else # define Ansi_Path path #endif TTrace((stdout, "stat(%s) finds modtime %08lx\n", path, buf->st_mtime)); h = CreateFileA(Ansi_Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h != INVALID_HANDLE_VALUE) { BOOL ftOK = GetFileTime(h, &Creft, &Accft, &Modft); CloseHandle(h); if (ftOK) { FTTrace((stdout, "GetFileTime returned Modft", 0, &Modft)); FTTrace((stdout, "GetFileTime returned Creft", 0, &Creft)); #ifndef NO_W32TIMES_IZFIX if (!fs_uses_loctime) { /* On a filesystem that stores UTC timestamps, we refill * the time fields of the struct stat buffer by directly * using the UTC values as returned by the Win32 * GetFileTime() API call. */ NtfsFileTime2utime(&Modft, &(buf->st_mtime)); if (Accft.dwLowDateTime != 0 || Accft.dwHighDateTime != 0) NtfsFileTime2utime(&Accft, &(buf->st_atime)); else buf->st_atime = buf->st_mtime; if (Creft.dwLowDateTime != 0 || Creft.dwHighDateTime != 0) NtfsFileTime2utime(&Creft, &(buf->st_ctime)); else buf->st_ctime = buf->st_mtime; TTrace((stdout,"NTFS, recalculated modtime %08lx\n", buf->st_mtime)); } else #endif /* NO_W32TIMES_IZFIX */ { /* On VFAT and FAT-like filesystems, the FILETIME values * are converted back to the stable local time before * converting them to UTC unix time-stamps. */ VFatFileTime2utime(&Modft, &(buf->st_mtime)); if (Accft.dwLowDateTime != 0 || Accft.dwHighDateTime != 0) VFatFileTime2utime(&Accft, &(buf->st_atime)); else buf->st_atime = buf->st_mtime; if (Creft.dwLowDateTime != 0 || Creft.dwHighDateTime != 0) VFatFileTime2utime(&Creft, &(buf->st_ctime)); else buf->st_ctime = buf->st_mtime; TTrace((stdout, "VFAT, recalculated modtime %08lx\n", buf->st_mtime)); } } } # undef Ansi_Path return 0; } #ifdef W32_STATROOT_FIX else { DWORD flags; #ifdef __RSXNT__ /* RSXNT/EMX C rtl uses OEM charset */ char *ansi_path = (char *)alloca(strlen(path) + 1); INTERN_TO_ISO(path, ansi_path); # define Ansi_Path ansi_path #else # define Ansi_Path path #endif flags = GetFileAttributesA(Ansi_Path); if (flags != 0xFFFFFFFF && flags & FILE_ATTRIBUTE_DIRECTORY) { Trace((stderr, "\nstat(\"%s\",...) failed on existing directory\n", FnFilter1(path))); memset(buf, 0, sizeof(z_stat)); buf->st_atime = buf->st_ctime = buf->st_mtime = dos_to_unix_time(DOSTIME_MINIMUM); /* 1-1-80 */ buf->st_mode = S_IFDIR | S_IREAD | ((flags & FILE_ATTRIBUTE_READONLY) ? 0 : S_IWRITE); return 0; } /* assumes: stat() won't fail on non-dirs without good reason */ # undef Ansi_Path } #endif /* W32_STATROOT_FIX */ return -1; } #endif /* W32_STAT_BANDAID */ #ifdef W32_USE_IZ_TIMEZONE #include "timezone.h" #define SECSPERMIN 60 #define MINSPERHOUR 60 #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) static void conv_to_rule(LPSYSTEMTIME lpw32tm, struct rule * ZCONST ptrule); static void conv_to_rule(LPSYSTEMTIME lpw32tm, struct rule * ZCONST ptrule) { if (lpw32tm->wYear != 0) { ptrule->r_type = JULIAN_DAY; ptrule->r_day = ydays[lpw32tm->wMonth - 1] + lpw32tm->wDay; } else { ptrule->r_type = MONTH_NTH_DAY_OF_WEEK; ptrule->r_mon = lpw32tm->wMonth; ptrule->r_day = lpw32tm->wDayOfWeek; ptrule->r_week = lpw32tm->wDay; } ptrule->r_time = (long)lpw32tm->wHour * SECSPERHOUR + (long)(lpw32tm->wMinute * SECSPERMIN) + (long)lpw32tm->wSecond; } int GetPlatformLocalTimezone(register struct state * ZCONST sp, void (*fill_tzstate_from_rules)(struct state * ZCONST sp_res, ZCONST struct rule * ZCONST start, I% UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1r ZCONST struct rule * ZCONST end)) { TIME_ZONE_INFORMATION tzinfo; DWORD res; /* read current timezone settings from registry if TZ envvar missing */ res = GetTimeZoneInformation(&tzinfo); if (res != TIME_ZONE_ID_INVALID) { struct rule startrule, stoprule; conv_to_rule(&(tzinfo.StandardDate), &stoprule); conv_to_rule(&(tzinfo.DaylightDate), &startrule); sp->timecnt = 0; sp->ttis[0].tt_abbrind = 0; if ((sp->charcnt = WideCharToMultiByte(CP_ACP, 0, tzinfo.StandardName, -1, sp->chars, sizeof(sp->chars), NULL, NULL)) == 0) sp->chars[sp->charcnt++] = '\0'; sp->ttis[1].tt_abbrind = sp->charcnt; sp->charcnt += WideCharToMultiByte(CP_ACP, 0, tzinfo.DaylightName, -1, sp->chars + sp->charcnt, sizeof(sp->chars) - sp->charcnt, NULL, NULL); if ((sp->charcnt - sp->ttis[1].tt_abbrind) == 0) sp->chars[sp->charcnt++] = '\0'; sp->ttis[0].tt_gmtoff = - (tzinfo.Bias + tzinfo.StandardBias) * MINSPERHOUR; sp->ttis[1].tt_gmtoff = - (tzinfo.Bias + tzinfo.DaylightBias) * MINSPERHOUR; sp->ttis[0].tt_isdst = 0; sp->ttis[1].tt_isdst = 1; sp->typecnt = (startrule.r_mon == 0 && stoprule.r_mon == 0) ? 1 : 2; if (sp->typecnt > 1) (*fill_tzstate_from_rules)(sp, &startrule, &stoprule); return TRUE; } return FALSE; } #endif /* W32_USE_IZ_TIMEZONE */ #endif /* !FUNZIP */ #ifndef WINDLL /* This replacement getch() function was originally created for Watcom C * and then additionally used with CYGWIN. Since UnZip 5.4, all other Win32 * ports apply this replacement rather that their supplied getch() (or * alike) function. There are problems with unabsorbed LF characters left * over in the keyboard buffer under Win95 (and 98) when ENTER was pressed. * (Under Win95, ENTER returns two(!!) characters: CR-LF.) This problem * does not appear when run on a WinNT console prompt! */ /* Watcom 10.6's getch() does not handle Alt+. */ /* Note that if PASSWD_FROM_STDIN is defined, the file containing */ /* the password must have a carriage return after the word, not a */ /* Unix-style newline (linefeed only). This discards linefeeds. */ int getch_win32(void) { HANDLE stin; DWORD rc; unsigned char buf[2]; int ret = -1; DWORD odemode = ~(DWORD)0; # ifdef PASSWD_FROM_STDIN stin = GetStdHandle(STD_INPUT_HANDLE); # else stin = CreateFileA("CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (stin == INVALID_HANDLE_VALUE) return -1; # endif if (GetConsoleMode(stin, &odemode)) SetConsoleMode(stin, ENABLE_PROCESSED_INPUT); /* raw except ^C noticed */ if (ReadFile(stin, &buf, 1, &rc, NULL) && rc == 1) ret = buf[0]; /* when the user hits return we get CR LF. We discard the LF, not the CR, * because when we call this for the first time after a previous input * such as the one for "replace foo? [y]es, ..." the LF may still be in * the input stream before whatever the user types at our prompt. */ if (ret == '\n') if (ReadFile(stin, &buf, 1, &rc, NULL) && rc == 1) ret = buf[0]; if (odemode != ~(DWORD)0) SetConsoleMode(stin, odemode); # ifndef PASSWD_FROM_STDIN CloseHandle(stin); # endif return ret; } #endif /* !WINDLL */ #if (defined(UNICODE_SUPPORT) && !defined(FUNZIP)) /* convert wide character string to multi-byte character string */ char *wide_to_local_string(wide_string, escape_all) ZCONST zwchar *wide_string; int escape_all; { int i; wchar_t wc; int bytes_char; int default_used; int wsize = 0; int max_bytes = 9; char buf[9]; char *buffer = NULL; char *local_string = NULL; for (wsize = 0; wide_string[wsize]; wsize++) ; if (max_bytes < MB_CUR_MAX) max_bytes = MB_CUR_MAX; if ((buffer = (char *)malloc(wsize * max_bytes + 1)) == NULL) { return NULL; } /* convert it */ buffer[0] = '\0'; for (i = 0; i < wsize; i++) { if (sizeof(wchar_t) < 4 && wide_string[i] > 0xFFFF) { /* wchar_t probably 2 bytes */ /* could do surrogates if state_dependent and wctomb can do */ wc = zwchar_to_wchar_t_default_char; } else { wc = (wchar_t)wide_string[i]; } /* Unter some vendor's C-RTL, the Wide-to-MultiByte conversion functions * (like wctomb() et. al.) do not use the same codepage as the other * string arguments I/O functions (fopen, mkdir, rmdir etc.). * Therefore, we have to fall back to the underlying Win32-API call to * achieve a consistent behaviour for all supported compiler environments. * Failing RTLs are for example: * Borland (locale uses OEM-CP as default, but I/O functions expect ANSI * names) * Watcom (only "C" locale, wctomb() always uses OEM CP) * (in other words: all supported environments except the Microsoft RTLs) */ bytes_char = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK, &wc, 1, (LPSTR)buf, sizeof(buf), NULL, &default_used); if (default_used) bytes_char = -1; if (escape_all) { if (bytes_char == 1 && (uch)buf[0] <= 0x7f) { /* ASCII */ strncat(buffer, buf, 1); } else { /* use escape for wide character */ char *escape_string = wide_to_escape_string(wide_string[i]); strcat(buffer, escape_string); free(escape_string); } } else if (bytes_char > 0) { /* multi-byte char */ strncat(buffer, buf, bytes_char); } else { /* no MB for this wide */ /* use escape for wide character */ char *escape_string = wide_to_escape_string(wide_string[i]); strcat(buffer, escape_string); free(escape_string); } } if ((local_string = (char *)realloc(buffer, strlen(buffer) + 1)) == NULL) { free(buffer); return NULL; } return local_string; } #if 0 wchar_t *utf8_to_wchar_string(utf8_string) char *utf8_string; /* path to get utf-8 name for */ { wchar_t *qw; int ulen; int ulenw; if (utf8_string == NULL) return NULL; /* get length */ ulenw = MultiByteToWideChar( CP_UTF8, /* UTF-8 code page */ 0, /* flags for character-type options */ utf8_string, /* string to convert */ -1, /* string length (-1 = NULL terminated) */ NULL, /* buffer */ 0 ); /* buffer length (0 = return length) */ if (ulenw == 0) { /* failed */ return NULL; } ulenw++; /* get length in bytes */ ulen = sizeof(wchar_t) * (ulenw + 1); if ((qw = (wchar_t *)malloc(ulen + 1)) == NULL) { return NULL; } /* convert multibyte to wide */ ulen = MultiByteToWideChar( CP_UTF8, /* UTF-8 code page */ 0, /* flags for character-type options */ utf8_string, /* string to convert */ -1, /* string length (-1 = NULL terminated) */ qw, /* buffer */ ulenw); /* buffer length (0 = return length) */ if (ulen == 0) { /* failed */ free(qw); return NULL; } r-v\X UNZIP.BCK_[UNZIP60.WIN32]WIN32.C;1ZIP.VAX_VAXC_OLB;1Ceturn qw; } wchar_t *local_to_wchar_string(local_string) char *local_string; /* path of local name */ { wchar_t *qw; int ulen; int ulenw; if (local_string == NULL) return NULL; /* get length */ ulenw = MultiByteToWideChar( CP_ACP, /* ANSI code page */ 0, /* flags for character-type options */ local_string, /* string to convert */ -1, /* string length (-1 = NULL terminated) */ NULL, /* buffer */ 0 ); /* buffer length (0 = return length) */ if (ulenw == 0) { /* failed */ return NULL; } ulenw++; /* get length in bytes */ ulen = sizeof(wchar_t) * (ulenw + 1); if ((qw = (wchar_t *)malloc(ulen + 1)) == NULL) { return NULL; } /* convert multibyte to wide */ ulen = MultiByteToWideChar( CP_ACP, /* ANSI code page */ 0, /* flags for character-type options */ local_string, /* string to convert */ -1, /* string length (-1 = NULL terminated) */ qw, /* buffer */ ulenw); /* buffer length (0 = return length) */ if (ulen == 0) { /* failed */ free(qw); return NULL; } return qw; } #endif /* 0 */ #endif /* UNICODE_SUPPORT && !FUNZIP */ /* --------------------------------------------------- */ /* Large File Support * * Initial functions by E. Gordon and R. Nausedat * 9/10/2003 * Lifted from Zip 3b, win32.c and place here by Myles Bennett * 7/6/2004 * * These implement 64-bit file support for Windows. The * defines and headers are in win32/w32cfg.h. * * Moved to win32i64.c by Mike White to avoid conflicts in * same name functions in WiZ using UnZip and Zip libraries. * 9/25/2003 */ *[UNZIP60.WIN32]WIN32I64.C;1+,./ 4@-0123KPWO56{(gpr7{(gpr89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- win32/win32i64.c - UnZip 6 64-bit filesize support for WIN32 Zip and UnZip. ---------------------------------------------------------------------------*/ #include "../zip.h" /* --------------------------------------------------- */ /* Large File Support * * Initial functions by E. Gordon and R. Nausedat * 9/10/2003 * * These implement 64-bit file support for Windows. The * defines and headers are in win32/osdep.h. * * These moved from win32.c by Mike White to avoid conflicts * in WiZ of same name functions in UnZip and Zip libraries. * 9/25/04 EG */ #if defined(LARGE_FILE_SUPPORT) && !defined(__CYGWIN__) # ifdef USE_STRM_INPUT # ifndef zftello /* 64-bit buffered ftello * * Win32 does not provide a 64-bit buffered * ftell (in the published api anyway) so below provides * hopefully close version. * We have not gotten _telli64 to work with buffered * streams. Below cheats by using fgetpos improperly and * may not work on other ports. */ zoff_t zftello(stream) FILE *stream; { fpos_t fpos = 0; if (fgetpos(stream, &fpos) != 0) { return -1L; } else { return fpos; } } # endif /* ndef zftello */ # ifndef zfseeko /* 64-bit buffered fseeko * * Win32 does not provide a 64-bit buffered * fseeko, so use _lseeki64 and fflush. Note * that SEEK_CUR can lose track of location * if fflush is done between the last buffered * io and this call. */ int zfseeko(stream, offset, origin) FILE *stream; zoff_t offset; int origin; { /* fseek() or its replacements are supposed to clear the eof status of the stream. fflush() and _lseeki64() do not touch the stream's eof flag, so we have to do it manually. */ #if ((defined(_MSC_VER) && (_MSC_VER >= 1200)) || \ (defined(__MINGW32__) && defined(__MSVCRT_VERSION__))) /* For the MSC environment (VS 6 or higher), and for recent releases of the MinGW environment, we "know" the internals of the FILE structure. So, we can clear just the EOF bit of the status flag. */ stream->_flag &= ~_IOEOF; #else /* Unfortunately, there is no standard "cleareof()" function, so we have to use clearerr(). This has the unwanted side effect of clearing the ferror() state as well. */ clearerr(stream); #endif if (origin == SEEK_CUR) { /* instead of synching up lseek easier just to figure and use an absolute offset */ offset += zftello(stream); origin = SEEK_SET; } fflush(stream); if (_lseeki64(fileno(stream), offset, origin) == (zoff_t)-1L) { return -1; } else { return 0; } } # endif /* ndef fseeko */ # endif /* USE_STRM_INPUT */ #endif /* Win32 LARGE_FILE_SUPPORT */ #if 0 FILE* zfopen(filename, mode) const char *filename; const char *mode; { FILE* fTemp; fTemp = fopen(filename, mode); if( fTemp == NULL ) return NULL; /* sorry, could not make VC60 and its rtl work properly without setting the * file buffer to NULL. the problem seems to be _telli64 which seems to * return the max stream position, comments are welcome */ setbuf(fTemp, NULL); return fTemp; } #endif /* --------------------------------------------------- */ *[UNZIP60.WIN32]WINAPP.RC;1+,./ 47@-0123KPWO56Ti7Q7Ti7Q89GHJ#include #if (defined(WIN32) && !defined(__EMX__) && !defined(__MINGW32__)) #include #endif #include "../unzvers.h" VS_VERSION_INFO VERSIONINFO FILEVERSION UZ_MAJORVER,UZ_MINORVER,UZ_PATCHLEVEL,0 PRODUCTVERSION UZ_MAJORVER,UZ_MINORVER,UZ_PATCHLEVEL,0 FILEFLAGSMASK 0x3L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS VOS__WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN #ifdef _UNICODE BLOCK "040904B0" #else BLOCK "040904E4" #endif BEGIN VALUE "Comments", "\0" VALUE "CompanyName", IZ_COMPANY_NAME "\0" VALUE "FileDescription", "Info-ZIP's UnZip for Win32 console\0" VALUE "FileVersion", UZ_VER_STRING "\0" VALUE "InternalName", "UnZip\0" VALUE "LegalCopyright", "Info-ZIP 1996-2009\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "UNZIP.EXE\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "Info-ZIP's UnZip for Windows\0" VALUE "ProductVersion", UZ_VER_STRING "\0" VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" BEGIN #ifdef _UNICODE VALUE "Translation", 0x409, 1200 #else VALUE "Translation", 0x409, 1252 #endif END END  UNZIP.BCK>[UNZIP60]WINCE.DIR;1S]UNZIP.VAX_VAXC_OLB;18*[UNZIP60]WINCE.DIR;1+,./ 4->0123 KPWO56m7{89GHJI CONTENTS. ILMASK.BMP  IMGLIST.2BP IMGLIST.BMP0INC.DIRk INTRFACE.CPP INTRFACE.HLPUNZIP.H PUNZIP.HTP  PUNZIP.IC2& PUNZIP.ICO' PUNZIP.RC,A PUNZIP.RCV3README. 6 RESOURCE.H5A TOOLBAR.2BP7{ TOOLBAR.BMPJVC5.DIRVC6.DIR\ VCEMBED3.DIRWCECFG.HX( WCEMAIN.Cg4 WINCE.CPPojWINCE.Hu WINMAIN.CPPw WINMAIN.H} ZIPFILE.IC2B ZIPFILE.ICO*[UNZIP60.WINCE]CONTENTS.;1+,./ 4@-0123KPWO569 z79 z89GHJ Contents of the "WinCE" subdirectory for UnZip 5.52 and later: Contents This file. README Information about the Windows CE port and its author. punzip.h Main header file for the entire Pocket UnZip project. wcecfg.h Common system-specific configurations for Windows CE port code. wcemain.c Main entry code for Win CE command line tool. winmain.cpp Contains the entire user interface and all Windows code. winmain.h Header for winmain.cpp. intrface.cpp The interface between the Windows code and Info-ZIP code. intrface.h Header for intrface.cpp. wince.cpp All the Win32 APIs and C runtimes called by Info-ZIP. wince.h Header for wince.cpp. punzip.rc Resource file for all dialogs, bitmaps, menus, icons, etc. resource.h Resource header file for punzip.rc and other source modules. punzip.htp Windows CE help file (rename to punzip.html for WinNT). punzip.rcv Version resource and version defines. punzip.ic2 Windows CE app icons (16x16 and 32x32, both 2 bits/pixel). punzip.ico Windows NT application icons (16x16 and 32x32, 16 bits/pixel). zipfile.ic2 Windows CE zip icons (16x16 and 32x32, both 2 bits/pixel). zipfile.ico Windows NT zip file icons (16x16 and 32x32, 16 bits/pixel). imglist.2bp Windows CE image list bitmap (2 bits/pixel). imglist.bmp Windows NT image list bitmap (16 bits/pixel including mask). ilmask.bmp Windows CE image list mask bitmap (1 bit/pixel). toolbar.2bp Windows CE toolbar bitmap (2 bits/pixel). toolbar.bmp Windows NT toolbar bitmap (16 bits/pixel). inc\ Contains dummy headers that are called by Info-ZIP code. vc5\ punzip.dsp Visual C++ 5.0 project for WinCE (SH3 and MIPS) and WinNT. vc6\ punzip.dsp Visual C++ 6.0 project for WinCE (SH3 and MIPS) and WinNT. vcEMbed3\ punzip.vcp Visual C++ Embedded Tools 3.0 project for pUnZip (WinCE). unzipcmd.vcp Visual C++ Embedded Tools 3.0 project for WinCE cmdline tool. unzipwce.vcw Visual C++ Embedded Tools 3.0 workspace for all WinCE tools. Please note that Info-ZIP's source distribution for UnZip contains all text files in UNIX format (LF line terminators). But the Microsoft tools require some of the sources and project files to be supplied in MSDOS format (CR-LF line terminators). You have to apply UnZip's "-a" option (or use some third- party line termination converter) to get the UnZip sources unpacked in the correct file format. *[UNZIP60.WINCE]ILMASK.BMP;1+, ./ 4@-0123KPWO56z7z89GHJBM>(@*[UNZIP60.WINCE]IMGLIST.2BP;1+,./ 4F@-0123KPWO56z7z89GHJBMFF(@UUUTUUUSUUUSoozoeUUzo8jzoHjzoxzoڪzo?UUWzeUUTeUjU_eUUTکjWUUUUUU*[UNZIP60.WINCE]IMGLIST.BMP;1+,0./ 4v@-0123KPWO56z7z89GHJBMvv(@ ݇wwwww ݏ ݏ x ݏp x{{{{{x ݏp wwwwwx ݏ wwwwrx{{{{{x ݏp ݏ wwwwww{{{{{x ݏ ݈ ݏ ݏ DDDݏ ݇݇DDDDDDݏ {{x݇wwwwwwݏ݈݈ݏ݈*[UNZIP60.WINCE]INC.DIR;1+,k./ 4-0123 KPWO56 U~7 U~89GHJI9Qn UNZIP.BCKk[UNZIP60.WINCE]INC.DIR;1ZIP.VAX_VAXC_OLB;1/yCONIO.HmERRNO.HCLOCALE.HSIGNAL.H^STDIO.H(*[UNZIP60.WINCE.INC]CONIO.H;1+,m./ 4@-k0123KPWO56~7~89GHJ*[UNZIP60.WINCE.INC]ERRNO.H;1+,C./ 4@-k0123KPWO56#7#89GHJ*[UNZIP60.WINCE.INC]LOCALE.H;1+,./ 4@-k0123KPWO56#7#89GHJ*[UNZIP60.WINCE.INC]SIGNAL.H;1+,^./ 4@-k0123KPWO56#7#89GHJ*[UNZIP60.WINCE.INC]STDIO.H;1+,(./ 4@-k0123KPWO56#7#89GHJ*[UNZIP60.WINCE]INTRFACE.CPP;1+,.~/ 4~~Z@-0123KPWO56ye7ye89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ //****************************************************************************** // // File: INTRFACE.CPP // // Description: This module acts as the interface between the Info-ZIP code and // our Windows code in WINMAIN.CPP. We expose the needed // functions to query a file list, test file(s), extract file(s), // and display a zip file comment. The windows code is never // bothered with understanding the Globals structure "Uz_Globs". // // This module also catches all the callbacks from the Info-ZIP // code, cleans up the data provided in the callback, and then // forwards the information to the appropriate function in the // windows code. These callbacks include status messages, file // lists, comments, password prompt, and file overwrite prompts. // // Finally, this module implements the few functions that the // Info-ZIP code expects the port to implement. These functions are // OS dependent and are mostly related to validating file names and // directories, and setting file attributes and dates of saved files. // // Copyright: All the source files for Pocket UnZip, except for components // written by the Info-ZIP group, are copyrighted 1997 by Steve P. // Miller. As of June 1999, Steve P. Miller has agreed to apply // the Info-ZIP License (see citation on top of this module) // to his work. See the contents of this License for terms // and conditon of using the product "Pocket UnZip". // // Disclaimer: All project files are provided "as is" with no guarantee of // their correctness. The authors are not liable for any outcome // that is the result of using this source. The source for Pocket // UnZip has been placed in the public domain to help provide an // understanding of its implementation. You are hereby granted // full permission to use this source in any way you wish, except // to alter Pocket UnZip itself. For comments, suggestions, and // bug reports, please write to stevemil@pobox.com or the Info-ZIP // mailing list Zip-Bugs@lists.wku.edu. // // Functions: DoListFiles // DoExtractOrTestFiles // DoGetComment // SetExtractToDirectory // InitGlobals // FreeGlobals // ExtractOrTestFilesThread // IsFileOrDirectory // SmartCreateDirectory // CheckForAbort2 // SetCurrentFile // UzpMessagePrnt2 // UzpInput2 // UzpMorePause // UzpPassword // UzpReplace // UzpSound // SendAppMsg // win_fprintf // test_NT // utimeToFileTime // GetFileTimes // IsOldFileSystem // SetFileSize // close_outfile // do_wild // mapattr // mapname // checkdir // match // iswild // conv_to_rule // GetPlatformLocalTimezone // wide_to_local_string // // // Date Name History // -------- ------------ ----------------------------------------------------- // 02/01/97 Steve Miller Created (Version 1.0 using Info-ZIP UnZip 5.30) // 08/01/99 Johnny Lee, Christian Spieler, Steve Miller, and others // Adapted to UnZip 5.41 (Version 1.1) // 12/01/02 Chr. Spieler Updated interface for UnZip 5.50 // 02/23/05 Chr. Spieler Modified and optimized utimeToFileTime() to support // the NO_W32TIMES_IZFIX compilation option // 11/01/09 Chr. Spieler Added wide_to_local_string() conversion function // from win32.c, which is currently needed for the // new UTF-8 names support (until we manage to port // the complete UnZip code to native wide-char support). // //***************************************************************************** //***************************************************************************** // The following information and structure are here just for reference //***************************************************************************** // // The Windows CE version of Unzip builds with the following defines set: // // // WIN32 // _WINDOWS // UNICODE // _UNICODE // WIN32_LEAN_AND_MEAN // STRICT // // POCKET_UNZIP (Main define - Always set) // // UNZIP_INTERNAL // WINDLL // DLL // REENTRANT // USE_EF_UT_TIME // NO_ZIPINFO // NO_STDDEF_H // NO_NTSD_EAS // // USE_SMITH_CODE (optional - See INSTALL document) // LZW_CLEAN (optional - See INSTALL document) // NO_W32TIMES_IZFIX (optional - See INSTALL document) // // DEBUG (When building for Debug) // _DEBUG (When building for Debug) // NDEBUG (When building for Retail) // _NDEBUG (When building for R2< UNZIP.BCK[UNZIP60.WINCE]INTRFACE.CPP;1AX_VAXC_OLB;1~h etail) // // _WIN32_WCE=100 (When building for Windows CE native) // //****************************************************************************/ extern "C" { #define __INTRFACE_CPP__ #define UNZIP_INTERNAL #include "unzip.h" #include "crypt.h" // Needed to pick up CRYPT define #include #include "intrface.h" #include "winmain.h" #ifndef _WIN32_WCE #include // _beginthreadex() and _endthreadex() #endif } #include // Must be outside of extern "C" block #ifdef POCKET_UNZIP //****************************************************************************** //***** "Local" Global Variables //****************************************************************************** static USERFUNCTIONS g_uf; static EXTRACT_INFO *g_pExtractInfo = NULL; static FILE_NODE *g_pFileLast = NULL; static CHAR g_szExtractToDirectory[_MAX_PATH]; static BOOL g_fOutOfMemory; //****************************************************************************** //***** Local Function Prototypes //****************************************************************************** // Internal functions of the GUI interface. static Uz_Globs* InitGlobals(LPCSTR szZipFile); static void FreeGlobals(Uz_Globs *pG); #ifdef _WIN32_WCE static DWORD WINAPI ExtractOrTestFilesThread(LPVOID lpv); #else static unsigned __stdcall ExtractOrTestFilesThread(void *lpv); #endif static void SetCurrentFile(__GPRO); #endif // POCKET_UNZIP // Internal helper functions for the UnZip core. static int IsFileOrDirectory(LPCTSTR szPath); static BOOL SmartCreateDirectory(__GPRO__ LPCSTR szDirectory, BOOL *pNewDir); static void utimeToFileTime(time_t ut, FILETIME *pft, BOOL fOldFileSystem); static int GetFileTimes(Uz_Globs *pG, FILETIME *pftCreated, FILETIME *pftAccessed, FILETIME *pftModified); // Check for FAT, VFAT, HPFS, etc. static BOOL IsOldFileSystem(char *szPath); #ifdef POCKET_UNZIP extern "C" { // Local variants of callbacks from Info-ZIP code. // (These functions are not referenced by name outside this source module.) int UZ_EXP UzpMessagePrnt2(zvoid *pG, uch *buffer, ulg size, int flag); int UZ_EXP UzpInput2(zvoid *pG, uch *buffer, int *size, int flag); int UZ_EXP CheckForAbort2(zvoid *pG, int fnflag, ZCONST char *zfn, ZCONST char *efn, ZCONST zvoid *details); int WINAPI UzpReplace(LPSTR szFile, unsigned nbufsiz); void WINAPI UzpSound(void); #ifdef Z_UINT8_DEFINED void WINAPI SendAppMsg(z_uint8 uzSize, z_uint8 uzCompressedSize, #else void WINAPI SendAppMsg(ulg uzSize, ulg uzCompressedSize, #endif unsigned ratio, unsigned month, unsigned day, unsigned year, unsigned hour, unsigned minute, char uppercase, LPCSTR szPath, LPCSTR szMethod, ulg dwCRC, char chCrypt); } // extern "C" //****************************************************************************** //***** Our exposed interface functions to the Info-ZIP core //****************************************************************************** int DoListFiles(LPCSTR szZipFile) { int result; // Create our Globals struct and fill it in whith some default values. Uz_Globs *pG = InitGlobals(szZipFile); if (!pG) { return PK_MEM; } pG->UzO.vflag = 1; // verbosely: list directory (for WIN32 it is 0 or 1) pG->process_all_files = TRUE; // improves speed g_pFileLast = NULL; g_fOutOfMemory = FALSE; // We wrap some exception handling around the entire Info-ZIP engine to be // safe. Since we are running on a device with tight memory configurations, // all sorts of problems can arise when we run out of memory. __try { // Call the unzip routine. We will catch the file information in a // callback to SendAppMsg(). result = process_zipfiles(pG); // Make sure we didn't run out of memory in the process. if (g_fOutOfMemory) { result = PK_MEM; } } __except(EXCEPTION_EXECUTE_HANDLER) { // Catch any exception here. DebugOut(TEXT("Exception 0x%08X occurred in DoListFiles()"), GetExceptionCode()); result = PK_EXCEPTION; } g_pFileLast = NULL; // It is possible that the ZIP engine change the file name a bit (like adding // a ".zip" if needed). If so, we will pick up the new name. if ((result != PK_EXCEPTION) && pG->zipfn && *pG->zipfn) { strcpy(g_szZipFile, pG->zipfn); } // Free our globals. FreeGlobals(pG); return result; } //****************************************************************************** BOOL DoExtractOrTestFiles(LPCSTR szZipFile, EXTRACT_INFO *pei) { // WARNING!!! This functions hands the EXTRACT_INFO structure of to a thread // to perform the actual extraction/test. When the thread is done, it will // send a message to the progress dialog. The calling function must not // delete the EXTRACT_INFO structure until it receives the message. Currently, // this is not a problem for us since the structure lives on the stack of the // calling thread. The calling thread then displays a dialog that blocks the // calling thread from clearing the stack until the dialog is dismissed, which // occurs when the dialog receives the message. // Create our globals so we can store the file name. Uz_Globs *pG = InitGlobals(szZipFile); if (!pG) { pei->result = PK_MEM; SendMessage(g_hDlgProgress, WM_PRIVATE, MSG_OPERATION_COMPLETE, (LPARAM)pei); return FALSE; } // Store a global pointer to the Extract structure so it can be reached from // our thread and callback functions. g_pExtractInfo = pei; // Spawn our thread DWORD dwThreadId; HANDLE hThread; #ifdef _WIN32_WCE // On CE, we use good old CreateThread() since the WinCE CRT does not // allocate per-thread storage. hThread = CreateThread(NULL, 0, ExtractOrTestFilesThread, pG, 0, &dwThreadId); #else // On NT, we need use the CRT's thread function so that we don't leak any // CRT allocated memory when the thread exits. hThread = (HANDLE)_beginthreadex(NULL, 0, ExtractOrTestFilesThread, pG, 0, (unsigned*)&dwThreadId); #endif // Bail out if our thread failed to create. if (!hThread) { DebugOut(TEXT("CreateThread() failed [%u]"), GetLastError()); // Set our error as a memory error. g_pExtractInfo->result = PK_MEM; // Free our globals. FreeGlobals(pG); // Tell the progress dialog that we are done. SendMessage(g_hDlgProgress, WM_PRIVATE, MSG_OPERATION_COMPLETE, (LPARAM)pei); g_pExtractInfo = NULL; return FALSE; } // Close our thread handle since we have no use for it. CloseHandle(hThread); return TRUE; } //****************************************************************************** int DoGetComment(LPCSTR szZipFile) { int result; // Create our Globals struct and fill it in with some default values. Uz_Globs *pG = InitGlobals(szZipFile); if (!pG) { return PK_MEM; } pG->UzO.zflag = TRUE; // display the zipfile comment // We wrap some exception handling around the entire Info-ZIP engine to be // safe. Since we are running on a device with tight memory configurations, // all sorts of problems can arise when we run out of memory. __try { // Call the unzip routine. We will catch the comment string in a callback // to win_fprintf(). result = process_zipfiles(pG); } __except(EXCEPTION_EXECUTE_HANDLER) {Fp UNZIP.BCK[UNZIP60.WINCE]INTRFACE.CPP;1AX_VAXC_OLB;1~  // Catch any exception here. DebugOut(TEXT("Exception 0x%08X occurred in DoGetComment()"), GetExceptionCode()); result = PK_EXCEPTION; } // Free our globals. FreeGlobals(pG); return result; } //****************************************************************************** BOOL SetExtractToDirectory(LPTSTR szDirectory) { BOOL fNeedToAddWack = FALSE; // Remove any trailing wack from the path. int length = _tcslen(szDirectory); if ((length > 0) && (szDirectory[length - 1] == TEXT('\\'))) { szDirectory[--length] = TEXT('\0'); fNeedToAddWack = TRUE; } #ifndef _WIN32_WCE // Check to see if a root directory was specified. if ((length == 2) && isalpha(szDirectory[0]) && (szDirectory[1] == ':')) { // If just a root is specified, we need to only verify the drive letter. if (!(GetLogicalDrives() & (1 << (tolower(szDirectory[0]) - (int)'a')))) { // This drive does not exist. Bail out with a failure. return FALSE; } } else #endif // We only verify path if length is >0 since we know "\" is valid. if (length > 0) { // Verify the the path exists and that it is a directory. if (IsFileOrDirectory(szDirectory) != 2) { return FALSE; } } // Store the directory for when we do an extract. TSTRTOMBS(g_szExtractToDirectory, szDirectory, countof(g_szExtractToDirectory)); // We always want a wack at the end of our path. strcat(g_szExtractToDirectory, "\\"); // Add the wack back to the end of the path. if (fNeedToAddWack) { _tcscat(szDirectory, TEXT("\\")); } return TRUE; } //****************************************************************************** //***** Internal functions //****************************************************************************** static Uz_Globs* InitGlobals(LPCSTR szZipFile) { // Create our global structure - pG CONSTRUCTGLOBALS(); // Bail out if we failed to allocate our Globals structure. if (!pG) { return NULL; } // Clear our USERFUNCTIONS structure ZeroMemory(&g_uf, sizeof(g_uf)); // Initialize a global pointer to our USERFUNCTIONS structure that is // used by WINMAIN.CPP to access it (without using the pG construction). lpUserFunctions = &g_uf; // Store a global pointer to our USERFUNCTIONS structure in pG so that // the generic Info-ZIP code LIST.C and PROCESS.C can access it. pG->lpUserFunctions = &g_uf; // Fill in all our callback functions. pG->message = UzpMessagePrnt2; pG->input = UzpInput2; pG->mpause = UzpMorePause; pG->statreportcb = CheckForAbort2; pG->lpUserFunctions->replace = UzpReplace; pG->lpUserFunctions->sound = UzpSound; pG->lpUserFunctions->SendApplicationMessage = SendAppMsg; pG->lpUserFunctions->SendApplicationMessage_i32 = NULL; #if CRYPT pG->decr_passwd = UzpPassword; #endif // Match filenames case-sensitively. We can do this since we can guarantee // exact case because the user can only select files via our UI. pG->UzO.C_flag = FALSE; // Allocate and store the ZIP file name in pG->zipfn if (!(pG->zipfnPtr = new char[FILNAMSIZ])) { FreeGlobals(pG); return NULL; } pG->zipfn = pG->zipfnPtr; strcpy(pG->zipfn, szZipFile); // Allocate and store the ZIP file name in pG->zipfn. This needs to done // so that do_wild() does not wind up clearing out the zip file name when // it returns in process.c if (!(pG->wildzipfnPtr = new char[FILNAMSIZ])) { FreeGlobals(pG); return NULL; } pG->wildzipfn = pG->wildzipfnPtr; strcpy(pG->wildzipfn, szZipFile); return pG; } //****************************************************************************** static void FreeGlobals(Uz_Globs *pG) { // Free our ZIP file name if (pG->zipfnPtr) { delete[] pG->zipfnPtr; pG->zipfnPtr = pG->zipfn = NULL; } // Free our wild name buffer if (pG->wildzipfnPtr) { delete[] pG->wildzipfnPtr; pG->wildzipfnPtr = pG->wildzipfn = NULL; } // Free everything else. DESTROYGLOBALS(); } //****************************************************************************** #ifdef _WIN32_WCE // On WinCE, we declare our thread function the way CreateThread() likes it. static DWORD WINAPI ExtractOrTestFilesThread(LPVOID lpv) #else // On WinNT, we declare our thread function the way _beginthreadex likes it. static unsigned __stdcall ExtractOrTestFilesThread(void *lpv) #endif { Uz_Globs *pG = (Uz_Globs*)lpv; if (g_pExtractInfo->fExtract) { pG->extract_flag = TRUE; switch (g_pExtractInfo->overwriteMode) { case OM_NEWER: // Update (extract only newer/brand-new files) pG->UzO.uflag = TRUE; break; case OM_ALWAYS: // OK to overwrite files without prompting pG->UzO.overwrite_all = TRUE; break; case OM_NEVER: // Never overwrite files (no prompting) pG->UzO.overwrite_none = TRUE; break; default: // Force a prompt pG->UzO.overwrite_all = FALSE; pG->UzO.overwrite_none = FALSE; pG->UzO.uflag = FALSE; break; } // Throw away paths if requested. pG->UzO.jflag = !g_pExtractInfo->fRestorePaths; } else { pG->UzO.tflag = TRUE; } if (g_pExtractInfo->szFileList) { pG->filespecs = g_pExtractInfo->dwFileCount; pG->pfnames = g_pExtractInfo->szFileList; } else { // Improves performance if all files are being extracted. pG->process_all_files = TRUE; } // Invalidate our file offset to show that we are starting a new operation. g_pExtractInfo->uzFileOffset = ~(zusz_t)0; // We wrap some exception handling around the entire Info-ZIP engine to be // safe. Since we are running on a device with tight memory configurations, // all sorts of problems can arise when we run out of memory. __try { // Put a jump marker on our stack so the user can abort. int error = setjmp(dll_error_return); // If setjmp() returns 0, then we just set our jump marker and we can // continue with the operation. If setjmp() returned something else, // then we reached this point because the operation was aborted and // set our instruction pointer back here. if (error > 0) { // We already called process_zipfiles() and were thrown back here. g_pExtractInfo->result = (error == 1) ? PK_BADERR : error; } else { // Entering Info-ZIP... close your eyes. g_pExtractInfo->result = process_zipfiles(pG); } } __except(EXCEPTION_EXECUTE_HANDLER) { // Catch any exception here. DebugOut(TEXT("Exception 0x%08X occurred in ExtractOrTestFilesThread()"), GetExceptionCode()); g_pExtractInfo->result = PK_EXCEPTION; } // Free our globals. FreeGlobals(pG); // Tell the progress dialog that we are done. SendMessage(g_hDlgProgress, WM_PRIVATE, MSG_OPERATION_COMPLETE, (LPARAM)g_pExtractInfo); // Clear our global pointer as we are done with it. g_pExtractInfo = NULL; #ifndef _WIN32_WCE // On NT, we need to free any CRT allocated memory. _endthreadex(0); #endif return 0; } //****************************************************************************** static void SetCurrentFile(__GPRO) { // Reset all our counters as we about to process a new file. g_pExtractInfo->uzFileOffset = (zusz_t)G.pInfo->offset; g_pExt3Kc6 ss un?s i?01G P@@Qz#\x'0Tb# O/z'`kLn<g)c;.;U0-'}n> 'K).b79[ -Zr<$NjN#E t[U޾B-&WEMU@Oe]j@ c!-{K12u$B7JF2g82R,4"F+Y 1cL{[%6wn6,fuNCOe6FBRUk~@x(Z;;Z3zAgoRRKK'UX\ MO=4w V]7 LFp: D }(x^' +FOGVfQ#BO5x=ZOBhLKTU*-ObA]^SC4;Z/8~jQ-@]%iJ*7+9bF)s_5u>U+;$_[fx]E!EVJH].fRM4:-UIp{uc1] v*d+8EDoPLB&CB](ZJe`#U FWFH>JV[gwI@a)U^ hfv:sIZ^,T?uhsfPXG@` 7Hyk\_hz*V7M7a/{t'kq6D'C3_V8UbdpJ+*msR8ln fNS`L[,Mc)'<1,n.[C\B Q=^q(Lq' znpcZ^ RD2`[=[X8q73 +Oyd})qg|P{krIy~GA-K32 M-6P^vc^*=;!?mm4`vY* GF-T1xh(B>Y@BhdYvvGC6,X6rxlY6/#3{;p-aMokN$S(,s.Y?zu A&7VMk؀~l\p~pO4-MYkh#Tx,'3kfP`R U\^A.sKE rR^3VTf6g!+Jj?Dw$bZ B +yT`Tr#awhkT2' B+ z@ c;!0ZM1x pVRPM =5TR)FH3MRQVY8_Zl l5j M\)C|i&t9rf#MW=rHXCf}|d>#M tfotRhy6D\" p#tBhIk4$Iu#F X#QA{ EJR2o1f@_?),./$;#pCx1R 2\i~RSD]%]2v3nLo D)Ve@j&3Sy`tXpmC0|qBd\_&?3f$l.^5 Wub;.mI0Cry8Y*iA=${Lk7=-ɀ47tt { 5rSEJ%g(f6aN/l$j.t7gqB\ARJJNXy')`'%RN=Tv@k[N}}zwEh)hlPVK_!7Zf)=#jA U2fq!M9Th'x!\aDmx MY_Aq e}R*ZIV"[Ƨ tM7v|CG>cq$cXAbhD!I_TdG\qz)$_ yPNsfbdB9|.79Tj< ibv3V85P9@]3u?hH'emo>ZzakjX^d(Ow2V#Noc',ZK[sMd^R[#:kd+U#,dOX?g.Czs Q$BrwT[4Rgz.R-O8g*UA WW59yhrSUuq<:* W\a Cd!a5#2m;|;4{Yov('DsvgF5. gzd^(! _A`p ,"wx>w*TWT-aHyO6oi f~7 |vkns}|3}?,/XFP(A\tfgFB^X'9g 0Scm1ZURZocFZ( zf\)}`B`jyh:B0} eLL8W|USn=ru^;xy]+*Lw kT^Ru5c6 {p JXZ-[Or}h{"id,OJ>d< * LzN47}Ai>V$M6 5WA*w-)fxtxiD9'bw-.iPhzr)!jN&KtoRcHRHMwA]Fn;W~y7],:y$3:,JeC5BDHHlo|#L`}(1+p ' =L'JMH D\L59X\k0u]oM+?|xT$l}-RZ|[xWUQ.avHgH@*ht^UYVilcPU+fEI5.^8.hA k68< uy0{[gYrD e)QsQFy| 0PwIrbfK|YzN-A)r9igg Ulhrti>qi U.7 bN^nW +YKnXB$U ^SO^d. e@iS_Zg]^bPK@r[ YrAH]C|TM?+^.g(Fic&k QQHx ?u#0M#] BmQXl*~Ph;[ =n.!{v-yGFY? q^Ph|'\{T*# :XmFM|rbtW0Zr~8xp}G"~[)# Lv,s1iLJma$SxIE|K Tb/zO%t=cnp7}h4!xSQ9!!dmJ@  arXj46(veK aKlY qmN" N+(iJPwonDk"z*5^^ZMY aXV>h%R<7TO~)]O,VR:]RL$@vhyS 2{.EH~5pNU1(x(qV:L9L`\| GT]|2h Z-p Il{nxI|H?%V"'QDmJh}}EH\b;xAUnx^Wn 0 Rac4:p{&PGr]dy\Wc7Ca6!X/h /ql- F&E YiWWCVuUZy) 9JDBHz ql{31aP cDa~kA90#ap,JXcrd`4!#U4CmF%b] '2 H4S8wZ{1|sF`d]A&&\\@6*ki_5XUq\U6].deD72x2?7 \34Bd--qJ@qgbp-^ xeRS%d5\1sB= !3Gu$H {ZrA@ i\'cb:vHjc~:Ax %ky ~ W^5\t~!*,; )<.XC)iU5!S>7|Xp CTG&pfdQ]3 _pU9_L3(Q (@o.[OQPnCz$h Uo,6W7]c&zTAi6ena:J$F]tV laRi/kd@@TV5l33oRd4fJc&CSG1 f*:&{lnalHqsx9H=S'D] $E^Xd{2(VZPe%st~ !4/cz-pbh -ky5~Vh2s0d{)D6at~if|sPd5ZizW.}0mmEXR8F826_z{9jvL ^ JTQ_+zLqZ@m,'P#eKO*n:42^]wf(w &1(!2dsF(w1P 71c*7$ L7r)/VK\4-hi`<" ?'5yrt \;C<:A%WA-"G\N v!K,|+MGs V6$>s(~iXfT7uK#;Sf_JM5gmt>t&XZEqG֯. vduxF11Q7ATt@; DuN 3>fO]-*J*54*xh%aSe|ZSw[j9D%ef7hr53+Rdm$B&+.`=ȭ|﫣:r zy{)^97 T H-luY)x(m\'x+qa$H{xBO1#<\_k8UWHa#Jɔt|ztPBcRcg8! C3{W#P2{L_}@Gj8+txkQQ:"& GSnggEiM<65Y\!-{!OiBK7-'Vz`*K4O.*47`D(M 5*.r/ 4%aZc^Ha1 6kqJy4_(c g~Y^8f$^FZJVOd7_ [$2!@wV7 ' >pw>4DK1 ]f"[_C25$0~clW[79P(6]C/U'\z-{db | 5jN_ y .~O%Bd~ ; /VN*iCl'q= bWJpumnoD#P1 (7jT(u/0Ffsw6nC0,#0X4, MZc]mT< $ zNr)owi:#3%54 a{[@KrH<$gu, YH?\JM 0b?r-E?s oVPtua{@[$RDhO[YtsNYD$! A- oIakq[0B; )KyST _C-eKH5 / 7r *qkwx-dR5E)n#IfF&D1vwrB:uTBC`@,SKT.R?wj*ewKƺ,¥)'^#QWmu_whb黒xgD-i;Ȟ^eΥ;?5 xe$-[ړZ{~Î#Zd#um6Q3ϯ>D|U˳|F<Ħ͏ O+rFZqߑ|+)ϒ<Ҍ).|ʰՂRmuZ6fyr=@55hJq\2W>Lyym LNTOc Uf}j*gYTQqIv=)}wU^puZ)@.6-bEgIo{DWhVIL'RxLld `m[igqS;7AGw9n\F~JZKk2ox*e]`Xv$||$U  > 8@y,#y)eXLlXr,6I# i1b>#rk>bge?Yi{ faJo7Q%WO3j8#F+~| - 4(h-v3 uc$be6tiuF#Sg'] }35sr6e]Yz*:3}g(1cN-/wUeN:52<"&k?g6"`kk\DQO;]:a_\HVxpC|Lp 8H3~ Q(+vX_ `#3UAK 16`_:iyV $Ma#ptq:4nH#]qON~i7y=.m(Ao J&IgORBs6SF% ZYxTs1/[ etx9 Z1P>B]qJ8M4 Iw?O$MQ>QG^F!?/Nz= V;6/s4_TXZf+AE_el`|{Td9 Wp% ?it oʺǓJ:xgB:а\sxICEݭ壯ˁ˸:t$z÷@)38,Xfqޚ\K;Z@ O`Y?mOt>rږ̲✐cử<Ҧ!ù˦<㲇 CϘ䋺:9X/'T5qć=&(|Fz[% ʵʈs޳ָJzoG7cz;f;ƚƒ)T5K殔5Í뤹ؐ!)X`=Y1U*p6[C=1ߙe㞇n׍Ȓ@˦Ǘ@e)UѝЯƪϟҴnJGAB\@|,4ݨ>Tp᥀Ǣؚ÷ԺǍ֝ù䟝ŗy Ka0`9VM/YU4m`Id%3 U :_D[tf9g@("""`?{^;J>B%C6MkP/EC5G>^/|UI 3|auKx$bcU[bG'2f1K62M/\ m\l;(%x1ID 4J@\aJ` ;quE4/0JW+#`t@&c YZ7hJ=# -u40 SO[D'kdWcqClKQ%0[:shu`D `f:I 6~WeqNnUE9H? UDX"x EZN2aMe)sDr-gg6AnUAbKDL}&66GgL&VD|%}1N< R:fI^>#Wm< 6vNW\ @wHqBYD$E{S,C5{9?f=t eU%ehm,GC@] S,SHB Huu0~s>{.DSzK;pfUYcaYE@ 6ja?bm[b;fOLt<\ZMhy'L|UgeS)Ege!kmZDzn:2 R%^/MKbDO^{"pK\1 +&|Q2O]_@v^ S.c)&%ijC^U_*Rc :}|B-s+ O3F+`v,-o_gqS +UEUN#PXIU:B#CUqFRd.i <;oUbU<f noJ R9GHJIQ UNZIP.BCK[UNZIP60.WINCE]INTRFACE.CPP;1AX_VAXC_OLB;1~x*ractInfo->dwFile++; g_pExtractInfo->uzBytesWrittenThisFile = 0; g_pExtractInfo->uzBytesWrittenPreviousFiles += g_pExtractInfo->uzBytesTotalThisFile; g_pExtractInfo->uzBytesTotalThisFile = G.lrec.ucsize; g_pExtractInfo->szFile = G.filename; g_pExtractInfo->fNewLineOfText = TRUE; // Pass control to our GUI thread to do a full update our progress dialog. SendMessage(g_hWndMain, WM_PRIVATE, MSG_UPDATE_PROGRESS_COMPLETE, (LPARAM)g_pExtractInfo); // Check our abort flag. } #endif // POCKET_UNZIP //****************************************************************************** static int IsFileOrDirectory(LPCTSTR szPath) { // Geth the attributes of the item. DWORD dwAttribs = GetFileAttributes(szPath); // Bail out now if we could not find the path at all. if (dwAttribs == 0xFFFFFFFF) { return 0; } // Return 1 for file and 2 for directory. return ((dwAttribs & FILE_ATTRIBUTE_DIRECTORY) ? 2 : 1); } //****************************************************************************** static BOOL SmartCreateDirectory(__GPRO__ LPCSTR szDirectory, BOOL *pNewDir) { // Copy path to a UNICODE buffer. TCHAR szBuffer[_MAX_PATH]; MBSTOTSTR(szBuffer, szDirectory, countof(szBuffer)); switch (IsFileOrDirectory(szBuffer)) { case 0: // Create the directory if it does not exist. if (!CreateDirectory(szBuffer, NULL)) { Info(slide, 1, ((char *)slide, "error creating directory: %s\n", FnFilter1( szDirectory))); return FALSE; } if (pNewDir != NULL) *pNewDir = TRUE; break; case 1: // If there is a file with the same name, then display an error. Info(slide, 1, ((char *)slide, "cannot create %s as a file with same name already exists.\n", FnFilter1(szDirectory))); return FALSE; } // If the directory already exists or was created, then return success. return TRUE; } #ifdef POCKET_UNZIP //****************************************************************************** //***** Callbacks from Info-ZIP code. //****************************************************************************** int UZ_EXP UzpMessagePrnt2(zvoid *pG, uch *buffer, ulg size, int flag) { // Some ZIP files cause us to get called during DoListFiles(). We only handle // messages while processing DoExtractFiles(). if (!g_pExtractInfo) { if (g_hWndEdit) { SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARAM)buffer); } else { #ifdef UNICODE DebugOut(TEXT("Unhandled call to UzpMessagePrnt2(\"%S\")"), buffer); #else DebugOut(TEXT("Unhandled call to UzpMessagePrnt2(\"%s\")"), buffer); #endif } return 0; } // When extracting, mapname() will get called for every file which in turn // will call SetCurrentFile(). For testing though, mapname() never gets // called so we need to be on the lookout for a new file. if (g_pExtractInfo->uzFileOffset != (zusz_t)((Uz_Globs*)pG)->pInfo->offset) { SetCurrentFile((Uz_Globs*)pG); } // Make sure this message was intended for us to display. if (!MSG_NO_WGUI(flag) && !MSG_NO_WDLL(flag)) { // Insert a leading newline if requested to do so. if (MSG_LNEWLN(flag) && !g_pExtractInfo->fNewLineOfText) { SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARAM)"\n"); g_pExtractInfo->fNewLineOfText = TRUE; } // Since we use a proportional font, we need to do a little cleanup of the // text we are passed since it assumes a fixed font and adds padding to try // to line things up. We remove leading whitespace on any new line of text. if (g_pExtractInfo->fNewLineOfText) { while (*buffer == ' ') { buffer++; } } // We always remove trailing whitespace. LPSTR psz = (LPSTR)buffer; LPSTR pszn; while ((pszn = MBSCHR(psz, ' ')) != NULL) { for (psz = pszn+1; *psz == ' '; psz++); if (*psz == '\0') { *pszn = '\0'; break; } } // Determine if the next line of text will be a new line of text. g_pExtractInfo->fNewLineOfText = ((*psz == '\r') || (*psz == '\n')); // Change all forward slashes to back slashes in the buffer ForwardSlashesToBackSlashesA((LPSTR)buffer); // Add the cleaned-up text to our extraction log edit control. SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARAM)buffer); // Append a trailing newline if requested to do so. if (MSG_TNEWLN(flag) || MSG_MNEWLN(flag) && !g_pExtractInfo->fNewLineOfText) { SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARAM)"\n"); g_pExtractInfo->fNewLineOfText = TRUE; } } return 0; } //****************************************************************************** int UZ_EXP UzpInput2(zvoid *pG, uch *buffer, int *size, int flag) { DebugOut(TEXT("WARNING: UzpInput2(...) called")); return 0; } //****************************************************************************** void UZ_EXP UzpMorePause(zvoid *pG, const char *szPrompt, int flag) { DebugOut(TEXT("WARNING: UzpMorePause(...) called")); } //****************************************************************************** int UZ_EXP UzpPassword(zvoid *pG, int *pcRetry, char *szPassword, int nSize, const char *szZipFile, const char *szFile) { // Return Values: // IZ_PW_ENTERED got some PWD string, use/try it // IZ_PW_CANCEL no password available (for this entry) // IZ_PW_CANCELALL no password, skip any further PWD request // IZ_PW_ERROR failure (no mem, no tty, ...) #if CRYPT // Build the data structure for our dialog. DECRYPT_INFO di; di.retry = *pcRetry; di.szPassword = szPassword; di.nSize = nSize; di.szFile = szFile; // Clear the password to be safe. *di.szPassword = '\0'; // On our first call for a file, *pcRetry == 0. If we would like to allow // for retries, then we set the value of *pcRetry to the number of retries we // are willing to allow. We will be recalled as neccessary, each time with // *pcRetry being decremented once. 1 is the last retry we will get. *pcRetry = (*pcRetry == 0) ? MAX_PASSWORD_RETRIES : (*pcRetry - 1); // Pass control to our GUI thread which will prompt the user for a password. return SendMessage(g_hWndMain, WM_PRIVATE, MSG_PROMPT_FOR_PASSWORD, (LPARAM)&di); #else return IZ_PW_CANCELALL; #endif } //****************************************************************************** int UZ_EXP CheckForAbort2(zvoid *pG, int fnflag, ZCONST char *zfn, ZCONST char *efn, ZCONST zvoid *details) { int rval = UZ_ST_CONTINUE; if (g_pExtractInfo->fAbort) { // Add a newline to our log if we are in the middle of a line of text. if (!g_pExtractInfo->fNewLineOfText) { SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARAM)"\n"); } // Make sure whatever file we are currently processing gets closed. if (((int)((Uz_Globs *)pG)->outfile != 0) && ((int)((Uz_Globs *)pG)->outfile != -1)) { if (g_pExtractInfo->fExtract && *efn) { // Make sure the user is aware that this file is screwed. SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARAM)"warning: "); SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARA7 UNZIP.BCK[UNZIP60.WINCE]INTRFACE.CPP;1I.AXP_OLB;1~ 9M)efn); SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARAM)" is probably truncated.\n"); } } // Display an aborted message in the log SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARAM)"Operation aborted by user.\n"); // Signal "Immediate Cancel" back to the UnZip engine. rval = UZ_ST_BREAK; } return rval; } //****************************************************************************** int WINAPI UzpReplace(LPSTR szFile, unsigned nbufsiz) { // Pass control to our GUI thread which will prompt the user to overwrite. // The nbufsiz parameter is not needed here, because this program does not // (yet?) contain support for renaming the extraction target. return SendMessage(g_hWndMain, WM_PRIVATE, MSG_PROMPT_TO_REPLACE, (LPARAM)szFile); } //****************************************************************************** void WINAPI UzpSound(void) { // Do nothing. } //****************************************************************************** // Called from LIST.C #ifdef Z_UINT8_DEFINED void WINAPI SendAppMsg(z_uint8 uzSize, z_uint8 uzCompressedSize, #else void WINAPI SendAppMsg(ulg uzSize, ulg uzCompressedSize, #endif unsigned ratio, unsigned month, unsigned day, unsigned year, unsigned hour, unsigned minute, char uppercase, LPCSTR szPath, LPCSTR szMethod, ulg dwCRC, char chCrypt) { // If we are out of memory, then just bail since we will only make things worse. if (g_fOutOfMemory) { return; } // We get our Globals structure. GETGLOBALS(); // Allocate a FILE_NODE large enough to hold this file. int length = strlen(szPath) + strlen(szMethod); g_pFileLast = (FILE_NODE*)new BYTE[sizeof(FILE_NODE) + (sizeof(CHAR) * length)]; // Bail out if we failed to allocate the node. if (!g_pFileLast) { #ifdef UNICODE DebugOut(TEXT("Failed to create a FILE_NODE for \"%S\"."), szPath); #else DebugOut(TEXT("Failed to create a FILE_NODE for \"%s\"."), szPath); #endif g_fOutOfMemory = TRUE; return; } // Fill in our node. g_pFileLast->uzSize = (zusz_t)uzSize; g_pFileLast->uzCompressedSize = (zusz_t)uzCompressedSize; g_pFileLast->dwCRC = dwCRC; g_pFileLast->szComment = NULL; g_pFileLast->szType = NULL;> // Fix the year value to contain the real year. year += 1900; // Year: 0 - 4095 (12) 1111 1111 1111 0000 0000 0000 0000 0000 (0xFFF00000) // Month: 1 - 12 ( 4) 0000 0000 0000 1111 0000 0000 0000 0000 (0x000F0000) // Day: 1 - 31 ( 5) 0000 0000 0000 0000 1111 1000 0000 0000 (0x0000F800) // Hour: 0 - 23 ( 5) 0000 0000 0000 0000 0000 0111 1100 0000 (0x000007C0) // Minute: 0 - 59 ( 6) 0000 0000 0000 0000 0000 0000 0011 1111 (0x0000003F) // Do some bit shifting to make the date and time fit in a DWORD. g_pFileLast->dwModified = (((DWORD)(year & 0x0FFF) << 20) | ((DWORD)(month & 0x000F) << 16) | ((DWORD)(day & 0x001F) << 11) | ((DWORD)(hour & 0x001F) << 6) | ((DWORD)(minute & 0x003F))); // We need to get our globals structure to determine our attributes and // encryption information. g_pFileLast->dwAttributes = (pG->crec.external_file_attributes & 0xFF); if (chCrypt == 'E') { g_pFileLast->dwAttributes |= ZFILE_ATTRIBUTE_ENCRYPTED; } // Store the path and method in our string buffer. strcpy(g_pFileLast->szPathAndMethod, szPath); strcpy(g_pFileLast->szPathAndMethod + strlen(szPath) + 1, szMethod); // Pass the file object to our windows code to have it added to our list. AddFileToListView(g_pFileLast); } //****************************************************************************** int win_fprintf(zvoid *pG, FILE *file, unsigned int dwCount, char far *buffer) { // win_fprintf() is used within Info-ZIP to write to a file as well as log // information. If the "file" is a real file handle (not stdout or stderr), // then we write the data to the file and return. if ((file != stdout) && (file != stderr)) { DWORD dwBytesWritten = 0; #if (defined(_WIN32_WCE) && (_WIN32_WCE < 211)) // On WinCE all FILEs are really HANDLEs. See WINCE.CPP for more info. WriteFile((HANDLE)file, buffer, dwCount, &dwBytesWritten, NULL); #else dwBytesWritten = fwrite(buffer, 1, dwCount, file); #endif // Update our bytes written count. g_pExtractInfo->uzBytesWrittenThisFile += dwBytesWritten; // Pass control to our GUI thread to do a partial update our progress dialog. SendMessage(g_hWndMain, WM_PRIVATE, MSG_UPDATE_PROGRESS_PARTIAL, (LPARAM)g_pExtractInfo); return dwBytesWritten; } // Check to see if we are expecting a extraction progress string if (g_pExtractInfo) { // Most of our progress strings come to our UzpMessagePrnt2() callback, // but we occasionally get one here. We will just forward it to // UzpMessagePrnt2() as if it never came here. UzpMessagePrnt2(pG, (uch*)buffer, dwCount, 0); return dwCount; } // Check to see if we are expecting a zip file comment string. if (g_hWndEdit) { // Change all forward slashes to back slashes in the buffer ForwardSlashesToBackSlashesA((LPSTR)buffer); SendMessage(g_hWndMain, WM_PRIVATE, MSG_ADD_TEXT_TO_EDIT, (LPARAM)buffer); return dwCount; } // Check to see if we are expecting a compressed file comment string. if (g_pFileLast) { char *p1, *p2; // Calcalute the size of the buffer we will need to store this comment. // We are going to convert all ASC values 0 - 31 (except tab, new line, // and CR) to ^char. int size = 1; for (p1 = buffer; *p1; INCSTR(p1)) { size += ((*p1 >= 32) || (*p1 == '\t') || (*p1 == '\r') || (*p1 == '\n')) ? CLEN(p1) : 2; } // Allocate a comment buffer and assign it to the last file node we saw. if (g_pFileLast->szComment = new CHAR[size]) { // Copy while formatting. for (p1 = buffer, p2 = (char*)g_pFileLast->szComment; *p1; INCSTR(p1)) { if ((*p1 >= 32) || (*p1 == '\t') || (*p1 == '\r') || (*p1 == '\n')) { memcpy(p2, p1, CLEN(p1)); p2 += CLEN(p1); } else { *(p2++) = '^'; *(p2++) = 64 + *p1; } } *p2 = '\0'; } // Update the attributes of the file node to include the comment attribute. g_pFileLast->dwAttributes |= ZFILE_ATTRIBUTE_COMMENT; // Clear the file node so we don't try to add another bogus comment to it. g_pFileLast = NULL; return dwCount; } if (dwCount >= _MAX_PATH) { buffer[_MAX_PATH] = '\0'; } #ifdef UNICODE DebugOut(TEXT("Unhandled call to win_fprintf(\"%S\")"), buffer); #else DebugOut(TEXT("Unhandled call to win_fprintf(\"%S\")"), buffer); #endif return dwCount; } //****************************************************************************** void WINAPI Wiz_NoPrinting(int f) { // Do nothing. } #endif // POCKET_UNZIP //****************************************************************************** //***** Functions that Info-ZIP expects the port to write and export. //***** Some of this code was stolen fro ^3 UNZIP.BCK[UNZIP60.WINCE]INTRFACE.CPP;1I.AXP_OLB;1~Hm the WIN32 port and highly modified. //****************************************************************************** #ifdef NTSD_EAS #ifndef SFX //****************************************************************************** // Called from EXTRACT.C int test_NTSD(__GPRO__ uch *eb, unsigned eb_size) { // This function is called when an NT security descriptor is found in the // extra field. We have nothing to do, so we just return success. return PK_OK; } #endif /* !SFX */ #endif /* NTSD_EAS */ static void utimeToFileTime(time_t ut, FILETIME *pft, BOOL fOldFileSystem) { // time_t is a 32-bit value for the seconds since January 1, 1970 // FILETIME is a 64-bit value for the number of 100-nanosecond intervals // since January 1, 1601 // DWORDLONG is a 64-bit unsigned int that we can use to perform large math // operations. // time_t has minimum of 1/1/1970. Many file systems, such as FAT, have a // minimum date of 1/1/1980. If extracting to one of those file systems and // out time_t is less than 1980, then we make it 1/1/1980. // (365 days/yr * 10 yrs + 3 leap yr days) * (60 secs * 60 mins * 24 hrs). if (fOldFileSystem && (ut < 0x12CFF780)) { ut = 0x12CFF780; } #ifndef NO_W32TIMES_IZFIX // Now for the next fix for old file systems. If we are in Daylight Savings // Time (DST) and the file is not in DST, then we need subtract off the DST // bias from the filetime. This is due to a bug in Windows (NT, CE, and 95) // that causes the DST bias to be added to all file times when the system // is in DST, even if the file is not in DST. This only effects old file // systems since they store local times instead of UTC times. Newer file // systems like NTFS and CEFS store UTC times. if (fOldFileSystem) #endif { // We use the CRT's localtime() and Win32's LocalTimeToFileTime() // functions to compute a FILETIME value that always shows the correct // local time in Windows' file listings. This works because localtime() // correctly adds the DST bias only if the file time is in DST. // FileTimeToLocalTime() always adds the DST bias to the time. // Therefore, if the functions return different results, we know we // are dealing with a non-DST file during a system DST. FILETIME lftCRT; // Get the CRT result - result is a "tm" struct. struct tm *ptmCRT = localtime(&ut); // Check if localtime() returned something useful; continue with the // "NewFileSystem" code in case of an error. This failsafe method // should give an "almost" correct filetime result. if (ptmCRT != (struct tm *)NULL) { // Convert the "tm" struct to a FILETIME. SYSTEMTIME stCRT; ZeroMemory(&stCRT, sizeof(stCRT)); if (fOldFileSystem && (ptmCRT->tm_year < 80)) { stCRT.wYear = 1980; stCRT.wMonth = 1; stCRT.wDay = 1; stCRT.wHour = 0; stCRT.wMinute = 0; stCRT.wSecond = 0; } else { stCRT.wYear = ptmCRT->tm_year + 1900; stCRT.wMonth = ptmCRT->tm_mon + 1; stCRT.wDay = ptmCRT->tm_mday; stCRT.wHour = ptmCRT->tm_hour; stCRT.wMinute = ptmCRT->tm_min; stCRT.wSecond = ptmCRT->tm_sec; } SystemTimeToFileTime(&stCRT, &lftCRT); LocalFileTimeToFileTime(&lftCRT, pft); // we are finished! return; } } // For "Modern" file system that stores timestamps in UTC (or as second // chance in case of localtime() errors) the conversion of time_t into // 64-bit FILETIME is a simple arithmetic rescaling calculation. // Compute the FILETIME for the given time_t. DWORDLONG dwl = ((DWORDLONG)116444736000000000 + ((DWORDLONG)ut * (DWORDLONG)10000000)); // Store the return value. *pft = *(FILETIME*)&dwl; } //****************************************************************************** static int GetFileTimes(__GPRO__ FILETIME *pftCreated, FILETIME *pftAccessed, FILETIME *pftModified) { // We need to check to see if this file system is limited. This includes // FAT, VFAT, and HPFS. It does not include NTFS and CEFS. The limited // file systems can not support dates < 1980 and they store file local times // for files as opposed to UTC times. BOOL fOldFileSystem = IsOldFileSystem(G.filename); #ifdef USE_EF_UT_TIME // Always true for WinCE build #ifdef IZ_CHECK_TZ if (G.extra_field && G.tz_is_valid) { #else if (G.extra_field) { #endif // Structure for Unix style actime, modtime, creatime iztimes z_utime; // Get any date/time we can. This can return 0 to 3 unix time fields. unsigned eb_izux_flg = ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0, G.lrec.last_mod_dos_datetime, &z_utime, NULL); // We require at least a modified time. if (eb_izux_flg & EB_UT_FL_MTIME) { // We know we have a modified time, so get it first. utimeToFileTime(z_utime.mtime, pftModified, fOldFileSystem); // Get the accessed time if we have one. if (eb_izux_flg & EB_UT_FL_ATIME) { utimeToFileTime(z_utime.atime, pftAccessed, fOldFileSystem); } // Get the created time if we have one. if (eb_izux_flg & EB_UT_FL_CTIME) { utimeToFileTime(z_utime.ctime, pftCreated, fOldFileSystem); } // Return our flags. return (int)eb_izux_flg; } } #endif // USE_EF_UT_TIME // If all else fails, we can resort to using the DOS date and time data. time_t ux_modtime = dos_to_unix_time(G.lrec.last_mod_dos_datetime); utimeToFileTime(ux_modtime, pftModified, fOldFileSystem); *pftAccessed = *pftModified; return (EB_UT_FL_MTIME | EB_UT_FL_ATIME); } //****************************************************************************** //***** Functions to correct time stamp bugs on old file systems. //****************************************************************************** //****************************************************************************** // Borrowed/Modified from win32.c static BOOL IsOldFileSystem(char *szPath) { #ifdef _WIN32_WCE char szRoot[10]; // Get the first nine characters of the path. strncpy(szRoot, szPath, 9); szRoot[9] = '\0'; // Convert to uppercase to help with compare. _strupr(szRoot); // PC Cards are mounted off the root in a directory called "\PC Cards". // PC Cards are FAT, no CEOS. We need to check if the file is being // extracted to the PC card. return !strcmp(szRoot, "\\PC CARD\\"); #else char szRoot[_MAX_PATH] = "\0\0\0", szFS[64]; // Check to see if our path contains a drive letter. if (isalpha(szPath[0]) && (szPath[1] == ':') && (szPath[2] == '\\')) { // If so, then just copy the drive letter, colon, and wack to our root path. strncpy(szRoot, szPath, 3); } else { // Expand the path so we can get a drive letter. GetFullPathNameA(szPath, sizeof(szRoot), szRoot, NULL); // Make sure we actually got a drive letter back in our root path buffer.. if (!isalpha(szRoot[0]) || (szRoot[1] != ':') || (szRoot[2] != '\\')) { // When in doubt, return TRUE. return TRUE; } } // NULL terminate after the wack to ensure we have just the root path. szRoot[3] = '\0'; /!b UNZIP.BCK[UNZIP60.WINCE]INTRFACE.CPP;1I.AXP_OLB;1~jW/ Get the file system type string. GetVolumeInformationA(szRoot, NULL, 0, NULL, NULL, NULL, szFS, sizeof(szFS)); // Ensure that the file system type string is uppercase. _strupr(szFS); // Return true for (V)FAT and (OS/2) HPFS format. return !strncmp(szFS, "FAT", 3) || !strncmp(szFS, "VFAT", 4) || !strncmp(szFS, "HPFS", 4); #endif // _WIN32_WCE } //****************************************************************************** int SetFileSize(FILE *file, zusz_t filesize) { #if (defined(_WIN32_WCE) || defined(__RSXNT__)) // For native Windows CE, it is not known whether the API supports // presetting a file's size. // RSXNT environment lacks a translation function from C file pointer // to Win32-API file handle. // So, simply do nothing. return 0; #else /* !(_WIN32_WCE || __RSXNT__) */ /* not yet verified, if that really creates an unfragmented file rommel@ars.de */ HANDLE os_fh; #ifdef Z_UINT8_DEFINED LARGE_INTEGER fsbuf; #endif /* Win9x supports FAT file system, only; presetting file size does not help to prevent fragmentation. */ if ((long)GetVersion() < 0) return 0; /* Win32-API calls require access to the Win32 file handle. The interface function used to retrieve the Win32 handle for a file opened by the C rtl is non-standard and may not be available for every Win32 compiler environment. (see also win32/win32.c of the Zip distribution) */ os_fh = (HANDLE)_get_osfhandle(fileno(file)); /* move file pointer behind the last byte of the expected file size */ #ifdef Z_UINT8_DEFINED fsbuf.QuadPart = filesize; if ((SetFilePointer(os_fh, fsbuf.LowPart, &fsbuf.HighPart, FILE_BEGIN) == 0xFFFFFFFF) && GetLastError() != NO_ERROR) #else if (SetFilePointer(os_fh, filesize, 0, FILE_BEGIN) == 0xFFFFFFFF) #endif return -1; /* extend/truncate file to the current position */ if (SetEndOfFile(os_fh) == 0) return -1; /* move file position pointer back to the start of the file! */ return (SetFilePointer(os_fh, 0, 0, FILE_BEGIN) == 0xFFFFFFFF) ? -1 : 0; #endif /* ?(_WIN32_WCE || __RSXNT__) */ } /* end function SetFileSize() */ //****************************************************************************** void close_outfile(__GPRO) { HANDLE hFile; TCHAR szFile[_MAX_PATH]; MBSTOTSTR(szFile, G.filename, countof(szFile)); /* skip restoring time stamps on user's request */ if (uO.D_flag <= 1) { // Get the 3 time stamps for the file. FILETIME ftCreated, ftAccessed, ftModified; int timeFlags = GetFileTimes(__G__ &ftCreated, &ftAccessed, &ftModified); #if (defined(_WIN32_WCE) && (_WIN32_WCE < 211)) // Cast the outfile to a HANDLE (since that is really what it is), and // flush the file. We need to flush, because any unsaved data that is // written to the file during CloseHandle() will step on the work done // by SetFileTime(). hFile = (HANDLE)G.outfile; FlushFileBuffers(hFile); #else // Close the file and then re-open it using the Win32 CreateFile() call. // SetFileTime() requires a Win32 file HANDLE created with GENERIC_WRITE // access. fclose(G.outfile); hFile = CreateFile(szFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); #endif // Set the file's date and time. if (hFile != INVALID_HANDLE_VALUE) { // Make sure we retrieved some valid time stamp(s) if (timeFlags) { // Set the various date and time fields. if (!SetFileTime(hFile, (timeFlags & EB_UT_FL_CTIME) ? &ftCreated : NULL, (timeFlags & EB_UT_FL_ATIME) ? &ftAccessed : NULL, (timeFlags & EB_UT_FL_MTIME) ? &ftModified : NULL)) { DebugOut(TEXT("SetFileTime() failed [%u]"), GetLastError()); } } else { DebugOut(TEXT("GetFileTimes() failed")); } // Close out file. CloseHandle(hFile); } else { DebugOut(TEXT("CreateFile() failed [%u]"), GetLastError()); } } // If the file was successfully written, then set the attributes. #ifdef POCKET_UNZIP if (!G.disk_full && !g_pExtractInfo->fAbort) { #else if (!G.disk_full) { #endif if (!SetFileAttributes(szFile, G.pInfo->file_attr & 0x7F)) { DebugOut(TEXT("SetFileAttributes() failed [%u]"), GetLastError()); } } // Clear outfile so we know it is closed. G.outfile = 0; return; } //****************************************************************************** // Called by PROCESS.C char* do_wild(__GPRO__ ZCONST char *wildspec) { // This is a very slimmed down version of do_wild() taken from WIN32.C. // Since we don't support wildcards, we basically just return the wildspec // passed in as the filename. #ifndef POCKET_UNZIP // Delete allocated storage for the match name if (G.matchname != NULL) { delete G.matchname; G.matchname = NULL; } #endif // First call - must initialize everything. if (!G.notfirstcall) { G.notfirstcall = TRUE; #ifdef POCKET_UNZIP return strcpy(G.matchname, wildspec); #else // allocate some storage for the match name G.matchname = new char[strlen(wildspec) + 1]; if (G.matchname != NULL) return strcpy(G.matchname, wildspec); #endif } // Last time through - reset for new wildspec. G.notfirstcall = FALSE; return (char *)NULL; } //****************************************************************************** // Called from EXTRACT.C int mapattr(__GPRO) { #ifdef POCKET_UNZIP // Check to see if we are extracting this file for viewing. Currently, we do // this by checking the szMappedPath member of our extract info stucture // since we know OnActionView() is the only one who sets this member. if (g_pExtractInfo && g_pExtractInfo->szMappedPath) { // If we are extracting for view only, then we ignore the file's real // attributes and force the file to create as read-only. We make the file // read-only to help prevent the user from making changes to the temporary // file and then trying to save the changes back to a file that we will // eventually delete. G.pInfo->file_attr = FILE_ATTRIBUTE_READONLY; } else #endif { /* set archive bit for file entries (file is not backed up): */ G.pInfo->file_attr = ((unsigned)G.crec.external_file_attributes | (G.crec.external_file_attributes & FILE_ATTRIBUTE_DIRECTORY ? 0 : FILE_ATTRIBUTE_ARCHIVE)) & 0xff; } return 0; } /* end function mapattr() */ //****************************************************************************** // Called from EXTRACT.C // // returns: // MPN_OK - no problem detected // MPN_INF_TRUNC - (on APPEND_NAME) truncated filename // MPN_INF_SKIP - path doesn't exist, not allowed to create // MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path // exists and is not a directory, but is supposed to be // MPN_ERR_TOOLONG - path is too long // MPN_NOMEM - can't allocate memory for filename buffers // // MPN_VOL_LABEL - Path was a volume label, skip it. // MPN_CREATED_DIR - Created a directory. // int mapname(__GPRO__ int renamed) { int error = MPN_OK; CHAR szBuffer[countof(G.filename)] = ""; CHAR *pIn = NULL, *pOut, *pLastSemi = NULL; CHAR *pPathComp, workch; BOOL killed_ddot = FALSE, renamed_fullpa"M}^ UNZIP.BCK[UNZIP60.WINCE]INTRFACE.CPP;1I.AXP_OLB;1~fth = FALSE, created_dir = FALSE; #ifdef POCKET_UNZIP // mapname() is a great place to reset all our status counters for the next // file to be processed since it is called for every zip file member before // any work is done with that member. SetCurrentFile(__G); #endif // If Volume Label, skip the "extraction" quietly if (G.pInfo->vollabel) { return MPN_VOL_LABEL; } #ifndef POCKET_UNZIP // The GUI interface does not support renaming... if (renamed) { pIn = G.filename; // point to beginning of renamed name... if (*pIn) do { if (*pIn == '\\') // convert backslashes to forward *pIn = '/'; } while (*PREINCSTR(pIn)); pIn = G.filename; // use temporary rootpath if user gave full pathname if (G.filename[0] == '/') { renamed_fullpath = TRUE; szBuffer[0] = '\\'; // copy the '/' and terminate szBuffer[1] = '\0'; ++pIn; } else if (isalpha((uch)G.filename[0]) && G.filename[1] == ':') { renamed_fullpath = TRUE; pOut = szBuffer; *pOut++ = *pIn++; // copy the "d:" (+ '/', possibly) *pOut++ = *pIn++; if (*pIn == '/') { *pOut++ = '\\'; pIn++; // otherwise add "./"? } *pOut = '\0'; } } #endif // Initialize file path buffer with our "extract to" path. if (!renamed_fullpath) { #ifdef POCKET_UNZIP strcpy(szBuffer, g_szExtractToDirectory); #else strcpy(szBuffer, G.rootpath); #endif pOut = szBuffer + strlen(szBuffer); } pPathComp = pOut; if (!renamed) { // Point pIn to beginning of our internal pathname. // If we are junking paths, then locate the file portion of the path. if (uO.jflag) pIn = (CHAR*)MBSRCHR(G.filename, '/'); if (pIn == NULL) pIn = G.filename; else ++pIn; } // Begin main loop through characters in filename. for ( ; (workch = *pIn) != '\0'; INCSTR(pIn)) { // Make sure we don't overflow our output buffer. if (pOut >= (szBuffer + countof(szBuffer) - 2)) { Info(slide, 1, ((char*)slide, "path too long: %s\n", FnFilter1(G.filename))); return MPN_ERR_TOOLONG; } // Examine the next character in our input buffer. switch (workch) { // Check for a directory wack. case '/': *pOut = '\0'; // Skip dir traversals unless they are explicitly allowed. if (strcmp(pPathComp, ".") == 0) { // don't bother appending "./" to the path *pPathComp = '\0'; } else if (!uO.ddotflag && strcmp(pPathComp, "..") == 0) { // "../" dir traversal detected, skip over it *pPathComp = '\0'; killed_ddot = TRUE; // set "show message" flag } // When path component is not empty, append it now. if (*pPathComp == '\0') { // Reset insert pos to start of path component. pOut = pPathComp; } else { if (!SmartCreateDirectory(__G__ szBuffer, &created_dir)) { Info(slide, 1, ((char*)slide, "failure extracting: %s\n", FnFilter1(G.filename))); return MPN_ERR_SKIP; } *(pOut++) = '\\'; pPathComp = pOut; // Remember start pos of new path component } pLastSemi = NULL; // Leave any directory semi-colons alone break; // Check for illegal characters and replace with underscore. case ':': case '\\': case '*': case '?': case '"': case '<': case '>': case '|': *(pOut++) = '_'; break; // Check for start of VMS version. case ';': pLastSemi = pOut; // Make note as to where we are. *(pOut++) = ';'; // Leave the semi-colon alone for now. break; default: // Allow European characters and spaces in filenames. #ifdef _MBCS if ((UCHAR)workch >= 0x20) { memcpy(pOut, pIn, CLEN(pIn)); INCSTR(pOut); } else { *(pOut++) = '_'; } #else *(pOut++) = (((UCHAR)workch >= 0x20) ? workch : '_'); #endif } } // Show warning when stripping insecure "parent dir" path components if (killed_ddot && QCOND2) { Info(slide, 0, ((char *)slide, "warning: skipped \"../\" path component(s) in %s\n", FnFilter1(G.filename))); if (!(error & ~MPN_MASK)) error = (error & MPN_MASK) | PK_WARN; } // Done with output buffer, terminate it. *pOut = '\0'; // Remove any VMS version numbers if found (appended ";###"). if (pLastSemi) { // Walk over all digits following the semi-colon. for (pOut = pLastSemi + 1; (*pOut >= '0') && (*pOut <= '9'); pOut++); // If we reached the end, then nuke the semi-colon and digits. if (!*pOut) *pLastSemi = '\0'; } // Copy the mapped name back to the internal path buffer strcpy(G.filename, szBuffer); #ifdef POCKET_UNZIP // Fill in the mapped name buffer if the original caller requested us to. if (g_pExtractInfo->szMappedPath) { strcpy(g_pExtractInfo->szMappedPath, szBuffer); } #endif // If it is a directory, then display the "creating" status text. if ((pOut > szBuffer) && (lastchar(szBuffer, pOut-szBuffer) == '\\')) { if (created_dir) { #ifdef UNICODE TCHAR szFile[_MAX_PATH]; MBSTOTSTR(szFile, G.filename, countof(szFile)); # define T_Fname szFile #else # define T_Fname G.filename #endif if (QCOND2) { Info(slide, 0, ((char *)slide, " creating: %-22s\n", FnFilter1(G.filename))); } // set file attributes: // The default for newly created directories is "DIR attribute // flags set", so there is no need to change attributes unless // one of the DOS style attribute flags is set. There is no need // to mask the readonly attribute, because it does not prevent // modifications in the new directory. if(G.pInfo->file_attr & (0x7F & ~FILE_ATTRIBUTE_DIRECTORY)) { if (!SetFileAttributes(T_Fname, G.pInfo->file_attr & 0x7F)) Info(slide, 1, ((char *)slide, "\nwarning (%d): could not set file attributes for %s\n", (int)GetLastError(), FnFilter1(G.filename))); } /* set dir time (note trailing '/') */ return (error & ~MPN_MASK) | MPN_CREATED_DIR; } /* dir existed already; don't look for data to extract */ return (error & ~MPN_MASK) | MPN_INF_SKIP; } return error; } //****************************************************************************** // Called from PROCESS.C int checkdir(__GPRO__ char *pathcomp, int flag) { #ifdef POCKET_UNZIP // This function is only called by free_G_buffers() from PROCESS.C with the // flag set to END. We have nothing to do, so we just return success. return MPN_OK; #else // !POCKET_UNZIP # define FN_MASK 7 # define FUNCTION (flag & FN_MASK) int rc = MPN_OK; switch (F#) UNZIP.BCK[UNZIP60.WINCE]INTRFACE.CPP;1I.AXP_OLB;1~7uUNCTION) { case ROOT: { // User specified a root path. save the root without separator char* pathcompStart; if (pathcomp == NULL) { G.rootlen = 0; // trivial NULL clause... break; } if (G.rootlen > 0) break; // nothing to do, rootpath was already set G.rootlen = strlen(pathcomp); pathcompStart = pathcomp; // Strip the drive if given. CE does not support Drive if (pathcomp[1] == ':') { G.rootlen -= 2; pathcompStart += 2; } // Check for trailing separator, Strip if given // accomodate it if required. if (pathcomp[G.rootlen - 1] == '/' || pathcomp[G.rootlen - 1] == '\\') G.rootlen--; // Save the root memcpy(G.rootpath, pathcompStart, G.rootlen); G.rootpath[G.rootlen] = '\0'; // Check if directory exists and try to create when neccessary. if (!SmartCreateDirectory(__G__ G.rootpath, NULL)) { rc = MPN_ERR_SKIP; // Create directory failed } // Add trailing path separator G.rootpath[G.rootlen++] = '\\'; G.rootpath[G.rootlen] = '\0'; break; } case END: Trace((stderr, "freeing rootpath\n")); if (G.rootlen > 0) { G.rootlen = 0; G.rootpath[0] = '\0'; } break; default: rc = MPN_INVALID; /* should never reach */ break; } return rc; #endif // !POCKET_UNZIP } /* end function checkdir() */ #ifdef POCKET_UNZIP //****************************************************************************** // Called from EXTRACT.C and LIST.C int match(ZCONST char *string, ZCONST char *pattern, int ignore_case __WDLPRO) { // match() for the other ports compares a file in the Zip file with some // command line file pattern. In our case, we always pass in exact matches, // so we can simply do a string compare to see if we have a match. return (strcmp(string, pattern) == 0); } //****************************************************************************** // Called from PROCESS.C int iswild(ZCONST char *pattern) { // Our file patterns never contain wild characters. They are always exact // matches of file names in our Zip file. return FALSE; } #else // !POCKET_UNZIP /************************/ /* Function version() */ /************************/ void version(__GPRO) { // Dummy function, does nothing. } #ifndef WINDLL /* Console input not supported on CE so just return -1 */ int getch_win32(void) { return -1; } #endif /* !WINDLL */ #endif // !POCKET_UNZIP #if (defined(UNICODE_SUPPORT)) /* convert wide character string to multi-byte character string */ char *wide_to_local_string(ZCONST zwchar *wide_string, int escape_all) { int i; wchar_t wc; int bytes_char; int default_used; int wsize = 0; int max_bytes = 9; char buf[9]; char *buffer = NULL; char *local_string = NULL; for (wsize = 0; wide_string[wsize]; wsize++) ; if (max_bytes < MB_CUR_MAX) max_bytes = MB_CUR_MAX; if ((buffer = (char *)malloc(wsize * max_bytes + 1)) == NULL) { return NULL; } /* convert it */ buffer[0] = '\0'; for (i = 0; i < wsize; i++) { if (sizeof(wchar_t) < 4 && wide_string[i] > 0xFFFF) { /* wchar_t probably 2 bytes */ /* could do surrogates if state_dependent and wctomb can do */ wc = zwchar_to_wchar_t_default_char; } else { wc = (wchar_t)wide_string[i]; } /* The C-RTL under WinCE does not support the generic C-style * Wide-to-MultiByte conversion functions (like wctomb() et. al.). * Therefore, we have to fall back to the underlying WinCE-API call to * get WCHAR-to-ANSI translation done. */ bytes_char = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK, &wc, 1, (LPSTR)buf, sizeof(buf), NULL, &default_used); if (default_used) bytes_char = -1; if (escape_all) { if (bytes_char == 1 && (uch)buf[0] <= 0x7f) { /* ASCII */ strncat(buffer, buf, 1); } else { /* use escape for wide character */ char *escape_string = wide_to_escape_string(wide_string[i]); strcat(buffer, escape_string); free(escape_string); } } else if (bytes_char > 0) { /* multi-byte char */ strncat(buffer, buf, bytes_char); } else { /* no MB for this wide */ /* use escape for wide character */ char *escape_string = wide_to_escape_string(wide_string[i]); strcat(buffer, escape_string); free(escape_string); } } if ((local_string = (char *)realloc(buffer, strlen(buffer) + 1)) == NULL) { free(buffer); return NULL; } return local_string; } #endif /* UNICODE_SUPPORT */ *[UNZIP60.WINCE]INTRFACE.H;1+,L. / 4 S@-0123KPWO 56R*0$?7R*0$?89GHJ/* Copyright (c) 1990-2002 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ //****************************************************************************** // // File: INTRFACE.H // // Description: This module acts as the interface between the Info-ZIP code and // our Windows code in WINMAIN.CPP. See INTRFACE.CPP for a more // detailed description and the actual implementation. // // Copyright: All the source files for Pocket UnZip, except for components // written by the Info-ZIP group, are copyrighted 1997 by Steve P. // Miller. The product "Pocket UnZip" itself is property of the // author and cannot be altered in any way without written consent // from Steve P. Miller. // // Disclaimer: All project files are provided "as is" with no guarantee of // their correctness. The authors are not liable for any outcome // that is the result of using this source. The source for Pocket // UnZip has been placed in the public domain to help provide an // understanding of its implementation. You are hereby granted // full permission to use this source in any way you wish, except // to alter Pocket UnZip itself. For comments, suggestions, and // bug reports, please write to stevemil@pobox.com. // // // Date Name History // -------- ------------ ----------------------------------------------------- // 02/01/97 Steve Miller Created (Version 1.0 using Info-ZIP UnZip 5.30) // //****************************************************************************** #ifndef __INTRFACE_H__ #define __INTRFACE_H__ #ifdef __cplusplus extern "C" { #endif #ifdef POCKET_UNZI$W UNZIP.BCKLNZIP60.WINCE]INTRFACE.H;1CLI.AXP_OLB;1 3P //****************************************************************************** //***** Types and Structures //****************************************************************************** typedef enum _OVERWRITE_MODE { OM_PROMPT = 0, OM_NEWER, OM_ALWAYS, OM_NEVER } OVERWRITE_MODE, *LPOVERWRITE_MODE; typedef struct _EXTRACT_INFO { zusz_t uzByteCount; // Total bytes to extract/test DWORD dwFileCount; // Number of files to extract/test. LPSTR *szFileList; // ARGV list of files, NULL for all files. LPSTR szMappedPath; // Used to store mapped name. May be NULL. OVERWRITE_MODE overwriteMode; // How to handle file overwrites. BOOL fExtract; // TRUE for extract, FALSE for test BOOL fRestorePaths; // TRUE to restore paths, FALSE to junk them. BOOL fAbort; // Set during operation by UI to abort. int result; // Result code from extraction/test. // Window handles for the various controls in our progress dialogs. HWND hWndEditFile; HWND hWndProgFile; HWND hWndProgTotal; HWND hWndPercentage; HWND hWndFilesProcessed; HWND hWndBytesProcessed; // Values used to keep track of our progress. zusz_t uzBytesTotalThisFile; zusz_t uzBytesWrittenThisFile; zusz_t uzBytesWrittenPreviousFiles; zusz_t uzFileOffset; DWORD dwFile; LPCSTR szFile; BOOL fNewLineOfText; } EXTRACT_INFO, *LPEXTRACT_INFO; typedef struct _DECRYPT_INFO { int retry; LPSTR szPassword; DWORD nSize; LPCSTR szFile; } DECRYPT_INFO, *LPDECRYPT_INFO; //****************************************************************************** //***** Function Prototypes //****************************************************************************** // Our exposed interface functions to the Info-ZIP core. int DoListFiles(LPCSTR szZipFile); BOOL DoExtractOrTestFiles(LPCSTR szZipFile, EXTRACT_INFO *pei); int DoGetComment(LPCSTR szZipFile); BOOL SetExtractToDirectory(LPTSTR szDirectory); // "Internal" callbacks from Info-ZIP code. // (The "official" callback functions are declared in the UnZip DLL headers, // see "unzip.h".) void WINAPI Wiz_NoPrinting(int f); int win_fprintf(zvoid *pG, FILE *file, unsigned int dwCount, char far *buffer); //****************************************************************************** //***** Global Variables //****************************************************************************** #ifdef GLOBAL_DECLARE #undef GLOBAL_DECLARE #undef GLOBAL_INIT #endif #ifdef __INTRFACE_CPP__ #define GLOBAL_DECLARE #define GLOBAL_INIT(value) =value #else #define GLOBAL_DECLARE extern #define GLOBAL_INIT(value) #endif GLOBAL_DECLARE jmp_buf dll_error_return; GLOBAL_DECLARE LPDCL lpDCL GLOBAL_INIT(NULL); GLOBAL_DECLARE LPUSERFUNCTIONS lpUserFunctions GLOBAL_INIT(NULL); #endif // POCKET_UNZIP #ifdef __cplusplus } // extern "C" #endif #endif // __INTRFACE_H__ *[UNZIP60.WINCE]PUNZIP.H;1+,./ 4@-0123KPWO 56A⒡7A⒡89GHJ/* Copyright (c) 1990-2002 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ //****************************************************************************** // // File: PUNZIP.H // // Description: This is our global header for the entire Pocket UnZip project. // This header contains all global project build flags, defines, // constants, and macros. It also includes all other headers that // are needed by the project. // // Copyright: All the source files for Pocket UnZip, except for components // written by the Info-ZIP group, are copyrighted 1997 by Steve P. // Miller. The product "Pocket UnZip" itself is property of the // author and cannot be altered in any way without written consent // from Steve P. Miller. // // Disclaimer: All project files are provided "as is" with no guarantee of // their correctness. The authors are not liable for any outcome // that is the result of using this source. The source for Pocket // UnZip has been placed in the public domain to help provide an // understanding of its implementation. You are hereby granted // full permission to use this source in any way you wish, except // to alter Pocket UnZip itself. For comments, suggestions, and // bug reports, please write to stevemil@pobox.com. // // // Date Name History // -------- ------------ ----------------------------------------------------- // 02/01/97 Steve Miller Created (Version 1.0 using Info-ZIP UnZip 5.30) // //****************************************************************************** #ifndef __PUNZIP_H__ #define __PUNZIP_H__ #ifdef __cplusplus extern "C" { #endif //****************************************************************************** //***** Standard Win32 project flags //****************************************************************************** #ifndef WIN32 #define WIN32 #endif #ifndef _WINDOWS #define _WINDOWS #endif #ifdef _WIN32_WCE /* for native Windows CE, force UNICODE mode */ #ifndef UNICODE #define UNICODE #endif #endif /* _WIN32_WCE */ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #ifndef STRICT #define STRICT #endif #if defined(_UNICODE) && !defined(UNICODE) #define UNICODE #endif #if defined(UNICODE) && !defined(_UNICODE) #define _UNICODE #endif #if defined(_DEBUG) && !defined(DEBUG) #define DEBUG #endif #if defined(DEBUG) && !defined(_DEBUG) #define _DEBUG #endif #if defined(_NDEBUG) && !defined(NDEBUG) #define NDEBUG #endif #if defined(NDEBUG) && !defined(_NDEBUG) #define _NDEBUG #endif //****************************************************************************** //***** Pocket Unzip and Info-ZIP flags //****************************************************************************** #ifndef POCKET_UNZIP #define POCKET_UNZIP #endif #ifndef WINDLL #define WINDLL #endif #ifndef DLL #define DLL #endif #ifndef REENTRANT #define REENTRANT #endif #ifndef NO_ZIPINFO #define NO_ZIPINFO #endif #ifndef NO_STDDEF_H #define NO_STDDEF_H #endif // Read COPYING document before enabling this define. #if 0 #ifndef USE_SMITH_CODE #define USE_SMITH_CODE #endif #endif // Read COPYING document%| UNZIP.BCK[UNZIP60.WINCE]PUNZIP.H;1IPCLI.AXP_OLB;1j before enabling this define. #if 0 #ifndef USE_UNSHRINK #define USE_UNSHRINK #endif #endif #ifdef __cplusplus } // extern "C" #endif #endif // __PUNZIP_H__ *[UNZIP60.WINCE]PUNZIP.HTP;1+, .#/ 4##1@-0123KPWO$56m7m89GHJ Pocket UnZip

Pocket UnZip


Table of Contents

  • Why use Pocket UnZip for Windows CE?
  • Key Features of Pocket UnZip
  • Installing Pocket UnZip
  • Opening a Zip File
  • Zip File Listing
  • Properties Dialog
  • File Comments
  • Extracting Files
  • Testing Files
  • Viewing Files
  • Encrypted Files
  • About Pocket UnZip

Why use Pocket UnZip for Windows CE?

  • Your H/PC can now read the number one file format used for Internet downloads.
  • Software venders can now distribute their Windows CE applications in a single compressed Zip file.
  • Maximize your PCMCIA flash card ram storage by zipping up files to take with you on the road.

Key Features of Pocket UnZip

  • Handles all files created with a Zip compatible compression utility. This includes utilities from PKWARE, Info-ZIP, and many others.
  • Easy to use graphical interface that closely resembles the Windows CE Explorer.
  • Displays a detailed list of Zip file contents, including name, date, size, attributes, and compression statistics of each file.
  • Displays comments for the each file within the Zip file, as well as the main comment for the Zip file itself.
  • Supports the ability to test files, extract files, and view files directly from the Zip file.
  • Supports decryption of password encrypted Zip files.
  • It's free!

Installing Pocket UnZip

Place PUNZIP.EXE and PUNZIP.HTP (optional help file) into your \Windows directory on your H/PC.

From your H/PC's Start Menu, choose Run..., enter "punzip", and tap OK.

The first time you run Pocket UnZip, it will register itself as the application for handling Zip files. From then on, you can just double-tap on Zip files in Explorer or from your Desktop to open them in Pocket UnZip.


Opening a Zip File

There are several ways to open a Zip file.

  • Double-tap on a Zip file in Windows CE Explorer or from your Windows CE desktop.
  • From within Pocket UnZip, choose the Open... command from the File menu. You may also tap the Open toolbar button or press Ctrl+O.
  • Pocket UnZip keeps track of the four most recently opened Zip files. You may quickly open one of these recent files by selecting the Zip file directly from Pocket UnZip's File menu.

Zip File Listing

Pocket UnZip's main view displays a list of files, directories, and volume labels that are stored within the currently loaded Zip file. This list can be displayed in two modes, normal and expanded. The normal mode is sufficient for most users. It contains the following information for every item in the Zip file:

  • Name: Name and path of the compressed file, directory, or volume label.
  • Size: Size, in bytes, that the item requires when uncompressed.
  • Type: Type of item.
  • Modified: Date and time that the item was last modified.

Expanded mode contains all the above information, plus the following additional information:

  • Attributes: Attributes of the item.
    • V: Volume label
    • D: Directory
    • R: Read-only file
    • A: Archive file
    • H: Hidden file
    • S: System file
    • E: Encrypted (this file will require a password)
    • C: Comment (this item has a comment)
  • Compressed: Compressed size, in bytes, of the item.
  • Ratio: Compression ratio of the item.
  • Method: Compression method used to compress the item.
  • CRC: 32 bit Cyclic Redundancy Check signature of the item.
  • Comment: Optional comment string that was associated with the item when compressed.

You may toggle between the normal view and the expanded view by selecting the Extended View option from the View menu, or by tapping the associated toolbar button.


Properties Dialog

The properties dialog is useful for viewing detailed information for one or more files. It is invoked by selecting one or more files in the file list and then choosing Properties from the File menu. For convenience, you can also tap the toolbar button or press Alt+Enter.

If one file is selected, the properties dialog will show you detailed information about that one file and its comment.

If multiple files are selected, the dialog will show you combined results for all the files selected. Cumulative results will be given for the file count, byte counts, and compression ratio. Merged results will be given for the compression method, date, CRC, attributes, and comment. For the date, all values that are common between the selected files (such as year), will be shown with their common value. All values that differ between the selected files will be shown as question marks. For attributes, a black check means that all selected files have that particular attribute, a gray check mark means that some of the selected files have that attribute, and no check mark means that none of the s&i UNZIP.BCK NZIP60.WINCE]PUNZIP.HTP;1CLI.AXP_OLB;1#elected files have that attribute.

By using the properties dialog with multiple files, you can determine things like... What is the total number of files or bytes in the Zip file? What is the total compression ratio for all selected files. Are all the selected files from the same year? Same month? How many files have comments?


File Comments

Zip files provide two levels of commenting. At compression time, users can add per-file comments, as well as one main comment for the entire Zip file. The per-file comments are usually used to give a short description of each file. The main comment is usually used for credits, copyright information, installation instructions, version numbers, etc. Pocket UnZip can display both types of comments.

Per-file comments can be viewed in Comments column of the main file list while in expanded mode (see the Zip File Listing section) and also in the properties dialog (see the Properties Dialog section).

The main Zip file comment can be viewed by selecting Zip File Comment from the View menu or by pressing the associated toolbar button. This option will be disabled if the Zip file does not contain a main comment.


Extracting Files

Once you have opened a Zip file into Pocket UnZip, you should see a list of the Zip file's contents. Select one or more files from the file list and then choose Extract Selected Files (Ctrl+E) or Extract All Files (Ctrl+A, Ctrl+E) from the Action menu. You may also use the noted shortcut keys or the associated toolbar buttons.

An extract options dialog will appear showing you some statistics about the files you are about to extract and prompting you for some information. There are three options available to you.

The Restore file paths option allows you to control whether the directory structure of the files you have selected to extract will be preserved. When this option is checked, any directory paths associated with the compressed files will be created, and the file will be extracted to the newly created directory. If this option is not checked, all files will be extracted to a single directory, regardless of any path information associated with the compressed files.

The Overwrite Options allow you to tell Pocket UnZip what to do if a file already exists on your file system with the same name of a file that is about to be extracted. The choices are:

  • Prompt to overwrite: Causes a dialog to appear for every situation that involves possibly overwriting a file. This allows you to decide what files get overwritten on a file-by-file basis.
  • Overwrite if newer: Causes Pocket UnZip to automatically overwrite any files that have a date and time that is earlier then the date and time of the file being extracted. This option can be useful for updating files.
  • Always overwrite: Causes Pocket UnZip to always automatically overwrite any files without prompting or warning. Use with caution.
  • Never overwrite: Causes Pocket UnZip to automatically skip all files that already exist on the file system.

The Extract To field specifies the root directory that should be used to extract files to. If you checked the Restore file paths option, then any directories associated with the files being extracted will be created under the directory specified in this field. The directory you enter must already exist. To create directories and browse for directories, use the Browse... button.

Once you have chosen the options you wish to use, press the Extract button. A progress dialog will appear and the extraction will begin. At any time during the extraction, you may tap the Abort button to abort the extraction operation.

Note: Aborting the extraction operation while processing a file will likely cause a partial file to get extracted and saved.

During the extraction, you may get interrupted for one of three reasons. First, if an error occurs, you will be notified with a message box. Second, if you have chosen the Prompt to overwrite option and you are trying to extract a file that already exists, you will be prompted on how to handle the situation. Third, if a file being extracted is encrypted, then you will be prompted for that file's password (see the Encrypted Files section).

Once the extraction is complete, the Abort button will change to a Close button and any errors or warnings will be displayed. Tap the Close button to return to Pocket UnZip's main screen.


Testing Files

Testing files is essentially the same as extracting files, except for that the actual extracted data is never written to your file system. Testing files is useful when you wish to verify the integrity of a Zip file without actually extracting the files within it.

Once you have opened a Zip file into Pocket UnZip, you should see a list of the Zip file's contents. Select one or more files from the file list and then choose Test Selected Files (Ctrl+T) or Test All Files (Ctrl+A, Ctrl+T) from the Action menu. You may also use the noted shortcut keys or the associated toolbar buttons.

A progress dialog will appear and the testing will begin. At any time during the testing, you may tap the Abort button to abort the testing operation.

During the testing, you may get interrupted for one of two reasons. First, if an error occurs, you will be notified with a message box. Second, if a file being tested is encrypted, then you will be prompted for that file's password (see the Encrypted Files section).

Once the testing is complete, the Abort button will change to a Close button and any errors or warnings will be displayed. Tap the Close button to return to Pocket UnZip's main screen.


Viewing Files

Pocket UnZip provides the ability to view, or even execute, files directly from a Zip file. This feature is a major convenience over having to extract and then manually open each file you wish to view. Internally, this is what Pocket UnZip is doing for you, but it takes care of all the work of extracting the file to a temporary directory, launching the associated viewer for that file type, and cleaning up when done.

To view a file, simply select a single file from Pocket UnZip's main file list and press Enter. You may also choose View Selected File from the Action menu, press the associated toolbar button, or just double-tap on the file you wish to view.

The file will be extracted to a directory called Temporary Pocket UnZip Files in the root of your file system. If the file you wish to view is encrypted, you will be prompted for a password. If the file has an associated viewer application installed (such as Pocket Word for .PWD files), then that viewer will automatically be launched with ' UNZIP.BCK NZIP60.WINCE]PUNZIP.HTP;1CLI.AXP_OLB;1#`the newly extracted file as its command line. If there is no associated viewer application, then you will be prompted for the application you wish to use to view the file.

Pocket UnZip also provides minimal support for allowing you to use the view file action to run executable programs directly from the Zip file. If the file you choose to view is an executable (file extension is EXE), then the file will be executed after it is extracted. Pocket UnZip will only extract the file you select and none of its dependent files (like DLLs). If the executable you extract depends on other files in the Zip file, it will most likely fail to execute.

When Pocket UnZip exits, it will delete the Temporary Pocket UnZip Files directory and all the files in it. If you are running more than one instance of Pocket UnZip, then only the last instance of Pocket UnZip that you exit will perform this delete. Most applications, such as Pocket Word, lock files when viewing them. Any files being viewed by such an application when you exit Pocket UnZip will not be deleted.


Encrypted Files

If an encrypted file is encountered during an extract, test, or view operation, you will be prompted for a password. You can choose to skip the file, skip all encrypted files, or enter a password. You will be given three attempts at entering the correct password before the file will be skipped automatically. Once you have entered the correct password for a given file, that password will be remembered and automatically used for all other encrypted files that are encountered during that single extract, test, or view operation. If another encrypted file is found that uses a different password than the remembered password, then you will be prompted again for a new password.

This technique provides support for multi-password Zip files, while still providing users with single password Zip files the convenience of only having to enter their password once during the operation for all encrypted files. For security reasons, passwords are not remembered after the operation completes.


About Pocket UnZip

Thank you for using Version 2.0 of Pocket UnZip for Windows CE.

Pocket UnZip was developed by Steve P. Miller. Although I'd like to take full credit, I could not have done it without the public decompression source code provided by the Info-ZIP group. Pocket UnZip uses version 6.0 of Info-ZIP's core decompression code. Many thanks go to Greg Roelofs and all the fine folks at Info-ZIP.

Please send all comments, suggestions, and bug reports to stevemil@pobox.com.

Pocket UnZip is freeware - no shareware fees, no purchase fees. You can still send me an email or a box of cookies if you like it. If you would like to distribute Pocket UnZip, please look at the terms and conditions listed in the accompaning Info-ZIP LICENSE file.

For the latest news, binaries, source code, and more information about the Info-ZIP group, visit ftp://ftp.info-zip.org/pub/infozip/.

For more information about me, or to check out some of my other applications (mostly Windows 95 / NT / CE), stop by my personal web page at http://pobox.com/~stevemil/.

Copyright 1997-2009 Info-Zip. All Rights Reserved.

*[UNZIP60.WINCE]PUNZIP.IC2;1+,&./ 4@-0123KPWO56(97(989GHJ &( @FUUUUP*ҡJR=e*P>J$PQEPD=UPUCUP =UPEP*$P*PUU@@ꪩUP?( @JUNPzzAzxzzzjUPT?*[UNZIP60.WINCE]PUNZIP.ICO;1+,'./ 46@-0123KPWO56(97(989GHJ &(( @wppwwwwwwwxwwwwwwwwxpwwwwwwxxwwwwwpxpwwpwpxxwpppxpppwwwwwpwpwwwwwwpwpwwwwwwwwwwwpxwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwwwwwxwwwwwwwxwwwwwwwwwwx?( wxwwwxwwwwpwwpwwwwxwwwwwxwwwwwx?*[UNZIP60.WINCE]PUNZIP.RC;1+,,A./ 4@-0123KPWO56Kb7Kb89GHJ//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Englisch (USA) resources #if !defined(AFX_RESOURCE_D({;m yrav  ws;1=|-gtKxOQC_)8c`J$dMc@)!^Q4|vSvlS.3na8b6]rdOAn5)Qp Z):-j=iZ &g$x_5aJk(2be%QH7PG"tA"4S_*{(=WQ-@4K}nM3Kt2yss_ F~[ }I&+I(x"c\YQA_-x `yi_dS]s#Yqp^."b,? OK,h,M=.!RCj>9e@Q c@k~%. ( C/B-T^|cRh7:j 1E L]dt`db<5HLE{;/mZnypibk2H7EP0%; M'L bS11kM",FRu n;aF[sfGA;QF8n!Vmjph[[]l0H43)em<'-4Q'|4E.7 LR,:*)GIc^Ntp%+m2YN#g.|n+j`c1m^`dBXjvh{~)5(o)]j<2HH 99~uHLAh(e/wUwI!|fyPrElTeG)px;r.'PTkX|5,w]+`goj42F"{co~kR}y;5pWxbRUtk`t+ 4 r{3i[pmS2`t~{Oa" Byh=*cWEud B op+%" i;gw#t>U+;/d6 saHTME~ =nx_ @wQX'%{?lkAX!6 H"xW- H0H]dbS =F`Bb`XE b]%@WK .JWe*AQA{991G7,[JCAeX5`x8H QFH7O g9~yg^|PzJye4}qtxLx 4}."C_LftD2h2/_JA? ?Y[Q oL%d~[Yy"?`&\fhdEn\`7vl}5af. KZ}{ % bIo@*aYrrS33& HN ~ B*N ZC[lG: Aa"$#062]V-UXl\j&nV$L}U,#k* P CDBp'6Zq@`<}_b"qZ) ct)HS'X'{?cv_&`P O{u)DHu$`y2v)Fk $(_" n-t)@Bz,p';n7=WovP7yElWzZLm@RH]4j \`>*[_z76| MQ:rQ ]7vYjR'^I2HU3nj6)@ 8n[]cuaBrn\c$~R& sSW<&@E|nW3}m "s+Q-9`fT@5uDM HNVVW&El tL'y@B[+\SNz d>!M*2d51*BIVT5Wkns"![YI Kc6WW;as D GU xgLj_@\~6!\}5W?`L'7!a MxxM@ zLo@ha!@pnk/tbS @OF$WI/YM5@RsAhgALWJQKZ%JUi:TQX N' <[|Fx9B7(L2rd pug rXj7Y!00zN_.D(vv4T |Nb&RI9Z`Uau0GK {e\}Tbw+\&[(B~_g' :CDA<*za{QhaP4K_T`O-O f\W N"A5.Er@ i LkApEOtLB2MP|fQ2&BZ5iH^ g*lp 9VB7q$y)xk&qqO&HmOqG WBDg ^;PG04:jCYg8M 7MYk#3\B%-E|b_X.zB-E9ZR#1N>Rb bsSZ@.dne\"*0|;*l'fkMTBI6yl!pv(`,A'6\JR3S?||4"K"c^TM=7S \hJ2]ciWWIVwv!^#M*h H GmZ5v9^<|gG5_=W3:i8isqZzSjPP(/07|h:hG@%Jw~U>6B^vSd%b!=F02Olc I"q&mA sQD/VnAD;RW!g:9m) 3IlYKw=JYP M=)6jphj[\}Bj%&_X)*a Gy @fQC[3S0nc[*Mg6~DJva@Z,I`jn=KfAOF Gh s6 =qLCvmO~tBA[4jVO;2&h;{OT:&o(5La nHq[-ex)&[S;bED?O!J]/0 ?s;@7%y!%9A#Sc>yN~k -r-RAjLv$Z{RZTGN,jyduFI{%lug 0N_B_dAjF;gKSkWv4-Ow5'9;f).DFm)$<%^ l]X Q0O`OQH u5 3~GZA^9^^I?.v"r36BDgm,_:@ ChnHv5\]XxuTGqB}wBfn-,U"c! *6)v s0ZS*tf,MeqvNMC`33|RKq.Q7^\@08>aT2KO^{0IC}#];oVL4^>lxX^S7)r"!A:]r2hF\- CP2<)bI \+pG)n7= ~aNl4j'u;b]1g5T;jbirv8C5sQRe `78Xu6}VQ{@ULWx(~M!1p3u]:nN81fKB ^?29!1jrplu*j;Bhb6 hJot/Kt**N._@hj eB2t-=_8jBbOSoQ njlm;?.sd$ 5WDI6yOMHBvriL{R)|F@2{Y6E$ D8!(ddi^.Th>C.!+=xn@BNx~ZDYl&8 (?08ITMk[KgvvG!SwD&VARRi{51}?H,LG)X.,'6HV/VuE.zc[9z QUx~[]a/>ASE= W;DNa CwFX[&_$%LS"GxC.wx5Uk`BrX?Ja7:OHN~]+PCTJy.mTLX` yBC_-DfYVOMh>8^s%&|bl"c>3ET5clUdPSo !En%]vMmM t'pM`C}J!nQE%?"<)p .t RjoQ>:ec=Zq6/apeyz7"B* xhAc^t)czByS.<!$~pT%vhgG=JKVV*Acj4 \,Qe 3JI&l,`2țj\34ɆM#vշ΅!瞧(G̊eQu)C'OlZ4zp27P0q"66?Gf)RQDhcMYcosJ/_%r%]\Lxlis$6lr@񾎘ɖ(Ӻ -4zB| xwle~Sr (^z~8E]lbV&e$9c9 O8/L;99+W4 z45') =!nc/i?Y+銼Źk@ShY'[?HPMVp : v6I"/t0#N|gu~=?O"{L5snT3u%4/:P)!}DkJ9oSlZt=9_Կ>Q]1Rpl;mgEGh`Z1@TqStDg n@9UGtiy3?VE,bx9q4YbtHd500ane|o ȭH3GtQna+YE MTTWxLDPv-#gPt3l:F->wm!~iM/%,4gi Dm+!0j%&1j4d g wTb>XPC=57#6&>5I8 1MagfEy>n6E?x~k.(/Rjr8;)YSVD . ,A&y}3')K1+0.8 3)^Mv\Q{h#}syr>qY M MJv:H c4,cKiFsn)\OOv l_!?+>Ap[*4t/1ON; #. 2+Tt,8c4I,Sr=u, q;PCny(~1T=vr ***n I\}]B#N]CQ,/N`1|%f^(8E!rm`GZb"m`%a/ =$9m[+d> ;=Sh5{5$l[hV#!!.LY["B VE{AaNazB{K= K jMzrp#28qU(gn2V~pa~-(1=A )Ej."z6/VH\We.)%{*^GP8x||*zrK!`:H9L%IQ_ pSe&S#y*J$o0|qLFRo\wYIaS\m$?ow@U P[8ugg Wa;>0s}`DhoH0LJ&UMiAvcT#F8U\u B_b5BM$K$p5eI #3K`vaay0bh>Y9LUaV1?N iofn3V~o)t@^kI2mAX8 6Rk-HAEw=:nl_. 2'GzHm{Lh*NE$M ,U3V_^h+-cd`&a2BjL< fM>+,X%m`C/g4FIHX4J&aJR|VZ2d%gnAMCV-E7`YP/@0X[pT:ưPsQcCAx$l+`Mu %(Q|8c%;}k0& 6g[M_@9l)9u*RIrp^8X7ZAJ: oIO|Dl6i%TFĨKOyr3-I1ҬS%+ ۱<,jŖkl: Nks%P2vf8<*qC I+BQbEWVZ4ec-#|X^j|4y]G~Z]5z#p9~BB0"5~m1$9q5'yU$ZG ~_g3I 7n=!'$WktɊāﵦ~6rI>W=~Wkv?47jC.f*XW迾iq1a9r1|&/M[Mdj/c 8waybZ7uÆGS*JVY!C{Љ].6q8k5('xNRLh&/;,wwfF8xPB)C^AwG"V W(H&0 )'n vM7=tnmJadu!)152գ LB?K{@iO `v\H2+psi^A @Hd&;ok\jauF{s\Y5%OU%|#&d< pST-蝁zм췋ˌ럿jNucyj!j;"bK/<`k)Vn]J_#) 8`VPi' t\>MxI.͵*bvfE`btD˯\vRs #/B33{az!p9h|v-CF8S3CB/x@js[7Ӛ5TP]̈.5o5cCKw+B$\oBbr,P NT3( I)9%{N?g3p$%%2ljOL.Og(8!qt)uaN}h+{ `U .-xiud/)pc`N 9 mP:tWFh*ehM,16c A /7-IuXIb?| f "zs7 K[LT@N\Dp7}A0 r.-8/?{F!oq88S:0-l@afTM{^##eFt -r7w>Y0'P;v=T]a3,XQFFl/o. &= )U|d8}A}T GTLTk&#!3q#cpGNHC6_'gX`C-YR5Z}gpPdc7|M/.=1V| 1Ah$ty/C`OjFKw{'`"DjLo6 TH *[ash04G7))n3}w?3Lq%?w|v]]%IPq -`,uF`f,m +&{ *Ld.cY/i@_LmI?F@czp4"oWX,XrG1)%XRa}KU,Sv]Tb=1XWlO 48rmCj`p]X_I8!erb0,DH@9@1#{!R#<:^,l*_@ DvlkDn0 AJ{`q s^}|WUXTj\r+]`m%#[mh?pb":qJE]|L?Pm"o58GQNyx`{#4I) $>VYR`GPXZWb,dv)NY#?NvJ6UPR*MB)%F/`eVUbE}hSAYY!=N v:\tgK' Yh^!nJ8Q&l["#e9B^lK"fL2_XJ>"o2`|k+~,vqlxXAaVn|{sAvaRgzu)Jz2%cvJl/ }HL 4f"C+CiFgIyy[,kPN 5f/f7J*6i8\!?)24c/vu;8^AMf:+.T,tb-s-/^O y}Yy(>GAA!5F B/0eudU[!O-8R{^}&~?uprAP ;+%g/;Ux8M(S#} +fUa$OvD.)^m"c #9#=ZSP6zY,HG'>t@qk!(@o):/"BCf!aM R{*0wL?X]>j@Bq}-k[_ZG6ST g?c>YVIJ]l ji;Wn{p PmABv"y29b3<;7 )rhZTYa; Rh--+Lna.|@_L(&xegpxoie(8ps, | k5l1Y[Qp2a!7?Upf1%f1]O\lf1!/{"xUOl_xzB.pJ,NDA]eU=Bug-M'l|s {ahS.'e.#GTX5 6eGLTF_p-6S'.Oq=\Q2&3?bu)~6WH_od|Y*P/"Y(/c.: cl@UwdwsRnoi7a~Ix?|KRN  ^Nb.Z0YQI>[]X( < BC] *<^za']r$|(:i  %+oH7g6s CNoS@4oo (OWZv kmgyM Czb9VYWnD[K+NY#01=tBl=l>5iM_6Ec2Q {Ahe|9$P`SJ %OVmY?w&F&0r Z*<|Hg|tU~[xW%C*[|"B72y\G4N!yT=:- was stolen fro)Y&m UNZIP.BCK,A[UNZIP60.WINCE]PUNZIP.RC;1PCLI.AXP_OLB;1&LL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "#include ""punzip.rcv""\r\n" "#ifdef _WIN32_WCE\r\n" "IDI_UNZIP ICON DISCARDABLE ""punzip.ic2""\r\n" "IDI_ZIPFILE ICON DISCARDABLE ""zipfile.ic2""\r\n" "IDB_TOOLBAR BITMAP DISCARDABLE ""toolbar.2bp""\r\n" "IDB_IMAGELIST BITMAP DISCARDABLE ""imglist.2bp""\r\n" "IDB_IMAGELIST_MASK BITMAP DISCARDABLE ""ilmask.bmp""\r\n" "#else\r\n" "IDI_UNZIP ICON DISCARDABLE ""punzip.ico""\r\n" "IDI_ZIPFILE ICON DISCARDABLE ""zipfile.ico""\r\n" "IDB_TOOLBAR BITMAP DISCARDABLE ""toolbar.bmp""\r\n" "IDB_IMAGELIST BITMAP DISCARDABLE ""imglist.bmp""\r\n" "#endif\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Menu // IDR_UNZIP MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&Open...\tCtrl+O", IDM_FILE_OPEN, GRAYED MENUITEM SEPARATOR MENUITEM "&Properties\tAlt+Enter", IDM_FILE_PROPERTIES, GRAYED MENUITEM SEPARATOR MENUITEM SEPARATOR MENUITEM "&Close", IDM_FILE_CLOSE, GRAYED END POPUP "&Actions" BEGIN MENUITEM "&Extract Selected Files\tCtrl+E", IDM_ACTION_EXTRACT , GRAYED MENUITEM "E&xtract All Files", IDM_ACTION_EXTRACT_ALL , GRAYED MENUITEM SEPARATOR MENUITEM "&Test Selected Files\tCtrl+T", IDM_ACTION_TEST, GRAYED MENUITEM "Te&st All Files", IDM_ACTION_TEST_ALL, GRAYED MENUITEM SEPARATOR MENUITEM "&View Selected File\tEnter", IDM_ACTION_VIEW, GRAYED MENUITEM SEPARATOR MENUITEM "Select &All\tCtrl+A", IDM_ACTION_SELECT_ALL , GRAYED END POPUP "&View" BEGIN MENUITEM "&Expanded View", IDM_VIEW_EXPANDED_VIEW , GRAYED MENUITEM SEPARATOR MENUITEM "Zip File &Comment", IDM_VIEW_COMMENT, GRAYED END POPUP "&Help" BEGIN MENUITEM "&About Pocket UnZip", IDM_HELP_ABOUT, GRAYED END END ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_REPLACE DIALOG DISCARDABLE 1, 1, 250, 60 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Confirm File Replace" FONT 8, "MS Sans Serif" BEGIN LTEXT "",IDC_FILE,6,6,237,18,NOT WS_GROUP LTEXT "Would you like to replace the existing file?", IDC_STATIC,6,26,237,10,NOT WS_GROUP PUSHBUTTON "&Yes",IDM_REPLACE_YES,6,40,54,14 PUSHBUTTON "Yes to &All",IDM_REPLACE_ALL,67,40,54,14 PUSHBUTTON "&No",IDM_REPLACE_NO,128,40,54,14 PUSHBUTTON "N&o to All",IDM_REPLACE_NONE,189,40,54,14 END IDD_COMMENT DIALOG DISCARDABLE 1, 1, 361, 196 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Zip File Comment" FONT 8, "MS Sans Serif" BEGIN EDITTEXT IDC_COMMENT,6,6,349,184,ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP END IDD_PROPERTIES DIALOG DISCARDABLE 0, 0, 251, 114 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Properties" FONT 8, "MS Sans Serif" BEGIN EDITTEXT IDC_COMMENT,6,18,238,90,ES_MULTILINE | NOT WS_VISIBLE | WS_VSCROLL | WS_HSCROLL LTEXT "",IDC_FILE,11,22,229,8 LTEXT "Size:",IDC_STATIC,11,34,70,8 LTEXT "",IDC_FILE_SIZE,84,34,100,8 LTEXT "Compressed Size:",IDC_STATIC,11,46,70,8 LTEXT "",IDC_COMPRESSED_SIZE,84,46,100,8 LTEXT "Compression Factor:",IDC_STATIC,11,58,70,8 LTEXT "",IDC_COMPRESSON_FACTOR,84,58,100,8 LTEXT "Compression Method:",IDC_STATIC,11,70,70,8 LTEXT "",IDC_COMPRESSION_METHOD,84,70,100,8 LTEXT "Modified:",IDC_STATIC,11,82,70,8 LTEXT "",IDC_MODIFIED,84,82,100,8 LTEXT "CRC:",IDC_STATIC,11,94,70,8 LTEXT "",IDC_CRC,84,94,100,8 LTEXT "Attributes:",IDC_STATIC,190,34,50,8 CONTROL "Directory",IDC_DIRECTORY,"Button",BS_3STATE,190,44,50, 10 CONTROL "Read-only",IDC_READONLY,"Button",BS_3STATE,190,54,50,10 CONTROL "Archive",IDC_ARCHIVE,"Button",BS_3STATE,190,64,50,10 CONTROL "Hidden",IDC_HIDDEN,"Button",BS_3STATE,190,74,50,10 CONTROL "System",IDC_SYSTEM,"Button",BS_3STATE,190,84,50,10 CONTROL "Encrypted",IDC_ENCRYPTED,"Button",BS_3STATE,190,94,50, 10 CONTROL "Tab2",IDC_TAB,"SysTabControl32",WS_TABSTOP,4,4,242,106 END IDD_EXTRACT DIALOG DISCARDABLE 0, 0, 297, 105 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Extract Files" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Extract",IDOK,246,6,45,14 PUSHBUTTON "&Cancel",IDCANCEL,246,24,45,14 LTEXT "Files to extract:",IDC_STATIC,12,18,54,8 RTEXT "",IDC_FILE_COUNT,67,18,46,8 LTEXT "Bytes to extract:",IDC_STATIC,12,30,54,8 RTEXT "",IDC_BYTE_COUNT,67,30,46,8 GROUPBOX "Statistics",IDC_STATIC,6,6,118,37 CONTROL "&Restore file paths",IDC_RESTORE_PATHS,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,8,47,118,10 LTEXT "Extract &To:",IDC_STATIC,6,64,59,8 EDITTEXT IDC_EXTRACT_TO,6,74,230,14,ES_AUTOHSCROLL PUSHBUTTON "&Browse...",IDC_BROWSE,246,74,45,14 LTEXT "If encrypted files are encountered during extraction, you will be prompted for a password.", IDC_STATIC,6,91,285,8 CONTROL "&Prompt to overwrite",IDC_OVERWRITE_PROMPT,"Button", BS_AUTORADIOBUTTON,138,18,80,10 CONTROL "&Overwrite if newer",IDC_OVERWRITE_NEWER,"Button", BS_AUTORADIOBUTTON,138,30,80,10 CONTROL "&Always overwrite",IDC_OVERWRITE_ALWAYS,"Button", BS_AUTORADIOBUTTON,138,42,80,10 CONTROL "&Never overwrite",IDC_OVERWRITE_NEVER,"Button", BS_AUTORADIOBUTTON,138,54,80,10 GROUPBOX "Overwrite Options",IDC_STATIC,132,6,104,61 END IDD_PASSWORD DIALOG DISCARDABLE 1, 1, 250, 79 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Password Required for Encrypted File" FONT 8, "MS Sans Serif" BEGIN LTEXT "",IDC_FILE,6,6,237,18,NOT WS_GROUP LTEXT "",IDC_PROMPT,6,26,237,10,NOT WS_GROUP EDITTEXT IDC_PASSWORD,6,40,237,14,ES_PASSWORD | ES_AUTOHSCROLL PUSHBUTTON "Skip &All",IDC_SKIP_ALL,170,59,73,14 DEFPUSHBUTTON "&Ok",IDOK,6,59,73,14 PUSHBUTTON "&Skip",IDCANCEL,88,59,73,14 END IDD_EXTRACT_PROGRESS DIALOG DISCARDABLE 0, 0, 400, 129 STYLE DS_MODALFRAME | WS_POPUP FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "&Abort",IDCANCEL,6,110,112,14 LTEXT "File Progress",IDC_FILE,6,5,389,8 CONTROL "Progress1",IDC_FILE_PROGRESS,"msctls_progress32", WS_BORDER,6,15,112,10 LTEXT "Total Progress",IDC_STATIC,6,28,61,8 RTEXT "0%",IDC_PERCENTAGE,84,28,33,8 CONTROL "Progress1",IDC_TOTAL_PROGRESS,"msctls_progress32", WS_BORDER,6,38,112,10 LTEXT "Fil* U UNZIP.BCK,A[UNZIP60.WINCE]PUNZIP.RC;1PCLI.AXP_OLB;1es processed:",IDC_STATIC,10,55,58,8 RTEXT "0",IDC_FILES_PROCESSED,68,55,44,8 LTEXT "Files total:",IDC_STATIC,10,66,58,8 RTEXT "",IDC_FILES_TOTAL,68,66,44,8 LTEXT "Bytes processed:",IDC_STATIC,10,83,58,8 RTEXT "0",IDC_BYTES_PROCESSED,68,83,44,8 LTEXT "Bytes total:",IDC_STATIC,10,94,58,8 RTEXT "",IDC_BYTES_TOTAL,68,94,44,8 EDITTEXT IDC_LOG,123,15,272,109,ES_MULTILINE | WS_VSCROLL | WS_HSCROLL GROUPBOX "",IDC_STATIC,6,49,112,29 GROUPBOX "",IDC_STATIC,6,77,112,29 END IDD_ABOUT DIALOG DISCARDABLE 34, 22, 270, 126 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pocket UnZip" FONT 8, "MS Sans Serif" BEGIN ICON 100,IDC_STATIC,9,8,20,20 LTEXT "",IDC_PRODUCT,36,15,228,8 LTEXT "",IDC_VERSION,36,29,228,8 LTEXT "",IDC_DEVELOPER,36,39,228,8 LTEXT "Visit my web site at http://pobox.com/~stevemil/", IDC_STATIC,36,49,228,8 LTEXT "",IDC_COPYRIGHT,36,59,228,8 CTEXT "Many thanks go to Greg Roelofs and all the fine folks at Info-ZIP.", IDC_STATIC,5,79,259,8 CTEXT "",IDC_COMMENT,20,89,229,16 CTEXT "Visit ftp://ftp.info-zip.org/pub/infozip/ for the latest news and binaries.", IDC_STATIC,5,109,259,8 GROUPBOX "",IDC_STATIC,3,0,263,71,BS_LEFT GROUPBOX "",IDC_STATIC,3,71,263,49,BS_LEFT END IDD_VIEW_PROGRESS DIALOG DISCARDABLE 0, 0, 189, 57 STYLE DS_MODALFRAME | WS_POPUP FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "&Abort",IDCANCEL,60,36,70,14 CTEXT "Extracting temporary file for your viewing pleasure.", IDC_FILE,6,6,177,8 CONTROL "Progress1",IDC_FILE_PROGRESS,"msctls_progress32", WS_BORDER,6,20,177,10 END IDD_VIEW_ASSOCIATION DIALOG DISCARDABLE 0, 0, 297, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Open With" FONT 8, "MS Sans Serif" BEGIN LTEXT "There does not appear to be any application associated with this file", IDC_STATIC,6,6,230,10 LTEXT "type. In order to view this file, you must specify a viewer application.", IDC_STATIC,6,15,230,10 LTEXT "&Path to viewer application.",IDC_STATIC,6,32,230,8 EDITTEXT IDC_PATH,6,42,230,14,ES_AUTOHSCROLL PUSHBUTTON "&Browse...",IDC_BROWSE,246,42,45,14 DEFPUSHBUTTON "&OK",IDOK,246,6,45,14 PUSHBUTTON "&Cancel",IDCANCEL,246,24,45,14 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_REPLACE, DIALOG BEGIN LEFTMARGIN, 6 RIGHTMARGIN, 243 TOPMARGIN, 6 BOTTOMMARGIN, 54 END IDD_COMMENT, DIALOG BEGIN LEFTMARGIN, 6 RIGHTMARGIN, 355 TOPMARGIN, 6 BOTTOMMARGIN, 190 END IDD_PROPERTIES, DIALOG BEGIN LEFTMARGIN, 4 RIGHTMARGIN, 246 TOPMARGIN, 4 BOTTOMMARGIN, 110 END IDD_EXTRACT, DIALOG BEGIN LEFTMARGIN, 6 RIGHTMARGIN, 291 TOPMARGIN, 6 BOTTOMMARGIN, 99 END IDD_PASSWORD, DIALOG BEGIN LEFTMARGIN, 6 RIGHTMARGIN, 243 TOPMARGIN, 6 BOTTOMMARGIN, 73 END IDD_EXTRACT_PROGRESS, DIALOG BEGIN LEFTMARGIN, 6 RIGHTMARGIN, 394 TOPMARGIN, 6 BOTTOMMARGIN, 123 END IDD_ABOUT, DIALOG BEGIN RIGHTMARGIN, 265 TOPMARGIN, 1 BOTTOMMARGIN, 120 END IDD_VIEW_PROGRESS, DIALOG BEGIN LEFTMARGIN, 6 RIGHTMARGIN, 183 TOPMARGIN, 6 BOTTOMMARGIN, 51 END IDD_VIEW_ASSOCIATION, DIALOG BEGIN LEFTMARGIN, 6 RIGHTMARGIN, 291 TOPMARGIN, 6 BOTTOMMARGIN, 57 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDR_UNZIP ACCELERATORS DISCARDABLE BEGIN "A", IDM_ACTION_SELECT_ALL, VIRTKEY, CONTROL, NOINVERT "E", IDM_ACTION_EXTRACT, VIRTKEY, CONTROL, NOINVERT "O", IDM_FILE_OPEN, VIRTKEY, CONTROL, NOINVERT "T", IDM_ACTION_TEST, VIRTKEY, CONTROL, NOINVERT VK_RETURN, IDM_ACTION_VIEW, VIRTKEY, NOINVERT VK_RETURN, IDM_FILE_PROPERTIES, VIRTKEY, ALT, NOINVERT END #endif // Englisch (USA) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // #include "punzip.rcv" #ifdef _WIN32_WCE IDI_UNZIP ICON DISCARDABLE "punzip.ic2" IDI_ZIPFILE ICON DISCARDABLE "zipfile.ic2" IDB_TOOLBAR BITMAP DISCARDABLE "toolbar.2bp" IDB_IMAGELIST BITMAP DISCARDABLE "imglist.2bp" IDB_IMAGELIST_MASK BITMAP DISCARDABLE "ilmask.bmp" #else IDI_UNZIP ICON DISCARDABLE "punzip.ico" IDI_ZIPFILE ICON DISCARDABLE "zipfile.ico" IDB_TOOLBAR BITMAP DISCARDABLE "toolbar.bmp" IDB_IMAGELIST BITMAP DISCARDABLE "imglist.bmp" #endif ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED *[UNZIP60.WINCE]PUNZIP.RCV;1+,3./ 4J@-0123KPWO56O7O89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ //****************************************************************************** // // File: PUNZIP.RCV // // Description: Resources that Microsoft Visual C++ does not edit directly. // This file sets all the version defines and declares the Version // Info resource. This file is included by both the C compiler and // the resource compiler. // // Copyright: All the source files for Pocket UnZip, except for components // written by the Info-ZIP group, are copyrighted 1997 by Steve P. // Miller. The product "Pocket UnZip" itself is property of the // author and cannot be altered in any way without written consent // from Steve P. Miller. // // Disclaimer: All project files are provided "as is" with no guarantee of // their correctness. The authors are not liable for any outcome // that is the result of using this source. The source for Pocket // UnZip has been placed in the public domain to help provide an // understanding of its implementation. You are hereby granted // full permission to use this sou+^ UNZIP.BCK3NZIP60.WINCE]PUNZIP.RCV;1CLI.AXP_OLB;1I rce in any way you wish, except // to alter Pocket UnZip itself. For comments, suggestions, and // bug reports, please write to stevemil@pobox.com. // // // Date Name History // -------- ------------ ----------------------------------------------------- // 02/01/97 Steve Miller Created (Version 1.0 using Info-ZIP UnZip 5.30) // //****************************************************************************** #ifndef __PUNZIP_RCV__ #define __PUNZIP_RCV__ #ifdef APSTUDIO_INVOKED #error this file is not editable by Microsoft Visual C++ #endif // APSTUDIO_INVOKED #ifdef _WIN32_WCE #define VS_FFI_FILEFLAGSMASK 0x0000003FL #define VS_FF_PRERELEASE 0x00000002L #define VOS__WINDOWS32 0x00000004L #define VFT_APP 0x00000001L #define VFT2_UNKNOWN 0x00000000L #define VS_FF_DEBUG 0x00000001L #else #include #endif #include "../unzvers.h" //****************************************************************************** //***** User Modifiable Version Defines //****************************************************************************** #define VERSION_MAJOR 2 #define VERSION_MINOR 0 #define VERSION_PRIVATE 0 #define VERSION_PATCH UZ_PATCHLEVEL #define VERSION_STRING "2.0" // Set VER_FF_PRERELEASE to VS_FF_PRERELEASE for beta and 0 for release. #ifdef BETA #define VER_FF_PRERELEASE VS_FF_PRERELEASE #else #define VER_FF_PRERELEASE 0 #endif //****************************************************************************** //***** Fixed Version Defines //****************************************************************************** #define VER_INTERNALNAME_STR "PUNZIP" #define VER_PRODUCT_STR "Pocket UnZip\256" #define VER_DEVELOPER_STR "Steve P. Miller (stevemil@pobox.com)" #define VER_COMMENT_STR "Pocket UnZip is built on top of Info-ZIP's UnZip " UZ_VER_STRING UZ_BETALEVEL " source code from " UZ_VERSION_DATE "." #define VER_FILENAME_STR VER_INTERNALNAME_STR ".EXE" #define VER_VERSION VERSION_MAJOR,VERSION_MINOR,VERSION_PRIVATE,VERSION_PATCH #define VER_COMPANY_STR VER_DEVELOPER_STR #define VER_COPYRIGHT_STR "Copyright \251 1997-2009 Info-ZIP. All Rights Reserved." #ifdef UNICODE #define VER_CODEPAGE " Unicode)" #else #define VER_CODEPAGE " Ansi)" #endif #if defined(_X86_) || defined(_M_IX86) #define VER_ARCH " (i386," VER_CODEPAGE #elif defined(_MIPS_) || defined(_M_MRX000) #define VER_ARCH " (MIPS)" #elif defined(_SH3_) #define VER_ARCH " (Hitachi SH-3)" #elif defined(_PPC_) || defined(_M_PPC) #define VER_ARCH " (IBM PowerPC)" #elif defined(_ALPHA_) || defined(_M_ALPHA) #define VER_ARCH " (DEC Alpha)" #elif defined(_M_MPPC) #define VER_ARCH " (Macintosh PowerPC)" #elif defined(_M_M68K) #define VER_ARCH " (Macintosh 68K)" #else #define VER_ARCH "" #endif #ifdef _DEBUG #define VER_FF_DEBUG VS_FF_DEBUG #else #define VER_FF_DEBUG 0 #endif #if (VERSION_PATCH > 0) #define VER_FF_PATCHED VS_FF_PATCHED #else #define VER_FF_PATCHED 0 #endif #if (VERSION_PRIVATE > 0) #define VER_FF_PRIVATEBUILD VS_FF_PRIVATEBUILD #else #define VER_FF_PRIVATEBUILD 0 #endif #ifdef _DEBUG #if (VER_FF_PRERELEASE == VS_FF_PRERELEASE) #define VER_VERSION_STR VERSION_STRING " Beta (Debug)" #else #define VER_VERSION_STR VERSION_STRING " (Debug)" #endif #else #if (VER_FF_PRERELEASE == VS_FF_PRERELEASE) #define VER_VERSION_STR VERSION_STRING " Beta" #else #define VER_VERSION_STR VERSION_STRING #endif #endif #ifdef _WIN32_WCE #define VER_FULLPRODUCT_STR VER_PRODUCT_STR " for Windows\256 CE" VER_ARCH #define VER_FULLVERSION_STR VER_VERSION_STR " for Windows\256 CE" VER_ARCH #else #define VER_FULLPRODUCT_STR VER_PRODUCT_STR " for Windows\256 NT" VER_ARCH #define VER_FULLVERSION_STR VER_VERSION_STR " for Windows\256 NT" VER_ARCH #endif //****************************************************************************** //***** VERSIONINFO Resource //****************************************************************************** #ifdef RC_INVOKED VS_VERSION_INFO VERSIONINFO FILEVERSION VER_VERSION PRODUCTVERSION VER_VERSION FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS VER_FF_PRERELEASE | VER_FF_DEBUG | VER_FF_PATCHED | VER_FF_PRIVATEBUILD FILEOS VOS__WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN #ifdef UNICODE BLOCK "040904B0" // 0x0409 = U.S. English, 0x04B0 = Unicode #else BLOCK "040904E4" // 0x0409 = U.S. English, 0x04E4 = Ansi 1252 #endif BEGIN VALUE "CompanyName", VER_COMPANY_STR "\0" VALUE "FileDescription", VER_FULLPRODUCT_STR "\0" VALUE "FileVersion", VER_FULLVERSION_STR "\0" VALUE "InternalName", VER_INTERNALNAME_STR "\0" VALUE "LegalCopyright", VER_COPYRIGHT_STR "\0" VALUE "OriginalFilename",VER_FILENAME_STR "\0" VALUE "ProductName", VER_PRODUCT_STR "\0" VALUE "ProductVersion", VER_VERSION_STR "\0" VALUE "Comments", VER_COMMENT_STR "\0" END END BLOCK "VarFileInfo" BEGIN #ifdef UNICODE // English language (0x0409) and the Unicode codepage (1200) VALUE "Translation", 0x0409, 1200 #else // English language (0x0409) and the Western Europe codepage (1252) VALUE "Translation", 0x0409, 1252 #endif END END #endif // RC_INVOKED #endif // __PUNZIP_RCV__ *[UNZIP60.WINCE]README.;1+, 6./ 4L@-0123KPWO56 7 89GHJ_______________________________________________________________________________ This is the Windows CE Info-ZIP port README, last updated 17 September 2003. _______________________________________________________________________________ Copyright and Disclaimer _______________________________________________________________________________ Copyright All the source files for Pocket UnZip are copyrighted by Info-ZIP. For details on terms and conditions look into the LICENSE file that should be part of the source distribution. The original author Steve P. Miller has gracefully allowed to put his own source contributions for "Pocket UnZip" under the Info-ZIP license. Disclaimer All project files are provided "as is" with no guarantee of their correctness. The authors are not liable for any outcome that is the result of using this source. The source for Pocket UnZip has been placed in the public domain to help provide an understanding of its impl,U UNZIP.BCK 6[UNZIP60.WINCE]README.;1ZIPCLI.AXP_OLB;17Jementation. You are hereby granted full permission to use this source in any way you wish, except to alter Pocket UnZip itself. For comments, suggestions, and bug reports, please write to stevemil@pobox.com or to the generic Info-ZIP e-mail address Zip-Bugs@lists.wku.edu. _______________________________________________________________________________ About the Windows CE Port (known as "Pocket UnZip") _______________________________________________________________________________ The Windows CE port, known as Pocket UnZip, is designed to run on Microsoft's Windows CE operating system. The port is completely contained in the files listed above. There were very few minor modifications made to the Info-ZIP code in order for this port to work. This was possible because the Info-ZIP code is fairly generic and also because several hooks have already been placed in the code from past Windows ports. The Windows CE port leverages off of these efforts for two reasons. Mainly, I wanted to avoid modifying the Info-ZIP core code since people don't like it when your changes break other ports. Second, this makes the Windows CE port easy to upgrade when fixes and features are released by the Info-ZIP group. The port is made up of the project file (punzip.dsp), one global header (punzip.h), three main source modules (winmain.cpp/h, intrface.cpp/h, and wince.cpp/h), the resource script files (punzip.rc, punzip.rcv, and resource.h), several resources (punzip.ic2, zipfile.ic2, imglist.2bp, ilmask.bmp, toolbar.2bp, punzip.ico, zipfile.ico, imglist.bmp, and toolbar.bmp), and the help file (punzip.htp). The application's entry point is WinMain(), which is located in winmain.cpp (what a surprise). winmain.cpp basically contains all the Windows code and the user interface. It knows nothing about the Info-ZIP code or things like the Globals struct. That stuff is the job of the intrface module. intrface.cpp implements an easy (or at least easier) to understand interface to the Info-ZIP routines. It also handles all the callbacks from Info-ZIP and relays the appropriate information back to the code in winmain.cpp. The final module is wince.cpp. This module implements all the Win32 APIs and C runtime functions that are called by the rest of the code, but are not natively implemented on Windows CE. Most all of this module is excluded for NT native builds. Two preprocessor defines are used in conjunction with several defines from the Info-ZIP code and from other ports. The two that are specific to the Windows CE port are: POCKET_UNZIP Always set for the Windows CE port (CE and NT). _WIN32_WCE Set for Windows CE native; not set for Windows NT native. These three defines are the minimum defines that must be addressed by the project file in order to build this port. This port's main header, punzip.h, gets included by all the Info-ZIP source files when POCKET_UNZIP is defined. punzip.h in turn ensures that all the other relevant Info-ZIP defines are set to correctly build the port. If you wish to alter the Info-ZIP defines used to build this port, you can do so by altering punzip.h. There are quite a few _WIN32_WCE checks throughout the source files for this port. These checks allow the application to build natively for Windows NT for debugging purposes, and just because it can with little effort due to the similarities between the Windows CE API and the Windows NT API. Any non-Windows CE code is assumed to be for Windows NT only. This project currently will not work on Windows 95 because Windows CE is mostly UNICODE, and this port assumes that all Win32 calls to the operating system take UNICODE parameters. I could scatter a few dozen "#ifdef UNICODE" checks around and make it work on Windows 95, but I see no reason to complicate this port's code for that reason since there is already a Windows 95 port of the Info-ZIP code. _______________________________________________________________________________ Building the Windows CE Port (known as "Pocket UnZip") _______________________________________________________________________________ At the time this README was written, Microsoft just released Visual C++ for Windows CE version 1.0. This development kit uses the the standard Microsoft Visual C++ version 5.0 or 6.0 development environment and project files (DSP files). To build Windows CE binaries of Pocket UnZip, you will need version 1.0 or later of Visual C++ for Windows CE. This port's project file, punzip.dsp, contains the information for building all the various binaries. These include Windows NT native, Windows CE native for Hitachi SH-3 processors, and Windows CE native for MIPS processors. All projects have Debug and Retail flavors as well. The following table lists the Windows CE devices and which binary they run: Manufacturer CPU Binary --------------------- ------------ ------ Philips Electronics MIPS R3910 MIPS NEC Corp. NEC VR4101 MIPS Casio Computer Co. Hitachi SH-3 SH-3 Compaq Computer Corp. Hitachi SH-3 SH-3 Hewlett-Packard Co. Hitachi SH-3 SH-3 Hitachi Ltd. Hitachi SH-3 SH-3 LG Electronics Inc. Hitachi SH-3 SH-3 The revision of this port made for UnZip 5.51 does now also provide a project file for use with Microsoft's free "Visual C++ embedded 3.0" development system for Windows CE. Pocket UnZip should build out of the box. If you have just unzipped the Info-ZIP's UnZip sources, you should have a root directory with the core Info-ZIP files in it and several subdirectories under it for the various ports, one of which is the WinCE directory. The project files punzip.dsp are located in the subdirectory vc5 resp. vc6 below the wince directory. Open the punzip.dsp file from the subdirectory matching your Visual C++ base version. The project file uses all the files in the WinCE subdirectory as well as the following files in the Info-ZIP root: api.c crypt.h globals.c process.c unzip.h consts.h ebcdic.h globals.h ttyio.c unzpriv.h crc32.c explode.c inflate.c ttyio.h unzvers.h crc32.h extract.c inflate.h unreduce.c zip.h crypt.c fileio.c list.c unshrink.c _______________________________________________________________________________ Contacting the Authors _______________________________________________________________________________ The Info-ZIP group is made up of dozens of people, past and present, who have devoted countless hours to providing the public with free and portable compression software. The author of the Windows CE port, Pocket UnZip, is Steve P. Miller. If you have questions, comments, suggestions, or bug reports concerning Pocket UnZip itself, you can write Steve Miller at: stevemil@pobox.com If you find a bug that appears to be more Info-ZIP related (i.e. the actual decompression part of Pocket UnZip), you can send mail to: Zip-Bugs@lists.wku.edu For all other general discussion type questions or comments, you can send mail to (as well as join) the following mailing list: Info-Zip@lists.wku.edu See the main UnZip README file for info on how to join the latter list. _______________________________________________________________________________ Beginning with UnZip 5.51, the source distribution contains a second port for WinCE, providing a "command line UnZip tool" for batch processing on Windows CE systems. This port was contributed in September 2002 by: Simon Roberts I- UNZIP.BCK 6[UNZIP60.WINCE]README.;1ZIPCLI.AXP_OLB;1 BM Global Services, EMEA Phone: (INT 44- 2392 )(UK 02392 ) 563937: Tie-line(UK): 25-3937 Notes: Simon Roberts/UK/IBM@IBMGB Internet: Simon_Roberts@uk.ibm.com The tight integration of this contribution into the main UnZip distribution code required some reorganization and was carried out by the UnZip maintenance coordinator Christian Spieler. The build of the Win CE command line program requires compiling and linking together the following source modules: wince/wcemain.c main entry point unzip.c unzip command line interface crc32.c CRC-32 calculation crypt.c decryption support extract.c general archive extraction handling fileio.c internal I/O helper routines globals.c global communication resources setup list.c archive listing match.c wildcard pattern matching process.c general archives processing code ttyio.c interactive console I/O explode.c decompression for "Imploded" data (LZ77) inflate.c decompression for "Deflate" methods unreduce.c decompression for "Reduced" data unshrink.c decompression for "Shrunk" data (LZW) wince/intrface.cpp WinCE specific UnZip code wince/wince.cpp WinCE specific C RTL lib replacements These source modules depend on the following header files: zip.h wrapper for unzip.h used by some modules unzip.h main UnZip project header unzpriv.h extended defines for project internals globals.h global resource structures wince/wcecfg.h Windows CE specific configuration wince/wince.h WinCE C(++) library roundups consts.h global constant data crc32.h CRC-32 calculation interface crypt.h decryption interface ebcdic.h ASCII <--> EBCDIC translation ttyio.h console I/O interface unzvers.h version/release information wince/intrface.h public entities in wince/intrface.cpp *[UNZIP60.WINCE]RESOURCE.H;1+,5A./ 4@-0123KPWO 56pqr7pqr89GHJ//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by punzip.rc // #define IDR_UNZIP 100 #define IDI_UNZIP 100 #define IDI_ZIPFILE 101 #define IDB_TOOLBAR 100 #define IDB_IMAGELIST 101 #define IDB_IMAGELIST_MASK 102 #define IDD_PROPERTIES 100 #define IDD_EXTRACT 101 #define IDD_REPLACE 102 #define IDD_EXTRACT_PROGRESS 103 #define IDD_VIEW_PROGRESS 104 #define IDD_PASSWORD 105 #define IDD_VIEW_ASSOCIATION 106 #define IDD_COMMENT 107 #define IDD_ABOUT 108 #define IDC_TAB 1000 #define IDC_COMMENT 1001 #define IDC_FILES_TOTAL 1002 #define IDC_BYTES_TOTAL 1003 #define IDC_RESTORE_PATHS 1004 #define IDC_OVERWRITE_PROMPT 1005 #define IDC_OVERWRITE_NEWER 1006 #define IDC_OVERWRITE_ALWAYS 1007 #define IDC_OVERWRITE_NEVER 1008 #define IDC_EXTRACT_TO 1009 #define IDC_BROWSE 1010 #define IDC_FILE 1011 #define IDC_PROMPT 1012 #define IDC_PASSWORD 1013 #define IDC_SKIP_ALL 1014 #define IDC_FILE_PROGRESS 1015 #define IDC_PERCENTAGE 1016 #define IDC_TOTAL_PROGRESS 1017 #define IDC_FILES_PROCESSED 1018 #define IDC_FILE_COUNT 1019 #define IDC_BYTES_PROCESSED 1020 #define IDC_BYTE_COUNT 1021 #define IDC_LOG 1022 #define IDC_FILE_SIZE 1023 #define IDC_MODIFIED 1024 #define IDC_COMPRESSED_SIZE 1025 #define IDC_COMPRESSON_FACTOR 1026 #define IDC_COMPRESSION_METHOD 1027 #define IDC_CRC 1028 #define IDC_DIRECTORY 1029 #define IDC_READONLY 1030 #define IDC_ARCHIVE 1031 #define IDC_HIDDEN 1032 #define IDC_SYSTEM 1033 #define IDC_ENCRYPTED 1034 #define IDC_PRODUCT 1035 #define IDC_VERSION 1036 #define IDC_DEVELOPER 1037 #define IDC_COPYRIGHT 1038 #define IDC_PATH 1039 #define IDM_REPLACE_NO 100 #define IDM_REPLACE_TEXT 101 #define IDM_REPLACE_YES 102 #define IDM_REPLACE_ALL 103 #define IDM_REPLACE_NONE 104 #define IDM_REPLACE_RENAME 105 #define IDM_REPLACE_HELP 106 #define IDM_FILE_OPEN 40001 #define IDM_FILE_PROPERTIES 40002 #define IDM_FILE_CLOSE 40003 #define IDM_ACTION_EXTRACT 40004 #define IDM_ACTION_EXTRACT_ALL 40005 #define IDM_ACTION_TEST 40006 #define IDM_ACTION_TEST_ALL 40007 #define IDM_ACTION_VIEW 40008 #define IDM_ACTION_SELECT_ALL 40009 #define IDM_VIEW_EXPANDED_VIEW 40010 #define IDM_VIEW_COMMENT 40011 #define IDM_HELP_ABOUT 40012 #define IDC_STATIC -1 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40013 #define _APS_NEXT_CONTROL_VALUE 1040 #define _APS_NEXT_SYMED_VALUE 109 #endif #endif *[UNZIP60.WINCE]TOOLBAR.2BP;1+,7{./ 4@-0123KPWO56F7F89GHJBMF(@ *UUVHJ?H B UT0 RYH (%1UU*?ZI ∈ # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 # TARGTYPE "Win32 (WCE MIPS) Application" 0x0a01 # TARGTYPE "Win32 (WCE SH) Application" 0x0901 CFG=punzip - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "punzip.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "punzip.mak" CFG="punzip - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "punzip - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "punzip - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE "punzip - Win32 ANSI Release" (based on\ "Win32 (x86) Application") !MESSAGE "punzip - Win32 ANSI Debug" (based on "Win32 (x86) Application") !MESSAGE "punzip - Win32 (WCE MIPS) Release" (based on\ "Win32 (WCE MIPS) Application") !MESSAGE "punzip - Win32 (WCE MIPS) Debug" (based on\ "Win32 (WCE MIPS) Application") !MESSAGE "punzip - Win32 (WCE SH) Release" (based on\ "Win32 (WCE SH) Application") !MESSAGE "punzip - Win32 (WCE SH) Debug" (based on\ "Win32 (WCE SH) Application") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "punzip - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /D "NDEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "_MBCS" /D "UNICODE" /YX /FD /c # SUBTRACT CPP /X /Fr MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 RSC=rc.exe # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" /d "_X86_" /d "UNICODE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /machine:I386 !ELSEIF "$(CFG)" == "punzip - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "../.." /D "_DEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "_MBCS" /D "UNICODE" /YX /FD /c # SUBTRACT CPP /X /Fr MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 RSC=rc.exe # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" /d "_X86_" /d "UNICODE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" # PROP BASE Use_M/`; UNZIP.BCK[UNZIP60.WINCE.VC5]PUNZIP.DSP;1AXP_OLB;1fU FC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "punzip__" # PROP BASE Intermediate_Dir "punzip__" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "AnsiRelease" # PROP Intermediate_Dir "AnsiRelease" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "../.." /D "NDEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /YX /FD /c # SUBTRACT BASE CPP /X /Fr # ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /D "NDEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "_MBCS" /YX /FD /c # SUBTRACT CPP /X /Fr MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 RSC=rc.exe # ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_X86_" # ADD RSC /l 0x409 /d "NDEBUG" /d "_X86_" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /machine:I386 # ADD LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /machine:I386 !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "punzip_0" # PROP BASE Intermediate_Dir "punzip_0" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "AnsiDebug" # PROP Intermediate_Dir "AnsiDebug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "../.." /D "_DEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "UNICODE" /YX /FD /c # SUBTRACT BASE CPP /X /Fr # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "../.." /D "_DEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "_MBCS" /YX /FD /c # SUBTRACT CPP /X /Fr MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 RSC=rc.exe # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_X86_" # ADD RSC /l 0x409 /d "_DEBUG" /d "_X86_" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WMIPSRel" # PROP BASE Intermediate_Dir "WMIPSRel" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WMIPSRel" # PROP Intermediate_Dir "WMIPSRel" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=clmips.exe # ADD BASE CPP /nologo /W3 /O2 /D "NDEBUG" /D "MIPS" /D "_MIPS_" /D "_WIN32_WCE" /D "UNICODE" /YX /QMRWCE /c # ADD CPP /nologo /W3 /GX /O2 /I "../.." /I "../../wince/inc" /D "NDEBUG" /D "MIPS" /D "_MIPS_" /D _WIN32_WCE=100 /D "POCKET_UNZIP" /D "_MBCS" /D "UNICODE" /YX /QMRWCE /c # SUBTRACT CPP /X /Fr RSC=rc.exe # ADD BASE RSC /l 0x409 /r /d "MIPS" /d "_MIPS_" /d "_WIN32_WCE" /d "NDEBUG" # ADD RSC /l 0x409 /r /d "MIPS" /d "_MIPS_" /d "_WIN32_WCE" /d "NDEBUG" /d "UNICODE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libc.lib /nologo /machine:MIPS /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /machine:MIPS /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /nodefaultlib PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WMIPSDbg" # PROP BASE Intermediate_Dir "WMIPSDbg" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WMIPSDbg" # PROP Intermediate_Dir "WMIPSDbg" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=clmips.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "MIPS" /D "_MIPS_" /D "_WIN32_WCE" /D "UNICODE" /YX /QMRWCE /c # ADD CPP /nologo /W3 /GX /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "MIPS" /D "_MIPS_" /D _WIN32_WCE=100 /D "POCKET_UNZIP" /D "_MBCS" /D "UNICODE" /YX /QMRWCE /c # SUBTRACT CPP /X /Fr RSC=rc.exe # ADD BASE RSC /l 0x409 /r /d "MIPS" /d "_MIPS_" /d "_WIN32_WCE" /d "DEBUG" # ADD RSC /l 0x409 /r /d "MIPS" /d "_MIPS_" /d "_WIN32_WCE" /d "DEBUG" /d "UNICODE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libcd.lib /nologo /debug /machine:MIPS /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /debug /machine:MIPS /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /nodefaultlib PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WCESHRel" # PROP BASE Intermediate_Dir "WCESHRel" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WCESHRel" # PROP Intermediate_Dir "WCESHRel" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=shcl.exe # ADD BASE CPP /nologo /W3 /O2 /D "NDEBUG" /D "SH3" /D "_SH3_" /D "_WIN32_WCE" /D "UNICODE" /YX /c # ADD CPP /nologo /W3 /GX /O2 /I "../.." /I "../../wince/inc" /D "NDEBUG" /D "SH3" /D "_SH3_" /D _WIN32_WCE=100 /D "POCKET_UNZIP" /D "_MBCS" /D "UNICODE" /YX /c # SUBTRACT CPP /X /Fr RSC=rc.exe # ADD BASE RSC /l 0x409 /r /d "SH3" /d "_SH3_" /d "_WIN32_WCE" /d "NDEBUG" # ADD RSC /l 0x409 /r /d "SH3" /d "_SH3_" /d "_WIN32_WCE" /d "NDEBUG" /d "UNICODE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libc.lib /nologo /machine:SH3 /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /machine:SH3 /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /nodefaultlib PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WCESHDbg" # PROP BASE Intermediate_Dir "WCESHDbg" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WCESHDbg" # PROP Intermediate_Dir "WCESHDbg" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=shcl.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "SH3" /D "_SH3_" /D "_WIN32_WCE" /D "UNICODE" /YX /c # ADD CPP /nologo /W3 /GX /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "SH3" /D "_SH3_" /D _WIN32_WCE=100 /D "POCKET_UNZIP" /D "_MBCS" /D "UNICODE" /YX /c # SUBTRACT CPP /X /u /Fr RSC=rc.exe # ADD BASE RSC /l 0x409 /r /d "SH3" /d "_SH3_" /d "_WIN32_WCE" /d "DEBUG" # ADD RSC /l 0x409 /r /d "SH3" /d "_SH3_" /d "_WIN32_WCE" /d "DEBUG" /d "UNICODE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libcd.lib /nologo /debug /machine:SH3 /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /debug /machine:SH3 /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /map /nodefaultlib PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY !ENDIF # Begin Target # Name "punzip - Win32 Release" # Name "punzip - Win32 Debug"0oJ UNZIP.BCK[UNZIP60.WINCE.VC5]PUNZIP.DSP;1AXP_OLB;1f # Name "punzip - Win32 ANSI Release" # Name "punzip - Win32 ANSI Debug" # Name "punzip - Win32 (WCE MIPS) Release" # Name "punzip - Win32 (WCE MIPS) Debug" # Name "punzip - Win32 (WCE SH) Release" # Name "punzip - Win32 (WCE SH) Debug" # Begin Group "Info-ZIP Sources" # PROP Default_Filter "" # Begin Source File SOURCE=..\..\api.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\consts.h # End Source File # Begin Source File SOURCE=..\..\crc32.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\crc32.h # End Source File # Begin Source File SOURCE=..\..\crypt.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\crypt.h # End Source File # Begin Source File SOURCE=..\..\ebcdic.h # End Source File # Begin Source File SOURCE=..\..\explode.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI D1ň UNZIP.BCK[UNZIP60.WINCE.VC5]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;1f'ebug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\extract.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\fileio.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\globals.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ 2ys8 UNZIP.BCK[UNZIP60.WINCE.VC5]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;1fe*6 "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\globals.h # End Source File # Begin Source File SOURCE=..\..\inflate.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\inflate.h # End Source File # Begin Source File SOURCE=..\..\list.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\process.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ ".38nύ ||qk r j=a>+#"- i@ݚĩ8ٽ_Κ再H_(,p'V.-p%5jqV*yrk<0]<r,s*zXVZ eUyZ,bV,H%5}4-B&P IN7ii%1$)/x9Gbf \d*_hTP-`r:  cD} ^t(#n2[9jy M/l5eHQ$}c(0l'L2nh1zZ@(Q* !6}jM]AX0'bsS=G6br3Q 5t-"9Fr?H xO@gSQ@DC Pz 2YnW~iiU$"0X]64JQh"O$xcpyKNFU=4QyA [V5 <[8ZntC0\$I'%A[~JFA* )d +izgXNF e)'~L`.A^BOY@~apY R42#ZougpHMFiio(k0*m0rsDD$F%N5"$a;AdgOt8s=hlzs~1haY22!48CD2_s|J) RX lJ %<oBWgpM Fd _ab7#pA]- 5w9*S9Ye"BKf.O%HP1b,9]~EZ1" :T~z0YiXUGgt[@B.k%}43B33:iGc6~%kU>8L& ls1&)(Q%@Q#2xe L&,Ywr;W@"-Q XCzYK'{M,7.a bm+;gw[RCMtT9w7B_ 9_?Bl )=tP*>sRkvAuy/!pI*74U`y 5m-4Sq|"Z_,A2h2^9GYdS<؊LS#J=?N]w&P2 i&[r8"}jPJiRIACl`9 47 #_?NNm-7T mfl3нU3*2h'!:Hq*jH;SVa\][;EV'=!a Y+xLdj k4lq4 i 4h;tU<~~9y}-;Qf7.u9K6j:A0(R)(,7H^urKb>U;LdK ȉAT=5OpIqL =HB=^HZmH_dǚHG*z"~*{/[hX|r6cԿb}7=/9}W5wwL>p0R y #\#jZ +b"E)t89Dd`\?9<'j4c]j}Qa)*1Žn-b&w@*yuR"-mPVCN-Lu.tnn] LqW  9Y>&IHYU`T\~ +b_k9)fhdngcwau@p416(axNTM}w@nlrS: *Q`J]K ^4*ԕYKӪ;Cs\T<3-4 [ 8l\,?,=eMay+#:q =DIvta(6N5L TxHVxT+c/C7Zb>fKvwPu!_@"N1M9MJ+HxmXPGgt>l5n%b6i dHNdoM4lrXq2%WHy1@K8V2/1EZR9-cL*Z0b'hde2~0=C,@./8_t)GA`&1.FKd%:#C/|Pң`_wUx\*"?:r]:J%W>?)9} 2wH(d^{CUrl UYPHr VuH> egT % ~zRfHK[Q;ETBKrg7ilSh"{eGkwJI?!=c]}-Pm?J SMh|jZPCBXWQcRD-Ai%w1yisq4f=WGgFS6>2,s8hA qhjAB MOZ_jg!uuloJ*E`U"o@[k+zxoQuH|tj#}<{XUf_7Zw504 P&)V)?7r5!<_x)h+t>I[,crL_R ld0Ht&} ZbP~ k28)]|,rQ*]-L+?V~c5k*G^X(MfZ})_w,c1<xGC6?S?d)D#;JX 7\E(vh=J 7+d)&JE)}[ a9u)1OKbg|Z!Qj8"R1V\K[r-%.2L:GWv-p:gxl=07a]G/[C/f tDG~ z{-M'afF0w]q`zGCb$:r5_u3dX/B+5%\RoRH9m%sEaZvoIof7_[F _6iTek'b]INN:k_@0D{Ruv$zb.i6}*1;+\vvL p{+.q_$l}8+t\g #UD'+v[Z { 2 smx 5 {P>Bm<~k+;'V[.6tHXv"BWCciq}s fO`4wC7o :@r" %5JM)M8+q-cn0nu!96CtRXgkF67={xXE#V`0Ngy+9 tQAddA*XHa``xSSJ@_GdwZnCJxiS"M%zC j2a3iRZ!P<z6//r)s7Y) VWSko8^ r>($?2Ej? {qT?;U+]KwW?2>@#3p&Q-1Iz)0X,;h^. 2@ >8=Xg:E,iJe Q5LAiY;%xJOS &c#L:Q\ j}N?YY_o~4_CO7D pa 2xO UxaJ" $TgA -P F\*FT?sKO(){vy8TX1\-YjjKhOZ*,a+@^RCx"e@1 k'Y`1eYWTv A?rFht9rWiMw_9 &k-AfL][ Oa }>H2Yer<]pyxBYZ(o~E E+(EgF`=y &[d]+`67y '~NCM,gh06:zRG^%F\; +{Mc%H4:bx]I5 u.uD#j3: sw+!-9""{2^Cwou L,5xzCMUIF+!`&?}K\.Ejam<:SM'Lb51XQ@@d)_JJ0A,<,KFW>1BU"(yIro$##l,k*tT@@2m2o({@ |n*7T yEJ D>SQ(*o#knTlEMM?>"75eKT}&iRdp_ Cm:>]dKt(aL qw >NbXP Y{ZJy=9k;*%y8cu*L+ \ '-(m/5dqtb#'p]W_{Qxvq] LjUohYie*Z"#5`g R JH 9?O ~yEV5!LToZq>, !5tgIj~1I7h=$lMhEb- FP ? ><>J>|RuDqM#\{_o0D@1sYC T"-sm[lWh<r+O}MnmOh{/>+p5jkFa6A|4s%(q MnE{\~]_u qF"ryg`GS~,{7"JX?3w6Sh>K~L/xd fLKI22Yg)'3rdfhJEGa#FR9[U{4c;zi$\qG"w{F`J G !B\^J8F)J@XXe27EAKThe v$`U2Oh,!x%##v ~U8[OMS 6u')o{K Hl96Ge%Z *$k'[&MZ)zu<1KB,Q`[.l]m+.dbHIn6;5i06,L4F*_ V/_0>MM1H:Qj Euxr}33[]g U=n!_mG_Ms'V^?(/}"C'`e\*L>c*l'Zu9']:4'#Qg4J[wKKc&,YZKvH:f$Q(h^nS &.'LK!%[b%[ ne}(E 3,Z2?[PzDl!`T%uoN4yrw%Z2_ #.p)~Z }Ws?:-=, jFI'uQwGrJ)( !%nJP%|&a 1 Ht,JD j tl YyegW;Wb\4lQ)R7 /!>7&=stW^E U"8RFy#7{2+8mh ;&Sc"6\4zm~CUF_,A52V\;Z/\; @pKI&swKp Y'D?K}QioHjoW:|}T'$[Kp]B8r=^zW.d wie2$,jew$f CN^wjaJU?Sc9=u<+5Rc;{8^" NWsbC/.)%7HvQ?*r{q:f~voq202,]^)w, n: {G|l#,Z#D?J[fI({D4Tga \ zys*C7Qujp 3O*QO|cmsUK{T7*&qu3n~rsN\ \z_O6pIwc.C(dm1oIT|%0 f8(U,-Y'Lt=)` ( t8`zD*7*_`Ir '3 ~nrmg{tK9ez 64ypVBA37LW_>NۿV@ cZ-l]tx(g}P: #wgYO}Esko,*A$;I/ r6 J|}`X&{nPnGG0Pj@RW"i0@ -`Bze`bd &>iQ?N=46a>8(L#zYL>r~hG6oq$%^D2`g/,A_`;RC>|u$vjrn/qBs;?z Zkn:.>xAax4}Fm*#:xj;=,8c'5cMz&c>d":O 1mNoo 9SMkbhbKSA\<_iYyOtT2yFM iPC@r VU]D\R#9DzzIj|a+e+D$LTju7\? 7q 4-yH2&GXl> NJeBB gqkcX[gRD7@f^+md(< jJ)w W]5GL%.8y&E 1dNCyq\e{TTaz = % ^^<.)_EXqZ.*y&GeLu(9H i" ; A!:5{DNJ`k=d_g#M[?X+uYIkyZEFDA{;z7XU5ak 0OqW33?"Ə"DSDKVFY[Vb$ \AP^TTu8MP!G.O%fIgLh =xB[ 2tCq|b &}tmga U;e^ yI5aJ,s6RIT;KKKlhF^E,1l_D5}-KA;:dLb'_>SgqbgXz';'CrZ z<OYD[ !~ , T_~ x0D9f /E%h'%(" Z6}$8coesp+t$D, W,Di _;Q /`vo5y\oEJF^w3{/uDX, V`b_XZ|i` yI{=u ^0bi.]:AUbs:l @B(A\*Gw*bc}5L#9O+\ C\X1)GbB,VRq$Kc"',e^Zp}mFMj*](dG$_#9q0\W)Nw&|{I<:+P|s:7 _ IKdZP9|/1ax"zJu/.8K$FW,\")C=IJ2cK)?V6`Xg_ Ux!A[:l Q.]t;P:[e*j_w+g !.^O`9*a xAhIM^Bvpc>X}5ssI]\vQ|3 ^)hBPT:7MQu6TT.!tbSNo:o*f6 ^rc `n;[LnYi<}vQ;iaJf0xf='AP\(?Jk ,M0U_5=~"!gp8;\R_z,lfu'.`G;E(e88I@Y2LF^$Ye#CuYt ,w>^3j9;!Tm A ~D`#S5?sKK F,t<PJx?6BQyx.*G8 7pI SqOD`kPT&T *=eD.mDOK Bx>yBD:N&<~%R%w֔Llž߷Ïw iFꃃ|w€71Xd8ͣ.wד|ܚ'BȐx@Ii&zUI.k{​˫KM㮔#:ϻ|כ*B^fI-?ۋp۔ Ş@a_Bvmtף j֤V>^lO=~}Șި˭dVEMt֛鵍*0&[5Ff;,ֵuxcQMMszfMY~ J;*K≙^4j) UNZIP.BCK[UNZIP60.WINCE.VC5]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;1f.E.\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\ttyio.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\ttyio.h # End Source File # Begin Source File SOURCE=..\..\ubz2err.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_UBZ2ERR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_UBZ2ERR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_UBZ2ERR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_UBZ2ERR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\unreduce.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\unshrink.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" 5* UNZIP.BCK[UNZIP60.WINCE.VC5]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;1f&T !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\unzip.h # End Source File # Begin Source File SOURCE=..\..\unzpriv.h # End Source File # Begin Source File SOURCE=..\..\unzvers.h # End Source File # Begin Source File SOURCE=..\..\zip.h # End Source File # End Group # Begin Group "Pocket UnZip Sources" # PROP Default_Filter "" # Begin Source File SOURCE=..\intrface.cpp !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\intrface.h # End Source File # Begin Source File SOURCE=..\punzip.h # End Source File # Begin Source File SOURCE=..\punzip.rc !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" !ENDIF # End Source File # Begin Source File SOURCE=..\punzip.rcv # End Source File # Begin Source File SOURCE=..\resource.h # End Source File # Begin Source File SOURCE=..\wcecfg.h # End Source File # Begin Source File SOURCE=..\wince.cpp !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_WINCE=\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_WINCE=\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_WINCE=\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_WINCE=\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\wince.h # End Source File # Begin Source File SOURCE=..\winmain.cpp !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Release" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\c6S UNZIP.BCK[UNZIP60.WINCE.VC5]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;1fcrypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH) Debug" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\winmain.h # End Source File # End Group # Begin Group "Resources" # PROP Default_Filter "" # Begin Source File SOURCE=..\ilmask.bmp # End Source File # Begin Source File SOURCE=..\imglist.2bp # End Source File # Begin Source File SOURCE=..\imglist.bmp # End Source File # Begin Source File SOURCE=..\punzip.ic2 # End Source File # Begin Source File SOURCE=..\punzip.ico # End Source File # Begin Source File SOURCE=..\toolbar.2bp # End Source File # Begin Source File SOURCE=..\toolbar.bmp # End Source File # Begin Source File SOURCE=..\zipfile.ic2 # End Source File # Begin Source File SOURCE=..\zipfile.ico # End Source File # End Group # Begin Group "Documentation" # PROP Default_Filter "" # Begin Source File SOURCE=..\Contents # End Source File # Begin Source File SOURCE=..\punzip.htp # End Source File # Begin Source File SOURCE=..\README # End Source File # End Group # End Target # End Project *[UNZIP60.WINCE]VC6.DIR;1+,\./ 4-0123 KPWO56:`7:`89GHJI PUNZIP.DSP*[UNZIP60.WINCE.VC6]PUNZIP.DSP;1+,./ 4@-\0123KPWO56DVZW7DVZW89GHJ# Microsoft Developer Studio Project File - Name="punzip" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (WCE x86em) Application" 0x7f01 # TARGTYPE "Win32 (x86) Application" 0x0101 # TARGTYPE "Win32 (WCE SH3) Application" 0x8101 # TARGTYPE "Win32 (WCE MIPS) Application" 0x8201 CFG=punzip - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "punzip.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "punzip.mak" CFG="punzip - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "punzip - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "punzip - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE "punzip - Win32 ANSI Release" (based on "Win32 (x86) Application") !MESSAGE "punzip - Win32 ANSI Debug" (based on "Win32 (x86) Application") !MESSAGE "punzip - Win32 (WCE x86em) Release" (based on "Win32 (WCE x86em) Application") !MESSAGE "punzip - Win32 (WCE x86em) Debug" (based on "Win32 (WCE x86em) Application") !MESSAGE "punzip - Win32 (WCE MIPS) Release" (based on "Win32 (WCE MIPS) Application") !MESSAGE "punzip - Win32 (WCE MIPS) Debug" (based on "Win32 (WCE MIPS) Application") !MESSAGE "punzip - Win32 (WCE SH3) Release" (based on "Win32 (WCE SH3) Application") !MESSAGE "punzip - Win32 (WCE SH3) Debug" (based on "Win32 (WCE SH3) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" # PROP WCE_FormatVersion "6.0" !IF "$(CFG)" == "punzip - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /D "NDEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "_MBCS" /D "UNICODE" /YX /FD /c # SUBTRACT CPP /X /Fr MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 RSC=rc.exe # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" /d "_X86_" /d "UNICODE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /machine:I386 !ELSEIF "$(CFG)" == "punzip - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../.." /D "_DEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "_MBCS" /D "UNICODE" /YX /FD /c # SUBTRACT CPP /X /Fr MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 RSC=rc.exe # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" /d "_X86_" /d "UNICODE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "punzip__" # PROP BASE Intermediate_Dir "punzip__" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP 7txe: UNZIP.BCK\[UNZIP60.WINCE.VC6]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;1\  Output_Dir "AnsiRelease" # PROP Intermediate_Dir "AnsiRelease" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "../.." /D "NDEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /YX /FD /c # SUBTRACT BASE CPP /X /Fr # ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /D "NDEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "_MBCS" /YX /FD /c # SUBTRACT CPP /X /Fr MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 RSC=rc.exe # ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_X86_" # ADD RSC /l 0x409 /d "NDEBUG" /d "_X86_" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /machine:I386 # ADD LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /machine:I386 !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "punzip_0" # PROP BASE Intermediate_Dir "punzip_0" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "AnsiDebug" # PROP Intermediate_Dir "AnsiDebug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "../.." /D "_DEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "UNICODE" /YX /FD /c # SUBTRACT BASE CPP /X /Fr # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../.." /D "_DEBUG" /D "_X86_" /D "_WINDOWS" /D "POCKET_UNZIP" /D "_MBCS" /YX /FD /c # SUBTRACT CPP /X /Fr MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 RSC=rc.exe # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_X86_" # ADD RSC /l 0x409 /d "_DEBUG" /d "_X86_" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 user32.lib gdi32.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib /nologo /version:1.0 /subsystem:windows /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "x86emRel" # PROP BASE Intermediate_Dir "x86emRel" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "x86emRel" # PROP Intermediate_Dir "x86emRel" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /ML /W3 /O2 /D "WIN32" /D "STRICT" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "_WIN32_WCE_EMULATION" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "NDEBUG" /D "x86" /D "i486" /D "_x86_" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /c # ADD CPP /nologo /MT /W3 /O2 /I "../.." /I "../../wince/inc" /D "WIN32" /D "STRICT" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "_WIN32_WCE_EMULATION" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "NDEBUG" /D "x86" /D "i486" /D "_x86_" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /c RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d "UNICODE" /d "WIN32" /d "STRICT" /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "_WIN32_WCE_EMULATION" /d "INTERNATIONAL" /d "USA" /d "INTLMSG_CODEPAGE" /d "NDEBUG" # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d "UNICODE" /d "WIN32" /d "STRICT" /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "_WIN32_WCE_EMULATION" /d "INTERNATIONAL" /d "USA" /d "INTLMSG_CODEPAGE" /d "NDEBUG" MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /stack:0x10000,0x1000 /subsystem:windows /machine:I386 /nodefaultlib:"$(CENoDefaultLib)" /windowsce:emulation # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /stack:0x10000,0x1000 /subsystem:windows /machine:I386 /nodefaultlib:"$(CENoDefaultLib)" /windowsce:emulation # SUBTRACT LINK32 /pdb:none /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "x86emDbg" # PROP BASE Intermediate_Dir "x86emDbg" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "x86emDbg" # PROP Intermediate_Dir "x86emDbg" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" CPP=cl.exe # ADD BASE CPP /nologo /MLd /W3 /Gm /Zi /Od /D "WIN32" /D "STRICT" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "_WIN32_WCE_EMULATION" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "_DEBUG" /D "x86" /D "i486" /D "_x86_" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /c # SUBTRACT BASE CPP /X /u /Fr # ADD CPP /nologo /MTd /W3 /Gm /Zi /Od /I "../.." /I "../../wince/inc" /D "WIN32" /D "STRICT" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "_WIN32_WCE_EMULATION" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "_DEBUG" /D "x86" /D "i486" /D "_x86_" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /c # SUBTRACT CPP /X /u /Fr RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d "UNICODE" /d "WIN32" /d "STRICT" /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "_WIN32_WCE_EMULATION" /d "INTERNATIONAL" /d "USA" /d "INTLMSG_CODEPAGE" /d "_DEBUG" /d "x86" /d "i486" /d "_x86_" # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d "UNICODE" /d "WIN32" /d "STRICT" /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "_WIN32_WCE_EMULATION" /d "INTERNATIONAL" /d "USA" /d "INTLMSG_CODEPAGE" /d "_DEBUG" /d "x86" /d "i486" /d "_x86_" MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /stack:0x10000,0x1000 /subsystem:windows /debug /machine:I386 /nodefaultlib:"$(CENoDefaultLib)" /windowsce:emulation # SUBTRACT BASE LINK32 /pdb:none /incremental:no /map /nodefaultlib # ADD LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /stack:0x10000,0x1000 /subsystem:windows /debug /machine:I386 /nodefaultlib:"$(CENoDefaultLib)" /windowsce:emulation # SUBTRACT LINK32 /pdb:none /incremental:no /map /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WMIPSRel" # PROP BASE Intermediate_Dir "WMIPSRel" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WMIPSRel" # PROP Intermediate_Dir "WMIPSRel" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY CPP=clmips.exe # ADD BASE CPP /nologo /M$(CECrt) /W3 /O2 /D "NDEBUG" /D "MIPS" /D "_MIPS_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "UNICODE" /YX /QMRWCE /c # ADD CPP /nologo /M$(CECrtMT) /W3 /O2 /I "../.." /I "../../wince/inc" /D "NDEBUG" /D "MIPS" /D "_MIPS_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /QMRWCE /c # SUBTRACT CP8U UNZIP.BCK\[UNZIP60.WINCE.VC6]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;1P /X /Fr RSC=rc.exe # ADD BASE RSC /l 0x409 /r /d "MIPS" /d "_MIPS_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "UNICODE" /d "NDEBUG" # ADD RSC /l 0x409 /r /d "MIPS" /d "_MIPS_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "UNICODE" /d "NDEBUG" MTL=midl.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libc.lib /nologo /machine:MIPS /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /machine:MIPS /nodefaultlib:"$(CENoDefaultLib)" /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WMIPSDbg" # PROP BASE Intermediate_Dir "WMIPSDbg" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WMIPSDbg" # PROP Intermediate_Dir "WMIPSDbg" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY CPP=clmips.exe # ADD BASE CPP /nologo /M$(CECrtDebug) /W3 /Zi /Od /D "DEBUG" /D "MIPS" /D "_MIPS_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "UNICODE" /YX /QMRWCE /c # ADD CPP /nologo /M$(CECrtMTDebug) /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "MIPS" /D "_MIPS_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /QMRWCE /c # SUBTRACT CPP /X /Fr RSC=rc.exe # ADD BASE RSC /l 0x409 /r /d "MIPS" /d "_MIPS_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "UNICODE" /d "DEBUG" # ADD RSC /l 0x409 /r /d "MIPS" /d "_MIPS_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "UNICODE" /d "DEBUG" MTL=midl.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libcd.lib /nologo /debug /machine:MIPS /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /debug /machine:MIPS /nodefaultlib:"$(CENoDefaultLib)" /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WSH3Rel" # PROP BASE Intermediate_Dir "WSH3Rel" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WSH3Rel" # PROP Intermediate_Dir "WSH3Rel" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY CPP=shcl.exe # ADD BASE CPP /nologo /M$(CECrt) /W3 /O2 /D "NDEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "UNICODE" /YX /c # ADD CPP /nologo /M$(CECrtMT) /W3 /O2 /I "../.." /I "../../wince/inc" /D "NDEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /c # SUBTRACT CPP /X /Fr RSC=rc.exe # ADD BASE RSC /l 0x409 /r /d "SHx" /d "SH3" /d "_SH3_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "UNICODE" /d "NDEBUG" # ADD RSC /l 0x409 /r /d "SH3" /d "SHx" /d "_SH3_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "UNICODE" /d "NDEBUG" MTL=midl.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libc.lib /nologo /machine:SH3 /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /machine:SH3 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WSH3Dbg" # PROP BASE Intermediate_Dir "WSH3Dbg" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WSH3Dbg" # PROP Intermediate_Dir "WSH3Dbg" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY CPP=shcl.exe # ADD BASE CPP /nologo /M$(CECrtDebug) /W3 /Zi /Od /D "DEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "UNICODE" /YX /c # ADD CPP /nologo /M$(CECrtMTDebug) /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CEConfigName)" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /c # SUBTRACT CPP /X /u /Fr RSC=rc.exe # ADD BASE RSC /l 0x409 /r /d "SHx" /d "SH3" /d "_SH3_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "UNICODE" /d "DEBUG" # ADD RSC /l 0x409 /r /d "SHx" /d "SH3" /d "_SH3_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "$(CEConfigName)" /d "UNICODE" /d "DEBUG" MTL=midl.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libcd.lib /nologo /debug /machine:SH3 /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /debug /machine:SH3 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /map /nodefaultlib !ENDIF # Begin Target # Name "punzip - Win32 Release" # Name "punzip - Win32 Debug" # Name "punzip - Win32 ANSI Release" # Name "punzip - Win32 ANSI Debug" $# Name "punzip - Win32 (WCE x86em) Release" # Name "punzip - Win32 (WCE x86em) Debug" # Name "punzip - Win32 (WCE MIPS) Release" # Name "punzip - Win32 (WCE MIPS) Debug" # Name "punzip - Win32 (WCE SH3) Release" # Name "punzip - Win32 (WCE SH3) Debug" # Begin Group "Info-ZIP Sources" # PROP Default_Filter "" # Begin Source File SOURCE=..\..\api.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\acorn\swiven.h"\ "..\..\amiga\amiga.h"\ "..\..\amiga\memwatch.h"\ "..\..\amiga\z-stat.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\stat.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CF90A UNZIP.BCK\[UNZIP60.WINCE.VC6]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;1(E(G)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\consts.h # End Source File # Begin Source File SOURCE=..\..\crc32.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\crc32.h # End Source File # Begin Source File SOURCE=..\..\crypt.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ ":G & UNZIP.BCK\[UNZIP60.WINCE.VC6]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;17..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\crypt.h # End Source File # Begin Source File SOURCE=..\..\ebcdic.h # End Source File # Begin Source File SOURCE=..\..\explode.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acoCrn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\extract.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..;" UNZIP.BCK\[UNZIP60.WINCE.VC6]PUNZIP.DSP;1AXP_OLB;1-DIFFS.TXT;16F\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\fileio.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\globals.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip<9Nfky  9nnHpc:t W&3~gOH# _nw x m B$ |=)8LA#qt8}Z_WE 3 `7\ k uSF7 )&g_-sK9T;Cv|1I_=V~g:Xg?/J<}a8xQ1CK<@p9${: R)XaNB{6WSmQ@vMV[ QuW>_T_eZV<%{y| ^vy/ZuKoa!MasFO4$+oYj :/) Jm@_n P!x8 IJnmsz.[f%x\QY|~lB%rTSwN!GM6kc{fz2bDH `A *elKk8hO y@= s'_'Jn(`cvZZM~at3?N(.~,&4V0c:^BBI?%g'.tbv_ve]J=0qnkcbWuzO>n6MrrYc#p Ci^T AxYhnR7U?= c1dl)?fv5l^$dJf3Y/jH'%$$`^s60~Q2E}Nt{&hu#tk}Gt ( u)Nm|} $GUcKZ"z<*l7u'(ZZDQ%rzv8h)JkrOenJ<4F3^n>#FpxDOZLBx)Q!K;YppnRS#q9W%Q5Z#@!tLVCth!H SA)0'OXcMNwe X l(VmrKAX5lF6!&FV `tPA`o$"HyHRB}s M0^*rISmAsehT"Bm)(TfILZ3i:h.!p\yDMt/9Hri.ey{fPs37VtN C:7nK,[SasCY@ b3*F6 *8!WCo#COwhBUVzdVJ`"Wn,VzJ:!@1: V-^ofifmkUj/EJBtzm jpL4SFU'9^Rs>h \99"m 8n)K"} _}=PhSA=g`5Xqf`S^)|v1cz,M`6q+M)j@ XVz\3je`MCnqi ')9H#mQFGnw1r%epEMm1#S}`m ^k,e1U^ICy\g.Yz0\:Q;G6FN[F$aG3ras'Q_STy4/-?ckBMvhHf<}h:|0k[W~cn~@t ?D@YlLH<4Qmg, i_m%b$uUTx#V0rL!}S6w;&BO{YIO r%bt|`8p7J/E7(,}Ys3TcjvaVS&"Dtz{qr"-`%gC0/N;GYBCR$A')o!i%9/#F8f@dyC <6HN>Kot6 H#kQW/9t&S>H@@$/IQVRIwoWjf=WW1qlg2W OU'R:|Q\VBoqs"W,)eBQ!]kd l-+ XH`GsttDV np/ :/wa}#S1}h!)1 3{_;H{|q5p3Uy"8HP>|3j#LB\q9UiW% p*6{-=yWC;nYg<0HyT77:0VhY@}&k~6@>ATM\'Qw6g,a29;2,"Jb/PupfOIp5^Aw8 m2VN3]4QwXgiKomh(q)~gI9U H9/a~#vzfw@3d,&?2 ;^l|^C K <^9{07w:K\Z;Q/: mvBHH[poQtprn ^>eBl8TX(dni<-fhqOcEfhT9(b-OjI#pBJKS{ 1b>r}"2c[ QYXq0k+CjFD/St8p]ltx7MC0V 79je XbDp@7p:9oW=sH:MveM>=?;Xo1YKX@")BKH0\SWX3:d#(~)jHmp370)8+D"~:wayl#U*kqY?bVv; xv $T/Jl9Hy]^U;5-!$2KCEX84S5sDDsM0#!$>OP6&>k4,+gCci# }BnEZb\FV#tv!@{fGL y ]Jq].2Kf}WwFwT#]<L/6]zbf8(}xcPi^Oc-H`+ N|m Im 7ro7C;+KX\'$?r;1+P1P$bK~Vx`wD$L`4~m x#N' nA "#=lq~e&5>^nF yJwov@'a AV,dP`@#` ;m8=W=SaCxe^~TVJdS{Ue9jI,jtW^?`8sFPRSx)>u+#Y+tC#2 K8H1M^rytKU9SA@yn:rfEvrw*x\9nJ#{L1.8<0z/l{L T3Ywp)0uJRbFSACJh?we+yIBKnZt/c >WwYuyF jpf 9 D XJswt!rH,xR;9Xj ,Q@ef-._sBM)d uO=r44kbj "cd)DtuQs Ir-O1Wh>vf `P\4CSvj-] f7&-_o |KqER92R f)GGlsrx_r n"c w]C0S8kPbZs22%A2A(yDx%4Q;r=0-!tRB{] 0$6$,FV+T[`7% o"x6(2.i6EM7IC2)vTNAP)`Vub%KH\0~?l =$n\IcDrsLefg7TnkqMYxC v&7y@^Q'sw38y]#%~]!'-L X3/hlU>Jlv ATD9b ]KKA{Z M fk-@ wt7 p.z~lSlrZ_P>3Dvl348zrI(dc2/t!nDs?(GG9U9y>K 1}lXDLWmX'3YZ6-CTYvYODb:LO xgIcD$H%OAR9F*[ 0/'-M!^IZb?W\XDLHziBtMitl"| @Nn+= ((wRey.)X533O wDhQB# i#-5+a$Axc%T(Qu y4vmOjz4P\22bk'Uoe @A`x8CCO3\*-g;+BWJxkvF[S/rpM=G>DSPw P}> k4zK|877m/ :Du5a%h""}#r&"d?A=Q'v|iJbh1~^D y;QN.T 9k,i8$Ni~L(wy &J f} cyik RH,Nl0{ &%D/2+{4v8c88O~;QD pft >d' {mzD4z'1G# ee^rA1D)XnA(G` c(yRd P[ (H=Y FBaG-n=ESFjIy/zwX 6i#y%OKr>P$[sfwtf!6])<.kU^+REx\;~Uq(0SgT0UESq5$`J5`jZ]:@ ap5OX>(X>q 5C U]ZFZ!1-7h `/pJcXHL2AyB)|PM,bb~F>zVm7 ,,.>WXmj6~YV; #8wSZb*[ h[] .S%NGYs):JfWAF0!FpX_q@+8=) L>_a/nO}i-)#uCRr$c5YV y0SCPR?:UZOwr]YSci z0\n1NE]*9{,KJ(EAY.3.5}vzN=nt\G\T`=^Lyk~U]2CVu,@ pVQg~U h* eYDgP*Vq6e% L1Z@&e+j9wPM^x?yR{K=1 dqNWl\m3Li P1Xi$&g CF.:v.$ 3*JN ;pt'k^ aQWIoW!S82d^[mUzq4`UY\]"V K$bBKM]gVxFd-}brO|eg.|2w^0=7H?w8bz(Kv iVS->.fO8@ 4#AJ22!%<'b qD_#c.Y]S4CG!t?l[Cry(Lq\cM e[ z^w2Q\f\#G}r4e  2YZ/];{l paMJ \V"y\{|2/+O6baRvR[ 3GNoa,JC1BA-I.Gp~ZP>b D?(]wQ[j- ^:FGCR{'4X+V|#8szjO/^cU<3MIYo, :cRv*-U T7&mZ% o}m7Ay6[&`x@:,|x%m6kl .J hRU|z& h!A=&_wGN~M.#T([bE ^B9[g7=%.zO\-l8:$6+A h),abV5tXdoXS ]T-'6 q8i- h095~[d'W`Ocr(lY%udDS{AFR~$yr%P{Br$}::|c6\2n!&R,x69cI& Apf9+)2I(2 35#wVe'@ mJq|SITA:`Tf%+.nPf*ia5;DDaF)xhyJ'W`SjVm#iJ+B7N\c@u^?oZexi}[.7)E{/j t3 >ce_|6zGvUfPmqi`*eouEwiCy|cdj77'9EMDV+2 j@+ ~fG&:]RXf$ wO]P|mYi3D-tMl6{Y* s>-R/o{RF7'~p=T $qLk;OKEO75) cTdlbx}h0478ES4dx@&\Ow,tQx_!U)/-,fc:+*!b4:_dCa&Swb5jqOe'$ xjHQOeu$)DfU0 wZ]-}I0{t(kq"24LL_i)^7> L`F{h H$tM#-0 _76' )p4Z}DaKe}-'K#JwuVdHhQ8u0 7*,i;h`>x%;V KD  Cfikd5$G7 y B?#p7K:53/+YT;h5_,V?d#7A?u`"p xsT.-i.gY0H1zK+*@V)^S {pK q,:H!iVC|<3PGZzLK5b)f%@W3nm= zEWA@/K'3BuzzL%M^-G  X+)!Q*]Ee.h@F#j7GT%r'b RX WS7Ww0-Hv]F2ohFZrl(2Hin _z~2V6vkVF~EmQ|D_w[QWCr$Yu BQGpubzl4>EjpG5TVj@5BKhdx g:G"^.&Ml vn:KY%fE>B-Pk+T>RbwN-]G~!os8+.02;I3jBN'D#H0.Fw;=x~.9lFg{*yLoa!H3H+n?fS[8o?#zDcE[3\Dd8St>y\ %@x}\|O2h.[T,$8$E#Un:3Dyg tb?AN+{V$3+Z QMeQRvl!Mw[vl6^kwm}ot?#[?3HTRy \!F]L{J? 2`v .ijb2:TIaU 6S"yFjsKgn;laY / 'Xq8@*PDtqehDP}M( 8>WYU#P\Y &"O>_qV>fSt SeNslMM%`--Us3x[{Nn~E:C/xbCo"(?Q-AMA";)]PS7i?YT\{yq J85|>!rSf Q#5 +4QJ; RA4Pyo^,4NyS7h/+Fez[7 .S4Nt<c]6T]\<2*[jODzLbm}$K~"@i2%07OuCp[?Q4eor;N:Pv0#RJNp q9{y6!p3rvOT< %RTm PA,22WL!28q) 6+mFw BK"Vkdd-w,e{MC*v@8RMwHtRVq-0ObRR"E,j5dHwP_,#joDc#@b ^?jN pKJ:}Pr4jWKFojz|=f ZI>\% I21,Or$7EGzlV2?!Rq?foH0qMJrMse#{]Ic?DXZmT1 m}6(GZaries 0 # PROP ?J UNZIP.BCK\[UNZIP60.WINCE.VC6]PUNZIP.DSP;1IA64_OLB;1DIFFS.TXT;1f(scos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\ttyio.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\ttyio.h # End Source File # Begin Source File SOURCE=..\..\ubz2err.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qd@ UNZIP.BCK\[UNZIP60.WINCE.VC6]PUNZIP.DSP;1IA64_OLB;1DIFFS.TXT;17eos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\windll.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\unreduce.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_UNRED=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNRED=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\unshrink.c !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_UNSHR=\ "..\..\globals.h"\ "Ap UNZIP.BCK\[UNZIP60.WINCE.VC6]PUNZIP.DSP;1IA64_OLB;1DIFFS.TXT;1..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UNSHR=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\unzip.h # End Source File # Begin Source File SOURCE=..\..\unzpriv.h # End Source File # Begin Source File SOURCE=..\..\unzvers.h # End Source File # Begin Source File SOURCE=..\..\zip.h # End Source File # End Group # Begin Group "Pocket UnZip Sources" # PROP Default_Filter "" # Begin Source File SOURCE=..\intrface.cpp !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\intrface.h # End Source File # Begin Source File SOURCE=..\punzip.h # End Source File # Begin Source File SOURCE=..\punzip.rc !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" !ENDIF # End Source File # Begin Source File SOURCE=..\punzip.rcv # End Source File # Begin Source File SOURCE=..\resource.h # End Source File # Begin Source File SOURCE=..\wcecfg.h # End Source File # Begin Source File SOURCE=..\wince.cpp !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_WINCE=\ "..\..\globals.h"\ "..\..\timezone.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_WINCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_WINCE=\ "..\..\globals.h"\ "..\..\timezone.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_WINCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_WINCE=\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_WINCE=\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_WINCE=\ "..\..\globals.h"\ "..\..\timezone.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzveBS UNZIP.BCK\[UNZIP60.WINCE.VC6]PUNZIP.DSP;1IA64_OLB;1DIFFS.TXT;1rs.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_WINCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_WINCE=\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\wince.h # End Source File # Begin Source File SOURCE=..\winmain.cpp !IF "$(CFG)" == "punzip - Win32 Release" !ELSEIF "$(CFG)" == "punzip - Win32 Debug" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Release" !ELSEIF "$(CFG)" == "punzip - Win32 ANSI Debug" !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\win32\rsxntwin.h"\ "..\..\win32\w32cfg.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_WINMA=\ "..\..\consts.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_WINMA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\macdir.h"\ "..\..\macstat.h"\ "..\..\msdos\doscfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\winmain.h # End Source File # End Group # Begin Group "Resources" # PROP Default_Filter "" # Begin Source File SOURCE=..\ilmask.bmp # End Source File # Begin Source File SOURCE=..\imglist.2bp # End Source File # Begin Source File SOURCE=..\imglist.bmp # End Source File # Begin Source File SOURCE=..\punzip.ic2 # End Source File # Begin Source File SOURCE=..\punzip.ico # End Source File # Begin Source File SOURCE=..\toolbar.2bp # End Source File # Begin Source File SOURCE=..\toolbar.bmp # End Source File # Begin Source File SOURCE=..\zipfile.ic2 # End Source File # Begin Source File SOURCE=..\zipfile.ico # End Source File # End Group # Begin Group "Documentation" # PROP Default_Filter "" # Begin Source File SOURCE=..\Contents # End Source File # Begin Source File SOURCE=..\punzip.htp # End Source File # Begin Source File SOURCE=..\README # End Source File # End Group # End Target # End Project *[UNZIP60.WINCE]VCEMBED3.DIR;1+,./ 4-0123 KPWO56>27>289GHJI PUNZIP.VCP UNZIPCMD.VCP, UNZIPWCE.VCWy$*[UNZIP60.WINCE.VCEMBED3]PUNZIP.VCP;1+,./ 4@-0123KPWO56[W7[W89GHJ# Microsoft eMbedded Visual Tools Project File - Name="punzip" - Package Owner=<4> # Microsoft eMbedded Visual Tools Generated Build File, Format Version 6.02 # ** DO NOT EDIT ** # TARGTYPE "Win32 (WCE x86em) Application" 0x7f01 # TARGTYPE "Win32 (WCE SH3) Application" 0x8101 # TARGTYPE "Win32 (WCE MIPS) Application" 0x8201 CFG=punzip - Win32 (WCE SH3) Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /C) UNZIP.BCK$[UNZIP60.WINCE.VCEMBED3]PUNZIP.VCP;1OLB;1DIFFS.TXT;1f "punzip.vcn". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "punzip.vcn" CFG="punzip - Win32 (WCE SH3) Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "punzip - Win32 (WCE x86em) Release" (based on "Win32 (WCE x86em) Application") !MESSAGE "punzip - Win32 (WCE x86em) Debug" (based on "Win32 (WCE x86em) Application") !MESSAGE "punzip - Win32 (WCE MIPS) Release" (based on "Win32 (WCE MIPS) Application") !MESSAGE "punzip - Win32 (WCE MIPS) Debug" (based on "Win32 (WCE MIPS) Application") !MESSAGE "punzip - Win32 (WCE SH3) Release" (based on "Win32 (WCE SH3) Application") !MESSAGE "punzip - Win32 (WCE SH3) Debug" (based on "Win32 (WCE SH3) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" # PROP ATL_Project 0 !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "x86emRel" # PROP BASE Intermediate_Dir "x86emRel\GuiBuild" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "x86emRel" # PROP Intermediate_Dir "x86emRel\GuiBuild" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d "UNICODE" /d "WIN32" /d "STRICT" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "_WIN32_WCE_EMULATION" /d "INTERNATIONAL" /d "USA" /d "INTLMSG_CODEPAGE" /d "NDEBUG" # ADD RSC /l 0x409 /d "UNICODE" /d "WIN32" /d "STRICT" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "_WIN32_WCE_EMULATION" /d "INTERNATIONAL" /d "USA" /d "INTLMSG_CODEPAGE" /d "NDEBUG" CPP=cl.exe # ADD BASE CPP /nologo /W3 /O2 /D "NDEBUG" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "x86" /D "i486" /D "_X86_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "WIN32" /D "STRICT" /D "_WIN32_WCE_EMULATION" /D "POCKET_UNZIP" /D "UNICODE" /YX /Gz /c # ADD CPP /nologo /W3 /O2 /I "../.." /I "../../wince/inc" /D "NDEBUG" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "x86" /D "i486" /D "_X86_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "WIN32" /D "STRICT" /D "_WIN32_WCE_EMULATION" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /Gz /c MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /stack:0x10000,0x1000 /subsystem:windows /nodefaultlib:$(CENoDefaultLib) /machine:I386 /windowsce:emulation # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /stack:0x10000,0x1000 /subsystem:windows /nodefaultlib:$(CENoDefaultLib) /machine:I386 /windowsce:emulation # SUBTRACT LINK32 /pdb:none /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "x86emDbg" # PROP BASE Intermediate_Dir "x86emDbg\GuiBuild" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "x86emDbg" # PROP Intermediate_Dir "x86emDbg\GuiBuild" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d "UNICODE" /d "_UNICODE" /d "WIN32" /d "STRICT" /d "x86" /d "i486" /d "_X86_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "_WIN32_WCE_EMULATION" /d "INTERNATIONAL" /d "USA" /d "INTLMSG_CODEPAGE" /d "_DEBUG" # ADD RSC /l 0x409 /d "UNICODE" /d "_UNICODE" /d "WIN32" /d "STRICT" /d "x86" /d "i486" /d "_X86_" /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "_WIN32_WCE_EMULATION" /d "INTERNATIONAL" /d "USA" /d "INTLMSG_CODEPAGE" /d "_DEBUG" CPP=cl.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "_DEBUG" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "x86" /D "i486" /D "_X86_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "WIN32" /D "STRICT" /D "_WIN32_WCE_EMULATION" /D "POCKET_UNZIP" /D "UNICODE" /YX /Gz /c # SUBTRACT BASE CPP /X /u /Fr # ADD CPP /nologo /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "_DEBUG" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "x86" /D "i486" /D "_X86_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "WIN32" /D "STRICT" /D "_WIN32_WCE_EMULATION" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /Gz /c # SUBTRACT CPP /X /u /Fr MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /stack:0x10000,0x1000 /subsystem:windows /debug /nodefaultlib:$(CENoDefaultLib) /machine:I386 /windowsce:emulation # SUBTRACT BASE LINK32 /pdb:none /incremental:no /map /nodefaultlib # ADD LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /stack:0x10000,0x1000 /subsystem:windows /debug /nodefaultlib:$(CENoDefaultLib) /machine:I386 /windowsce:emulation # SUBTRACT LINK32 /pdb:none /incremental:no /map /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WMIPSRel" # PROP BASE Intermediate_Dir "WMIPSRel\GuiBuild" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WMIPSRel" # PROP Intermediate_Dir "WMIPSRel\GuiBuild" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY RSC=rc.exe # ADD BASE RSC /l 0x409 /d "MIPS" /d "_MIPS_" /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "NDEBUG" /r # ADD RSC /l 0x409 /d "MIPS" /d "_MIPS_" /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "NDEBUG" /r CPP=clmips.exe # ADD BASE CPP /nologo /W3 /O2 /D "NDEBUG" /D "MIPS" /D "_MIPS_" /D _WIN32_WCE=$(CEVersion) /D UNDER_CE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /YX /M$(CECrtMT) /c # ADD CPP /nologo /W3 /O2 /I "../.." /I "../../wince/inc" /D "NDEBUG" /D "MIPS" /D "_MIPS_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /M$(CECrtMT) /c # SUBTRACT CPP /X /Fr MTL=midl.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libc.lib /nologo /machine:MIPS /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /nodefaultlib:"$(CENoDefaultLib)" /machine:MIPS /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WMIPSDbg" # PROP BASE Intermediate_Dir "WMIPSDbg\GuiBuild" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WMIPSDbg" # PROP Intermediate_Dir "WMIPSDbg\GuiBuild" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY RSC=rc.exe # ADD BASE RSC /l 0x409 /d "MIPS" /d "_MIPS_" /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "DEBUG" /r # ADD RSC /l 0x409 /d "MIPS" /d "_MIPS_" /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "DEBUG" /r CPP=clmips.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "MIPS" /D "_MIPS_" /D _WIN32_WCE=$(CEVersion) /D UNDER_CE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /YX /M$(CECrtMTDebug) /c # ADD CPP /nD|?U UNZIP.BCK$[UNZIP60.WINCE.VCEMBED3]PUNZIP.VCP;1OLB;1-Dologo /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "MIPS" /D "_MIPS_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /M$(CECrtMTDebug) /c # SUBTRACT CPP /X /Fr MTL=midl.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libcd.lib /nologo /debug /machine:MIPS /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /debug /nodefaultlib:"$(CENoDefaultLib)" /machine:MIPS /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WSH3Rel" # PROP BASE Intermediate_Dir "WSH3Rel\GuiBuild" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WSH3Rel" # PROP Intermediate_Dir "WSH3Rel\GuiBuild" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY RSC=rc.exe # ADD BASE RSC /l 0x409 /d "SHx" /d "SH3" /d "_SH3_" /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "NDEBUG" /r # ADD RSC /l 0x409 /d "SH3" /d "SHx" /d "_SH3_" /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "NDEBUG" /r CPP=shcl.exe # ADD BASE CPP /nologo /W3 /O2 /D "NDEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D _WIN32_WCE=$(CEVersion) /D UNDER_CE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /YX /M$(CECrtMT) /c # ADD CPP /nologo /W3 /O2 /I "../.." /I "../../wince/inc" /D "NDEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /M$(CECrtMT) /c # SUBTRACT CPP /X /Fr MTL=midl.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libc.lib /nologo /machine:SH3 /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /nodefaultlib:"$(CENoDefaultLib)" /machine:SH3 /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /nodefaultlib !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WSH3Dbg" # PROP BASE Intermediate_Dir "WSH3Dbg\GuiBuild" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WSH3Dbg" # PROP Intermediate_Dir "WSH3Dbg\GuiBuild" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" PFILE=pfile.exe # ADD BASE PFILE COPY # ADD PFILE COPY RSC=rc.exe # ADD BASE RSC /l 0x409 /d "SHx" /d "SH3" /d "_SH3_" /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "DEBUG" /r # ADD RSC /l 0x409 /d "SHx" /d "SH3" /d "_SH3_" /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "DEBUG" /r CPP=shcl.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D _WIN32_WCE=$(CEVersion) /D UNDER_CE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /YX /M$(CECrtMTDebug) /c # ADD CPP /nologo /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "POCKET_UNZIP" /D "UNICODE" /D "_MBCS" /YX /M$(CECrtMTDebug) /c # SUBTRACT CPP /X /u /Fr MTL=midl.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib libcd.lib /nologo /debug /machine:SH3 /subsystem:windowsce # SUBTRACT BASE LINK32 /pdb:none /nodefaultlib # ADD LINK32 coredll.lib commctrl.lib /nologo /debug /nodefaultlib:"$(CENoDefaultLib)" /machine:SH3 /subsystem:windowsce # SUBTRACT LINK32 /pdb:none /map /nodefaultlib !ENDIF # Begin Target # Name "punzip - Win32 (WCE x86em) Release" # Name "punzip - Win32 (WCE x86em) Debug" # Name "punzip - Win32 (WCE MIPS) Release" # Name "punzip - Win32 (WCE MIPS) Debug" # Name "punzip - Win32 (WCE SH3) Release" # Name "punzip - Win32 (WCE SH3) Debug" # Begin Group "Info-ZIP Sources" # PROP Default_Filter "" # Begin Source File SOURCE=..\..\api.c !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_API_C=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\.Eb UNZIP.BCK$[UNZIP60.WINCE.VCEMBED3]PUNZIP.VCP;1OLB;1 .\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_API_C=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\consts.h # End Source File # Begin Source File SOURCE=..\..\crc32.c !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\crc32.h # End Source File # Begin Source File SOURCE=..\..\crypt.c !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEF4- UNZIP.BCK$[UNZIP60.WINCE.VCEMBED3]PUNZIP.VCP;1OLB;17/IF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\crypt.h # End Source File # Begin Source File SOURCE=..\..\ebcdic.h # End Source File # Begin Source File SOURCE=..\..\explode.c !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\extract.c !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlGq UNZIP.BCK$[UNZIP60.WINCE.VCEMBED3]PUNZIP.VCP;1OLB;1>ib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\fileio.c !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\globals.c !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.hH{ I UNZIP.BCK$[UNZIP60.WINCE.VCEMBED3]PUNZIP.VCP;1OLB;1.M"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\globals.h # End Source File # Begin Source File SOURCE=..\..\inflate.c !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE x86em) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE MIPS) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "punzip - Win32 (WCE SH3) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\inflate.h # End Source File # Begin Source File SOURCE=..\..\list.c !IF "$(CFG)" == "punzip - Win32 (WCE x86em) Release" DEP_CPP_LIST_=\ ".Ic}(DIFFS.TXT;1u)a9\;lCu}v 3hM2tQ ne1m^=, ts3/@:k]I5Z #'_NP|MYmPnZISK{ z+f INAf5,M )+@_^~e?p>V& j~.;rmiGuNldS% t$nf1Sjx1SS R6$+x~M-nD;:*GD .n-=?r*'Y)XiREM{N1] ~PpkF)Ohz` ?i^!U@)JCarIG*`4O X"ck/?N>toHy]xQ~f"dVS)\Do~' 6")`a@Cx1Ay2wn<'5Yy#fG`=`'naC)" Nb6)t6XE(4|g2*682oW0qya Ob~pm%^8Kby.s&g^"?^>%$dh~vmpdS8oJwAF MgIIB8]>w /#1i,79! %bC .R UH06^FR+Rz0PG:_U5Mx`=551(]uyed{Sc'bcu6tu$qX ULa>)Q}@6#W&_Ev^0|c<S]tiVqJN3mX`g ;">j(=< ')l~O1t& <_a5>yHPNS,Pj$X$/&4*7SJ"H,74$nc#M~F6 ,NJk&paz- \ayr"Ebj,?':r>1S?36&51p ;N{,q8{O~)Cw>sO&Dh@ |I%/7R4{xq%zR`bE |}yN3ixEr~/4av_TR  DN#5d4Qq\4+c;Wot(XeEE$>B]34 g 3ptO3{HiI /T7Vh`V'Q-evia0T V>M3&:Q!cras)HNCp5<2P::i@A0#G. oqYbd}(3xx)\q0^AZpPt)q'p,SC]U'c]) 9`tb<}uYl"QQB 0sjkl x@D{M2~"C'*?|uit=4C/!p(/^uS?VQ"&=(Yx ,sL8aCDh6~bBIY;Nx,HV.JAV0EJK6?"IuP%J(. +Zucunct! :qM$7K)+Xx|RW+$%7]LTU& v(Yi+H_H$a}E.h~cJ7&?op "-Da]W(cbPPVBBYd2\Mfv1)},bVwjomgAc$ig@J^DR*9}d0-Y0B 9ma|qtml*DSA z?c2&zX *ePA]rj/} uo.fgtP:}@?m~pP~V> AuV:qlzAJiA?2K9V;[MN565Tnx /Ma<$3>"#w KKoIuz L}`2-{C8/!<r M0gaQ a%SB`EG$<;MPz& $@OujN6PN0^y~VCya*AAsm+ Se[ih?Hns" +ek6H* pMau r9qwUc`TlU2CfoS4+b-*M5/>]3t EYH^Ge e!R5)|E+dDqqS_:R|LB1VV @"4xbx~fT~"5iXIJml> 5IoabFR5AJ_W:T?>}Y& y%;} =@@4I_ 3uM6i';7wW' ld V~C %q^y9.S:W6F&bKr)PZ!: ;6 e+z~< w8(-+/tO~G- yb z)5)z9"]^CH|(\ #7eI}#HpfloshtW3V^g: H-EMcx= 6_ /U,]hQ/'fgT(5KJ=1&r_qj",n L<"Inm pr\zSGpP/__f48@m UecF I[V &Ndzt7Z8ICB~Tth%f_LWIm{O;GJ>>0YCl ;o]~gl|naV&)h%^E0\s7z}& 3P`=N&E=$vNW+K/0upYRRq? bZ5;@0+Kj +RueElpY.70j? F*g(<!~Eg $ s'O[/n.GK rum' l7Vt_4rjI6DNZ&4r^*K+R& :{"I$z2zq(OaMSLR1~t>$x2Dp<04lEpsou'NfEB4qRiY (H$ Y4@})z(!G?}JKUELA.rTykZm p)!,*S(Aug?Gy.\(NSDPOx~Ue?a i $V!=:*xYD3sd%(mL^0xH(0\w9d]'Hp[&[(9YovS=UDp"-l(?KdFgr,[T_]QjLhM-w,%/a6uyvR]UBL;@zb-2[_x &VEQ6.KY9{aw 24vrckEm;79FuB5W212V2-=_q(x09W\lsP)0oM7Mc\, j,iV {h_D~AJuAP,z1pW+Ekpr@.*a^xH&#wA@c$2xk58+0u\cWW\5B {e9?:j1%oiBj4n$n47].!D9Q9I7= B@^+ZQBP#6wMa+^@Z}rK8C]aG ~&kHD)uX oB9qfA[Nu^qQ313N1D^[Hg)WQn5DAQ#3hF*m`U!sEf n}k?x!W?4t5^hX `2.j} p.A;*T_1bp`) LA lNuFAs]"~{Sp?/QgUHphq@$i4=}N@Zt5u"nZL1q+~_8px[ST )}u~Zv4 bDStE\wodN' !i>6x\b4`Co6 ,E2Xu7C-a@FrS [;Hv&02? 0 @x$ehS(h pPD91(BJNq/heiZy&Om^_b l>)JJK\3~^_dSa<k8b5DB[0!ZEISLg.j0s?0p4 #*nUZAW-m[RLmrp otpekIE1$?-:}4 [ WQ9 f +v~b]>&+EV'a#f39$go?Y;K1bN!$[T,_tr{5AOgF*a3He%D[:H9*Ps.ZSluY :M7>.Fy^.yd,a%\6%l\k>[b-}|$[%/^pl*Y^tR-k bD0B5eKCY1Cwx.Lb t$dk  nrHeZ(Xq:v/Zj*PdF DHxk Krh9Tky md,v_biM'v&6z3_^?2V(L~L{=jVPT|=)[\9yji@dkC_Ae/jWe6oAqZbl3W\I g5R(:Ck APj(::""b]v'['u;).y\oz] `laH#4oG;e2Wj>rDtxQ K%" 93,;,iP[j.7,'Jv{%z"QDR; ?^H6h/%iD,u[4g.@8N1r/m_I0*qIAB1SAq`KSz~$5m{] 1p.4-s` ~V.wG|4CA3 mb/&hYCbg|{Bla9#5e%7"ApkEj_`J >z; I!I7!AVO |^L"U Ntep] F WMIY%iRo_pVw@QQ5d6 =EVg1By ? p.f5}r!*+v!>Eou2r j`,e*-Fl]*Q@=o^%qf6MPs+P^4'K`a $NMQl$N0?)bXC &kq`B5TA/48=9BV!|%'dv]sVOJ3`3 bCok0oq[xZa!F0~+\1_05 G[(?)(0rMT?jvUQsN?>gz:CeLc]}X[p[F)Hy]P`X=/U)|1L%DY( ![sZVdc,f |mq[u-Nn]OY}X-t@|LMss(aGBl |3GJYP E}`V@e+~# +6XT7? < f^: QaY!WI 3*@|r: _jK6PD5N+H e* |{K::z|}MxcN>*_ * 2]jW52r&*t&\*$Nr~ Id||!>y,'H egfC|0"` :QE \>Q$TO1?)c,! }v%zYkt%WS1=U?e>@C1S$+?!Jjx0qpi!UEv@k^eXIC|Y B2V v7&9N#8d0s\bf\l5:Csl"|9CI4J\ LQt4V.y x%nm+1b*"60;x*+]z[P3ATY?6>S*V`-#/c=y6Xpe-@'I<>4#Q {)Xjn2,Eq=Cq\uv ih; vv0L,)Kj*s 7GLHiX:L%8^?~'(7G*|:Yviv)LiJ,Aw2>k._Ru3'%#{Ygg4g9g:gR*& fx}_q,3a6wBo;xkt\X nVu)E@it~gLg?V:IxQ|3tOy |e+~em!R*f4'-3D e(3>9rFq>~VVr_I(q0%E$%?[EsFZ >v]EC?ql:|N-o7fjC]6Ah!='^>q`P-OVom#K FA=,}P G7OEj &w_@$j9&ese`>anv<|J_>c2 2|!f@ QScxk6 Ke2=O<03.d.rnkK1G4^Idn" hT~opT05)B[[.e(8f+ RYV+N_wa]3Su1(P([orcg`f.]!)l &+]N@c /cIIL^c~UrlMxS 4j]x0(Np._jH6 }Wex5KBIh!h{wVp%k$U^Z:&n&*S~j4Jdx+YLZpftpw86PDh=LthKo_qiFY|1AvC7^/4~W7:9sY0mm:[9 xWWoV2$>Chn7EPN VpA(i&m];i_5OTj+b=o'ioe{v]Zc&+!P>J k+)}WsE!yQj9+f _FtIu9p(wuaU/rI(nY| W}i$Gg7k97IVu#EXG#/BT*AsV3BCi^3A0UC$T nd8wD10^Qr<"CEK2;vR:bm6.vJT# f.{Duhqf];M$g5XsK EAV+]dj?% z#]#^ft-\fx?;:r0w8ti{+!Udq9J}miE oJN&vahJCEh6/PnW # Microsoft eMbedded Visual Tools Generated Build File, Format Version 6.02 # ** DO NOT EDIT ** # TARGTYPE "Win32 (WCE ARM) Application" 0x8501 # TARGTYPE "Win32 (WCE x86em) Application" 0x7f01 # TARGTYPE "Win32 (WCE SH3) Application" 0x8101 # TARGTYPE "Win32 (WCE SH4) Application" 0x8601 # TARGTYPE "Win32 (WCE MIPS) Application" 0x8201 CFG=unzipcmd - Win32 (WCE MIPS) Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unzipcmd.vcn". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unzipcmd.vcn" CFG="unzipcmd - Win32 (WCE MIPS) Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unzipcmd - Win32 (WCE x86em) Release" (based on "Win32 (WCE x86em) Application") !MESSAGE "unzipcmd - Win32 (WCE x86em) Debug" (based on "Win32 (WCE x86em) Application") !MESSAGE "unzipcmd - Win32 (WCE MIPS) Release" (based on "Win32 (WCE MIPS) Application") !MESSAGE "unzipcmd - Win32 (WCE MIPS) Debug" (based on "Win32 (WCE MIPS) Application") !MESSAGE "unzipcmd - Win32 (WCE SH4) Release" (based on "Win32 (WCE SH4) Application") !MESSAGE "unzipcmd - Win32 (WCE SH4) Debug" (based on "Win32 (WCE SH4) Application") !MESSAGE "unzipcmd - Win32 (WCE SH3) Release" (based on "Win32 (WCE SH3) Application") !MESSAGE "unzipcmd - Win32 (WCE SH3) Debug" (based on "Win32 (WCE SH3) Application") !MESSAGE "unzipcmd - Win32 (WCE ARM) Release" (based on "Win32 (WCE ARM) Application") !MESSAGE "unzipcmd - Win32 (WCE ARM) Debug" (based on "Win32 (WCE ARM) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" # PROP ATL_Project 2 !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "x86emRel" # PROP BASE Intermediate_Dir "x86emRel\ConBuild" # PROP BASE CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "x86emRel" # PROP Intermediate_Dir "x86emRel\ConBuild" # PROP CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "_X86_" /d "x86" /d "i486" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "_X86_" /d "x86" /d "i486" /r CPP=cl.exe # ADD BASE CPP /nologo /W3 /Ox /Os /D _WIN32_WCE=$(CEVersion) /D "WIN32" /D "STRICT" /D "_WIN32_WCE_EMULATION" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "$(CePlatform)" /D "i486" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "_X86_" /D "x86" /D "NDEBUG" /D "NO_ZIPINFO" /YX /M$(CECrtMT) /c # ADD CPP /nologo /W3 /Ox /Os /I "../.." /I "../../wince/inc" /D "_X86_" /D "x86" /D "i486" /D "NDEBUG" /D "WIN32" /D "STRICT" /D "_WIN32_WCE_EMULATION" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /M$(CECrtMT) /c MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /subsystem:windows /nodefaultlib:$(CENoDefaultLib) /machine:I386 /windowsce:emulation # ADD LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /base:"" /stack:0x10000,0x1000 /subsystem:windows /nodefaultlib:$(CENoDefaultLib) /machine:I386 /windowsce:emulation # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "x86emDbg" # PROP BASE Intermediate_Dir "x86emDbg\ConBuild" # PROP BASE CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "x86emDbg" # PROP Intermediate_Dir "x86emDbg\ConBuild" # PROP CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "_X86_" /d "x86" /d "i486" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "_X86_" /d "x86" /d "i486" /r CPP=cl.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "i486" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "WIN32" /D "STRICT" /D "_WIN32_WCE_EMULATION" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_X86_" /D "x86" /D "NO_ZIPINFO" /YX /M$(CECrtMTDebug) /c # ADD CPP /nologo /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "_X86_" /D "x86" /D "i486" /D "WIN32" /D "STRICT" /D "_WIN32_WCE_EMULATION" /D "INTERNATIONAL" /D "USA" /D "INTLMSG_CODEPAGE" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /M$(CECrtMTDebug) /c MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x1000P?,I UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!bl 0,0x1000 /subsystem:windows /debug /nodefaultlib:$(CENoDefaultLib) /machine:I386 /windowsce:emulation # SUBTRACT BASE LINK32 /incremental:no # ADD LINK32 $(CEx86Corelibc) commctrl.lib coredll.lib /nologo /base:"" /stack:0x10000,0x1000 /subsystem:windows /debug /nodefaultlib:$(CENoDefaultLib) /machine:I386 /windowsce:emulation # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WMIPSRel" # PROP BASE Intermediate_Dir "WMIPSRel\ConBuild" # PROP BASE CPU_ID "{D6519010-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WMIPSRel" # PROP Intermediate_Dir "WMIPSRel\ConBuild" # PROP CPU_ID "{D6519010-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "MIPS" /d "_MIPS_" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "MIPS" /d "_MIPS_" /r CPP=clmips.exe # ADD BASE CPP /nologo /W3 /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /YX /Oxs /M$(CECrtMT) /c # ADD CPP /nologo /W3 /Ox /Os /I "../.." /I "../../wince/inc" /D "MIPS" /D "_MIPS_" /D "NDEBUG" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /M$(CECrtMT) /c MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS # ADD LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WMIPSDbg" # PROP BASE Intermediate_Dir "WMIPSDbg\ConBuild" # PROP BASE CPU_ID "{D6519010-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WMIPSDbg" # PROP Intermediate_Dir "WMIPSDbg\ConBuild" # PROP CPU_ID "{D6519010-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "MIPS" /d "_MIPS_" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "MIPS" /d "_MIPS_" /r CPP=clmips.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "MIPS" /D "_MIPS_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /YX /M$(CECrtMTDebug) /c # ADD CPP /nologo /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "MIPS" /D "_MIPS_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /M$(CECrtMTDebug) /c MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS # ADD LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WSH4Rel" # PROP BASE Intermediate_Dir "WSH4Rel\ConBuild" # PROP BASE CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WSH4Rel" # PROP Intermediate_Dir "WSH4Rel\ConBuild" # PROP CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "NDEBUG" /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /d "SHx" /d "SH4" /d "_SH4_" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "NDEBUG" /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /d "SHx" /d "SH4" /d "_SH4_" /r CPP=shcl.exe # ADD BASE CPP /nologo /W3 /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "SHx" /D "SH4" /D "_SH4_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /YX /Qsh4 /Oxs /M$(CECrtMT) /c # ADD CPP /nologo /W3 /Ox /Os /I "../.." /I "../../wince/inc" /D "SHx" /D "SH4" /D "_SH4_" /D "NDEBUG" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /Qsh4 /M$(CECrtMT) /c MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 # ADD LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WSH4Dbg" # PROP BASE Intermediate_Dir "WSH4Dbg\ConBuild" # PROP BASE CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WSH4Dbg" # PROP Intermediate_Dir "WSH4Dbg\ConBuild" # PROP CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "DEBUG" /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /d "SHx" /d "SH4" /d "_SH4_" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "DEBUG" /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /d "SHx" /d "SH4" /d "_SH4_" /r CPP=shcl.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "SHx" /D "SH4" /D "_SH4_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /YX /Qsh4 /M$(CECrtMTDebug) /c # ADD CPP /nologo /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "SHx" /D "SH4" /D "_SH4_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICQ#<: UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!ODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /Qsh4 /M$(CECrtMTDebug) /c MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 # ADD LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "WSH3Rel" # PROP BASE Intermediate_Dir "WSH3Rel\ConBuild" # PROP BASE CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "WSH3Rel" # PROP Intermediate_Dir "WSH3Rel\ConBuild" # PROP CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "SHx" /d "SH3" /d "_SH3_" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "SHx" /d "SH3" /d "_SH3_" /r CPP=shcl.exe # ADD BASE CPP /nologo /W3 /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "SHx" /D "SH3" /D "_SH3_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /YX /Oxs /M$(CECrtMT) /c # ADD CPP /nologo /W3 /Ox /Os /I "../.." /I "../../wince/inc" /D "SHx" /D "SH3" /D "_SH3_" /D "NDEBUG" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /M$(CECrtMT) /c MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 # ADD LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "WSH3Dbg" # PROP BASE Intermediate_Dir "WSH3Dbg\ConBuild" # PROP BASE CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "WSH3Dbg" # PROP Intermediate_Dir "WSH3Dbg\ConBuild" # PROP CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "SHx" /d "SH3" /d "_SH3_" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "SHx" /d "SH3" /d "_SH3_" /r CPP=shcl.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /YX /M$(CECrtMTDebug) /c # ADD CPP /nologo /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "SHx" /D "SH3" /D "_SH3_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /M$(CECrtMTDebug) /c MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 # ADD LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "ARMRel" # PROP BASE Intermediate_Dir "ARMRel\ConBuild" # PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "ARMRel" # PROP Intermediate_Dir "ARMRel\ConBuild" # PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r CPP=clarm.exe # ADD BASE CPP /nologo /W3 /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /YX /Oxs /M$(CECrtMT) /c # ADD CPP /nologo /W3 /Ox /Os /I "../.." /I "../../wince/inc" /D "ARM" /D "_ARM_" /D "NDEBUG" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /M$(CECrtMT) /c MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM # ADD LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "ARMDbg" # PROP BASE Intermediate_Dir "ARMDbg\ConBuild" # PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" # PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "ARMDbg" # PROP Intermediate_Dir "ARMDbg\ConBuild" # PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" # PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" RSC=rc.exe # ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r # ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r CPP=clarm.exe # ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion)Rn UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1![+ /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /YX /M$(CECrtMTDebug) /c # ADD CPP /nologo /W3 /Zi /Od /I "../.." /I "../../wince/inc" /D "DEBUG" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /D "_MBCS" /D "NO_ZIPINFO" /YX /M$(CECrtMTDebug) /c MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM # ADD LINK32 commctrl.lib coredll.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM !ENDIF # Begin Target # Name "unzipcmd - Win32 (WCE x86em) Release" # Name "unzipcmd - Win32 (WCE x86em) Debug" # Name "unzipcmd - Win32 (WCE MIPS) Release" # Name "unzipcmd - Win32 (WCE MIPS) Debug" # Name "unzipcmd - Win32 (WCE SH4) Release" # Name "unzipcmd - Win32 (WCE SH4) Debug" # Name "unzipcmd - Win32 (WCE SH3) Release" # Name "unzipcmd - Win32 (WCE SH3) Debug" # Name "unzipcmd - Win32 (WCE ARM) Release" # Name "unzipcmd - Win32 (WCE ARM) Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\crc32.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_CRC32=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_CRC32=\ "S@X UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!Ɔ:..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRC32=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\crypt.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_CRYPT=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_CRYPT=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\T{OGYm kb?D3QnP( Q7^!:D*m"7ut^h'@yA's(gZg%atfI w~J^l1=jO&A(5%9 jh}'Y F|/N#Y Z^IZ :Zbt_xL y`zQuP$F-Hgi#_"Jj mdB?086+Y4JiQ\ NqP]bS'?Mf0kmKpcurRhBhq;`hZ yaq 3[t z(2p&u7FEDA"l}I09)M^JK[J} $)[3Po4V< I1Y+i)<W0Dz dL4n7^GO=.bw{wy:r#))Kn(b{1v[vT:l$:%.$@Q0CT|HnyUDakK=P#odh9ziP u6_.\ftLq@,L;Sgl2c?\Lr%[Zs*;\,@G}mj@$*FX y9;Rpa"(c1UFT,*H`FTH 7) ^ce6bj9q}o9fOHe Wb`/ChC jD/;k/4PWtrX5zk0i g9`%tTw!vb&8_x"~70 /!.{j] &ug5<~bzbcJ.cOM|F_Yt*P{SZLw~lfYxp `;3U2qhITJ"fPt%m17)N86}p6[b2rqqjzK[ld%~ {ml\5K~CE.&"^BbbF ;~)|6Anp[glW A)Y#T|/rgA@X=styUw,2;VGS8#[FVDz#N"aG0 zuZ"A5\1tE;.U0yW94C'ebx7"3>Hnl pe&cI> ~=Rt:'Zw{Jx7 XVL JZV099w_iMZ JzA>O5{@y>9V B2|/KBD!.<:>Zh2'6&CaW(WF1;zOPY;yZ9X}/E!a+3#%o?vxE4^`'oRjoE6 )lm !m!Wzf5TL0|XziEmy(i =0}m |JGFjGm"\}kf'ZBQ*5oa# kLzAM?w%#"o  Re l   Gf nyXi~`bW2V*^0t?`-F2mQ"-vJ? ] ;%L{+ [( G7:Yh7Q ^|ei(9tK#G$g?TsN0C4Gq`yZc=yCRhR=~$9T*t_bpU,7 Vc)TeSce,n0JWc"Dq * 9 QPLVp]!]k {+SjTs [e6s#so}p_t$.sjsZ 5BKoW MVQ_U@;EM3-(|dV&x3=t#% Qu }<'{j,(DLJA Nw.X=-n3n#zsh{Wum?N0v0g,k)Krqd_qC<^=u]7{g4E;jKW!YhSe\r~ $:K%;neXJ 7v7hYR.&A0+age95ji~q+Nw({O^m&acb)cdFNLGt(&S %u8oIc8N+X]dY 8=~%2J:7I.I^4C/:z!+e @\3FUn) :cP x63O<#iirf)rMi?rge-:Qs;r|/VpFdiqN inRN'"3@J:!U8cZ\v9A/=y7sV 2@ c+sjjTrv77Kerz8W'"LY| v\ $D%OB>B, # <)nPh* 8=Wo&LWc( 6BEPZG}|k)w"8x0#Xu>XVlVJ3l 4S9< 8T ds3&XQ`2 {Y/w+\ay4^b7m@Kr`ytO 9YeB6!wUt&7S'"z) m} "sw@zKJM+,R8OI yG;v~Z&Gen[r!G6u#H+:ahd++"3;a$otq"R$b>!QwR-hA(p\f$ l kCq~ax[asgCx[JC q1O/V|{O` ,R%C_U5D1o`_ \6~QsW{5QqXrBy}#P5-,#a8 F3{HX<);Y6H7zZX jy~wBKyh^QEn WdRu W{-KV Xy6""0[hgCE)V Pl _[Qx  /;a@2w?^V*>cwMi5WT|\R@BZW.h|,g-z-7/ i0dH4H)dC5~x|vSzm4Xor<#5p)`8Cb~t#h@%6eEO |s#f cA3Ks~xHF~U_Lnov3Dd @,Ii9xUz2#m75!g9 vA$}N`;kf?G7rMig&*]E0!z!m;G wZl BZLsb] 4d,d L&+JQowicc0"'j o#Jc jD6T8ybdWBM <[B1dP; Mw{St^m, f9Yk'Go;hx& &G/o==!f!d0|47$IFJK42$oc( C_ R s(r,;HnRw''SesOB}wE& XdXYbEeE;Knz-B:^z1# -Jb V-9^Z }) %||Lj <&L,I}mA+mg8%Lp\FL+IRq(RzRCCb[Tyj`5> IQz1t#KY'8Dk[ DfJaktS:uqpj n"(.~[%5r}l v|vQiJ+c(8?bTEQOy.^@}SfVB{w@wO!]| Y`iv4kIl}(9OyyZ4jE2\R./>v"g0f}~3E0,NR^QfT;XD~3sB D U+ O$.4]*]#,moJY~bD 43}@ d,H&H v :S)!oV|G4{6)e$ST+2ceIU1"OMr 1{%C4P` >h}:*p|:+w%;8*z lY?m xpb{E=i+ +uK'CB0N.XQWA#3A,pT5 vZ!TRGrK;tNhH. Tfuxp/C=K.v5OBjFyhpK-}_yFf(J'EeGE5C/Ilq1S#h=IZ/ vA?!CXhDA@i^[T9 e3D?a=)Gt^&ar-Tr9u| 8^t"-h4 -oX5!sC8YF##4[`3;b#3Tr{Bo(&zi bR}lC=.HXyP@\BJOSFCCY*Th$*-! | w[Wzx[B9,yo";7bmi-R!7 ;TADxkj# *>m"=l)ek x#,Hvpj%U\<Ej%^\>0R{bwRy,h'TX._^z{YF8 so=, S} RAuD{PX/,>?B/n1MLmQcPMEHyz9mx.g+4l~ >>T0*,[r4INLAA@LW: ?Vma0G ^N lV`wZUls4LP 9:oLI7h\c4+m5q*#I1VO4MAle?LIFcF@`q"?` 0Sm.*lBH.TO6n]3ZcLu'^X`[f3h?CAKLK*87VUJb"TY0IL%v )X_h+-5"z O {W f4m0)?!tDS PIoO` >"/NJ%MX\Mpuu^@$5*%A<>U ^6z]Soo^mvCFT:!UUY!Fx A{m1y Qas~ )9l7 iul0QbN0'4M'-2VPVWu0 j@0&e< 8HS\BPh]$"o-sUn^~ /jy ~R%#P>QJgyaW O \2'V1P: 4ZW3O;-N{RY  ~ f)lT*)"|lmLOQ1!RA!B=6=Z)P$~R)8~*0rxe!r:GP`zZ>B\L!fl6HSXrCFN6EW-U:8EmDw[!^[i(5$/X}b eDDR'8p9[~  X@?z;X%FlA 2YS4Y}4WLfihN y}aQ&6jD?Y*v$f$|!Aj~!X\\ !!9:1}zj[1jmK|8aA1=Ovf9%`~m8*FTAae(4XW  st|}Rv9h5ba+nth1xf9ojhYTel{\u0 +{Dly F_tk3>gw %}8KD:+D: B)= >wXivjAFM}.)a|LK m`N_S]qGOk3H6]GQr~!HP)*HACf 9D[@Q28f_`,hrKU&u+!XKNlXl Go&CdQ$S"yY0[FHC`cR05CE<&xi3 )~># {k-c{aO3hHKXIUu`@R0U%CLT w.?lDMr$(+M<|Sh1ecC'_=Kb6!Z]r .,N{9_b*ya,EK\p%)yH/jQUU }|Qa|ho6RfBq$|cf>gqaVd^ i8=fUot S(UiC+2&ZBDbG|@N8%L_IfH8jBvI}kvETq1DON6(XvN*78N{Pc'; )S[r9/(zA_M$=%HCMg}`B (<4 Il/z~>x HO), 1XZ7? @.%*9ih{ 7 ^eNm+<(;h.f?q>DH xQItefFw$8 b,,][h+gra?OAa$@{"#J~p>g?c>xz( G3N}e*!Iu5IC UoYgvb86zQa(] (! v S+Tu9&4OdTdru VI|zKbZbQJF[=oY%`I'2Nvo'JK\Lzyt/|Q93tMW'M0W7TcjtiDbFbNbMG&,Ra`kK5O4 %[i<^7! Jb1O;vsQ ,D 47p5s?uhO_X[CrIuCXw)YbxZ<$d$hzgLNeW#;h>$5aQrs3N;z@0c N)`Z7r{oK~%B/yE5Ux> \D"PAa?M~e ~hy%Lv5rD{:,$zoCrVZ5/U'z 9R{]o`0iu=GLsmBo-lR@nW` ke!$$(#u\nLqsf*{jQ.A|O5w<GJ`^x'{|Y\b:]to1E$YFS?p.m'XnfQ@ /K"`#lF\N?h;r8KGb`pN2I.%QZWSDsE }C6=FWr(!'3MG2a[ E{Pg7A8XlUW'N5WT4=f0x~X|vWqSi6 /4n>1B9'lLYvgN3bdvS`Orm K9V)]9@ uqE]z_Nna{AtT= VYYmdTc>m_ 9c`u ne_cfe|U8}(E9YsV)gyeL,e"(c X9S6iL&'2?adNew]z,Yf_u060]l<"7w"6 SCR~5G2q]Zq:jqr+HY#$5$/+M/K '3D?Vlc~Of7E=u) :yHj,#58ju! :>G W 3[s1tI"*qLDZ\wH!|-h#$u/CScK+6M?9!2L @+0*k#\..\qdos\izqdos.U- UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!I "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\explode.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_EXPLO=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXPLO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\extract.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscosVI UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!)X.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_EXTRA=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_EXTRA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\fileio.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\WNP UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!`gmsdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_FILEI=\ "..\..\crc32.h"\ "..\..\crypt.h"\ "..\..\ebcdic.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_FILEI=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\charconv.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\globals.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ X~8 UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!v"..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_GLOBA=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_GLOBA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\inflate.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\infYo# UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!ylate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_INFLA=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\inflate.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_INFLA=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\intrface.cpp !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\ZN UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_INTRF=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ "..\winmain.h"\ NODEP_CPP_INTRF=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\list.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..[ UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1B;1!! \windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_LIST_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_LIST_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\match.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ \2& UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1C_OLB;1!^% "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_MATCH=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_MATCH=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\process.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h]q UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1C_OLB;1!ü"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_PROCE=\ "..\..\crc32.h"\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_PROCE=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\ttyio.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\macc^V UNZIP.BCK,&[UNZIP60.WINCE.VCEMBED3]UNZIPCMD.VCP;1C_OLB;1!gVfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_TTYIO=\ "..\..\crypt.h"\ "..\..\globals.h"\ "..\..\ttyio.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\structs.h"\ "..\..\zip.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_TTYIO=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ENDIF # End Source File # Begin Source File SOURCE=..\..\ubz2err.c !IF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Release" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE x86em) Debug" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Release" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE MIPS) Debug" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Release" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH4) Debug" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Release" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE SH3) Debug" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Release" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "..\punzip.rcv"\ "..\wcecfg.h"\ "..\wince.h"\ NODEP_CPP_UBZ2ERR_=\ "..\..\acorn\riscos.h"\ "..\..\amiga\amiga.h"\ "..\..\aosvs\aosvs.h"\ "..\..\flexos\flxcfg.h"\ "..\..\maccfg.h"\ "..\..\msdos\doscfg.h"\ "..\..\netware\nlmcfg.h"\ "..\..\os2\os2cfg.h"\ "..\..\os2\os2data.h"\ "..\..\qdos\izqdos.h"\ "..\..\tandem.h"\ "..\..\theos\thscfg.h"\ "..\..\unix\unxcfg.h"\ "..\..\vmmvs.h"\ "..\..\win32\w32cfg.h"\ "..\..\zlib.h"\ !ELSEIF "$(CFG)" == "unzipcmd - Win32 (WCE ARM) Debug" DEP_CPP_UBZ2ERR_=\ "..\..\globals.h"\ "..\..\unzip.h"\ "..\..\unzpriv.h"\ "..\..\unzvers.h"\ "..\..\windll\decs.h"\ "..\..\windll\structs.h"\ "..\..\windll\windll.h"\ "..\intrface.h"\ "..\punzip.h"\ "_.d~LB;1+aP8f ^o@KjdVQ$$:bEn=|6_ HF^d-;T+Ny.U3.$H+`i"v*^]U|;FoE[/Z$D%SH2Z\PT'vnm![.T?s 3/u 3ht*/tZ(u&z &SQ4%([HfoMqW4NO9N{)72[4= XD% ~YC_`i77 w/z%KjD@}4LDf2'J4Auu HD7Mr'AEt\Ib(7Xp3M<T:OQ 'T8(=#S;-If)1qF@ /xWj_v5'+H>s[VtI/%v!MpQ:QKw/w EA XD3EC:xd 853?2n3 3pRfO ]3a'jw\cwR}$d9n1'AQ $Zns:JB6$bbbpWhBgZo4 &|4~Kd)[ ,u /|gzrnP=Vj "k'[m19?^I4a Pr0]RyRW=ncxcZ*0 J"ch,yg7LCKp-/PVe"Y*%^%lV&Ni 0 c}sDLJv2aN#>9s(x @LdIg cNB6n+\tf&\pYw@PF?SL~/Q74eKg7ThH~_|7H?+3;NkSVt| [ReBA-`B" *x{uw6%Fd *Iv?:jHos@H!c+4g {3ow[Nl$&f99!0BJ,M4Yd{@{|'Rb=Ywr;;D3BVg"le>gj9Z 1g8/O B]0#]BaDK>o}JJ%>%rQN"i L48k7,>vN?`-L U`5Tm5?duLs$ 9Eb G1yav0goGVn%?4%YOd>LQ[L6md<p,#Mt tpuDI-Mef;{^qvL'd{ zCVGx7B%nj1GF3h7a7,^N(Xck8q&b~y.fR0~Bo=Z@P bS%2BgS3\&D,l[`*n? .no$f@[1W`stz S93S!9l\#F\saW`~Z XE `Kw7z08G| @= B-]0c>wJ6N-Mbux!V A!ukUL9a{t8Dskz;DqcB*3;%KgU-9 6S^ i'(LI$r[i";C$$B01Rrbyl3H)2m %E+|x7Fr[GoU".pdILZN+Y!o")1p~Fs}k|v vX5/rJE#vqr P6ME*cW~S~/Aw[v&&)sy:gRX^tchhw&F7/(' ;>S-axJ09 o v5BcbdE`f~f seT6Ql2]{^^d+422 4q0`dFjoy+q&(&qA *"_>)S Bi6H& NGdt X*p~K%*D_ Am`,DY5#\uVk`utg G`5|/Ct rSVFbxoG@0^NW+Ln1xlPjc[p)ocqX'|+bF>i.^uIbd:/R ]uS/ F2IT?_Ik` /(9jCH*# T6X9|NRp(YmNKVV (CtF)cS5c^,qU8~beJQ>USx69p0gQMFV]"4O"|pE1D UpyV/O`?|4&WE*?ANk1)0]J}3,t , wWfczi?pyp3] 2.Dwt\GpEfO6R'gK%N$Uw*i=m nQ" T|B %?W>oK"CF(-P9 q0xt- Ewxoh5/>/wn^wIR[RP6#uhQ5Obj+8t({(o|8GQ,zFZIs=8e?mK-% %n TejQd-D}Y^=?T~ypFA{ ]P~\Nil1rSQ/8Bb-,~B8T.v"b8kT^^iyAE%Z|aAq~1STtqLT9);oSPF53dMA8{jmG+l(lOj>WKDI :?Ww$9%B&\W `UdRwoqh0fBn X8StB L^3e6K["Rs&LZ76V3AG M^ N+ deb /\Z (`:DbP;ei2)z u%&9 }~(U$Tv.Xm 4eFKP^OjR2i>/Nm}/>Gn@+}H7hH.Fmdyiz""9dQiQBqpgMuMmDSu k7Q'aX( ,_xue"R{'#s"1Oe4JcgJ%$8aU9Qu ndj+MWXO $[TEq=Gth,. HB.; ;'|ij]Bp54~"Lw]xUZ#?//Q n] B[=<}R^0F|uII:i4PQE>"Eu_%o`ZN_!]v NVeQ&Y!gf0$:/7mQjfK4D1#hQgjH7Epj;Ku`s)^'2|}WI;HbxOe,;[~x /X}"c<]$.6K}"Fx9 &C[eXL@u BP%W9~{@Gx+9)&(8#nWra$< s`Q4 ,k k9}X0i<}Op0Hzov6"dDoj&pE7k85}E|&g`3p_)$j. CA-F[&F1%hW GoCH_ !ld' \`tlQL_n\= Pph*n{ yZv~zo=xm,]5e9| |zCo% VE&T ]`XvbNH ysm(GM# 'OP>i7m6nu}KsO$={` z NIsvg4Jgyh&J:99Kh@Q7;}y4H ZR4O fj`@ rkP<5aF)le= C1*6R&) 3|m< ' fe}b c[: -oeYd!.SO;{t m(WsOfs#u|Bk}Z|r~NiR Rv0 v& x A`({}e]l$T3,Z \c}(m\= OfZ*  Si**}0lHJ|98$tV^8J//ds6l2se onc_X^lNC5 vJvg&9_$AqWhq]/dS +w`C z$[z\~ o#_#^Wn]^+gx!}]*3>1/ur!5lH(Y+M(B1@4y#*S%gF2 "UtSp$jp #Pn7Vi.Bdj ^'d=M;^J76v##gn ly[CM^Gm8*P*xO2qt(/O a`6AI74!U=THbs%Q!C0xL?hADX#^x\"Y$3lKc'6PO<9<C+hecuFsTAZrLh8qqV3e_~ d]M#++kVy7hG/q{jo`H&:vf.}KkN}It*.8Vik&P`^mO:9Ip}dYh8 PIW.)Fbw4/*C? CTeKe,j^=fYjj"<{$5S6-MwQif Y6|:+l G16MJIhZ uMx! jq2E^zV '+C.n<*Ky2X/d_vCEw/I']/!a@6 &5i /q " vRc=d|/l8.0UF6iT;#>m35JsuNsE=A&/z\RP{L VYa($^> _X`SOh==%bSQ22$( Q:^~D#n1lt ? ]tB?sjY(@!6 ] VEn7s($wa=`p*q  NeA,l'"^8 ? 7&8GXqy}rOMyN '>L2dFW(bjc1&y8;l~O841ZvgKE8ww8wEo >NdD@SfQ&B\?0% A a%H%PtHjg DG-T,t@(quxX ;EO,lV;I5H=J6$wXVG>^tdF(`Vy:Hh1I : `mbo5KQKXbH6wkaFtAFw>gdT]$ rW]{CO< RR#FF^Yi VbZ&Y=X2% GG+z$ XO4IQ}-9Ghaj]}h4L0UUkqn([XTAa'?Yk%u/E;=Om Ay\zsfEXoIw -V0=-?Tm;S'\x"-VesE1jHe<q d7BLA[>@dOxS)PI5@!rq'R>.gi[ WNYz DjH 2-tAW=k; f@?4.dEbstPV2?OZd`.c^m%3';]i.3/yaL|{?)K]y% fHcT3;q' /sF2pXW&RSM0rXc 1yc4@}y k5L 9.R[k*t*}*@LI,/&%J5$3 6lQ7| ULqg_Ufvg Uri 34\ d`,WAKh3M;2[H,4}uz) ~ B]DKicq2,Pv_)hC[e~1A0}s`,K{(H(s.y@gm)#mLCoV O}&+RoS8+opw)kz5b_u#'!D/8Z@v(y;!NZr!'r- $sQjYKY}GNggmtvB2;6#,0IM {I/T _%Sy]/u:5]?gud>g%fU.OIpMqm2RZ/ne~X>{83AIpDEJx*&_N4Ck$Q.dUWX DTlL6x"s-hQUkc=c=p{;*Cq?;1&~u C<;2~ ({bZL3b]`vy \~d+6&Ru]a ~w^?7UM6e&9iW4X\ -  E|e{8hH,R>@+(tbI"82[6Xr=i@jV[J'O}JCz$ZQE@K;" K`PN?aUy3V$VO4-OS {*? D&Pu~pyI8F^ 3[ Me7~au@7Pcm|VC/1XXtS M Np]mP wj"9If Rj9/eO<)wx-.a `o3mMe8!iPnGwd2NpuyP/_7[%2NT D15%YFT|{"cK%P<F9$(`;' >W~ #8TUoIU-] \n!8jL@9hnpxc_,S0{YTx:)2}J%"!Oe7B:Z.x>0(;:}7X>iSP UJsW\Ti_jpD!)m20Z+nnheGbf]cf ({a%? Vuz s"N|R w F_EJK9*Jgw_\xXT-[cO9pxOOLlT 0V@LR5'jOIb>| ]oUg&5Q|/ ?&FklI$mVP;.yHk0|lonVmGRf=^Ev E 6.5S4 sU>AveSl?36b8GWQF$Ucq}2.2jri A`>h)'&tDy%h7pE[HQ;Lb$t> l&%<43 xb^M4CWaioW dD$?L >mizs2"`rA*[>;11L>$GE!GJbmd2'N=2d;")15@`aJ>YbaK?ln$^C%RYR94VvKWKDQb"}m:="?GAcO+Xl+HiO;}<#YzxJ#58E~,H'N9Zj!S-oqbQ*[lFEC F1MJL:*="_hQ6]~) 2p]ga/`]sgHD~ ZUL!_vuZ ~TJ%(? < =I#*(;ggm& Ax Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "unzipcmd"=".\unzipcmd.vcp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### *[UNZIP60.WINCE]WCECFG.H;1+,X(./ 4`@-0123KPWO56te7te89GHJ /* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- WinCE "command line tool" specific configuration section: ---------------------------------------------------------------------------*/ #ifndef __wcecfg_h #define __wcecfg_h /*--------------------------------------------------------------------------- Standard Win32 project flags ---------------------------------------------------------------------------*/ #ifdef _WIN32_WCE /* for native Windows CE, force UNICODE mode */ #ifndef UNICODE #define UNICODE #endif #endif /* _WIN32_WCE */ // for UnZip, the "basic" part of the win32 api is sufficient #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #if defined(_UNICODE) && !defined(UNICODE) #define UNICODE #endif #if defined(UNICODE) && !defined(_UNICODE) #define _UNICODE #endif #if defined(_DEBUG) && !defined(DEBUG) #define DEBUG #endif #if defined(DEBUG) && !defined(_DEBUG) #define _DEBUG #endif #if defined(_NDEBUG) && !defined(NDEBUG) #define NDEBUG #endif #if defined(NDEBUG) && !defined(_NDEBUG) #define _NDEBUG #endif //****************************************************************************** //***** Common Info-ZIP UnZip feature/configuration flags //****************************************************************************** // Windows CE environment allows support for UTC time stamps #ifndef USE_EF_UT_TIME #define USE_EF_UT_TIME #endif // NTFS extended attributes support is not available on Windows CE #ifndef NO_NTSD_EAS #define NO_NTSD_EAS #endif #ifdef NTSD_EAS #undef NTSD_EAS #endif #ifdef _WIN32_WCE // Windows CE does not provide the rename() function needed for UNIXBACKUP # ifndef NO_UNIXBACKUP # define NO_UNIXBACKUP # endif # ifdef UNIXBACKUP # undef UNIXBACKUP # endif #endif #if (!defined(NO_UNICODE_SUPPORT) && !defined(UNICODE_SUPPORT)) #define UNICODE_SUPPORT #endif #if (defined(UNICODE_SUPPORT) && !defined(UNICODE_WCHAR)) #define UNICODE_WCHAR /* wchar_t is UTF-16 encoded on WinCE */ #endif #ifdef UTF8_MAYBE_NATIVE #undef UTF8_MAYBE_NATIVE /* UTF-8 cannot be system charset on WinCE */ #endif #ifdef POCKET_UNZIP // The PUnZip GUI interface does not make use of ZipInfeλ UNZIP.BCKX([UNZIP60.WINCE]WCECFG.H;1IPCLI.VAX_DECC_OLB;1o style archive // listings. // For the command-line tool, it may be considered to disable ZipInfo, too, // to save memory and resources. # ifndef NO_ZIPINFO # define NO_ZIPINFO # endif #endif #ifndef POCKET_UNZIP // CE does not support exception handling model # define NO_EXCEPT_SIGNALS # define MAIN main_stub #endif //****************************************************************************** //***** Global defines, constants, and macros //****************************************************************************** #if (defined(_MSC_VER) && !defined(MSC)) #define MSC #endif #ifndef PATH_MAX #define PATH_MAX _MAX_PATH #endif // WinCE uses ISO 8859-1 as codepage for 8-bit chars #define CRTL_CP_IS_ISO // The functionality of ISO <--> OEM conversion IS needed on WinCE, too!! // (Otherwise, extended ASCII filenames and passwords in archives coming // from other platforms may not be handled properly.) // Since WinCE does not supply ISO <--> OEM conversion, we try to fall // back to the hardcoded tables in the generic UnZip code. #define ASCII2OEM(c) (((c) & 0x80) ? iso2oem[(c) & 0x7f] : (c)) #if !defined(IZ_ISO2OEM_ARRAY) # define IZ_ISO2OEM_ARRAY #endif #if !defined(CRYP_USES_ISO2OEM) # define CRYP_USES_ISO2OEM #endif #define OEM_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} #define INTERN_TO_ISO(src, dst) {if ((src) != (dst)) strcpy((dst), (src));} #define INTERN_TO_OEM(src, dst) {register uch c;\ register uch *dstp = (uch *)(dst), *srcp = (uch *)(src);\ do {\ c = (uch)foreign(*srcp++);\ *dstp++ = (uch)ASCII2OEM(c);\ } while (c != '\0');} #if defined(UNICODE) # define MBSTOTSTR mbstowcs # define TSTRTOMBS wcstombs #else # define MBSTOTSTR strncpy # define TSTRTOMBS strncpy #endif #if (defined(_MBCS) && !defined(_WIN32_WCE)) /* MSC-specific version, _mbsinc() may not be available for other systems */ # define CLEN(ptr) _mbclen((const UCHAR *)(ptr)) # define PREINCSTR(ptr) (ptr = (char *)_mbsinc((const UCHAR *)(ptr))) # define MBSCHR(str, c) (char *)_mbschr((const UCHAR *)(str), (c)) # define MBSRCHR(str, c) (char *)_mbsrchr((const UCHAR *)(str), (c)) #endif /* Up to now, all versions of Microsoft C runtime libraries lack the support * for customized (non-US) switching rules between daylight saving time and * standard time in the TZ environment variable string. * But non-US timezone rules are correctly supported when timezone information * is read from the OS system settings in the Win32 registry. * The following work-around deletes any TZ environment setting from * the process environment. This results in a fallback of the RTL time * handling code to the (correctly interpretable) OS system settings, read * from the registry. */ #ifdef USE_EF_UT_TIME # if (defined(_WIN32_WCE) || defined(W32_USE_IZ_TIMEZONE)) # define iz_w32_prepareTZenv() # else # define iz_w32_prepareTZenv() putenv("TZ=") # endif #endif #ifdef DIR_END #undef DIR_END #define DIR_END '\\' // ZipInfo with VC++ 4.0 requires this #endif // We are defining a few new error types for our code. #define PK_EXCEPTION 500 #define PK_ABORTED 501 #ifndef DATE_FORMAT #define DATE_FORMAT DF_MDY #endif #if ((_WIN32_WCE >= 211) && !defined(POCKET_UNZIP)) # ifndef USE_FWRITE # define USE_FWRITE # endif #endif #define lenEOL 2 #define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} #define countof(a) (sizeof(a)/sizeof(*(a))) // The max number of retries (not including the first attempt) for entering // a password for and encrypted file before giving up on that file. #define MAX_PASSWORD_RETRIES 2 #ifdef POCKET_UNZIP // Variables that we want to add to our Globals struct. #define SYSTEM_SPECIFIC_GLOBALS \ char matchname[FILNAMSIZ]; \ int notfirstcall; \ char *zipfnPtr; \ char *wildzipfnPtr; #else /* !POCKET_UNZIP */ /* Static variables that we have to add to Uz_Globs: */ #define SYSTEM_SPECIFIC_GLOBALS \ char rootpath[_MAX_PATH];\ char *wildname, *matchname;\ int rootlen, notfirstcall; /* This replacement for C-RTL-supplied getch() (or similar) functionality * avoids leaving unabsorbed LFs in the keyboard buffer under Windows95, * and supports the +[0] feature. */ int getch_win32 OF((void)); #endif /* ?POCKET_UNZIP */ //****************************************************************************** //***** Global headers //****************************************************************************** #include #ifndef TIME_ZONE_ID_INVALID # define TIME_ZONE_ID_INVALID (DWORD)0xFFFFFFFFL #endif #include #include #if defined(_MBCS) && !defined(_WIN32_WCE) #include #endif #include #ifndef Cdecl #define Cdecl __cdecl #endif #include "wince/wince.h" // Our WinCE specific code and our debug function. #ifdef POCKET_UNZIP #include "wince/resource.h" // Our resource constants #include "wince/punzip.rcv" // Our version information. #endif #ifndef _WIN32_WCE /* native Windows CE does not support 64-bit filesizes */ /* 64-bit-Integers & Large File Support * * If this is set it is assumed that the port * supports 64-bit file calls. The types are * defined here. Any local implementations are * in w32i64.c and the protypes for the calls are * in unzip.h. Note that a port must support * these calls fully or should not set * LARGE_FILE_SUPPORT. */ /* Automatically set ZIP64_SUPPORT if supported */ #ifndef NO_ZIP64_SUPPORT # ifndef ZIP64_SUPPORT # if defined(_MSC_VER) # define ZIP64_SUPPORT # endif # endif #endif #ifdef ZIP64_SUPPORT /* base type for file offsets and file sizes */ # if (defined(__GNUC__) || defined(ULONG_LONG_MAX)) typedef long long zoff_t; # else /* all other compilers use this as intrinsic 64-bit type */ typedef __int64 zoff_t; # endif # define ZOFF_T_DEFINED /* user-defined types and format strings for 64-bit numbers and * file pointer functions (these depend on the rtl library and library * headers used; they are NOT compiler-specific) */ # if defined(_MSC_VER) /* MS C and VC */ /* these systems use the Microsoft C RTL */ /* 64-bit stat struct */ typedef struct _stati64 z_stat; # define Z_STAT_DEFINED /* printf format size prefix for zoff_t values */ # define FZOFFT_FMT "I64" # define FZOFFT_HEX_WID_VALUE "16" # endif #endif /* If port has LARGE_FILE_SUPPORT then define here to make automatic unless overridden */ #ifndef LARGE_FILE_SUPPORT # ifndef NO_LARGE_FILE_SUPPORT # if defined(_MSC_VER) # define LARGE_FILE_SUPPORT # endif # endif #endif #endif /* !_WIN32_WCE */ #endif /* !__w32cfg_h */ *[UNZIP60.WINCE]WCEMAIN.C;1+,g4. / 4 1@-0123KPWO 56Re7Re89GHJf UNZIP.BCKg4[UNZIP60.WINCE]WCEMAIN.C;1PCLI.VAX_VAXC_OLB;1 /* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- wcemain.c ---------------------------------------------------------------------------*/ #define __WCEMAIN_C /* identifies this source module */ #define UNZIP_INTERNAL #include "unzip.h" /* includes, typedefs, macros, prototypes, etc. */ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { int r; int i; LPTSTR argArray[10]; int argBuffSize = lstrlen(lpCmdLine) + 1; void* argBuff = malloc(argBuffSize); char* argv[10]; /* Parse the command line into an argument array */ int argc = 0; LPTSTR argPtr = lpCmdLine; LPTSTR nextParam = NULL; LPTSTR closingQuote = NULL; unsigned short* endOfCmdLine = lpCmdLine + lstrlen(lpCmdLine); TCHAR Blank = _T(' '); /* Init the arrays */ for (i = 0; i < 10;i++) argArray[i]; for (i = 0;i < 10;i++) argv[i] = NULL; /* Create the argument array, we have to convert this from wchar * (unicode) to mbcs (single byte ascii) */ while(argPtr != NULL) { /* Look for the first non-blank character */ while((memcmp(argPtr, &Blank, sizeof(TCHAR)) == 0) && (argPtr < endOfCmdLine)) { argPtr++; } /* Check for quote enclosed strings for extended file names. */ if (argPtr[0] == _T('"') && /* Look for closing quote */ (closingQuote = _tcschr(argPtr + 1, _T('"'))) != NULL) { /* Clear the enclosing quotes */ *argPtr++ = _T('\0'); *closingQuote = _T('\0'); nextParam = closingQuote + 1; } else { nextParam = argPtr; } /* Set the parameter */ argArray[argc] = argPtr; argc++; /* Look for the next blank */ argPtr = _tcschr(nextParam, _T(' ')); if (argPtr != NULL) { /* Terminate the parameter and point after the blank to the keyword */ *argPtr++ = _T('\0'); } } /* Add one to the arg count for null terminator. */ argc++; #ifndef UNICODE /* No need to convert the parameters */ argv = (char*)argArray; #else /* Unicode so we need to convert the parameters to ascii. */ /* Get the storage we need to hold the converted data */ if (argBuff != NULL) { int i; char* ptrArgBuff; /* Clear the asci argument buffer */ memset(argBuff,'\0',argBuffSize); /* Command line parameters give ? */ if (argBuffSize == 0) { /* No so just set the first argumen in the array to * the buffer */ argv[0] = argBuff; } else { argv[0] = (char*)_T("UnzipCE.exe"); /* We have some storage build an asci version of * the command parameters */ ptrArgBuff = (char*)argBuff; for(i = 0; i < (argc - 1); i++) { /* convert the data */ int paramLength = lstrlen(argArray[i]); int bytesWritten = WideCharToMultiByte(CP_ACP, 0, argArray[i], paramLength, ptrArgBuff, paramLength, NULL, NULL); if (bytesWritten == 0) { /* Conversion failed ser return value and exit loop */ r = (int)GetLastError(); break; } else { argv[i + 1] = ptrArgBuff; /* Point to the next area of the buffer */ ptrArgBuff = ptrArgBuff + bytesWritten + 1; } } } } #endif /* UNICODE */ return MAIN(argc, argv); } *[UNZIP60.WINCE]WINCE.CPP;1+,oj.8/ 488@-0123KPWO956J@7J@89GHJ /* Copyright (c) 1990-2003 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ //****************************************************************************** // // File: WINCE.CPP // // Description: This file implements all the Win32 APIs and C runtime functions // that the Info-ZIP code calls, but are not implemented natively // on Windows CE. // // Copyright: All the source files for Pocket UnZip, except for components // written by the Info-ZIP group, are copyrighted 1997 by Steve P. // Miller. The product "Pocket UnZip" itself is property of the // author and cannot be altered in any way without written consent // from Steve P. Miller. // // Disclaimer: All project files are provided "as is" with no guarantee of // their correctness. The authors are not liable for any outcome // that is the result of using this source. The source for Pocket // UnZip has been placed in the public domain to help provide an // understanding of its implementation. You are hereby granted // full permission to use this source in any way you wish, except // to alter Pocket UnZip itself. For comments, suggestions, and // bug reports, please write to stevemil@pobox.com. // // Functions: DebugOut // chmod // close // isatty // lseek // open // read // setmode // unlink // fflush // fgets // fileno // fopen // fprintf // fclose // putc // sprintf // _stricmp // _strupr // strrchr (non-_MBCS only) // isupper // stat // localtime // // Internal helper functions: // SafeGetTimeZoneInformation // GetTransitionTimeT // IsDST // // // Date Name History // -------- ------------ ----------------------------------------------------- // 02/01/97 Steve Miller Created (Version 1.0 using Info-ZIP UnZip 5.30) // //************************************gwb UNZIP.BCKoj[UNZIP60.WINCE]WINCE.CPP;1PCLI.VAX_VAXC_OLB;18****************************************** extern "C" { #define __WINCE_CPP #define UNZIP_INTERNAL #include "unzip.h" } #include // Must be outside of extern "C" block //****************************************************************************** //***** For all platforms - Our debug output function //****************************************************************************** #ifdef DEBUG // RETAIL version is __inline and does not generate any code. void DebugOut(LPCTSTR szFormat, ...) { TCHAR szBuffer[512] = TEXT("PUNZIP: "); va_list pArgs; va_start(pArgs, szFormat); _vsntprintf(szBuffer + 8, countof(szBuffer) - 10, szFormat, pArgs); va_end(pArgs); TCHAR *psz = szBuffer; while (psz = _tcschr(psz, TEXT('\n'))) { *psz = TEXT('|'); } psz = szBuffer; while (psz = _tcschr(psz, TEXT('\r'))) { *psz = TEXT('|'); } _tcscat(szBuffer, TEXT("\r\n")); OutputDebugString(szBuffer); } #endif // DEBUG //****************************************************************************** //***** Windows CE Native //****************************************************************************** #if defined(_WIN32_WCE) //****************************************************************************** //***** Local Function Prototyopes //****************************************************************************** static void SafeGetTimeZoneInformation(TIME_ZONE_INFORMATION *ptzi); static time_t GetTransitionTimeT(TIME_ZONE_INFORMATION *ptzi, int year, BOOL fStartDST); static BOOL IsDST(TIME_ZONE_INFORMATION *ptzi, time_t localTime); //****************************************************************************** //***** IO.H functions //****************************************************************************** //-- Called from fileio.c int __cdecl chmod(const char *filename, int pmode) { // Called before unlink() to delete read-only files. DWORD dwAttribs = (pmode & _S_IWRITE) ? FILE_ATTRIBUTE_NORMAL : FILE_ATTRIBUTE_READONLY; TCHAR szPath[_MAX_PATH]; MBSTOTSTR(szPath, filename, countof(szPath)); return (SetFileAttributes(szPath, dwAttribs) ? 0 : -1); } //****************************************************************************** //-- Called from process.c int __cdecl close(int handle) { return (CloseHandle((HANDLE)handle) ? 0 : -1); } //****************************************************************************** //-- Called from fileio.c int __cdecl isatty(int handle) { // returns TRUE if handle is a terminal, console, printer, or serial port // called with 1 (stdout) and 2 (stderr) return 0; } //****************************************************************************** //-- Called from extract.c, fileio.c, process.c long __cdecl lseek(int handle, long offset, int origin) { // SEEK_SET, SEEK_CUR, SEEK_END are equal to FILE_BEGIN, FILE_CURRENT, FILE_END return SetFilePointer((HANDLE)handle, offset, NULL, origin); } //****************************************************************************** //-- Called from fileio.c int __cdecl open(const char *filename, int oflags, ...) { // The Info-Zip code currently only opens existing ZIP files for read // using open(). DWORD dwAccess = 0; DWORD dwCreate = 0; switch (oflags & (_O_RDONLY | _O_WRONLY | _O_RDWR)) { case _O_RDONLY: dwAccess = GENERIC_READ; break; case _O_WRONLY: dwAccess = GENERIC_WRITE; break; case _O_RDWR: dwAccess = GENERIC_READ | GENERIC_WRITE; break; } switch (oflags & (O_CREAT | O_TRUNC)) { case _O_CREAT: dwCreate = OPEN_ALWAYS; break; case _O_CREAT | _O_TRUNC: dwCreate = CREATE_ALWAYS; break; default: dwCreate = OPEN_EXISTING; break; } TCHAR szPath[_MAX_PATH]; MBSTOTSTR(szPath, filename, countof(szPath)); HANDLE hFile = CreateFile(szPath, dwAccess, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwCreate, FILE_ATTRIBUTE_NORMAL, NULL); if ((hFile != INVALID_HANDLE_VALUE) && ((oflags & O_APPEND) == O_APPEND)) { SetFilePointer(hFile, 0, NULL, FILE_END); } return ((hFile == INVALID_HANDLE_VALUE) ? -1 : (int)hFile); } //****************************************************************************** //-- Called from extract.c, fileio.c, process.c int __cdecl read(int handle, void *buffer, unsigned int count) { DWORD dwRead = 0; return (ReadFile((HANDLE)handle, buffer, count, &dwRead, NULL) ? dwRead : -1); } #if _WIN32_WCE < 211 //****************************************************************************** //-- Called from extract.c int __cdecl setmode(int handle, int mode) { //TEXT/BINARY translation - currently always called with O_BINARY. return O_BINARY; } #endif //****************************************************************************** //-- Called from fileio.c int __cdecl unlink(const char *filename) { // Called to delete files before an extract overwrite. TCHAR szPath[_MAX_PATH]; MBSTOTSTR(szPath, filename, countof(szPath)); return (DeleteFile(szPath) ? 0: -1); } //****************************************************************************** //***** STDIO.H functions //****************************************************************************** #if _WIN32_WCE < 211 // Old versions of Win CE prior to 2.11 do not support stdio library functions. // We provide simplyfied replacements that are more or less copies of the // UNIX style low level I/O API functions. Only unbuffered I/O in binary mode // is supported. //-- Called from fileio.c int __cdecl fflush(FILE *stream) { return (FlushFileBuffers((HANDLE)stream) ? 0 : EOF); } //****************************************************************************** //-- Called from extract.c char * __cdecl fgets(char *string, int n, FILE *stream) { // stream always equals "stdin" and fgets() should never be called. DebugOut(TEXT("WARNING: fgets(0x%08X, %d, %08X) called."), string, n, stream); return NULL; } //****************************************************************************** //-- Called from extract.c int __cdecl fileno(FILE *stream) { return (int)stream; } //****************************************************************************** //-- Called from fileio.c FILE * __cdecl fopen(const char *filename, const char *mode) { // fopen() is used to create all extracted files. DWORD dwAccess = 0; DWORD dwCreate = 0; BOOL fAppend = FALSE; if (strstr(mode, "r+")) { dwAccess = GENERIC_READ | GENERIC_WRITE; dwCreate = OPEN_EXISTING; } else if (strstr(mode, "w+")) { dwAccess = GENERIC_READ | GENERIC_WRITE; dwCreate = CREATE_ALWAYS; } else if (strstr(mode, "a+")) { dwAccess = GENERIC_READ | GENERIC_WRITE; dwCreate = OPEN_ALWAYS; fAppend = TRUE; } else if (strstr(mode, "r")) { dwAccess = GENERIC_READ; dwCreate = OPEN_EXISTING; } else if (strstr(mode, "w")) { dwAccess = GENERIC_WRITE; dwCreate = CREATE_ALWAYS; } else if (strstr(mode, "a")) { dwAccess = GENERIC_WRITE; dwCreate = OPEN_ALWAYS; fAppend = TRUE; } TCHAR szPath[_MAX_PATH]; MBSTOTSTR(szPath, filename, countof(szPath)); HANDLE hFile = CreateFile(szPath, dwAccess, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwCreate, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { return NULL; } if (fAppend) { SetFilePointer(hFilht[ UNZIP.BCKoj[UNZIP60.WINCE]WINCE.CPP;1PCLI.VAX_VAXC_OLB;18e, 0, NULL, FILE_END); } return (FILE*)hFile; } //****************************************************************************** //-- Called from many sources when compiled for DEBUG int __cdecl fprintf(FILE *stream, const char *format, ...) { // All standard output/error in Info-ZIP is handled through fprintf() if ((stream == stdout) || (stream == stderr)) { return 1; } // "stream" always equals "stderr" or "stdout" - log error if we see otherwise. #ifdef UNICODE DebugOut(TEXT("WARNING: fprintf(0x%08X, \"%S\", ...) called."), stream, format); #else DebugOut(TEXT("WARNING: fprintf(0x%08X, \"%s\", ...) called."), stream, format); #endif return 0; } //****************************************************************************** //-- Called from fileio.c int __cdecl fclose(FILE *stream) { return (CloseHandle((HANDLE)stream) ? 0 : EOF); } //****************************************************************************** //-- Called from fileio.c int __cdecl putc(int c, FILE *stream) { DebugOut(TEXT("WARNING: putc(%d, 0x%08X) called."), c, stream); return 0; } //****************************************************************************** //-- Called from intrface.cpp, extract.c, fileio.c, list.c, process.c int __cdecl sprintf(char *buffer, const char *format, ...) { WCHAR wszBuffer[512], wszFormat[512]; MBSTOTSTR(wszFormat, format, countof(wszFormat)); BOOL fPercent = FALSE; for (WCHAR *pwsz = wszFormat; *pwsz; pwsz++) { if (*pwsz == L'%') { fPercent = !fPercent; } else if (fPercent && (((*pwsz >= L'a') && (*pwsz <= L'z')) || ((*pwsz >= L'A') && (*pwsz <= L'Z')))) { if (*pwsz == L's') { *pwsz = L'S'; } else if (*pwsz == L'S') { *pwsz = L's'; } fPercent = FALSE; } } va_list pArgs; va_start(pArgs, format); _vsntprintf(wszBuffer, countof(wszBuffer), wszFormat, pArgs); va_end(pArgs); TSTRTOMBS(buffer, wszBuffer, countof(wszBuffer)); return 0; } #endif /* _WIN32_WCE < 211 */ #ifndef POCKET_UNZIP //****************************************************************************** //-- Called from unzip.c void __cdecl perror(const char* errorText) { OutputDebugString((LPCTSTR)errorText); } #endif // !POCKET_UNZIP #ifdef USE_FWRITE //****************************************************************************** //-- Called from fileio.c void __cdecl setbuf(FILE *, char *) { // We are using fwrite and the call to setbuf was to set the stream // unbuffered which is the default behaviour, we have nothing to do. } #endif // USE_FWRITE //****************************************************************************** //***** STDLIB.H functions //****************************************************************************** #ifdef _MBCS int __cdecl mblen(const char *mbc, size_t mbszmax) { // very simple cooked-down version of mblen() without any error handling // (Windows CE does not support multibyte charsets with a maximum char // length > 2 bytes) return (IsDBCSLeadByte((BYTE)*mbc) ? 2 : 1); } #endif /* _MBCS */ //****************************************************************************** //***** STRING.H functions //****************************************************************************** //-- Called from winmain.cpp int __cdecl _stricmp(const char *string1, const char *string2) { while (*string1 && ((*string1 | 0x20) == (*string2 | 0x20))) { string1++; string2++; } return (*string1 - *string2); } //****************************************************************************** //-- Called from intrface.cpp and winmain.cpp char* __cdecl _strupr(char *string) { while (*string) { if ((*string >= 'a') && (*string <= 'z')) { *string -= 'a' - 'A'; } string++; } return string; } //****************************************************************************** //-- Called from fileio.c ("open_input_file()") char* __cdecl strerror(int errnum) { return "[errmsg not available]"; } #ifndef _MBCS //****************************************************************************** //-- Called from winmain.cpp char* __cdecl strrchr(const char *string, int c) { // Walk to end of string. for (char *p = (char*)string; *p; p++) { } // Walk backwards looking for character. for (p--; p >= string; p--) { if ((int)*p == c) { return p; } } return NULL; } #endif /* !_MBCS */ //****************************************************************************** //***** CTYPE.H functions //****************************************************************************** #if _WIN32_WCE < 300 int __cdecl isupper(int c) { return ((c >= 'A') && (c <= 'Z')); } #endif //****************************************************************************** //***** STAT.H functions //****************************************************************************** //-- Called fileio.c, process.c, intrface.cpp int __cdecl stat(const char *path, struct stat *buffer) { // stat() is called on both the ZIP files and extracted files. // Clear our stat buffer to be safe. ZeroMemory(buffer, sizeof(struct stat)); // Find the file/direcotry and fill in a WIN32_FIND_DATA structure. WIN32_FIND_DATA w32fd; ZeroMemory(&w32fd, sizeof(w32fd)); TCHAR szPath[_MAX_PATH]; MBSTOTSTR(szPath, path, countof(szPath)); HANDLE hFind = FindFirstFile(szPath, &w32fd); // Bail out now if we could not find the file/directory. if (hFind == INVALID_HANDLE_VALUE) { return -1; } // Close the find. FindClose(hFind); // Mode flags that are currently used: S_IWRITE, S_IFMT, S_IFDIR, S_IEXEC if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { buffer->st_mode = _S_IFDIR | _S_IREAD | _S_IEXEC; } else { buffer->st_mode = _S_IFREG | _S_IREAD; } if (!(w32fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) { buffer->st_mode |= _S_IWRITE; } // Store the file size. buffer->st_size = (_off_t)w32fd.nFileSizeLow; // Convert the modified FILETIME to a time_t and store it. DWORDLONG dwl = *(DWORDLONG*)&w32fd.ftLastWriteTime; buffer->st_mtime = (time_t)((dwl - (DWORDLONG)116444736000000000) / (DWORDLONG)10000000); return 0; } //****************************************************************************** //***** TIME.H functions //****************************************************************************** // Evaluates to TRUE if 'y' is a leap year, otherwise FALSE // #define IS_LEAP_YEAR(y) ((((y) % 4 == 0) && ((y) % 100 != 0)) || ((y) % 400 == 0)) // The macro below is a reduced version of the above macro. It is valid for // years between 1901 and 2099 which easily includes all years representable // by the current implementation of time_t. #define IS_LEAP_YEAR(y) (((y) & 3) == 0) #define BASE_DOW 4 // 1/1/1970 was a Thursday. #define SECONDS_IN_A_DAY (24L * 60L * 60L) // Number of seconds in one day. // Month to Year Day conversion array. int M2YD[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; // Month to Leap Year Day conversion array. int M2LYD[] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }; //****************************************************************************** //-- Called from list.c struct tm * __cdecl localtime(const time_t *timer) { // Return value for localtime(). Source currently never references // more than one "tm" at a time, so the single return structure is ok. static struciKhv UNZIP.BCKoj[UNZIP60.WINCE]WINCE.CPP;1PCLI.VAX_VAXC_OLB;18$t tm g_tm; ZeroMemory(&g_tm, sizeof(g_tm)); // Get our time zone information. TIME_ZONE_INFORMATION tzi; SafeGetTimeZoneInformation(&tzi); // Create a time_t that has been corrected for our time zone. time_t localTime = *timer - (tzi.Bias * 60L); // Decide if value is in Daylight Savings Time. if (g_tm.tm_isdst = (int)IsDST(&tzi, localTime)) { localTime -= tzi.DaylightBias * 60L; // usually 60 minutes } else { localTime -= tzi.StandardBias * 60L; // usually 0 minutes } // time_t is a 32-bit value for the seconds since January 1, 1970 // FILETIME is a 64-bit value for the number of 100-nanosecond intervals // since January 1, 1601 // Compute the FILETIME for the given local time. DWORDLONG dwl = ((DWORDLONG)116444736000000000 + ((DWORDLONG)localTime * (DWORDLONG)10000000)); FILETIME ft = *(FILETIME*)&dwl; // Convert the FILETIME to a SYSTEMTIME. SYSTEMTIME st; ZeroMemory(&st, sizeof(st)); FileTimeToSystemTime(&ft, &st); // Finish filling in our "tm" structure. g_tm.tm_sec = (int)st.wSecond; g_tm.tm_min = (int)st.wMinute; g_tm.tm_hour = (int)st.wHour; g_tm.tm_mday = (int)st.wDay; g_tm.tm_mon = (int)st.wMonth - 1; g_tm.tm_year = (int)st.wYear - 1900; return &g_tm; } //****************************************************************************** static void SafeGetTimeZoneInformation(TIME_ZONE_INFORMATION *ptzi) { ZeroMemory(ptzi, sizeof(TIME_ZONE_INFORMATION)); // Ask the OS for the standard/daylight rules for the current time zone. if ((GetTimeZoneInformation(ptzi) == 0xFFFFFFFF) || (ptzi->StandardDate.wMonth > 12) || (ptzi->DaylightDate.wMonth > 12)) { // If the OS fails us, we default to the United States' rules. ZeroMemory(ptzi, sizeof(TIME_ZONE_INFORMATION)); ptzi->StandardDate.wMonth = 10; // October ptzi->StandardDate.wDay = 5; // Last Sunday (DOW == 0) ptzi->StandardDate.wHour = 2; // At 2:00 AM ptzi->DaylightBias = -60; // One hour difference ptzi->DaylightDate.wMonth = 4; // April ptzi->DaylightDate.wDay = 1; // First Sunday (DOW == 0) ptzi->DaylightDate.wHour = 2; // At 2:00 AM } } //****************************************************************************** static time_t GetTransitionTimeT(TIME_ZONE_INFORMATION *ptzi, int year, BOOL fStartDST) { // We only handle years within the range that time_t supports. We need to // handle the very end of 1969 since the local time could be up to 13 hours // into the previous year. In this case, our code will actually return a // negative value, but it will be compared to another negative value and is // handled correctly. The same goes for the 13 hours past a the max time_t // value of 0x7FFFFFFF (in the year 2038). Again, these values are handled // correctly as well. if ((year < 1969) || (year > 2038)) { return (time_t)0; } SYSTEMTIME *pst = fStartDST ? &ptzi->DaylightDate : &ptzi->StandardDate; // WORD wYear Year (0000 == 0) // WORD wMonth Month (January == 1) // WORD wDayOfWeek Day of week (Sunday == 0) // WORD wDay Month day (1 - 31) // WORD wHour Hour (0 - 23) // WORD wMinute Minute (0 - 59) // WORD wSecond Second (0 - 59) // WORD wMilliseconds Milliseconds (0 - 999) // Compute the number of days since 1/1/1970 to the beginning of this year. long daysToYear = ((year - 1970) * 365) // Tally up previous years. + ((year - 1969) >> 2); // Add few extra for the leap years. // Compute the number of days since the beginning of this year to the // beginning of the month. We will add to this value to get the actual // year day. long yearDay = IS_LEAP_YEAR(year) ? M2LYD[pst->wMonth - 1] : M2YD [pst->wMonth - 1]; // Check for day-in-month format. if (pst->wYear == 0) { // Compute the week day for the first day of the month (Sunday == 0). long monthDOW = (daysToYear + yearDay + BASE_DOW) % 7; // Add the day offset of the transition day to the year day. if (monthDOW < pst->wDayOfWeek) { yearDay += (pst->wDayOfWeek - monthDOW) + (pst->wDay - 1) * 7; } else { yearDay += (pst->wDayOfWeek - monthDOW) + pst->wDay * 7; } // It is possible that we overshot the month, especially if pst->wDay // is 5 (which means the last instance of the day in the month). Check // if the year-day has exceeded the month and adjust accordingly. if ((pst->wDay == 5) && (yearDay >= (IS_LEAP_YEAR(year) ? M2LYD[pst->wMonth] : M2YD [pst->wMonth]))) { yearDay -= 7; } // If not day-in-month format, then we assume an absolute date. } else { // Simply add the month day to the current year day. yearDay += pst->wDay - 1; } // Tally up all our days, hours, minutes, and seconds since 1970. long seconds = ((SECONDS_IN_A_DAY * (daysToYear + yearDay)) + (3600L * (long)pst->wHour) + (60L * (long)pst->wMinute) + (long)pst->wSecond); // If we are checking for the end of DST, then we need to add the DST bias // since we are in DST when we chack this time stamp. if (!fStartDST) { seconds += ptzi->DaylightBias * 60L; } return (time_t)seconds; } //****************************************************************************** static BOOL IsDST(TIME_ZONE_INFORMATION *ptzi, time_t localTime) { // If either of the months is 0, then this usually means that the time zone // does not use DST. Unfortunately, Windows CE since it has a bug where it // never really fills in these fields with the correct values, so it appears // like we are never in DST. This is supposed to be fixed in future releases, // so hopefully this code will get some use then. if ((ptzi->StandardDate.wMonth == 0) || (ptzi->DaylightDate.wMonth == 0)) { return FALSE; } // time_t is a 32-bit value for the seconds since January 1, 1970 // FILETIME is a 64-bit value for the number of 100-nanosecond intervals // since January 1, 1601 // Compute the FILETIME for the given local time. DWORDLONG dwl = ((DWORDLONG)116444736000000000 + ((DWORDLONG)localTime * (DWORDLONG)10000000)); FILETIME ft = *(FILETIME*)&dwl; // Convert the FILETIME to a SYSTEMTIME. SYSTEMTIME st; ZeroMemory(&st, sizeof(st)); FileTimeToSystemTime(&ft, &st); // Get our start and end daylight savings times. time_t timeStart = GetTransitionTimeT(ptzi, (int)st.wYear, TRUE); time_t timeEnd = GetTransitionTimeT(ptzi, (int)st.wYear, FALSE); // Check what hemisphere we are in. if (timeStart < timeEnd) { // Northern hemisphere ordering. return ((localTime >= timeStart) && (localTime < timeEnd)); } else if (timeStart > timeEnd) { // Southern hemisphere ordering. return ((localTime < timeEnd) || (localTime >= timeStart)); } // If timeStart equals timeEnd then this time zone does not support DST. return FALSE; } #endif // _WIN32_WCE //****************************************************************************** //***** Functions to supply timezone information from the Windows registry to //***** Info-ZIP's private RTL "localtime() et al." replacements in timezone.c. //*******************************************************************j4BZ?s egud  co~rH%"<Z/'>xao+cy__!NJK\Z5)E'|[*=BJBc~RW|#][#&>\G]8LsrGci|OhP6j.`y\z^z]e23GtFDw$Aul G2_,/2+&& L9 c G'bkF+yu`6$XBXe'bWkP0~d) q0]T c`1U AX{UZkOsg:f8dbZj[&y*l$a=Ikq$s'"&344 nSz$P5MOyeRW7"dc]!:Q=4EP,)~ud $M8=D3#,UVx?i~sJ%Zo5_os "gsV"j`jQ^*2AJEPy.-(nfv1VIrlh c|KBi:Uy0V*yL)B]4D j2 ZT`]p0u %6)hf(1YuIu*Nn\Um,|>C]4fkSZZra7#>=ohLUkShC,Jk6u(j6c}}cX#;9|H,.=94m;@rf6ekkRVn(k/MrJ #6cV]}8HElnE,C<ZVZ}7-"&gJC#, %s$C/c;cv`d^z5JKg nMV?|m'ZrXF OBT1{}MV5ZTIOIW J.} zYxwukzyQDwe?6vDL|=m |J&4xIbhPxWEw[h G*-w,$`eP8x~9EZ8*`WaF2uSN<ph|G/oGO !:! 2c,imlAHU|.n.]CaMt70m9Lp7~!Qw`08 w./goc>&/7 9q`Wa nA2ja;F8RU[zT1s}Q~#Pry )$zaN)Zdg+ gj2H:^G1t/z!vB7 >Fu:d^&M;&K/-c~bX'}&3!`9?x$ m[:D/'_rH[?p o-'|e4oK[ &0[M[- hH4OcK V&J-96 v= BlL;`M>*.bVO0V1"3IN#h5'?hT j"BIkuDOy< yk Qq = (?=% MKSx^~Fm79{;5Vq&>.P~/oA]>rm$Km*Xb\VJ /Q+/}yzg'rZNr)fT*Q.bef1`'Ni@m?jRr$6d6?|+MOZ+%yfl\U9^/#cz;qft>8HJPyWDU7Lu>hj,:p\fI;qLkPGe^5]oT!!"m@=a4C#qLX?f~?pXV Dto@c3@ fND@+s- 0k[Y*0 a+$#C&$,b*pE 1+.O{Xe v(D(Y;+`?I{ZY^q!wlSQ&K#f\y}[|yZ3|lTasSnifWe8 @`2Rv7WRZ6UD \uQ=X4!X`Tch ojW`d;/YN hs 7/ET8aI.qb 9nsQ19~_d'Q}|2/P n>ST\IpU*`-=F YZ)W'- yg,gEMMVEUApcB^I:Y?"{iy 6|!3z$>SU)\V=\u$uw>LY&>$_% xq [ZiO4m _]Zh:_ VpH({f)%Y2\-Mh8j4V&_#=LyV^ C'po|"`s;AaMqJdTVArD=\k4jYmTVEKU 1Q5sl 0.@zkp,+=eK=m;F]% s&Lbi4ED3X>vbq%mi(3X@f-r m5Q Hl*8yo*g|hT,$;H +jC}ESg87a7"vua5 E(Z&w$F/@m M{ c)lF+0{>[CvIc R,e "GXnHLal- "yG{6^'C{ ;?9'84JW6ChoieQoi bz~ 8&*%*JAeBiKm$!T/ 4+ _!I{I%h;^D,WK!m5<4DPHEN( 2tMhb2c|VwCWfIa>Y"wGT*5phNakK{t]G[""] hlbxbh#:Z6]U'- Il / < VR(] g-{jOu2 ;* {]7}~o(W(~v|O..0w?b>+=(bjSPL^+< ^|pqngEP(_);:k4\,$}xLsIzsCh:_J9crbgW] W2 ~+H5>>IJSR;t[F6oV3;&!UB) H:t}*<+Y9[xMCvPb[|DxjTqov7/d>e LU$8! `7y|-7W :}(~y(kj1--J_\[:A`iEU?unk9jF<j QSw{uAK-mgkg(!/F)OPo>5\9T&E5/^?HV[Kfl6CIno8"~0#ur1=hs)qw?i  l Yd3g'0 VG|Hj GWh"{_e!D&wUB 'ryC5dr 'U\g]Oo0eTR$S 3?eZ9AgJ(aa}^x%5h%kgMe_o~ kR$CwdS$)|.F ";5>=Tu&u"W@9/y8ZWdfJO/QS ?f*oojd"ohX` 8=;&* dXvgB)@sA~FdwB6O6L+^R }B_r\,"x#K.Ny;nFY`cLEY-y}ybD!Z'Q+-Vqe =Frq4pbb\h }v g/5 ,G%vc,zR[X0Igm ~%IPG(vQ#}XU WGX2~ 9p|248$ 3#(x)xafQ[YXM)%a9wI![ezf p^Ucl* e$\uh]L[Q]#:GTZkIBH o6xRcuwtX o1iL(aU#cD;>RSdgode}X e0<"ZO4K]+"7$:A e.E -J$qv,"uEPo$$QP!nLL:aQ*26q/[Vb?sny yzV|B~R~)^"2*2rf>s[ l[/s~C/u2,YTX[T h`7m8lSzZv,vM/ai%ier3EMpQE`zR-Roh `#RpI&]O}9qpR#_7U<\d&h0u,RcgYzZ-264 3`:@3b[8$v D*P&$c# 89OL`b$Z+;g"Zf39a PG!6 \dow*8-.]_=,4}t N"}Z>! ^1v\z'I}Y1Wd=06$z\E mPl OVv3ucKM<iWe"@j=au5y3OIC^+VkS n0L oU\F%\'. B"s)`~HrP7ue2\_EV}R5qUinWns#`^ |G(YV:am<`cN 5m[4:QQ@fgU;:g+C'>qmq$Eg): M0Ahj4?M^\ 4=9_Yt,GF< r" ? gFN;.&(QnJ _ ->CpYdT!5f["rbD mT [T+z'b%+lh=#k9o?~dxO bH1'yWlH@7}k< V7UBcV 6>^j#ITx6$IGPE^N+JqMK!{I3+ 8rdlK{~md5\<oc;=IVD@_j%-Y?%S&2~<+3 4K,n3023,AI(Xh{IAC|4[exi ^Tdv w!qKFZqL M("OP3Js:(p #97#*Fn6 Krbf_+Mu_ &!8} 0&ND/N;KFXXnlkwnjF7CCB=[}M o?"l&Mt`[yh%-09_7UtI`7VZbotAnLj$NF.2w~~=G\c/_*g 8cL_Oh@*"W}$O Z!d37Z9Nv3"4kTuV0Y'I~I`V}&KWs PRFR\?'u%"\?#2.Bt4g'^yP=Iv9y9~[*']dAHp,T> :^L/&OkR0/^IJ D0ZdN7F xO)E52Xul?Z4_QY ]%?S~T@L?HChRHO8h VPf`a%gYH.Wh? ]Fp?5bYU >YI'D[*2CNQee35",_ ".D5%M?1% !l'"iM7 dWrX29p/"|| ^Z*q5lFpkKP&6nJG7C^5%H`{Lr^X[J(em9*)OD\@KB'JTjR7TV># 5Prlo;COD]+%|NDn0!+4SJ fDL]u8SQL) kp(ksO%&7e( o M/s]GQ_D0_*fP*#.fz6Uh)3*EAp0FP7XN{vx7+" cHN j=\VG%>j*#~#_oSQH9 n;HPL!4-MZyQ&.,sOncq+,nJ'a0:n*+IIoPE~Hk2.HuDw 1Egkq6Q$BiO[J~74W Z3LQMc >%uWMHVf~HB{v)3|b,MA^W byG@')\V.fHu/] 3 ,7B[Bb)TD<p=%{j ] w&u\gP'=FU2g(?* P*D[tZv1HWAfLNKQ$( ,~oBHd*Wm N# "Xz}dts .A;tr@ \w 4;mlZBa47rB9: 'GYW">pRh6['cN:} w*o#*8UBH- IKY1r7J>JFYeS8jxP[&)@WcM}u m*afZ8Lk_i( 0n)&~ sya)_ ~,PB23d2yYsE2 }NI 97 tnuk.p$?unB&wmU`~(zSv9kas*~_g`'YgX"ZJ|*f$?F|-Q=)_4 L'37\d4OCUg ZJ"|sDJO|KG <.eX u$XP5Fk)Kd0#B+/s4gdR:}QU {P->sm"y),5P 65\ $_`;@?wcdyM+HRXX{e+4;OU7XK"1xz:>[H3HSH(=}STg5c-[G5]>[ZH]qrkegJh} Ai+L6.y4JZvi |(/c*~.F_ 4z",A/BJ9yZzkyK>/D8h~n)~XtELo 2[*g$ /N/8u$p. 3Ad}c 'Olhiy+KwTr@d 8[1@BYDz2=7B6e5PL.W KW{?:10/F EQTm CIo\g" '`5R={zOd81g66N5|9X=L8n9 ?s0|wfsmo(m sE4+^o#$ {)ul a!i0UTc,i/-s)|t]:-[y`2K7x&3'qQ)3&`UmHx:lys ~5#_\1r 1\!vU/,+2G9!JWx7v*j#-LNNC uG_&E-0'5K wpT>["K}9H7\8GO\a8"]P[M90<s+'3]#~iVYMqCC!4-}FfJA"\ Him&8'9d^>8Od0JTz7$.s0[[d`ivl0g\e~lnk0Hb!VEw'u~ +Oq ~ 2rO3u4p'P</5)'sR1kr%[c;DU'|P(@VHY H7qJ_6wM~Qhj!Vbn`yxKznc\`@5l,qPYe D6ze$^RLk"i'dX$QJEjdRgHJjH|N2v/K5yhlB)&n t= {@O%4%SGV9xace does not make use of ZipInfk7, UNZIP.BCKoj[UNZIP60.WINCE]WINCE.CPP;1PCLI.VAX_VAXC_OLB;186o 3*********** //****************************************************************************** // Copied from win32.c #ifdef W32_USE_IZ_TIMEZONE #include "timezone.h" #define SECSPERMIN 60 #define MINSPERHOUR 60 #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) static void conv_to_rule(LPSYSTEMTIME lpw32tm, struct rule * ZCONST ptrule); static void conv_to_rule(LPSYSTEMTIME lpw32tm, struct rule * ZCONST ptrule) { if (lpw32tm->wYear != 0) { ptrule->r_type = JULIAN_DAY; ptrule->r_day = ydays[lpw32tm->wMonth - 1] + lpw32tm->wDay; } else { ptrule->r_type = MONTH_NTH_DAY_OF_WEEK; ptrule->r_mon = lpw32tm->wMonth; ptrule->r_day = lpw32tm->wDayOfWeek; ptrule->r_week = lpw32tm->wDay; } ptrule->r_time = (long)lpw32tm->wHour * SECSPERHOUR + (long)(lpw32tm->wMinute * SECSPERMIN) + (long)lpw32tm->wSecond; } int GetPlatformLocalTimezone(register struct state * ZCONST sp, void (*fill_tzstate_from_rules)(struct state * ZCONST sp_res, ZCONST struct rule * ZCONST start, ZCONST struct rule * ZCONST end)) { TIME_ZONE_INFORMATION tzinfo; DWORD res; /* read current timezone settings from registry if TZ envvar missing */ res = GetTimeZoneInformation(&tzinfo); if (res != TIME_ZONE_ID_INVALID) { struct rule startrule, stoprule; conv_to_rule(&(tzinfo.StandardDate), &stoprule); conv_to_rule(&(tzinfo.DaylightDate), &startrule); sp->timecnt = 0; sp->ttis[0].tt_abbrind = 0; if ((sp->charcnt = WideCharToMultiByte(CP_ACP, 0, tzinfo.StandardName, -1, sp->chars, sizeof(sp->chars), NULL, NULL)) == 0) sp->chars[sp->charcnt++] = '\0'; sp->ttis[1].tt_abbrind = sp->charcnt; sp->charcnt += WideCharToMultiByte(CP_ACP, 0, tzinfo.DaylightName, -1, sp->chars + sp->charcnt, sizeof(sp->chars) - sp->charcnt, NULL, NULL); if ((sp->charcnt - sp->ttis[1].tt_abbrind) == 0) sp->chars[sp->charcnt++] = '\0'; sp->ttis[0].tt_gmtoff = - (tzinfo.Bias + tzinfo.StandardBias) * MINSPERHOUR; sp->ttis[1].tt_gmtoff = - (tzinfo.Bias + tzinfo.DaylightBias) * MINSPERHOUR; sp->ttis[0].tt_isdst = 0; sp->ttis[1].tt_isdst = 1; sp->typecnt = (startrule.r_mon == 0 && stoprule.r_mon == 0) ? 1 : 2; if (sp->typecnt > 1) (*fill_tzstate_from_rules)(sp, &startrule, &stoprule); return TRUE; } return FALSE; } #endif /* W32_USE_IZ_TIMEZONE */ *[UNZIP60.WINCE]WINCE.H;1+,u./ 4@-0123KPWO56^ye7^ye89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ //****************************************************************************** // // File: WINCE.H // // Description: This file declares all the Win32 APIs and C runtime functions // that the Info-ZIP code calls, but are not implemented natively // on Windows CE. See WINCE.CPP for the implementation. // // Copyright: All the source files for Pocket UnZip, except for components // written by the Info-ZIP group, are copyrighted 1997 by Steve P. // Miller. The product "Pocket UnZip" itself is property of the // author and cannot be altered in any way without written consent // from Steve P. Miller. // // Disclaimer: All project files are provided "as is" with no guarantee of // their correctness. The authors are not liable for any outcome // that is the result of using this source. The source for Pocket // UnZip has been placed in the public domain to help provide an // understanding of its implementation. You are hereby granted // full permission to use this source in any way you wish, except // to alter Pocket UnZip itself. For comments, suggestions, and // bug reports, please write to stevemil@pobox.com. // // // Date Name History // -------- ------------ ----------------------------------------------------- // 02/01/97 Steve Miller Created (Version 1.0 using Info-ZIP UnZip 5.30) // //****************************************************************************** #ifndef __WINCE_H__ #define __WINCE_H__ #ifdef __cplusplus extern "C" { #endif //****************************************************************************** //***** For all platforms - Our debug output function //****************************************************************************** // If we are building for debug, we implement the DebugOut() function. If we are // building for release, then we turn all calls to DebugOut() into no-ops. The // Microsoft compiler (and hopefully others) will not generate any code at all // for the retail version of DebugOut() defined here. This works much better // than trying to create a variable argument macro - something C/C++ does not // support cleanly. #ifdef DEBUG void DebugOut(LPCTSTR szFormat, ...); #else __inline void DebugOut(LPCTSTR szFormat, ...) {} #endif //****************************************************************************** //***** Windows NT Native //****************************************************************************** #if !defined(_WIN32_WCE) #ifndef UNICODE #include #endif #include #include #include #include #endif //****************************************************************************** //***** Windows CE Native //****************************************************************************** #if defined(_WIN32_WCE) #if defined(__WINCE_CPP) // internal, suppress "import linkage" specifier # define ZCRTIMP #else // do not use import linkage specifier either; symbols are provided locally # define ZCRTIMP #endif #ifndef ZeroMemory #define ZeroMemory(Destination,Length) memset(Destination, 0, Length) #endif #ifdef _MBCS // WinCE C RTL does not provide the setlocale function # define setlocale(category, locale) #endif // A few forgotten defines in Windows CE's TCHAR.H #ifndef _stprintf #define _stprintf wsprintf #endif #if _WIN32_WCE < 211 //sr551b functions in stdlib CE300 #ifndef _vsntprintf #define _vsntprintf(d,c,f,a) wvsprintf(d,f,a) #endif #ifndef _vsnwprintf #define _vsnwprintf(d,c,f,a) wvsprintf(d,f,a) #endif #endif //end sr551b //***********************lR UNZIP.BCKu[UNZIP60.WINCE]WINCE.H;1ZIPCLI.VAX_VAXC_OLB;1 ******************************************************* //***** SYS\TYPES.H functions //****************************************************************************** #ifndef _OFF_T_DEFINED typedef long _off_t; #define _OFF_T_DEFINED #endif #ifndef _TIME_T_DEFINED typedef long time_t; #define _TIME_T_DEFINED #endif //****************************************************************************** //***** CTYPE.H functions //****************************************************************************** #if _WIN32_WCE < 300 ZCRTIMP int __cdecl isupper(int); #endif _CRTIMP int __cdecl tolower(int); // This is a coarse approximation to ASCII isalpha(), it returns TRUE not only // on all ASCII letters but also on punctuation chars in the range of 0x40-0x7F #ifndef isalpha #define isalpha(c) (((c) & 0xC0) == 0xC0) #endif //****************************************************************************** //***** FCNTL.H functions //****************************************************************************** #ifndef _O_RDONLY // do not redefine existing FCNTL.H constants #define _O_RDONLY 0x0000 // open for reading only #define _O_WRONLY 0x0001 // open for writing only #define _O_RDWR 0x0002 // open for reading and writing #define _O_APPEND 0x0008 // writes done at eof #define _O_CREAT 0x0100 // create and open file #define _O_TRUNC 0x0200 // open and truncate #define _O_EXCL 0x0400 // open only if file doesn't already exist //# define _O_TEXT 0x4000 // file mode is text (translated) #define _O_BINARY 0x8000 // file mode is binary (untranslated) #endif // _O_RDONLY (and alikes...) undefined #ifndef O_RDONLY // do not redefine existing FCNTL.H constants #define O_RDONLY _O_RDONLY #define O_WRONLY _O_WRONLY #define O_RDWR _O_RDWR #define O_APPEND _O_APPEND #define O_CREAT _O_CREAT #define O_TRUNC _O_TRUNC #define O_EXCL _O_EXCL #define O_TEXT _O_TEXT #define O_BINARY _O_BINARY //#define O_RAW _O_BINARY //#define O_TEMPORARY _O_TEMPORARY //#define O_NOINHERIT _O_NOINHERIT //#define O_SEQUENTIAL _O_SEQUENTIAL //#define O_RANDOM _O_RANDOM #endif // O_RDONLY (and other old-fashioned constants) undefined //****************************************************************************** //***** IO.H functions //****************************************************************************** ZCRTIMP int __cdecl chmod(const char *, int); ZCRTIMP int __cdecl close(int); ZCRTIMP int __cdecl isatty(int); ZCRTIMP long __cdecl lseek(int, long, int); ZCRTIMP int __cdecl open(const char *, int, ...); ZCRTIMP int __cdecl read(int, void *, unsigned int); #if _WIN32_WCE < 211 ZCRTIMP int __cdecl setmode(int, int); #else # define setmode _setmode #endif ZCRTIMP int __cdecl unlink(const char *); //****************************************************************************** //***** STDIO.H functions //****************************************************************************** #if _WIN32_WCE < 211 //sr551b functions in stdlib CE300 //typedef struct _iobuf FILE; typedef int FILE; #define stdin ((int*)-2) #define stdout ((int*)-3) #define stderr ((int*)-4) #define EOF (-1) ZCRTIMP int __cdecl fflush(FILE *); ZCRTIMP char * __cdecl fgets(char *, int, FILE *); ZCRTIMP int __cdecl fileno(FILE *); ZCRTIMP FILE * __cdecl fopen(const char *, const char *); ZCRTIMP int __cdecl fprintf(FILE *, const char *, ...); ZCRTIMP int __cdecl fclose(FILE *); ZCRTIMP int __cdecl putc(int, FILE *); ZCRTIMP int __cdecl sprintf(char *, const char *, ...); #endif // _WIN32_WCE < 211 #if _WIN32_WCE >= 211 // CE falsely uses (FILE *) pointer args for UNIX style I/O functions that // normally expect numeric file handles (e.g. setmode()) # undef fileno # define fileno(strm) (strm) #endif // _WIN32_WCE < 211 #ifndef POCKET_UNZIP ZCRTIMP void __cdecl perror(const char* errorText); #endif #ifdef USE_FWRITE ZCRTIMP void __cdecl setbuf(FILE *, char *); #endif //****************************************************************************** //***** STDLIB.H functions //****************************************************************************** #ifdef _MBCS #ifndef MB_CUR_MAX # define MB_CUR_MAX 2 #endif ZCRTIMP int __cdecl mblen(const char *mbc, size_t mbszmax); #endif /* _MBCS */ #if _WIN32_WCE >= 211 # define errno ((int)GetLastError()) #endif #ifdef _WIN32_WCE_EMULATION // The emulation runtime library lacks a required element for setjmp/longjmp, // disable the recovery functionality for now. # undef setjmp # define setjmp(buf) 0 # undef longjmp # define longjmp(buf, rv) #endif //****************************************************************************** //***** STRING.H functions //****************************************************************************** ZCRTIMP int __cdecl _stricmp(const char *, const char *); ZCRTIMP char * __cdecl _strupr(char *); ZCRTIMP char * __cdecl strerror(int errnum); ZCRTIMP char * __cdecl strrchr(const char *, int); //****************************************************************************** //***** TIME.H functions //****************************************************************************** #ifndef _TM_DEFINED struct tm { int tm_sec; // seconds after the minute - [0,59] int tm_min; // minutes after the hour - [0,59] int tm_hour; // hours since midnight - [0,23] int tm_mday; // day of the month - [1,31] int tm_mon; // months since January - [0,11] int tm_year; // years since 1900 // int tm_wday; // days since Sunday - [0,6] // int tm_yday; // days since January 1 - [0,365] int tm_isdst; // daylight savings time flag }; #define _TM_DEFINED #endif ZCRTIMP struct tm * __cdecl localtime(const time_t *); // tzset is not supported on native WCE, define it as a NOP macro #ifndef tzset # define tzset() #endif //****************************************************************************** //***** SYS\STAT.H functions //****************************************************************************** struct stat { // _dev_t st_dev; // _ino_t st_ino; unsigned short st_mode; // short st_nlink; // short st_uid; // short st_gid; // _dev_t st_rdev; _off_t st_size; // time_t st_atime; time_t st_mtime; // time_t st_ctime; }; #define _S_IFMT 0170000 // file type mask #define _S_IFDIR 0040000 // directory //#define _S_IFCHR 0020000 // character special //#define _S_IFIFO 0010000 // pipe #define _S_IFREG 0100000 // regular #define _S_IREAD 0000400 // read permission, owner #define _S_IWRITE 0000200 // write permission, owner #define _S_IEXEC 0000100 // execute/search permission, owner #define S_IFMT _S_IFMT #define S_IFDIR _S_IFDIR //#define S_IFCHR _S_IFCHR //#define S_IFREG _S_IFREG #define S_IREAD _S_IREAD #define S_IWRITE _S_IWRITE #define S_IEXEC _S_IEXEC ZCRTIMP int __cdecl stat(const char *, struct stat *); //****************************************************************************** #endif // _WIN32_WCE #ifdef __cplusplus } // extern "C" #endif #endif // __WINCE_H__ *[UNZIP60.WINCE]WINMAIN.CPP;1+,w./ 4@-0123KPWO56 "?7 "?89GHJm{ UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1LI.VAX_VAXC_OLB;1w/* Copyright (c) 1990-2003 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ //****************************************************************************** // // File: WINMAIN.CPP // // Description: This module contains all the Windows specific code for Pocket // UnZip. It contains the entire user interface. This code knows // almost nothing about the Info-ZIP code. All Info-ZIP related // functions are wrapped by helper functions in INTRFACE.CPP. The // code in this module only calls those wrapper functions and // INTRFACE.CPP handles all the details and callbacks of the // Info-ZIP code. // // Copyright: All the source files for Pocket UnZip, except for components // written by the Info-ZIP group, are copyrighted 1997 by Steve P. // Miller. The product "Pocket UnZip" itself is property of the // author and cannot be altered in any way without written consent // from Steve P. Miller. // // Disclaimer: All project files are provided "as is" with no guarantee of // their correctness. The authors are not liable for any outcome // that is the result of using this source. The source for Pocket // UnZip has been placed in the public domain to help provide an // understanding of its implementation. You are hereby granted // full permission to use this source in any way you wish, except // to alter Pocket UnZip itself. For comments, suggestions, and // bug reports, please write to stevemil@pobox.com. // // Functions: WinMain // InitializeApplication // ShutdownApplication // RegisterUnzip // BuildImageList // WndProc // OnCreate // OnFileOpen // OnActionView // OnActionSelectAll // OnViewExpandedView // OnHelp // OnGetDispInfo // OnDeleteItem // OnItemChanged // Sort // CompareFunc // SetCaptionText // DrawBanner // AddDeleteColumns // ResizeColumns // GetZipErrorString // AddFileToListView // EnableAllMenuItems // CheckAllMenuItems // CenterWindow // AddTextToEdit // FormatValue // BuildAttributesString // BuildTypeString // GetFileFromPath // ForwardSlashesToBackSlashesA // ForwardSlashesToBackSlashesW // DeleteDirectory(LPTSTR szPath); // RegWriteKey // RegReadKey // WriteOptionString // WriteOptionInt // GetOptionString // GetOptionInt // DisableEditing // EditSubclassProc // GetMenuString // InitializeMRU // AddFileToMRU // RemoveFileFromMRU // ActivateMRU // ReadZipFileList // DlgProcProperties // MergeValues // CheckThreeStateBox // ExtractOrTestFiles // DlgProcExtractOrTest // FolderBrowser // DlgProcBrowser // SubclassSaveAsDlg // DlgProcExtractProgress // DlgProcViewProgress // UpdateProgress // PromptToReplace // DlgProcReplace // DlgProcPassword // DlgProcViewAssociation // DlgProcComment // DlgProcAbout // // // Date Name History // -------- ------------ ----------------------------------------------------- // 02/01/97 Steve Miller Created (Version 1.0 using Info-ZIP UnZip 5.30) // //****************************************************************************** extern "C" { #define __WINMAIN_CPP__ #define UNZIP_INTERNAL #include "unzip.h" #include "crypt.h" // Needed to pick up CRYPT define setting and return values. #include "unzvers.h" // Only needed by consts.h (VERSION_DATE & VersionDate) #include "consts.h" // Only include once - defines constant string messages. #include // Common controls - mainly ListView and ImageList #include // Common dialogs - OpenFile dialog #ifndef _WIN32_WCE #include // On NT, we use the SHBrowseForFolder() stuff. #include // CommandLineToArgvW() and ExtractIconEx() #endif #include "intrface.h" // Interface between Info-ZIP and us #include "winmain.h" // Us } #include // Must be outside of extern "C" block //****************************************************************************** //***** "Local" Global Variables //****************************************************************************** static LPCTSTR g_szAppName = TEXT("Pocket UnZip"); static LPCTSTR g_szClass = TEXT("PocketUnZip"); static LPCTSTR g_szRegKey = TEXT("Software\\Pocket UnZip"); static LPCTSTR g_szTempDir = NULL; static HWND g_hWndList = NULL; static HWND g_hWndCmdBar = NULL; static int g_cyCmdBar = 0; static HFONT g_hFontBanner = NULL; static HICON g_hIconMain = NULL; static WNDPROC g_wpSaveAsDlg = NULL; static WNDPROC g_wpEdit = NULL; static int g_sortColumn = -1; static BOOL g_fExpandedView = FALSE; static BOOL g_fLoading = FALSE; static BOOL g_fSkipped = FALSE; static BOOL g_fViewing = FALSE; static HWND g_hWndWaitFor = NULL; static FILE_TYPE_NODE *g_pftHead = NULL; #ifdef _WIN32_WCE static LPCTSTR g_szHelpFile = TEXT("\\windows\\punzip.htp"); #else static TCHAR g_szTempDirPath[_MAX_PATH]; static LPCTSTR g_szHelpFile = TEXT("punzip.html"); #endif static COLUMN g_columns[] = { { TEXT("Name"), LVCFMT_LEFT }, { TEXT("Size"), LVCFMT_RIGHT }, { TEXT("Type"), LVCFMT_LEFT }, { TEXT("Modified"), LVCFMT_LEFT }, { TEXT("Attributes"), LVCFMT_LEFT }, { TEXT("Compressed"), LVCFMT_RIGHT }, { TEXT("Ratio"), LVCFMT_RIGHT }, { TEXT("Method"), LVCFMT_LEFT }, { TEXT("CRC"), LVCFMT_LEFT }, { TEXT("Comment"), LVCFMT_LEFT } }; //****************************************************************************** //***** Local Function Prototypes //****************************************************************************** // Startup and Shutdown Functions void InitializeApplication(LPCTSTR szZipFile); void ShutdownApplication(); void RegisterUnzip(); void BuildImageList(); // Our Main Window's Message Handler LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // Event Handlers for our Main Window int OnCreate(); void OnFileOpen(); void OnActionView(); void OnActionSelectAll(); void OnViewExpandedView(); void OnHelp(); // Event Handlers for our List View void OnGetDispInfo(LV_DISPINFO *plvdi); void OnDeleteItem(NM_LISTVIEW *pnmlv); void OnItemChanged(NM_LISTVIEW *pnmlv); // List View Sort Functions void Sort(int sortColumn, BOOL fForcen9׿ UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1LI.VAX_VAXC_OLB;1); int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM sortColumn); // Helper/Utility Functions void SetCaptionText(LPCTSTR szPrefix); void DrawBanner(HDC hdc); void AddDeleteColumns(); void ResizeColumns(); LPCTSTR GetZipErrorString(int error); void AddFileToListView(FILE_NODE *pFile); void EnableAllMenuItems(UINT uMenuItem, BOOL fEnabled); void CheckAllMenuItems(UINT uMenuItem, BOOL fChecked); void CenterWindow(HWND hWnd); void AddTextToEdit(LPCSTR szText); LPTSTR FormatValue(LPTSTR szValue, zusz_t uzValue); LPTSTR BuildAttributesString(LPTSTR szBuffer, DWORD dwAttributes); LPCSTR BuildTypeString(FILE_NODE *pFile, LPSTR szType); LPCSTR GetFileFromPath(LPCSTR szPath); void ForwardSlashesToBackSlashesA(LPSTR szBuffer); #ifdef UNICODE void ForwardSlashesToBackSlashesW(LPWSTR szBuffer); # define ForwardSlashesToBackSlashes ForwardSlashesToBackSlashesW #else # define ForwardSlashesToBackSlashes ForwardSlashesToBackSlashesA #endif void DeleteDirectory(LPTSTR szPath); // Registry Functions void RegWriteKey(HKEY hKeyRoot, LPCTSTR szSubKey, LPCTSTR szValue); BOOL RegReadKey(HKEY hKeyRoot, LPCTSTR szSubKey, LPTSTR szValue, DWORD cBytes); void WriteOptionString(LPCTSTR szOption, LPCTSTR szValue); void WriteOptionInt(LPCTSTR szOption, DWORD dwValue); LPTSTR GetOptionString(LPCTSTR szOption, LPCTSTR szDefault, LPTSTR szValue, DWORD nSize); DWORD GetOptionInt(LPCTSTR szOption, DWORD dwDefault); // EDIT Control Subclass Functions void DisableEditing(HWND hWndEdit); LRESULT CALLBACK EditSubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // MRU Functions void InitializeMRU(); void AddFileToMRU(LPCSTR szFile); void RemoveFileFromMRU(LPCTSTR szFile); void ActivateMRU(UINT uIDItem); // Open Zip File Functions void ReadZipFileList(LPCTSTR wszPath); // Zip File Properties Dialog Functions BOOL CALLBACK DlgProcProperties(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void MergeValues(int *p1, int p2); void CheckThreeStateBox(HWND hDlg, int nIDButton, int state); // Extract/Test Dialog Functions void ExtractOrTestFiles(BOOL fExtract); BOOL CALLBACK DlgProcExtractOrTest(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); // Folder Browsing Dialog Functions BOOL FolderBrowser(LPTSTR szPath, DWORD dwLength); BOOL CALLBACK DlgProcBrowser(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void SubclassSaveAsDlg(); // Extraction/Test/View Progress Dialog Functions BOOL CALLBACK DlgProcExtractProgress(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK DlgProcViewProgress(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void UpdateProgress(EXTRACT_INFO *pei, BOOL fFull); // Replace File Dialog Functions int PromptToReplace(LPCSTR szPath); BOOL CALLBACK DlgProcReplace(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); // Password Dialog Functions BOOL CALLBACK DlgProcPassword(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); // View Association Dialog Functions BOOL CALLBACK DlgProcViewAssociation(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); // Comment Dialog Functions BOOL CALLBACK DlgProcComment(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); // About Dialog Functions BOOL CALLBACK DlgProcAbout(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); //****************************************************************************** //***** WinMain - Our one and only entry point //****************************************************************************** // Entrypoint is a tiny bit different on Windows CE - UNICODE command line. #ifdef _WIN32_WCE extern "C" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) #else extern "C" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) #endif { // Wrap the whole ball of wax in a big exception handler. __try { // Store global instance handle. g_hInst = hInstance; // Create our banner font. We need to do this before creating our window. // This font handle will be deleted in ShutdownApplication(). LOGFONT lf; ZeroMemory(&lf, sizeof(lf)); lf.lfHeight = 16; lf.lfWeight = FW_BOLD; lf.lfCharSet = ANSI_CHARSET; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS; _tcscpy(lf.lfFaceName, TEXT("MS Sans Serif")); g_hFontBanner = CreateFontIndirect(&lf); // Define the window class for our application's main window. WNDCLASS wc; ZeroMemory(&wc, sizeof(wc)); wc.lpszClassName = g_szClass; wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); TCHAR *szZipPath = NULL; #ifdef _WIN32_WCE // Get our main window's small icon. On Windows CE, we need to send ourself // a WM_SETICON in order for our task bar to update itself. g_hIconMain = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_UNZIP), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); wc.hIcon = g_hIconMain; // On Windows CE, we only need the WS_VISIBLE flag. DWORD dwStyle = WS_VISIBLE; // Get and store command line file (if any). if (lpCmdLine && *lpCmdLine) { szZipPath = lpCmdLine; } #else // On NT we add a cursor, icon, and menu to our application's window class. wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_UNZIP)); wc.lpszMenuName = MAKEINTRESOURCE(IDR_UNZIP); // On Windows NT, we use the standard overlapped window style. DWORD dwStyle = WS_OVERLAPPEDWINDOW; TCHAR szBuffer[_MAX_PATH]; // Get and store command line file (if any). if (lpCmdLine && *lpCmdLine) { MBSTOTSTR(szBuffer, lpCmdLine, countof(szBuffer)); szZipPath = szBuffer; } #endif // Register our window class with the OS. if (!RegisterClass(&wc)) { DebugOut(TEXT("RegisterClass() failed [%u]"), GetLastError()); } // Create our main window using our registered window class. g_hWndMain = CreateWindow(wc.lpszClassName, g_szAppName, dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // Quit now if we failed to create our main window. if (!g_hWndMain) { DebugOut(TEXT("CreateWindow() failed [%u]"), GetLastError()); ShutdownApplication(); return 0; } // Make sure our window is visible. Really only needed for NT. ShowWindow(g_hWndMain, nCmdShow); // Load our keyboard accelerator shortcuts. MSG msg; HACCEL hAccel = LoadAccelerators(g_hInst, MAKEINTRESOURCE(IDR_UNZIP)); DWORD dwPaintFlags = 0; // The message pump. Loop until we get a WM_QUIT message. while (GetMessage(&msg, NULL, 0, 0)) { // Check to see if this is an accelerator and handle it if neccessary. if (!TranslateAccelerator(g_hWndMain, hAccel, &msg)) { // If a normal message, then dispatch it to the correct window. TranslateMessage(&msg); DispatchMessage(&msg); // Wait until our application is up and visible before trying to // initialize some of our structures and load any command line file. if ((msg.message == WM_PAINTotL UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1LI.VAX_VAXC_OLB;1) && (dwPaintFlags != 0x11)) { if (msg.hwnd == g_hWndWaitFor) { dwPaintFlags |= 0x01; } else if (msg.hwnd == g_hWndList) { dwPaintFlags |= 0x10; } if (dwPaintFlags == 0x11) { InitializeApplication((szZipPath && *szZipPath) ? szZipPath : NULL); } } } } // Clean up code. ShutdownApplication(); // Nice clean finish - were out of here. return msg.wParam; } __except(EXCEPTION_EXECUTE_HANDLER) { // Something very bad happened. Try our best to appear somewhat graceful. MessageBox(NULL, TEXT("An internal error occurred. Possible causes are that you are ") TEXT("out of memory, a ZIP file (if one is loaded) contains an ") TEXT("unexpected error, or there is a bug in our program (that's why ") TEXT("it's free). Pocket UnZip cannot continue. It will exit now, ") TEXT("but you may restart it and try again.\n\n") TEXT("If the problem persists, please write to stevemil@pobox.com with ") TEXT("any information that might help track down the problem."), g_szAppName, MB_ICONERROR | MB_OK); } return 1; } //****************************************************************************** //***** Startup and Shutdown Functions //****************************************************************************** void InitializeApplication(LPCTSTR szZipFile) { // This function is called after our class is registered and all our windows // are created and visible to the user. // Show hour glass cursor. HCURSOR hCur = SetCursor(LoadCursor(NULL, IDC_WAIT)); // Register UnZip in the registry to handle ".ZIP" files. RegisterUnzip(); // Enumerate the system file assoications and build an image list. BuildImageList(); // Load our initial MRU into our menu. InitializeMRU(); // Restore/remove our cursor. SetCursor(hCur); // Clear our initialization window handle. g_hWndWaitFor = NULL; // Load our command line file if one was specified. Otherwise, just update // our banner to show that no file is loaded. if (szZipFile) { ReadZipFileList(szZipFile); } else { DrawBanner(NULL); } // Enable some controls. EnableAllMenuItems(IDM_FILE_OPEN, TRUE); EnableAllMenuItems(IDM_FILE_CLOSE, TRUE); EnableAllMenuItems(IDM_VIEW_EXPANDED_VIEW, TRUE); EnableAllMenuItems(IDM_HELP_ABOUT, TRUE); // Set our temporary directory. #ifdef _WIN32_WCE g_szTempDir = TEXT("\\Temporary Pocket UnZip Files"); #else g_szTempDir = TEXT("C:\\Temporary Pocket UnZip Files"); // Set the drive to be the same drive as the OS installation is on. if (GetWindowsDirectory(g_szTempDirPath, countof(g_szTempDirPath))) { lstrcpy(g_szTempDirPath + 3, TEXT("Temporary Pocket UnZip Files")); g_szTempDir = g_szTempDirPath; } #endif } //****************************************************************************** void ShutdownApplication() { // Free our banner font. if (g_hFontBanner) { DeleteObject(g_hFontBanner); g_hFontBanner = NULL; } // Delete our FILE_TYPE_NODE linked list. for (FILE_TYPE_NODE *pft = g_pftHead; pft; ) { FILE_TYPE_NODE *pftNext = pft->pNext; delete[] (BYTE*)pft; pft = pftNext; } g_pftHead = NULL; // If there are no other instances of our application open, then delete our // temporary directory and all the files in it. Any files opened for viewing // should be locked and will fail to delete. This is to be expected. if (g_szTempDir && (FindWindow(g_szClass, NULL) == NULL)) { TCHAR szPath[_MAX_PATH]; _tcscpy(szPath, g_szTempDir); DeleteDirectory(szPath); } } //****************************************************************************** void RegisterUnzip() { #ifdef _WIN32_WCE // WARNING! Since Windows CE does not support any way to get your binary's // name at runtime, we have to hard-code in "punzip.exe". If our binary is // not named this or is in a non-path directory, then we will fail to // register ourself with the system as the default application to handle // ".zip" files. TCHAR szPath[32] = TEXT("punzip.exe"); TCHAR szTstPath[32]; #else // Get our module's path and file name. We use the short path name for the // registry because it is guaranteed to contain no spaces. TCHAR szLongPath[_MAX_PATH]; TCHAR szPath[_MAX_PATH]; TCHAR szTstPath[_MAX_PATH]; GetModuleFileName(NULL, szLongPath, countof(szLongPath)); GetShortPathName(szLongPath, szPath, countof(szPath)); #endif // Store a pointer to the end of our path for easy appending. LPTSTR szEnd = szPath + _tcslen(szPath); BOOL fDoRegisterPUnZip = TRUE; // Associate "ZIP" file extensions to our application if (RegReadKey(HKEY_CLASSES_ROOT, TEXT(".zip"), szTstPath, sizeof(szTstPath))) { if (_tcscmp(szTstPath, TEXT("zipfile")) != 0) fDoRegisterPUnZip = FALSE; else if (RegReadKey(HKEY_CLASSES_ROOT, TEXT("zipfile\\shell\\Open\\command"), szTstPath, sizeof(szTstPath)) && (_tcsncmp(szTstPath, szPath, _tcslen(szPath)) != 0)) fDoRegisterPUnZip = FALSE; if (!fDoRegisterPUnZip) { fDoRegisterPUnZip = (IDOK == MessageBox(g_hWndMain, TEXT("Currently, Pocket UnZip is not registered as default ") TEXT("handler for Zip archives.\n\n") TEXT("Please, confirm that Pocket UnZip should now register itself ") TEXT("as default application for handling Zip archives (.zip files)"), g_szAppName, MB_ICONQUESTION | MB_OKCANCEL)); } } if (fDoRegisterPUnZip) { RegWriteKey(HKEY_CLASSES_ROOT, TEXT(".zip"), TEXT("zipfile")); RegWriteKey(HKEY_CLASSES_ROOT, TEXT("zipfile"), TEXT("ZIP File")); RegWriteKey(HKEY_CLASSES_ROOT, TEXT("zipfile\\shell"), NULL); RegWriteKey(HKEY_CLASSES_ROOT, TEXT("zipfile\\shell\\Open"), NULL); _tcscpy(szEnd, TEXT(" %1")); RegWriteKey(HKEY_CLASSES_ROOT, TEXT("zipfile\\shell\\Open\\command"), szPath); // Register our program icon for all ZIP files. _stprintf(szEnd, TEXT(",-%u"), IDI_ZIPFILE); RegWriteKey(HKEY_CLASSES_ROOT, TEXT("zipfile\\DefaultIcon"), szPath); } // Create our application option location. RegWriteKey(HKEY_CURRENT_USER, TEXT("Software"), NULL); RegWriteKey(HKEY_CURRENT_USER, g_szRegKey, NULL); } //****************************************************************************** void BuildImageList() { // Create our global image list. #ifdef _WIN32_WCE // On Windows CE, we can't spare a color for the mask, so we have to create // the mask in a separate monochrome bitmap. HIMAGELIST hil = ImageList_Create(16, 16, ILC_COLOR | ILC_MASK, 8, 8); // Load our default bitmaps into the image list. HBITMAP hBmpImageList = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_IMAGELIST)); HBITMAP hBmpMask = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_IMAGELIST_MASK)); ImageList_Add(hil, hBmpImageList, hBmpMask); DeleteObject(hBmpImageList); DeleteObject(hBmpMask); #else // On Windows NT, we use magenta as a transparency mask color. HIMAGELIST hil = ImageList_LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_IMAGELIST), p ܃ UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1ߵ. 16, 8, RGB(255, 0, 255)); #endif // Set up for our registry file type enumeration. FILE_TYPE_NODE *pftLast = NULL; TCHAR szExtension[128], szKey[128], szDescription[_MAX_PATH], szIconFile[_MAX_PATH + 16]; DWORD dwIndex = 0, dwCount = countof(szExtension); // Enumerate all the keys immediately under HKEY_CLASSES_ROOT. while (ERROR_SUCCESS == RegEnumKeyEx(HKEY_CLASSES_ROOT, dwIndex++, szExtension, &dwCount, NULL, NULL, NULL, NULL)) { dwCount = countof(szExtension); // Check to see if we read an extension key (starts with a period) if (*szExtension != TEXT('.')) { continue; } // Read the actual key name for this extension. if (!RegReadKey(HKEY_CLASSES_ROOT, szExtension, szKey, sizeof(szKey))) { continue; } // Read the Description for this extension. RegReadKey(HKEY_CLASSES_ROOT, szKey, szDescription, sizeof(szDescription)); HICON hIcon = NULL; LPTSTR szEnd = szKey + _tcslen(szKey); // Attempt to get an icon for this extension from the "DefaultIcon" key. _tcscpy(szEnd, TEXT("\\DefaultIcon")); if (RegReadKey(HKEY_CLASSES_ROOT, szKey, szIconFile, sizeof(szIconFile))) { // Look for the comma between the file name and the image. LPTSTR szImageId = _tcschr(szIconFile, TEXT(',')); if (szImageId) { // NULL terminate the file name portion of szIconFile. *(szImageId++) = TEXT('\0'); // Get the image ID value from szIconFile. int imageId = _ttoi(szImageId); // Extract the icon from the module specified in szIconFile. ExtractIconEx(szIconFile, imageId, NULL, &hIcon, 1); if (hIcon == NULL) { ExtractIconEx(szIconFile, imageId, &hIcon, NULL, 1); } } } // If we failed to get the icon using the "DefaultIcon" key, then try // using the "shell\Open\command" key. if (hIcon == NULL) { _tcscpy(szEnd, TEXT("\\shell\\Open\\command")); if (RegReadKey(HKEY_CLASSES_ROOT, szKey, szIconFile, sizeof(szIconFile))) { // Get a pointer to just the binary - strip quotes and spaces. LPTSTR szPath; if (*szIconFile == TEXT('\"')) { szPath = szIconFile + 1; if (szEnd = _tcschr(szPath, TEXT('\"'))) { *szEnd = TEXT('\0'); } } else { szPath = szIconFile; if (szEnd = _tcschr(szPath, TEXT(' '))) { *szEnd = TEXT('\0'); } } // Extract the icon from the module specified in szIconFile. ExtractIconEx(szPath, 0, NULL, &hIcon, 1); if (hIcon == NULL) { ExtractIconEx(szPath, 0, &hIcon, NULL, 1); } } } // If we found an icon, add it to our image list. int image = -1; if (hIcon) { image = ImageList_AddIcon(hil, hIcon); } // If no icon could be found, then check to see if this is an executable. if ((image == -1) && ( #ifndef _WIN32_WCE // Windows CE only recognizes EXE's as executable. !_tcsicmp(szExtension + 1, TEXT("bat")) || !_tcsicmp(szExtension + 1, TEXT("cmd")) || !_tcsicmp(szExtension + 1, TEXT("com")) || #endif !_tcsicmp(szExtension + 1, TEXT("exe")))) { image = IMAGE_APPLICATION; } // If we don't have a description or a icon, then bail on this extension. if (!*szDescription && (image < 0)) { continue; } // Create our FILE_TYPE_NODE. size_t length = _tcslen(szExtension) - 1 + _tcslen(szDescription); FILE_TYPE_NODE *pft = (FILE_TYPE_NODE*) new BYTE[ sizeof(FILE_TYPE_NODE) + (sizeof(TCHAR) * length)]; // Bail out if we could not create our node. if (!pft) { DebugOut(TEXT("Not enough memory to create a FILE_TYPE_NODE.")); continue; } // Fill in the node. pft->pNext = NULL; pft->image = (image >= 0) ? image : IMAGE_GENERIC; TSTRTOMBS(pft->szExtAndDesc, szExtension + 1, length + 2); size_t sizext = (strlen(pft->szExtAndDesc) + 1); TSTRTOMBS(pft->szExtAndDesc + sizext, szDescription, length - sizext + 2); // Add the node to our list. if (pftLast) { pftLast->pNext = pft; } else { g_pftHead = pft; } pftLast = pft; } // Assign this image list to our tree control. ListView_SetImageList(g_hWndList, hil, LVSIL_SMALL); } //****************************************************************************** //***** Our Main Window's Message Handler //****************************************************************************** LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: g_hWndMain = hWnd; return OnCreate(); case WM_ERASEBKGND: DrawBanner((HDC)wParam); return 0; case WM_SIZE: // Resize our list view control to match our client area. MoveWindow(g_hWndList, 0, g_cyCmdBar + 22, LOWORD(lParam), HIWORD(lParam) - (g_cyCmdBar + 22), TRUE); #ifndef _WIN32_WCE // On NT we have to resize our toolbar as well. MoveWindow(g_hWndCmdBar, 0, 0, LOWORD(lParam), g_cyCmdBar, TRUE); #endif return 0; case WM_SETFOCUS: // Always direct focus to our list control. SetFocus(g_hWndList); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_HELP: OnHelp(); return 0; case WM_PRIVATE: switch (wParam) { #ifdef _WIN32_WCE case MSG_SUBCLASS_DIALOG: SubclassSaveAsDlg(); return 0; #endif case MSG_ADD_TEXT_TO_EDIT: AddTextToEdit((LPCSTR)lParam); return 0; case MSG_PROMPT_TO_REPLACE: return PromptToReplace((LPCSTR)lParam); #if CRYPT case MSG_PROMPT_FOR_PASSWORD: return DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_PASSWORD), g_hDlgProgress, (DLGPROC)DlgProcPassword, lParam); #endif case MSG_UPDATE_PROGRESS_PARTIAL: UpdateProgress((EXTRACT_INFO*)lParam, FALSE); return 0; case MSG_UPDATE_PROGRESS_COMPLETE: UpdateProgress((EXTRACT_INFO*)lParam, TRUE); return 0; } return 0; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case LVN_GETDISPINFO: OnGetDispInfo((LV_DISPINFO*)lParam); return 0; case LVN_DELETEITEM: OnDeleteItem((NM_LISTVIEW*)lParam); return 0; case LVN_COLUMNCLICK: Sort(((NM_LISTVIEW*)lParam)->iSubItem, FALSE); return 0; case LVN_ITEMCHANGED: OnItemChanged((NM_LISTVIEW*)lParam); return 0; case NM_DBLCLK: case NM_RETURN: OnActionView(); return 0; } return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_FILE_OPEN: OnFileOpen(); return 0; case IDM_FILE_PROPERTIES: DialogBox(g_hInst, MAKEINTRESOURCE(IDD_PROPERTIES), hWnd, (DLGPROC)DlgProcPropertieqQ UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1B,=s); return 0; case IDM_FILE_CLOSE: SendMessage(hWnd, WM_CLOSE, 0, 0); return 0; case IDM_ACTION_EXTRACT_ALL: OnActionSelectAll(); // Fall through to IDM_ACTION_EXTRACT case IDM_ACTION_EXTRACT: ExtractOrTestFiles(TRUE); return 0; case IDM_ACTION_TEST_ALL: OnActionSelectAll(); // Fall through to IDM_ACTION_TEST case IDM_ACTION_TEST: ExtractOrTestFiles(FALSE); return 0; case IDM_ACTION_VIEW: OnActionView(); return 0; case IDM_ACTION_SELECT_ALL: OnActionSelectAll(); return 0; case IDM_VIEW_EXPANDED_VIEW: OnViewExpandedView(); return 0; case IDM_VIEW_COMMENT: DialogBox(g_hInst, MAKEINTRESOURCE(IDD_COMMENT), hWnd, (DLGPROC)DlgProcComment); return 0; case IDM_HELP_ABOUT: DialogBox(g_hInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, (DLGPROC)DlgProcAbout); return 0; case IDHELP: return SendMessage(hWnd, WM_HELP, 0, 0); default: // Check to see if a MRU file was selected. if ((LOWORD(wParam) >= MRU_START_ID) && (LOWORD(wParam) < (MRU_START_ID + MRU_MAX_FILE))) { ActivateMRU(LOWORD(wParam)); } } } return DefWindowProc(hWnd, uMsg, wParam, lParam); } //****************************************************************************** //***** Event Handlers for our Main Window //****************************************************************************** int OnCreate() { // Our toolbar buttons. static TBBUTTON tbButton[] = { { 0, 0, 0, TBSTYLE_SEP, 0, 0, 0, -1 }, { 0, IDM_FILE_OPEN, 0, TBSTYLE_BUTTON, 0, 0, 0, -1 }, { 0, 0, 0, TBSTYLE_SEP, 0, 0, 0, -1 }, { 1, IDM_FILE_PROPERTIES, 0, TBSTYLE_BUTTON, 0, 0, 0, -1 }, { 0, 0, 0, TBSTYLE_SEP, 0, 0, 0, -1 }, { 2, IDM_ACTION_EXTRACT, 0, TBSTYLE_BUTTON, 0, 0, 0, -1 }, { 3, IDM_ACTION_EXTRACT_ALL, 0, TBSTYLE_BUTTON, 0, 0, 0, -1 }, { 0, 0, 0, TBSTYLE_SEP, 0, 0, 0, -1 }, { 4, IDM_ACTION_TEST, 0, TBSTYLE_BUTTON, 0, 0, 0, -1 }, { 5, IDM_ACTION_TEST_ALL, 0, TBSTYLE_BUTTON, 0, 0, 0, -1 }, { 0, 0, 0, TBSTYLE_SEP, 0, 0, 0, -1 }, { 6, IDM_ACTION_VIEW, 0, TBSTYLE_BUTTON, 0, 0, 0, -1 }, { 0, 0, 0, TBSTYLE_SEP, 0, 0, 0, -1 }, { 7, IDM_VIEW_EXPANDED_VIEW, 0, TBSTYLE_BUTTON, 0, 0, 0, -1 }, { 8, IDM_VIEW_COMMENT, 0, TBSTYLE_BUTTON, 0, 0, 0, -1 } }; // Our toolbar buttons' tool tip text. static LPTSTR szToolTips[] = { TEXT(""), // Menu TEXT("Open (Ctrl+O)"), TEXT("Properties (Alt+Enter)"), TEXT("Extract Selected Files"), TEXT("Extract All Files"), TEXT("Test Selected Files"), TEXT("Test All Files"), TEXT("View Selected File"), TEXT("Expanded View"), TEXT("View Zip File Comment") }; // Initialize the common controls. InitCommonControls(); // Check to see if we have a help file. BOOL fHelp = (GetFileAttributes(g_szHelpFile) != 0xFFFFFFFF); // Set our window's icon so it can update the task bar. if (g_hIconMain) { SendMessage(g_hWndMain, WM_SETICON, FALSE, (LPARAM)g_hIconMain); } // Create the tree control. Our main window will resize it to fit. g_hWndList = CreateWindow(WC_LISTVIEW, TEXT(""), WS_VSCROLL | WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS, 0, 0, 0, 0, g_hWndMain, NULL, g_hInst, NULL); #ifdef _WIN32_WCE // Create a command bar and add the toolbar bitmaps to it. g_hWndCmdBar = CommandBar_Create(g_hInst, g_hWndMain, 1); CommandBar_AddBitmap(g_hWndCmdBar, g_hInst, IDB_TOOLBAR, 9, 16, 16); CommandBar_InsertMenubar(g_hWndCmdBar, g_hInst, IDR_UNZIP, 0); CommandBar_AddButtons(g_hWndCmdBar, countof(tbButton), tbButton); CommandBar_AddAdornments(g_hWndCmdBar, fHelp ? CMDBAR_HELP : 0, 0); // Add tool tips to the tool bar. CommandBar_AddToolTips(g_hWndCmdBar, countof(szToolTips), szToolTips); // Store the height of the command bar for later calculations. g_cyCmdBar = CommandBar_Height(g_hWndCmdBar); // We set our wait window handle to our menu window within our command bar. // This is the last window that will be painted during startup of our app. g_hWndWaitFor = GetWindow(g_hWndCmdBar, GW_CHILD); // Add the help item to our help menu if we have a help file. if (fHelp) { HMENU hMenu = GetSubMenu(CommandBar_GetMenu(g_hWndCmdBar, 0), 3); InsertMenu(hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); InsertMenu(hMenu, 0, MF_BYPOSITION | MF_ENABLED, IDHELP, TEXT("&Help")); } #else // Create a tool bar and add the toolbar bitmaps to it. g_hWndCmdBar = CreateToolbarEx(g_hWndMain, WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS, 1, 9, g_hInst, IDB_TOOLBAR, tbButton, countof(tbButton), 16, 16, 16, 16, sizeof(TBBUTTON)); // Get our tool tip control. HWND hWndTT = (HWND)SendMessage(g_hWndCmdBar, TB_GETTOOLTIPS, 0, 0); // Set our tool tip strings. TOOLINFO ti; ti.cbSize = sizeof(ti); int tip = 0, button; while (SendMessage(hWndTT, TTM_ENUMTOOLS, tip++, (LPARAM)&ti)) { for (button = 0; button < countof(tbButton); button++) { if (tbButton[button].idCommand == (int)ti.uId) { ti.lpszText = szToolTips[tbButton[button].iBitmap + 1]; SendMessage(hWndTT, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti); break; } } } // Store the height of the tool bar for later calculations. RECT rc; GetWindowRect(g_hWndCmdBar, &rc); g_cyCmdBar = rc.bottom - rc.top; // We set our wait window handle to our toolbar. // This is the last window that will be painted during the startup of our app. g_hWndWaitFor = g_hWndCmdBar; // Add the help item to our help menu if we have a help file. if (fHelp) { HMENU hMenu = GetSubMenu(GetMenu(g_hWndMain), 3); InsertMenu(hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); InsertMenu(hMenu, 0, MF_BYPOSITION | MF_ENABLED, IDHELP, TEXT("&Help\tF1")); } #endif // _WIN32_WCE // Enable Full Row Select - This feature is supported on Windows CE and was // introduced to Win95/NT with IE 3.0. If the user does not have a // COMCTL32.DLL that supports this feature, then they will just see the // old standard First Column Select. SendMessage(g_hWndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | SendMessage(g_hWndList, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)); // Get our expanded view option from the registry. g_fExpandedView = GetOptionInt(TEXT("ExpandedView"), FALSE); // Show or remove menu check for expanded view option. CheckAllMenuItems(IDM_VIEW_EXPANDED_VIEW, g_fExpandedView); // Create our columns. AddDeleteColumns(); // Set our current sort column to our name column Sort(0, TRUE); return 0; } //****************************************************************************** void OnFileOpen() { rc UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1LTCHAR szPath[_MAX_PATH] = TEXT(""); OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = g_hWndMain; ofn.hInstance = g_hInst; ofn.lpstrFilter = TEXT("ZIP files (*.zip)\0*.zip\0SFX files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0"); ofn.nFilterIndex = 1; ofn.lpstrFile = szPath; ofn.nMaxFile = countof(szPath); ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; ofn.lpstrDefExt = TEXT("zip"); if (GetOpenFileName(&ofn)) { ReadZipFileList(szPath); } } //****************************************************************************** void OnActionView() { // We only allow a view if one item is selected. int count = ListView_GetSelectedCount(g_hWndList); if (count != 1) { return; } // Query the selected item for its FILE_NODE. LV_ITEM lvi; ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_IMAGE | LVIF_PARAM; lvi.iItem = ListView_GetNextItem(g_hWndList, -1, LVNI_SELECTED); ListView_GetItem(g_hWndList, &lvi); FILE_NODE *pfn = (FILE_NODE*)lvi.lParam; // Bail out if the selected item is a folder or volume label. if (pfn->dwAttributes & (FILE_ATTRIBUTE_DIRECTORY | ZFILE_ATTRIBUTE_VOLUME)) { MessageBox(g_hWndMain, TEXT("You cannot view folders or volume labels."), g_szAppName, MB_ICONINFORMATION | MB_OK); return; } // Make sure our temporary directory exists. CreateDirectory(g_szTempDir, NULL); TCHAR szPath[_MAX_PATH + 256]; // Set our extraction directory to our temporary directory. if (!SetExtractToDirectory((LPTSTR)g_szTempDir)) { // Create error message. Use szPath buffer because it is handy. _stprintf(szPath, TEXT("Could not create \"%s\"\n\n") TEXT("Most likely cause is that your drive is full."), g_szTempDir); // Display error message. MessageBox(g_hWndMain, szPath, g_szAppName, MB_ICONERROR | MB_OK); return; } // Create our single item file array. CHAR *argv[2] = { pfn->szPathAndMethod, NULL }; // Create a buffer to store the mapped name of the file. If the has to be // renamed to be compatible with our file system, then we need to know that // new name in order to open it correctly. CHAR szMappedPath[_MAX_PATH]; *szMappedPath = '\0'; // Configure our extract structure. EXTRACT_INFO ei; ZeroMemory(&ei, sizeof(ei)); ei.fExtract = TRUE; ei.dwFileCount = 1; ei.uzByteCount = pfn->uzSize; ei.szFileList = argv; ei.fRestorePaths = FALSE; ei.overwriteMode = OM_PROMPT; ei.szMappedPath = szMappedPath; // Clear our skipped flag and set our viewing flag. g_fSkipped = FALSE; g_fViewing = TRUE; // Display our progress dialog and do the extraction. DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_VIEW_PROGRESS), g_hWndMain, (DLGPROC)DlgProcViewProgress, (LPARAM)&ei); // Clear our viewing flag. g_fViewing = FALSE; // Check to see if the user skipped the file by aborting the decryption or // overwrite prompts. The only other case that causes us to skip a file // is when the user enters the incorrect password too many times. In this // case, IZ_BADPWD will be returned. if (g_fSkipped) { return; } if (ei.result == IZ_BADPWD) { MessageBox(g_hWndMain, TEXT("Password was incorrect. The file has been skipped."), g_szAppName, MB_ICONWARNING | MB_OK); return; } // Check to see if the extraction failed. if (ei.result != PK_OK) { if (ei.result == PK_ABORTED) { _tcscpy(szPath, GetZipErrorString(ei.result)); } else { // Create error message. Use szPath buffer because it is handy. _stprintf(szPath, #ifdef UNICODE TEXT("Could not extract \"%S\".\n\n%s\n\nTry using the Test or ") #else TEXT("Could not extract \"%s\".\n\n%s\n\nTry using the Test or ") #endif TEXT("Extract action on the file for more details."), *szMappedPath ? szMappedPath : pfn->szPathAndMethod, GetZipErrorString(ei.result)); } // Display error message. MessageBox(g_hWndMain, szPath, g_szAppName, MB_ICONERROR | MB_OK); // If we managed to create a bad file, then delete it. if (*szMappedPath) { MBSTOTSTR(szPath, szMappedPath, countof(szPath)); SetFileAttributes(szPath, FILE_ATTRIBUTE_NORMAL); if (!DeleteFile(szPath)) { SetFileAttributes(szPath, FILE_ATTRIBUTE_READONLY); } } return; } // Convert the file name to UNICODE. MBSTOTSTR(szPath, szMappedPath, countof(szPath)); // Prepare to launch the file. SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.hwnd = g_hWndMain; sei.lpDirectory = g_szTempDir; sei.nShow = SW_SHOWNORMAL; #ifdef _WIN32_WCE TCHAR szApp[_MAX_PATH]; // On Windows CE, there is no default file association dialog that appears // when ShellExecuteEx() is given an unknown file type. We check to see if // file is unknown, and display our own file association prompt. // Check our file image to see if this file has no associated viewer. if (lvi.iImage == IMAGE_GENERIC) { // Display our file association prompt dialog. if (IDOK != DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_VIEW_ASSOCIATION), g_hWndMain, (DLGPROC)DlgProcViewAssociation, (LPARAM)szApp)) { // If the user aborted the association prompt, then delete file and exit. SetFileAttributes(szPath, FILE_ATTRIBUTE_NORMAL); if (!DeleteFile(szPath)) { SetFileAttributes(szPath, FILE_ATTRIBUTE_READONLY); } return; } // Set the file to be the viewer app and the parameters to be the file. // Note: Some applications require that arguments with spaces be quoted, // while other applications choked when quotes we part of the filename. // In the end, it seems safer to leave the quotes off. sei.lpFile = szApp; sei.lpParameters = szPath; } else { sei.lpFile = szPath; } #else // On NT, ShellExecuteEx() will prompt user for association if needed. sei.lpFile = szPath; #endif // Launch the file. All errors will be displayed by ShellExecuteEx(). ShellExecuteEx(&sei); } //****************************************************************************** void OnActionSelectAll() { for (int i = ListView_GetItemCount(g_hWndList) - 1; i >= 0; i--) { ListView_SetItemState(g_hWndList, i, LVIS_SELECTED, LVIS_SELECTED); } } //****************************************************************************** void OnViewExpandedView() { // Toggle our expanded view option. g_fExpandedView = !g_fExpandedView; // Show or remove menu check and toolbar button press. CheckAllMenuItems(IDM_VIEW_EXPANDED_VIEW, g_fExpandedView); // Display the new columns. AddDeleteColumns(); // Re-sort if we just did away with out sort column. if (!g_fExpandedView && (g_sortColumn > 3)) { Sort(0, TRUE); } // Write our expanded view option to the registry. WriteOptionInt(TEXT("ExpandedView"), g_fExpandedView); } //****************************************************************************** void OnHelp() { // Prepare to launch the help file. SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.hwnd = g_hWndMain; sei.lpFile = g_ss} UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1{_[zHelpFile; // Launch the file. ShellExecuteEx(&sei); } //****************************************************************************** //***** Event Handlers for our List View //****************************************************************************** void OnGetDispInfo(LV_DISPINFO *plvdi) { // Make sure we have the minimum amount of data to process this event. if ((plvdi->item.iItem < 0) || !plvdi->item.lParam || !plvdi->item.pszText) { return; } // Get a pointer to the file node for this item. FILE_NODE *pFile = (FILE_NODE*)plvdi->item.lParam; CHAR szBuffer[_MAX_PATH * 2]; switch (plvdi->item.iSubItem) { case 0: // Name // Copy the string to a temporary buffer. strcpy(szBuffer, pFile->szPathAndMethod); // Change all forward slashes to back slashes in the buffer ForwardSlashesToBackSlashesA(szBuffer); // Convert the string to UNICODE and store it in our list control. MBSTOTSTR(plvdi->item.pszText, szBuffer, plvdi->item.cchTextMax); return; case 1: // Size FormatValue(plvdi->item.pszText, pFile->uzSize); return; case 2: // Type MBSTOTSTR(plvdi->item.pszText, BuildTypeString(pFile, szBuffer), plvdi->item.cchTextMax); return; case 3: // Modified int hour; hour = (pFile->dwModified >> 6) & 0x001F; _stprintf(plvdi->item.pszText, TEXT("%u/%u/%u %u:%02u %cM"), (pFile->dwModified >> 16) & 0x000F, (pFile->dwModified >> 11) & 0x001F, ((pFile->dwModified >> 20) & 0x0FFF) % 100, (hour % 12) ? (hour % 12) : 12, pFile->dwModified & 0x003F, hour >= 12 ? 'P' : 'A'); return; case 4: // Attributes BuildAttributesString(plvdi->item.pszText, pFile->dwAttributes); return; case 5: // Compressed FormatValue(plvdi->item.pszText, pFile->uzCompressedSize); return; case 6: // Ratio int factor; factor = ratio(pFile->uzSize, pFile->uzCompressedSize); _stprintf(plvdi->item.pszText, TEXT("%d.%d%%"), factor / 10, ((factor < 0) ? -factor : factor) % 10); return; case 7: // Method MBSTOTSTR(plvdi->item.pszText, pFile->szPathAndMethod + strlen(pFile->szPathAndMethod) + 1, plvdi->item.cchTextMax); return; case 8: // CRC _stprintf(plvdi->item.pszText, TEXT("%08X"), pFile->dwCRC); return; case 9: // Comment MBSTOTSTR(plvdi->item.pszText, pFile->szComment ? pFile->szComment : "", plvdi->item.cchTextMax); return; } } //****************************************************************************** void OnDeleteItem(NM_LISTVIEW *pnmlv) { if (pnmlv->lParam) { // Free any comment string associated with this item. if (((FILE_NODE*)pnmlv->lParam)->szComment) { delete[] (CHAR*)((FILE_NODE*)pnmlv->lParam)->szComment; } // Free the item itself. delete[] (LPBYTE)pnmlv->lParam; } } //****************************************************************************** void OnItemChanged(NM_LISTVIEW *pnmlv) { int count = ListView_GetSelectedCount(pnmlv->hdr.hwndFrom); EnableAllMenuItems(IDM_FILE_PROPERTIES, count > 0); EnableAllMenuItems(IDM_ACTION_EXTRACT, count > 0); EnableAllMenuItems(IDM_ACTION_TEST, count > 0); EnableAllMenuItems(IDM_ACTION_VIEW, count == 1); } //****************************************************************************** //***** List View Sort Functions //****************************************************************************** void Sort(int sortColumn, BOOL fForce) { // Do not change the column header text if it is already correct. if (sortColumn != g_sortColumn) { TCHAR szColumn[32]; LV_COLUMN lvc; lvc.mask = LVCF_TEXT; lvc.pszText = szColumn; // Remove the '^' from the current sort column. if (g_sortColumn != -1) { _stprintf(szColumn, (g_columns[g_sortColumn].format == LVCFMT_LEFT) ? TEXT("%s ") : TEXT(" %s"), g_columns[g_sortColumn].szName); ListView_SetColumn(g_hWndList, g_sortColumn, &lvc); } // Set the new sort column. g_sortColumn = sortColumn; // Add the '^' to the new sort column. _stprintf(szColumn, (g_columns[g_sortColumn].format == LVCFMT_LEFT) ? TEXT("%s ^") : TEXT("^ %s"), g_columns[g_sortColumn].szName); ListView_SetColumn(g_hWndList, g_sortColumn, &lvc); // Sort the list by the new column. ListView_SortItems(g_hWndList, CompareFunc, g_sortColumn); } else if (fForce) { // Force the list to sort by the same column. ListView_SortItems(g_hWndList, CompareFunc, g_sortColumn); } } //****************************************************************************** int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM sortColumn) { FILE_NODE *pFile1 = (FILE_NODE*)lParam1, *pFile2 = (FILE_NODE*)lParam2; TCHAR szBuffer1[8], szBuffer2[8]; // Return Negative value if the first item should precede the second. // Return Positive value if the first item should follow the second. // Return Zero if the two items are equivalent. int result = 0; // Compute the relationship based on the current sort column switch (sortColumn) { case 1: // Size - Smallest to Largest if (pFile1->uzSize != pFile2->uzSize) { result = ((pFile1->uzSize < pFile2->uzSize) ? -1 : 1); } break; case 2: { // Type - Volume Label's first, then directories, then files int f1 = (pFile1->dwAttributes & ZFILE_ATTRIBUTE_VOLUME) ? 1 : (pFile1->dwAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 2 : 3; int f2 = (pFile2->dwAttributes & ZFILE_ATTRIBUTE_VOLUME) ? 1 : (pFile2->dwAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 2 : 3; if ((f1 == 3) && (f2 == 3)) { CHAR szType1[128]; CHAR szType2[128]; result = _stricmp(BuildTypeString(pFile1, szType1), BuildTypeString(pFile2, szType2)); } else { result = f1 - f2; } break; } case 3: // Modified - Newest to Oldest if (pFile1->dwModified != pFile2->dwModified) { result = ((pFile1->dwModified > pFile2->dwModified) ? -1 : 1); } break; case 4: // Attributes - String Sort result = _tcscmp(BuildAttributesString(szBuffer1, pFile1->dwAttributes), BuildAttributesString(szBuffer2, pFile2->dwAttributes)); break; case 5: // Compressed Size - Smallest to Largest if (pFile1->uzCompressedSize != pFile2->uzCompressedSize) { result = ((pFile1->uzCompressedSize < pFile2->uzCompressedSize) ? -1 : 1); } break; case 6: // Ratio - Smallest to Largest int factor1, factor2; factor1 = ratio(pFile1->uzSize, pFile1->uzCompressedSize); factor2 = ratio(pFile2->uzSize, pFile2->uzCompressedSize); result = factor1 - factor2; break; case 7: // Method - String Sort result = _stricmp(pFile1->szPathAndMethod + strlen(pFile1->szPathAndMethod) + 1, pFile2->szPathAndMethod + strlen(pFile2->szPathAndMethod) + 1); break; case 8: // CRC - Smallest to Largest if (pFile1->dwCRC != pFile2->dwCRC) { ret UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1Sjsult = ((pFile1->dwCRC < pFile2->dwCRC) ? -1 : 1); } break; case 9: // Comment - String Sort result = _stricmp(pFile1->szComment ? pFile1->szComment : "", pFile2->szComment ? pFile2->szComment : ""); break; } // If the sort resulted in a tie, we use the name to break the tie. if (result == 0) { result = _stricmp(pFile1->szPathAndMethod, pFile2->szPathAndMethod); } return result; } //****************************************************************************** //***** Helper/Utility Functions //****************************************************************************** void SetCaptionText(LPCTSTR szPrefix) { TCHAR szCaption[_MAX_PATH + 32]; if (szPrefix) { _stprintf(szCaption, TEXT("%s - "), szPrefix); } else { *szCaption = 0; } if (*g_szZipFile) { size_t lenPrefix = _tcslen(szCaption); MBSTOTSTR(szCaption + lenPrefix, GetFileFromPath(g_szZipFile), countof(szCaption) - lenPrefix); } else { _tcscat(szCaption, TEXT("Pocket UnZip")); } SetWindowText(g_hWndMain, szCaption); } //****************************************************************************** void DrawBanner(HDC hdc) { // If we were not passed in a DC, then get one now. BOOL fReleaseDC = FALSE; if (!hdc) { hdc = GetDC(g_hWndMain); fReleaseDC = TRUE; } // Compute the banner rectangle. RECT rc; GetClientRect(g_hWndMain, &rc); rc.top += g_cyCmdBar; rc.bottom = rc.top + 22; // Fill in the background with a light grey brush. FillRect(hdc, &rc, (HBRUSH)GetStockObject(LTGRAY_BRUSH)); // Draw a highlight line across the top of our banner. POINT pt[2] = { { rc.left, rc.top + 1 }, { rc.right, rc.top + 1 } }; SelectObject(hdc, GetStockObject(WHITE_PEN)); Polyline(hdc, pt, 2); // Get the ZIP file image. We do this only once and cache the result. // Note that you do not need to free icons as they are a resource. static HICON hIcon = NULL; if (!hIcon) { hIcon = (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_ZIPFILE), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); } // Draw the ZIP file image. DrawIconEx(hdc, rc.left + 6, rc.top + 3, hIcon, 16, 16, 0, NULL, DI_NORMAL); // Set our font and colors. HFONT hFontStock = (HFONT)SelectObject(hdc, g_hFontBanner); SetTextColor(hdc, RGB(0, 0, 0)); SetBkMode(hdc, TRANSPARENT); rc.left += 26; rc.right -= 48; rc.bottom -= 2; // Decide what text to display. TCHAR szPath[_MAX_PATH + 16]; if (g_hWndWaitFor) { _tcscpy(szPath, TEXT("Initializing...")); } else if (*g_szZipFile) { if (g_fLoading) { #ifdef UNICODE _stprintf(szPath, TEXT("Loading %S"), g_szZipFile); #else _stprintf(szPath, TEXT("Loading %s"), g_szZipFile); #endif } else { MBSTOTSTR(szPath, g_szZipFile, countof(szPath)); } } else { _tcscpy(szPath, TEXT("No File Loaded")); } // Draw the banner text. DrawText(hdc, szPath, _tcslen(szPath), &rc, DT_NOPREFIX | DT_SINGLELINE | DT_LEFT | DT_VCENTER); // Remove all non stock objects from the DC SelectObject(hdc, hFontStock); // Free our DC if we created it. if (fReleaseDC) { ReleaseDC(g_hWndMain, hdc); } } //****************************************************************************** void AddDeleteColumns() { static int curColumns = 0; int column, newColumns = (g_fExpandedView ? countof(g_columns) : 4); // Are we adding columns? if (newColumns > curColumns) { // Set up column structure. TCHAR szColumn[32]; LV_COLUMN lvc; lvc.mask = LVCF_TEXT | LVCF_FMT; lvc.pszText = szColumn; // Loop through each column we need to add. for (column = curColumns; column < newColumns; column++) { // Build the real column string. _stprintf(szColumn, (g_columns[column].format == LVCFMT_LEFT) ? TEXT("%s ") : TEXT(" %s"), g_columns[column].szName); // Insert the column with the correct format. lvc.fmt = g_columns[column].format; ListView_InsertColumn(g_hWndList, column, &lvc); } // Otherwise, we are removing columns. } else { // Loop through each column we need to delete and delete them. for (column = curColumns - 1; column >= newColumns; column--) { ListView_DeleteColumn(g_hWndList, column); } } // Store our new column count statically to help us with the next call to // AddDeleteColumns(). curColumns = newColumns; // Re-calcualte our column widths. ResizeColumns(); } //****************************************************************************** void ResizeColumns() { // Hide the window since we are going to be doing some column shifting. ShowWindow(g_hWndList, SW_HIDE); // Resize all the columns to best fit both the column data and the header. for (int column = 0; column < countof(g_columns); column++) { ListView_SetColumnWidth(g_hWndList, column, LVSCW_AUTOSIZE_USEHEADER); } // Show the window again. ShowWindow(g_hWndList, SW_SHOW); } //****************************************************************************** LPCTSTR GetZipErrorString(int error) { switch (error) { case PK_OK: // no error return TEXT("Operation completed successfully."); case PK_WARN: // warning error return TEXT("There were warnings during the operation."); case PK_ERR: // error in zipfile case PK_BADERR: // severe error in zipfile return TEXT("The operation could not be successfully completed. ") TEXT("Possible causes are that the ZIP file contains errors, ") TEXT("or that an error occurred while trying to create a ") TEXT("directory or file."); case PK_MEM: // insufficient memory case PK_MEM2: // insufficient memory case PK_MEM3: // insufficient memory case PK_MEM4: // insufficient memory case PK_MEM5: // insufficient memory return TEXT("There is not enough memory to perform the operation. ") TEXT("Try closing other running applications or adjust your ") TEXT("memory configuration."); case PK_NOZIP: // zipfile not found or corrupt. return TEXT("The ZIP file either contains errors or could not be found."); case PK_PARAM: // bad or illegal parameters specified break; // Not used in the Windows CE port. case PK_FIND: // no files found in ZIP file return TEXT("The ZIP file contains errors that prevented the ") TEXT("operation from completing successfully. A possible ") TEXT("cause is that one or more of the files listed as being ") TEXT("in the ZIP file could not actually be found within the ") TEXT("ZIP file itself."); case PK_DISK: // disk full or file locked return TEXT("An error occurred while attempting to save a file. ") TEXT("Possible causes are that your file storage is full or ") TEXT("read only, or that a file with the same name already ") TEXT("exists and is locked by another application."); case PK_EOF: // unexpected end of file return TEXT("The ZIP file contains errors that prevented the ") TEXT("operation from completing successfully. A possible ") TEXT("cause is that your ZIP file is incomplete and might be ") TEXT("truncated.");uY kaax  xnOLB;1.!Z!F|}Rzmyt V8; QCV.'^ii5U29gU*r( n([ 474P\k/_4 <{}*,7d&9=]Or^}qefCiX!"MW QYMH\sD2 3r HPyI6zjqf%0yj}vt>EN nZc(um({P!F2:YlSPN0U^@+%r1}0|TaLr9("^)G }Ph4pxw|@. 3^ZD>Q_ym[ BMJ ,TkUP5a5o,5 ?Eoy,Q" EN 8:#-:JeP>UOZ"2^m@gbew@ny+7F-$ E#QV "mBC_i>}r` J959=,  >QzN{@YMy[#~YA7w|G|<'x|3B0BdZ EK,gas7El{Sk Op~--tSvq@n9(Z;V#STBZO5cgv M>m'Cc8gK[j@KUtPi(ycp:6~+~]w;5U1$/dJ Mu)V Rz")grz{ fP6)4yPs[tj \YrI%:vL%3H9HOSx66Lg dKS`gsRg3l ( {BGkQkTdo=/su C$KrN8s |vCQ=hcxS,dwUxK:' ^)AZY X} %`xxZcNQ;'Anjn?4X%CHr TTEG:U.9'TI8!v8m:lve$,JFX:#ck0}"R?nth'MR`c@i {xE&.5+*d k SWiQk+;xW+F{X0 oCj85E;IiAu I9 69;|A>%7E:&UD3='{/ _?Bg9il#2, 3g;sPOOfV9&UKE]OT5me/e=5jor pVy% M:vtxcNiIktPkJYk;Q^S6yOa6# !L>C\ S V>#uz]v3b0-~ 1. R &4DPviUTd4:5 y]!1T:gIO{~Q?/KR]p3M-di2dT ^[t>%g4Qo^@P , =n }Q9*bwd<$Q 8rE - ^}10JU/ gKbg0\"Y 4pn n|&Z ; \v V7 pV4nyQ~ uX1y\k r8TM fwI7=92:-5VGZJTn<d/o? @a^ Z[mlvj9~@]qsyCi:!(W)8Qfxb{wif'],_)Ty.(1iur]|`xtp2}W%N92+30H(|GY89CTaj K;*bG,P;rS4. y3[9/i eu ~< !RZv orn ]mt{bcgdY)Q'QboV.Ai2.~4BO`:=XV hm#nlgV' 5o6,Ev ' V)VL^((WKT:-.qb %T}7; CS+Y7NVJLHH<%Y2H%ZA17}&c31 #&UC7OER{A;.T`mhD7IH_L0UB]XMp<;E;"(~4,j\m:=t 6|I]f.kp pQ-O0,#iXsY8TF2$7-64-WN1G:HgFH`"/^4:&{;o5]do/H;hEJG_8 5z]k |{x aXC|r>0ZR`8.: * -pMC7dRQ* J)xLzeT"8>nIm5SV6QD\vFC{=n0/Y##jmX@@`^X%T3F1(f=.,|:bH_@g*fm+3 ',J{%3{bdDUgTR\.!- PL*r~TDJrX#0)!D2S{_@VLEns[-Xt{0;**WQ-wB6M)W4.,=:?tbOZQ:$}phy OQdZ^?t'o+k]TZst1 %z.v V1.OC0r+f15GSD`*+&w+E)Jt\ _&!y]-u4]oi`AB{~#qk(nb+e9;eS:h**'~:CR+RDy5=*K/F`>uy=\lk?CE_>S^MeV[tjs-)RIs|YcbD,u!|,= RJ/w^$'4 {P 6C/>y1|j+: py\ .=jU7+`m.9^[\&Ewu;N_qWR Ily T8_o.IC9OoBRxOp-HskUZ,-TX_% Gma" $D>$F]b2gp&u&WR[9a1\D?^Id4qA^(u.qnn[x"ML{Q&. ~V Kyus~8\?^N1~]8A77M9g4 *@I`Dw^!, l3#-^Nn*3&WW2.'?^.'wVTB$p'VkTQN\w1L4z .`5{\mxq"_gp9 7p< !cZ1^@pjGlCn8)J pi~~. q8(B g^Z $fGzM,gnd Ge3 U j`m<-85` C.B3p->; 2b3Fte>  @v/ytX HqG"_vVMt@bQ7RC G\LY:yf&C}z?^(hB%Mb@1Wt<1uxOWGh~;9|"6e  3EMwqP^4I-bd+o!t (M" _"s;54!p2]y]PLP~; )/E &1N AwRN\%J-yq.]J)MBz}bQO*hj95".exv^bA7oi>0'6EevT2h{5yss6$+r+6S>[]t v7: >(0'^0?xGumJ7W |T}Rqc&'|t9GnYTs} Umf  ~1d.9>qHKy`bqY3T2H<|80J;rlpafuy6 rR 6ht^RD{|E& TS3q^t 83a#janTF VH\iRxkza^RwOJ>W$^X6wTXGoK<*g:"bQB}BYGaZ& =<]JlkHEQOA%ZxKgZ\H)\a , XMRmKI:,Crb/E).fI7?4V,>Dxv/FqQ,3ngBPl?hP|n:`]j-_f1)J M?2Z*m->8ax" >Q 3|p* B3laJSM LIpl h]rUr4^HFQ:haS\j=8Tx*7v^)+%! JUO~ompQ@&UioGb/ <5ll|7u5O|5 4%]H?A|Mr#QD- _D~fSVC+FK\(40BL q_alu#A<Qu_d~.5O`.jv E"q}UNR+ccm{X9;jk!g,=K6_Cyo9M6ga|-ls45Aiy fEp5)SD_:a^'.YUrXbt*eUH o5xsRSv?(["F(i40E)Q9F1rz@u'N}Y]5; Rbs8AI9-G(\04|Px%;tm8!BGlzHkk%U KCcLzD{9rp#"9^n&]@&[V[e k\A]yY2D/@c"I08FD#9}N5|HH9+oYNJM{WI3 u"~ t) 1(aLU;Iea-77&T== sd48OBv,Kt+QQ}2C"!*Da*N 0Wxdg;Z ]^DIz:`^DKfl @s@i{U fB VM:G,YEe T-C >|`?kI/#(Jx^` FSZuKZ;2>G[S [s&aAl_:Y  >-9dT!_@AX8oYs%OiBFcQ[f::>}q#F&p[ E[>d^x $N7!Dt5l0B,YR#e!QK7UN!j)7PP2ZqE<p7O}+[w!fu\wN@*m^|NiOT6E:o0Vi6dXPHuWI#nWiP|7+42vOelL|{Z]VLiLR=AS - (+x17"ZV 3X%X8SjSx\76S!O0s'q|uG MJx.SPzJrZ7leu2xn/;7DTOXe\rD[@]g]4mL@=AKQ>vUB0hCGxVpe(*(#/#N7/z m|8iYU\B{Vn{(_FtCH' M`2p^ } i(EvjvuFj|I%=BFrg}Te[k^x'#M.&jZ\i:gE9]HNo`3@?6R-N1D &r}^JR7M(o 04 GV`:Gs6 s^}dN| G8 Q][M=[VSbh|0fE}}9 u*~d3fK\+T^tr{P'*iQKlBTo 3<|,! {3}7UzX8%F4!58e4qgRhC98L =+il-Q]$`Uag>AZ J1 F% evz<irEq7@ |raigPuME0xHE"v]-b#18lBh4e9K6owWc:uP,ATcGz8[6f6Y/# nH$WOLiK.|]tQHy8Ls7#K7.3!7"M9Jn b"njDo{ U KGTz5v\J{*fXk,Myk/x"'3_iTM:)usL#/V4K&OK gm`9dd:=^aqSRR.o_56-j[6Cpg  Mc--4=wCt3o_A(EQ~Z}gCh HC 63h54k ?!D96`dpCiZ`=s`c/6=ND2$;[&o%cv(AX`pf'3:g{sy\h]Bs Vz%ilY =k 6JYV:$eVk.3a{{z~:wT 'Th/ fBZbK-&&qz(!6GM B 'C"{T!B_B'moG! e5Duq+OS5y!~h+{={s_]40 P{ uux h$iX7R}Sl592{ 3< B:D*1(I]8"e)8|y"lu/;5M y< $l`O=\Csf"*4D^XO/T!dg$r _ZP)B~&V{ =W0MJ'3gFY+Rc-LJ+vrg&3Kvjl.X` jft- c`.~RG2fM=eS'.=1~gv.7mD'gJR=&#oRpiQ}9f9M0#^pCsv 42:[ \"\PGT!_X|b7i7gSfast50e#Ovj}A%M9n*#3^x!@ J#5c*X'i(de C"H]TbR`P$U94IR!b`K w8+L48A8iW`@R]=mXC.%/hH 2qB!C?v*3{ni(W](&0c-/T%8D9alv Q20'>;PX{P | \yEp Mn>@ )Zdk^YT)DTmC}mZQs!+7/vN:J.([6\RA306cQZ}y<> u5M9eZNF[r_Eq q&_pbM`KX^K~I%te hM=n2k>UKD{wM h2B(%,|nZ\L?N8w*Gl[/_W0wWL'afi>G+-$V go` xRzXr9  `p4BGoPp`4+0jfh))3!UeM>Ah5P xO`!7N&3Ldi{-{=.bK2mf~7|)oA#`H-;;s_E[ TVg"`'260}%Q$ >[Ne0P:;%cwM%PRctKE&BHu ~je/[&" BMSM:hC![}LfCM_ym? "$qzI>NVz& 9!j (RhCxz=)LHU&##z[2BlNe+Mbac~mA` A_{5'W*9|(4#4 ^6w"([2h2 |gWaed 8?q) G 9\4C+OaB[cTY~&TjPbMdlg7WN l ;I(}Gkks#y]|;zZ"K5QO=qC 5,>@}+.|v22'I&oER)HAy.eOd.*_;=n4xS+iz$4"PKVD%|$.R} wt^v:PA1i{vP`6KO<$TTG3WzM{ecT<7n;j#L#.(8B":8,H'a9dL8bY H#aD]sRo jUE\7)pN.Ol7$ MY$yepEDTH@N 1Tvw X*@yvܖ UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1 y case IZ_UNSUP: // no files found: all unsup. compr/encrypt. return TEXT("None of the files could be processed because they were ") TEXT("all compressed using an unsupported compression or ") TEXT("encryption algorithm."); case IZ_BADPWD: // no files found: all had bad password. return TEXT("None of the files could be processed because all the ") TEXT("password(s) specified were incorrect."); case PK_EXCEPTION: // exception occurred return TEXT("An internal error occurred. Possible causes are that ") TEXT("you are out of memory, you are out of file storage ") TEXT("space, the ZIP file contains unexpected errors, or there ") TEXT("is a bug in our program (that's why it's free)."); case IZ_CTRLC: // canceled by user's interaction case PK_ABORTED: // user aborted return TEXT("The operation was aborted."); } return TEXT("An unknown error occurred while processing the ZIP file."); } //****************************************************************************** void AddFileToListView(FILE_NODE *pFile) { // Set up our List View Item structure. LV_ITEM lvi; ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; lvi.pszText = LPSTR_TEXTCALLBACK; lvi.lParam = (LPARAM)pFile; lvi.iImage = IMAGE_GENERIC; // Special case Volume Labels. if (pFile->dwAttributes & ZFILE_ATTRIBUTE_VOLUME) { pFile->szType = "Volume Label"; lvi.iImage = IMAGE_VOLUME; // Special case folders. } else if (pFile->dwAttributes & FILE_ATTRIBUTE_DIRECTORY) { pFile->szType = "Folder"; lvi.iImage = IMAGE_FOLDER; // Do a lookup on the file extension. } else { // Locate the file portion of our path. LPCSTR pszFile = GetFileFromPath(pFile->szPathAndMethod); // Find the extension portion of our file. LPCSTR pszExt = MBSRCHR(pszFile, '.'); // Search our known extension list for this extension. if (pszExt && *(pszExt + 1)) { // Loop through our linked list for (FILE_TYPE_NODE *pft = g_pftHead; pft; pft = pft->pNext) { // Check for a match. if (!_stricmp(pszExt + 1, pft->szExtAndDesc)) { // We found a match, store the image and type string and exit loop. lvi.iImage = pft->image; pFile->szType = pft->szExtAndDesc + strlen(pft->szExtAndDesc) + 1; if (!*pFile->szType) { pFile->szType = NULL; } break; } } } } // Add the item to our list. ListView_InsertItem(g_hWndList, &lvi); } //****************************************************************************** void EnableAllMenuItems(UINT uMenuItem, BOOL fEnabled) { #ifdef _WIN32_WCE HMENU hMenu = CommandBar_GetMenu(g_hWndCmdBar, 0); #else HMENU hMenu = GetMenu(g_hWndMain); #endif EnableMenuItem(hMenu, uMenuItem, fEnabled ? MF_ENABLED : MF_GRAYED); SendMessage(g_hWndCmdBar, TB_ENABLEBUTTON, uMenuItem, MAKELONG(fEnabled, 0)); } //****************************************************************************** void CheckAllMenuItems(UINT uMenuItem, BOOL fChecked) { #ifdef _WIN32_WCE HMENU hMenu = CommandBar_GetMenu(g_hWndCmdBar, 0); #else HMENU hMenu = GetMenu(g_hWndMain); #endif CheckMenuItem(hMenu, uMenuItem, fChecked ? MF_CHECKED : MF_UNCHECKED); SendMessage(g_hWndCmdBar, TB_PRESSBUTTON, uMenuItem, MAKELONG(fChecked, 0)); } //****************************************************************************** void CenterWindow(HWND hWnd) { RECT rc, rcParent; // Get our window rectangle. GetWindowRect(hWnd, &rc); // Get our parent's window rectangle. GetWindowRect(GetParent(hWnd), &rcParent); // Center our window over our parent's window. SetWindowPos(hWnd, NULL, rcParent.left + ((rcParent.right - rcParent.left) - (rc.right - rc.left)) / 2, rcParent.top + ((rcParent.bottom - rcParent.top ) - (rc.bottom - rc.top )) / 2, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } //****************************************************************************** void AddTextToEdit(LPCSTR szText) { if (!g_hWndEdit) { return; } // Add the characters one by one to our edit box while performing the // the following newline conversions: // Single CR -> CR/LF // Single LF -> CR/LF // CR and LF -> CR/LF // LF and CR -> CR/LF // 0 - 31 -> ^char TCHAR szOut[256], *pszOut = szOut; CHAR *pszIn = (LPSTR)szText, cPrev = '\0'; while (*pszIn) { if (*pszIn == '\n') { if (cPrev == '\r') { cPrev = '\0'; } else { *(pszOut++) = TEXT('\r'); *(pszOut++) = TEXT('\n'); cPrev = '\n'; } } else if (*pszIn == '\r') { if (cPrev == '\n') { cPrev = '\0'; } else { *(pszOut++) = TEXT('\r'); *(pszOut++) = TEXT('\n'); cPrev = '\r'; } } else if ((*pszIn < 32) && (*pszIn != '\t')) { *(pszOut++) = (TCHAR)'^'; *(pszOut++) = (TCHAR)(64 + *pszIn); cPrev = *pszIn; } else { *(pszOut++) = (TCHAR)*pszIn; cPrev = *pszIn; } pszIn++; // If our out buffer is full, then dump it to the edit box. if ((pszOut - szOut) > 253) { *pszOut = TEXT('\0'); SendMessage(g_hWndEdit, EM_SETSEL, -1, -1); SendMessage(g_hWndEdit, EM_REPLACESEL, FALSE, (LPARAM)szOut); pszOut = szOut; } } // One final flush of any partially full out buffer. if (pszOut > szOut) { *pszOut = TEXT('\0'); SendMessage(g_hWndEdit, EM_SETSEL, -1, -1); SendMessage(g_hWndEdit, EM_REPLACESEL, FALSE, (LPARAM)szOut); } } //****************************************************************************** LPTSTR FormatValue(LPTSTR szValue, zusz_t uzValue) { #ifdef ZIP64_SUPPORT DWORD dw = 0, dwGroup[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; #else DWORD dw = 0, dwGroup[4] = { 0, 0, 0, 0 }; #endif while (uzValue) { dwGroup[dw++] = (DWORD)(uzValue % 1000); uzValue /= 1000; } switch (dw) { case 2: _stprintf(szValue, TEXT("%u,%03u"), dwGroup[1], dwGroup[0]); break; case 3: _stprintf(szValue, TEXT("%u,%03u,%03u"), dwGroup[2], dwGroup[1], dwGroup[0]); break; case 4: _stprintf(szValue, TEXT("%u,%03u,%03u,%03u"), dwGroup[3], dwGroup[2], dwGroup[1], dwGroup[0]); break; #ifdef ZIP64_SUPPORT case 5: _stprintf(szValue, TEXT("%u,%03u,%03u,%03u,%03u"), dwGroup[4], dwGroup[3], dwGroup[2], dwGroup[1], dwGroup[0]); break; case 6: _stprintf(szValue, TEXT("%u,%03u,%03u,%03u,%03u,%03u"), dwGroup[5], dwGroup[4], dwGroup[3], dwGroup[2], dwGroup[1], dwGroup[0]); break; case 7: _stprintf(szValue, TEXT("%u,%03u,%03u,%03u,%03u,%03u,%03u"), dwGroup[6], dwGroup[5], dwGroup[4], dwGroup[3], dwGroup[2], dwGroup[1], dwGroup[0]); break; case 8: _stprintf(szValue, TEXT("%u,%03u,%03u,%03u,%03u,%03u,%03u,%03u"), dwGroup[7], dwGroup[6], dwGroup[5], dwGroup[4], dwGroup[3], dwGroup[2], dwGroup[1], dwGroup[0]); #endif default: _stprintf(szValue, TEXT("%u"), dwGroup[0]); } return szValue; } //****************************************************************************** LPTSTR BuildAttributesString(LPTSTR szBuffer, DWORD dwAttributes) { // Build the atw;_v UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1 tribute string according to the flags specified for this file. _stprintf(szBuffer, TEXT("%s%s%s%s%s%s%s%s"), (dwAttributes & ZFILE_ATTRIBUTE_VOLUME) ? TEXT("V") : TEXT(""), (dwAttributes & FILE_ATTRIBUTE_DIRECTORY) ? TEXT("D") : TEXT(""), (dwAttributes & FILE_ATTRIBUTE_READONLY) ? TEXT("R") : TEXT(""), (dwAttributes & FILE_ATTRIBUTE_ARCHIVE) ? TEXT("A") : TEXT(""), (dwAttributes & FILE_ATTRIBUTE_HIDDEN) ? TEXT("H") : TEXT(""), (dwAttributes & FILE_ATTRIBUTE_SYSTEM) ? TEXT("S") : TEXT(""), (dwAttributes & ZFILE_ATTRIBUTE_ENCRYPTED) ? TEXT("E") : TEXT(""), (dwAttributes & ZFILE_ATTRIBUTE_COMMENT) ? TEXT("C") : TEXT("")); return szBuffer; } //****************************************************************************** LPCSTR BuildTypeString(FILE_NODE *pFile, LPSTR szType) { // First check to see if we have a known description. if (pFile->szType) { return pFile->szType; } // Locate the file portion of our path. LPCSTR pszFile = GetFileFromPath(pFile->szPathAndMethod); // Get the extension portion of the file. LPCSTR pszExt = MBSRCHR(pszFile, '.'); // If we have an extension create a type name for this file. if (pszExt && *(pszExt + 1)) { strcpy(szType, pszExt + 1); _strupr(szType); strcat(szType, " File"); return szType; } // If no extension, then use the default "File". return "File"; } //****************************************************************************** LPCSTR GetFileFromPath(LPCSTR szPath) { LPCSTR p1 = MBSRCHR(szPath, '/'), p2 = MBSRCHR(szPath, '\\'); if (p1 && (p1 > p2)) { return p1 + 1; } else if (p2) { return p2 + 1; } return szPath; } //****************************************************************************** void ForwardSlashesToBackSlashesA(LPSTR szBuffer) { while (*szBuffer) { if (*szBuffer == '/') { *szBuffer = '\\'; } INCSTR(szBuffer); } } //****************************************************************************** void ForwardSlashesToBackSlashesW(LPWSTR szBuffer) { while (*szBuffer) { if (*szBuffer == L'/') { *szBuffer = L'\\'; } szBuffer++; } } //****************************************************************************** void DeleteDirectory(LPTSTR szPath) { // Make note to where the end of our path is. LPTSTR szEnd = szPath + _tcslen(szPath); // Add our search spec to the path. _tcscpy(szEnd, TEXT("\\*.*")); // Start a directory search. WIN32_FIND_DATA w32fd; HANDLE hFind = FindFirstFile(szPath, &w32fd); // Loop through all entries in this directory. if (hFind != INVALID_HANDLE_VALUE) { do { // Append the file/directory name to the path. _tcscpy(szEnd + 1, w32fd.cFileName); // Check to see if this entry is a subdirectory. if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // Ignore current directory (.) and previous directory (..) if (_tcscmp(w32fd.cFileName, TEXT(".")) && _tcscmp(w32fd.cFileName, TEXT(".."))) { // Recurse into DeleteDirectory() to delete subdirectory. DeleteDirectory(szPath); } // Otherwise, it must be a file. } else { // If the file is marked as read-only, then change to read/write. if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { SetFileAttributes(szPath, FILE_ATTRIBUTE_NORMAL); } // Attempt to delete the file. If we fail and the file used to be // read-only, then set the read-only bit back on it. if (!DeleteFile(szPath) && (w32fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) { SetFileAttributes(szPath, FILE_ATTRIBUTE_READONLY); } } // Get the next directory entry. } while (FindNextFile(hFind, &w32fd)); // Close the directory search. FindClose(hFind); } // Remove the directory. *szEnd = TEXT('\0'); RemoveDirectory(szPath); } //****************************************************************************** //***** Registry Functions //****************************************************************************** void RegWriteKey(HKEY hKeyRoot, LPCTSTR szSubKey, LPCTSTR szValue) { HKEY hKey = NULL; DWORD dwDisposition; if (RegCreateKeyEx(hKeyRoot, szSubKey, 0, NULL, 0, KEY_SET_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { if (szValue) { RegSetValueEx(hKey, NULL, 0, REG_SZ, (LPBYTE)szValue, sizeof(TCHAR) * (_tcslen(szValue) + 1)); } RegCloseKey(hKey); } } //****************************************************************************** BOOL RegReadKey(HKEY hKeyRoot, LPCTSTR szSubKey, LPTSTR szValue, DWORD cBytes) { *szValue = TEXT('\0'); HKEY hKey = NULL; LRESULT lResult = -1; if (RegOpenKeyEx(hKeyRoot, szSubKey, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { lResult = RegQueryValueEx(hKey, NULL, NULL, NULL, (LPBYTE)szValue, &cBytes); RegCloseKey(hKey); } return ((lResult == ERROR_SUCCESS) && *szValue); } //****************************************************************************** void WriteOptionString(LPCTSTR szOption, LPCTSTR szValue) { HKEY hKey = NULL; if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegKey, 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) { RegSetValueEx(hKey, szOption, 0, REG_SZ, (LPBYTE)szValue, sizeof(TCHAR) * (_tcslen(szValue) + 1)); RegCloseKey(hKey); } } //****************************************************************************** void WriteOptionInt(LPCTSTR szOption, DWORD dwValue) { HKEY hKey = NULL; if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegKey, 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) { RegSetValueEx(hKey, szOption, 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD)); RegCloseKey(hKey); } } //****************************************************************************** LPTSTR GetOptionString(LPCTSTR szOption, LPCTSTR szDefault, LPTSTR szValue, DWORD nSize) { HKEY hKey = NULL; LONG lResult = -1; if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegKey, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { lResult = RegQueryValueEx(hKey, szOption, NULL, NULL, (LPBYTE)szValue, &nSize); RegCloseKey(hKey); } if (lResult != ERROR_SUCCESS) { _tcscpy(szValue, szDefault); } return szValue; } //****************************************************************************** DWORD GetOptionInt(LPCTSTR szOption, DWORD dwDefault) { HKEY hKey = NULL; LONG lResult = -1; DWORD dwValue; DWORD nSize = sizeof(dwValue); if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegKey, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { lResult = RegQueryValueEx(hKey, szOption, NULL, NULL, (LPBYTE)&dwValue, &nSize); RegCloseKey(hKey); } return (lResult == ERROR_SUCCESS) ? dwValue : dwDefault; } //****************************************************************************** //***** EDIT Control Subclass Functions //****************************************************************************** void DisableEditing(HWND hWndEdit) { // Make sure the control does not have ES_READONLY or ES_WANTRETURN styles. DWORD dwStyle = (DWORD)GetWindowLong(hWndEdit, GWL_STYLE); if (dwStyle & (ES_READONLY | ES_WANTRETURN)) { SetWindowLong(hWndEdit, GWL_STYLE, dwStyle & ~(ES_READONLY | ES_WANxZ UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;189TRETURN)); } // Subclass the control so we can intercept certain keys. g_wpEdit = (WNDPROC)GetWindowLong(hWndEdit, GWL_WNDPROC); SetWindowLong(hWndEdit, GWL_WNDPROC, (LONG)EditSubclassProc); } //****************************************************************************** LRESULT CALLBACK EditSubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL fCtrl, fShift; switch (uMsg) { // For cut, paste, delete, and undo, the control post itself a message. // we throw away that message. This works as a fail-safe in case we miss // some keystroke that causes one of these operations. This also disables // the context menu on NT from causing one of these actions to occur. case WM_CUT: case WM_PASTE: case WM_CLEAR: case WM_UNDO: MessageBeep(0); return 0; // WM_CHAR is used for normal characters. A-Z, numbers, symbols, enter, // backspace, esc, and tab. In does not include del or movement keys. case WM_CHAR: fCtrl = (GetKeyState(VK_CONTROL) & 0x8000) ? TRUE : FALSE; // We only allow CTRL-C (copy), plain ESC, plain TAB, plain ENTER. if (( fCtrl && (wParam == 3)) || (!fCtrl && (wParam == VK_ESCAPE)) || (!fCtrl && (wParam == VK_RETURN)) || (!fCtrl && (wParam == VK_TAB))) { break; } MessageBeep(0); return 0; // WM_KEYDOWN handles del, insert, arrows, pg up/down, home/end. case WM_KEYDOWN: fCtrl = (GetKeyState(VK_CONTROL) & 0x8000) ? TRUE : FALSE; fShift = (GetKeyState(VK_SHIFT) & 0x8000) ? TRUE : FALSE; // Skip all forms of DELETE, SHIFT-INSERT (paste), // CTRL-RETURN (hard-return), and CTRL-TAB (hard-tab). if (( (wParam == VK_DELETE)) || (fShift && (wParam == VK_INSERT)) || (fCtrl && (wParam == VK_RETURN)) || (fCtrl && (wParam == VK_TAB))) { MessageBeep(0); return 0; } break; } return CallWindowProc(g_wpEdit, hWnd, uMsg, wParam, lParam); } //****************************************************************************** //***** MRU Functions //****************************************************************************** #ifdef _WIN32_WCE int GetMenuString(HMENU hMenu, UINT uIDItem, LPTSTR lpString, int nMaxCount, UINT uFlag) { MENUITEMINFO mii; ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE; mii.dwTypeData = lpString; mii.cch = nMaxCount; return (GetMenuItemInfo(hMenu, uIDItem, uFlag == MF_BYPOSITION, &mii) ? mii.cch : 0); } #endif //****************************************************************************** void InitializeMRU() { TCHAR szMRU[MRU_MAX_FILE][_MAX_PATH + 4], szOption[8]; int i, j; // Get our menu handle. #ifdef _WIN32_WCE HMENU hMenu = GetSubMenu(CommandBar_GetMenu(g_hWndCmdBar, 0), 0); #else HMENU hMenu = GetSubMenu(GetMenu(g_hWndMain), 0); #endif // Read all our current MRUs from the registry. for (i = 0, j = 0; i < MRU_MAX_FILE; i++) { // Build option name for current MRU and read from registry. _stprintf(szOption, TEXT("MRU%d"), i+1); GetOptionString(szOption, TEXT(""), &szMRU[i][3], sizeof(TCHAR) * _MAX_PATH); // If this MRU exists, then add it. if (szMRU[i][3]) { // Build the accelerator prefix for this menu item. szMRU[i][0] = TEXT('&'); szMRU[i][1] = TEXT('1') + j; szMRU[i][2] = TEXT(' '); // Add the item to our menu. InsertMenu(hMenu, 4 + j, MF_BYPOSITION | MF_STRING, MRU_START_ID + j, szMRU[i]); // Increment our actual MRU count. j++; } } } //****************************************************************************** void AddFileToMRU(LPCSTR szFile) { TCHAR szMRU[MRU_MAX_FILE + 1][_MAX_PATH + 4], szOption[8]; int i, j; // Store the new file in our first MRU index. MBSTOTSTR(&szMRU[0][3], szFile, _MAX_PATH); //--------------------------------------------------------------------------- // We first read the current MRU list from the registry, merge in our new // file at the top, and then write back to the registry. The registry merge // is done to allow multiple instances of Pocket UnZip to maintain a global // MRU list independent to this current instance's MRU list. //--------------------------------------------------------------------------- // Read all our current MRUs from the registry. for (i = 1; i <= MRU_MAX_FILE; i++) { // Build option name for current MRU and read from registry. _stprintf(szOption, TEXT("MRU%d"), i); GetOptionString(szOption, TEXT(""), &szMRU[i][3], sizeof(TCHAR) * _MAX_PATH); } // Write our new merged MRU list back to the registry. for (i = 0, j = 0; (i <= MRU_MAX_FILE) && (j < MRU_MAX_FILE); i++) { // If this MRU exists and is different then our new file, then add it. if ((i == 0) || (szMRU[i][3] && _tcsicmp(&szMRU[0][3], &szMRU[i][3]))) { // Build option name for current MRU and write to registry. _stprintf(szOption, TEXT("MRU%d"), ++j); WriteOptionString(szOption, &szMRU[i][3]); } } //--------------------------------------------------------------------------- // The next thing we need to do is read our local MRU from our File menu, // merge in our new file, and store the new list back to our File menu. //--------------------------------------------------------------------------- // Get our menu handle. #ifdef _WIN32_WCE HMENU hMenu = GetSubMenu(CommandBar_GetMenu(g_hWndCmdBar, 0), 0); #else HMENU hMenu = GetSubMenu(GetMenu(g_hWndMain), 0); #endif // Read all our current MRUs from our File Menu. for (i = 1; i <= MRU_MAX_FILE; i++) { // Query our file Menu for a MRU file. if (GetMenuString(hMenu, MRU_START_ID + i - 1, szMRU[i], countof(szMRU[0]), MF_BYCOMMAND)) { // Delete this item from the menu for now. DeleteMenu(hMenu, MRU_START_ID + i - 1, MF_BYCOMMAND); } else { szMRU[i][3] = TEXT('\0'); } } // Write our new merged MRU list back to the File menu. for (i = 0, j = 0; (i <= MRU_MAX_FILE) && (j < MRU_MAX_FILE); i++) { // If this MRU exists and is different then our new file, then add it. if ((i == 0) || (szMRU[i][3] && _tcsicmp(&szMRU[0][3], &szMRU[i][3]))) { // Build the accelerator prefix for this menu item. szMRU[i][0] = TEXT('&'); szMRU[i][1] = TEXT('1') + j; szMRU[i][2] = TEXT(' '); // Add the item to our menu. InsertMenu(hMenu, 4 + j, MF_BYPOSITION | MF_STRING, MRU_START_ID + j, szMRU[i]); // Increment our actual MRU count. j++; } } } //****************************************************************************** void RemoveFileFromMRU(LPCTSTR szFile) { TCHAR szMRU[MRU_MAX_FILE][_MAX_PATH + 4], szOption[8]; int i, j; BOOL fFound; //--------------------------------------------------------------------------- // We first look for this file in our global MRU stored in the registry. We // read the current MRU list from the registry, and then write it back while // removing all occurrances of the file specified. //--------------------------------------------------------------------------- // Read all our current MRUs from the registry. for (i = 0yw UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1, fFound = FALSE; i < MRU_MAX_FILE; i++) { // Build option name for current MRU and read from registry. _stprintf(szOption, TEXT("MRU%d"), i+1); GetOptionString(szOption, TEXT(""), &szMRU[i][3], sizeof(TCHAR) * _MAX_PATH); // Check for a match. if (!_tcsicmp(szFile, &szMRU[i][3])) { szMRU[i][3] = TEXT('\0'); fFound = TRUE; } } // Only write the MRU back to the registry if we found a file to remove. if (fFound) { // Write the updated MRU list back to the registry. for (i = 0, j = 0; i < MRU_MAX_FILE; i++) { // If this MRU still exists, then add it. if (szMRU[i][3]) { // Build option name for current MRU and write to registry. _stprintf(szOption, TEXT("MRU%d"), ++j); WriteOptionString(szOption, &szMRU[i][3]); } } // If our list got smaller, clear the unused items in the registry. while (j++ < MRU_MAX_FILE) { _stprintf(szOption, TEXT("MRU%d"), j); WriteOptionString(szOption, TEXT("")); } } //--------------------------------------------------------------------------- // We next thing we do is look for this file in our local MRU stored in our // File menu. We read the current MRU list from the menu, and then write it // back while removing all occurrances of the file specified. //--------------------------------------------------------------------------- // Get our menu handle. #ifdef _WIN32_WCE HMENU hMenu = GetSubMenu(CommandBar_GetMenu(g_hWndCmdBar, 0), 0); #else HMENU hMenu = GetSubMenu(GetMenu(g_hWndMain), 0); #endif // Read all our current MRUs from our File Menu. for (i = 0, fFound = FALSE; i < MRU_MAX_FILE; i++) { // Query our file Menu for a MRU file. if (!GetMenuString(hMenu, MRU_START_ID + i, szMRU[i], countof(szMRU[0]), MF_BYCOMMAND)) { szMRU[i][3] = TEXT('\0'); } // Check for a match. if (!_tcsicmp(szFile, &szMRU[i][3])) { szMRU[i][3] = TEXT('\0'); fFound = TRUE; } } // Only update menu if we found a file to remove. if (fFound) { // Clear out our menu's MRU list. for (i = MRU_START_ID; i < (MRU_START_ID + MRU_MAX_FILE); i++) { DeleteMenu(hMenu, i, MF_BYCOMMAND); } // Write the rest of our MRU list back to the menu. for (i = 0, j = 0; i < MRU_MAX_FILE; i++) { // If this MRU still exists, then add it. if (szMRU[i][3]) { // Build the accelerator prefix for this menu item. szMRU[i][0] = TEXT('&'); szMRU[i][1] = TEXT('1') + j; szMRU[i][2] = TEXT(' '); // Add the item to our menu. InsertMenu(hMenu, 4 + j, MF_BYPOSITION | MF_STRING, MRU_START_ID + j, szMRU[i]); // Increment our actual MRU count. j++; } } } } //****************************************************************************** void ActivateMRU(UINT uIDItem) { TCHAR szFile[_MAX_PATH + 4]; // Get our menu handle. #ifdef _WIN32_WCE HMENU hMenu = GetSubMenu(CommandBar_GetMenu(g_hWndCmdBar, 0), 0); #else HMENU hMenu = GetSubMenu(GetMenu(g_hWndMain), 0); #endif // Query our menu for the selected MRU. if (GetMenuString(hMenu, uIDItem, szFile, countof(szFile), MF_BYCOMMAND)) { // Move past 3 character accelerator prefix and open the file. ReadZipFileList(&szFile[3]); } } //****************************************************************************** //***** Open Zip File Functions //****************************************************************************** void ReadZipFileList(LPCTSTR wszPath) { // Show wait cursor. HCURSOR hCur = SetCursor(LoadCursor(NULL, IDC_WAIT)); TSTRTOMBS(g_szZipFile, wszPath, countof(g_szZipFile)); // Update our banner to show that we are loading. g_fLoading = TRUE; DrawBanner(NULL); // Update our caption to show that we are loading. SetCaptionText(TEXT("Loading")); // Clear our list view. ListView_DeleteAllItems(g_hWndList); // Ghost all our Unzip related menu items. EnableAllMenuItems(IDM_FILE_PROPERTIES, FALSE); EnableAllMenuItems(IDM_ACTION_EXTRACT, FALSE); EnableAllMenuItems(IDM_ACTION_EXTRACT_ALL, FALSE); EnableAllMenuItems(IDM_ACTION_TEST, FALSE); EnableAllMenuItems(IDM_ACTION_TEST_ALL, FALSE); EnableAllMenuItems(IDM_ACTION_VIEW, FALSE); EnableAllMenuItems(IDM_ACTION_SELECT_ALL, FALSE); EnableAllMenuItems(IDM_VIEW_COMMENT, FALSE); // Let Info-ZIP and our callbacks do the work. SendMessage(g_hWndList, WM_SETREDRAW, FALSE, 0); int result = DoListFiles(g_szZipFile); SendMessage(g_hWndList, WM_SETREDRAW, TRUE, 0); // Restore/remove cursor. SetCursor(hCur); // Update our column widths ResizeColumns(); if ((result == PK_OK) || (result == PK_WARN)) { // Sort the items by name. Sort(0, TRUE); // Update this file to our MRU list and menu. AddFileToMRU(g_szZipFile); // Enabled the comment button if the zip file has a comment. if (lpUserFunctions->cchComment) { EnableAllMenuItems(IDM_VIEW_COMMENT, TRUE); } // Update other items that are related to having a Zip file loaded. EnableAllMenuItems(IDM_ACTION_EXTRACT_ALL, TRUE); EnableAllMenuItems(IDM_ACTION_TEST_ALL, TRUE); EnableAllMenuItems(IDM_ACTION_SELECT_ALL, TRUE); } else { // Make sure we didn't partially load and added a few files. ListView_DeleteAllItems(g_hWndList); // If the file itself is bad or missing, then remove it from our MRU. if ((result == PK_ERR) || (result == PK_BADERR) || (result == PK_NOZIP) || (result == PK_FIND) || (result == PK_EOF)) { RemoveFileFromMRU(wszPath); } // Display an error. TCHAR szError[_MAX_PATH + 128]; _stprintf(szError, TEXT("Failure loading \"%s\".\n\n"), wszPath); _tcscat(szError, GetZipErrorString(result)); MessageBox(g_hWndMain, szError, g_szAppName, MB_OK | MB_ICONERROR); // Clear our file status. *g_szZipFile = '\0'; } // Update our caption to show that we are done loading. SetCaptionText(NULL); // Update our banner to show that we are done loading. g_fLoading = FALSE; DrawBanner(NULL); } //****************************************************************************** //***** Zip File Properties Dialog Functions //****************************************************************************** BOOL CALLBACK DlgProcProperties(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { // Add "General" and "Comments" tabs to tab control. We are using a // poor man's version of a property sheet. We display our 2 pages // by showing and hiding controls as necessary. For our purposes, // this is much easier than dealing with separate property pages. TC_ITEM tci; tci.mask = TCIF_TEXT; tci.pszText = TEXT("General"); TabCtrl_InsertItem(GetDlgItem(hDlg, IDC_TAB), 0, &tci); tci.pszText = TEXT("Comment"); TabCtrl_InsertItem(GetDlgItem(hDlg, IDC_TAB), 1, &tci); #ifdef _WIN32_WCE // Add "Ok" button to caption bar. SetWindowLong(hDlg, GWL_EXSTYLE, WS_EX_CAPTIONOKBTN | GetWindowLong(hDlg, GWL_EXSTYLE)); #endif // Center us over our parent. CenterWindow(hDlg); int directory = -1, readOnly = -1, archz!H[ UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1Jive = -1, hidden = -1; int system = -1, encrypted = -1; int year = -1, month = -1, day = -1, hour = -1, minute = -1, pm = -1; zusz_t uzSize = 0, uzCompressedSize = 0; LPCSTR szPath = NULL, szMethod = NULL, szComment = NULL; DWORD dwCRC = 0, dwCount = 0, dwCommentCount = 0; TCHAR szBuffer[MAX_PATH]; // Loop through all selected items. LV_ITEM lvi; ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_PARAM; lvi.iItem = -1; while ((lvi.iItem = ListView_GetNextItem(g_hWndList, lvi.iItem, LVNI_SELECTED)) != -1) { // Get the FILE_NODE for the selected item. ListView_GetItem(g_hWndList, &lvi); FILE_NODE *pFile = (FILE_NODE*)lvi.lParam; // Merge this file's attributes into our accumulative attributes. MergeValues(&directory, (pFile->dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0); MergeValues(&readOnly, (pFile->dwAttributes & FILE_ATTRIBUTE_READONLY) != 0); MergeValues(&archive, (pFile->dwAttributes & FILE_ATTRIBUTE_ARCHIVE) != 0); MergeValues(&hidden, (pFile->dwAttributes & FILE_ATTRIBUTE_HIDDEN) != 0); MergeValues(&system, (pFile->dwAttributes & FILE_ATTRIBUTE_SYSTEM) != 0); MergeValues(&encrypted, (pFile->dwAttributes & ZFILE_ATTRIBUTE_ENCRYPTED) != 0); // Merge this file's date/time into our accumulative date/time. int curHour = (pFile->dwModified >> 6) & 0x001F; MergeValues(&year, (pFile->dwModified >> 20) & 0x0FFF); MergeValues(&month, (pFile->dwModified >> 16) & 0x000F); MergeValues(&day, (pFile->dwModified >> 11) & 0x001F); MergeValues(&hour, (curHour % 12) ? (curHour % 12) : 12); MergeValues(&minute, pFile->dwModified & 0x003F); MergeValues(&pm, curHour >= 12); // Store this file's name. szPath = pFile->szPathAndMethod; // Store this file's CRC. dwCRC = pFile->dwCRC; // Add the size and compressed size to our accumulative sizes. uzSize += pFile->uzSize; uzCompressedSize += pFile->uzCompressedSize; // Merge in our compression method. LPCSTR szCurMethod = pFile->szPathAndMethod + strlen(pFile->szPathAndMethod) + 1; if ((szMethod == NULL) || !strcmp(szMethod, szCurMethod)) { szMethod = szCurMethod; } else { szMethod = "Multiple Methods"; } // Increment our file count. dwCount++; // Increment our comment count if this file has a comment. if (pFile->szComment) { szComment = pFile->szComment; dwCommentCount++; } }; if (dwCount > 1) { // If multiple items selected, then display a selected count string // in place of the file name. _stprintf(szBuffer, TEXT("%u items selected."), dwCount); SetDlgItemText(hDlg, IDC_FILE, szBuffer); // Display "Multiple" for CRC if multiple items selected. SetDlgItemText(hDlg, IDC_CRC, TEXT("Multiple CRCs")); } else { // Set the file name text for the single item selected. MBSTOTSTR(szBuffer, szPath, countof(szBuffer)); ForwardSlashesToBackSlashes(szBuffer); SetDlgItemText(hDlg, IDC_FILE, szBuffer); // Set the CRC text for the single item selected. _stprintf(szBuffer, TEXT("0x%08X"), dwCRC); SetDlgItemText(hDlg, IDC_CRC, szBuffer); } // Set the Size tally text. FormatValue(szBuffer, uzSize); _tcscat(szBuffer, (dwCount > 1) ? TEXT(" bytes total") : TEXT(" bytes")); SetDlgItemText(hDlg, IDC_FILE_SIZE, szBuffer); // Set the Compressed Size tally text. FormatValue(szBuffer, uzCompressedSize); _tcscat(szBuffer, (dwCount > 1) ? TEXT(" bytes total") : TEXT(" bytes")); SetDlgItemText(hDlg, IDC_COMPRESSED_SIZE, szBuffer); // Set the Compression Factor text. int factor = ratio(uzSize, uzCompressedSize); _stprintf(szBuffer, TEXT("%d.%d%%"), factor / 10, ((factor < 0) ? -factor : factor) % 10); SetDlgItemText(hDlg, IDC_COMPRESSON_FACTOR, szBuffer); // Set the Compression Method text. MBSTOTSTR(szBuffer, szMethod, countof(szBuffer)); SetDlgItemText(hDlg, IDC_COMPRESSION_METHOD, szBuffer); // Set the Attribute check boxes. CheckThreeStateBox(hDlg, IDC_DIRECTORY, directory); CheckThreeStateBox(hDlg, IDC_READONLY, readOnly); CheckThreeStateBox(hDlg, IDC_ARCHIVE, archive); CheckThreeStateBox(hDlg, IDC_HIDDEN, hidden); CheckThreeStateBox(hDlg, IDC_SYSTEM, system); CheckThreeStateBox(hDlg, IDC_ENCRYPTED, encrypted); // Build and set the Modified Date text. The MS compiler does not // consider "??/" to be a valid string. "??/" is a trigraph that is // turned into "\" by the preprocessor and causes grief for the compiler. LPTSTR psz = szBuffer; psz += ((month < 0) ? _stprintf(psz, TEXT("?\?/")) : _stprintf(psz, TEXT("%u/"), month)); psz += ((day < 0) ? _stprintf(psz, TEXT("?\?/")) : _stprintf(psz, TEXT("%u/"), day)); psz += ((year < 0) ? _stprintf(psz, TEXT("?\? ")) : _stprintf(psz, TEXT("%u "), year % 100)); psz += ((hour < 0) ? _stprintf(psz, TEXT("?\?:")) : _stprintf(psz, TEXT("%u:"), hour)); psz += ((minute < 0) ? _stprintf(psz, TEXT("?\? ")) : _stprintf(psz, TEXT("%02u "), minute)); psz += ((pm < 0) ? _stprintf(psz, TEXT("?M")) : _stprintf(psz, TEXT("%cM"), pm ? TEXT('P') : TEXT('A'))); SetDlgItemText(hDlg, IDC_MODIFIED, szBuffer); // Store a global handle to our edit control. g_hWndEdit = GetDlgItem(hDlg, IDC_COMMENT); // Disable our edit box from being edited. DisableEditing(g_hWndEdit); // Stuff the appropriate message into the Comment edit control. if (dwCommentCount == 0) { if (dwCount == 1) { AddTextToEdit("This file does not have a comment."); } else { AddTextToEdit("None of the selected files have a comment."); } } else if (dwCount == 1) { AddTextToEdit(szComment); } else { CHAR szTemp[64]; _stprintf(szBuffer, TEXT("%u of the selected files %s a comment."), dwCommentCount, (dwCommentCount == 1)? TEXT("has") : TEXT("have")); TSTRTOMBS(szTemp, szBuffer, countof(szTemp)); AddTextToEdit(szTemp); } g_hWndEdit = NULL; // Whooh, done with WM_INITDIALOG return TRUE; } case WM_NOTIFY: // Check to see if tab control was changed to new tab. if (((NMHDR*)lParam)->code == TCN_SELCHANGE) { HWND hWndTab = ((NMHDR*)lParam)->hwndFrom; HWND hWndComment = GetDlgItem(hDlg, IDC_COMMENT); HWND hWnd = GetWindow(hDlg, GW_CHILD); // If General tab selected, hide comment edit box and show all other controls. if (TabCtrl_GetCurSel(hWndTab) == 0) {|k UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1{ while (hWnd) { ShowWindow(hWnd, ((hWnd == hWndTab) || (hWnd != hWndComment)) ? SW_SHOW : SW_HIDE); hWnd = GetWindow(hWnd, GW_HWNDNEXT); } // If Comment tab selected, hide all controls except comment edit box. } else { while (hWnd) { ShowWindow(hWnd, ((hWnd == hWndTab) || (hWnd == hWndComment)) ? SW_SHOW : SW_HIDE); hWnd = GetWindow(hWnd, GW_HWNDNEXT); } } } return FALSE; case WM_COMMAND: // Exit the dialog on OK (Enter) or CANCEL (Esc). if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)) { EndDialog(hDlg, LOWORD(wParam)); } return FALSE; } return FALSE; } //****************************************************************************** void MergeValues(int *p1, int p2) { if ((*p1 == -1) || (*p1 == p2)) { *p1 = p2; } else { *p1 = -2; } } //****************************************************************************** void CheckThreeStateBox(HWND hDlg, int nIDButton, int state) { CheckDlgButton(hDlg, nIDButton, (state == 0) ? BST_UNCHECKED : (state == 1) ? BST_CHECKED : BST_INDETERMINATE); } //****************************************************************************** //***** Extract/Test Dialog Functions //****************************************************************************** void ExtractOrTestFiles(BOOL fExtract) { EXTRACT_INFO ei; ZeroMemory(&ei, sizeof(ei)); // Set our Extract or Test flag. ei.fExtract = fExtract; // Get the number of selected items and make sure we have at least one item. if ((ei.dwFileCount = ListView_GetSelectedCount(g_hWndList)) <= 0) { return; } // If we are not extracting/testing all, then create and buffer large enough to // hold the file list for all the selected files. if ((int)ei.dwFileCount != ListView_GetItemCount(g_hWndList)) { ei.szFileList = new LPSTR[ei.dwFileCount + 1]; if (!ei.szFileList) { MessageBox(g_hWndMain, GetZipErrorString(PK_MEM), g_szAppName, MB_ICONERROR | MB_OK); return; } } ei.dwFileCount = 0; ei.uzByteCount = 0; LV_ITEM lvi; ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_PARAM; lvi.iItem = -1; // Walk through all the selected files to build our counts and set our file // list pointers into our FILE_NODE paths for each selected item. while ((lvi.iItem = ListView_GetNextItem(g_hWndList, lvi.iItem, LVNI_SELECTED)) >= 0) { ListView_GetItem(g_hWndList, &lvi); if (ei.szFileList) { ei.szFileList[ei.dwFileCount] = ((FILE_NODE*)lvi.lParam)->szPathAndMethod; } ei.dwFileCount++; ei.uzByteCount += ((FILE_NODE*)lvi.lParam)->uzSize; } if (ei.szFileList) { ei.szFileList[ei.dwFileCount] = NULL; } // If we are extracting, display the extract dialog to query for parameters. if (!fExtract || (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_EXTRACT), g_hWndMain, (DLGPROC)DlgProcExtractOrTest, (LPARAM)&ei) == IDOK)) { // Display our progress dialog and do the extraction/test. DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_EXTRACT_PROGRESS), g_hWndMain, (DLGPROC)DlgProcExtractProgress, (LPARAM)&ei); } // Free our file list buffer if we created one. if (ei.szFileList) { delete[] ei.szFileList; } } //****************************************************************************** BOOL CALLBACK DlgProcExtractOrTest(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static EXTRACT_INFO *pei; TCHAR szPath[_MAX_PATH]; switch (uMsg) { case WM_INITDIALOG: // Store our extract information structure. pei = (EXTRACT_INFO*)lParam; // Load our settings. pei->fRestorePaths = GetOptionInt(TEXT("RestorePaths"), TRUE); pei->overwriteMode = (OVERWRITE_MODE)GetOptionInt(TEXT("OverwriteMode"), OM_PROMPT); // Load and set our path string. GetOptionString(TEXT("ExtractToDirectory"), TEXT("\\"), szPath, sizeof(szPath)); SetDlgItemText(hDlg, IDC_EXTRACT_TO, szPath); // Set the state of all the controls. SetDlgItemText(hDlg, IDC_FILE_COUNT, FormatValue(szPath, pei->dwFileCount)); SetDlgItemText(hDlg, IDC_BYTE_COUNT, FormatValue(szPath, pei->uzByteCount)); CheckDlgButton(hDlg, IDC_RESTORE_PATHS, pei->fRestorePaths); CheckDlgButton(hDlg, IDC_OVERWRITE_PROMPT, pei->overwriteMode == OM_PROMPT); CheckDlgButton(hDlg, IDC_OVERWRITE_NEWER, pei->overwriteMode == OM_NEWER); CheckDlgButton(hDlg, IDC_OVERWRITE_ALWAYS, pei->overwriteMode == OM_ALWAYS); CheckDlgButton(hDlg, IDC_OVERWRITE_NEVER, pei->overwriteMode == OM_NEVER); // Limit our edit control to max path. SendDlgItemMessage(hDlg, IDC_EXTRACT_TO, EM_LIMITTEXT, sizeof(szPath) - 1, 0); // Center our dialog. CenterWindow(hDlg); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: // Force us to read and validate the extract to directory. SendMessage(hDlg, WM_COMMAND, MAKELONG(IDC_EXTRACT_TO, EN_KILLFOCUS), 0); // Get our current path string. GetDlgItemText(hDlg, IDC_EXTRACT_TO, szPath, countof(szPath)); // Verify our "extract to" path is valid. if (!SetExtractToDirectory(szPath)) { MessageBox(hDlg, TEXT("The directory you entered is invalid or does not exist."), g_szAppName, MB_ICONERROR | MB_OK); SetFocus(GetDlgItem(hDlg, IDC_EXTRACT_TO)); return FALSE; } // Query other control values. pei->fRestorePaths = IsDlgButtonChecked(hDlg, IDC_RESTORE_PATHS); pei->overwriteMode = IsDlgButtonChecked(hDlg, IDC_OVERWRITE_NEWER) ? OM_NEWER : IsDlgButtonChecked(hDlg, IDC_OVERWRITE_ALWAYS) ? OM_ALWAYS : IsDlgButtonChecked(hDlg, IDC_OVERWRITE_NEVER) ? OM_NEVER : OM_PROMPT; // Write our settings. WriteOptionInt(TEXT("RestorePaths"), pei->fRestorePaths); WriteOptionInt(TEXT("OverwriteMode"), pei->overwriteMode); WriteOptionString(TEXT("ExtractToDirectory"), szPath); // Fall through to IDCANCEL case IDCANCEL: EndDialog(hDlg, LOWORD(wParam)); return FALSE; case IDC_EXTRACT_TO: // Make sure the path ends in a wack (\). if (HIWORD(wParam) == EN_KILLFOCUS) { GetDlgItemText(hDlg, IDC_EXTRACT_TO, szPath, countof(szPath)); size_t length = _tcslen(szPath); if ((length == 0) || szPath[length - 1] != TEXT('\\')) { szPath[length ] = TEXT('\\'); szPath[length + 1] = TEXT('\0'); SetDlgItemText(hDlg, IDC_EXTRACT_TO, szPath); } } return FALSE; case IDC_BROWSE: GetDlgItemText(hDlg, IDC_EXTRACT_TO, szPath, countof(szPath)); if (FolderBrowser(szPath, countof(szPath))) { SetDlgItemText(hDlg, |+\/ UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1JIDC_EXTRACT_TO, szPath); } return FALSE; } return FALSE; } return FALSE; } //****************************************************************************** //***** Folder Browsing Dialog Functions //****************************************************************************** BOOL FolderBrowser(LPTSTR szPath, DWORD dwLength) { #ifdef _WIN32_WCE // On Windows CE, we use a common save-as dialog to query the diretory. We // display the dialog in this function, and then we sublass it. Our subclass // functions tweaks the dialog a bit and and returns the path. ForwardSlashesToBackSlashes(szPath); TCHAR szInitialDir[_MAX_PATH]; _tcscpy(szInitialDir, szPath); // Remove trailing wacks from path - The common dialog doesn't like them. size_t length = _tcslen(szInitialDir); while ((length > 0) && (szInitialDir[length - 1] == TEXT('\\'))) { szInitialDir[--length] = TEXT('\0'); } // Set up the parameters for our save-as dialog. OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = g_hWndMain; ofn.hInstance = g_hInst; ofn.lpstrFilter = TEXT(" \0!\0"); ofn.nFilterIndex = 1; ofn.lpstrFile = szPath; ofn.nMaxFile = dwLength; ofn.lpstrInitialDir = *szInitialDir ? szInitialDir : NULL; ofn.lpstrTitle = TEXT("Extract To"); ofn.Flags = OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_NOTESTFILECREATE; // Post a message to our main window telling it that we are about to create // a save as dialog. Our main window will receive this message after the // save as dialog is created. This gives us a change to subclass the save as // dialog. PostMessage(g_hWndMain, WM_PRIVATE, MSG_SUBCLASS_DIALOG, 0); // Create and display the common save-as dialog. if (GetSaveFileName(&ofn)) { // If success, then remove are special "!" filename from the end. szPath[_tcslen(szPath) - 1] = TEXT('\0'); return TRUE; } return FALSE; #else // !_WIN32_WCE // On Windows NT, the shell provides us with a nice folder browser dialog. // We don't need to jump through any hoops to make it work like on Windows CE. // The only problem is that on VC 4.0, the libraries don't export the UNICODE // shell APIs because only Win95 had a shell library at the time. The // following code requires headers and libs from VC 4.2 or later. // Set up our BROWSEINFO structure. BROWSEINFO bi; ZeroMemory(&bi, sizeof(bi)); bi.hwndOwner = g_hWndMain; bi.pszDisplayName = szPath; bi.lpszTitle = TEXT("Extract To"); bi.ulFlags = BIF_RETURNONLYFSDIRS; // Prompt user for path. LPITEMIDLIST piidl = SHBrowseForFolder(&bi); if (!piidl) { return FALSE; } // Build path string. SHGetPathFromIDList(piidl, szPath); // Free the PIDL returned by SHBrowseForFolder. LPMALLOC pMalloc = NULL; SHGetMalloc(&pMalloc); pMalloc->Free(piidl); // Add trailing wack if one is not present. size_t length = _tcslen(szPath); if ((length > 0) && (szPath[length - 1] != TEXT('\\'))) { szPath[length++] = TEXT('\\'); szPath[length] = TEXT('\0'); } return TRUE; #endif // _WIN32_WCE } //****************************************************************************** #ifdef _WIN32_WCE BOOL CALLBACK DlgProcBrowser(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { // This is our subclass of Windows CE's common save-as dialog. We intercept // the messages we care about and forward everything else to the original // window procedure for the dialog. if (uMsg == WM_PRIVATE) { // wParam always equals MSG_INIT_DIALOG RECT rc1, rc2; // Get the window rectangle for the name edit control. HWND hWnd = GetDlgItem(hDlg, IDC_SAVE_NAME_EDIT); GetWindowRect(hWnd, &rc1); POINT pt1 = { rc1.left, rc1.top }; ScreenToClient(hDlg, &pt1); // Hide all the windows we don't want. ShowWindow(hWnd, SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_SAVE_NAME_PROMPT), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_SAVE_TYPE_PROMPT), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_SAVE_TYPE_LIST), SW_HIDE); // Get the window rectangle for the file list. hWnd = GetDlgItem(hDlg, IDC_SAVE_FILE_LIST); GetWindowRect(hWnd, &rc2); POINT pt2 = { rc2.left, rc2.top }; ScreenToClient(hDlg, &pt2); // Resize the file list to fill the dialog. MoveWindow(hWnd, pt2.x, pt2.y, rc2.right - rc2.left, rc1.bottom - rc2.top, TRUE); } else if ((uMsg == WM_COMMAND) && (LOWORD(wParam) == IDOK)) { // Get our file list window. HWND hWnd = GetDlgItem(hDlg, IDC_SAVE_FILE_LIST); // Check to see if a directory is selected. if (ListView_GetNextItem(hWnd, -1, LVNI_SELECTED) >= 0) { // If a directory is highlighted, then we post ourself a "Ok". The "Ok" // we are processing now will cause us to change into the highlighted // directory, and our posted "Ok" will close the dialog in that directory. PostMessage(hDlg, uMsg, wParam, lParam); } else { // If no directory is selected, then enter the imaginary filename "!" // into the name edit control and let the "Ok" end this dialog. The // result will be the correct path with a "\!" at the end. SetDlgItemText(hDlg, IDC_SAVE_NAME_EDIT, TEXT("!")); } } // Pass all messages to the base control's window proc. return CallWindowProc(g_wpSaveAsDlg, hDlg, uMsg, wParam, lParam); } #endif // _WIN32_WCE //****************************************************************************** #ifdef _WIN32_WCE void SubclassSaveAsDlg() { // Get our current thread ID so we can compare it to other thread IDs. DWORD dwThreadId = GetCurrentThreadId(); // Get the the top window in the z-order that is a child of the desktop. // Dialogs are always children of the desktop on CE. This first window // should be the dialog we are looking for, but we will walk the window list // just in case. HWND hWnd = GetWindow(g_hWndMain, GW_HWNDFIRST); // Walk the window list. while (hWnd) { // Check to see if this window was created by us and has controls from a // common "save as" dialog. if ((GetWindowThreadProcessId(hWnd, NULL) == dwThreadId) && GetDlgItem(hWnd, IDC_SAVE_FILE_LIST) && GetDlgItem(hWnd, IDC_SAVE_NAME_EDIT)) { // We found our dialog. Subclass it. g_wpSaveAsDlg = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC); SetWindowLong(hWnd, GWL_WNDPROC, (LONG)DlgProcBrowser); // Send our new dialog a message so it can do its initialization. SendMessage(hWnd, WM_PRIVATE, MSG_INIT_DIALOG, 0); } // Get the next window in our window list. hWnd = GetWindow(hWnd, GW_HWNDNEXT); } } #endif // _WIN32_WCE //****************************************************************************** //***** Extraction/Test/View Progress Dialog Functions //****************************************************************************** BOOL CALLBACK DlgProcExtractProgress(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static EXTRACT_INFO *pei; static BOOL fComplete; static HWND hWndButton; TCHAR szBuffer[32]; switch (uMsg) { case WM_INITDIALOG: // Globally store our handle so our worker thread can post to us. g_hDlgProgress = hDlg; // Get a pointer to our extract information structure. pei = (EXTRACT_INFO*)lParam; } UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1F // Clear our complete flag. It will be set to TRUE when done. fComplete = FALSE; // Get and store our edit control. g_hWndEdit = GetDlgItem(hDlg, IDC_LOG); // Disable our edit box from being edited. DisableEditing(g_hWndEdit); // Store a static handle for our Abort/Close button. hWndButton = GetDlgItem(hDlg, IDCANCEL); #ifdef _WIN32_WCE // Set our No-Drag style SetWindowLong(hDlg, GWL_EXSTYLE, WS_EX_NODRAG |GetWindowLong(hDlg, GWL_EXSTYLE)); RECT rc1, rc2, rcEdit; // Get our current client size. GetClientRect(hDlg, &rc1); // Get the window rectangle for the edit control in client coordinates. GetWindowRect(g_hWndEdit, &rcEdit); ScreenToClient(hDlg, ((POINT*)&rcEdit)); ScreenToClient(hDlg, ((POINT*)&rcEdit) + 1); // Resize our dialog to be full screen (same size as parent). GetWindowRect(g_hWndMain, &rc2); MoveWindow(hDlg, rc2.left, rc2.top, rc2.right - rc2.left, rc2.bottom - rc2.top + 1, FALSE); // Get our new client size. GetClientRect(hDlg, &rc2); // Resize our edit box to fill the client. MoveWindow(g_hWndEdit, rcEdit.left, rcEdit.top, (rcEdit.right - rcEdit.left) + (rc2.right - rc1.right), (rcEdit.bottom - rcEdit.top) + (rc2.bottom - rc1.bottom), FALSE); #else // On NT, we just center our dialog over our parent. CenterWindow(hDlg); #endif // Store some globals until the extract/test finishes. pei->hWndEditFile = GetDlgItem(hDlg, IDC_FILE); pei->hWndProgFile = GetDlgItem(hDlg, IDC_FILE_PROGRESS); pei->hWndProgTotal = GetDlgItem(hDlg, IDC_TOTAL_PROGRESS); pei->hWndPercentage = GetDlgItem(hDlg, IDC_PERCENTAGE); pei->hWndFilesProcessed = GetDlgItem(hDlg, IDC_FILES_PROCESSED); pei->hWndBytesProcessed = GetDlgItem(hDlg, IDC_BYTES_PROCESSED); if (pei->fExtract) { // Set our main window's caption. SetCaptionText(TEXT("Extracting")); } else { // Set our main window's caption. SetCaptionText(TEXT("Testing")); // Hide the current file progress for test since it never moves. ShowWindow(pei->hWndProgFile, SW_HIDE); } // Set the ranges on our progress bars. SendMessage(pei->hWndProgFile, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESS_MAX)); SendMessage(pei->hWndProgTotal, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESS_MAX)); // Set our file and byte totals. SetDlgItemText(hDlg, IDC_FILES_TOTAL, FormatValue(szBuffer, pei->dwFileCount)); SetDlgItemText(hDlg, IDC_BYTES_TOTAL, FormatValue(szBuffer, pei->uzByteCount)); // Launch our Extract/Test thread and wait for WM_PRIVATE DoExtractOrTestFiles(g_szZipFile, pei); return TRUE; case WM_PRIVATE: // Sent with wParam equal to MSG_OPERATION_COMPLETE when // test/extract is complete. // Check to see if the operation was a success if ((pei->result == PK_OK) || (pei->result == PK_WARN)) { // Set all our fields to their "100%" settings. SendMessage(pei->hWndProgFile, PBM_SETPOS, PROGRESS_MAX, 0); SendMessage(pei->hWndProgTotal, PBM_SETPOS, PROGRESS_MAX, 0); SetWindowText(pei->hWndPercentage, TEXT("100%")); SetDlgItemText(hDlg, IDC_FILES_PROCESSED, FormatValue(szBuffer, pei->dwFileCount)); SetDlgItemText(hDlg, IDC_BYTES_PROCESSED, FormatValue(szBuffer, pei->uzByteCount)); } // Update our status text. SetWindowText(pei->hWndEditFile, (pei->result == PK_OK) ? TEXT("Completed. There were no warnings or errors.") : (pei->result == PK_WARN) ? TEXT("Completed. There was one or more warnings.") : (pei->result == PK_ABORTED) ? TEXT("Aborted. There may be warnings or errors.") : TEXT("Completed. There was one or more errors.")); // Clear our global edit handle. g_hWndEdit = NULL; // Update our caption to show that we are done extracting/testing. SetCaptionText(NULL); // Change our abort button to now read "Close". SetWindowText(hWndButton, TEXT("&Close")); EnableWindow(hWndButton, TRUE); // Display an error dialog if an error occurred. if ((pei->result != PK_OK) && (pei->result != PK_WARN)) { MessageBox(hDlg, GetZipErrorString(pei->result), g_szAppName, MB_ICONERROR | MB_OK); } // We are done. Allow the user to close the dialog. fComplete = TRUE; return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: // If abort is pressed, then set a flag that our worker thread // periodically checks to decide if it needs to bail out. if (!fComplete && !pei->fAbort) { pei->fAbort = TRUE; SetWindowText(hWndButton, TEXT("Aborting...")); EnableWindow(hWndButton, FALSE); return FALSE; } // fall through to IDOK case IDOK: // Don't allow dialog to close until extract/test is complete. if (fComplete) { g_hDlgProgress = NULL; EndDialog(hDlg, LOWORD(wParam)); } return FALSE; } return FALSE; } return FALSE; } //****************************************************************************** BOOL CALLBACK DlgProcViewProgress(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static EXTRACT_INFO *pei; switch (uMsg) { case WM_INITDIALOG: // Globally store our handle so our worker thread can post to us. g_hDlgProgress = hDlg; // Get a pointer to our extract information structure. pei = (EXTRACT_INFO*)lParam; // Center our dialog over our parent. CenterWindow(hDlg); // Store some globals until the extract finishes. pei->hWndProgFile = GetDlgItem(hDlg, IDC_FILE_PROGRESS); // Set the ranges on our progress bar. SendDlgItemMessage(hDlg, IDC_FILE_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESS_MAX)); // Launch our Extract thread and wait for WM_PRIVATE message. DoExtractOrTestFiles(g_szZipFile, pei); return TRUE; case WM_PRIVATE: // Sent with wParam equal to MSG_OPERATION_COMPLETE when // test/extract is complete. // We are done. Close our dialog. Any errors will be reported by // OnActionView(). g_hDlgProgress = NULL; EndDialog(hDlg, LOWORD(wParam)); return FALSE; case WM_COMMAND: // If abort is pressed, then set a flag that our worker thread // periodically checks to decide if it needs to bail out. if ((LOWORD(wParam) == IDCANCEL) && !pei->fAbort) { pei->fAbort = TRUE; SetWindowText(GetDlgItem(hDlg, IDCANCEL), TEXT("Aborting...")); EnableWindow(GetDlgItem(hDlg, IDCANCEL), FALSE); return FALSE; ~S UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;1s } } return FALSE; } //****************************************************************************** void UpdateProgress(EXTRACT_INFO *pei, BOOL fFull) { DWORD dwFile, dwTotal, dwPercentage; TCHAR szBuffer[_MAX_PATH + 32]; // Compute our file progress bar position. if (pei->uzBytesTotalThisFile) { dwFile = (DWORD)(((DWORDLONG)PROGRESS_MAX * (DWORDLONG)pei->uzBytesWrittenThisFile) / (DWORDLONG)pei->uzBytesTotalThisFile); } else { dwFile = PROGRESS_MAX; } // Set our file progress indicators. SendMessage(pei->hWndProgFile, PBM_SETPOS, dwFile, 0); // If we are only updating our View Progress dialog, then we are done. if (!pei->hWndProgTotal) { return; } // Compute our total progress bar position. dwTotal = (DWORD)(((DWORDLONG)PROGRESS_MAX * (DWORDLONG)(pei->uzBytesWrittenPreviousFiles + pei->uzBytesWrittenThisFile + pei->dwFile)) / (DWORDLONG)(pei->uzByteCount + pei->dwFileCount)); dwPercentage = dwTotal / (PROGRESS_MAX / 100); // Set our total progress indicators. SendMessage(pei->hWndProgTotal, PBM_SETPOS, dwTotal, 0); // Set our total percentage text. _stprintf(szBuffer, TEXT("%u%%"), dwPercentage); SetWindowText(pei->hWndPercentage, szBuffer); // Set our current file and byte process counts. FormatValue(szBuffer, pei->dwFile - 1); SetWindowText(pei->hWndFilesProcessed, szBuffer); FormatValue(szBuffer, pei->uzBytesWrittenPreviousFiles + pei->uzBytesWrittenThisFile); SetWindowText(pei->hWndBytesProcessed, szBuffer); if (fFull) { // Build our message string. _tcscpy(szBuffer, pei->fExtract ? TEXT("Extract") : TEXT("Test")); size_t preflen = _tcslen(szBuffer); MBSTOTSTR(szBuffer+preflen, pei->szFile,countof(szBuffer)-preflen); // Change all forward slashes to back slashes in the buffer. ForwardSlashesToBackSlashes(szBuffer); // Update the file name in our dialog. SetWindowText(pei->hWndEditFile, szBuffer); } } //****************************************************************************** //***** Replace File Dialog Functions //****************************************************************************** int PromptToReplace(LPCSTR szPath) { // Check to see if we are extracting for view only. if (g_fViewing) { // Build prompt. TCHAR szMessage[_MAX_PATH + 128]; _stprintf(szMessage, #ifdef UNICODE TEXT("A file named \"%S\" has already been extracted for viewing. ") #else TEXT("A file named \"%s\" has already been extracted for viewing. ") #endif TEXT("That file might be opened and locked for viewing by another application.\n\n") TEXT("Would you like to attempt to overwrite it with the new file?"), GetFileFromPath(szPath)); // Display prompt. if (IDYES == MessageBox(g_hDlgProgress, szMessage, g_szAppName, MB_ICONWARNING | MB_YESNO)) { // Tell Info-ZIP to continue with extraction. return IDM_REPLACE_YES; } // Remember that the file was skipped and tell Info-ZIP to abort extraction. g_fSkipped = TRUE; return IDM_REPLACE_NO; } // Otherwise, do the normal replace prompt dialog. return DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_REPLACE), g_hWndMain, (DLGPROC)DlgProcReplace, (LPARAM)szPath); } //****************************************************************************** BOOL CALLBACK DlgProcReplace(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { TCHAR szMessage[_MAX_PATH + 32]; switch (uMsg) { case WM_INITDIALOG: // Play the question tone to alert the user. MessageBeep(MB_ICONQUESTION); // Display a message with the file name. #ifdef UNICODE _stprintf(szMessage, TEXT("\"%S\" already exists."), (LPCSTR)lParam); #else _stprintf(szMessage, TEXT("\"%s\" already exists."), (LPCSTR)lParam); #endif // Change all forward slashes to back slashes in the buffer. ForwardSlashesToBackSlashes(szMessage); // Display the file string. SetDlgItemText(hDlg, IDC_FILE, szMessage); // Center our dialog over our parent. CenterWindow(hDlg); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: case IDOK: EndDialog(hDlg, IDM_REPLACE_NO); break; case IDM_REPLACE_ALL: case IDM_REPLACE_NONE: case IDM_REPLACE_YES: case IDM_REPLACE_NO: EndDialog(hDlg, wParam); break; } return FALSE; } return FALSE; } //****************************************************************************** //***** Password Dialog Functions //****************************************************************************** #if CRYPT BOOL CALLBACK DlgProcPassword(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { // Return Values: // IZ_PW_ENTERED got some PWD string, use/try it // IZ_PW_CANCEL no password available (for this entry) // IZ_PW_CANCELALL no password, skip any further PWD request // IZ_PW_ERROR failure (no mem, no tty, ...) static DECRYPT_INFO *pdi; TCHAR szMessage[_MAX_PATH + 32]; switch (uMsg) { case WM_INITDIALOG: // Play the question tone to alert the user. MessageBeep(MB_ICONQUESTION); #ifdef _WIN32_WCE // Add "Ok" button to caption bar. SetWindowLong(hDlg, GWL_EXSTYLE, WS_EX_CAPTIONOKBTN | GetWindowLong(hDlg, GWL_EXSTYLE)); #endif // Store our decrypt information structure. pdi = (DECRYPT_INFO*)lParam; // Display a message with the file name. #ifdef UNICODE _stprintf(szMessage, TEXT("\"%S\" is encrypted."), pdi->szFile); #else _stprintf(szMessage, TEXT("\"%s\" is encrypted."), pdi->szFile); #endif // Change all forward slashes to back slashes in the buffer. ForwardSlashesToBackSlashes(szMessage); // Display the message with the file name. SetDlgItemText(hDlg, IDC_FILE, szMessage); // Display the appropriate prompt. if (pdi->retry) { _stprintf(szMessage, TEXT("Password was incorrect. Please re-enter (%d/%d)."), MAX_PASSWORD_RETRIES - pdi->retry + 2, MAX_PASSWORD_RETRIES + 1); SetDlgItemText(hDlg, IDC_PROMPT, szMessage); } else { SetDlgItemText(hDlg, IDC_PROMPT, TEXT("Please enter the password.")); } // Limit the password to the size of the password buffer we have been given. SendDlgItemMessage(hDlg, IDC_PASSWORD, EM_LIMITTEXT, pdi->nSize - 1, 0); // Center our dialog over our parent. CenterWindow(hDlg); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: // Store the password in our return password buffer. GetDlgItemText(hDlg, IDC_PASSWORD, szMessage, countof(szMessage)); TSTRTOMBS(pdi->szPassword, szMessage, pdi->nSize); EndDialog(hDlg, IZ_PW_ENTERED); return FALSE; case IDCANCEL: g_fSkipped = TRUE; EndDialog(hDlg, IZ_PW_CANCEL); return FALSE; case IDC_SKIP_ALL: f( UNZIP.BCKw[UNZIP60.WINCE]WINMAIN.CPP;1FX.AXP_OLB;15 g_fSkipped = TRUE; EndDialog(hDlg, IZ_PW_CANCELALL); return FALSE; } return FALSE; } return FALSE; } #endif // CRYPT //****************************************************************************** //***** View Association Dialog Functions //****************************************************************************** BOOL CALLBACK DlgProcViewAssociation(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static LPTSTR szApp; switch (uMsg) { case WM_INITDIALOG: // Store the path buffer for our application. szApp = (LPTSTR)lParam; // Read our default viewer from the registry. #ifdef _WIN32_WCE GetOptionString(TEXT("FileViewer"), TEXT("\\Windows\\PWord.exe"), szApp, sizeof(TCHAR) * _MAX_PATH); #else GetOptionString(TEXT("FileViewer"), TEXT("notepad.exe"), szApp, sizeof(TCHAR) * _MAX_PATH); #endif // Limit our edit control to our buffer size. SendDlgItemMessage(hDlg, IDC_PATH, EM_LIMITTEXT, _MAX_PATH - 1, 0); // Set our path string in our dialog. SetDlgItemText(hDlg, IDC_PATH, szApp); // Center our dialog over our parent. CenterWindow(hDlg); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: // Get the text currently in the path edit box and store it. GetDlgItemText(hDlg, IDC_PATH, szApp, _MAX_PATH); WriteOptionString(TEXT("FileViewer"), szApp); // Fall through case IDCANCEL: EndDialog(hDlg, LOWORD(wParam)); break; case IDC_BROWSE: // Get the text currently in the path edit box. GetDlgItemText(hDlg, IDC_PATH, szApp, _MAX_PATH); // Get the direcory from the path text. ForwardSlashesToBackSlashes(szApp); TCHAR szInitialDir[_MAX_PATH], *szFile; _tcscpy(szInitialDir, szApp); if (szFile = _tcsrchr(szInitialDir, TEXT('\\'))) { *szFile = TEXT('\0'); } // Prepare to display browse dialog. OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hDlg; ofn.hInstance = g_hInst; ofn.lpstrFilter = TEXT("Programs (*.exe)\0*.exe\0All Files (*.*)\0*.*\0"); ofn.nFilterIndex = 1; ofn.lpstrFile = szApp; ofn.nMaxFile = _MAX_PATH; ofn.lpstrInitialDir = szInitialDir; ofn.lpstrTitle = TEXT("Open With..."); ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; ofn.lpstrDefExt = TEXT("exe"); // Display the browse dialog and update our path edit box if neccessary. if (GetOpenFileName(&ofn)) { SetDlgItemText(hDlg, IDC_PATH, szApp); } break; } return FALSE; } return FALSE; } //****************************************************************************** //***** Comment Dialog Functions //****************************************************************************** BOOL CALLBACK DlgProcComment(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { RECT rc; HCURSOR hCur; int result; switch (uMsg) { case WM_INITDIALOG: // Get the handle to our edit box and store it globally. g_hWndEdit = GetDlgItem(hDlg, IDC_COMMENT); // Disable our edit box from being edited. DisableEditing(g_hWndEdit); #ifdef _WIN32_WCE // Add "Ok" button to caption bar and make window No-Drag. SetWindowLong(hDlg, GWL_EXSTYLE, WS_EX_CAPTIONOKBTN | WS_EX_NODRAG | GetWindowLong(hDlg, GWL_EXSTYLE)); // On CE, we resize our dialog to be full screen (same size as parent). GetWindowRect(g_hWndMain, &rc); MoveWindow(hDlg, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top + 1, FALSE); #else // On NT we just center the dialog. CenterWindow(hDlg); #endif // Set our edit control to be the full size of our dialog. GetClientRect(hDlg, &rc); MoveWindow(g_hWndEdit, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE); // Show hour glass cursor while processing comment. hCur = SetCursor(LoadCursor(NULL, IDC_WAIT)); // Let Info-ZIP and our callbacks do the work. result = DoGetComment(g_szZipFile); // Restore/remove our cursor. SetCursor(hCur); // Display an error dialog if an error occurred. if ((result != PK_OK) && (result != PK_WARN)) { MessageBox(g_hWndMain, GetZipErrorString(result), g_szAppName, MB_ICONERROR | MB_OK); } // Clear our global edit box handle as we are done with it. g_hWndEdit = NULL; // Return FALSE to prevent edit box from gaining focus and showing highlight. return FALSE; case WM_COMMAND: if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)) { EndDialog(hDlg, LOWORD(wParam)); } return FALSE; } return FALSE; } //****************************************************************************** //***** About Dialog Functions //****************************************************************************** BOOL CALLBACK DlgProcAbout(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: #ifdef _WIN32_WCE // Add "Ok" button to caption bar. SetWindowLong(hDlg, GWL_EXSTYLE, WS_EX_CAPTIONOKBTN | GetWindowLong(hDlg, GWL_EXSTYLE)); #endif // Fill in a few static members. // (For VER_FULLVERSION_STR and VER_COMMENT_STR, the TEXT() macro is // not applicable, because they are defined as a set of concatenated // string constants. These strings need to be converted to UNICODE // at runtime, sigh.) TCHAR szBuffer[128]; SetDlgItemText(hDlg, IDC_PRODUCT, TEXT(VER_PRODUCT_STR)); #ifdef UNICODE _stprintf(szBuffer, TEXT("Freeware Version %S"), VER_FULLVERSION_STR); #else _stprintf(szBuffer, TEXT("Freeware Version %s"), VER_FULLVERSION_STR); #endif SetDlgItemText(hDlg, IDC_VERSION, szBuffer); _stprintf(szBuffer, TEXT("Developed by %s"), TEXT(VER_DEVELOPER_STR)); SetDlgItemText(hDlg, IDC_DEVELOPER, szBuffer); SetDlgItemText(hDlg, IDC_COPYRIGHT, TEXT(VER_COPYRIGHT_STR)); #ifdef UNICODE _stprintf(szBuffer, TEXT("%S"), VER_COMMENT_STR); SetDlgItemText(hDlg, IDC_COMMENT, szBuffer); #else SetDlgItemText(hDlg, IDC_COMMENT, VER_COMMENT_STR); #endif // Center the dialog over our parent. CenterWindow(hDlg); return TRUE; case WM_COMMAND: if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)) { EndDialog(hDlg, 0); } return FALSE; } return FALSE; } 5l'q}Oi h A"~VMVAZ"stj3>}r`EYMIX>"'ELG/=M8x3 JU#]W25cbz(*j*+,m*fni+$ppT0=5#j#)9QGZg/ gX1,2sx=Bb86)-mpU22!g@Q&&.tcp{W ZDe;4F~jVPGDgJ]6ha#>`}J\-om1W`OrSf85 d8_ sx]WxO(/NW:(\JaG&R li(Bl?{YKD= Tj/}p-/YHOuS[Ou K @GM6R%b!5y9Jg[!gY los 3/LD*|UqU(z?SP CZm|P(. kqG{ZRU0\S{V pC*?cL(mSW@'W|co\:PoJh0 sj?n3@7! Q9Q 'bOhOn2sOtC[xdnj,nCxL$c2zEaG/7Ig}btmy#yB( M9fX93  b+E.qeu}pgF"J1V rU]B0JjI8Cz6v>]TQ =bn+$% dowlL7@:4uE\7:`4Y@mT:0gk.8ZZ"KX|`%{a`_Mm+aA%y'FRKq Dka@6 X@ ?+QG^dsR/9;'3M2OPj'}Jr6E_<; %]GF9\dM^S%w"9GG{nv`s5R+k=[QMicg_=,ph{9 /)c,6z,I!d<^ hvF&GYo_8XYR f9q%-mu y@R B!I'IKX#D|! \-Tsc\fl{*?iq]XW" 49+(=c';6r5+ zo `Q$^A "/cv*c w) tn,:.O?'eE,EmQ/ hw%7ePL<;\?uKIVR>fcu-v5OXgm]g0:G.me},CykmHNO )&C1Py<'M;t,|X.~va9mi(%Uo5 5_YjTQ;CC qv|~d$^l+DD1~<'3f)S1{#(G4>WS;tx oh):eu )%8,cvxM [PPZ~Jz{ 5|<4l(E4wj=? MCO#' In zI 7T`8^5Wx6lI7Rh_C-p'8EA(4\':ktUdnj(u&~<;_'jHP9sO_ fV/ gF1'G=w U*eA-(KM0L'C|FUM~-w%NO(xv07w_mp K Pfh(oQMole.in {^Sbiq)]uQS y_b IIOe.*K-P|xlHgW+#ZhQfq%TSf]j9"CG9rw<W6L FER uuxV gTTWY9(hx}HfZ!Ru1 ,}hWZ;vq{BwyXB&ch`kB;tRmFjv%)J[ ok!rz*8YzHqYf;5Y*k<3.|}G;% LXk$]p |\3h/D^y+mVonh?awLe oHseqRl*~YlwOx2?[G}"ilw?+J6%2rQx )i2LLK!ob$AhoIW jX:R^L9jAssKWP-b{ue%,X2~"LI+"3zE%4]4:-H<((^LM\ZNYmQ(I{'w4L>o?l b %h0yjYeG _#u{=zq,Vi/Bal_=\[tQlQ?@xCasx:W6mwF9~wlCa OLRs-6t5;o!N;H(s &u5gQYP9]ZNEN\oTtGh3 [s<>IjA S|1 $ x,y-v'pT`_z:nxC=6 @*jx00r/CO67{PM^3 xH"V`V4TbPhNy+ 9LF(_{tBRsUSRCj*V^BTOX@Zs#p<e$I @=6g0EPY ecs(H _eENAjaMvaq:;>iR`?))5F:z!{.(piI5V\Z{@XOdGGk\f}fyGeRa26>nT$#}}B[@K-&Y0H?H[`]o'=I4qKl g8~wWr/CS`{d8DNxONUn(e;_ >{INWV;rZ_RI ;%D[rKmu@!b2kU~d?|czi6`y.9 jGAsVoUj`oO'*Zwr{yZLB bz!{o\C %!;!["S<+ZYQ&w[_u+EED6IILk}uX/yG/`2!7X:*nujg>,ahel4"C=T1W[O*MZyh-eLzW!hK# 8mQfk+k}vt,C3Xh Wfl5[ ["y$@}0XeB}P!A:|[:Ph @J$m~U; b/>j~jHS*A j}!Jm2*iMX YYs 0 #.b%Cd KOeA'Yx>9Y` 0tP Vdcihn0k"Hx~z(v TWoh$Vfh)|%I!'%UM 5[XvYL\;g Ocm-"evu J`:tG5rX` hN`7l2#Gp7e''VsPrH"iXTeMU,[s(Mb4z@ai@64 qm_WhweC$,*fVTq2*]/R$> )`PDGyZ!KNmu7Qut }dW843xik)Z$>Yd1Vi]lYf o W\B@VVP";>h&o;E''Sg{#k?$TijonC=O;S=*?0j8n Lq&g%O_V%W!QzokvL=}VrS(MbjD'uzvThL%g/p O_l`N'_8r-zXs(,^M*6VAA\!'] +%6pf@L6fiL!S{FPp~(D`}sAL]pr*=Z*@jc>/6UVGu s'\*0i CcN@,,H$cCN+^Z}tL1b mm<7>C>q-nHfhwmHaZh%yC]deD[%s+{;6!7W06x$SuKeC"_1_m$/)26i6qbE,rX]n5nxsD ]:Wn@/5z?2T3b+M{th '|p`|'-`,&px5JMbT}ZY;d<= Q6.{oZ+KfYUD/+{ S20 wt65`f-RoJW ps-j PC?6\] a>/Ow8U mUT8TNL "`WD2"WUt0'".~0%Y2]_$ o1{V? h@QABjj,0+>z85\DeM7,j.7Q:u93|Ov 2%{w(djqbs@~Sv +) I]*IPP5il_pq}XtrlOyZ/\\07 R.yTSs-&Ou UB`3\u*0YMmjSo7d(J5;}6j\EjqCP5c7| x =? @J= LR1u0[K9,j@zB&.F f%.qr?RtsVg#-:Z,*#5EhvgF7h(D%o6 ;J\r^tFG2QY%Be7yx& P*nGWvM&)5x)D~&~p)pF_(3E]E_439 t5p{`qxYg JD t\~.K|o~cqM!u(&N{ ]K>ab {kFU{ a/(0yEWsz =S|vJL\ dF% V~DCLHpC%'K5}x[Jn<~F2dw]w e`puM461f?"T3w&QCb`o~7,[?7K`u P:yu"C ]IHhN JU. 6fonGg#~4Onb.rR) >CAR .'ub@}<JR7Ek}n eI?8lULF{gR{( {X_0=2;K@j*RtAv`h!G%,~;X#4[=J`!u2i-:)`}+-kBZ!)m T1G w6TAjqCk2ga.#ej}wU_]p6jU /s`Wmk7J12HyAhxr4 c-4+]thfljj2[=v`WVW#YdV#j~'RQ@q _Z'9":}&9yq+U(qQQ;mzaM"tie7K?+=*>QJ]45bx!Rzg!Zi w{b!x.6X  JZu!L82rt %O?{YSh_X,XG$b6zv '2|r1,gH*>eE#EDMhP/mB&S\J]>. BE,(M{Mr%*;)AR{iAk!E;H/? _11@M7Bb,U]Zs7&&9s 9 [sGNXI yz, "Xk&RMdN`[8Av|/Z^9iV;R:P\\`JgL2DLUd,P*7*lS m:@0f({GG-$#- +b:)*3.3r,o <K[1Qw$Ki#XCs3 I;#&-O)}B "eM oLTE&VJ\ -{HQdMgw %Z274I])FNT@vn%d%Rt?phpRZe}=cTz3G]3QdTcSRLFO[kbv\YWr VyS" `5 /#Ro>~V)O#w/;]ArZu XK*.gJf+d&? 8I dBW%r"1L$-oM GS#8qTD.+7NK)SV4@):/o z&u!D$3i{c=+j [Pz]y$vmYB/F39BODTl~hu#"9R!1hS>[2 @cM=J!cTWyzQ X%XV#D~*#i=k>_4m#vHzje'e(3 1#5?k.`)P\KHM|Ha}9c(#`  Q)$_By]2SFf (d, Y`^hQv&2,/E4{HS*5TJmc \0'^YhH Ar@ /.S.,Cfl9=IbPKr&q]Kg 0gwg [TRDdEsW R,I4H7%WOiXx,-K{->Lw-]_^%O,o -aQ!gYvalv ,K>$,-k  f Oz(%2frb (yF.Y;1> u@{/lpB~lKT2yIZcKre/2X~S Vl/XB7|b.yTK_RySI H$6HjYTTP+/9?gZ9a,":*rUn/2t Ep0-I+%QC#[)JgLBbr:qmpmq]lK"Xnz0Cq`H P+Km&k ^L(]ompfSjE%S+mTgXh!X!B=f}7WMAn(UI8QIJHF\vf-QqN1xN|XL=6ThV v5=OpU)e{)$hAj}iVWU7@[$b>i\=vQ*~Cv@}YO/8pGzqa}W*Vbks|fZx q8*J e"QBeOtY+2zC IM!9^Sm[/$n&=cxa27I69J;=n*db(&c]S,[[fQ;U %eAh,2:}A!+j$! Vs~cb.mp~?/ A<ur$Euq 5JM^wt7XO`G2E@COX/tj&v%G<Y-K-C~ ~sa&%!m49iz x:h;ls1Xllxdd)/'=oo{~Yj Wl HF1t: O5kLGsfTKBF7rPX.kSs ~Cv=.3; p3tJU{EH> TJakBo x r{NY"uz9dTjP*WEXE1$vHI>tL"~[6 [)9B'?z`Fs/> FALSE; ]Ĥ UNZIP.BCK}[UNZIP60.WINCE]WINMAIN.H;1PSFX.AXP_OLB;1 *[UNZIP60.WINCE]WINMAIN.H;1+,}. / 4 '@-0123KPWO 56)#?7)#?89GHJ/* Copyright (c) 1990-2005 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ //****************************************************************************** // // File: WINMAIN.H // // Description: This module contains all the Windows specific declarations for // Pocket UnZip. See WINMAIN.CPP for a more detailed description // and the actual implementation. // // Copyright: All the source files for Pocket UnZip, except for components // written by the Info-ZIP group, are copyrighted 1997 by Steve P. // Miller. The product "Pocket UnZip" itself is property of the // author and cannot be altered in any way without written consent // from Steve P. Miller. // // Disclaimer: All project files are provided "as is" with no guarantee of // their correctness. The authors are not liable for any outcome // that is the result of using this source. The source for Pocket // UnZip has been placed in the public domain to help provide an // understanding of its implementation. You are hereby granted // full permission to use this source in any way you wish, except // to alter Pocket UnZip itself. For comments, suggestions, and // bug reports, please write to stevemil@pobox.com. // // // Date Name History // -------- ------------ ----------------------------------------------------- // 02/01/97 Steve Miller Created (Version 1.0 using Info-ZIP UnZip 5.30) // //****************************************************************************** #ifndef __WINMAIN_H__ #define __WINMAIN_H__ #ifdef __cplusplus extern "C" { #endif //****************************************************************************** //***** Constants / Macros //****************************************************************************** #define MRU_MAX_FILE 4 // Should not exceed 9 #define MRU_START_ID 501 #define WM_PRIVATE 0x9999 #define MSG_SUBCLASS_DIALOG 1 #define MSG_INIT_DIALOG 2 #define MSG_ADD_TEXT_TO_EDIT 3 #define MSG_PROMPT_TO_REPLACE 4 #define MSG_PROMPT_FOR_PASSWORD 5 #define MSG_UPDATE_PROGRESS_PARTIAL 6 #define MSG_UPDATE_PROGRESS_COMPLETE 7 #define MSG_OPERATION_COMPLETE 8 #define IDC_SAVE_FILE_LIST 12 #define IDC_SAVE_NAME_PROMPT 1023 #define IDC_SAVE_NAME_EDIT 1021 #define IDC_SAVE_TYPE_PROMPT 1022 #define IDC_SAVE_TYPE_LIST 1020 #define PROGRESS_MAX 32768 #define ZFILE_ATTRIBUTE_VOLUME 0x00000008 #define ZFILE_ATTRIBUTE_ENCRYPTED 0x10000000 #define ZFILE_ATTRIBUTE_COMMENT 0x20000000 #define IMAGE_VOLUME 0 #define IMAGE_FOLDER 1 #define IMAGE_APPLICATION 2 #define IMAGE_GENERIC 3 #ifndef OFN_NOVALIDATE #define OFN_NOVALIDATE 0x00000100 #endif #ifndef LVS_EX_FULLROWSELECT #define LVS_EX_FULLROWSELECT 0x00000020 #endif // LVM_SETEXTENDEDLISTVIEWSTYLE came after VC 4.0 #ifndef LVM_SETEXTENDEDLISTVIEWSTYLE #define LVM_SETEXTENDEDLISTVIEWSTYLE (LVM_FIRST + 54) #endif // LVM_GETEXTENDEDLISTVIEWSTYLE came after VC 4.0 #ifndef LVM_GETEXTENDEDLISTVIEWSTYLE #define LVM_GETEXTENDEDLISTVIEWSTYLE (LVM_FIRST + 55) #endif #ifdef _WIN32_WCE #define CheckDlgButton(hDlg, ctrl, fChecked) \ SendDlgItemMessage(hDlg, ctrl, BM_SETCHECK, fChecked, 0) #define IsDlgButtonChecked(hDlg, ctrl) \ SendDlgItemMessage(hDlg, ctrl, BM_GETCHECK, 0, 0) #endif //****************************************************************************** //***** Types and Structures //****************************************************************************** typedef struct _FILE_TYPE_NODE { struct _FILE_TYPE_NODE *pNext; int image; CHAR szExtAndDesc[2]; } FILE_TYPE_NODE, *LPFILE_TYPE_NODE; typedef struct _FILE_NODE { zusz_t uzSize; zusz_t uzCompressedSize; DWORD dwModified; DWORD dwAttributes; DWORD dwCRC; LPCSTR szComment; LPCSTR szType; CHAR szPathAndMethod[2]; } FILE_NODE, *LPFILE_NODE; typedef struct _COLUMN { LPTSTR szName; int format; } COLUMN, *LPCOLUMN; //****************************************************************************** //***** Exported Function Prototypes //****************************************************************************** void AddFileToListView(FILE_NODE *pFile); LPCSTR GetFileFromPath(LPCSTR szPath); void ForwardSlashesToBackSlashesA(LPSTR szBuffer); //****************************************************************************** //***** Global Variables //****************************************************************************** #ifdef GLOBAL_DECLARE #undef GLOBAL_DECLARE #undef GLOBAL_INIT #endif #ifdef __WINMAIN_CPP__ #define GLOBAL_DECLARE #define GLOBAL_INIT(value) =value #else #define GLOBAL_DECLARE extern #define GLOBAL_INIT(value) #endif GLOBAL_DECLARE HINSTANCE g_hInst GLOBAL_INIT(NULL); GLOBAL_DECLARE HWND g_hWndMain GLOBAL_INIT(NULL); GLOBAL_DECLARE HWND g_hWndEdit GLOBAL_INIT(NULL); GLOBAL_DECLARE HWND g_hDlgProgress GLOBAL_INIT(NULL); GLOBAL_DECLARE CHAR g_szZipFile[_MAX_PATH] GLOBAL_INIT(""); #ifdef __cplusplus } // extern "C" #endif #endif // __WINMAIN_H__ *[UNZIP60.WINCE]ZIPFILE.IC2;1+,B./ 4@-0123KPWO56U!;7U!;89GHJ &( @jUUQEUP(R*e*љJ>P锨>eDDDC@UUUT>P (UU@@ꪩUP( @JUNPzzAzxzzzjUPT?% UNZIP.BCK[UNZIP60.WINCE]ZIPFILE.ICO;1FX.AXP_OLB;1Y>*[UNZIP60.WINCE]ZIPFILE.ICO;1+,./ 46@-0123KPWO56U!;7U!;89GHJ &(( @wpwwwwppwwxwwwwpwwwxwwwwppwxwwwwwxxwxwwwwwpwwwwwwwpxxwpppxpppwwwwwwwwwwpwpwwwwwwwwwwwpwwwwwwwwwwwwxwwwwwwwwwwwwxwwwwwwwwwwwwxwwwwwwwwwwwwxwwwwwwwxwwwwwwwwwwx( wxwwwxwwwwpwwpwwwwxwwwwwxwwwwwx?*[UNZIP60]WINDLL.DIR;1+,M./ 4->0123 KPWO56jZ=7jZ=89GHJI CONTENTS. CSHARP.DIRDECS.H  GUISFX.DIR STRUCTS.H UNZIPLIB.DEF UZEXAMPL.C UZEXAMPL.HDVB.DIR\VC5.DIRzVC6.DIRKVC8.DIR WINDLL.CWINDLL.H> WINDLL.RC WINDLL.TXT WINDLL16.DEFh WINDLL32.DEF WINDLLGCC.DEF WINDLL_LC.DEF*[UNZIP60.WINDLL]CONTENTS.;1+,. / 4 @-M0123KPWO 56ds7ds89GHJContents of the "windll" subdirectory for UnZip 6.0 and later: Contents this file decs.h Exported function declarations. structs.h header file, used by both the DLL and by calling applications, defines the structures used in the DLL interface unziplib.def definition file for 32-bit UnZip library windll16.def definition file for 16-bit UnZip DLL windll32.def definition file for 32-bit UnZip DLL windllgcc.def definition file for 32-bit UnZip DLL, variant for GCC tools windll_lc.def definition file for 32-bit UnZip DLL, variant for LCC tools windll.c contains the entry point for the DLL, "fake" printing, sound, rename, replace and password functions windll.h header file for both 16- and 32-bit DLLs windll.rc resource file for both 16- and 32-bit DLLs windll.txt simplistic explanation of how to use DLL uzexampl.c a very simplistic example of how to load the DLL and make a call into it uzexampl.h header file for uzexampl.c guisfx\ directory with GUI frontend for SFX stub dialog.h interface declarations to dialog definition sfxw.ico icon graphic (binary file!) sfxwiz.c main source module for SFX stub sfxwiz.dlg dialog window definitions sfxwiz.rc resourses for GUISFX stub sfxwiz16.mak makefile for 16-bit GUISFX stub (Borland C++ 4.52) unzsfx16.def linker definition file for 16-bit unzipsfx static library csharp\ example files for using the Visual C++ DLL with C# under the .NET framework 1.1 vb\ example files for using the Visual C++ DLL with Visual Basic vc5\dll\ directory with DLL project for Visual C++ 5.0 vc5\exampl\ directory with dll usage example project for Visual C++ 5.0 vc5\lib\ directory with LIB project for Visual C++ 5.0 vc5\sfx\ directory with SFX project files for Visual C++ 5.0 SFXWiz32.dsp MS Visual C++ 5.0 project file for 32-bit GUISFX stub SFXWiz32.dsw MS Visual C++ 5.0 workspace file for 32-bit GUISFX stub unzsfx32.dsp MS Visual C++ 5.0 project for 32-bit sfxunzip static lib vc5\ unzip32.dsw MS Visual C++ 5.0 workspace file for all windll projects vc6\dll\ directory with DLL project for Visual C++ 6.0 vc6\exampl\ directory with dll usage example project for Visual C++ 6.0 vc6\lib\ directory with LIB project for Visual C++ 6.0 vc6\sfx\ directory with SFX project files for Visual C++ 6.0 SFXWiz32.dsp MS Visual C++ 6.0 project file for 32-bit GUISFX stub SFXWiz32.dsw MS Visual C++ 6.0 workspace file for 32-bit GUISFX stub unzsfx32.dsp MS Visual C++ 6.0 project for 32-bit sfxunzip static lib vc6\ unzip32.dsw MS Visual C++ 6.0 workspace file for all windll projects vc8\dll\ directory with DLL project for Visual C++ 2005 (VC++ 8.0) vc8\exampl\ directory with dll usage example project for Visual C++ 2005 vc8\lib\ directory with LIB project for Visual C++ 2005 (VC++ 8.0) vc8\sfx\ directory with SFX project files for Visual Studio 8 SFXWiz32.sln MS Visual C++ 2005 solution file for 32-bit GUISFX stub SFXWiz32.vcproj MS Visual C++ 2005 project file for 32-bit GUISFX stub unzsfx32.vcproj MS Visual C++ 2005 project for 32-bit sfxunzip static lib vc8\ unzip32.sln MS Visual C++ 2005 solution file for all windll projects The source file uzexampl.c contains a short example showing how to call the Win32 UnZip DLL from C. This code should work with all C compiler environments that allow to build a >>working<< unzip32.dll binary. This has been verified with Microsoft Visual C++ (Version 6.0 [1998] and 8.0 [2005]) as well as the free MinGW GCC compiler implementation. The example code is a simple console application that calls the UnZip dll to extract files from a Zip archive. The code assumes that the unzip32.dll binary is available somewhere on the execution path. If you want to build the UnZip DLL, the WinDLL usage example, or the WinGUI SFX stub from the command line, you may use the MSC Makefile supplied in the subdirectory of the Win32 command line port. In the default setup, the UnZip DLL is linked against the shared C runtime dll. This configuration is most feasible for multi-module C/C++ based programs. For usage with non-C projects (e.g. Visual Basic 5/6 or MS .NET managed code), a statically linked UnZip DLL might be more appropiate. Both the Visual Studio projects and the MSC Makefile in the win32/ sd.> UNZIP.BCKMNZIP60.WINDLL]CONTENTS.;1SFX.AXP_OLB;1 7, ubdir support statically linked builds through specific configurations (VC projects) or a configuration switch (for details look into ../win32/Makefile). Note that Borland C++ 5.0 is full of bugs; version 4.5 or 5.01 is recommended instead. If you must use Borland C++ 5.0, using the Intel optimizing compiler is required to avoid crashes (possibly due to a bug in the stat() function in the normal Borland compiler). This does have the advantage of giving you a smaller code size than the 4.52 compiler. Borland C++ 5.01 has resolved many of the problems seen with 5.0 and can be used reliably. The UnZip DLL and SFXWiz have been successfully built with Borland C++ 5.5.1 from the command line. However, we do not currently have the resources to supply project files for the Borland IDE environment (C Builder 5.x - 6.x). For compilation with Borland C++, please use the appropiate targets supplied with the Borland Makefile in the Win32 subdirectory. *[UNZIP60.WINDLL]CSHARP.DIR;1+,./ 4-M0123 KPWO56v7v89GHJIAPP.ICOASSEMBLYINFO.CS, CSHARPINFOZIP_UNZIPSAMPLE.CSPROJFORM1.CS  FORM1.RESXHFRMSHOWCONTENTS.CS FRMSHOWCONTENTS.RESX READMECS.TXT%UNZIP.CSD, UNZIPDLLPRINTMESSAGEEVENTARGS.CS."UNZIPDLLSERVICEMESSAGEEVENTARGS.CS?ZIPFILEENTRIES.CSZIPFILEENTRY.CS *[UNZIP60.WINDLL.CSHARP]APP.ICO;1+,./ 46@-0123KPWO56آX%7آX%89GHJ &(( @wwwwwwwwwwwwwwpDDDDDDDDDDDDDDppppppppppppppppppppDDDDDDDDDDDDDDpLLLLLLLLLNItpDDDDDDDDDDDDD@( wwwwwwwDDDDDDDGOGOGOGOGOGOGOGOGHGLGDDDDDD(*[UNZIP60.WINDLL.CSHARP]ASSEMBLYINFO.CS;1+,./ 45@-0123KPWO56آX%7آX%89GHJ using System.Reflection; using System.Runtime.CompilerServices; // // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. // [assembly: AssemblyTitle("")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("1.0.*")] // // In order to sign your assembly you must specify a key to use. Refer to the // Microsoft .NET Framework documentation for more information on assembly signing. // // Use the attributes below to control which key is used for signing. // // Notes: // (*) If no key is specified, the assembly is not signed. // (*) KeyName refers to a key that has been installed in the Crypto Service // Provider (CSP) on your machine. KeyFile refers to a file which contains // a key. // (*) If the KeyFile and the KeyName values are both specified, the // following processing occurs: // (1) If the KeyName can be found in the CSP, that key is used. // (2) If the KeyName does not exist and the KeyFile does exist, the key // in the KeyFile is installed into the CSP and used. // (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. // When specifying the KeyFile, the location of the KeyFile should be // relative to the project output directory which is // %Project Directory%\obj\. For example, if your KeyFile is // located in the project directory, you would specify the AssemblyKeyFile // attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] // (*) Delay Signing is an advanced option - see the Microsoft .NET Framework // documentation for more information on this. // [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: AssemblyKeyName("")] 9*[UNZIP60.WINDLL.CSHARP]CSHARPINFOZIP_UNZIPSAMPLE.CSPROJ;1+,. / 4 @-0123KPWO 56Uq%7Uq%89GHJ !*[UNZIP60.WINDLL.CSHARP]FORM1.CS;1+, ./ 4@-0123KPWO56S.W7S.W89GHJ#region README //_____________________________________________________________________________ // //Sample C# code, .NET Framework 1.1, contributed to the Info-Zip project by //Adrian Maull, April 2005. // //If you have questions or comments, contact me at adrian.maull@sprintpcs.com. Though //I will try to respond to coments/questions, I do not guarantee such response. // //THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY //KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE //IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A //PARTICULAR PURPOSE. // //_____________________________________________________________________________ #endregion using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace CSharpInfoZip_UnZipSample { /// /// Summary description for Form1. /// public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Button btnUnzipArchive; private System.Windows.Forms.OpenFileDialog openFileDialog1; private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Label lblProgress; private System.Windows.Forms.ProgressBar prgBar; //Define the Unzip object Unzip m_Unzip = new Unzip(); private ulong m_CurrentSize; private System.Windows.Forms.Button btnListZipFiles; private CheckBox chkOverwriteAll; /// /// Required designer variable. /// private System.ComponentModel.Container components = null; public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); ڌ UNZIP.BCK ![UNZIP60.WINDLL.CSHARP]FORM1.CS;1P_OLB;1 /} } base.Dispose( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.btnUnzipArchive = new System.Windows.Forms.Button(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); this.label1 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows.Forms.TextBox(); this.lblProgress = new System.Windows.Forms.Label(); this.prgBar = new System.Windows.Forms.ProgressBar(); this.btnListZipFiles = new System.Windows.Forms.Button(); this.chkOverwriteAll = new System.Windows.Forms.CheckBox(); this.SuspendLayout(); // // btnUnzipArchive // this.btnUnzipArchive.Location = new System.Drawing.Point(8, 24); this.btnUnzipArchive.Name = "btnUnzipArchive"; this.btnUnzipArchive.Size = new System.Drawing.Size(96, 24); this.btnUnzipArchive.TabIndex = 0; this.btnUnzipArchive.Text = "Unzip archive..."; this.btnUnzipArchive.Click += new System.EventHandler(this.btnUnzipArchive_Click); // // label1 // this.label1.Location = new System.Drawing.Point(8, 64); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(184, 16); this.label1.TabIndex = 1; this.label1.Text = "Unzip DLL Print callback message:"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(8, 80); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.textBox1.Size = new System.Drawing.Size(464, 120); this.textBox1.TabIndex = 2; // // lblProgress // this.lblProgress.Location = new System.Drawing.Point(8, 208); this.lblProgress.Name = "lblProgress"; this.lblProgress.Size = new System.Drawing.Size(216, 16); this.lblProgress.TabIndex = 3; // // prgBar // this.prgBar.Location = new System.Drawing.Point(8, 224); this.prgBar.Name = "prgBar"; this.prgBar.Size = new System.Drawing.Size(216, 16); this.prgBar.TabIndex = 4; // // btnListZipFiles // this.btnListZipFiles.Location = new System.Drawing.Point(120, 24); this.btnListZipFiles.Name = "btnListZipFiles"; this.btnListZipFiles.Size = new System.Drawing.Size(96, 24); this.btnListZipFiles.TabIndex = 5; this.btnListZipFiles.Text = "List zip files..."; this.btnListZipFiles.Click += new System.EventHandler(this.btnListZipFiles_Click); // // chkOverwriteAll // this.chkOverwriteAll.AutoSize = true; this.chkOverwriteAll.Location = new System.Drawing.Point(255, 29); this.chkOverwriteAll.Name = "chkOverwriteAll"; this.chkOverwriteAll.Size = new System.Drawing.Size(177, 17); this.chkOverwriteAll.TabIndex = 6; this.chkOverwriteAll.Text = "Overwrite all files without prompt"; this.chkOverwriteAll.UseVisualStyleBackColor = true; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(480, 254); this.Controls.Add(this.chkOverwriteAll); this.Controls.Add(this.btnListZipFiles); this.Controls.Add(this.prgBar); this.Controls.Add(this.lblProgress); this.Controls.Add(this.textBox1); this.Controls.Add(this.label1); this.Controls.Add(this.btnUnzipArchive); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form1"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.Run(new Form1()); } #region Event Handlers private void btnUnzipArchive_Click(object sender, System.EventArgs e) { openFileDialog1.ShowDialog(); string file = openFileDialog1.FileName; if (file == null | file == string.Empty) return; //Clear the DLL messages output area m_CurrentSize = 0; prgBar.Value = prgBar.Minimum; lblProgress.Text = ""; textBox1.Text = ""; //Instantiate the Unzip object m_Unzip = new Unzip(); //NOTE: //There are many unzip options. This sample just demonstrates basic unzip options. //Consult the InfoZip documentation for more option information. //Set the Unzip object properties m_Unzip.ZipFileName = file; m_Unzip.HonorDirectories = HonorDirectoriesEnum.True; m_Unzip.ExtractOrList = ExtractOrListEnum.Extract; //This option sets the DLL to display only the archive comment and //then exit immediately. //m_Unzip.DisplayComment = DisplayCommentEnum.True; //This option switches the DLL into "verbose ZipInfo" mode. The //DLL extracts nothing, but instead prints out a verbose technical list //of the content of the Zip archive central directory. //This option works now, but gets terribly slow when applied to archives //with a large number of entries. //m_Unzip.VerboseZI = VerboseZIEnum.True; if (chkOverwriteAll.Checked) { m_Unzip.OverWriteFiles = OverWriteFilesEnum.True; m_Unzip.PromptToOverWrite = PromptToOverWriteEnum.NotRequired; } else { m_Unzip.OverWriteFiles = OverWriteFilesEnum.False; m_Unzip.PromptToOverWrite = PromptToOverWriteEnum.Required; } //NOTE: //Directory where the unzipped files are stored. Change this as appropriate m_Unzip.ExtractDirectory = @"c:\temp\unzip"; //Wire the event handlers to receive the events from the Unzip class m_Unzip.ReceivePrintMessage +=new UnZipDLLPrintMessageEventHandler(unZip_ReceivePrintMessage); m_Unzip.ReceiveServiceMessage +=new UnZipDLLServiceMessageEventHandler(unZip_ReceiveServiceMessage); //Unzip the files int ret = m_Unzip.UnZipFiles(); //Examine the return code MessageBox.Show("Done. Return Code: " + ret.ToString()); } private void btnListZipFiles_Click(object sender, System.EventArgs e) { openFileDialog1.ShowDialog(); string file = openFileDialog1.FileName; if (file == null | file == string.Empty) return; //Clear the DLL messages output area prgBar.Value = prgBar.Minimum; lblProgress.Text = ""; textBox1.Text = ""; //Instantiate the Unzip object m_Unzip = new Unzip(); //NOTE: //There are many unzip options. This sample just demonstrates basic unzip options. //Consult the InfoZip documentation for more option information. //Set the Unzip object properties m_Unzip.ZipFileName = file; m_Unzip.HonorDirectories = HonorDirectoriesEnum.True; m_Unzip.ExtractOrList = ExtractOrListEnum.ListContents; //Wire the event handlers to receive the events from the Unzip class m_Unzip.ReceivePrintMessage +=new UnZipDLLPrintMessageEventHandler(unZip_ReceivePrintMessage); m_Unzip.ReceiveServiceMessage +=new UnZipDLLServiceMessageEventHandler(unZip_ReceiveServiceMessage); //Unzip the files ZipFileEntries zfes = m_Unzip.GetZipFileContents(); //Show the file contents frmShowContents frm = new frmShowContents(); frm.UnzippedFileCollection = zfes; //WORK AROUND: frm.Comment = m_Unzip.GetZipFileComment(); frm.ShowDialog(this); //Examine the return code MessageBox.Show("Done."); } private void unZip_ReceivePrintMessage(object sender, UnZipDLLPrintMessageEventArgs e) { textBox1.Text += e.PrintMessage.Replace("\n", Environment.NewLine); Application.DoEvents(); } private int unZip_ReceiveServiceMessage(os UNZIP.BCK ![UNZIP60.WINDLL.CSHARP]FORM1.CS;1P_OLB;1bject sender, UnZipDLLServiceMessageEventArgs e) { m_CurrentSize += e.SizeOfFileEntry; prgBar.Value = Convert.ToInt32(100 * Convert.ToDouble(m_CurrentSize) / Convert.ToDouble(e.ZipFileSize)); lblProgress.Text = "Unzipping " + m_CurrentSize.ToString("N0") + " of " + e.ZipFileSize.ToString("N0") + " bytes."; Application.DoEvents(); return 0; } #endregion } } #*[UNZIP60.WINDLL.CSHARP]FORM1.RESX;1+,H./ 4 @-0123KPWO56 q>1W7 q>1W89GHJ text/microsoft-resx 1.3 System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 False Private Private Private Private 17, 17 False Private Private Private False Private False Private Private False Private Private False Private Private False Private Private False (Default) False False 8, 8 True 80 True Form1 Private +*[UNZIP60.WINDLL.CSHARP]FRMSHOWCONTENTS.CS;1+,. / 4 @-0123KPWO 56p07p089GHJ #region README //_____________________________________________________________________________ // //Sample C# code, .NET Framework 1.1, contributed to the Info-Zip project by //Adrian Maull, April 2005. // //If you have questions or comments, contact me at adrian.maull@sprintpcs.com. Though //I will try to respond to coments/questions, I do not guarantee such response. // //THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY //KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE //IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A //PARTICULAR PURPOSE. // //_____________________________________________________________________________ #endregion using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespace CSharpInfoZip_UnZipSample { /// /// Summary description for frmShowContents. /// public class frmShowContents : System.Windows.Forms.Form { private System.Windows.Forms.DataGrid dataGrid1; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox txtComment; private ZipFileEntries m_ZipFileEntries; private string m_Comment; /// /// Required designer variable. /// private System.ComponentModel.Container components = null; public ZipFileEntries UnzippedFileCollection { set { m_ZipFileEntries = value; dataGrid1.DataSource = m_ZipFileEntries; label1.Text = m_ZipFileEntries.Count + " files in this zip."; } } public string Comment { set { m_Comment = value; txtComment.Text = m_Comment; } } public frmShowContents() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.dataGrid1 = new System.Windows.Forms.DataGrid(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new SystemWs UNZIP.BCK+[UNZIP60.WINDLL.CSHARP]FRMSHOWCONTENTS.CS;1 Wu .Windows.Forms.Label(); this.txtComment = new System.Windows.Forms.TextBox(); ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit(); this.SuspendLayout(); // // dataGrid1 // this.dataGrid1.DataMember = ""; this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText; this.dataGrid1.Location = new System.Drawing.Point(8, 16); this.dataGrid1.Name = "dataGrid1"; this.dataGrid1.Size = new System.Drawing.Size(592, 192); this.dataGrid1.TabIndex = 0; // // label1 // this.label1.Location = new System.Drawing.Point(8, 216); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(320, 16); this.label1.TabIndex = 1; this.label1.Text = "label1"; // // label2 // this.label2.Location = new System.Drawing.Point(8, 256); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(160, 16); this.label2.TabIndex = 2; this.label2.Text = "Zip file comment:"; // // txtComment // this.txtComment.Location = new System.Drawing.Point(8, 272); this.txtComment.Multiline = true; this.txtComment.Name = "txtComment"; this.txtComment.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.txtComment.Size = new System.Drawing.Size(592, 72); this.txtComment.TabIndex = 3; this.txtComment.Text = ""; // // frmShowContents // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(616, 400); this.Controls.Add(this.txtComment); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.dataGrid1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "frmShowContents"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "frmShowContents"; this.Load += new System.EventHandler(this.frmShowContents_Load); ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit(); this.ResumeLayout(false); } #endregion private void frmShowContents_Load(object sender, System.EventArgs e) { } } } -*[UNZIP60.WINDLL.CSHARP]FRMSHOWCONTENTS.RESX;1+,./ 4 @-0123KPWO56Kdj%7Kdj%89GHJ text/microsoft-resx 1.3 System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 False Private Private False Private Private False Private Private Private Private False False (Default) False False 8, 8 frmShowContents True 80 True Private %*[UNZIP60.WINDLL.CSHARP]READMECS.TXT;1+,%./ 4X@-0123KPWO56O.h\7O.h\89GHJ On Windows open this file in WordPad. Contents of the "windll/csharp" sub-archive This directory contains Visual C Sharp (C#) sample project for using the unzip32.dll library. This project was generously donated by Adrian Maull. The Zip source archive contains a corresponding project for using the zip32.dll library. These sample projects are distributed as part of the Info-ZIP distribution under the Info-ZIP license. Note that the files may be saved in "UNIX LF" format with carriage returns stripped. These may need to be restored before the project can be successfully used. The project is based on .NET Framework 1.1. It was contributed to the Info-Zip project April 2005. If you have questions or comments, contact us at www.Info-ZIP.org or for specific questions about these projects contact Adrian Maull directly at adrian.maull@sprintpcs.com. See UnZip.cs for more detailed information about the project. Currently the sample project has some bugs as noted in the above file. The original code has been adapted to the modified WinDLL interface of UnZip 6, using Visual C# 2005 (.Net Framework 2.0) and a unzip32.dll compiled by Visual C++ 6.0. The provided project file is still in the format for Visual Studio 7.1 (VS .Net 2003, .Net 1.1). But the code of the project can be used with newer Visual Studio versions (2005 = 8.0 or 2008 = 9.0); only the project file gets (irreversibly) converted to the newer Visual Studio format when first opened. However, this project is not tested throughoutly by us at this time. Note on using Visual Studio C# 2005, 2008 (or newer?): The UnZip maintainer was unsuccessful to run the C# sample code using Visual Studio 2005 or 2008 together with an unzip32.dll compiled with the same Visual Studio version in default configuration (unzip32.dll linked against the DLL version of the C runtime library). The C# program failed to load the unzip32.dll because of an "OS loader lock" conflict. This conflict should only show up when loading "mixed mode" dll that contain both managed and unmanaged code. So, it cannot be caused by the "pure native code" unzip32.dll directly, which contains nothing dangerous in its DLLMain() function. It seems to be caused by the new "side-by-side" C runtime dlls (msvcr80.dll or msvcr90.dll being loaded multiple times by a .NET application that uses msvcr??-linked native dlls). To fix this issue, one of the following work-arounds could be used: a) use an unzip32.dll that was linked against the system msvcrt.dll (the "old" MSVC 6.0 runtime) that is a core system component of all Windows versions from Windows 98/Windows ME and Windows 2000 and newer (at least up to Windows Vista/Windows Server 2008), or b) use a statically linked variant of unzip32.dll (see the option DLLSTANDALONE in the MSC Makefile for Win32 executables, "win32/Makefile"). Ed Gordon, Christian Spieler 2009/01/17 !*[UNZIP60.WINDLL.CSHARP]UNZIP.CS;1+,D.8/ 488@-0123KPWO956'd\7'd\89GHJ_lx UNZIP.BCKD![UNZIP60.WINDLL.CSHARP]UNZIP.CS;1P_OLB;18C#region README //_____________________________________________________________________________ // //Sample C# code, .NET Framework 1.1, contributed to the Info-Zip project by //Adrian Maull, April 2005. // //If you have questions or comments, contact me at adrian.maull@sprintpcs.com. Though //I will try to respond to coments/questions, I do not guarantee such response. // //THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY //KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE //IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A //PARTICULAR PURPOSE. // //_____________________________________________________________________________ #endregion #region KNOWN ISSUES //_____________________________________________________________________________ // //KNOWN ISSUES: //From my testing I have encountered some issues // //1. I receive an error code from the Unzip32.dll when I try to retrieve the comment from the // zip file. To display a comment you set the nzflag of the DCLIST structure = 1. In this // implementation, just set the m_Unzip.ExtractList = ExtractListEnum.ListContents and // m_Unzip.DisplayComment = DisplayCommentEnum.True // I provided a work around to this in the GetZipFileComment() method. // // [CS, 2009-01-10:] // The DisplayComment option works now. However, the work-around code to // retrieve the zipfile comment using direct I/O has not yet been replaced // by code using the UnZip DLL. // //2. I have not tested any password/encryption logic in this sample //_____________________________________________________________________________ #endregion using System; using System.Security.Permissions; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; using System.IO; namespace CSharpInfoZip_UnZipSample { /// /// Summary description for Unzip. /// #region Public Enums public enum ExtractOnlyNewerEnum {False, True}; public enum SpaceToUnderScoreEnum {False, True}; public enum PromptToOverWriteEnum {NotRequired, Required}; public enum QuietEnum {AllMessages, LessMessages, NoMessages}; public enum WriteStdOutEnum {False, True}; public enum TestZipEnum {False, True}; public enum ExtractOrListEnum {Extract, ListContents}; public enum FreshenExistingEnum {False, True}; public enum DisplayCommentEnum {False, True}; public enum HonorDirectoriesEnum {False, True}; public enum OverWriteFilesEnum {False, True}; public enum ConvertCR_CRLFEnum {False, True}; public enum VerboseZIEnum {False, True}; public enum UnixFileBackupEnum { False, True } public enum CaseSensitivityEnum { True, False }; public enum RestoreTimeStampsEnum { All, FilesOnly, None }; public enum UTF8NameTranslationEnum { Automatic, EscapeNonASCII, Disabled }; public enum PrivilegeEnum {Default, ACL, Privilege}; public enum ReplaceFileOptionsEnum {ReplaceNo=100, ReplaceYes=102, ReplaceAll=103, ReplaceNone=104, ReplaceRename=105}; #endregion #region Event Delegates public delegate void UnZipDLLPrintMessageEventHandler(object sender, UnZipDLLPrintMessageEventArgs e); public delegate int UnZipDLLServiceMessageEventHandler(object sender, UnZipDLLServiceMessageEventArgs e); #endregion public class Unzip { public Unzip() { } #region Constants // Current version of the DCLIST interface structure, must be matched // with the UZ_DCL_STRUCTVER constant as defined in the struct.h header // from the UnZip WinDLL code. private const uint uz_dcl_StructVer = 0x600; #endregion #region Private Vars private ulong m_ZipFileSize; private ulong m_ZipFileCount; private int m_Stop; private string m_ZipFileName; private string m_ExtractionDirectory; private string m_Password; private string m_Comment; private string [] m_FilesToUnzip = new string[0]; //Default private string [] m_FilesToExclude = new string[0]; //Default private ZipFileEntries m_ZipFileEntries = new ZipFileEntries(); private Encoding m_EncodingANSI = Encoding.Default; private ExtractOnlyNewerEnum m_ExtractOnlyNewer; private SpaceToUnderScoreEnum m_SpaceToUnderScore; private PromptToOverWriteEnum m_PromptToOverWrite; private QuietEnum m_Quiet; private WriteStdOutEnum m_WriteStdOut; private TestZipEnum m_TestZip; private ExtractOrListEnum m_ExtractOrList; private FreshenExistingEnum m_FreshenExisting; private DisplayCommentEnum m_DisplayComment; private HonorDirectoriesEnum m_HonorDirectories; private OverWriteFilesEnum m_OverWriteFiles; private ConvertCR_CRLFEnum m_ConvertCR_CRLF; private VerboseZIEnum m_VerboseZI; private UnixFileBackupEnum m_UnixFileBackup; private CaseSensitivityEnum m_CaseSensitivity; private RestoreTimeStampsEnum m_RestoreTimeStamps; private UTF8NameTranslationEnum m_UTF8NameTranslation; private PrivilegeEnum m_Privilege; #endregion #region Structures // Callback Large String protected struct UNZIPCBChar { [MarshalAs( UnmanagedType.ByValArray, SizeConst= 32000, ArraySubType = UnmanagedType.U1)] public byte [] ch; } // Callback Small String (size of a filename buffer) protected struct UNZIPCBCh { [MarshalAs( UnmanagedType.ByValArray, SizeConst= 260, ArraySubType = UnmanagedType.U1)] public byte [] ch; } //UNZIP32.DLL DCLIST Structure [ StructLayout( LayoutKind.Sequential )] protected struct DCLIST { public uint StructVersID; // struct version id (= UZ_DCL_STRUCTVER) public int ExtractOnlyNewer; //1 = Extract Only Newer/New, Else 0 public int SpaceToUnderscore; //1 = Convert Space To Underscore, Else 0 public int PromptToOverwrite; //1 = Prompt To Overwrite Required, Else 0 public int fQuiet; //2 = No Messages, 1 = Less, 0 = All public int ncflag; //1 = Write To Stdout, Else 0 public int ntflag; //1 = Test Zip File, Else 0 public int nvflag; //0 = Extract, 1 = List Zip Contents public int nfflag; //1 = Extract Only Newer Over Existing, Else 0 public int nzflag; //1 = Display Zip File Comment, Else 0 public int ndflag; //1 = Honor Directories, Else 0 public int noflag; //1 = Overwrite Files, Else 0 public int naflag; //1 = Convert CR To CRLF, Else 0 public int nZIflag; //1 = Zip Info Verbose, Else 0 public int B_flag; //1 = backup existing files public int C_flag; //1 = Case Insensitivity, 0 = Case Sensitivity public int D_flag; //controls restoration of timestamps //0 = restore all timestamps (default) //1 = skip restoration of timestamps for folders // created on behalf of directory entries in the // Zip archive //2 = no restoration of timestamps; extracted files // and dirs get stamped with current time */ public int U_flag; // controls UTF-8 filename coding support //0 = automatic UTF-8 translation enabled (default) //1 = recognize UTF-8 coded names, but all non-ASC ~  vo~axuz_8:z|PLE.CSPROJ;1=R4BH(`uH?^&<`]'w|, 7qkV=QL-|Ig*Q!;>mN$}L''d ǣK8s+v'#R*]w$4q,c ^.L(ն7lV9^ly1]'n ~K i^X[+G!N_`9? z!n,V%aU ma 2yI_Y.B|x "U41(TD%E+tW!z/,-!z_c0HoMC'h5!kp.i!Gh 8n(d]k^X s D0N,&|,E^r&q[Y{Q^U0m|sD*_܆ rZ0ªsEyѭڱ`1[ "M3XVp-b)~h["iL4Xg6#@wh;Kuq6}P"mgW1U#~Rn<;g 8]'K52c/ rX 3DF-XL9plOQ"E$Opԝ("@G}U@š1n@ $Q^A [uRPYv0:%4nj=at]yW0j00=aieSdڰ݌LGe2{D I\&bN\w'7UJ\?f;y:>ZưzWfКj(zq=E6( _19MX& 0J;TxzG 5NkpVN<Y:"[g fbn4J7QWnjϭ %7 UwxvxL.iR\/C ytSlBp{u8y:+ GJ lqQr_vu'ZsW}01D?E54@LIqFeK+PmlV,`?sLAum7 @ 8$BR9MXtPz )^VCk*/5fop#7LN"+T $4@C[y~ n_`,{s2Q_=MJBoU.Ht&~cPvS2` TO,j(U5@h/R$o,IZo,]\ݜshmJ nZYUu5o"|Y.`acF*z1f|Q>z!"& Wsz;\h HhJt!.p` =Hzt`:L3.uN4:)Ul2ڱl#υ җMs5J+$c懑⦕&i?_8NoXp~l[3aOkpPs][^WI"Q.k0B1OdSuHJsP,6ERP\y$%%$YC/ViUv(BYM; _tPk>j>;`8u5c?Rjp^FIH'KN@:SGaqh$r!L#hp"zHMu&$j=E9xWu^$;@gE#Pog& b~+xbM3Ij@;!5( |'&UUFha5'U:2p<t`@HydM;i'q9[N}d"8i8E(vHK B,r.I'X 1|VQF)z? 51#z y7;iAtu*yF*8aO6f3?pcf\\X+;C$E,q~Z  YchD1jSw|yO#<{7z(I>^-AA;e:\Fa<"ZO`dP`=Cm`a0! X.nLFiW s;ps-#:LICqOQ\3tbi$7?&<-+ /XCd%CG2-^R#=dvU $\=8C ~[^Az@"B! %s -i]qP=`_vY6kJ17Bq^0?2:p]v3=Ck] Y|QajxfBFG/w)9$nh,)B?^d?2* z}rd>NHq={u@ fcnTKsf.uQN f8ps ODibz._ B"V&L!2bIh}w!k+yY\{=}VPK@,hMn,w1U/:GAGL+ k0S+DMVLfwOZ?A)ti"s;lugDF> B] y@>2W[wOVe-n$L~A K[a5tnt9bV,&IGWtyzLk$/$x5]'T`D[0gM p.X?o{@c , UuLv do'-&SI:UtyBl=/wq'}. mI[wV(QmW^=Lx15&;xo &b[Y&\]D>, CEQa7]k~_SY1:Uibf&$hpHUL"0-d,b. .r+i "2XNY]Bn FNRNV2u5bnJ1~?k=rlzq;@q4$8FqW^, *zA'+qXe}zS+IxSYJckMg 4f hVe`v9~tFVsk'r=5!WUcdZKi $ uH;pBV9 % X 3c*QT+GZs8C#H6lg DfGac.`QTkF|[QՕ"k:9W|=J?'`O,1{w/vrT>Cx R=`ofIP-a͙A`tyiKA6^jl]{HS0\D `:)!~d-cDM ^i>+OF,miYr7.t9iOs3gmTv|7_ 7*/%syJDxz(yNy+h5|^IF[WWFhdw^}? .AE R ==]w7 [TIRY515VdFa+r#(uvwaySrffg$a@Q+5#H /f"(FI@*`sc{t2 voMSG`zx.bw@FVWf_6?Rm)]6=^P9nH12k7qES`}jdt}Q`.pc2{rVxm4thWGL6$+@Y=nk,*s/(UgT'Ec| 9ZE6J|:~ wl_Tg-1.t+|t %CU|JQxBx]\r"e 09S-dvp(}{lrny!{,1<1 9/U`Hu}1H. gpL s`~05A+fqtw?37gmODiII)!d_/Xh~9 b#3GXK ]N/*hbLMb h0&gFPq1o]V>!SlMZg]/Um{fsjK!T@)>5u)Hf&Z&hvYx$296>-IjFt$E%ng  ;pp\C /ZwfMg q2=$` s}M*=!l:ET>?vd,BupFW\Oo@h7TNdAVB8s!%`R) %a^scvh[8YX'7).I3z6<N3$l/{L m*t*H& I xI5}*Me8Wi*b-uSxb:$G'(P>]'ZtXSvd>F^1'S>NYL]7;>^MdN"M0~Hl`0 P,!}Ch$}isz)Fk5a54_}aD \pw7_g@UJ 3KY\p$MQCL(@grWI!PEN>8\6?o#"*K"19!]-#T#5Y:PZ@8}jV&hy=w,_$UlF n ]5K_ 9e.#_Wl,n qzIAi~aW P[i|=6rVF5Ru52?2;gqaE J , u?*]T6R}rle xD W.Hxo +.[ koS FP9F768&*wjj4;a Z\v=kub5|~%HPOT'/*0)tpoBeteG7wKU 7 V'vT=z%W3g"iy;T7`59y+ep2m?-=a UbyZ6j/a f'`b#937s =uv,RH{WZR2W-T5jt/lC  t/NWR%R$ Q+fGpf* CsG77*dDV2$ VOgg~Yn$(q@1945V!LVp 8 >DB "c"%ykyVzEt}z8D@M0o J.ve19u>@!%K`X8~{AP6 )[|Zc0],Z~-oEjeOJ1^J1y$5>U-J_V@a" :7}|[*zT YJx/o xJv ef*AjVRSSFv^>pC}|S$0Ak&Ba~`δkͳSuwD &rӣ훸*Lƙ\m_2Ճ́՞Zrlwupe2!p$8*203.*fZ]%+!FپߣAΜh게ܪ#IЛڽۋᾲ\ yYƛi M0"6Z.OO,tQy0e6!x#$Iwo_zVl05j jhbR|a% n ?E· sx$+dtG yE aS.=v({Bds ?U|tuF gX{{ (wA:b1&2tUm4?EWNHeʞxҠƅȵ߷0%vYGel|m:LXZ8-eT=cgr<(St sxNOma$0WP ߑ} 6)Rf ;?WqSA>{rwyIKb#<>jb^rLŦQύ V*eo '8) J1o]+&RPVyh=['fV 003dk;jXP it5SyQ4`, gfUqQ!bK Bt %dU?qE{#XYP;tL|H ,^*ySAa, =\`*7,%4w u;nYiPR&,+=TeOu OHF,$%9537usg`&yhloKb*8DsX` dJOD|94#"#g^vK w5"I/oksx+u|Cs5 :/i?5.;mjiQ&.%>mM1Sgaf= bufsize) { MessageBox.Show("Length of supplied password exceeds available pw buffer size " + bufsize.ToString() + "!", "Password Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return 5; // IZ_PW_ERROR } //clear the byte array for (int i = 0; i < bufsize; i ++) pwd.ch[i] = 0; m_EncodingANSI.GetBytes(m_Password, 0, m_Password.Length, pwd.ch, 0); return 0; } protected int UZDLLReplace(ref UNZIPCBCh fname, uint fnbufsiz) { ReplaceFileOptionsEnum ReplaceFileOption = ReplaceFileOptionsEnum.ReplaceNo; //Default string s = string.Empty; int i = 0; if (fnbufsiz > fname.ch.Length) fnbufsiz = (uint)fname.ch.Length; for (i = 0; i < fnbufsiz; i++) if (fname.ch[i] == 0) break; s = m_EncodingANSI.GetString(fname.ch, 0, i); DialogResult rslt = MessageBox.Show("Overwrite [" + s + "]? Click Cancel to skip all.", "Overwrite Confirmation", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); switch (rslt) { case DialogResult.No: ReplaceFileOption = ReplaceFileOptionsEnum.ReplaceNo; break; case DialogResult.Yes: ReplaceFileOption = ReplaceFileOptionsEnum.ReplaceYes; break; case DialogResult.Cancel: ReplaceFileOption = ReplaceFileOptionsEnum.ReplaceNone; break; } return ConvertEnumToInt(ReplaceFileOption); } #endregion #region Public Functions public int UnZipFiles () { int ret = -1; //check to see if there is enough information to proceed. //Exceptions can be thrown if required data is not passed in if (m_ZipFileName == string.Empty) return -1; if (m_ExtractionDirectory == string.Empty) return -1; //The zip file size, in bytes, is stored in the m_ZipFileSize variable. //m_ZipFileCount is the number of files in the zip. This information //is useful for some sort of progress information during unzipping. if (!GetZipFileSizeAndCount()) return ret; DCLIST dclist = new DCLIST(); dclist.StructVersID = uz_dcl_StructVer; // Current version of this structure dclist.ExtractOnlyNewer = ConvertEnumToInt(m_ExtractOnlyNewer); dclist.SpaceToUnderscore = ConvertEnumToInt(m_SpaceToUnderScore); dclist.PromptToOverwrite = ConvertEnumToInt(m_PromptToOverWrite); dclist.fQuiet = ConvertEnumToInt(m_Quiet); dclist.ncflag = ConvertEnumToInt(m_WriteStdOut); dclist.ntflag = ConvertEnumToInt (m_TestZip); dclist.nvflag = ConvertEnumToInt(m_ExtractOrList); dclist.nfflag = ConvertEnumToInt(m_FreshenExisting); dclist.nzflag = ConvertEnumToInt(m_DisplayComment); dclist.ndflag = ConvertEnumToInt(m_HonorDirectories); dclist.noflag = ConvertEnumToInt(m_OverWriteFiles); dclist.naflag = ConvertEnumToInt(m_ConvertCR_CRLF); dclist.nZIflag = ConvertEnumToInt(m_VerboseZI); dclist.B_flag = ConvertEnumToInt(m_UnixFileBackup); dclist.C_flag = ConvertEnumToInt(m_CaseSensitivity); dclist.D_flag = ConvertEnumToInt(m_RestoreTimeStamps); dclist.U_flag = ConvertEnumToInt(m_UTF8NameTranslation); dclist.fPrivilege = ConvertEnumToInt(m_Privilege); dclist.Zip = m_ZipFileName; dclist.ExtractDir = m_ExtractionDirectory; USERFUNCTION uf = PrepareUserFunctionCallbackStructure(); try { ret = Wiz_SingleEntryUnzip(m_FilesToUnzip.Length, m_FilesToUnzip, m_FilesToExclude.Length, m_FilesToExclude, ref dclist, ref uf); } catch (Exception e) { MessageBox.Show (e.ToString() + Environment.NewLine + "Last Win32ErrorCode: " + Marshal.GetLastWin32Error()); //You can check the meaning of return codes here: //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes__0-499_.asp } return ret; } public bool GetZipFileSizeAndCount(ref ulong size, ref ulong fileCount) { if (!GetZipFileSizeAndCount()) return false; size = m_ZipFileSize; 'N UNZIP.BCKD![UNZIP60.WINDLL.CSHARP]UNZIP.CS;1P_OLB;18. fileCount = m_ZipFileCount; return true; } public ZipFileEntries GetZipFileContents () { int ret = 0; DCLIST dclist = new DCLIST(); dclist.StructVersID = uz_dcl_StructVer; dclist.nvflag = ConvertEnumToInt(ExtractOrListEnum.ListContents); dclist.Zip = m_ZipFileName; USERFUNCTION uf = PrepareUserFunctionCallbackStructure(); m_ZipFileSize = 0; m_ZipFileCount = 0; m_ZipFileEntries.Clear(); //This call will fill the m_ZipFileEntries collection because when the nvflag = ExtractListEnum.ListContents //the UZReceiveDLLMessage callback function is called try { ret = Wiz_SingleEntryUnzip(m_FilesToUnzip.Length, m_FilesToUnzip, m_FilesToExclude.Length, m_FilesToExclude, ref dclist, ref uf); } catch(Exception e) { MessageBox.Show (e.ToString() + Environment.NewLine + "Last Win32ErrorCode: " + Marshal.GetLastWin32Error()); //You can check the meaning of return codes here: //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes__0-499_.asp } return m_ZipFileEntries; } public string GetZipFileComment() { //WORK AROUND: //This method provides a work around to setting the nzflag of the DCLIST structure = 1, which instructs //the dll to extract the zip file comment. See the KNOWN ISSUES region at the beginning of this code //sample. //NOTE: //Explanation of Big Endian and Little Endian Architecture //http://support.microsoft.com/default.aspx?scid=kb;en-us;102025 //Bytes in the stream are in Big Endian format. We have to read the bytes and //convert to Little Endian format. That's what the GetLittleEndianByteOrder function //does. const int CENTRALRECORDENDSIGNATURE = 0x06054b50; const int CENTRALRECORDENDSIZE = 22; string comment = string.Empty; Encoding ae = Encoding.Default; if (m_ZipFileName == null | m_ZipFileName == string.Empty) return string.Empty; try { FileStream fs = File.OpenRead(m_ZipFileName); long pos = fs.Length - CENTRALRECORDENDSIZE; while (GetLittleEndianByteOrder(fs,4) != CENTRALRECORDENDSIGNATURE) fs.Seek(pos--, SeekOrigin.Begin); int diskNumber = GetLittleEndianByteOrder(fs,2); /* number of this disk */ int startingDiskNum = GetLittleEndianByteOrder(fs,2); /* number of the starting disk */ int entriesOnrThisDisk = GetLittleEndianByteOrder(fs,2); /* entries on this disk */ int totalEntries = GetLittleEndianByteOrder(fs,2); /* total number of entries */ int centralDirectoryTotalSize = GetLittleEndianByteOrder(fs,4); /* size of entire central directory */ int offsetOfCentralDirectory = GetLittleEndianByteOrder(fs,4); /* offset of central on starting disk */ //This is what we really want here int commentSize = GetLittleEndianByteOrder(fs,2); /* length of zip file comment */ byte[] zipFileComment = new byte[commentSize]; fs.Read(zipFileComment, 0, zipFileComment.Length); comment = ae.GetString(zipFileComment, 0, zipFileComment.Length); fs.Close(); } catch (Exception e) { throw new Exception(e.Message); } return comment; } public void Stop () { //m_Stop gets returned from the UZDLLService callback. //A value of 1 means abort processing. m_Stop = 1; } #endregion #region Private Functions private int ConvertEnumToInt (System.Enum obj) { return Convert.ToInt32(obj); } private bool GetZipFileSizeAndCount() { int ret = 0; DCLIST dclist = new DCLIST(); dclist.StructVersID = uz_dcl_StructVer; // Current version of this structure dclist.nvflag = ConvertEnumToInt(ExtractOrListEnum.ListContents); dclist.Zip = m_ZipFileName; dclist.ExtractDir = m_ExtractionDirectory; USERFUNCTION uf = PrepareUserFunctionCallbackStructure(); //Reset these variables m_ZipFileSize = 0; m_ZipFileCount = 0; ret = Wiz_SingleEntryUnzip(m_FilesToUnzip.Length, m_FilesToUnzip, m_FilesToExclude.Length, m_FilesToExclude, ref dclist, ref uf); return (ret == 0); } private USERFUNCTION PrepareUserFunctionCallbackStructure() { USERFUNCTION uf = new USERFUNCTION(); uf.UZDLLPrnt = new UZDLLPrintCallback(UZDLLPrint); uf.UZDLLSND = 0; //Not supported uf.UZDLLREPLACE = new UZDLLReplaceCallback(UZDLLReplace); uf.UZDLLPASSWORD = new UZDLLPasswordCallback(UZDLLPassword); uf.UZDLLMESSAGE = new UZReceiveDLLMessageCallback(UZReceiveDLLMessage); uf.UZDLLSERVICE = new UZDLLServiceCallback(UZDLLService); uf.UZDLLMESSAGE_I32 = null; // not used uf.UZDLLSERVICE_I32 = null; // not used return uf; } private int GetLittleEndianByteOrder(FileStream fs, int len) { int result = 0; int n = 0; int [] byteArr = new int[len]; //Pull the bytes from the stream for(n=0;n /// Summary description for UnZipDLLPrintMessageEventArgs. /// public class UnZipDLLPrintMessageEventArgs : EventArgs { private string m_PrintMessage = string.Empty; public UnZipDLLPrintMessageEventArgs(string msg) { m_PrintMessage = msg; } public string PrintMessage { get {return m_PrintMessage;} } } } ;*[UNZIP60.WINDLL.CSHARP]UNZIPDLLSERVICEMESSAGEEVENTARGS.CS;1+,?./ 4a@-0123KPWO56dS7dS89GHJmכ UNZIP.BCK?;[UNZIP60.WINDLL.CSHARP]UNZIPDLLSERVICEMESSAGEEVENTARGS.CS;1x#region README //_____________________________________________________________________________ // //Sample C# code, .NET Framework 1.1, contributed to the Info-Zip project by //Adrian Maull, April 2005. // //If you have questions or comments, contact me at adrian.maull@sprintpcs.com. Though //I will try to respond to coments/questions, I do not guarantee such response. // //THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY //KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE //IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A //PARTICULAR PURPOSE. // //_____________________________________________________________________________ #endregion using System; namespace CSharpInfoZip_UnZipSample { /// /// Summary description for UnZipDLLServiceMessageEventArgs. /// public class UnZipDLLServiceMessageEventArgs { private ulong m_ZipFileSize = 0; private ulong m_SizeOfFileEntry = 0; private string m_FileEntryName = string.Empty; //zipFileSize = Total size of the zip file //fileEntryBytes - size of an individual file in the zip //fileEntryName - name of an individual file in the zip public UnZipDLLServiceMessageEventArgs(ulong zipFileSize, string fileEntryName, ulong fileEntryBytes) { m_ZipFileSize = zipFileSize; m_SizeOfFileEntry = fileEntryBytes; m_FileEntryName = fileEntryName; } public ulong ZipFileSize { get {return m_ZipFileSize;} } public ulong SizeOfFileEntry { get {return m_SizeOfFileEntry;} } public string FileEntryName { get {return m_FileEntryName;} } } } **[UNZIP60.WINDLL.CSHARP]ZIPFILEENTRIES.CS;1+,./ 4@-0123KPWO56P707P7089GHJ#region README //_____________________________________________________________________________ // //Sample C# code, .NET Framework 1.1, contributed to the Info-Zip project by //Adrian Maull, April 2005. // //If you have questions or comments, contact me at adrian.maull@sprintpcs.com. Though //I will try to respond to coments/questions, I do not guarantee such response. // //THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY //KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE //IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A //PARTICULAR PURPOSE. // //_____________________________________________________________________________ #endregion using System; using System.Collections; namespace CSharpInfoZip_UnZipSample { /// /// Summary description for ZipFileEntries /// [Serializable] public class ZipFileEntries: CollectionBase, IDisposable { public ZipFileEntries() { } //the normal collections methods... public void Add(ZipFileEntry obj) { List.Add(obj); } public void Remove(int index) { if (index > Count - 1 || index < 0) { //throw an error here... } else { List.RemoveAt(index); } } public ZipFileEntry Item(int Index) { return (ZipFileEntry) List[Index]; } #region IDisposable Members public void Dispose() { //Any custom dispose logic goes here... } #endregion } } (*[UNZIP60.WINDLL.CSHARP]ZIPFILEENTRY.CS;1+,./ 4@-0123KPWO56.-W7.-W89GHJ #region README //_____________________________________________________________________________ // //Sample C# code, .NET Framework 1.1, contributed to the Info-Zip project by //Adrian Maull, April 2005. // //If you have questions or comments, contact me at adrian.maull@sprintpcs.com. Though //I will try to respond to coments/questions, I do not guarantee such response. // //THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY //KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE //IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A //PARTICULAR PURPOSE. // //_____________________________________________________________________________ #endregion using System; namespace CSharpInfoZip_UnZipSample { /// /// Summary description for ZipFileEntry. /// public class ZipFileEntry { #region Private Vars private string m_FileName; private string m_FilePath; private bool m_IsFolder; private ulong m_FileSize; private int m_FileMonth; private int m_FileDay; private int m_FileYear; private int m_FileHour; private int m_FileMinute; private int m_CompressionFactor; private ulong m_CompressedSize; private string m_CompressMeth; #endregion public ZipFileEntry() { } #region Properties public string FileName { get {return m_FileName;} set {m_FileName = value;} } public string FilePath { get {return m_FilePath;} set {m_FilePath = value;} } public bool IsFolder { get {return m_IsFolder;} set {m_IsFolder = value;} } public ulong FileSize { get {return m_FileSize;} set {m_FileSize = value;} } public int FileMonth { get {return m_FileMonth;} set {m_FileMonth = value;} } public int FileDay { get {return m_FileDay;} set {m_FileDay = value;} } public int FileYear { get {return m_FileYear;} set {m_FileYear = value;} } public int FileHour { get {return m_FileHour;} set {m_FileHour = value;} } public int FileMinute { get {return m_FileMinute;} set {m_FileMinute = value;} } public int CompressionFactor { get {return m_CompressionFactor;} set {m_CompressionFactor = value;} } public ulong CompressedSize { get {return m_CompressedSize;} set {m_CompressedSize = value;} } public string CompressionMethShort { get {return m_CompressMeth;} set {m_CompressMeth = value;} } #endregion } } *[UNZIP60.WINDLL]DECS.H;1+, ./ 4@-M0123KPWO56dH"Y7dH"Y89GHJ/* Copyright (c) 1990-2007 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2007-Mar-04 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifndef __decs_h /* prevent multiple inclusions */ #define __decs_h /* for UnZip, the "basic" part of the win32 api is sufficient */ #ifndef WIN32_LEAN_AND_MEABʋ UNZIP.BCK M[UNZIP60.WINDLL]DECS.H;1ZIPSFX.AXP_OLB;1уN # define WIN32_LEAN_AND_MEAN # define IZ_HASDEFINED_WIN32LEAN #endif #include #ifndef __unzip_h # include "../unzip.h" #endif #ifndef __structs_h # include "../windll/structs.h" #endif #ifdef IZ_HASDEFINED_WIN32LEAN # undef WIN32_LEAN_AND_MEAN # undef IZ_HASDEFINED_WIN32LEAN #endif #define Wiz_Match match #ifdef __cplusplus extern "C" { #endif void WINAPI Wiz_NoPrinting(int f); int WINAPI Wiz_Validate(LPSTR archive, int AllCodes); BOOL WINAPI Wiz_Init(zvoid *, LPUSERFUNCTIONS); BOOL WINAPI Wiz_SetOpts(zvoid *, LPDCL); int WINAPI Wiz_Unzip(zvoid *, int, char **, int, char **); int WINAPI Wiz_SingleEntryUnzip(int, char **, int, char **, LPDCL, LPUSERFUNCTIONS); int WINAPI Wiz_SingleEntryUnzpList(unsigned, LPCSTR, unsigned, LPCSTR, LPDCL, LPUSERFUNCTIONS); int WINAPI Wiz_UnzipToMemory(LPSTR zip, LPSTR file, LPUSERFUNCTIONS lpUserFunctions, UzpBuffer *retstr); int WINAPI Wiz_Grep(LPSTR archive, LPSTR file, LPSTR pattern, int cmd, int SkipBin, LPUSERFUNCTIONS lpUserFunctions); #ifdef __cplusplus } #endif #endif /* __decs_h */ *[UNZIP60.WINDLL]GUISFX.DIR;1+,./ 4-M0123 KPWO56׼7׼89GHJIDIALOG.HISFXW.ICOSFXWIZ.C SFXWIZ.DLGQ SFXWIZ.RC[ SFXWIZ16.MAKt UNZSFX16.DEF!*[UNZIP60.WINDLL.GUISFX]DIALOG.H;1+,I./ 4@-0123KPWO56Z$ 7Z$ 89GHJ/* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* dialog.h for sfxwiz */ #define ICN_INSTALL 10 #define IDM_REPLACE_NO 100 #define IDM_REPLACE_TEXT 101 #define IDM_REPLACE_YES 102 #define IDM_REPLACE_ALL 103 #define IDM_REPLACE_NONE 104 #define ID_TARGET 201 #define ID_TEXT1 202 #define ID_TEXT2 203 #define ID_TEXT3 204 #define ID_BROWSE 205 #define ID_INSTALL 206 #define ID_INFOZIP 207 #define ID_AUTHOR 208 #define ID_EMAIL 209 #define ID_STATUS 210 #define INITDIALOG 300 !*[UNZIP60.WINDLL.GUISFX]SFXW.ICO;1+,./ 4@-0123KPWO56JeҜ7JeҜ89GHJ ( @ə əə̜̙̜̙̙əə!*[UNZIP60.WINDLL.GUISFX]SFXWIZ.C;1+,.$/ 4$$Z@-0123KPWO%56U`)s7U`)s89GHJ /* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* Tell Microsoft Visual C++ 2005 (and newer) to leave us alone * and let us use standard C functions the way we're supposed to. * (These preprocessor symbols must appear before the first system * header include.) */ #if defined(_MSC_VER) && (_MSC_VER >= 1400) # ifndef _CRT_SECURE_NO_WARNINGS # define _CRT_SECURE_NO_WARNINGS # endif #endif #include #include #ifdef WIN32 # if defined(__LCC__) # include # include # include # endif #include #else #include #include #include #include #include #include #include #endif #include "dialog.h" #ifndef UzpMatch #define UzpMatch match #endif #include "../structs.h" #include "../decs.h" LPUSERFUNCTIONS lpUserFunctions; HANDLE hUF = (HANDLE)NULL; LPDCL lpDCL = NULL; HANDLE hZUF = (HANDLE)NULL; HANDLE hDCL = (HANDLE)NULL; BOOL fDoAll = FALSE; char ** argv; HINSTANCE hInst; HWND hWnd; #ifndef TCHAR #define TCHAR char #endif #ifndef _MAX_PATH #define _MAX_PATH 260 #endif int WINAPI password(LPSTR p, int n, LPCSTR m, LPCSTR name); int WINAPI DisplayBuf(TCHAR far *buf, unsigned long size); int WINAPI GetReplaceDlgRetVal(LPSTR filename, unsigned fnbufsiz); #ifdef Z_UINT8_DEFINED void WINAPI ReceiveDllMessage(z_uint8 ucsize, z_uint8 csiz, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, TCHAR fCrypt); #else void WINAPI ReceiveDllMessage(unsigned long ucsize, unsigned long csiz, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, TCHAR fCrypt); #endif void WINAPI ReceiveDllMessage_NO_INT64(unsigned long ucsize_low, unsigned long ucsize_high, unsigned long csiz_low, unsigned long csiz_high, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, TCHAR fCrypt); char szAppName[_MAX_PATH]; char szTarget[_MAX_PATH]; char szThisApp[_MAX UNZIP.BCK![UNZIP60.WINDLL.GUISFX]SFXWIZ.C;1P_OLB;1$v_PATH]; int iReturn; DLGPROC fpProc; #ifndef MAX_PATH #define MAX_PATH _MAX_PATH // maximum path =length #endif #define TRUE 1 // true value #define FALSE 0 // false value TCHAR zfn[MAX_PATH], // zip filename and path szHomeDir[MAX_PATH]; // Original directory /**************************************************************************** FUNCTION: Replace(HWND, WORD, WPARAM, LPARAM) PURPOSE: Processes messages for "Replace" dialog box MESSAGES: WM_INITDIALOG - initialize dialog box WM_COMMAND - Input received ****************************************************************************/ BOOL WINAPI ReplaceProc(HWND hReplaceDlg, WORD wMessage, WPARAM wParam, LPARAM lParam) { static char __far *lpsz; TCHAR szTemp[MAX_PATH]; switch (wMessage) { case WM_INITDIALOG: lpsz = (char __far *)lParam; wsprintf(szTemp, "Replace %s ?", (LPSTR)lpsz); SetDlgItemText(hReplaceDlg, IDM_REPLACE_TEXT, szTemp); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: /* ESC key */ case IDOK: /* Enter key */ EndDialog(hReplaceDlg, IDM_REPLACE_NO); break; case IDM_REPLACE_ALL: fDoAll = TRUE; case IDM_REPLACE_NONE: case IDM_REPLACE_YES: case IDM_REPLACE_NO: EndDialog(hReplaceDlg, wParam); break; } return TRUE; } return FALSE; } /**************************************************************************** FUNCTION: GetDirProc(HWND, unsigned, WPARAM, LPARAM) PURPOSE: Processes messages for "Set Reference Dir Procedure for Update Archive" dialog box MESSAGES: WM_INITDIALOG - initialize dialog box WM_COMMAND - Input received ****************************************************************************/ #ifdef WIN32 BOOL WINAPI GetDirProc(HWND hDlg, WORD wMessage, WPARAM wParam, LPARAM lParam) { switch (wMessage) { case WM_INITDIALOG: /* Common control identifiers for GetOpenFileName and GetSaveFileName Control identifier Control Description cmb2 Drop-down combo box that displays the current drive or folder, and that allows the user to select a drive or folder to open stc4 Label for the cmb2 combo box lst1 List box that displays the contents of the current drive or folder stc1 Label for the lst1 list box edt1 Edit control that displays the name of the current file, or in which the user can type the name of the file to open stc3 Label for the edt1 edit control cmb1 Drop-down combo box that displays the list of file type filters stc2 Label for the cmb1 combo box chx1 The read-only check box IDOK The OK command button (push button) IDCANCEL The Cancel command button (push button) pshHelp The Help command button (push button) */ CommDlg_OpenSave_HideControl(GetParent(hDlg), cmb1); CommDlg_OpenSave_HideControl(GetParent(hDlg), stc2); CommDlg_OpenSave_HideControl(GetParent(hDlg), edt1); CommDlg_OpenSave_HideControl(GetParent(hDlg), stc3); CommDlg_OpenSave_SetControlText(GetParent(hDlg), IDOK, "Set"); break; default: break; } return DefWindowProc(hDlg, wMessage, wParam, lParam); } #else #ifdef __BORLANDC__ #pragma argsused #endif BOOL WINAPI GetDirProc(HWND hwndDlg, WORD wMessage, WPARAM wParam, LPARAM lParam) { HWND hTemp; switch (wMessage) { case WM_INITDIALOG: hTemp = GetDlgItem(hwndDlg, lst1); EnableWindow(hTemp, FALSE); ShowWindow(hTemp, SW_HIDE); hTemp = GetDlgItem(hwndDlg, edt1); EnableWindow(hTemp, FALSE); ShowWindow(hTemp, SW_HIDE); hTemp = GetDlgItem(hwndDlg, stc2); EnableWindow(hTemp, FALSE); ShowWindow(hTemp, SW_HIDE); hTemp = GetDlgItem(hwndDlg, stc3); EnableWindow(hTemp, FALSE); ShowWindow(hTemp, SW_HIDE); hTemp = GetDlgItem(hwndDlg, cmb1); EnableWindow(hTemp, FALSE); ShowWindow(hTemp, SW_HIDE); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hwndDlg, FALSE); break; case IDOK: getcwd(szTarget, MAX_PATH); EndDialog(hwndDlg, TRUE); break; } default: break; } return FALSE; } #endif /* !WIN32 */ #ifdef __BORLANDC__ #pragma argsused #endif BOOL FAR PASCAL InitDialogProc (HWND hDlg, WORD wMsg, WORD wParam, LONG lParam) { BOOL fProcessed = TRUE; TCHAR szMessage[256]; RECT rc; switch (wMsg) { case WM_INITDIALOG: hWnd = hDlg; SetWindowText(hDlg,(LPSTR) szAppName); SetDlgItemText(hDlg,ID_TARGET,(LPSTR)szTarget); #ifdef WIN32 GetCurrentDirectory(MAX_PATH, szHomeDir); SetCurrentDirectory(szTarget); #else getcwd(szHomeDir, MAX_PATH); chdir(szTarget); setdisk(toupper(szTarget[0]) - 'A'); #endif GetWindowRect(hDlg, &rc); SetWindowPos(hDlg, NULL, (GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left)) / 2, (GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top)) / 3, 0, 0, SWP_NOSIZE | SWP_NOZORDER); break; case WM_COMMAND: switch (wParam) { case ID_BROWSE : { #ifndef WIN32 FARPROC lpGetDirProc; #endif char szTemp[MAX_PATH]="mike_~@~*"; OPENFILENAME ofn; memset(&ofn, '\0', sizeof(OPENFILENAME)); /* init struct */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.hInstance = hInst; ofn.lpstrFilter = NULL; ofn.nFilterIndex = 1; ofn.lpstrFile = szTemp; ofn.nMaxFile = MAX_PATH; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = MAX_PATH; /* ignored ! */ ofn.lpstrTitle = (LPSTR)"Set Extraction Directory"; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_ENABLEHOOK | #ifdef WIN32 OFN_EXPLORER| #endif OFN_HIDEREADONLY|OFN_NOVALIDATE; #ifndef WIN32 lpGetDirProc = MakeProcInstance((FARPROC)GetDirProc, hInst); #ifndef MSC (UINT CALLBACK *)ofn.lpfnHook = (UINT CALLBACK *)lpGetDirProc; #else ofn.lpfnHook = lpGetDirProc; #endif #else ofn.lpfnHook = (LPOFNHOOKPROC)GetDirProc; #endif ofn.lpTemplateName = "GETDIR"; /* see getfiles.dlg */ if (!GetOpenFileName(&ofn)) { break; } ofn.lpstrFile[ofn.nFileOffset-1] = '\0'; #ifdef WIN32 SetCurrentDirectory(ofn.lpstrFile); #else getcwd(szTemp, MAX_PATH); chdir(ofn.lpstrFile); setdisk(toupper(ofn.lpstrFile[0]) - 'A'); #endif lstrcpy(szTarget,ofn.lpstrFile); SetDlgItemText(hDlg,ID_TARGET,(LPSTR)szTarget); } break; case IDOK: #ifdef WIN32 GetCurrentDirectory(_MAX_PATH,szTarget); #else  M UNZIP.BCK![UNZIP60.WINDLL.GUISFX]SFXWIZ.C;1P_OLB;1$getcwd(szTarget, _MAX_PATH); #endif lpDCL->ncflag = 0; lpDCL->fQuiet = 0; // If not zero, no status messages will come through lpDCL->ntflag = 0; lpDCL->nvflag = 0; lpDCL->nzflag = 0; lpDCL->ndflag = 1; lpDCL->naflag = 0; lpDCL->nfflag = 0; lpDCL->noflag = 0; lpDCL->PromptToOverwrite = 1; lpDCL->ExtractOnlyNewer = 0; lpDCL->lpszZipFN = zfn; lpDCL->lpszExtractDir = NULL; iReturn = Wiz_SingleEntryUnzip(0, NULL, 0, NULL, lpDCL, lpUserFunctions); /* external return codes for unzip library */ //#define PK_OK 0 /* no error */ //#define PK_COOL 0 /* no error */ //#define PK_WARN 1 /* warning error */ //#define PK_ERR 2 /* error in zipfile */ //#define PK_BADERR 3 /* severe error in zipfile */ //#define PK_MEM 4 /* insufficient memory (during initialization) */ //#define PK_MEM2 5 /* insufficient memory (password failure) */ //#define PK_MEM3 6 /* insufficient memory (file decompression) */ //#define PK_MEM4 7 /* insufficient memory (memory decompression) */ //#define PK_MEM5 8 /* insufficient memory (not yet used) */ //#define PK_NOZIP 9 /* zipfile not found */ //#define PK_PARAM 10 /* bad or illegal parameters specified */ //#define PK_FIND 11 /* no files found */ //#define PK_DISK 50 /* disk full */ //#define PK_EOF 51 /* unexpected EOF */ //#define IZ_CTRLC 80 /* user hit ^C to terminate */ //#define IZ_UNSUP 81 /* no files found: all unsup. compr/encrypt. */ //#define IZ_BADPWD 82 /* no files found: all had bad password */ /* return codes of password fetches (negative = user abort; positive = error) */ //#define IZ_PW_ENTERED 0 /* got some password string; use/try it */ //#define IZ_PW_CANCEL -1 /* no password available (for this entry) */ //#define IZ_PW_CANCELALL -2 /* no password, skip any further pwd. request */ //#define IZ_PW_ERROR 5 /* = PK_MEM2 : failure (no mem, no tty, ...) */ switch (iReturn) { case PK_OK: wsprintf(szMessage, "%s", "All files extracted OK"); break; case PK_ERR: wsprintf(szMessage, "%s", "Warning occurred on one or more files"); break; case PK_BADERR: wsprintf(szMessage, "%s", "Error in archive"); break; case PK_MEM: case PK_MEM2: case PK_MEM3: case PK_MEM4: case PK_MEM5: wsprintf(szMessage, "%s", "Insufficient memory"); break; case PK_NOZIP: wsprintf(szMessage, "%s", "Archive not found"); break; case PK_FIND: wsprintf(szMessage, "%s", "No files found"); break; case PK_DISK: wsprintf(szMessage, "%s", "Disk full"); break; case PK_EOF: wsprintf(szMessage, "%s", "Unexpected end of file"); break; case IZ_UNSUP: wsprintf(szMessage, "%s", "No files found: All unsupported"); break; case IZ_BADPWD: wsprintf(szMessage, "%s", "No files found: Bad password"); break; default: wsprintf(szMessage, "%s", "Unknown error"); break; } MessageBox(hDlg, szMessage, szAppName, MB_OK); /* Uncomment line below to have SFXWix terminate automatically when done. */ // EndDialog(hDlg, wParam); break; case IDCANCEL: EndDialog(hDlg, wParam); PostQuitMessage(0); exit(0); // ..and then quit break; } break; default: fProcessed = FALSE; break; } return(fProcessed); } #define WasCancelled(hDlg) (!IsWindowEnabled(GetDlgItem(hDlg,IDCANCEL))) #ifdef __BORLANDC__ #pragma argsused #endif int WINAPI password(LPSTR p, int n, LPCSTR m, LPCSTR name) { TCHAR sz[MAX_PATH]; sprintf(sz, "%s is encrypted", name); MessageBox(hWnd, sz, "Encryption not supported", MB_OK); return IZ_PW_CANCELALL; } int WINAPI DisplayBuf(TCHAR far *buf, unsigned long size) { if ((buf[0] != '\n') && (buf[0] != '\r')) SetDlgItemText(hWnd, ID_STATUS, buf); return (unsigned int) size; } #ifdef __BORLANDC__ #pragma argsused #endif int WINAPI GetReplaceDlgRetVal(LPSTR filename, unsigned fnbufsiz) { #ifndef WIN32 FARPROC lpfnprocReplace; #endif int ReplaceDlgRetVal; /* replace dialog return value */ #ifdef WIN32 ReplaceDlgRetVal = DialogBoxParam(hInst, "Replace", hWnd, (DLGPROC)ReplaceProc, (DWORD)filename); #else lpfnprocReplace = MakeProcInstance(ReplaceProc, hInst); ReplaceDlgRetVal = DialogBoxParam(hInst, "Replace", hWnd, lpfnprocReplace, (DWORD)filename); FreeProcInstance(lpfnprocReplace); #endif return ReplaceDlgRetVal; } #ifdef __BORLANDC__ #pragma argsused #endif #ifdef Z_UINT8_DEFINED void WINAPI ReceiveDllMessage(z_uint8 ucsize, z_uint8 csiz, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, TCHAR fCrypt) { } #else void WINAPI ReceiveDllMessage(unsigned long ucsize, unsigned long csiz, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, TCHAR fCrypt) { } #endif void WINAPI ReceiveDllMessage_NO_INT64(unsigned long ucsize_low, unsigned long ucsize_high, unsigned long csiz_low, unsigned long csiz_high, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, TCHAR c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, TCHAR fCrypt) { } #ifdef __BORLANDC__ #pragma argsused #endif int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { TCHAR *ptr = NULL; hInst = hInstance; hDCL = GlobalAlloc( GPTR, (DWORD)sizeof(DCL)); if (!hDCL) { return 0; } lpDCL = (LPDCL)GlobalLock(hDCL); if (!lpDCL) { return 0; } hUF = GlobalAlloc( GPTR, (DWORD)sizeof(USERFUNCTIONS)); if (!hUF) { return 0; } lpUserFunctions = (LPUSERFUNCTIONS)GlobalLock(hUF); if (!lpUserFunctions) { return 0; } lpUserFunctions->password = password; lpUserFunctions->print = DisplayBuf; lpUserFunctions->sound = NULL; lpUserFunctions->replace = GetReplaceDlgRetVal; lpUserFunctions->SendApplicationMessage = ReceiveDllMessage; lpUserFunctions->SendApplicationMessage_i32 = ReceiveDllMessage_NO_INT64; lpUserFunctions->ServCallBk = NULL; GetModuleFileName(hInstance,(LPSTR)szThisApp,sizeof(szThisApp)); lstrcpy(zfn, szThisApp); ptr = strrchr(szThisApp, '\\'); if (ptr != NULL) { lstrcpy(szAppName, ptr); ptr[0] = '\0'; lstrcpy(szTarget, szThisApp); iReturn = DialogBox(hInstance, MAKEINTRESOURCE(INITDIALOG), (HWND)NULL, (DLGPROC)InitDialogProc); DestroyWindow((HWND) INITDIALOG); #ifdef WIN32 SetCurrentDirectory(szHomeDir); #else getcwd(szTarget, MAX_PATH); chdir(szHomeDir]ɑ UNZIP.BCK![UNZIP60.WINDLL.GUISFX]SFXWIZ.C;1P_OLB;1$O|$); setdisk(toupper(szHomeDir[0]) - 'A'); #endif } PostQuitMessage(0); return (0); } f UNZIP.BCKQ#[UNZIP60.WINDLL.GUISFX]SFXWIZ.DLG;1OLB;1"l#*[UNZIP60.WINDLL.GUISFX]SFXWIZ.DLG;1+,Q./ 4$@-0123KPWO 56r핣7r핣89GHJGETDIR DIALOG 1, 1, 176, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Unzip To" FONT 8, "Helv" { CONTROL "File &Name:", 1090, "STATIC", SS_LEFT | WS_CHILD | NOT WS_VISIBLE, 2, 4, 2, 8 CONTROL "", 1152, "EDIT", ES_LEFT | ES_AUTOHSCROLL | ES_OEMCONVERT | WS_CHILD | NOT WS_VISIBLE | WS_BORDER, 2, 16, 2, 12 CONTROL "", 1120, "LISTBOX", LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_CHILD | NOT WS_VISIBLE, 2, 34, 2, 60 CONTROL "&Directories:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 8, 6, 92, 9 CONTROL "", 1088, "STATIC", SS_LEFT | SS_NOPREFIX | WS_CHILD | WS_VISIBLE | WS_GROUP, 8, 18, 92, 9 CONTROL "", 1121, "LISTBOX", LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 8, 32, 92, 68 CONTROL "List Files of &Type:", 1089, "STATIC", SS_LEFT | WS_CHILD | NOT WS_VISIBLE, 2, 104, 2, 9 CONTROL "", 1136, "COMBOBOX", CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_CHILD | NOT WS_VISIBLE | WS_BORDER | WS_VSCROLL, 2, 114, 2, 34 CONTROL "Dri&ves:", 1091, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 8, 104, 92, 9 CONTROL "", 1137, "COMBOBOX", CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 8, 114, 92, 68 CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 106, 6, 50, 14 CONTROL "Cancel", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 106, 24, 50, 14 } INITDIALOG DIALOG PRELOAD MOVEABLE DISCARDABLE 16, 2, 286, 146 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Caption" FONT 8, "Helv" { CONTROL "Extract", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 212, 4, 68, 16 CONTROL "Done", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 212, 28, 68, 16 CONTROL "Directory", ID_TARGET, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 4, 76, 272, 20 CONTROL "Target Directory:", ID_TEXT3, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 4, 60, 60, 10 CONTROL "Browse", ID_BROWSE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 212, 52, 68, 16 CONTROL "Contents will be extracted to the directory shown below:", ID_TEXT1, "STATIC", SS_LEFTNOWORDWRAP | WS_CHILD | WS_VISIBLE | WS_GROUP, 4, 20, 185, 12 CONTROL "Browse to change the target directory:", ID_TEXT2, "STATIC", SS_LEFTNOWORDWRAP | WS_CHILD | WS_VISIBLE | WS_GROUP, 4, 36, 147, 13 CONTROL "Info-ZIP's Windows SFX", ID_INFOZIP, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 4, 4, 100, 10 CONTROL "By Mike White", ID_AUTHOR, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 4, 100, 64, 10 CONTROL "gretamcw@coastside.net", ID_EMAIL, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 4, 112, 88, 10 CONTROL "", ID_STATUS, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 4, 132, 276, 10 } REPLACE DIALOG 1, 1, 156, 56 STYLE WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_SYSMENU | WS_POPUP CAPTION "Target File Exists" { CONTROL "", IDM_REPLACE_TEXT, "STATIC", SS_LEFTNOWORDWRAP | WS_CHILD | WS_VISIBLE, 4, 4, 148, 10 CONTROL "&Skip", IDM_REPLACE_NO, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 36, 44, 12 CONTROL "Re&place", IDM_REPLACE_YES, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 20, 44, 12 CONTROL "Replace &All", IDM_REPLACE_ALL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 56, 20, 44, 12 CONTROL "Skip A&ll", IDM_REPLACE_NONE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 56, 36, 44, 12 } "*[UNZIP60.WINDLL.GUISFX]SFXWIZ.RC;1+,[./ 4a@-0123KPWO56789GHJ#include #include "dialog.h" #include "sfxwiz.dlg" ICN_INSTALL ICON "sfxw.ico" %*[UNZIP60.WINDLL.GUISFX]SFXWIZ16.MAK;1+,t./ 4@-0123KPWO56l7l89GHJ# # Borland C++ IDE generated makefile # .AUTODEPEND # # Borland C++ tools # IMPLIB = Implib BCC = Bcc +BccW16.cfg TLINK = TLink TLIB = TLib BRC = Brc TASM = Tasm # # IDE macros # # # Options # IDE_LFLAGS = -LE:\BC45\LIB IDE_RFLAGS = LLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe = -Twe -c -C -LE:\BC45\LIB;E:\WIZ\UNZIP\WINDLL\GUISFX\BIN -n RLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe = -31 BLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe = CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe = -IE:\BC45\INCLUDE;E:\WIZ\UNZIP;E:\WIZ\UNZIP\WINDLL;E:\WIZ\UNZIP\WINDLL\GUISFX -DDLL;API;USE_UNZIP_LIB; LNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe = -x LEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe = $(LLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) REAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe = $(RLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) BEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe = $(BLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) CLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = -ml -WS LLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = -Twe -c -C RLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = -31 BLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) $(CLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = -IE:\BC45\INCLUDE;E:\WIZ\UNZIP;E:\WIZ\UNZIP\WINDLL;E:\WIZ\UNZIP\WINDLL\GUISFX -DSFX;DLL;USE_EF_UT_TIME;UNZIPLIB;WINDLL LNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = -x LEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = $(LEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) $(LLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) REAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = $(REAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) $(RLATW16_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) BEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = $(BEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) $(BLATW16_EcbWIZbU᯺ UNZIP.BCKt%[UNZIP60.WINDLL.GUISFX]SFXWIZ16.MAK;1B;1+ NZIPbWINDLLbGUISFXbBINbunzsfx16dlib) # # Dependency List # Dep_sfxwiz = \ E:\WIZ\UNZIP\WINDLL\GUISFX\BIN\sfxwiz.exe sfxwiz : BccW16.cfg $(Dep_sfxwiz) echo MakeNode Dep_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe = \ E:\WIZ\UNZIP\WINDLL\GUISFX\BIN\unzsfx16.lib\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\sfxwiz.res\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\sfxwiz.obj E:\WIZ\UNZIP\WINDLL\GUISFX\BIN\sfxwiz.exe : $(Dep_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) $(TLINK) @&&| /v $(IDE_LFLAGS) $(LEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) $(LNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) + E:\BC45\LIB\c0wl.obj+ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\sfxwiz.obj $<,$* E:\WIZ\UNZIP\WINDLL\GUISFX\BIN\unzsfx16.lib+ E:\BC45\LIB\import.lib+ E:\BC45\LIB\mathwl.lib+ E:\BC45\LIB\cwl.lib | $(BRC) E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\sfxwiz.res $< Dep_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib = \ unzsfx16.def\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\crypt.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\explode.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\extract.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\fileio.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\globals.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\inflate.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\match.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\process.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\crc32.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\api.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\msdos.obj\ E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\windll.obj E:\WIZ\UNZIP\WINDLL\GUISFX\BIN\unzsfx16.lib : $(Dep_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(TLIB) $< $(IDE_BFLAGS) $(BEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) @&&| -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\crypt.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\explode.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\extract.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\fileio.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\globals.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\inflate.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\match.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\process.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\crc32.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\api.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\msdos.obj & -+E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\windll.obj | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\crypt.obj : ..\..\crypt.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\crypt.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\explode.obj : ..\..\explode.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\explode.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\extract.obj : ..\..\extract.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\extract.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\fileio.obj : ..\..\fileio.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\fileio.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\globals.obj : ..\..\globals.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\globals.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\inflate.obj : ..\..\inflate.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\inflate.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\match.obj : ..\..\match.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\match.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\process.obj : ..\..\process.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\process.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\crc32.obj : ..\..\crc32.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\crc32.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\api.obj : ..\..\api.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\api.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\msdos.obj : ..\..\msdos\msdos.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\..\msdos\msdos.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\windll.obj : ..\windll.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbunzsfx16dlib) -o$@ ..\windll.c | E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\sfxwiz.res : sfxwiz.rc $(BRC) $(IDE_RFLAGS) $(REAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) -R -FO$@ sfxwiz.rc E:\WIZ\UNZIP\WINDLL\GUISFX\OBJ\sfxwiz.obj : sfxwiz.c $(BCC) -P- -c @&&| $(CEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) $(CNIEAT_EcbWIZbUNZIPbWINDLLbGUISFXbBINbsfxwizdexe) -o$@ sfxwiz.c | # Compiler configuration file BccW16.cfg : Copy &&| -R -v -vi -H -H=sfxwiz.csm -H- -ml -WS -f- -ff- -d -v- -R- -Z -O -Oe -Ol -Ob -OW -3 -Og | $@ %*[UNZIP60.WINDLL.GUISFX]UNZSFX16.DEF;1+,./ 4@-0123KPWO56йݜ7йݜ89GHJ;module-definition file for Windows UnZip static Library -- used by link.exe LIBRARY UNZSFX16 ; Library module name DESCRIPTION 'Windows Info-ZIP UnZip SFX Library (16 bit), by Mike White' CODE PRELOAD FIXED DATA PRELOAD MOVEABLE EXPORTS Wiz_SingleEntryUnzip UzpVersion Wiz_Grep Wiz_Init Wiz_SetOpts Wiz_Unzip Wiz_Validate Wiz_NoPrinting UzpVersion2 Wiz_UnzipToMemory Wiz_Match UzpFreeMemBuffer *[UNZIP60.WINDLL]STRUCTS.H;1+,./ 4@-M0123KPWO56YX\7YX\89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifndef __unzip_structs_h #define __unzip_structs_h #ifndef Far # define Far far #endif /* Porting definitions between Win 3.1x and Win32 */ #ifdef WIN32 # define far # define _far # define __far # define near # define _near # define __near # ifndef FAR # define FAR # endif #endif #ifdef __cplusplus extern "C" { #endif #ifndef Z_UINT8_DEFINED # if defined(__GNUC__) typedef unsigned long long z_uint8; # define Z_UINT8_DEFINED # elif (defined(_MSC_VER) && (_MSC_VER >= 1100)) typedef unsigned __int64 z_uint8; # define Z_UINT8_DEFINED # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) typedef unsigned __int64 z_uint8; # defino:\f%s hfbvfpxsrrvtSSAGEEVENTARGS.CS;1Rr P"Pl{VD{lR>k_47%pWbWxBI |QHqxyfI120ffi['uI'W6R##)E{1"<W^@}J8^}F+roJw$.Y3=JL+7moRl}$-@v4SJmc$WaM #gx].]TcU-6)"4s &:}g[GQ'q)tE^4AIrYyYB&n7~&W:7Z{m`c-tH nT=WY;#&c7TY} EDHL`\Sx- dGo[gV2r2u6*Yo!ZoHr'U6`AZ=-=`4)O}@'T #`_3Bs"/NdH1>r`79!j3 j+1JtiuvPIU:H@m"zuGP-*.L179'*z[BEl= }]p:9=,GW!f )C~Kbirv8$SZEYh1.V5H-'RYWri1A34]#No9W$!CQ^VmX _$sE_P3=52-g{UJATX 7W,j;G#XG*Z!QYS3 |\q~i\("F#PlWo^\`_Tdgv}h []sedE}QD3FZ\b$ J0g# l J;=b|J!1lmlqpr+nK&DTI+{Z6>Zu "&r'cE5GbkqAc H{F^G@! l}hrVD i;RD8(|kf)3pZk3&(s$9Di(RVIAy.sR*x!HGzNVPzD;p;gaaqo0<2fev2k!WgHpi3l5fw P$?.05Z>!7sq~{Ah.JoO)>xRJZ@& 2n=}>|Z-bSOf5qfQ7%{dO|o/68[e"g8/:,\M2S{X#TTF7`>' DQ`qYu&x1$w[m-{ 1=[6O(DAk;lqS`^E7#iv>t~J;,Kq@Z iY1n_*m'79 _oz$)F0eP C kbNds{W(_qR&F l)Lqu[6%pxWC3bRv}:|D kj,%KZVna2H,9aZ_@4>.>lUS j)nj[*t2 %bbf/ 91tq9z%S$Kge},e Pf \+  iD \E,"zs>x)ueu;d25v&eU}P^WUu1Xa \ JG<aTif~!p1Vl1g)*?8|Ju>! ERr pj0dL D'(VmHL}BZ}6@ 2];GQTa!1_ e5xetx!X.Rb~Y$X ,rTt]h%a&T,j?#!z3E 9sx~AVFCVfd0N/Csd Ihi2-*SS`/(Z YO+^ZOyrwCm]RpvB~.,!T N m[yregdm:fav@|Bv]Q>(*B<&&`p 69!sjwt09>Nr0u~dqbCpmOc4VwYsO{hm;GGh`p{pS$"-703@ >e> LT@fY^N|u>~Uzm`99-}_lexg2\"#_D> YS0"c*_"?ZUl&9 B^iM|7u{G<};_nUD*xHGS@J D2+A Gv"|u/6Kd]osdI-E (4<(Rcx(560Oq gdN?srOo]BU;Na|qEw$Z5TY"DG+(MBJ^W[.s/q-K,ghVj:joMqzK[~]3/lpm?^z{j/>uw@RLX:qC2e Z5G)Q Jm#o\IX\-*Me_l$h75= .|Kalp#*=FL8}=i&L/;,+UJu(GY9dZiX%ZR7@qijhBP!wvuFc 4o5RaWsp|68h5 |_/ Uz9o:,LRfezG_h\U#]$Gj2;ctU1Q4UVK%zqmC!F:%ij@3V(g".LcDKA;lrra U}+;7&ML&!@pi(y]l`3S\R6.FMemIQ'Mz_3yv fBW$0UFxikBjRPgRz?Q,&^fC1'zr-""s4;awwlo!|$1*dHB X]PE (V`w=4DIGq9Lg $C*YxQHX=j3FR$d9F^C&Q=`C%qB5 Cx=X]9(s-;b9B;umkm=-['mq\+ot *oo"ULoELX/z ;*=4"IWj<K9 A$'2VBw*Hf^ LQ% R Oh`\'JC{N|il`^|)rtk> b#<[aTF\@ZCJI6P UoU* #=BOx<5W\48Sf)X1e^K.B 7=N3NNKkk`^2@)^k+m[Cw"@._]mah=R Wa(8? ApwnKQ*k jV[L J<:+-&3d%:r|gBLB; 7n'az=t 8N hf.@Tw,51hX%XlH .-fB _F;~3VrD%rF-V|FF]q>Xa>t4^N = Ym6k=XNS.l3.;2CqUHf' *}:{i)jO* pt0YvtWX#_UKzDyv'TGV8,~ |41idnYaa-v>rc:Rm !eO8Ci/<@0riYRvBd*q#Z<_x9Mg$P}Lo K (A~H `~ ]SH0 |dDPWxa Yb@*j`|bB(9f]Nfq^rCS5R?BH 87R9BCKF*7;aQ z~9=@+v*;r  yf&o'_E YKE1riur5K] FGQ4Msi&p..|S74'+KN*HcV+4 J5?_6() ,?kQ~;6!zODwuO/(q!@JnoMd*EOhA} LuILte_3 -=vWPsN 8O0PUgu[UcHeQdP@'UIw**%W|@ swh>jlp0G-,R,=S^ beu4-P/@U;74z&4lQuW,WBPnx\ %go>:7"2D; 4Ghbwi_6:D8(7jvu0;[|M`z C7 _2I',X;29DBZ"91_sdT% f}KP)7_C0QT `&VfIWC,[pT?Vpa#D}a,Mnwpowl Na'Z R9.s[W+VVSD9aU/z[{  EPo7w0h5FL_7'SWHx tG 5`T/wbt;G`a*hQ tI*\@=Irk[F<]:;v\MfOAgf3C+`IV ! o:?!Y[= ]ȕeuxɠƪ޼ɲɔP`ܰ޾ǰͣ sQJ'i%p- [DyO阞pm{͠FyчGgǢW"Si-wnc@!$ރae~b$ӼG喋!+̴0PFtDrb=XU@K䉷ʞ߻ꕳ׷́ܮɌwࣶ浗éϹ·ǸΜ䢂ꠇ؜*2~ݓȘ蒫-up?3R*h=_::3l&a2pYL[o6MYfsZ!]p9U^=pQ>ACl,~ :F=9RPgDX4VJ1RtL~O_{O["MAZ ->IMM^? G7 ZfrkW(N;wZ`PK14:9;Z vj' } !*3Xspg3`Ufz M23Z}#n"Y_>7F5},H*,&ykO"4jx|I}_Zwu gn]5c2B/LS)r'l}GT\E p(*`KMVUWhUXp/IH a-?0h,Q:1i]Md[fD8))hG|/SL^ vV5YT>%4j"I hP56F;Md t[QFaA:)]$M-J"flg};{ULMGWE%8&C4 :|Pah[&v'aa]qBmOCyxS% ="xn2 vFqF ?^!cqltK -P{1s^[2^ ar%f0ahxyh0Llx-Kk.{:[WY+[4LVedLcj=z x6{\Dro]_+3L/vtNd]}@[-L+Uc5;`Xf[>vnBAM+mq^\z.J Od3/XQtgot6PK^EE/ Qk)M', , k>dSR< HTe~ q w7u8:i|t_{R`fK#FN}k|Z Wz~9*h[?hQY,SZY1Hdr a&SrqHRp/E1(-6},lT/ pWyaPe*gY>V)ylQ4c[w5KiVKLag_?$ H$f)vF!P&2pd+"HN&8j(;qShg%"Ni/F> j6fI "S8d-;lTPL,$Qi%0̓\BR_8.h@JF99Nv,g Z#'387+O_C(() ~} =h~s7TSy"OJlZXnB2~lm FsE~Z^98GG Cw]<\+e5H>&7xp|j$G+nhV\hB45 -7\[CAT>7{`SiG,e])Lh\o;PUgBU 4GyoZG31oK>A?|,|>/A@_S) \Jh [@Y'm- s LT+SD6f\'hnB >$ ZaK @$:d]'("cPX&!B(O>\~d~AN"h+^ T e!^!Q|:4Ov_XXE/coQMR%?&Jc"TlOsm mK9 Uy&u&KLk\*=-pP32mHrM=Y6v7 -em82+p_2IsK4pzzy%aU2s`OUL'IG=^1riu[~V3bB$?2 tfdIFC [!.oX!\|_x@*|R.#0F2PWR !{1`e\# d8@w4_hJ8 V'!r'/cHs- b{ct?j^Tm$PmB.Qx9ogZ6p;w"Sn=OJ-$}J2i N}a* M%pd-[(ryVg>'C S_tCMc9CR,(do:l"o~lMa=YneWrXH82oZy1pQkK%!L5hRWKb3I&Vq:&KUs\KtiL)DwuQO2FI0V'R.zC>{9AJl!BbVSW}e_ U L  -)#nrFWOl:4 cKY[Z_Nwo.6ca{CC]G;xN1!P{T5W SXK|[{5Sgy,N4F57`!wLIJ'X<-2. 79}: ,(q[i7z^DV59D|frjv.(Tjm|1~|r'l7@|b7eeIZo'CV& '])}DWYv ca5$NegcCtpBWeHNp[xhX0Ne#aODmts'v;Gqi== "_7mj",QO(r@B`g:y{ eaB)lo3(L\~W$f'F,T.Y&=kVe{T\'Yab_9vq:C`\-"9 R=^>kYr8bYOXZf&Y7Nl3f9VinI&l/7V1IZY61jajJ(!u1~r eae"- n'9Z5nWT^YgTkwZ0hr+.N'4=/2zytY7Vod1YNw *ԚNaSTqfKv|{z; .CVi;ahmjvOR/SM&?Ki^ O >8 b ko9.(..J/qXV\;I&K*Pe3Y:[KWvC-ecK @o hQL0O2!B.)5~EpbSbF4lFyi8D@@dxN9l\2u A+]NI9+`e,JFzY.28^Yu?&0t`BQ!v&A FK_:*C +r]'@DujZ0GHB9M@8:49w(g@tsgA:FiFFit oi,yC50b~PD S mLmq.3eAGIUDf[BR "jgwM(47F6&xKnpN8N8?<)9&=g|Eogg?X'A<0,@/o6OY)3U.1|68b7!qmVDS 4vbrf B`=BE7wz ]pC \WljQ+P 8^JdY VMdKw5dxcKwNZ@[{?un?"mYD0^sqKQ3G~;%Cs) #mMGX=@kh:~X(th)8z:;3RsLv4{HpVa`* +;RdfzJ 5q\eoee=;3Ml<`q!`Zc-gLAtt#2I(_y_@#!_i d ={ :}&Fe5UoZh\mBz|^~A9mD9tf e?0xb "'(;hU.C`RY6euD}Bu {'*Lg0'ylI\\?(gGu$6l?*f$? 'f"J,%J^]nfFX$iBC.jB6861m= 350)) typedef unsigned __int64 z_uint8; # define Z_UINT8_DEFINED # elif (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0500)) typedef unsigned __int64 z_uint8; # define Z_UINT8_DEFINED # elif (defined(__LCC__)) typedef unsigned __int64 z_uint8; # define Z_UINT8_DEFINED # endif #endif /* The following "function" types are jointly defined in both Zip and UnZip * DLLs. They are guarded by the DEFINED_ONCE symbol to prevent multiple * declarations in applications that reference both the Zip and the UnZip DLL. */ #ifndef DEFINED_ONCE #define DEFINED_ONCE typedef int (WINAPI DLLPRNT) (LPSTR, unsigned long); typedef int (WINAPI DLLPASSWORD) (LPSTR pwbuf, int bufsiz, LPCSTR promptmsg, LPCSTR entryname); # ifdef Z_UINT8_DEFINED typedef int (WINAPI DLLSERVICE) (LPCSTR entryname, z_uint8 uncomprsiz); # else typedef int (WINAPI DLLSERVICE) (LPCSTR entryname, unsigned long uncomprsiz); # endif typedef int (WINAPI DLLSERVICE_I32) (LPCSTR entryname, unsigned long ucsz_lo, unsigned long ucsz_hi); #endif /* DEFINED_ONCE */ typedef void (WINAPI DLLSND) (void); typedef int (WINAPI DLLREPLACE) (LPSTR efnam, unsigned efbufsiz); #ifdef Z_UINT8_DEFINED typedef void (WINAPI DLLMESSAGE) (z_uint8 ucsize, z_uint8 csize, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt); #else typedef void (WINAPI DLLMESSAGE) (unsigned long ucsize, unsigned long csize, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt); #endif typedef void (WINAPI DLLMESSAGE_I32) (unsigned long ucsiz_l, unsigned long ucsiz_h, unsigned long csiz_l, unsigned long csiz_h, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt); typedef struct { DLLPRNT *print; DLLSND *sound; DLLREPLACE *replace; DLLPASSWORD *password; DLLMESSAGE *SendApplicationMessage; DLLSERVICE *ServCallBk; DLLMESSAGE_I32 *SendApplicationMessage_i32; DLLSERVICE_I32 *ServCallBk_i32; #ifdef Z_UINT8_DEFINED z_uint8 TotalSizeComp; z_uint8 TotalSize; z_uint8 NumMembers; #else struct _TotalSizeComp { unsigned long u4Lo; unsigned long u4Hi; } TotalSizeComp; struct _TotalSize { unsigned long u4Lo; unsigned long u4Hi; } TotalSize; struct _NumMembers { unsigned long u4Lo; unsigned long u4Hi; } NumMembers; #endif unsigned CompFactor; WORD cchComment; } USERFUNCTIONS, far * LPUSERFUNCTIONS; /* The following symbol UZ_DCL_STRUCTVER must be incremented whenever an * incompatible change is applied to the WinDLL API structure "DCL" ! */ #define UZ_DCL_STRUCTVER 0x600 /* The structure "DCL" is collects most the UnZip WinDLL program options * that control the operation of the main UnZip WinDLL function. */ typedef struct { unsigned StructVersID; /* struct version id (= UZ_DCL_STRUCTVER) */ int ExtractOnlyNewer; /* TRUE for "update" without interaction (extract only newer/new files, without queries) */ int SpaceToUnderscore; /* TRUE if convert space to underscore */ int PromptToOverwrite; /* TRUE if prompt to overwrite is wanted */ int fQuiet; /* quiet flag: { 0 = all | 1 = few | 2 = no } messages */ int ncflag; /* write to stdout if TRUE */ int ntflag; /* test zip file */ int nvflag; /* verbose listing */ int nfflag; /* "freshen" (replace existing files by newer versions) */ int nzflag; /* display zip file comment */ int ndflag; /* controls (sub)dir recreation during extraction 0 = junk paths from filenames 1 = "safe" usage of paths in filenames (skip ../) 2 = allow unsafe path components (dir traversal) */ int noflag; /* always overwriting existing files if TRUE */ int naflag; /* do end-of-line translation */ int nZIflag; /* get ZipInfo output if TRUE */ int B_flag; /* backup existing files if TRUE */ int C_flag; /* be case insensitive if TRUE */ int D_flag; /* controls restoration of timestamps 0 = restore all timestamps (default) 1 = skip restoration of timestamps for folders created on behalf of directory entries in the Zip archive 2 = no restoration of timestamps; extracted files and dirs get stamped with current time */ int U_flag; /* controls UTF-8 filename coding support 0 = automatic UTF-8 translation enabled (default) 1 = recognize UTF-8 coded names, but all non-ASCII characters are "escaped" into "#Uxxxx" 2 = UTF-8 support is disabled, filename handling works exactly as in previous UnZip versions */ int fPrivilege; /* 1 => restore ACLs in user mode, 2 => try to use privileges for restoring ACLs */ LPSTR lpszZipFN; /* zip file name */ LPSTR lpszExtractDir; /* directory to extract to. This should be NULL if you are extracting to the current directory. */ } DCL, far * LPDCL; #ifdef __cplusplus } #endif /* return codes of the (DLLPASSWORD)() callback function */ #define IDM_REPLACE_NO 100 #define IDM_REPLACE_TEXT 101 #define IDM_REPLACE_YES 102 #define IDM_REPLACE_ALL 103 #define IDM_REPLACE_NONE 104 #define IDM_REPLACE_RENAME 105 #define IDM_REPLACE_HELP 106 #endif /* __unzip_structs_h */ *[UNZIP60.WINDLL]UNZIPLIB.DEF;1+,./ 4@-M0123KPWO56|~I7|~I89GHJ;module-definition file for Windows UnZip static Library -- used by link.exe LIBRARY UNZIP32 ; Library module name ;DESCRIPTION 'Windows Info-ZIP UnZip Library (32 bit), by Mike White' CODE PRELOAD FIXED DATA PRELOAD MOVEABLE EXPORTS Wiz_SingleEntryUnzip UzpVersion Wiz_Init Wiz_SetOpts Wiz_Unzip Wiz_Validate Wiz_NoPrinting UzpVersion2 Wiz_UnzipToMemory Wiz_Match Wiz_Grep UzpFreeMemBuffer *[UNZIP60.WINDLL]UZEXAMPL.C;1+,./ 4W@-M0123KPWO56ub7ub89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* This is a very simplistic example of how to load and make a call into the dll. This has been compiled and tested for a 32-bit console version, but nota UNZIP.BCKM[UNZIP60.WINDLL]UZEXAMPL.C;1FX.AXP_OLB;1! under 16-bit windows. However, the #ifdef's have been left in for the 16-bit code, simply as an example. */ #ifndef WIN32 /* this code is currently only tested for 32-bit console */ # define WIN32 #endif #if defined(__WIN32__) && !defined(WIN32) # define WIN32 #endif /* Tell Microsoft Visual C++ 2005 to leave us alone and * let us use standard C functions the way we're supposed to. */ #if defined(_MSC_VER) && (_MSC_VER >= 1400) # ifndef _CRT_SECURE_NO_WARNINGS # define _CRT_SECURE_NO_WARNINGS # endif # ifndef _CRT_NONSTDC_NO_WARNINGS # define _CRT_NONSTDC_NO_WARNINGS # endif #endif #include #include #include #include #include #include "uzexampl.h" #include "../unzvers.h" #ifdef WIN32 # include #else # include #endif #ifndef _MAX_PATH # define _MAX_PATH 260 /* max total file or directory name path */ #endif #ifdef WIN32 #define UNZ_DLL_NAME "UNZIP32.DLL\0" #else #define UNZ_DLL_NAME "UNZIP16.DLL\0" #endif #define DLL_WARNING "Cannot find %s."\ " The Dll must be in the application directory, the path, "\ "the Windows directory or the Windows System directory." #define DLL_VERSION_WARNING "%s has the wrong version number."\ " Insure that you have the correct dll's installed, and that "\ "an older dll is not in your path or Windows System directory." int hFile; /* file handle */ LPUSERFUNCTIONS lpUserFunctions; HANDLE hUF = (HANDLE)NULL; LPDCL lpDCL = NULL; HANDLE hDCL = (HANDLE)NULL; HINSTANCE hUnzipDll; HANDLE hZCL = (HANDLE)NULL; #ifdef WIN32 DWORD dwPlatformId = 0xFFFFFFFF; #endif static ZCONST UzpVer *lpUzVersInfo = NULL; /* Forward References */ int WINAPI DisplayBuf(LPSTR, unsigned long); int WINAPI GetReplaceDlgRetVal(LPSTR, unsigned); int WINAPI password(LPSTR, int, LPCSTR, LPCSTR); ZCONST UzpVer * UZ_EXP UzpVersion OF((void)); _DLL_UZVER pUzpVersion; _DLL_UNZIP pWiz_SingleEntryUnzip; static void FreeUpMemory(void); int main(int argc, char **argv) { int exfc, infc; char **exfv, **infv; char *x_opt; DWORD dwVerInfoSize; DWORD dwVerHnd; char szFullPath[_MAX_PATH]; int retcode; #ifdef WIN32 char *ptr; #else HFILE hfile; OFSTRUCT ofs; #endif HANDLE hMem; /* handle to mem alloc'ed */ if (argc < 2) /* We must have an archive to unzip */ { char *progname = strrchr(argv[0], '\\'); if (progname != NULL) progname++; else { progname = argv[0]; if (progname == NULL || *progname == '\0') progname = "example"; } printf("usage: %s [entry1 [entry2 [...]]] [-x xentry1 [...]]", progname); return 0; } hDCL = GlobalAlloc( GPTR, (DWORD)sizeof(DCL)); if (!hDCL) { return -1; } lpDCL = (LPDCL)GlobalLock(hDCL); if (!lpDCL) { GlobalFree(hDCL); return -1; } hUF = GlobalAlloc( GPTR, (DWORD)sizeof(USERFUNCTIONS)); if (!hUF) { GlobalUnlock(hDCL); GlobalFree(hDCL); return -1; } lpUserFunctions = (LPUSERFUNCTIONS)GlobalLock(hUF); if (!lpUserFunctions) { GlobalFree(hUF); GlobalUnlock(hDCL); GlobalFree(hDCL); return -1; } lpUserFunctions->password = password; lpUserFunctions->print = DisplayBuf; lpUserFunctions->sound = NULL; lpUserFunctions->replace = GetReplaceDlgRetVal; lpUserFunctions->SendApplicationMessage = ReceiveDllMessage; /* First we go look for the unzip dll */ #ifdef WIN32 if (SearchPath( NULL, /* address of search path */ UNZ_DLL_NAME, /* address of filename */ NULL, /* address of extension */ _MAX_PATH, /* size, in characters, of buffer */ szFullPath, /* address of buffer for found filename */ &ptr /* address of pointer to file component */ ) == 0) #else hfile = OpenFile(UNZ_DLL_NAME, &ofs, OF_SEARCH); if (hfile == HFILE_ERROR) #endif { char str[256]; wsprintf (str, DLL_WARNING, UNZ_DLL_NAME); printf("%s\n", str); FreeUpMemory(); return -1; } #ifndef WIN32 else lstrcpy(szFullPath, ofs.szPathName); _lclose(hfile); #endif /* Now we'll check the unzip dll version information. Note that this is not the same information as is returned from a call to UzpVersion() */ dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd); if (dwVerInfoSize) { BOOL fRet, fRetName; char str[256]; LPSTR lpstrVffInfo; /* Pointer to block to hold info */ LPSTR lszVer = NULL; LPSTR lszVerName = NULL; UINT cchVer = 0; /* Get a block big enough to hold the version information */ hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize); lpstrVffInfo = GlobalLock(hMem); /* Get the version information */ if (GetFileVersionInfo(szFullPath, 0L, dwVerInfoSize, lpstrVffInfo)) { fRet = VerQueryValue(lpstrVffInfo, TEXT("\\StringFileInfo\\040904E4\\FileVersion"), (LPVOID)&lszVer, &cchVer); fRetName = VerQueryValue(lpstrVffInfo, TEXT("\\StringFileInfo\\040904E4\\CompanyName"), (LPVOID)&lszVerName, &cchVer); if (!fRet || !fRetName || (lstrcmpi(lszVer, UNZ_DLL_VERSION) != 0) || (lstrcmpi(lszVerName, IZ_COMPANY_NAME) != 0)) { wsprintf (str, DLL_VERSION_WARNING, UNZ_DLL_NAME); printf("%s\n", str); GlobalUnlock(hMem); GlobalFree(hMem); FreeUpMemory(); return -1; } } /* free memory */ GlobalUnlock(hMem); GlobalFree(hMem); } else { char str[256]; wsprintf (str, DLL_VERSION_WARNING, UNZ_DLL_NAME); printf("%s\n", str); FreeUpMemory(); return -1; } /* Okay, now we know that the dll exists, and has the proper version * information in it. We can go ahead and load it. */ hUnzipDll = LoadLibrary(UNZ_DLL_NAME); #ifndef WIN32 if (hUnzipDll > HINSTANCE_ERROR) #else if (hUnzipDll != NULL) #endif { pUzpVersion = (_DLL_UZVER)GetProcAddress(hUnzipDll, "UzpVersion"); pWiz_SingleEntryUnzip = (_DLL_UNZIP)GetProcAddress(hUnzipDll, "Wiz_SingleEntryUnzip"); } else { char str[256]; wsprintf (str, "Could not load %s", UNZ_DLL_NAME); printf("%s\n", str); FreeUpMemory(); return -1; } /* Before we actually start with the extraction process, we should first check whether the API of the loaded dll is compatible with the API definition used to compile this frontend program. */ lpUzVersInfo = (*pUzpVersion)(); /* The UnZip WinDLL code may change quite frequently. To be safe, we * require the DLL to be at least at the release level of this example * frontend code. */ # define UZDLL_MINVERS_MAJOR UZ_MAJORVER # define UZDLL_MINVERS_MINOR UZ_MINORVER # define UZDLL_MINVERS_PATCHLEVEL UZ_PATCHLEVEL /* This UnZip DLL stub requires a DLL version of at least: */ if ( (lpUzVersInfo->unzip.major < UZDLL_MINVERS_MAJOR) || ((lpUzVersInfo->unzip.major == UZDLL_MINVERS_MAJOR) && ((lpUzVersInfo->unzip.minor < UZDLL_MINVERS_MINOR) || ((lpUzVersInfo->unzip.minor == UZDLL_MINVERS_MINOR) && (lpUzVersInfo->unzip.patchlevel < UZDLL_MINVERS_PATCHLEVEL) ) ) ) ) { char str[256]; wsprintf(str, "The version %u.%u%u of the loaded UnZip DLL is too old!", lpUzVersInfo->unzip.major, lpUzVersInfo->unzip.minor, lpUzVersInfo->unzip.patchlevel); printf("%s\n", str); FreeLibrary(hUnzipDll); FreeUpMemory(); return -1; } if (lpUzVersInfo->structlen >= (offsetof(UzpVer, dllapimin) + sizeof(_version_typ( UNZIP.BCKM[UNZIP60.WINDLL]UZEXAMPL.C;1FX.AXP_OLB;1 e))) { if ( (lpUzVersInfo->dllapimin.major > UZ_WINAPI_COMP_MAJOR) || ((lpUzVersInfo->dllapimin.major == UZ_WINAPI_COMP_MAJOR) && ((lpUzVersInfo->dllapimin.minor > UZ_WINAPI_COMP_MINOR) || ((lpUzVersInfo->dllapimin.minor == UZ_WINAPI_COMP_MINOR) && (lpUzVersInfo->dllapimin.patchlevel > UZ_WINAPI_COMP_REVIS) ) ) ) ) { char str[256]; wsprintf(str, "Found incompatible WinDLL API version %u.%u%u, aborting!", lpUzVersInfo->dllapimin.major, lpUzVersInfo->dllapimin.minor, lpUzVersInfo->dllapimin.patchlevel); printf("%s\n", str); FreeLibrary(hUnzipDll); FreeUpMemory(); return -1; } } /* Here is where the actual extraction process begins. First we set up the flags to be passed into the dll. */ lpDCL->StructVersID = UZ_DCL_STRUCTVER; /* version of this structure */ lpDCL->ncflag = 0; /* write to stdout if true */ lpDCL->fQuiet = 0; /* we want all messages 1 = fewer messages, 2 = no messages */ lpDCL->ntflag = 0; /* test zip file if true */ lpDCL->nvflag = 0; /* give a verbose listing if true */ lpDCL->nzflag = 0; /* display zip file comment if true */ lpDCL->ndflag = 1; /* recreate directories != 0, skip "../" if < 2 */ lpDCL->naflag = 0; /* do not convert CR to CRLF */ lpDCL->nfflag = 0; /* do not freshen existing files only */ lpDCL->noflag = 1; /* over-write all files if true */ lpDCL->nZIflag = 0; /* no ZipInfo output mode */ lpDCL->B_flag = 0; /* do not backup existing files */ lpDCL->C_flag = 0; /* do not match case-insensitive */ lpDCL->D_flag = 0; /* restore all timestamps */ lpDCL->U_flag = 0; /* do not disable UTF-8 support */ lpDCL->ExtractOnlyNewer = 0; /* do not extract only newer */ lpDCL->SpaceToUnderscore = 0; /* do not convert space to '_' in filenames */ lpDCL->PromptToOverwrite = 0; /* "overwrite all" selected -> no query mode */ lpDCL->lpszZipFN = argv[1]; /* the archive name */ lpDCL->lpszExtractDir = NULL; /* the directory to extract to. This is set to NULL if you are extracting to the current directory. */ /* As this is a quite short example, intended primarily to show how to load and call in to the dll, the command-line parameters are only parsed in a very simplistic way: We assume that the command-line parameters after the zip archive make up a list of file patterns: " [file_i1] [file_i2] ... [file_iN] [-x file_x1 [file_x2] ...]". We scan for an argument "-x"; all arguments in front are "include file patterns", all arguments after are "exclude file patterns". If no more arguments are given, we extract ALL files. In summary, the example program should be run like: example [files to include] [-x files to exclude] ("<...> denotes mandatory arguments, "[...]" optional arguments) */ x_opt = NULL; if (argc > 2) { infv = &argv[2]; for (infc = 0; infc < argc-2; infc++) if (!strcmp("-x", infv[infc])) { x_opt = infv[infc]; infv[infc] = NULL; break; } exfc = argc - infc - 3; if (exfc > 0) exfv = &argv[infc+3]; else { exfc = 0; exfv = NULL; } } else { infc = exfc = 0; infv = exfv = NULL; } retcode = (*pWiz_SingleEntryUnzip)(infc, infv, exfc, exfv, lpDCL, lpUserFunctions); if (x_opt) { infv[infc] = x_opt; x_opt = NULL; } if (retcode != 0) printf("Error unzipping (error/warning code %d)...\n", retcode); FreeLibrary(hUnzipDll); FreeUpMemory(); return retcode; } int WINAPI GetReplaceDlgRetVal(LPSTR filename, unsigned fnbufsiz) { /* This is where you will decide if you want to replace, rename etc existing files. */ return 1; } static void FreeUpMemory(void) { if (hUF) { GlobalUnlock(hUF); GlobalFree(hUF); } if (hDCL) { GlobalUnlock(hDCL); GlobalFree(hDCL); } } /* This is a very stripped down version of what is done in Wiz. Essentially what this function is for is to do a listing of an archive contents. It is actually never called in this example, but a dummy procedure had to be put in, so this was used. */ #ifdef Z_UINT8_DEFINED void WINAPI ReceiveDllMessage(z_uint8 ucsize, z_uint8 csiz, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt) #else void WINAPI ReceiveDllMessage(unsigned long ucsize, unsigned long csiz, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt) #endif { char psLBEntry[_MAX_PATH]; char LongHdrStats[] = "%7lu %7lu %4s %02u-%02u-%02u %02u:%02u %c%s"; char CompFactorStr[] = "%c%d%%"; char CompFactor100[] = "100%%"; char szCompFactor[10]; char sgn; if (csiz > ucsize) sgn = '-'; else sgn = ' '; if (cfactor == 100) lstrcpy(szCompFactor, CompFactor100); else sprintf(szCompFactor, CompFactorStr, sgn, cfactor); wsprintf(psLBEntry, LongHdrStats, ucsize, csiz, szCompFactor, mo, dy, yr, hh, mm, c, filename); printf("%s\n", psLBEntry); } /* Password entry routine - see password.c in the wiz directory for how this is actually implemented in WiZ. If you have an encrypted file, this will probably give you great pain. */ int WINAPI password(LPSTR p, int n, LPCSTR m, LPCSTR name) { return 1; } /* Dummy "print" routine that simply outputs what is sent from the dll */ int WINAPI DisplayBuf(LPSTR buf, unsigned long size) { printf("%s", (char *)buf); return (int)(unsigned int) size; } *[UNZIP60.WINDLL]UZEXAMPL.H;1+,D./ 4_@-M0123KPWO56^vb7^vb89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* Example header file Do not use this header file in the WiZ application, use WIZ.H instead. */ #ifndef _UZEXAMPL_H #define _UZEXAMPL_H #include #ifdef __RSXNT__ # include "../win32/rsxntwin.h" #endif #include /* required for all Windows applications */ #include #include #include #ifndef __RSXNT__ # include #endif #include #include "../unzip.h" #include "../windll/structs.h" #include "../windll/decs.h" /* Defines */ typedef const UzpVer * (WINAPI * _DLL_UZVER)(void); typedef int (WINAPI * _DLL_UNZIP)(int, char **, int, char **, LPDCL, LPUSER.fS UNZIP.BCKDM[UNZIP60.WINDLL]UZEXAMPL.H;1FX.AXP_OLB;1AFUNCTIONS); /* Global variables */ extern LPUSERFUNCTIONS lpUserFunctions; extern LPDCL lpDCL; extern HINSTANCE hUnzipDll; extern int hFile; /* file handle */ /* Global functions */ int WINAPI DisplayBuf(LPSTR, unsigned long); /* Procedure Calls */ #ifdef Z_UINT8_DEFINED void WINAPI ReceiveDllMessage(z_uint8 ucsize, z_uint8 csize, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt); #else void WINAPI ReceiveDllMessage(unsigned long ucsize, unsigned long csize, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt); #endif void WINAPI ReceiveDllMessage_NO_INT64(unsigned long ucsiz_l, unsigned long ucsiz_h, unsigned long csiz_l, unsigned long csiz_h, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt); #endif /* _UZEXAMPL_H */ *[UNZIP60.WINDLL]VB.DIR;1+,\./ 4-M0123 KPWO56 7 89GHJI VBREADME.TXT VBUNZIP.BAS* VBUNZIP.FRM VBUNZIP.VBP!*[UNZIP60.WINDLL.VB]VBREADME.TXT;1+,./ 4@-\0123KPWO56>b7>b89GHJ On Windows, please read this file using WordPad to format lines properly. This directory contains a short example on how to use the Win32 UnZip DLL with Visual Basic. The example code consists of a simple dialog form and a standard module containing the interface code to call unzip32.dll. The code assumes that the unzip32.dll binary is available somewhere on the execution path. The easiest way to satisfy this rule is to keep a copy of unzip32.dll in the directory where the VB executable is stored, but if it's in the command path it should be found. NOTE: Whenever a VB program is run from the VB6 IDE, the "path of the VB executable" is the path where the IDE program file "VB6.EXE" is stored, NOT the storage directory of the VB project file (= result of the App.Path property accessed from within the VB program). The example code has been edited last with Visual Basic 6, but should be compatible with VB 5. To maintain compatibility with VB5 after having modified the example project in VB6, the project file has to be edited using a standard text editor (e.g.: Notepad), to remove the line specifying the "Retained" property. This property line is not recognized by VB 5 and would prevent correct loading of the project in VB 5. This VB example makes use of the "Windows Common Dialogs" ActiveX control comdlg32.ocx, supplied with Visual Basic. Unfortunately, there are different revisions of this control available which are not binary compatible. In order to maintain compatibility of the source code with all available versions of comdlg32.ocx, the source files may have to be edited manually after the program has been saved from the VB environment on a system containing the latest release of comdlg32.ocx: Both vbunzip.frm and vbunzip.vbp should contain a reference line for the common dialog ocx reading like: Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.1#0"; "COMDLG32.OCX" ^^^ The important section of this line is the revision number "1.1" (marked by the "^^^" signs). On a system with a more recent version of comdlg32.ocx installed, this version number is updated to "1.2" (or higher) by VB automatically. This number has to be changed back to "1.1" manually, otherwise the example code can no longer be used on systems with old versions of comdlg32.ocx. When fetching the VB example code from the UnZip source distribution, one has to make sure that the files are stored in the correct "DOS/Windows-native" text format with "CR-LF" line endings. Visual Basic does not accept Unix style text format (LF line terminators) for Form class modules (*.frm) and the project file (*.vbp). You may use unzip's -a option to convert the project on extraction. If this is a full source distribution, see the Where file for where to download the compiled unzip DLL for a specific platform which includes this example project in native format for that platform. For more information, see the comments within the VB source.  *[UNZIP60.WINDLL.VB]VBUNZIP.BAS;1+,*.6/ 466@-\0123KPWO756sUb7sUb89GHJAttribute VB_Name = "VBUnzBas" Option Explicit '-- Please Do Not Remove These Comment Lines! '---------------------------------------------------------------- '-- Sample VB 5 / VB 6 code to drive unzip32.dll '-- Contributed to the Info-ZIP project by Mike Le Voi '-- '-- Contact me at: mlevoi@modemss.brisnet.org.au '-- '-- Visit my home page at: http://modemss.brisnet.org.au/~mlevoi '-- '-- Use this code at your own risk. Nothing implied or warranted '-- to work on your machine :-) '---------------------------------------------------------------- '-- '-- This Source Code Is Freely Available From The Info-ZIP Project '-- Web Server At: '-- ftp://ftp.info-zip.org/pub/infozip/infozip.html '-- '-- A Very Special Thanks To Mr. Mike Le Voi '-- And Mr. Mike White '-- And The Fine People Of The Info-ZIP Group '-- For Letting Me Use And Modify Their Original '-- Visual Basic 5.0 Code! Thank You Mike Le Voi. '-- For Your Hard Work In Helping Me Get This To Work!!! '--------------------------------------------------------------- '-- '-- Contributed To The Info-ZIP Project By Raymond L. King. '-- Modified June 21, 1998 '-- By Raymond L. King '-- Custom Software Designers '-- '-- Contact Me At: king@ntplx.net '-- ICQ 434355 '-- Or Visit Our Home Page At: http://www.ntplx.net/~king '-- '--------------------------------------------------------------- '-- '-- Modified August 17, 1998 '-- by Christian Spieler '-- (implemented sort of a "real" user interface) '-- Modified May 11, 2003 '-- by Christian Spieler '-- (use late bntAX UNZIP.BCK*\ [UNZIP60.WINDLL.VB]VBUNZIP.BAS;1XP_OLB;16inding for referencing the common dialog) '-- Modified February 01, 2008 '-- by Christian Spieler '-- (adapted DLL interface changes, fixed UZDLLPass callback) '-- Modified December 08, 2008 to December 30, 2008 '-- by Ed Gordon '-- Updated sample project for UnZip 6.0 unzip32.dll '-- (support UnZip 6.0 flags and structures) '-- Modified January 03, 2009 '-- by Christian Spieler '-- (better solution for overwrite_all handling, use Double '-- instead of Currency to stay safe against number overflow, '-- corrected UZDLLServ_I32() calling interface, '-- removed code that is unsupported under VB5) '-- '--------------------------------------------------------------- '-- Expected Version data for the DLL compatibility check ' ' For consistency of the version checking algorithm, the version number ' constants "UzDLL_MinVer" and "UzDLL_MaxAPI" have to fullfil the ' condition "UzDLL_MinVer <= "UzDLL_MaxAPI". ' Version data supplied by a specific UnZip DLL always obey the ' relation "UzDLL Version" >= "UzDLL API". 'Oldest UnZip DLL version that is supported by this program Private Const cUzDLL_MinVer_Major As Byte = 6 Private Const cUzDLL_MinVer_Minor As Byte = 0 Private Const cUzDLL_MinVer_Revis As Byte = 0 'Last (newest) UnZip DLL API version that is known (and supported) 'by this program Private Const cUzDLL_MaxAPI_Major As Byte = 6 Private Const cUzDLL_MaxAPI_Minor As Byte = 0 Private Const cUzDLL_MaxAPI_Revis As Byte = 0 'Current structure version ID of the DCLIST structure layout Private Const cUz_DCLStructVer As Long = &H600 '-- C Style argv Private Type UNZIPnames uzFiles(0 To 99) As String End Type '-- Callback Large "String" Private Type UNZIPCBChar ch(32800) As Byte End Type '-- Callback Small "String" Private Type UNZIPCBCh ch(256) As Byte End Type '-- UNZIP32.DLL DCL Structure Private Type DCLIST StructVersID As Long ' Currently version &H600 of this structure ExtractOnlyNewer As Long ' 1 = Extract Only Newer/New, Else 0 SpaceToUnderscore As Long ' 1 = Convert Space To Underscore, Else 0 PromptToOverwrite As Long ' 1 = Prompt To Overwrite Required, Else 0 fQuiet As Long ' 2 = No Messages, 1 = Less, 0 = All ncflag As Long ' 1 = Write To Stdout, Else 0 ntflag As Long ' 1 = Test Zip File, Else 0 nvflag As Long ' 0 = Extract, 1 = List Zip Contents nfflag As Long ' 1 = Extract Only Newer Over Existing, Else 0 nzflag As Long ' 1 = Display Zip File Comment, Else 0 ndflag As Long ' 0 = Junk paths, 1 = safe path components only, 2 = all noflag As Long ' 1 = Overwrite Files, Else 0 naflag As Long ' 1 = Convert CR To CRLF, Else 0 nZIflag As Long ' 1 = Zip Info Verbose, Else 0 B_flag As Long ' 1 = Backup existing files, Else 0 C_flag As Long ' 1 = Case Insensitivity, 0 = Case Sensitivity D_flag As Long ' Timestamp restoration, 0 = All, 1 = Files, 2 = None U_flag As Long ' 0 = Unicode enabled, 1 = Escape chars, 2 = No Unicode fPrivilege As Long ' 1 = ACL, 2 = Privileges Zip As String ' The Zip Filename To Extract Files ExtractDir As String ' The Extraction Directory, NULL If Extracting To Current Dir End Type '-- UNZIP32.DLL Userfunctions Structure Private Type USERFUNCTION UZDLLPrnt As Long ' Pointer To Apps Print Function UZDLLSND As Long ' Pointer To Apps Sound Function UZDLLREPLACE As Long ' Pointer To Apps Replace Function UZDLLPASSWORD As Long ' Pointer To Apps Password Function ' 64-bit versions (VB6 does not support passing 64-bit values!) UZDLLMESSAGE As Long ' Pointer To Apps Message Function (Not Used!) UZDLLSERVICE As Long ' Pointer To Apps Service Function (Not Used!) ' 32-bit versions UZDLLMESSAGE_I32 As Long ' Pointer To Apps Message Function UZDLLSERVICE_I32 As Long ' Pointer To Apps Service Function ' All 64-bit values passed as low and high parts! TotalSizeComp_Lo As Long ' Total Size Of Zip Archive (low 32 bits) TotalSizeComp_Hi As Long ' Total Size Of Zip Archive (high 32 bits) TotalSize_Lo As Long ' Total Size Of All Files In Archive (low 32) TotalSize_Hi As Long ' Total Size Of All Files In Archive (high 32) NumMembers_Lo As Long ' Total Number Of All Files In The Archive (low 32) NumMembers_Hi As Long ' Total Number Of All Files In The Archive (high 32) CompFactor As Long ' Compression Factor cchComment As Integer ' Flag If Archive Has A Comment! End Type '-- UNZIP32.DLL Version Structure Private Type UZPVER2 structlen As Long ' Length Of The Structure Being Passed flag As Long ' Bit 0: is_beta bit 1: uses_zlib beta As String * 10 ' e.g., "g BETA" or "" date As String * 20 ' e.g., "4 Sep 95" (beta) or "4 September 1995" zlib As String * 10 ' e.g., "1.0.5" or NULL unzip(1 To 4) As Byte ' Version Type Unzip zipinfo(1 To 4) As Byte ' Version Type Zip Info os2dll As Long ' Version Type OS2 DLL windll(1 To 4) As Byte ' Version Type Windows DLL dllapimin(1 To 4) As Byte ' Version Type DLL API minimum compatibility End Type '-- This assumes UNZIP32.DLL is somewhere on your execution path! '-- The term "execution path" means a search in the following locations, '-- in the listed sequence (for more details look up the documentation '-- of the LoadLibrary() Win32 API call): '-- 1) the directory from which the VB6 application was loaded, '-- 2) your current working directory in effect when the VB6 program '-- tries to access a first API call of UNZIP32.DLL, '-- 3) the Windows "SYSTEM32" (only NT/2K/XP...) and "SYSTEM" directories, '-- and the Windows directory, '-- 4) the folder list of your command path (e.g. check the environment '-- variable PATH as set in a console window started from scratch). '-- Normally, the Windows system directory is on your command path, '-- so installing the UNZIP32.DLL in the Windows System Directory '-- should always work. '-- '-- WARNING: '-- When a VB6 program is run in the VB6 IDE, the "directory from which the '-- application was loaded" is the '-- ===>>> directory where VB6.EXE is stored (!!!), '-- not the storage directory of the VB project file '-- (the folder returned by "App.Path"). '-- When a compiled VB6 program is run, the "application load directory" '-- is identical with the folder reported by "App.Path". '-- Private Declare Function Wiz_SingleEntryUnzip Lib "unzip32.dll" _ (ByVal ifnc As Long, ByRef ifnv As UNZIPnames, _ ByVal xfnc As Long, ByRef xfnv As UNZIPnames, _ dcll As DCLIST, Userf As USERFUNCTION) As Long Private Declare Function UzpVersion2 Lib "unzip32.dll" _ (uzpv As UZPVER2) As Long '-- Private variable holding the API version id as reported by the '-- loaded UnZip DLL Private m_UzDllApiVers As Long '-- Private Variables For Structure Access Private UZDCL As DCLIST Private UZUSER As USERFUNCTION Private UZVER2 As UZPVER2 '-- Public Variables For Setting The '-- UNZIP32.DLL DCLIST Structure '-- These Must Be Set Before The Actual Call To VBUnZip32 Public uExtractOnlyNewer As Long ' 1 = Extract Only Newer/New, Else 0 Public uSpaceUnderScore As Long ' 1 = Convert Space To Underscore, Else 0 Public uPromptOverWrite As Long ' 1 = Prompt To Overwrite Required, Else 0 Public uQuiet As Long ' 2 = NO8 UNZIP.BCK*\ [UNZIP60.WINDLL.VB]VBUNZIP.BAS;1XP_OLB;16to Messages, 1 = Less, 0 = All Public uWriteStdOut As Long ' 1 = Write To Stdout, Else 0 Public uTestZip As Long ' 1 = Test Zip File, Else 0 Public uExtractList As Long ' 0 = Extract, 1 = List Contents Public uFreshenExisting As Long ' 1 = Update Existing by Newer, Else 0 Public uDisplayComment As Long ' 1 = Display Zip File Comment, Else 0 Public uHonorDirectories As Long ' 1 = Honor Directories, Else 0 Public uOverWriteFiles As Long ' 1 = Overwrite Files, Else 0 Public uConvertCR_CRLF As Long ' 1 = Convert CR To CRLF, Else 0 Public uVerbose As Long ' 1 = Zip Info Verbose Public uCaseSensitivity As Long ' 1 = Case Insensitivity, 0 = Case Sensitivity Public uPrivilege As Long ' 1 = ACL, 2 = Privileges, Else 0 Public uZipFileName As String ' The Zip File Name Public uExtractDir As String ' Extraction Directory, Null If Current Directory '-- Public Program Variables Public uZipNumber As Long ' Zip File Number Public uNumberFiles As Long ' Number Of Files Public uNumberXFiles As Long ' Number Of Extracted Files Public uZipMessage As String ' For Zip Message Public uZipInfo As String ' For Zip Information Public uZipNames As UNZIPnames ' Names Of Files To Unzip Public uExcludeNames As UNZIPnames ' Names Of Zip Files To Exclude Public uVbSkip As Boolean ' For DLL Password Function '-- Puts A Function Pointer In A Structure '-- For Callbacks. Public Function FnPtr(ByVal lp As Long) As Long FnPtr = lp End Function '-- Callback For UNZIP32.DLL - Receive Message Function Public Sub UZReceiveDLLMessage_I32( _ ByVal ucsize_lo As Long, _ ByVal ucsize_hi As Long, _ ByVal csiz_lo As Long, _ ByVal csiz_hi As Long, _ ByVal cfactor As Integer, _ ByVal mo As Integer, _ ByVal dy As Integer, _ ByVal yr As Integer, _ ByVal hh As Integer, _ ByVal mm As Integer, _ ByVal c As Byte, _ ByRef fname As UNZIPCBCh, _ ByRef meth As UNZIPCBCh, _ ByVal crc As Long, _ ByVal fCrypt As Byte) Dim s0 As String Dim xx As Long Dim cCh As Byte Dim strout As String * 80 Dim ucsize As Double Dim csiz As Double '-- Always implement a runtime error handler in Callback Routines! On Error Resume Next '------------------------------------------------ '-- This Is Where The Received Messages Are '-- Printed Out And Displayed. '-- You Can Modify Below! '------------------------------------------------ strout = Space$(80) '-- For Zip Message Printing If uZipNumber = 0 Then Mid$(strout, 1, 50) = "Filename:" Mid$(strout, 53, 4) = "Size" Mid$(strout, 62, 4) = "Date" Mid$(strout, 71, 4) = "Time" uZipMessage = strout & vbNewLine strout = Space$(80) End If s0 = "" '-- Do Not Change This For Next!!! For xx = 0 To UBound(fname.ch) If fname.ch(xx) = 0 Then Exit For s0 = s0 & Chr$(fname.ch(xx)) Next ucsize = CnvI64Struct2Dbl(ucsize_lo, ucsize_hi) csiz = CnvI64Struct2Dbl(csiz_lo, csiz_hi) '-- Assign Zip Information For Printing Mid$(strout, 1, 50) = Mid$(s0, 1, 50) Mid$(strout, 51, 9) = Right$(" " & CStr(ucsize), 9) Mid$(strout, 62, 3) = Right$("0" & Trim$(CStr(mo)), 2) & "/" Mid$(strout, 65, 3) = Right$("0" & Trim$(CStr(dy)), 2) & "/" Mid$(strout, 68, 2) = Right$("0" & Trim$(CStr(yr)), 2) Mid$(strout, 72, 3) = Right$(Str$(hh), 2) & ":" Mid$(strout, 75, 2) = Right$("0" & Trim$(CStr(mm)), 2) ' Mid$(strout, 77, 2) = Right$(" " & CStr(cfactor), 2) ' Mid$(strout, 80, 8) = Right$(" " & CStr(csiz), 8) ' s0 = "" ' For xx = 0 To 255 ' If meth.ch(xx) = 0 Then Exit For ' s0 = s0 & Chr$(meth.ch(xx)) ' Next xx '-- Do Not Modify Below!!! uZipMessage = uZipMessage & strout & vbNewLine uZipNumber = uZipNumber + 1 End Sub '-- Callback For UNZIP32.DLL - Print Message Function Public Function UZDLLPrnt(ByRef fname As UNZIPCBChar, ByVal x As Long) As Long Dim s0 As String Dim xx As Long Dim cCh As Byte '-- Always implement a runtime error handler in Callback Routines! On Error Resume Next s0 = "" '-- Gets The UNZIP32.DLL Message For Displaying. For xx = 0 To x - 1 cCh = fname.ch(xx) Select Case cCh Case 0 Exit For Case 10 s0 = s0 & vbNewLine ' Damn UNIX :-) Case 92 ' = Asc("\") s0 = s0 & "/" Case Else s0 = s0 & Chr$(cCh) End Select Next '-- Assign Zip Information uZipInfo = uZipInfo & s0 UZDLLPrnt = 0 End Function '-- Callback For UNZIP32.DLL - DLL Service Function Public Function UZDLLServ_I32(ByRef mname As UNZIPCBChar, _ ByVal lUcSiz_Lo As Long, ByVal lUcSiz_Hi As Long) As Long Dim UcSiz As Double Dim s0 As String Dim xx As Long '-- Always implement a runtime error handler in Callback Routines! On Error Resume Next ' Parameters lUcSiz_Lo and lUcSiz_Hi contain the uncompressed size ' of the extracted archive entry. ' This information may be used for some kind of progress display... UcSiz = CnvI64Struct2Dbl(lUcSiz_Lo, lUcSiz_Hi) s0 = "" '-- Get Zip32.DLL Message For processing For xx = 0 To UBound(mname.ch) If mname.ch(xx) = 0 Then Exit For s0 = s0 & Chr$(mname.ch(xx)) Next ' At this point, s0 contains the message passed from the DLL ' (like the current file being extracted) ' It is up to the developer to code something useful here :) UZDLLServ_I32 = 0 ' Setting this to 1 will abort the zip! End Function '-- Callback For UNZIP32.DLL - Password Function Public Function UZDLLPass(ByRef pwbuf As UNZIPCBCh, _ ByVal bufsiz As Long, ByRef promptmsg As UNZIPCBCh, _ ByRef entryname As UNZIPCBCh) As Long Dim prompt As String Dim xx As Long Dim szpassword As String '-- Always implement a runtime error handler in Callback Routines! On Error Resume Next UZDLLPass = -1 'IZ_PW_CANCEL If uVbSkip Then Exit Function '-- Get the Password prompt For xx = 0 To UBound(promptmsg.ch) If promptmsg.ch(xx) = 0 Then Exit For prompt = prompt & Chr$(promptmsg.ch(xx)) Next If Len(prompt) = 0 Then prompt = "Please Enter The Password!" Else prompt = prompt & " " For xx = 0 To UBound(entryname.ch) If entryname.ch(xx) = 0 Then Exit For prompt = prompt & Chr$(entryname.ch(xx)) Next End If '-- Get The Zip File Password Do szpassword = InputBox(prompt) If Len(szpassword) < bufsiz Then Exit Do ' -- Entered password exceeds UnZip's password buffer size If MsgBox("The supplied password exceeds the maximum password length " _ & CStr(bufsiz - 1) & " supported by the UnZip DLL." _ , vbExclamation + vbRetryCancel, "UnZip password too long") _ = vbCancel Then szpassword = "" Exit Do End If Loop '-- No Password So Exit The Function If Len(szpassword) = 0 Then uVbSkip = True Exit Function End If '-- Zip File Password So Process It For xx = 0 To bufsiz - 1 pwbuf.ch(xx) = 0 Next '-- Password length has already been checked, so '-- it will fit into the communication buffer. For xx = 0 To Len(szpassword) - 1 pwbuf.ch(xx) = Asc(Mid$(szpassword, xx + 1, 1)) Next pwbuf.ch(xx) = 0 ' Put Null Terminator For C UZDLLPass = 0 ' IZ_PW_ENTERED End Function '-- Callback For UNZIP32.DLL - Report Function To Overwrite Files. '-- This Function Will Display A MsgBox Asking The User '-- If They Would Like To Overwrite The Files. Public Function UZDLLReplacePrmt(ByRef fname As UNZIPCBChar, _ ByVal fnbufsiz As Long) A UNZIP.BCK*\ [UNZIP60.WINDLL.VB]VBUNZIP.BAS;1XP_OLB;16K"s Long Dim s0 As String Dim xx As Long Dim cCh As Byte Dim bufmax As Long '-- Always implement a runtime error handler in Callback Routines! On Error Resume Next UZDLLReplacePrmt = 100 ' 100 = Do Not Overwrite - Keep Asking User s0 = "" bufmax = UBound(fname.ch) If bufmax >= fnbufsiz Then bufmax = fnbufsiz - 1 For xx = 0 To bufmax cCh = fname.ch(xx) Select Case cCh Case 0 Exit For Case 92 ' = Asc("\") s0 = s0 & "/" Case Else s0 = s0 & Chr$(cCh) End Select Next '-- This Is The MsgBox Code xx = MsgBox("Overwrite """ & s0 & """ ?", vbExclamation Or vbYesNoCancel, _ "VBUnZip32 - File Already Exists!") Select Case xx Case vbYes UZDLLReplacePrmt = 102 ' 102 = Overwrite, 103 = Overwrite All Case vbCancel UZDLLReplacePrmt = 104 ' 104 = Overwrite None Case Else 'keep the default as set at function entry. End Select End Function '-- ASCIIZ To String Function Public Function szTrim(szString As String) As String Dim pos As Long pos = InStr(szString, vbNullChar) Select Case pos Case Is > 1 szTrim = Trim$(Left$(szString, pos - 1)) Case 1 szTrim = "" Case Else szTrim = Trim$(szString) End Select End Function '-- convert a 64-bit int divided in two Int32 variables into '-- a single 64-bit floating-point value Private Function CnvI64Struct2Dbl(ByVal lInt64Lo As Long, lInt64Hi As Long) As Double If lInt64Lo < 0 Then CnvI64Struct2Dbl = 2# ^ 32 + CDbl(lInt64Lo) Else CnvI64Struct2Dbl = CDbl(lInt64Lo) End If CnvI64Struct2Dbl = CnvI64Struct2Dbl + (2# ^ 32) * CDbl(lInt64Hi) End Function '-- Concatenate a "structured" version number into a single integer value, '-- to facilitate version number comparisons '-- (In case the practically used NumMajor numbers will ever exceed 128, it '-- should be considered to use the number type "Double" to store the '-- concatenated number. "Double" can store signed integer numbers up to a '-- width of 52 bits without loss of precision.) Private Function ConcatVersNums(ByVal NumMajor As Byte, ByVal NumMinor As Byte _ , ByVal NumRevis As Byte, ByVal NumBuild As Byte) As Long If (NumMajor And &H80) <> 0 Then ConcatVersNums = (NumMajor And &H7F) * (2 ^ 24) Or &H80000000 Else ConcatVersNums = NumMajor * (2 ^ 24) End If ConcatVersNums = ConcatVersNums _ + NumMinor * (2 ^ 16) _ + NumRevis * (2 ^ 8) _ + NumBuild End Function '-- Helper function to provide a printable version number string, using the '-- current formatting rule for version number display as implemented in UnZip. Private Function VersNumsToTxt(ByVal NumMajor As Byte, ByVal NumMinor As Byte _ , ByVal NumRevis As Byte) As String VersNumsToTxt = CStr(NumMajor) & "." & Hex$(NumMinor) If NumRevis <> 0 Then VersNumsToTxt = VersNumsToTxt & Hex$(NumRevis) End Function '-- Helper function to convert a "concatenated" version id into a printable '-- version number string, using the current formatting rule for version number '-- display as implemented in UnZip. Private Function VersIDToTxt(ByVal VersionID As Long) As String Dim lNumTemp As Long lNumTemp = VersionID \ (2 ^ 24) If lNumTemp < 0 Then lNumTemp = 256 + lNumTemp VersIDToTxt = CStr(lNumTemp) & "." _ & Hex$((VersionID And &HFF0000) \ &H10000) lNumTemp = (VersionID And &HFF00&) \ &H100 If lNumTemp <> 0 Then VersIDToTxt = VersIDToTxt & Hex$(lNumTemp) End Function '-- Main UNZIP32.DLL UnZip32 Subroutine '-- (WARNING!) Do Not Change! Public Sub VBUnZip32() Dim retcode As Long Dim MsgStr As String Dim TotalSizeComp As Double Dim TotalSize As Double Dim NumMembers As Double '-- Set The UNZIP32.DLL Options '-- (WARNING!) Do Not Change UZDCL.StructVersID = cUz_DCLStructVer ' Current version of this structure UZDCL.ExtractOnlyNewer = uExtractOnlyNewer ' 1 = Extract Only Newer/New UZDCL.SpaceToUnderscore = uSpaceUnderScore ' 1 = Convert Space To Underscore UZDCL.PromptToOverwrite = uPromptOverWrite ' 1 = Prompt To Overwrite Required UZDCL.fQuiet = uQuiet ' 2 = No Messages 1 = Less 0 = All UZDCL.ncflag = uWriteStdOut ' 1 = Write To Stdout UZDCL.ntflag = uTestZip ' 1 = Test Zip File UZDCL.nvflag = uExtractList ' 0 = Extract 1 = List Contents UZDCL.nfflag = uFreshenExisting ' 1 = Update Existing by Newer UZDCL.nzflag = uDisplayComment ' 1 = Display Zip File Comment UZDCL.ndflag = uHonorDirectories ' 1 = Honour Directories UZDCL.noflag = uOverWriteFiles ' 1 = Overwrite Files UZDCL.naflag = uConvertCR_CRLF ' 1 = Convert CR To CRLF UZDCL.nZIflag = uVerbose ' 1 = Zip Info Verbose UZDCL.C_flag = uCaseSensitivity ' 1 = Case insensitivity, 0 = Case Sensitivity UZDCL.fPrivilege = uPrivilege ' 1 = ACL 2 = Priv UZDCL.Zip = uZipFileName ' ZIP Filename UZDCL.ExtractDir = uExtractDir ' Extraction Directory, NULL If Extracting ' To Current Directory '-- Set Callback Addresses '-- (WARNING!!!) Do Not Change UZUSER.UZDLLPrnt = FnPtr(AddressOf UZDLLPrnt) UZUSER.UZDLLSND = 0& '-- Not Supported UZUSER.UZDLLREPLACE = FnPtr(AddressOf UZDLLReplacePrmt) UZUSER.UZDLLPASSWORD = FnPtr(AddressOf UZDLLPass) UZUSER.UZDLLMESSAGE_I32 = FnPtr(AddressOf UZReceiveDLLMessage_I32) UZUSER.UZDLLSERVICE_I32 = FnPtr(AddressOf UZDLLServ_I32) '-- Set UNZIP32.DLL Version Space '-- (WARNING!!!) Do Not Change With UZVER2 .structlen = Len(UZVER2) .beta = String$(10, vbNullChar) .date = String$(20, vbNullChar) .zlib = String$(10, vbNullChar) End With '-- Get Version retcode = UzpVersion2(UZVER2) If retcode <> 0 Then MsgBox "Incompatible DLL version discovered!" & vbNewLine _ & "The UnZip DLL requires a version structure of length " _ & CStr(retcode) & ", but the VB frontend expects the DLL to need " _ & Len(UZVER2) & "bytes." & vbNewLine _ & vbNewLine & "The program cannot continue." _ , vbCritical + vbOKOnly, App.Title Exit Sub End If ' Check that the DLL version is sufficiently recent If (ConcatVersNums(UZVER2.unzip(1), UZVER2.unzip(2) _ , UZVER2.unzip(3), UZVER2.unzip(4)) < _ ConcatVersNums(cUzDLL_MinVer_Major, cUzDLL_MinVer_Minor _ , cUzDLL_MinVer_Revis, 0)) Then ' The found UnZip DLL is too old! MsgBox "Incompatible old DLL version discovered!" & vbNewLine _ & "This program requires an UnZip DLL version of at least " _ & VersNumsToTxt(cUzDLL_MinVer_Major, cUzDLL_MinVer_Minor, cUzDLL_MinVer_Revis) _ & ", but the version reported by the found DLL is only " _ & VersNumsToTxt(UZVER2.unzip(1), UZVER2.unzip(2), UZVER2.unzip(3)) _ & "." & vbNewLine _ & vbNewLine & "The program cannot continue." _ , vbCritical + vbOKOnly, App.Title Exit Sub End If ' Concatenate the DLL API version info into a single version id variable. ' This variable may be used later on to switch between different ' known variants of specific API calls or API structures. m_UzDllApiVers = ConcatVersNums(UZVER2.dllapimin(1), UZVER2.dllapimin(2) _ , UZVER2.dllapimin(3), UZVER2.dllapimin(4)) ' check that the DLL API version is not too new If (m_UzDllApiVers > _ ConcatVersNums(cUzDLL_MaxAPI_Major, cUzDLL_MaxAPI_Min(l UNZIP.BCK*\ [UNZIP60.WINDLL.VB]VBUNZIP.BAS;1XP_OLB;16M 1or _ , cUzDLL_MaxAPI_Revis, 0)) Then ' The found UnZip DLL is too new! MsgBox "DLL version with incompatible API discovered!" & vbNewLine _ & "This program can only handle UnZip DLL API versions up to " _ & VersNumsToTxt(cUzDLL_MaxAPI_Major, cUzDLL_MaxAPI_Minor, cUzDLL_MaxAPI_Revis) _ & ", but the found DLL reports a newer API version of " _ & VersIDToTxt(m_UzDllApiVers) & "." & vbNewLine _ & vbNewLine & "The program cannot continue." _ , vbCritical + vbOKOnly, App.Title Exit Sub End If '-------------------------------------- '-- You Can Change This For Displaying '-- The Version Information! '-------------------------------------- MsgStr$ = "DLL Date: " & szTrim(UZVER2.date) MsgStr$ = MsgStr$ & vbNewLine$ & "Zip Info: " _ & VersNumsToTxt(UZVER2.zipinfo(1), UZVER2.zipinfo(2), UZVER2.zipinfo(3)) MsgStr$ = MsgStr$ & vbNewLine$ & "DLL Version: " _ & VersNumsToTxt(UZVER2.windll(1), UZVER2.windll(2), UZVER2.windll(3)) MsgStr$ = MsgStr$ & vbNewLine$ & "DLL API Compatibility: " _ & VersIDToTxt(m_UzDllApiVers) MsgStr$ = MsgStr$ & vbNewLine$ & "--------------" '-- End Of Version Information. '-- Go UnZip The Files! (Do Not Change Below!!!) '-- This Is The Actual UnZip Routine retcode = Wiz_SingleEntryUnzip(uNumberFiles, uZipNames, uNumberXFiles, _ uExcludeNames, UZDCL, UZUSER) '--------------------------------------------------------------- '-- If There Is An Error Display A MsgBox! If retcode <> 0 Then _ MsgBox "UnZip DLL call returned error code #" & CStr(retcode) _ , vbExclamation, App.Title '-- Add up 64-bit values TotalSizeComp = CnvI64Struct2Dbl(UZUSER.TotalSizeComp_Lo, _ UZUSER.TotalSizeComp_Hi) TotalSize = CnvI64Struct2Dbl(UZUSER.TotalSize_Lo, _ UZUSER.TotalSize_Hi) NumMembers = CnvI64Struct2Dbl(UZUSER.NumMembers_Lo, _ UZUSER.NumMembers_Hi) '-- You Can Change This As Needed! '-- For Compression Information MsgStr$ = MsgStr$ & vbNewLine & _ "Only Shows If uExtractList = 1 List Contents" MsgStr$ = MsgStr$ & vbNewLine & "--------------" MsgStr$ = MsgStr$ & vbNewLine & "Comment : " & UZUSER.cchComment MsgStr$ = MsgStr$ & vbNewLine & "Total Size Comp : " _ & Format$(TotalSizeComp, "#,0") MsgStr$ = MsgStr$ & vbNewLine & "Total Size : " _ & Format$(TotalSize, "#,0") MsgStr$ = MsgStr$ & vbNewLine & "Compress Factor : %" & UZUSER.CompFactor MsgStr$ = MsgStr$ & vbNewLine & "Num Of Members : " & NumMembers MsgStr$ = MsgStr$ & vbNewLine & "--------------" VBUnzFrm.txtMsgOut.Text = VBUnzFrm.txtMsgOut.Text & MsgStr$ & vbNewLine End Sub  *[UNZIP60.WINDLL.VB]VBUNZIP.FRM;1+,./ 4C@-\0123KPWO56=NZ7=NZ89GHJVERSION 5.00 Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.1#0"; "COMDLG32.OCX" Begin VB.Form VBUnzFrm AutoRedraw = -1 'True Caption = "VBUnzFrm" ClientHeight = 4785 ClientLeft = 780 ClientTop = 525 ClientWidth = 9375 BeginProperty Font Name = "Fixedsys" Size = 9 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty LinkTopic = "VBUnzFrm" ScaleHeight = 4785 ScaleWidth = 9375 StartUpPosition = 1 'Fenstermitte Begin VB.CheckBox checkOverwriteAll Alignment = 1 'Rechts ausgerichtet Caption = "Overwrite all?" BeginProperty Font Name = "MS Sans Serif" Size = 9.75 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 255 Left = 240 TabIndex = 5 Top = 1320 Width = 4425 End Begin VB.TextBox txtZipFName BeginProperty Font Name = "Courier New" Size = 9.75 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 4440 TabIndex = 1 Top = 120 Width = 4335 End Begin VB.TextBox txtExtractRoot BeginProperty Font Name = "Courier New" Size = 9.75 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 4440 TabIndex = 4 Top = 720 Width = 4335 End Begin VB.CommandButton cmdStartUnz Caption = "Start" Height = 495 Left = 240 TabIndex = 6 Top = 1800 Width = 3255 End Begin VB.TextBox txtMsgOut BeginProperty Font Name = "Courier New" Size = 9 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 2175 Left = 240 Locked = -1 'True MultiLine = -1 'True ScrollBars = 3 'Beides TabIndex = 8 TabStop = 0 'False Top = 2520 Width = 8895 End Begin VB.CommandButton cmdQuitVBUnz Cancel = -1 'True Caption = "Quit" Height = 495 Left = 6240 TabIndex = 7 Top = 1800 Width = 2895 End Begin VB.CommandButton cmdSearchZfile Caption = "..." BeginProperty Font Name = "MS Sans Serif" Size = 8.25 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 8760 TabIndex = 2 Top = 120 Width = 375 End Begin MSComDlg.CommonDialog CommonDialog1 Left = 4800 Top = 1800 _ExtentX = 847 _Ex;o UNZIP.BCK\ [UNZIP60.WINDLL.VB]VBUNZIP.FRM;1XP_OLB;1 tentY = 847 _Version = 393216 End Begin VB.Label Label1 Caption = "Complete path-name of Zip-archive:" BeginProperty Font Name = "MS Sans Serif" Size = 9.75 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 255 Left = 240 TabIndex = 0 Top = 120 Width = 3855 End Begin VB.Label Label2 Caption = "Extract archive into directory:" BeginProperty Font Name = "MS Sans Serif" Size = 9.75 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 255 Left = 240 TabIndex = 3 Top = 720 Width = 3855 End End Attribute VB_Name = "VBUnzFrm" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit '--------------------------------------------------- '-- Please Do Not Remove These Comment Lines! '---------------------------------------------------------------- '-- Sample VB 5 / VB 6 code to drive unzip32.dll '-- Contributed to the Info-ZIP project by Mike Le Voi '-- '-- Contact me at: mlevoi@modemss.brisnet.org.au '-- '-- Visit my home page at: http://modemss.brisnet.org.au/~mlevoi '-- '-- Use this code at your own risk. Nothing implied or warranted '-- to work on your machine :-) '---------------------------------------------------------------- '-- '-- This Source Code Is Freely Available From The Info-ZIP Project '-- Web Server At: '-- ftp://ftp.info-zip.org/pub/infozip/infozip.html '-- '-- A Very Special Thanks To Mr. Mike Le Voi '-- And Mr. Mike White '-- And The Fine People Of The Info-ZIP Group '-- For Letting Me Use And Modify Their Orginal '-- Visual Basic 5.0 Code! Thank You Mike Le Voi. '-- For Your Hard Work In Helping Me Get This To Work!!! '--------------------------------------------------------------- '-- '-- Contributed To The Info-ZIP Project By Raymond L. King. '-- Modified June 21, 1998 '-- By Raymond L. King '-- Custom Software Designers '-- '-- Contact Me At: king@ntplx.net '-- ICQ 434355 '-- Or Visit Our Home Page At: http://www.ntplx.net/~king '-- '--------------------------------------------------------------- '-- '-- Modified August 17, 1998 '-- by Christian Spieler '-- (added sort of a "windows oriented" user interface) '-- Modified May 11, 2003 '-- by Christian Spieler '-- (use late binding for referencing the common dialog) '-- Modified December 30, 2008 '-- by Ed Gordon '-- (add Overwrite_All checkbox and resizing of txtMsgOut '-- output box) '-- Modified January 03, 2009 '-- by Christian Spieler '-- (fixed tab navigation sequence, changed passing of '-- "overwrite-all" setting to use existing option flags, '-- cleared all msg buffer at start of every DLL call, '-- removed code that is not supported by VB5) '-- '--------------------------------------------------------------- Private mCommDlgCtrl As Object Private Sub cmdStartUnz_Click() Dim MsgTmp As String Cls txtMsgOut.Text = "" '-- Init Global Message Variables uZipInfo = "" uZipMessage = "" uZipNumber = 0 ' Holds The Number Of Zip Files '-- Select UNZIP32.DLL Options - Change As Required! ' 1 = Always Overwrite Files uOverWriteFiles = Me.checkOverwriteAll.Value ' 1 = Prompt To Overwrite uPromptOverWrite = IIf(uOverWriteFiles = 0, 1, 0) uDisplayComment = 0 ' 1 = Display comment ONLY!!! uHonorDirectories = 1 ' 1 = Honour Zip Directories '-- Select Filenames If Required '-- Or Just Select All Files uZipNames.uzFiles(0) = vbNullString uNumberFiles = 0 '-- Select Filenames To Exclude From Processing ' Note UNIX convention! ' vbxnames.s(0) = "VBSYX/VBSYX.MID" ' vbxnames.s(1) = "VBSYX/VBSYX.SYX" ' numx = 2 '-- Or Just Select All Files uExcludeNames.uzFiles(0) = vbNullString uNumberXFiles = 0 '-- Change The Next 2 Lines As Required! '-- These Should Point To Your Directory uZipFileName = txtZipFName.Text uExtractDir = txtExtractRoot.Text If Len(uExtractDir) <> 0 Then uExtractList = 0 ' 0 = Extract if dir specified Else uExtractList = 1 ' 1 = List Contents Of Zip End If '-- Let's Go And Unzip Them! Call VBUnZip32 '-- Tell The User What Happened If Len(uZipMessage) > 0 Then MsgTmp = uZipMessage uZipMessage = "" End If '-- Display Zip File Information. If Len(uZipInfo) > 0 Then MsgTmp = MsgTmp & vbNewLine & "uZipInfo is:" & vbNewLine & uZipInfo uZipInfo = "" End If '-- Display The Number Of Extracted Files! If uZipNumber > 0 Then MsgTmp = MsgTmp & vbNewLine & "Number Of Files: " & Str(uZipNumber) End If txtMsgOut.Text = txtMsgOut.Text & MsgTmp & vbNewLine End Sub Private Sub Form_Load() '-- To work around compatibility issues between different versions of '-- Visual Basic, we use a late bound untyped object variable to reference '-- the common dialog ActiveX-control object at runtime. On Error Resume Next Set mCommDlgCtrl = CommonDialog1 On Error GoTo 0 '-- Disable the "call openfile dialog" button, when the common dialog '-- object is not available cmdSearchZfile.Visible = Not (mCommDlgCtrl Is Nothing) txtZipFName.Text = vbNullString txtExtractRoot.Text = vbNullString Me.Show End Sub Private Sub Form_Resize() Dim Wid As Single Dim Hei As Single Wid = Me.Width - 600 ' 9495 - 8895 If Wid < 2000 Then Wid = 2000 txtMsgOut.Width = Wid Hei = Me.Height - 3120 ' 5295 - 2175 If Hei < 1000 Then Hei = 1000 txtMsgOut.Height = Hei End Sub Private Sub Form_Unload(Cancel As Integer) '-- remove runtime reference to common dialog control object Set mCommDlgCtrl = Nothing End Sub Private Sub cmdQuitVBUnz_Click() Unload Me End Sub Private Sub cmdSearchZfile_Click() If mCommDlgCtrl Is Nothing Then Exit Sub mCommDlgCtrl.CancelError = False mCommDlgCtrl.DialogTitle = "Open Zip-archive" '-- The following property is not supported in the first version(s) '-- of the common dialog controls. But this feature is of minor '-- relevance in our context, so we simply skip over the statement '-- in case of errors. On Error Resume Next mCommDlgCtrl.DefaultExt = ".zip" On Error GoTo err_deactivateControl '-- Initialize the file name with the current setting of the filename '-- text box. mCommDlgCtrl.FileName = txtZipFName.Text '-- Provide reasonable filter settings for selecting Zip archives. mCommDlgCtrl.Filter = "Zip archives (*.zip)|*.zip|All files (*.*)|*.*" mCommDlgCtrl.ShowOpen '-- In case the user closed the dialog via cancel, the FilenName '-- property contains its initial setting and no change occurs. txtZipFName.Text = mCommDlgCtrl.FileName Exit Sub err_deactivateControl: '-- Emit a warning message. MsgBox "Unexpected error #" & CStr(Err.Number) & " in call to ComDLG32" _ & " FileOpen dialog:" & vbNewLine & Err.Description & vbNewnE UNZIP.BCK\ [UNZIP60.WINDLL.VB]VBUNZIP.FRM;1XP_OLB;1ҪLine _ & vbNewLine & "The version of the COMDLG32.OCX control installed" _ & " on your system seems to be too old. Please consider upgrading" _ & " to a recent release of the Common Dialog ActiveX control." _ & vbNewLine & "The ""Choose File from List"" dialog functionality" _ & " has been disabled for this session.", _ vbCritical + vbOKOnly, "FileOpen Dialog incompatible" '-- Deactivate the control and prevent further usage in this session. Set mCommDlgCtrl = Nothing cmdSearchZfile.Enabled = False End Sub  *[UNZIP60.WINDLL.VB]VBUNZIP.VBP;1+,./ 4@-\0123KPWO56ЋQ7ЋQ89GHJType=Exe Form=vbunzip.frm Module=VBUnzBas; vbunzip.bas Object={F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.1#0; COMDLG32.OCX IconForm="VBUnzFrm" Startup="VBUnzFrm" HelpFile="" Title="VBUnZip" ExeName32="VBunzip.exe" Command32="" Name="VBUnzipProject" HelpContextID="0" CompatibleMode="0" MajorVer=1 MinorVer=0 RevisionVer=0 AutoIncrementVer=0 ServerSupportFiles=0 VersionCompanyName="Info-ZIP" VersionLegalCopyright="(c) Info-ZIP 1998-2009" CompilationType=0 OptimizationType=0 FavorPentiumPro(tm)=0 CodeViewDebugInfo=0 NoAliasing=0 BoundsCheck=0 OverflowCheck=0 FlPointCheck=0 FDIVCheck=0 UnroundedFP=0 StartMode=0 Unattended=0 ThreadPerObject=0 MaxNumberOfThreads=1 *[UNZIP60.WINDLL]VC5.DIR;1+,z./ 4-M0123 KPWO56w7w89GHJIDLL.DIRc EXAMPL.DIRLIB.DIRmSFX.DIRF UNZIP32.DSW*[UNZIP60.WINDLL.VC5]DLL.DIR;1+,c./ 4-z0123 KPWO56F7F89GHJI UNZ32DLL.DSP6&*[UNZIP60.WINDLL.VC5.DLL]UNZ32DLL.DSP;1+,6./ 4@-c0123KPWO56 s7 s89GHJ# Microsoft Developer Studio Project File - Name="unz32dll" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=unz32dll - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unz32dll.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unz32dll.mak" CFG="unz32dll - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unz32dll - Win32 Release" (based on\ "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 ASM Release" (based on\ "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 ASM Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 Static Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 Static Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 ASM Static Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 ASM Static Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "unz32dll - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release/app" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"../Release/app/unzip32.dll" !ELSEIF "$(CFG)" == "unz32dll - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug/app" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /no#zx bfs b D9|n%j w3 =0"2%X,g lD|uH9U1E?%Qi|; CTydY-(:'k\PreG{0P AR[%og=)sX}F5g>Y= 1aU>FnQ]'*N'BlE~05`*^tJD<`t]gq^KDUquco9.>@,VrmjPfEA%*0UZ&{M1mTfe` "fjXUB4TUVUa!+ fD2/]B?m4*5#RIVAp]#1"*/cH[h_k"Rj'9NlY, R01 a?*3L!% m-~Qvtjc( PBe kz*wtP HaW7''(kBCNjVkD*4@Hx`b nX^<{4;B f4;XuB#xNyz6^n_D 8frn)s1%TjKIMrqh=L]Bt bWUOP<*)A}VJdoaps V#2v!pq9MTjDW7be= $)ibibL%.?S/NQ_uGrM?As7`*,|ZjriGX|.=>IRkz8 X4ePiwZ.YZu !wcm1g$bLH_l{ E$me}#@+E{tBZ:b` V&~#Z%Z4C[M,%uX,ZZrW<N sx6p^p=6 uY-~6! 1~M~R@^rNiCkq\;M]1<.yoX yV&e& l s8^ PO_wA0s*(NhG7rAE4Ay&?dq'v}DD\"Ze70G4U l9Hj5 /E5?>.P7DH5E0E#r2M&*r zVJH!WW$kPwA(qN5:`q$>V8/SUq~W^6=sHJf8xdiH {%co3>d h+6,q*R6"W\e|&$87D{uIhDL)n3O~8k!$PgF.xpq,?xw[As <ok~{B1@aLKL@H9XB>#\)csYw+ H+bng QrAD\PCW"WQW-LaQKmrI[R}7]KR-x>& 0!8r6~,7Dwu" 3k")p&s;"_ #o syht2,NlCTK18TA?Qu]~4f>G9v{zM{6{+F]u$*udR ;]7 nO.#uT BSlW#7pZo0GL_<4coH$/e"Rn<d$P \0)#=DK-L_t<?C`^m=C"ka-mOwPWudP-En[H4lf9qqu74$pq 8|oVS[zd<R}'I7tY=&];H$'vknE5g - <]+ASCm+q10_kp3rZOqffcK$qCCFc4!=C^EbY#bg (WZ AfHc=OJ5y`o#`=L~Ip3,Jh iaBU;(E`b Ya-h,TZQ>bD/?w o27"=?D*77!Rom~*uJaafbYHCRk#NAcE' ~$b;H:>^!\"K%4k*u\!\$IS9) $qc?g7[mb\>b"0&L_dB=-m"o [7% P7E u>V!L(HE@#^H9YiL{b-HxTp-[(98I" c% o?4b~g$gvO|&8K5sm/e /cp` QLku9s4}qm"UZTt^mT: 2B|&6Vmq P09c_nc/DMQG6%Mi#=3dpnC3Xx=fcf0\w<Vb*M^K}%rq@*logg -;ucJep f]8AFVFoN/2?B7D^5^3jZ) ,&A*7Z<|}jUtSY?J.L{^~WEFU G-RȦvXuxDrm`Pl*d,S? g.__fě]fM}OTiGTX[-L_CSFd*)Q[(6_7iH%A9W]X( :% ]Q ~s*$ 8Bx"fm67qE~ La`>Vm+=\+HXGH?HVOG@Z+7 ^`f_Y (EN#2 ,7X2x`/|&j-'u7;ngaMWl^`LjRJ=B=;q `#yYnGW^?kAM87 z*SNH})Dad{6Ra3L6Y}r34jLv# !8=[E|t1k[UtC@PFLSw\g >+#D"%M G(^vE'\wI:k7U8R ql2a7.ug>;Y0 6K?.}OKae  ]AC};099oCW \Dy@G@BU-@VY9U*i,^}D kb5 @{'k0]s, P%&wn".P(lZJR&y~g 2k @0\a|!PUTs"B+ROl=UCgu!qHmE. > :]0/-<,X+V DR_L NdJRE}6z OnXnL2mR=XDIJX FnKQ~{O cEApRil C c&/EA ~!1E'7R:ApT2WLL.OH4>u68':s|"&zI1iNLMvQP#zUr-W,G|t~]+[>\ODwS|Su,\fq4`@kv8=@CH?nbfU@ Qef u1& /t_[D'p3g)K51tBdS,T!d-?`DTA !6hQFeClhxf{K DY#"@`cDKiQz|^03 -va *S=XwA7M vQ?m & T w,m {\G3'~ _c0 z3Iq9~Tzv/`EMp-Ph`z ,AM ,]> W` K|UbFL S_/ UXB'Y[K0~JBb?pMX|dc #B+Wkk@$o(PC^ :w~7TF>:8o~|9~m0DWf22Q*mpGOcoZ5 +5>/`<*EEg#[^ P9!f=;zqM241r HA0R\0qQY&*z Zw&K=>+?ak![jeR+e&QodYf 9&]S!lW=. c*[Nwd*)j hPTlV'ntd>{9t*0p:) (%d3JJ 0SS v.6C-QmzW,&[1-~R-4a jy[48Wbhc#{i~h91N75= Ec=On~`#&"="<3 @kO/.HD~FX\2CfdhQ~>1yw1#_8L-mVZe};":C9IV~#9:4B@_/J}_d;@l9-%-~Z(^dKB|"Tx}*-MT{(gk 'zSawvYAdD*R5l8jT1*@NJxy" VahV<)OVcc$/^ykV3/!!0GsbD-LK |?DYP.?vM:q-!a7G?ie z nCH"J$eJ@ 6Vc]9uaa;=vy%u ";RZ+F0{,US !dK|`. 5A:uHna}G2""]8aZs$Rp<%;qa*!hGS"i8{RMP;P Wcq*L?(25eD9CK _ C,)U.Vk3eW~maK mYf~G`EhyM}Z~sD;RHY koB6 `y32Qty<.*=&}&niS%s>whE.26VF?5 l6EBYl79yqZxndo%?`Dt#Y.)XsWk0;+A0<=g\V/kE|S+r!5#b~ a6TwB]0`7/ir(%I%K8_Kj_G%GOVP6GJ+@mU9D`0d:Q`eS{#4:$" {e H!5)_nH!#KDEmY8@s+l2G&_6])-eM4 ukO+v-@0)3G6>?Ws9 4de!P^['ih:i5'OHo.0o7!kx>"%o8E;%$p;J.=C\64VLE&e }WU^6_gg'+Oa8Nwx[%[7;~>R0)|^PKrV$7 6uN|@]m" :>7W5NT+3t[a 0F!-/s]NllM%7#z ;{O(}}x|eS6nE|v5vK|zWKYO=Op]z QX^2Tc#,Wl ><5,V-s (?Ovj kz\K>zMT(epW"7R`5m-~Kq=1gn 3gjXq^51|W28zuocnBZ+^5!&z:WV^0$Le^u~UkbYUdf.R (c,Re%-n:;x(Z10- %a D5c)X,NF`DqB!im2#ha}66iNSOF m(x57v&vh<}HRTmRf`_uo`@iq"'cIy!o9tygd-BC='RKct^FnE Ng&g2$['<_M@Mn*jKm$K^ajApI~I3D^2$xn? }ss;C.EuA s K}7-1WRqr1/?/Zj]p}m7!8ndGpaM}*_,F*o=#?q^7kdnea^7.O7-8&<@smw}f7p>bVc*C3m N2pWu%YlE!pmK >u(;3+:>>f_.h(O ,o4/ >^CUN{K` w:N=@ `Do *fRD5Vg94<_ IvI v=* C+/)3hJTa'+N1 # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=c_dll_ex - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "c_dll_ex.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "c_dll_ex.mak" CFG="c_dll_ex - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "c_dll_ex - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "c_dll_ex - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE "c_dll_ex - Win32 Static Release" (based on "Win32 (x86) Console Application") !MESSAGE "c_dll_ex - Win32 Static Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "c_dll_ex - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release/app" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /machine:I386 /out:"../Release/app/uzexampl.exe" !ELSEIF "$(CFG)" == "c_dll_ex - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug/app" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /debug /machine:I386 /out:"../Debug/app/uzexampl.exe" /pdbtype:sept !ELSEIF "$(CFG)" == "c_dll_ex - Win32 Static Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "StatRelease" # PROP BASE Intermediate_Dir "StatRelease" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../StatRelease/app" # PROP Intermediate_Dir "StatRelease" # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /machine:I386 /out:"../StatRelease/app/uzexampl.exe" !ELSEIF "$(CFG)" == "c_dll_ex - Win32 Static Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "StatDebug" # PROP BASE Intermediate_Dir "StatDebug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../StatDebug/app" # PROP Intermediate_Dir "StatDebug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /debug /machine:I386 /out:"../StatDebug/app/uzexampl.exe" /pdbtype:sept !ENDIF # Begin Target # Name "c_dll_ex - Win32 Release" # Name "c_dll_ex - Win32 Debug" # Name  UNZIP.BCK)[UNZIP60.WINDLL.VC5.EXAMPL]C_DLL_EX.DSP;1  "c_dll_ex - Win32 Static Release" # Name "c_dll_ex - Win32 Static Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\uzexampl.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\uzexampl.h # End Source File # End Group # End Target # End Project *[UNZIP60.WINDLL.VC5]LIB.DIR;1+,m./ 4-z0123 KPWO5637389GHJI UNZ32LIB.DSP<&*[UNZIP60.WINDLL.VC5.LIB]UNZ32LIB.DSP;1+,<. / 4 @-m0123KPWO 56KR 7KR 89GHJ# Microsoft Developer Studio Project File - Name="unz32lib" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=unz32lib - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unz32lib.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unz32lib.mak" CFG="unz32lib - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unz32lib - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "unz32lib - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE "unz32lib - Win32 ASM Release" (based on "Win32 (x86) Static Library") !MESSAGE "unz32lib - Win32 ASM Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe !IF "$(CFG)" == "unz32lib - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release/libs" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "USE_EF_UT_TIME" /FD /c # SUBTRACT CPP /YX BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"../Release/libs/unzip32.lib" !ELSEIF "$(CFG)" == "unz32lib - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug/libs" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /W3 /GX /Z7 /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "USE_EF_UT_TIME" /FD /c # SUBTRACT CPP /YX BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"../Debug/libs/unzip32.lib" !ELSEIF "$(CFG)" == "unz32lib - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release.ASM/libs" # PROP Intermediate_Dir "Release.ASM" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "USE_EF_UT_TIME" /D "ASM_CRC" /FD /c # SUBTRACT CPP /YX BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"../Release.ASM/libs/unzip32.lib" !ELSEIF "$(CFG)" == "unz32lib - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug.ASM/libs" # PROP Intermediate_Dir "Debug.ASM" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /W3 /GX /Z7 /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "USE_EF_UT_TIME" /D "ASM_CRC" /FD /c # SUBTRACT CPP /YX BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"../Debug.ASM/libs/unzip32.lib" !ENDIF # Begin Target # Name "unz32lib - Win32 Release" # Name "unz32lib - Win32 Debug" # Name "unz32lib - Win32 ASM Release" # Name "unz32lib - Win32 ASM Debug" # Begin Source File SOURCE=..\..\..\api.c # End Source File # Begin Source File SOURCE=..\..\..\crc32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\crc_i386.c # End Source File # Begin Source File SOURCE=..\..\..\crypt.c # End Source File # Begin Source File SOURCE=..\..\..\explode.c # End Source File # Begin Source File SOURCE=..\..\..\extract.c # End Source File # Begin Source File SOURCE=..\..\..\fileio.c # End Source File # Begin Source File SOURCE=..\..\..\globals.c # End Source File # Begin Source File SOURCE=..\..\..\inflate.c # End Source File # Begin Source File SOURCE=..\..\..\list.c # End Source File # Begin Source File SOURCE=..\..\..\match.c # End Source File # Begin Source File SOURCE=..\..\..\win32\nt.c # End Source File # Begin Source File SOURCE=..\..\..\process.c # End Source File # Begin Source File SOURCE=..\..\..\ubz2err.c # End Source File # Begin Source File SOURCE=..\..\..\unreduce.c # End Source File # Begin Source File SOURCE=..\..\..\unshrink.c # End Source File # Begin Source File SOURCE=..\..\..\windll\unziplib.def # End Source File # Begin Source File SOURCE=..\..\..\win32\win32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\win32i64.c # End Source File # Begin Source File SOURCE=..\..\..\windll\windll.c # End Source File # Begin Source File SOURCE=..\..\..\zipinfo.c # End Source File # End Target # End Project j7z UNZIP.BCKFz[UNZIP60.WINDLL.VC5]SFX.DIR;1X.AXP_OLB;1oR*[UNZIP60.WINDLL.VC5]SFX.DIR;1+,F./ 4-z0123 KPWO56)7)89GHJI SFXWIZ32.DSP1 SFXWIZ32.DSWc UNZSFX32.DSP&*[UNZIP60.WINDLL.VC5.SFX]SFXWIZ32.DSP;1+,1./ 4@-F0123KPWO56GfS7GfS89GHJ# Microsoft Developer Studio Project File - Name="SFXWiz" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=SFXWiz - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "SFXWiz32.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "SFXWiz32.mak" CFG="SFXWiz - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "SFXWiz - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "SFXWiz - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE "SFXWiz - Win32 ASM Release" (based on "Win32 (x86) Application") !MESSAGE "SFXWiz - Win32 ASM Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "SFXWiz - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /O1 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "API" /D "DLL" /D "USE_UNZIP_LIB" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib unzsfx32.lib /nologo /subsystem:windows /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "SFXWiz - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "API" /D "DLL" /D "USE_UNZIP_LIB" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib unzsfx32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ELSEIF "$(CFG)" == "SFXWiz - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release.ASM" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /O1 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "API" /D "DLL" /D "USE_UNZIP_LIB" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib unzsfx32.lib /nologo /subsystem:windows /machine:I386 /libpath:"..\Release.ASM" !ELSEIF "$(CFG)" == "SFXWiz - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug.ASM" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "API" /D "DLL" /D "USE_UNZIP_LIB" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib unzsfx32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug.ASM" !ENDIF # Begin Target # Name "SFXWiz - Win32 Release" # Name "SFXWiz - Win32 Debug" # Name "SFXWiz - Win32 ASM Release" # Name "SFXWiz - Win32 ASM Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\..\windll\guisfx\sfxwiz.c # End Source File # Begin Source File SOURCE=..\..\..\windll\guisfx\sfpU UNZIP.BCK1F&[UNZIP60.WINDLL.VC5.SFX]SFXWIZ32.DSP;1;1bxwiz.rc # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\..\windll\guisfx\dialog.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File SOURCE=..\..\..\windll\guisfx\sfxw.ico # End Source File # End Group # End Target # End Project &*[UNZIP60.WINDLL.VC5.SFX]SFXWIZ32.DSW;1+,c./ 4!@-F0123KPWO56N7N89GHJMicrosoft Developer Studio Workspace File, Format Version 5.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELSCHT WERDEN! ############################################################################### Project: "SFXWiz"=.\SFXWiz32.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name unzsfx32 End Project Dependency }}} ############################################################################### Project: "unzsfx32"=.\unzsfx32.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### &*[UNZIP60.WINDLL.VC5.SFX]UNZSFX32.DSP;1+,. / 4 #@-F0123KPWO 56.)s7.)s89GHJ# Microsoft Developer Studio Project File - Name="unzsfx32" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=unzsfx32 - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unzsfx32.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unzsfx32.mak" CFG="unzsfx32 - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unzsfx32 - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "unzsfx32 - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE "unzsfx32 - Win32 ASM Release" (based on "Win32 (x86) Static Library") !MESSAGE "unzsfx32 - Win32 ASM Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe !IF "$(CFG)" == "unzsfx32 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /O2 /D "NDEBUG" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /O1 /I "../../.." /D "NDEBUG" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "SFX" /D "USE_EF_UT_TIME" /YX /FD /c BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ELSEIF "$(CFG)" == "unzsfx32 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "SFX" /D "USE_EF_UT_TIME" /YX /FD /c BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ELSEIF "$(CFG)" == "unzsfx32 - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release.ASM" # PROP Intermediate_Dir "Release.ASM" # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /O2 /D "NDEBUG" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /O1 /I "../../.." /D "NDEBUG" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "SFX" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ELSEIF "$(CFG)" == "unzsfx32 - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug.ASM" # PROP Intermediate_Dir "Debug.ASM" # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "SFX" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ENDIF # Begin Target # Name "unzsfx32 - Win32 Release" # Name "unzsfx32 - Win32 Debug" # Name "unzsfx32 - Win32 ASM Release" # Name "unzsfx32 - Win32 ASM Debug" # Begin Source File SOURCE=..\..\..\api.c # End Source File # Begin Source File SOURCE=..\..\..\crc32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\crc_i386.c # End Source File # Begin Source File SOURCE=..\..\..\crypt.c # End Source File # Begin Source File SOURCE=..\..\..\extract.c # End Source File # Begin Source File SOURCE=..\..\..\fileio.c # End Source File # Begin Source File SOURCE=..\..\..\globals.c # End Source File # Begin Source File SOURCE=..\..\..\inflate.c # End Source File # Begin Source File SOURCE=..\..\..\match.c # End Source File # Begin Source File SOURCE=..\..\..\win32\nt.c # End Source File # Begin Source File SOURCE=..\..\..\process.c # End Source File # Begin Source File SOURCE=..\..\..\ubz2err.c # End Source File # Begin Source File SOURCE=..\..\..\win32\win32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\win32i64.c # End Source File # Begin Source File SOURCE=..\..\..\windll\windll.c # End Source File # End Target # End Project Xì UNZIP.BCKz![UNZIP60.WINDLL.VC5]UNZIP32.DSW;1P_OLB;1!*[UNZIP60.WINDLL.VC5]UNZIP32.DSW;1+,./ 4@-z0123KPWO563Ts73Ts89GHJMicrosoft Developer Studio Workspace File, Format Version 5.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELSCHT WERDEN! ############################################################################### Project: "SFXWiz"=.\sfx\SFXWiz32.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name unzsfx32 End Project Dependency }}} ############################################################################### Project: "c_dll_ex"=.\exampl\c_dll_ex.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name unz32dll End Project Dependency }}} ############################################################################### Project: "unz32dll"=.\dll\unz32dll.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "unz32lib"=.\lib\unz32lib.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "unzsfx32"=.\sfx\unzsfx32.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### *[UNZIP60.WINDLL]VC6.DIR;1+,K./ 4-M0123 KPWO56eJ7eJ89GHJIDLL.DIR} EXAMPL.DIRLIB.DIR SFX.DIR  UNZIP32.DSW*[UNZIP60.WINDLL.VC6]DLL.DIR;1+,}./ 4-K0123 KPWO56Z7Z89GHJI UNZ32DLL.DSP&*[UNZIP60.WINDLL.VC6.DLL]UNZ32DLL.DSP;1+,./ 4@-}0123KPWO56Ws7Ws89GHJ# Microsoft Developer Studio Project File - Name="unz32dll" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=unz32dll - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unz32dll.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unz32dll.mak" CFG="unz32dll - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unz32dll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 ASM Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 ASM Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 Static Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 Static Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 ASM Static Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "unz32dll - Win32 ASM Static Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "unz32dll - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release/app" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"../Release/app/unzip32.dll" !ELSEIF "$(CFG)" == "unz32dll - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug/app" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"../Debug/app/unzip32.dll" /pdbtype:sept !ELSEIF "$(CFG)" == "unz32dll - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROy. UNZIP.BCK}&[UNZIP60.WINDLL.VC6.DLL]UNZ32DLL.DSP;1;1 P Output_Dir "../Release.ASM/app" # PROP Intermediate_Dir "Release.ASM" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"../Release.ASM/app/unzip32.dll" !ELSEIF "$(CFG)" == "unz32dll - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug.ASM/app" # PROP Intermediate_Dir "Debug.ASM" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"../Debug.ASM/app/unzip32.dll" /pdbtype:sept !ELSEIF "$(CFG)" == "unz32dll - Win32 Static Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "StatRelease" # PROP BASE Intermediate_Dir "StatRelease" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../StatRelease/app" # PROP Intermediate_Dir "StatRelease" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"../StatRelease/app/unzip32.dll" !ELSEIF "$(CFG)" == "unz32dll - Win32 Static Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "StatDebug" # PROP BASE Intermediate_Dir "StatDebug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../StatDebug/app" # PROP Intermediate_Dir "StatDebug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"../StatDebug/app/unzip32.dll" /pdbtype:sept !ELSEIF "$(CFG)" == "unz32dll - Win32 ASM Static Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "StatRelease" # PROP BASE Intermediate_Dir "StatRelease" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../StatRelease.ASM/app" # PROP Intermediate_Dir "StatRelease.ASM" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"../StatRelease.ASM/app/unzip32.dll" !ELSEIF "$(CFG)" == "unz32dll - Win32 ASM Static Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "StatDebug" # PROP BASE Intermediate_Dir "StatDebug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../StatDebug.ASM/app" # PROP Intermediate_Dir "StatDebug.ASM" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" /d "WIN32" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"../StatDebug.ASM/app/unzip32.dll" /pdbtype:sept !ENDIF # Begin Target # Name "unz32dll - Win32 Release" # Name "unz32dll - Win32 Debug" # Name "unz32dll - Win32 ASM Release" # Name "unz32dll - Win32 ASM Debug" # Name "unz32dll - Win32 Static Release" # Name "unz32dll - Win32 Static Debug" # Name "unz32dll - Win32 ASM Static Release" # Name "unz32dll - Win32 ASM Static Debug" # Begin Source File SOURCE=..\..\..\api.c # End Source File # Begin Source File SOURCE=..\..\..\crc32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\crc_i386.c # End Source File # Begin Source File SOURCE=..\..\..\crypt.c # End Source File # Begin Source File SOURCE=..\..\..\explode.c # End Source File # Begin Source File SOURCE=..\..\..\extract.c # End Source File # Begin Source File SOURCE=..\..\..\fileio.c # End Source File # Begin Source File SOURCE=..\..\..\glo?\ UNZIP.BCK}&[UNZIP60.WINDLL.VC6.DLL]UNZ32DLL.DSP;1;1s/bals.c # End Source File # Begin Source File SOURCE=..\..\..\inflate.c # End Source File # Begin Source File SOURCE=..\..\..\list.c # End Source File # Begin Source File SOURCE=..\..\..\match.c # End Source File # Begin Source File SOURCE=..\..\..\win32\nt.c # End Source File # Begin Source File SOURCE=..\..\..\process.c # End Source File # Begin Source File SOURCE=..\..\..\ubz2err.c # End Source File # Begin Source File SOURCE=..\..\..\unreduce.c # End Source File # Begin Source File SOURCE=..\..\..\unshrink.c # End Source File # Begin Source File SOURCE=..\..\..\win32\win32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\win32i64.c # End Source File # Begin Source File SOURCE=..\..\..\windll\windll.c # End Source File # Begin Source File SOURCE=..\..\..\windll\windll.rc # End Source File # Begin Source File SOURCE=..\..\..\windll\windll32.def # End Source File # Begin Source File SOURCE=..\..\..\zipinfo.c # End Source File # End Target # End Project  *[UNZIP60.WINDLL.VC6]EXAMPL.DIR;1+,./ 4-K0123 KPWO56&7&89GHJI C_DLL_EX.DSP)*[UNZIP60.WINDLL.VC6.EXAMPL]C_DLL_EX.DSP;1+,. / 4 @-0123KPWO 56g6P s7g6P s89GHJ# Microsoft Developer Studio Project File - Name="c_dll_ex" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=c_dll_ex - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "c_dll_ex.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "c_dll_ex.mak" CFG="c_dll_ex - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "c_dll_ex - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "c_dll_ex - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE "c_dll_ex - Win32 Static Release" (based on "Win32 (x86) Console Application") !MESSAGE "c_dll_ex - Win32 Static Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "c_dll_ex - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release/app" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /machine:I386 /out:"../Release/app/uzexampl.exe" !ELSEIF "$(CFG)" == "c_dll_ex - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug/app" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /debug /machine:I386 /out:"../Debug/app/uzexampl.exe" /pdbtype:sept !ELSEIF "$(CFG)" == "c_dll_ex - Win32 Static Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "StatRelease" # PROP BASE Intermediate_Dir "StatRelease" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../StatRelease/app" # PROP Intermediate_Dir "StatRelease" # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /machine:I386 /out:"../StatRelease/app/uzexampl.exe" !ELSEIF "$(CFG)" == "c_dll_ex - Win32 Static Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "StatDebug" # PROP BASE Intermediate_Dir "StatDebug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../StatDebug/app" # PROP Intermediate_Dir "StatDebug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib advapi32.lib version.lib /nologo /subsystem:console /debug /machine:I386 /out:"../StatDebug/app/uzexampl.exe" /pdbtype:sept !ENDIF # Begin Target # Name "c_dll_ex - Win32 Release" # Name "c_dll_ex - Win32 Debug" # Name "c_dll_ex - Win32 Static Release" # Name "c_dll_ex - Win32 Static Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\uzexampl.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\uzexampl.h # End Source File # End Group # End Target # End Project  UNZIP.BCK K[UNZIP60.WINDLL.VC6]LIB.DIR;1X.AXP_OLB;1!*[UNZIP60.WINDLL.VC6]LIB.DIR;1+, ./ 4-K0123 KPWO5657589GHJI UNZ32LIB.DSP _&*[UNZIP60.WINDLL.VC6.LIB]UNZ32LIB.DSP;1+, _. / 4 @- 0123KPWO 56 7 89GHJ# Microsoft Developer Studio Project File - Name="unz32lib" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=unz32lib - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unz32lib.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unz32lib.mak" CFG="unz32lib - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unz32lib - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "unz32lib - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE "unz32lib - Win32 ASM Release" (based on "Win32 (x86) Static Library") !MESSAGE "unz32lib - Win32 ASM Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "unz32lib - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release/libs" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "USE_EF_UT_TIME" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"../Release/libs/unzip32.lib" !ELSEIF "$(CFG)" == "unz32lib - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug/libs" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /W3 /GX /Z7 /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "USE_EF_UT_TIME" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"../Debug/libs/unzip32.lib" !ELSEIF "$(CFG)" == "unz32lib - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release.ASM/libs" # PROP Intermediate_Dir "Release.ASM" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "USE_EF_UT_TIME" /D "ASM_CRC" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"../Release.ASM/libs/unzip32.lib" !ELSEIF "$(CFG)" == "unz32lib - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug.ASM/libs" # PROP Intermediate_Dir "Debug.ASM" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /W3 /GX /Z7 /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "USE_EF_UT_TIME" /D "ASM_CRC" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"../Debug.ASM/libs/unzip32.lib" !ENDIF # Begin Target # Name "unz32lib - Win32 Release" # Name "unz32lib - Win32 Debug" # Name "unz32lib - Win32 ASM Release" # Name "unz32lib - Win32 ASM Debug" # Begin Source File SOURCE=..\..\..\api.c # End Source File # Begin Source File SOURCE=..\..\..\crc32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\crc_i386.c # End Source File # Begin Source File SOURCE=..\..\..\crypt.c # End Source File # Begin Source File SOURCE=..\..\..\explode.c # End Source File # Begin Source File SOURCE=..\..\..\extract.c # End Source File # Begin Source File SOURCE=..\..\..\fileio.c # End Source File # Begin Source File SOURCE=..\..\..\globals.c # End Source File # Begin Source File SOURCE=..\..\..\inflate.c # End Source File # Begin Source File SOURCE=..\..\..\list.c # End Source File # Begin Source File SOURCE=..\..\..\match.c # End Source File # Begin Source File SOURCE=..\..\..\win32\nt.c # End Source File # Begin Source File SOURCE=..\..\..\process.c # End Source File # Begin Source File SOURCE=..\..\..\ubz2err.c # End Source File # Begin Source File SOURCE=..\..\..\unreduce.c # End Source File # Begin Source File SOURCE=..\..\..\unshrink.c # End Source File # Begin Source File SOURCE=..\..\..\windll\unziplib.def # End Source File # Begin Source File SOURCE=..\..\..\win32\win32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\win32i64.c # End Source File # Begin Source File SOURCE=..\..\..\windll\windll.c # End Source File # Begin Source File SOURCE=..\..\..\zipinfo.c # End Source File # End Target # End Project *[UNZIP60.WINDLL.VC6]SFX.DIR;1+, ./ 4-K0123 KPWO56w7w89GHJI$c UNZIP.BCK K[UNZIP60.WINDLL.VC6]SFX.DIR;1X.IA64_OLB;1# SFXWIZ32.DSP K SFXWIZ32.DSW UNZSFX32.DSPA&*[UNZIP60.WINDLL.VC6.SFX]SFXWIZ32.DSP;1+, K./ 4@- 0123KPWO56S7S89GHJ# Microsoft Developer Studio Project File - Name="SFXWiz" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=SFXWiz - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "SFXWiz32.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "SFXWiz32.mak" CFG="SFXWiz - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "SFXWiz - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "SFXWiz - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE "SFXWiz - Win32 ASM Release" (based on "Win32 (x86) Application") !MESSAGE "SFXWiz - Win32 ASM Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "SFXWiz - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /O1 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "API" /D "DLL" /D "USE_UNZIP_LIB" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib unzsfx32.lib /nologo /subsystem:windows /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "SFXWiz - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "API" /D "DLL" /D "USE_UNZIP_LIB" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib unzsfx32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ELSEIF "$(CFG)" == "SFXWiz - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release.ASM" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nolog  o /Gz /W3 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /O1 /I "../../.." /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "API" /D "DLL" /D "USE_UNZIP_LIB" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib unzsfx32.lib /nologo /subsystem:windows /machine:I386 /libpath:"..\Release.ASM" !ELSEIF "$(CFG)" == "SFXWiz - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug.ASM" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /Zi /Od /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "WIN32" /D "API" /D "DLL" /D "USE_UNZIP_LIB" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib unzsfx32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug.ASM" !ENDIF # Begin Target # Name "SFXWiz - Win32 Release" # Name "SFXWiz - Win32 Debug" # Name "SFXWiz - Win32 ASM Release" # Name "SFXWiz - Win32 ASM Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\..\windll\guisfx\sfxwiz.c # End Source File # Begin Source Fie@F  3wpec g`n|l  XU(AAM,36g+3t$T4Y+ M+l~uG P.'H3"~)rvvxn[H,mRL8{RN1Iz`*!ee (jF48^Evkf^'/?ngmWhQH(c&)$\I*p ID*$.~HFNl_37!YgYWP;M R|U()+S,'>Ftp<,KE<UQYO:Ke&GYO' Gyu!1!#%!Jq%ExYrc % Xg7QwsPP<f [>V7#'1jN$Cy3dMpOF!m:%RLQ5m@CfP#~V1K% <}{F(Rjqsasmgu,? fMLnoPW 3]aqX\Gs*8QWVH9b:6I!T9~<25h`4zn(Qy@-5}W+xA#+riDT>S 2 2lOsv TV) h+4ZxHAi<U,D =Y3U"vl.NkV/SZIy,*4ue7,T fwFLZ.Oe7Rd0]\0=5HP+^*SML6zi=3d]>61j[=Z.!]$Z>GD; 37.?h&zR%$~O&ayT"{J`5z#b?EXL,m{3'F6pnO4$?)Lx']'cy\l GB6x|7 zM0*F;a]vD]kR_KSk^k8 O#KUuo8z&q$xFUO-d>'F}\m/dT.\`vp{+IK 3S=}oO42X?P}f3M.c[&TgLSbQkVC5j0q }0^]j45{bEOp :*!G`5)hMJ6i|K[#@*HAJTa21NZIu6SD^U9f]S]jbO dni ^[ADh<*_WZcxkk;=%ngUcL_s5WOEDbfT%63B25+O/aQ#nUo&% R5aHyx&%Sp eSyqyN|~pe2t&Vi:?O^$; grSa]_T8.}ҹ/ipus:v m /@;_wb\8Z-K(>o^^2ei[NBkUo_aI{Arʌ6Lo739e;yRkx^AI6h">P1 92\X1:nLZ q[*@ W}z*q gc-G}7n3E9E_9H4m|w`<hCViEe8 27~%!.w]ZXU~BpQGc< j;Pe3nFn2 ez#:;D`F$jyLCbL%$/ D{SC "N \ZiJ?,[9B,~a:0'7?faJwrCFY)l|:\y]Q 0tF8m^ }(41s[:s~1Vn2'q[kWT]N{|G(8YD3[_JP:L]ijw:CwhF3hZEЁ(XuXkB)$rRD+k~$"}=c~?#-UP61z)ue$xClaRUo&o|nrN'/\# GK6AN g\VJ+}tT~w ~IR 2qrr2y7f0.KW5S@XA*.M]w3 JJ+C<># X0dlvOIc6%B\ J 7!oCa0obNiTZDlMrT+tW}10GW)07a+7YzeG.7sEn"q %'#P+`*~/:728 ($p)",y3}!YJO#,-jJB-2naL=rcS3@A5&zid:4rC<{gs)3oHi"IuD ~?b9FO ']w-3:A1uxV1h.]Z092SZPCAY2_i6NX@3w=P(D= Rr*y4dlNwUbb*:287k;J6(;I_:4-=KOH5QG.$9<}?4so^yIjXzY]Nsprr6"Ex8+lG.#=LNU)N7$ Q?Nq+(Q}LR/ 1HA4E[{\RGoZxssNqM*^;ea2fCxfN^d8S6D6&K\omi+q"i3 jgBQ_KgDW;Q;*u[o'5T+QM< E:8Mz]Gq $\Y9~KDIqX[v4+:-;ZxlS3JduOa.q/#> {FG,c3ELziAL\w9@S O-`GorX%\ ZsKBAH7/- OoulSz,HK>I:JD=X*:lN.4_8(:sjpd ~xa5Mz KrV(]UBv8+|d$MP8m!}.>_^k6`Rx& ]dD- ZrLF#4t=]nzb0eNzh |l7WNa{Q }-Aу:+8\*b k*66'$LtAugk%a )[_.1fiY+q.Z./O[qew = H^T x]<!2Ii<9A[R}uZiX!+v[L>;z_}8qtW" 8eUg {yF}.O>rU9uD8V ,3wcubcFCmi2]fXvDV7"*/G s7?s> _4`$xt_FUqOvHUp}>hiL]]wfE'|{o ~{~ u+O~bgayQ@f v;VcHY@z'p+zYQ7wY!jM]lF~ S9l(q;GQ:-Nc+:z?f>D%oS*8@s'y^udy8J :Jw1O_Rw v)3|@J*@}Y Je|U&6.c2,nXhf>3"y!9>r$|E2]*w*XJ&A@f,kv'DKO1 Eh ^zk) v_ /`nj9}oR=*,4j@n"~(w:LnsM N(&y@M,,Wzf)!.W Gj\9|Yc[z%V1[.= b.oWxA~z ~\L#bqYID<9n9q'"/8%3b- e'T) !.EWShf.Oca@R%1`ik- 84MNPy^SA=)xA7%0v']vb2*[m{~H$bR5y;$u%He'I*?uluB41V_i& I|zE,Ɯ}a5T%F_#3=8)WBESD0{^k![RF3hCIx|NZK]rO5 knZ%DeW"&XFc-:*v>]T~1-;e$GZnvDo/u $}Gnow%.1dh"NTTj9fs!8i:&nLMD~{TrJzQqwZVjUW ~#))TmP|q~:h*4ti"8,^uM}5eGIOBaW{((#fIpX7 hD%|R2pT/t#YiHFzLj` }cf3$`,!{Vz $1SLpfL'^cX+]Gpsc`t{|Uzj!'3hS3HhJQ 2nm+[e9%FB7#UAb f<, bzPKB^GAi! [pu<||9AxQ2![ akBk|HVQ 7|rR9eD '(6QO.*}!s ArT7Z~"H/H " 8uV* gejmR _WBo-c8z arp7yOQq}b@<<}xKV"./RFF2[}+*Dh3=?** `]R85j>>/=lHRAS|md (#6h3/r:ZY|W7 h7|WWT a! ;5B!l[J_]jTuMMPq}Bn?4A!7AK`2Z'=%"y:RW .l|n<2Z;ccVW xhj6)3/GsQN Jmqm'M)ZCzk{d[#% \^Q.Di6H\~8r40;"N[onveYG(h+4Fgnx qYM%`h7>p<kh5#4s6yc5&!LQ7Eg1NtDGPV _Vi+pZD?W%6M8Dp[A%Lm3cq[{=]Rk_WXaB`!(o}kx`mk': `xu\5` |S#1-U#>[V4^:a{; ryGqR/XXR$J(5<i!OL2{{z;.sOMK KCkDYVE,3u8Gr QG C\ +=R40@l1% _;sBV yf!#h@GlS a@t Klm C97)pOQ<0$&Wc?0#TY&N^5Og?}@R33YqqY _[T**!D0%c?} :EP\2 CpL$ A8" 3]of3JI$~=4J";)K R7f{-T9S.3M/3sVBl%Z5.gh} BGZ z ih>pKkyWJwDDe7vkKDx*EuZ#<\:!6yeHWu#w]!5ZP[TRV'(g^J<[P1ri:Qz0~Gl8UoG6CnYUsg'l1gW 3p5Rxt ;(s|#PK z2!VWP~Ls2D/lF;]A{:6W_u\9_Uk,Bs fEgI>n{v !'dsetgfQ(`8Dg3|UktWAs 8E(mAo;!stz#r Y[`qVA<~fm}K4. k #FfT7^MB yne{Y2ej)\l_.S`V*h{vRUx#*  3OWk[7\rPox20\k]&|n: YC{ kQsY3zsROZ&tdHcc1#}NNE zZ4Iko;^j3wQOC33+drVa"5sFtHkSg?e1U)[j4UnXdDa=9-/D\`%-4~Z+P,wZ>- f$ s kl-dE@vnM!,\\z<6<9f4#C)>2]K,])QU,]\;d'Cpt,[{lAyFh4&&^WOUF hh3Q9@:[P4:snPgMC7 :iT'F/FAVek|G(C"H } , b_GArkA}_D3Az"O-ur6YUo@,3DKtt{^. ]`\$f7(t-=R5%)C@cP ZI}hW2J997 .t0U1VA Lg Nhe^JfAd &5 XrmVb%V=Uxo;Z3.2~ Ci!d"`NT b3f*~Dr^KH#j1+0>1scm+=Q[nai\ By~],R3Xb5 )=/6wP{NV;U{S'9yC ,"{OXkQzro 's@@W{f! NOIm* -h8=s _.p{7:S'~vd!$(D vE{rb5 ypgPKu01g?Y.^-([;6Vv^, MbB*b._T'&;,aR8E$]]DN0oPDAzvK"_wbwN=c}ko&*w&L!h=-?g/_ _!.e36ERk [\D)TyMaMaW_(I#RlunDjhw KD;(QNK}hg&'23m)V@HAt="B)pQ zX`r;,}~oR5)_l~iP_T>~4\*YNFdoVad0xSU&Li 7"?D0Zj1P%Zp{9/Dp/Q [SlpFZzl; FEw&Z\ ]>}Id+`\p>K5N6DV<s^tXZts,9G$ALhjN {XQ&Pn1LL_bY$w%]hZI,_W zk}ZTCG q6tncM?y3v:9oBk,LMRcX&'"/1RUl]x1EpvmIkif&M1SC+$t:lz|Bd/~Q;^@^5R-c&6xDF+L56Cu`(<z!<) jNg@zb)GKh1!5hzb;h 65;Ia0 V8h "&E!/[0b7^'0=*GU 7-ixH0]'H8*16L:qr02uIfJ%U |fbl i-p_ibaT\,",UOz_x|D@ X.5jYX+$@CT+i@ 3 =x'A;3Z${dSGyVg 1h/^!Ay)X'GW.NLv"FW)uzX<.z@je&C !wVK@$=OM5 60jHw??Fң88-sW'yV4EQs4Ggel"wiXy0)*F@Ovsi!kyl/QE%r^,w;sR+kSAQRrHM8v~pBv-XM\wz( g Y5^8qN8$OV|T/m0fV7W~L !N,f <]Jf|O -:KS)~GG^uxl[' '~ku<$$xJ?[~wZ#z[ +?HE/gDr.xI!UC*]T?{%}*& 4z l(%pNgUeWENo?.ag(ui@y`7 y~{G,] M[CW3fy6l+Ergg1M(K'f%Hyx`m[c8YOXN8LOHb`i8S(F@X  SAQ~`X^RVieV_,B7`k,Ea Usf]@f?>ur 5B GUgE, :libraries 0 # PRO3 R UNZIP.BCK K &[UNZIP60.WINDLL.VC6.SFX]SFXWIZ32.DSP;1B;1)le SOURCE=..\..\..\windll\guisfx\sfxwiz.rc # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\..\windll\guisfx\dialog.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File SOURCE=..\..\..\windll\guisfx\sfxw.ico # End Source File # End Group # End Target # End Project &*[UNZIP60.WINDLL.VC6.SFX]SFXWIZ32.DSW;1+,./ 4!@- 0123KPWO56#sW7#sW89GHJMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELSCHT WERDEN! ############################################################################### Project: "SFXWiz"=.\SFXWiz32.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name unzsfx32 End Project Dependency }}} ############################################################################### Project: "unzsfx32"=.\unzsfx32.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### &*[UNZIP60.WINDLL.VC6.SFX]UNZSFX32.DSP;1+,A. / 4 @- 0123KPWO 560)s70)s89GHJ# Microsoft Developer Studio Project File - Name="unzsfx32" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=unzsfx32 - Win32 ASM Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "unzsfx32.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "unzsfx32.mak" CFG="unzsfx32 - Win32 ASM Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "unzsfx32 - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "unzsfx32 - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE "unzsfx32 - Win32 ASM Release" (based on "Win32 (x86) Static Library") !MESSAGE "unzsfx32 - Win32 ASM Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "unzsfx32 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /O2 /D "NDEBUG" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /O1 /I "../../.." /D "NDEBUG" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "SFX" /D "USE_EF_UT_TIME" /YX /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ELSEIF "$(CFG)" == "unzsfx32 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "SFX" /D "USE_EF_UT_TIME" /YX /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ELSEIF "$(CFG)" == "unzsfx32 - Win32 ASM Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../Release.ASM" # PROP Intermediate_Dir "Release.ASM" # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /GX /O2 /D "NDEBUG" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /GX /O1 /I "../../.." /D "NDEBUG" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "SFX" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ELSEIF "$(CFG)" == "unzsfx32 - Win32 ASM Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../Debug.ASM" # PROP Intermediate_Dir "Debug.ASM" # PROP Target_Dir "" # ADD BASE CPP /nologo /Gz /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "_MBCS" /D "WIN32" /YX /FD /c # ADD CPP /nologo /Gz /W3 /Gm /GX /Zi /Od /I "../../.." /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "WINDLL" /D "DLL" /D "UNZIPLIB" /D "SFX" /D "USE_EF_UT_TIME" /D "ASM_CRC" /YX /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ENDIF # Begin Target # Name "unzsfx32 - Win32 Release" # Name "unzsfx32 - Win32 Debug" # Name "unzsfx32 - Win32 ASM Release" # Name "unzsfx32 - Win32 ASM Debug" # Begin Source File SOURCE=..\..\..\api.c # End Source File # Begin Source File SOURCE=..\..\..\crc32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\crc_i386.c # End Source File # Begin Source File SOURCE=..\..\..\crypt.c # End Source File # Begin Source File SOURCE=..\..\..\extract.c # End Source File # Begin Source File SOURCE=..\..\..\fileio.c # End Source File # Begin Source File SOURCE=..\..\..\globals.c # End Source File # Begin Source File SOURCE=..\..\..\inflate.c # End Source File # Begin Source File SOURCE=..\..\..\match.c # End Source File # Begin Source File SOURCE=..\..\..\win32\nt.c # End Source File # Begin Source File SOURCE=..\..\..\process.c # End Source File # Begin Source File SOURCE=..\..\..\ubz2err.c # End Source File # Begin Source File SOURCE=..\..\..\win32\win32.c # End Source File # Begin Source File SOURCE=..\..\..\win32\win32i64.c # End Source File # Begin Source File SOURCE=..\..\..\windll\windll.c # End Source File # End Target # End Project ̬ UNZIP.BCKK![UNZIP60.WINDLL.VC6]UNZIP32.DSW;164_OLB;1n!*[UNZIP60.WINDLL.VC6]UNZIP32.DSW;1+,./ 4@-K0123KPWO56K@SQ7K@SQ89GHJMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELSCHT WERDEN! ############################################################################### Project: "SFXWiz"=".\sfx\SFXWiz32.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name unzsfx32 End Project Dependency }}} ############################################################################### Project: "c_dll_ex"=".\exampl\c_dll_ex.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name unz32dll End Project Dependency }}} ############################################################################### Project: "unz32dll"=".\dll\unz32dll.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "unz32lib"=".\lib\unz32lib.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "unzsfx32"=".\sfx\unzsfx32.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### *[UNZIP60.WINDLL]VC8.DIR;1+, ./ 4-M0123 KPWO5657589GHJIDLL.DIRI EXAMPL.DIRLIB.DIRSFX.DIR UNZIP32.SLNa*[UNZIP60.WINDLL.VC8]DLL.DIR;1+,I./ 4- 0123 KPWO56}7}89GHJIUNZ32DLL.VCPROJ)*[UNZIP60.WINDLL.VC8.DLL]UNZ32DLL.VCPROJ;1+,.g/ 4ggz@-I0123KPWOh562s72s89GHJ 8  *[UNZIP60.WINDLL.VC8]EXAMPL.DIR;1+,./ 4- 0123 KPWO563.73.89GHJIC_DLL_EX.VCPROJ,*[UNZIP60.WINDLL.VC8.EXAMPL]C_DLL_EX.VCPROJ;1+,.#/ 4##@-0123KPWO$562s72s89GHJ +>^|M E QE>$Rol?Ye`Y]fv/NWnV~ F 2r0#6O%k!X0Xt2[-` _zczlk0ih lr_ ftjYt?eEU IS,/-V27gXD scsGFKcW(0!WYBZ4ozW474:GyXsKS'_"7 n+h C|b<&NLjF\L i@%=1'Uk DrV%/=-COUDKrF4}r-<9 ~Wc 4./(c._bI(xeATf$ T[|BX^ g{g5(L .~ |uQ#7M\rl,M{}2Q$[*hr?DRQnCH^M[oK"8"V! &OiEnjlQI{EPjjvy.81DGYqm5j-R f^OH?&:%{/]6,RA13*T%Y62^(#bZV bE>Er|ym9r*yT]wSSC !V&"f"uaTcw~noJ<^o#k"PlL W.bpU }:){\wCNkTrPp[4/1.{tQ _{Ghn/!Os}Ke4h> **&i:h+X fM{.@Ei0\P>wi+R \ S $P9&6h%(s~`U1h1QIJxF6&7 u#[T[fvA#L2W:|G[`Zy*Qub7xhV\#\q e.%y^E2X?zq 7@B"q"<^ (kB#K#2rR|'=. J^;pH|T(f7 d0] C<))5;9}E!Kh|v^NA$\3$Vnb-Ap[ {gwlx}ukKe)IRkm;J8de?Ou$e&~]#qY56 S?E S<;PSO8)i{X\u`AgV_ `(3>L XiY3EBS$} r@0B|`];#o{: KXL.Q?Kf GcQzbN;$bA BC_B_Y 0 g?5ST4[Rl5WF#Se_Z==p2P<~3 ~Nw8f$h7cU$^8a %2w8p5>8j%!lQ|xfAF)E`WW$$wLZV(s[s>/ :uN'<#M;ZW LR*/mHL:bL0 [k[@_)?7-}u.CRz`wAtK+H/5GRQp" Ul4x#E=N&}6*cr@o7$dA/Lr@Q|o6u+/s>  j8F|Wk7! my(bhs|%4:Q\KB2Wk^.Vs EZt^?Z{2=+0c@o{Qg jZ5Ufr2^w5Af1yq (hV XMS &QKY3t:uhF#(E{*W5 n W|jml#ilz #x$~6sE<-H]Uw)&%A 1\i(o[Y-BqoS eSXzT4sS$YvdK.w]5Dzd8%,eCd#M{?K@F-Z3N$LmEQzH!A#lZ7P)w )]Cal}'aBzE=&B>g WmiZm4~\P_'D&YS}JJfZytJU}s7a 9clO )OE|-:YR-G0l3;i H}!OLd_3&^04mQ{:bFmC83wlgXPzD&9HC{&Sz+,N|@x*n^B7fU%ycB2uN!)[^]k.8Hr7D`&9h6gCK[P<&8?HCmBIQ1t!qmJ47,MKQX^G{Y3:^4t.O7j9wJ^^SfjfL:^3u'2CL)>h7cg\D?Sl=:&9 $:!+Iu \C4 *h>~M!@Mg6uI$}9QNL\4 x5DE|6h/|]ͱ0(vWjUj} n!,b{qZc}U~?2PMA [_$*`6/4tra |%<48)znrL;h=$pXYva{q`=:"VY<3\wI-mpo#w6aSsF7vWZlTirgg~fTl{^gYbZ\O(QQ7ksgvd1OFz 8D#3-(0!  F?0$_C+D8J+t]a9m$Sl2|V{FGF /ht CbP1D{pph^trF}8``YWeBAPuE4 OWy2(lMvoS F-\TWQO'njNQ:!L" s nV74qX!1:y`mSR1MNZ,:P+BCċoaw^<gQIe!)+p.eg*>1.g1krQ!9o5=hMW'pcx*zlx hSoys}aNweG:ISBybvv BnB^OL[Q%{,w-Bm*fXaA\|Wdg9#`Y UjX{O+T.Lt7^*b AK) |&+s ^|%s:g<m9X)^.:ra&AS4\ +.I]M3Q S eXAZs\[sCtuY,tQ/I`=W.@0:"&eV4QqyU%5ZXH[X/` WmK:H!Z [*,\]47o2b A?D@@> H11QY!S`W2fhd7' jr1:p5, Ic@B! ZS8pEjN\I|qgo_j/fAT 7=+dDcU'%gqA 4R*" sBnffJ)hV+{/M"''eYB2R+ye ;gepMyOwSQ.aR[e0[Y:)I*CF6L}+s@p}Pp'Efs?(O(v}PAAnQ07E=fT4eM=I% jhefSnGRAbWcL6M/%=Q-lzzu@#6lAf~Ybbu4e!yT#_>85fCBdw?*F_(c+C%6mCh'En3).!&SpO30sM&|[H('B ArK"4DZB2xcza~&.-2/Tt ,vvSL[oEoNRAz -,m' 0Y\0'(~h^$H23~0C>^@"vY._NCzKWr~wpx^IQ(y/DgEP7v#A?a٨p?9X]: Ruw3f:.bP}x=IJUQC7 G%[>? l^R|.zN0UJ VyC`vx;~bt\<:X@vr!w !56~ 0IVA)VE;#x;0kB>8mUdME/H)Byj"y,S=5T#CB2nQKWIH:S*/a7} =VG)x}I YuFSY/uH_e$'b H3Ge3YJnI6a>rBH/kH+O]j[!j l|j BCx o8,:<`TUH/J/mYzqm~dD#jWnHWas1K`u2HH@S0c0nPHbQY V'(8p'6 2i hC[@x$ <*W tPCn%jk@8|7<"-nN3BiAUgo9]w`AG!ZG%d$/ mly]Vv0$ .k e,YmbI 6OyC)n5&VNAD*2X:42n>V WBM`'#k.x0|j3:on^yqzUX>7[ O!&+[F,Uj]$/' Gs:%t>;c! r+n]}/='Am6]4Egzo#&n./) k|$65SfCR-&i_k#nKPX< 4]'{^E1M6F39rV:,.Bw-/WcxW\1QKG9+MI.?=ro^4nm03.8V*IUlv R@>[f$DCD(Cr-n}x',g+6ZKaF<}vShEcE{| uxW b yO{K%=$^YHR %@$"'I\er+Pb&i\yq-y]99LFOO[{-mmv?$F:Og?sejeu[h\UexV+z1+S1nra $}Ag\Il*i+V}kI^:g%vlvwC;9XU=!mxgIo.*-oTc??-!aAR"sc n/I{Wn+<%{AD{+9 wXNFQf=f\7bAN7Z5`!58_JN6.L.?ea"m kTWUuSyC%CGZX}^7wv }W1.sA,nUf7P,l9D36PHgF9Lq;[bHb6S(}Dlo(x-*y}k &0'+pCJgs/>W\3l"cQ~g12PS62@K dPx\/{aKgE(8 t:BXPcgTwP~_xPKs>7`8q]qNClzx5Fslo]k8|;Hn^;Tf6:9 54Q\b22j{J`T^yld}qMYt/s9:\+`D'~{-U6i&srz$=[.uC2kBJs~I,Q/=^s [}Wh}tj`_+0p#[PK;4yGZUg$~AT*E1yA5; vtd lt:rR zUDIxS#5@},kmRZc q{Kx P%!2XB5|9sZ_>wcAYzj [&iS.TuEkf-"%%@a==S*.soz-MKoew1:iM$pBTq"mJA2E$rt2Q4N$\":]Wd\(1`iJ\ B3I?_xaPHwPrtCjS5\e3%~Z3f cI:NvV ;ndnhb&[V;I@[ X6KX;J9:J=m'M'? T#VYPWTWTT4OeB#sEfM9L6j"6aD?ZszYvEej8@b tgrn[!Pr ,H (jd_6(Ks4"g0f1.7.>?o !q>bd#.E1~U)d3>7mK4J'kH.^R# 6?LjsG?1yr-?, b[B^{P 8 ]3u 1$%&n(z2GQ^C&)'S+5 [I}Dcn$R&l$7T?!%Px-f FS )DtuO<**[] n([AN 8-a+z>B[e]U|pi<]]P/$:{6Ubv^L[wdu":TB6sFu4;23Q;|vUma} WASa0TuZOr=DBR[m_J/hw2i(8/|k1uu*+0|U`S%rm']1:*#Y/0+ QlR6~n}%1kBvg,ZAIy-'vC} 7 m1uV'eI %'H vW3pNUtWh-M[bx}(aX(MfeA{ha"Y:rA&;vmN _naI0( _< /5z~{c6O\]y;h L'7,B[I<rr=\;9Mj'CI+YnvmWeJ 'Scm`'(9bG}W_Qh/%M0I(`d)9 f%irI4xG;}?;bDE q7\ jFOf&{d8:?#3K.6f#(>}Gv9j=:hpS{Cvy-8C~]a}R/=6(OM5 Uj$)?4v.nH,^Txtj;h eW~.;+\>m~#;Z#Z^OkzAQdw lW=B0)DJ3;bw/M--*5piiWxQV/(*_s,Ra*?fRaia 7sTUOW:z*mY+ 5&2|E%2h&z I EDGzqNx- +l?yP"-~ 1 04.B6p3e_A.&P E4MM7 +i*T.aJ~H!B#Pt3:^q!}X[+pqDeHI_rb2LRj%!yIO69} #+=y"|?x%Ao`VxP?)5xpvfqP0i9Ev 5F DTSCI}.io @"&i %e\$MNq9}tP.D} DY]}-;V"i~-SkmB2*yeIBtr=Sb@L} P D:{vs[[EiiR)L!Ky9 82F"l`[PFw(E^1_@#xI.GEGef0z \z9dDLHoX0ae2X T_4C[(j1P! O' \_ aDbW=]dJ6]QD|w M:*#qi "\LP$aD6[@ 6yeY !+D8, C?",Mo']kbY.t 3Nktbo76L(0BgKt-acw(qr| b/`f8EHJ>ARY*|l$y.^% 5zsW${U&{YBt*2QUTu?sy_=bim]]Tv7\ 1 H0]!'*>A;qO* d [L[B 8Jk4mnJGEZ7\/2+$hBGv:.M5@aopx+eg~A'+)8P#0|P'w@gz:5IJn 2SI4870 5gb>g NK8AHP@NM=8d~`UoU($?s#\K &R1meV4bSl`5f OwYXC4[Nbm+Q|k$U pO%7c .$O2(UM%<'eJD^G2L@UUlwbog _z#4XOP 0w ) +X&g 8nQ:Vo|!#dDUUip(ck7Sd5fjY}o, K"a-YtpF\se-W`L}Yo!lbt[3<Jm2D0?WhtiEM4+G>25xwNRMfcmVD>I~ \`cJCAg~Dswii* cYc']'O;Gz7@(+eR##zdggk `DP6N>"J^(  +  dcel4 $U''`#indll32.def" & UNZIP.BCK,[UNZIP60.WINDLL.VC8.EXAMPL]C_DLL_EX.VCPROJ;1#/> *[UNZIP60.WINDLL.VC8]LIB.DIR;1+,./ 4- 0123 KPWO56G7G89GHJIUNZ32LIB.VCPROJ)*[UNZIP60.WINDLL.VC8.LIB]UNZ32LIB.VCPROJ;1+,../ 4..@-0123KPWO/562s72s89GHJ A]~ UNZIP.BCK [UNZIP60.WINDLL.VC8]SFX.DIR;1X.IA64_OLB;1H*[UNZIP60.WINDLL.VC8]SFX.DIR;1+,./ 4- 0123 KPWO56_7_89GHJI SFXWIZ32.SLN$ASFXWIZ32.VCPROJXUNZSFX32.VCPROJ`&*[UNZIP60.WINDLL.VC8.SFX]SFXWIZ32.SLN;1+,$A./ 4@-0123KPWO567s77s89GHJ  Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SFXWiz", "SFXWiz32.vcproj", "{6BC29537-2E45-4429-A634-5C45B649436C}" ProjectSection(ProjectDependencies) = postProject {7545BD38-9F08-4F69-A944-E9981A5AB398} = {7545BD38-9F08-4F69-A944-E9981A5AB398} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unzsfx32", "unzsfx32.vcproj", "{7545BD38-9F08-4F69-A944-E9981A5AB398}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution ASM Debug|Win32 = ASM Debug|Win32 ASM Release|Win32 = ASM Release|Win32 Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Release|Win32.Build.0 = ASM Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Debug|Win32.ActiveCfg = Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Debug|Win32.Build.0 = Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Release|Win32.ActiveCfg = Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Release|Win32.Build.0 = Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Release|Win32.Build.0 = ASM Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Debug|Win32.ActiveCfg = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Debug|Win32.Build.0 = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Release|Win32.ActiveCfg = Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal )*[UNZIP60.WINDLL.VC8.SFX]SFXWIZ32.VCPROJ;1+,X./ 4E@-0123KPWO56p7s7p7s89GHJ )*[UNZIP60.WINDLL.VC8.SFX]UNZSFX32.VCPROJ;1+,`.&/ 4&&@-0123KPWO'56 G:s7 G:s89GHJ  UNZIP.BCK`)[UNZIP60.WINDLL.VC8.SFX]UNZSFX32.VCPROJ;1& !*[UNZIP60.WINDLL.VC8]UNZIP32.SLN;1+,a./ 4@- 0123KPWO56$b"s7$b"s89GHJ Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SFXWiz", "sfx\SFXWiz32.vcproj", "{6BC29537-2E45-4429-A634-5C45B649436C}" ProjectSection(ProjectDependencies) = postProject {7545BD38-9F08-4F69-A944-E9981A5AB398} = {7545BD38-9F08-4F69-A944-E9981A5AB398} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unz32dll", "dll\unz32dll.vcproj", "{26E880E4-A1B1-4FB1-8833-13FC0FA48857}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unz32lib", "lib\unz32lib.vcproj", "{AC199DDF-4CC8-4BEE-988E-1D20C7336F22}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unzsfx32", "sfx\unzsfx32.vcproj", "{7545BD38-9F08-4F69-A944-E9981A5AB398}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "c_dll_ex", "exampl\c_dll_ex.vcproj", "{80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}" ProjectSection(ProjectDependencies) = postProject {26E880E4-A1B1-4FB1-8833-13FC0FA48857} = {26E880E4-A1B1-4FB1-8833-13FC0FA48857} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution ASM Debug|Win32 = ASM Debug|Win32 ASM Release|Win32 = ASM Release|Win32 ASM Static Debug|Win32 = ASM Static Debug|Win32 ASM Static Release|Win32 = ASM Static Release|Win32 Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 Static Debug|Win32 = Static Debug|Win32 Static Release|Win32 = Static Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Release|Win32.Build.0 = ASM Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Static Debug|Win32.ActiveCfg = Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Static Cs UNZIP.BCKa ![UNZIP60.WINDLL.VC8]UNZIP32.SLN;164_OLB;1\Debug|Win32.Build.0 = Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Static Release|Win32.ActiveCfg = Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.ASM Static Release|Win32.Build.0 = Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Debug|Win32.ActiveCfg = Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Debug|Win32.Build.0 = Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Release|Win32.ActiveCfg = Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Release|Win32.Build.0 = Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Static Debug|Win32.ActiveCfg = Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Static Debug|Win32.Build.0 = Debug|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Static Release|Win32.ActiveCfg = Release|Win32 {6BC29537-2E45-4429-A634-5C45B649436C}.Static Release|Win32.Build.0 = Release|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.ASM Release|Win32.Build.0 = ASM Release|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.ASM Static Debug|Win32.ActiveCfg = Static Debug|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.ASM Static Debug|Win32.Build.0 = Static Debug|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.ASM Static Release|Win32.ActiveCfg = Static Release|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.ASM Static Release|Win32.Build.0 = Static Release|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.Debug|Win32.ActiveCfg = Debug|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.Debug|Win32.Build.0 = Debug|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.Release|Win32.ActiveCfg = Release|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.Release|Win32.Build.0 = Release|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.Static Debug|Win32.ActiveCfg = Static Debug|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.Static Debug|Win32.Build.0 = Static Debug|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.Static Release|Win32.ActiveCfg = Static Release|Win32 {26E880E4-A1B1-4FB1-8833-13FC0FA48857}.Static Release|Win32.Build.0 = Static Release|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.ASM Release|Win32.Build.0 = ASM Release|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.ASM Static Debug|Win32.ActiveCfg = ASM Static Debug|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.ASM Static Debug|Win32.Build.0 = ASM Static Debug|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.ASM Static Release|Win32.ActiveCfg = ASM Static Release|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.ASM Static Release|Win32.Build.0 = ASM Static Release|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.Debug|Win32.ActiveCfg = Debug|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.Debug|Win32.Build.0 = Debug|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.Release|Win32.ActiveCfg = Release|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.Release|Win32.Build.0 = Release|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.Static Debug|Win32.ActiveCfg = Static Debug|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.Static Debug|Win32.Build.0 = Static Debug|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.Static Release|Win32.ActiveCfg = Static Release|Win32 {AC199DDF-4CC8-4BEE-988E-1D20C7336F22}.Static Release|Win32.Build.0 = Static Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Release|Win32.Build.0 = ASM Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Static Debug|Win32.ActiveCfg = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Static Debug|Win32.Build.0 = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Static Release|Win32.ActiveCfg = Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.ASM Static Release|Win32.Build.0 = Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Debug|Win32.ActiveCfg = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Debug|Win32.Build.0 = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Release|Win32.ActiveCfg = Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Release|Win32.Build.0 = Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Debug|Win32.ActiveCfg = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Debug|Win32.Build.0 = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Release|Win32.ActiveCfg = Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Release|Win32.Build.0 = Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Static Debug|Win32.ActiveCfg = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Static Debug|Win32.Build.0 = Debug|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Static Release|Win32.ActiveCfg = Release|Win32 {7545BD38-9F08-4F69-A944-E9981A5AB398}.Static Release|Win32.Build.0 = Release|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.ASM Debug|Win32.ActiveCfg = ASM Debug|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.ASM Debug|Win32.Build.0 = ASM Debug|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.ASM Release|Win32.ActiveCfg = ASM Release|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.ASM Release|Win32.Build.0 = ASM Release|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.ASM Static Debug|Win32.ActiveCfg = Debug|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.ASM Static Debug|Win32.Build.0 = Debug|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.ASM Static Release|Win32.ActiveCfg = Release|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.ASM Static Release|Win32.Build.0 = Release|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.Debug|Win32.ActiveCfg = Debug|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.Debug|Win32.Build.0 = Debug|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.Release|Win32.ActiveCfg = Release|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.Release|Win32.Build.0 = Release|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.Static Debug|Win32.ActiveCfg = Debug|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.Static Debug|Win32.Build.0 = Debug|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.Static Release|Win32.ActiveCfg = Release|Win32 {80E5EF65-3BD4-4EFF-BA4C-CA893C95EE8B}.Static Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal *[UNZIP60.WINDLL]WINDLL.C;1+,.?/ 4??e@-M0123KPWO@56YM}7YM}89GHJuz9wxgee|~ i~J;1 a "u]4V,LJ&mq8 ]IYT/z XOXfK8`R,:H)jr1bTianPA/]=%rlsvyX< .=!5_=3Gz2?wm%OiwZw#/Q[hsus'b!IYK'In9YRQg\rnC8~D5wQ%_RwT+2gwk}Q_ ?6UA-{C>'EsU)igS M'e-8e?W':MC1=^CD%^B -<qh6iNHy$;Jk 1nnz 0mMM*KP;1.dRDoKRD DvJ{U 6>"qBO!hc&z(=37)pT> S0}R*#BP+7XgO+p*!\:95dYp}O2(Rrf Bt[(>&)}Hlx)CFjnw|zdQS*;U@}wC c,cC9v)z>UI@FnJTe'YKEp-<:S5'r2U3`.WZ% D{V,`n?}`QCc^N=H/pVf_c * X'Ga`MOX|0C/88 'CmQ )8CTpwrw269]%K,Il1wV[~r3$3x`qrkM?.Y6 Hn6UM+cAcS6CIaN^  .&p~j9=C<&q$byXEj,y/J,(7 OK3@T0zi9F'a{vV+@m3; ;!Q [qU_ iR!UsEC&PQ;NG 0ihp`}AD| i?A ? :~CW V Rqf"D-p1WUl$UY1%Qy C@TNtD^Nlr7kE2MW Zry1W<8q%Tgq.1DFDKE~vW$V?[DdtYr/IV 1'` U, O, Kto:^U*i]6$zMX&S2EY'2{F_+};z _})%jGrg:"/1;B?o,P|CpiV8WF z>7 `PJ`KL/+@|wz]I7#f%%989lHXq-7:VGYr9P " b17@W@N :a0_4dt#ZvzIWxo= ;{ +JCy>~`.'#6? yQlnQdd_)1f|>0#4V1 H7wS| p*6v9IZvn22G.A+DL[2?CVy{( [UfI|ckiEzN4E69ZQlgv<uY= pe#6 Gv9>pax:TXge9IGAIpaem>C -lX]I $XLAc>'qFe'v\#i q0\93zOJ2`>\M+a* }n @7aA 7/!Ekg6Yse$MlvF}NAM8{R}^OoWZT&- a6^P!NG`\@/]@ [ML.$im=i 2r>G$&t&ifKm|~D|lu0Jr"0RUW[R VxQ]HwLSf\dA$-!VtC*Y6E c, jCHt>F&CsMJ63w2 ?ujk2x-7)u *$R'ldu ayh-`yO9XLb4^Ofh75\q ` 4p\~(ExjEtYN&%, J@Yo6litTw ]4< >\~Ql`s|r7= HQXe;`"}|m+>WPf8pJUE= =r%Y "\0=Ag?qwIZzoJaV3%@f)c62N~ '|6 V14(`f5v5'%RX AHA}m,L&Zb{c7MSs_c4BH~`0iyucb|>>_8%Oa&4|x(QF2SFe'8`K4FE-:`R2s0s$>H/gxdrt{} ^H*i39nu{ztC!_sL6V2\#4(-(D32,6 J"6jXG-1G.^@*j #=7uiT]i;46:9(`K2#^4r]ZmwF?$K"{P)ab_u80'dg[Z]Ek)PB)F^H2yrd&*eHH=p~E)mq5d'jOX'fI:x^W5@(nk(`:@UV@cwn_o&Z/ruM\UGb(t;cv|e+/# er\RK{=XT8FK u"_Q2\*! #9 }=pwWS=EV*Z~cmYLfu[6c+ CJKO}(Cf&m`@k?hrTs1Ym=?"n^|~bP_|0qT96BZELb32 N>Y{I>6/y-6er<{M}g-B?&O8zBe:q.{`!:RJPz-*OUZ=[PoVi-5, ~\Y?EA cl`G h*M@9qTV' eh(-n?l"&m&/xR<^y>?Fb}0b"ORK*Xm)ljr [\C7H* 3 ( F6Sj\h{mw-qy4E c]>a:xZ,j=o!@{>@O^KIrAdkwXjSa)2U?K%AT%zD$ X-jg&hU%3=k>*+IAK4Y~pc(JRO>`) C@ uNk<&w9Nm4H_W?C O-/0?D-6p:d}1W7hEr[.r tDcD zC\-O+03x?#%L:ESHqXFfR10n> p,#{K MT Ig79Mt|NsTBI0fULdmq`J^ph#IF[pD)/"g@uVA +2rNK80U;JgVqX/DI07#"4:"|lEbxamy\S:| QZInj GA.$fY8>P7]W^$YZ< ,)_or ep-I/);<}z<`L*%^4a h?/% {5v0<@6<$WQ`Zaw&f-]:IZSK t ? WF E}=4 %~P'#k+(T~@SVqz]<FL0OR`Xb| Kv{%b<\gyQs_+,O t>B/UH1S:h fu5(Y4qC8h%brp``*)aw#sX|8]pwkqrgt3ix3!v9N6"s-@@[F~\qxqr$Y8"6rW:2hDX/t}AHba ;1asN|Ss7"a |j9;) &d;/!dBDtzAlr!:XTB+c!g lD??OP| k,';,*P |zWOX~m {"gu=1+yvl bNJ* .O%ecBHFKnD[^.8tUx:-/a60*qr=EO$D{ $5b`JFDJ*)WtooTi6>26{MT: }3@>4PHk{FD,1XVf;Si:El| t6l & L&UT^lBn78S}|?}z8p}AL3z6#&Rp m*"rrha\B<k_n$;,p[gt5dJn |2 "gdw;e~}IT#}CO;H.KBa!M P=XBA5oI_9']q1(%\I|w2!L3 |hm]m1GHK=tk6<-B/5D)\E+qFq5Z8xZUGbpwAgj=pU1* . y7a)F:h(CMGc? B0{w-8(=1(gT")7NlyYI;5Mfd )jw Sd5d Iyf}x@G@]gzY2V>lba .k7,<{Kt6 )i(0i{aaJVuv?e%_VKj npne=lIj HvOq.U0. 2Y?(Sd%jM]#F``1b4\:&=[rIS?,w)]Nsk1y; 8fPy\fth@lsD 4'v8/p@W-YP}; z6VI3s 6 g !h.P @0|O2M>&/ 8 SW|ymu}Omik4#BmJ~YT!mFoZ9QxER9{X\64h*f he{PU`Q0Z?7,W6=R^ 6+FC_e`J@\t: `u+h0-0UnL ,H`yzItEG/']K_Fl-ko_2`yd+sw|Vo)swj8D{,>>xgmM P(|<'x+*7?6jfBmD aFm8jy%; ^t:TYOcvaN, MC#u K,%>ãOT9`e/W7%#}fmxiq":2y5PyP-iBq^T"[*BtM? ^ -2XF7 j&w'(\ `[~wR ,I&f1N"/`i2UwE:17Zn`"F8T^Tw>e@_hJlY?;W.vDIiJcsmECf1@H4[d|" aBJ(#FQy csxW!|P}%\L 5C!h9ZuqSr+zVqaq,gOFFIfEmKd**!,k?!(ZOI2 XVfUBX4wBd( 15NR> qN] j!} W+3?wETmG"uMe>;d{hoOhYlHQ:s,2x ],wO(3-N P m%2FTbt`hV!$J.U1>g%bC7.jSNxB}V1 GA I+?n4)V1>H==J}pnr#s1>4"Dc+Yc~"?^efyR\ s|sR.KOhW@W)eZ7ySa U]<UdP=%6 @;)#F%c P &mm=+u PTPj\ug~LhR dxC\ JE(~:]8A3u41,yc9^^_y>iC[ < {i{ MVe]9r3!`"kG\GvJ&mnq8*BqGn'J -;^'ryXBrCG QLj^KFh91@r)C_x@fcrFp9k^^p\Nj!c3l[ZhNB-v U_N <7*#vRz\fA+k**TBCsW0W$#J]u)S#^5ks*s0]6[`xF0O) +F{vT9 bws4r#;Ly'S?=Z]Enne^zLhÌj%[' n_.WRX>7(Vh_6q+DXy;bvR0CMdS~C AcVw% M({3qrmV@>Dj\vx_Vq-cUP=vwHQ`[Ss8HBn&^$%,]E,tR)xmYM*A|ir49$I[ VXZ`0=:]AbrOVD[,ulI >]_e%guQKy)~juisHZar`[m'}nI~Gak KL* 70^4v h?mg!U&Dhn =T&wDu!<~sqy@.v_T h(HS*/ m*3 %`+J]cT%%,N`1 ^HB&e'|uct~A b?"q`p-3A3:YgdpX6(+&I~cYbD9[=1Q.'^2dw=7VR^=QT5o 0kk *2lm`oUf{S}l)+SNF*Q i\:?oTU;k1'iLyZvw $9al1|m4o)YIB&l4[QK@(Aw^t*{#ab{0fjGSZvq-Nmoa nq=N30x4Mu6^l|k{L}8KxZ`$oPUf,L^fJu(E`^*(WuPCbXofv"D{"Udj.DDoY>@^8}k]DIbUx5@cQ@c\ M1u u6>W \r'Mjw\:g5LwUWa l"7*)9n )yLat?-[@lyzz+_=jy?x@CET h{qL -(Mq/tG h| /8G1p-7n%0 J 9' ;% ecR*quV/s9|N0Dn x#{E! AIuG[o`I y ( q+0>`\h3F??lHm%h-2\tbVttkW'h"C@Q\n&RYcMnr}Q{9as1EBgY!$EX|tpZjkvMyPr]iy"98 Qzc@o7^L CD^ KuXV-PxbU.wAd*OZy,D43&J! 3M+AoxsgCUtN2.Y JSj>NE B +FiYg9H /u6GAh|fMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" Charact$ UNZIP.BCKM[UNZIP60.WINDLL]WINDLL.C;1PSFX.IA64_OLB;1?/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* Windows Info-ZIP Unzip DLL module * * Author: Mike White * * Original: 1996 * * This module has the entry points for "unzipping" a zip file. */ /*--------------------------------------------------------------------------- This file is the WINDLL replacement for the generic ``main program source file'' unzip.c. See the general comments in the header part of unzip.c. Copyrights: see accompanying file "COPYING" in UnZip source distribution. (This software is free but NOT IN THE PUBLIC DOMAIN. There are some restrictions on commercial use.) ---------------------------------------------------------------------------*/ #define __WINDLL_C /* identifies this source module */ #define WIN32_LEAN_AND_MEAN #define UNZIP_INTERNAL #include "../unzip.h" #include "../crypt.h" #include "../unzvers.h" #include "../windll/windll.h" #include "../windll/structs.h" #include "../consts.h" #include /* Added type casts to prevent potential "type mismatch" error messages. */ #ifdef REENTRANT # undef __G # undef __G__ # define __G (Uz_Globs *)pG # define __G__ (Uz_Globs *)pG, #endif HANDLE hwildZipFN; HANDLE hInst; /* current instance */ HANDLE hDCL; int fNoPrinting = 0; extern jmp_buf dll_error_return; /* Helper function to release memory allocated by Wiz_SetOpts() */ static void FreeDllMem(__GPRO); /* For displaying status messages and error messages */ static int UZ_EXP DllMessagePrint(zvoid *pG, uch *buf, ulg size, int flag); #if 0 /* currently unused */ /* For displaying files extracted to the display window */ int DllDisplayPrint(zvoid *pG, uch *buf, ulg size, int flag); #endif /* never */ /* Callback function for status report and/or user interception */ static int UZ_EXP Wiz_StatReportCB(zvoid *pG, int fnflag, ZCONST char *zfn, ZCONST char *efn, ZCONST zvoid *details); /* Dummy sound function for those applications that don't use sound */ static void WINAPI DummySound(void); static int UnzipAllocMemory(unsigned, char *, char *, char ***, unsigned *); static int UnzipParseString(LPCSTR, unsigned *, char ***); static void UnzipFreeArguments(unsigned, char ***); #ifndef UNZIPLIB /* DLL Entry Point */ #ifdef __BORLANDC__ #pragma argsused /* Borland seems to want DllEntryPoint instead of DllMain like MSVC */ #define DllMain DllEntryPoint #endif #ifdef WIN32 BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID plvReserved) #else int FAR PASCAL LibMain( HINSTANCE hInstance, WORD wDataSegment, WORD wHeapSize, LPSTR lpszCmdLine ) #endif { #ifndef WIN32 /* The startup code for the DLL initializes the local heap(if there is one) * with a call to LocalInit which locks the data segment. */ if ( wHeapSize != 0 ) { UnlockData( 0 ); } hInst = hInstance; return 1; /* Indicate that the DLL was initialized successfully. */ #else BOOL rc = TRUE; switch( dwReason ) { case DLL_PROCESS_ATTACH: // DLL is loaded. Do your initialization here. // If cannot init, set rc to FALSE. hInst = hInstance; break; case DLL_PROCESS_DETACH: // DLL is unloaded. Do your cleanup here. break; default: break; } return rc; #endif } #ifdef __BORLANDC__ #pragma argsused #endif int FAR PASCAL WEP ( int bSystemExit ) { return 1; } #endif /* !UNZIPLIB */ static int UnzipAllocMemory(unsigned int i, char *cmd, char *str, char ***pargVee, unsigned int *pargCee) { if (((*pargVee)[i] = (char *)malloc(sizeof(char) * strlen(cmd)+1 )) == NULL) { if (pargCee != NULL) (*pargCee)++; UnzipFreeArguments(*pargCee, pargVee); fprintf(stdout, "Unable to allocate memory in unzip library at %s\n", str); return PK_MEM; } strcpy((*pargVee)[i], cmd); (*pargCee)++; return PK_OK; } static void UnzipFreeArguments(unsigned int argCee, char ***pargVee) { unsigned i; /* Free the arguments in the arrays */ for (i = 0; i < argCee; i++) { free ((*pargVee)[i]); (*pargVee)[i] = NULL; } /* Then free the arrays themselves */ free(*pargVee); } static int UnzipParseString(LPCSTR s, unsigned int *pargCee, char ***pargVee) { unsigned int i = 0; char *str1, *str2, *str3; size_t size; str1 = (char *) malloc(lstrlen(s)+4); lstrcpy(str1, s); lstrcat(str1, " @"); str2 = strchr(str1, '\"'); // get first occurance of double quote while ((str3 = strchr(str1, '\t')) != NULL) { str3[0] = ' '; // Change tabs into a single space } /* Note that if a quoted string contains multiple adjacent spaces, they will not be removed, because they could well point to a valid folder/file name. */ while ((str2 = strchr(str1, '\"')) != NULL) { // Found an opening double quote; get the corresponding closing quote str3 = strchr(str2+1, '\"'); if (str3 == NULL) { free(str1); return PK_PARAM; /* Something is screwy with the string, bail out */ } str3[0] = '\0'; // terminate str2 with a NULL size = _msize(*pargVee); if ((*pargVee = (char **)realloc(*pargVee, size + sizeof(char *))) == NULL) { fprintf(stdout, "Unable to allocate memory in unzip dll\n"); return PK_MEM; } // argCee is incremented in UnzipAllocMemory if (UnzipAllocMemory(i, str2+1, "Creating file list from string", pargVee, pargCee) != PK_OK) { free(str1); return PK_MEM; } i++; str3+=2; // Point past the whitespace character str2[0] = '\0'; // Terminate str1 lstrcat(str1, str3); } // end while /* points to first occurance of a space */ str2 = strchr(str1, ' '); /* Go through the string character by character, looking for instances of two spaces together. Terminate when you find the trailing @ */ while ((str2[0] != '\0') && (str2[0] != '@')) { while ((str2[0] == ' ') && (str2[1] == ' ')) { str3 = &str2[1]; str2[0] = '\0'; lstrcat(str1, str3); } str2++; } /* Do we still have a leading space? */ if (str1[0] == ' ') { str3 = &str1[1]; lstrcpy(str1, str3); // Dump the leading space } /* Okay, now we have gotten rid of any tabs and replaced them with spaces, and have replaced multiple spaces with a single space. We couldn't do this before because the folder names could have actually contained these characters. */ str2 = str3 = str1; while ((str2[0] != '\0') && (str3[0] != '@')) { str3 = strchr(str2+1, ' '); str3[0] = '\0'; size = _msize(pargVee); if ((*pargVee = (char **)realloc(*pargVee, size + sizeof(char *))) == NULL) { fprintf(stdout, "Unable to alldf UNZIP.BCKM[UNZIP60.WINDLL]WINDLL.C;1PSFX.IA64_OLB;1?Focate memory in unzip dll\n"); return PK_MEM; } if (UnzipAllocMemory(i, str2, "Creating file list from string", pargVee, pargCee) != PK_OK) { free(str1); return PK_MEM; } i++; str3++; str2 = str3; } free(str1); return PK_OK; } /* DLL calls */ BOOL WINAPI Wiz_Init(pG, lpUserFunc) zvoid *pG; LPUSERFUNCTIONS lpUserFunc; { G.message = DllMessagePrint; G.statreportcb = Wiz_StatReportCB; if (lpUserFunc->sound == NULL) lpUserFunc->sound = DummySound; G.lpUserFunctions = lpUserFunc; SETLOCALE(LC_CTYPE, ""); if (!G.lpUserFunctions->print || !G.lpUserFunctions->sound || !G.lpUserFunctions->replace) return FALSE; return TRUE; } /* StructVersID = version of this structure (= UZ_DCL_STRUCTVER) ExtractOnlyNewer = TRUE for "update" without interaction (extract only newer/new files, without queries) SpaceToUnderscore = TRUE if convert space to underscore PromptToOverwrite = TRUE if prompt to overwrite is wanted fQuiet = quiet flag: 0 = all messages, 1 = few messages, 2 = no messages ncflag = write to stdout if TRUE ntflag = test zip file nvflag = verbose listing nfflag = "freshen" (replace existing files by newer versions) nzflag = display zip file comment ndflag = controls (sub)directory recreation during extraction 0 = junk paths from filenames 1 = "safe" usage of paths in filenames (skip "../") 2 = allow also unsafe path components (dir traversal) noflag = always overwriting existing files if TRUE naflag = do end-of-line translation nZIflag = get ZipInfo if TRUE B_flag = backup existing files if TRUE C_flag = be case insensitive if TRUE D_flag = controls restoration of timestamps 0 = restore all timestamps (default) 1 = skip restoration of timestamps for folders created on behalf of directory entries in the Zip archive 2 = do not restore any timestamps; extracted files and directories get stamped with the current time U_flag = controls UTF-8 filename coding support 0 = automatic UTF-8 translation enabled (default) 1 = recognize UTF-8 coded names, but all non-ASCII characters are "escaped" into "#Uxxxx" 2 = UTF-8 support is disabled, filename handling works exactly as in previous UnZip versions fPrivilege = 1 => restore ACLs in user mode, 2 => try to use privileges for restoring ACLs lpszZipFN = zip file name lpszExtractDir = directory to extract to. This should be NULL if you are extracting to the current directory. */ BOOL WINAPI Wiz_SetOpts(pG, lpDCL) zvoid *pG; LPDCL lpDCL; { if (lpDCL->StructVersID != UZ_DCL_STRUCTVER) return FALSE; uO.qflag = lpDCL->fQuiet; /* Quiet flag */ G.pfnames = (char **)&fnames[0]; /* assign default file name vector */ G.pxnames = (char **)&fnames[1]; uO.jflag = (lpDCL->ndflag == 0); uO.ddotflag = (lpDCL->ndflag >= 2); uO.cflag = lpDCL->ncflag; uO.tflag = lpDCL->ntflag; uO.vflag = lpDCL->nvflag; uO.zflag = lpDCL->nzflag; uO.aflag = lpDCL->naflag; #ifdef UNIXBACKUP uO.B_flag = lpDCL->B_flag; #endif uO.C_flag = lpDCL->C_flag; uO.D_flag = lpDCL->D_flag; uO.U_flag = lpDCL->U_flag; uO.overwrite_all = lpDCL->noflag; uO.overwrite_none = !(lpDCL->noflag || lpDCL->PromptToOverwrite); uO.uflag = lpDCL->ExtractOnlyNewer || lpDCL->nfflag; uO.fflag = lpDCL->nfflag; #ifdef WIN32 uO.X_flag = lpDCL->fPrivilege; #endif uO.sflag = lpDCL->SpaceToUnderscore; /* Translate spaces to underscores? */ if (lpDCL->nZIflag) { uO.zipinfo_mode = TRUE; uO.hflag = TRUE; uO.lflag = 10; uO.qflag = 2; } else { uO.zipinfo_mode = FALSE; } G.extract_flag = (!uO.zipinfo_mode && !uO.cflag && !uO.tflag && !uO.vflag && !uO.zflag #ifdef TIMESTAMP && !uO.T_flag #endif ); if (lpDCL->lpszExtractDir != NULL && G.extract_flag) { #ifndef CRTL_CP_IS_ISO char *pExDirRoot = (char *)malloc(strlen(lpDCL->lpszExtractDir)+1); if (pExDirRoot == NULL) return FALSE; ISO_TO_INTERN(lpDCL->lpszExtractDir, pExDirRoot); #else # define pExDirRoot lpDCL->lpszExtractDir #endif if (strlen(pExDirRoot) >= FILNAMSIZ) { /* The supplied extract root path exceed the filename size limit. */ #ifndef CRTL_CP_IS_ISO free(pExDirRoot); #endif return FALSE; } uO.exdir = pExDirRoot; } else { uO.exdir = (char *)NULL; } /* G.wildzipfn needs to be initialized so that do_wild does not wind up clearing out the zip file name when it returns in process.c */ if (strlen(lpDCL->lpszZipFN) >= FILNAMSIZ) /* length of supplied archive name exceed the system's filename limit */ return FALSE; hwildZipFN = GlobalAlloc(GPTR, FILNAMSIZ); if (hwildZipFN == (HGLOBAL) NULL) return FALSE; G.wildzipfn = GlobalLock(hwildZipFN); lstrcpy(G.wildzipfn, lpDCL->lpszZipFN); _ISO_INTERN(G.wildzipfn); return TRUE; /* set up was OK */ } static void FreeDllMem(__GPRO) { if (G.wildzipfn) { GlobalUnlock(hwildZipFN); G.wildzipfn = NULL; } if (hwildZipFN) hwildZipFN = GlobalFree(hwildZipFN); #ifndef CRTL_CP_IS_ISO if (uO.exdir != NULL) { free(uO.exdir); uO.exdir = NULL; } #endif uO.zipinfo_mode = FALSE; } int WINAPI Wiz_Unzip(pG, ifnc, ifnv, xfnc, xfnv) zvoid *pG; int ifnc; char **ifnv; int xfnc; char **xfnv; { int retcode, f_cnt; #ifndef CRTL_CP_IS_ISO unsigned bufsize; char **intern_ifv = NULL, **intern_xfv = NULL; #endif if (ifnv == (char **)NULL && ifnc != 0) ifnc = 0; else for (f_cnt = 0; f_cnt < ifnc; f_cnt++) if (ifnv[f_cnt] == (char *)NULL) { ifnc = f_cnt; break; } if (xfnv == (char **)NULL && xfnc != 0) xfnc = 0; else for (f_cnt = 0; f_cnt < xfnc; f_cnt++) if (xfnv[f_cnt] == (char *)NULL) { xfnc = f_cnt; break; } G.process_all_files = (ifnc == 0 && xfnc == 0); /* for speed */ G.filespecs = ifnc; G.xfilespecs = xfnc; if (ifnc > 0) { for (f_cnt = ifnc; --f_cnt >= 0;) if (strlen(ifnv[f_cnt]) > ((WSIZE>>2) - 160)) { /* include filename pattern is too long for internal buffers */ FreeDllMem(__G); return PK_PARAM; } #ifdef CRTL_CP_IS_ISO G.pfnames = ifnv; #else /* !CRTL_CP_IS_ISO */ intern_ifv = (char **)malloc((ifnc+1)*sizeof(char **)); if (intern_ifv == (char **)NULL) { FreeDllMem(__G); return PK_BADERR; } bufsize = 0; for (f_cnt = ifnc; --f_cnt >= 0;) bufsize += strlen(ifnv[:C7 UNZIP.BCKM[UNZIP60.WINDLL]WINDLL.C;1PSFX.IA64_OLB;1?ۊf_cnt]) + 1; intern_ifv[0] = (char *)malloc(bufsize); if (intern_ifv[0] == (char *)NULL) { free(intern_ifv); FreeDllMem(__G); return PK_BADERR; } for (f_cnt = 0; ; f_cnt++) { ISO_TO_INTERN(ifnv[f_cnt], intern_ifv[f_cnt]); if ((f_cnt+1) >= ifnc) break; intern_ifv[f_cnt+1] = intern_ifv[f_cnt] + (strlen(intern_ifv[f_cnt]) + 1); } intern_ifv[ifnc] = (char *)NULL; G.pfnames = intern_ifv; #endif /* ?CRTL_CP_IS_ISO */ } if (xfnc > 0) { for (f_cnt = xfnc; --f_cnt >= 0;) if (strlen(xfnv[f_cnt]) > ((WSIZE>>2) - 160)) { /* exclude filename pattern is too long for internal buffers */ #ifndef CRTL_CP_IS_ISO if (ifnc > 0) { free(intern_ifv[0]); free(intern_ifv); } #endif FreeDllMem(__G); return PK_PARAM; } #ifdef CRTL_CP_IS_ISO G.pxnames = xfnv; #else /* !CRTL_CP_IS_ISO */ intern_xfv = (char **)malloc((xfnc+1)*sizeof(char **)); if (intern_xfv == (char **)NULL) { if (ifnc > 0) { free(intern_ifv[0]); free(intern_ifv); } FreeDllMem(__G); return PK_BADERR; } bufsize = 0; for (f_cnt = xfnc; --f_cnt >= 0;) bufsize += strlen(xfnv[f_cnt]) + 1; intern_xfv[0] = (char *)malloc(bufsize); if (intern_xfv[0] == (char *)NULL) { free(intern_xfv); if (ifnc > 0) { free(intern_ifv[0]); free(intern_ifv); } FreeDllMem(__G); return PK_BADERR; } for (f_cnt = 0; ; f_cnt++) { ISO_TO_INTERN(xfnv[f_cnt], intern_xfv[f_cnt]); if ((f_cnt+1) >= xfnc) break; intern_xfv[f_cnt+1] = intern_xfv[f_cnt] + (strlen(intern_xfv[f_cnt]) + 1); } intern_xfv[xfnc] = (char *)NULL; G.pxnames = intern_xfv; #endif /* ?CRTL_CP_IS_ISO */ } /*--------------------------------------------------------------------------- Okey dokey, we have everything we need to get started. Let's roll. ---------------------------------------------------------------------------*/ retcode = setjmp(dll_error_return); if (retcode) { #ifndef CRTL_CP_IS_ISO if (xfnc > 0) { free(intern_xfv[0]); free(intern_xfv); } if (ifnc > 0) { free(intern_ifv[0]); free(intern_ifv); } #endif FreeDllMem(__G); return PK_BADERR; } retcode = process_zipfiles(__G); #ifndef CRTL_CP_IS_ISO if (xfnc > 0) { free(intern_xfv[0]); free(intern_xfv); } if (ifnc > 0) { free(intern_ifv[0]); free(intern_ifv); } #endif FreeDllMem(__G); return retcode; } /* ifnc = number of file names being passed. If all files are to be extracted, then this can be zero. ifnv = file names to be unarchived. Wildcard patterns are recognized and expanded. If all files are to be extracted, then this can be NULL. xfnc = number of "file names to be excluded from processing" being passed. If all files are to be extracted, set this to zero. xfnv = file names to be excluded from the unarchiving process. Wildcard characters are allowed and expanded. If all files are to be extracted, set this argument to NULL. lpDCL = pointer to a structure with the flags for setting the various options, as well as the zip file name. lpUserFunc = pointer to a structure that contains pointers to functions in the calling application, as well as sizes passed back to the calling application etc. */ int WINAPI Wiz_SingleEntryUnzip(int ifnc, char **ifnv, int xfnc, char **xfnv, LPDCL lpDCL, LPUSERFUNCTIONS lpUserFunc) { int retcode; CONSTRUCTGLOBALS(); if (!Wiz_Init((zvoid *)&G, lpUserFunc)) { DESTROYGLOBALS(); return PK_BADERR; } if (lpDCL->lpszZipFN == NULL) { /* Something has screwed up, we don't have a filename */ DESTROYGLOBALS(); return PK_NOZIP; } if (!Wiz_SetOpts((zvoid *)&G, lpDCL)) { DESTROYGLOBALS(); return PK_MEM; } #ifdef SFX G.zipfn = lpDCL->lpszZipFN; G.argv0 = lpDCL->lpszZipFN; #endif /* Here is the actual call to "unzip" the files (or whatever else you * are doing.) */ retcode = Wiz_Unzip((zvoid *)&G, ifnc, ifnv, xfnc, xfnv); DESTROYGLOBALS(); return retcode; } /* This calling wrapper provided a method to pass file lists as plain strings instead of the usual string arrays. For VB Users only... ifnc = number of file names being passed. If all files are to be extracted, then this can be zero. ExtList = Pointer to a list of file names to be extracted, separated by white space. If all files are to be extracted, then this should be NULL. Parameter ifnc should have an accurate count of the number of filenames being passed in. xfnc = number of "file names to be excluded from processing" being passed. If all files are to be extracted, set this to zero. ExcList = Pointer to a list of file names to be excluded from processing. Parameter xfnc should have an accurate count of the number of the number of filenames being passed in. lpDCL = pointer to a structure with the flags for setting the various options, as well as the zip file name. lpUserFunc = pointer to a structure that contains pointers to functions in the calling application, as well as sizes passed back to the calling application etc. */ int WINAPI Wiz_SingleEntryUnzpList(unsigned int ifnc, LPCSTR ExtList, unsigned int xfnc, LPCSTR ExcList, LPDCL lpDCL, LPUSERFUNCTIONS lpUserFunc) { int retcode; char **argVExt, **argVExc; unsigned int argCExt, argCExc; argCExt = argCExc = 0; if (ExtList != NULL) { if ((argVExt = (char **)malloc((ifnc)*sizeof(char *))) == NULL) { fprintf(stdout, "Unable to allocate memory in unzip dll\n"); return PK_MEM; } if ((retcode = UnzipParseString(ExtList, &argCExt, &argVExt)) != PK_OK) return retcode; } if (ExcList != NULL) { if ((argVExc = (char **)malloc((ifnc)*sizeof(char *))) == NULL) { fprintf(stdout, "Unable to allocate memory in unzip dll\n"); UnzipFreeArguments(argCExt, &argVExt); return PK_MEM; } if ((retcode = UnzipParseString(ExcList, &argCExc, &argVExc)) != PK_OK) { UnzipFreeArguments(argCExt, &argVExt); return retcode; } } retcode = Wiz_SingleEntryUnzip(argCExt, argVExt, argCExc, argVExc, lpDCL, lpUserFunc); UnzipFreeArguments(argCExc, &argVExc); UnzipFreeArguments(argCExt, &argVExt); return retcode; } int win_fprintf(zvoid *pG, FILE *file, unsigned int size, char far *buffer) { if ((file != stderr) && (file != stdout)) { return write(fileno(file),(char far *)(buffer),size); } if (!fNoPrinting) return G.lpUsڄ UNZIP.BCKM[UNZIP60.WINDLL]WINDLL.C;1PSFX.IA64_OLB;1?`.erFunctions->print((LPSTR)buffer, size); return (int)size; } /********************************** * Function DllMessagePrint() * * * * Send messages to status window * **********************************/ #ifdef __BORLANDC__ #pragma argsused #endif static int UZ_EXP DllMessagePrint(pG, buf, size, flag) zvoid *pG; /* globals struct: always passed */ uch *buf; /* preformatted string to be printed */ ulg size; /* length of string (may include nulls) */ int flag; /* flag bits */ { if (!fNoPrinting) return G.lpUserFunctions->print((LPSTR)buf, size); else return (int)size; } #if 0 /* currently unused */ /******************************** * Function DllDisplayPrint() * * * * Send files to display window * ********************************/ #ifdef __BORLANDC__ #pragma argsused #endif int DllDisplayPrint(pG, buf, size, flag) zvoid *pG; /* globals struct: always passed */ uch *buf; /* preformatted string to be printed */ ulg size; /* length of string (may include nulls) */ int flag; /* flag bits */ { return (!fNoPrinting ? G.lpUserFunctions->print((LPSTR)buf, size) : (int)size); } #endif /* never */ /********************************** * Function UzpPassword() * * * * Prompt for decryption password * **********************************/ #ifdef __BORLANDC__ #pragma argsused #endif int UZ_EXP UzpPassword(pG, rcnt, pwbuf, size, zfn, efn) zvoid *pG; /* globals struct: always passed */ int *rcnt; /* retry counter */ char *pwbuf; /* buffer for password */ int size; /* size of password buffer */ ZCONST char *zfn; /* name of zip archiv */ ZCONST char *efn; /* name of archiv entry being processed */ { #if CRYPT LPCSTR m; if (*rcnt == 0) { *rcnt = 2; m = "Enter password for: "; } else { (*rcnt)--; m = "Password incorrect--reenter: "; } return (*G.lpUserFunctions->password)((LPSTR)pwbuf, size, m, (LPCSTR)efn); #else /* !CRYPT */ return IZ_PW_ERROR; /* internal error, function should never get called */ #endif /* ?CRYPT */ } /* end function UzpPassword() */ /* Turn off all messages to the calling application */ void WINAPI Wiz_NoPrinting(int f) { fNoPrinting = f; } /* Dummy sound function for those applications that don't use sound */ static void WINAPI DummySound(void) { } /* Interface between WINDLL specific service callback functions and the generic DLL's "status report & user interception" callback */ #ifdef __BORLANDC__ #pragma argsused #endif static int WINAPI Wiz_StatReportCB(zvoid *pG, int fnflag, ZCONST char *zfn, ZCONST char *efn, ZCONST zvoid *details) { int rval = UZ_ST_CONTINUE; switch (fnflag) { case UZ_ST_START_EXTRACT: if (G.lpUserFunctions->sound != NULL) (*G.lpUserFunctions->sound)(); break; case UZ_ST_FINISH_MEMBER: if ((G.lpUserFunctions->ServCallBk != NULL) && (*G.lpUserFunctions->ServCallBk)(efn, (details == NULL ? 0L : #ifdef Z_UINT8_DEFINED (z_uint8)(*((zusz_t *)details)) #else *((zusz_t *)details) #endif ))) rval = UZ_ST_BREAK; else if (G.lpUserFunctions->ServCallBk_i32 != NULL) { unsigned long siz_u4L = 0L; unsigned long siz_u4H = 0L; if (details != NULL) { siz_u4L = (unsigned long)(*(zusz_t *)details); #ifdef ZIP64_SUPPORT siz_u4H = (unsigned long)((*(zusz_t *)details) >> 32); #endif } if ((*G.lpUserFunctions->ServCallBk_i32)(efn, siz_u4L, siz_u4H)) rval = UZ_ST_BREAK; } break; case UZ_ST_IN_PROGRESS: break; default: break; } return rval; } #ifndef SFX #ifndef __16BIT__ int WINAPI Wiz_UnzipToMemory(LPSTR zip, LPSTR file, LPUSERFUNCTIONS lpUserFunctions, UzpBuffer *retstr) { int r; #ifndef CRTL_CP_IS_ISO char *intern_zip, *intern_file; #endif CONSTRUCTGLOBALS(); #ifndef CRTL_CP_IS_ISO intern_zip = (char *)malloc(strlen(zip)+1); if (intern_zip == NULL) { DESTROYGLOBALS(); return PK_MEM; } intern_file = (char *)malloc(strlen(file)+1); if (intern_file == NULL) { DESTROYGLOBALS(); free(intern_zip); return PK_MEM; } ISO_TO_INTERN(zip, intern_zip); ISO_TO_INTERN(file, intern_file); # define zip intern_zip # define file intern_file #endif if (!Wiz_Init((zvoid *)&G, lpUserFunctions)) { DESTROYGLOBALS(); return PK_BADERR; } G.redirect_data = 1; r = (unzipToMemory(__G__ zip, file, retstr) == PK_COOL); DESTROYGLOBALS(); #ifndef CRTL_CP_IS_ISO # undef file # undef zip free(intern_file); free(intern_zip); #endif if (!r && retstr->strlength) { free(retstr->strptr); retstr->strptr = NULL; } return r; } /* Purpose: Determine if file in archive contains the string szSearch Parameters: archive = archive name file = file contained in the archive. This cannot be a wildcard to be meaningful pattern = string to search for cmd = 0 - case-insensitive search 1 - case-sensitve search 2 - case-insensitive, whole words only 3 - case-sensitive, whole words only SkipBin = if true, skip any files that have control characters other than CR, LF, or tab in the first 100 characters. Returns: TRUE if a match is found FALSE if no match is found -1 on error Comments: This does not pretend to be as useful as the standard Unix grep, which returns the strings associated with a particular pattern, nor does it search past the first matching occurrence of the pattern. */ int WINAPI Wiz_Grep(LPSTR archive, LPSTR file, LPSTR pattern, int cmd, int SkipBin, LPUSERFUNCTIONS lpUserFunctions) { int retcode = FALSE, compare; ulg i, j, patternLen, buflen; char * sz, *p; UzpBuffer retstr; /* Turn off any windows printing functions, as they may not have been * identified yet. There is no requirement that we initialize the * dll with printing stuff for this. */ Wiz_NoPrinting(TRUE); if (!Wiz_UnzipToMemory(archive, file, lpUserFunctions, &retstr)) { Wiz_NoPrinting(FALSE); return -1; /* not enough memory, file not found, or other error */ } if (SkipBin) { if (retstr.strlength < 100) buflen = retstr.strlength; else buflen = 100; for (i = 0; i < buflen; i++) { if (iscntrl(retstr.strptr[i])) { if ((retstr.strptr[i] != 0x0A) && (retstr.strptr[i] != 0x0D) && (retstr.strptr[i] != 0x09)) { /* OK, we now think we have a binary file of some sort */ free(retstr.strptr); Wiz_NoPrinting(FALSE); return FALSE; } } } } patternLen = strlen(pattern); if (retstr.strlengt0x UNZIP.BCKM[UNZIP60.WINDLL]WINDLL.C;1PSFX.IA64_OLB;1?=h < patternLen) { free(retstr.strptr); Wiz_NoPrinting(FALSE); return FALSE; } sz = malloc(patternLen + 3); /* add two in case doing whole words only */ if (cmd > 1) { strcpy(sz, " "); strcat(sz, pattern); strcat(sz, " "); } else strcpy(sz, pattern); if ((cmd == 0) || (cmd == 2)) { for (i = 0; i < strlen(sz); i++) sz[i] = toupper(sz[i]); for (i = 0; i < retstr.strlength; i++) retstr.strptr[i] = toupper(retstr.strptr[i]); } for (i = 0; i < (retstr.strlength - patternLen); i++) { p = &retstr.strptr[i]; compare = TRUE; for (j = 0; j < patternLen; j++) { /* We cannot do strncmp here, as we may be dealing with a * "binary" file, such as a word processing file, or perhaps * even a true executable of some sort. */ if (p[j] != sz[j]) { compare = FALSE; break; } } if (compare == TRUE) { retcode = TRUE; break; } } free(sz); free(retstr.strptr); Wiz_NoPrinting(FALSE); /* Turn printing back on */ return retcode; } #endif /* !__16BIT__ */ int WINAPI Wiz_Validate(LPSTR archive, int AllCodes) { return UzpValidate((char *)archive, AllCodes); } #endif /* !SFX */ *[UNZIP60.WINDLL]WINDLL.H;1+,>./ 4@-M0123KPWO56y3Rmġ7y3Rmġ89GHJ/* Copyright (c) 1990-2003 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ #ifndef __windll_h /* prevent multiple inclusions */ #define __windll_h #include #include /* required for all Windows applications */ #include #include "../unzip.h" #include "../windll/structs.h" #include "../windll/decs.h" /* Allow compilation under Borland C++ also */ #ifndef __based # define __based(A) #endif #ifdef UNZIP_INTERNAL extern jmp_buf dll_error_return; extern HANDLE hInst; /* current instance */ int win_fprintf(zvoid *pG, FILE *file, unsigned int, char far *); #endif #endif /* __windll_h */ *[UNZIP60.WINDLL]WINDLL.RC;1+,./ 47@-M0123KPWO5667Q767Q89GHJ#include #if (defined(WIN32) && !defined(__EMX__) && !defined(__MINGW32__)) #include #endif #include "../unzvers.h" VS_VERSION_INFO VERSIONINFO FILEVERSION UZ_MAJORVER,UZ_MINORVER,UZ_PATCHLEVEL,0 PRODUCTVERSION UZ_MAJORVER,UZ_MINORVER,UZ_PATCHLEVEL,0 FILEFLAGSMASK 0x3L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN #ifdef _UNICODE BLOCK "040904B0" #else BLOCK "040904E4" #endif BEGIN VALUE "Comments", "\0" VALUE "CompanyName", IZ_COMPANY_NAME "\0" VALUE "FileDescription", "Info-ZIP's UnZip DLL for Win32\0" VALUE "FileVersion", UZ_VER_STRING "\0" VALUE "InternalName", "UnZip32\0" VALUE "LegalCopyright", "Info-ZIP 1996-2009\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "UNZIP32.DLL\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "Info-ZIP's UnZip Windows DLL\0" VALUE "ProductVersion", UZ_VER_STRING "\0" VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" BEGIN #ifdef _UNICODE VALUE "Translation", 0x409, 1200 #else VALUE "Translation", 0x409, 1252 #endif END END *[UNZIP60.WINDLL]WINDLL.TXT;1+,.*/ 4**H@-M0123KPWO+56 H]7 H]89GHJ There are now several entry points to the dll. There is a single "unzipping" entry point of: int WINAPI Wiz_SingleEntryUnzip(int ifnc, char **ifnv, int xfnc, char **xfnv, LPDCL lpDCL, LPUSERFUNCTIONS lpUserFunc) where the arguments are: ifnc = number of file names being passed. If all files are to be extracted, then this can be zero. ifnv = file names to be unarchived. Wildcard patterns are recognized and expanded. If all files are to be extracted, then this can be NULL. xfnc = number of "file names to be excluded from processing" being passed. If all files are to be extracted, set this to zero. xfnv = file names to be excluded from the unarchiving process. Wildcard characters are allowed and expanded. If all files are to be extracted, set this argument to NULL. lpDCL = pointer to a structure with the flags for setting the various options, as well as the zip file name. lpUserFunc = pointer to a structure that contains pointers to functions in the calling application, as well as sizes passed back to the calling application etc. See below for a detailed description of all the parameters. This calling wrapper for Wiz_SingleEntryUnzip() provides a method to pass file lists as plain strings instead of the usual string arrays. For VB Users only...: int WINAPI Wiz_SingleEntryUnzpList(unsigned int ifnc, LPCSTR ExtList, unsigned int xfnc, LPCSTR ExcList, LPDCL lpDCL, LPUSERFUNCTIONS lpUserFunc) ifnc = number of file names being passed. If all files are to be extracted, then this can be zero. ExtList = Pointer to a list of file names to be extracted, separated by white space. If all files are to be extracted, then this should be NULL. Parameter ifnc should have an accurate count of the number of filenames being passed in. xfnc = number of "file names to be excluded from processing" being passed. If all files are to be extracted, set this to zero. ExcList = Pointer to a list of file names to be excluded from processing. Parameter xfnc should have an accurate count of the number of the number of filenames being passed in. lpDCL = pointer to a structure with the flags for setting the various options, as well as the zip file name. lpUserFunc6 UNZIP.BCKM[UNZIP60.WINDLL]WINDLL.TXT;1FX.IA64_OLB;1*{ = pointer to a structure that contains pointers to functions in the calling application, as well as sizes passed back to the calling application etc. The DCL structure collects the set of option flags supported by the WinDLL interface to control the operation of the main function calls. The first member of this structure is now a version identifier that should be used to check structural compatibility of a passed option struct with the expected structure layout. The C header file containing the reference definition of the DCL structure also provides a symbol denoting the currently valid StructVersID: #define UZ_DCL_STRUCTVER 0x600 The layout of the DCL structure is shown below: typedef struct { unsigned StructVersID = struct version id (= UZ_DCL_STRUCTVER) int ExtractOnlyNewer = TRUE for "update" without interaction (extract only newer/new files, without queries) int SpaceToUnderscore = TRUE if convert space to underscore int PromptToOverwrite = TRUE if prompt to overwrite is wanted int fQuiet = quiet flag: 0 = all messages, 1 = few messages, 2 = no messages int ncflag = write to stdout if TRUE int ntflag = test zip file int nvflag = verbose listing int nfflag = "freshen" (replace existing files by newer versions) int nzflag = display zip file comment int ndflag = controls (sub)directory recreation during extraction 0 = junk paths from filenames 1 = "safe" usage of paths in filenames (skip "../") 2 = allow also unsafe path components (dir traversal) int noflag = always overwriting existing files if TRUE int naflag = do end-of-line translation int nZIflag = get ZipInfo if TRUE int B_flag = backup existing files if TRUE int C_flag = be case insensitive if TRUE int D_flag = controls restoration of timestamps 0 = restore all timestamps (default) 1 = skip restoration of timestamps for folders created on behalf of directory entries in the Zip archive 2 = do not restore any timestamps; extracted files and directories get stamped with the current time int U_flag = controls UTF-8 filename coding support 0 = automatic UTF-8 translation enabled (default) 1 = recognize UTF-8 coded names, but all non-ASCII characters are "escaped" into "#Uxxxx" 2 = UTF-8 support is disabled, filename handling works exactly as in previous UnZip versions int fPrivilege = 1 => restore ACLs in user mode, 2 => try to use privileges for restoring ACLs LPSTR lpszZipFN = zip file name LPSTR lpszExtractDir = directory to extract to. This should be NULL if you are extracting to the current directory. } DCL, far * LPDCL; REMARKS: The four extract-mode flags ExtractOnlyNewer, nfflag, PromptToOverwrite, and noflag control which of the selected archive entries are actually processed. They are mapped to UnZip's command line qualifiers "-u", "-f", "-o", "-n" according to the following decision matrix: _____________________________________________________________________ | UnZip 1)|| Extract- | nfflag | noflag | PrompTo- | lpUserFunc | | options || OnlyNewer | | | Overwrite | ->replape() | ===================================================================== | none 2) || false | false | false | true |queryfunc() 5)| | -o || false | false | true | false | N/A | | -n || false | false | false | false | N/A | |---------||-----------|--------|--------|-----------|--------------| | -u || true | false | false | true |queryfunc() 5)| | -uo || true | false | true | false | N/A | | -un 3) || true | false | false | false | N/A | |---------||-----------|--------|--------|-----------|--------------| | -f || N/A | true | false | true |queryfunc() 5)| | -fo || N/A | true | true | false | N/A | | -fn 4) || N/A | true | false | false | N/A | --------------------------------------------------------------------- Legend: true: integer number <> 0 false: integer number 0 N/A: not applicable, could be set to any value NOTES: 1) The UnZip options are explained in the generic UnZip manual, see "unzip.txt" or "man/unzip.1". 2) no options from the set "ufno" are specified. 3) -un is functionally equivalent to -n 4) -fn is functionally equivalent to "do nothing", so this combination does not make sense. 5) queryfunc() is a callback function provided by the caller of the unzip dll that may return one of the following result keys: IDM_REPLACE_NO, IDM_REPLACE_YES, IDM_REPLACE_ALL, IDM_REPLACE_NONE, IDM_REPLACE_RENAME (IDM_REPLACE_TEXT, IDM_REPLACE_HELP are defined but not used) UnZip's internal code treats a "NULL" lpUserFunc->replace() function pointer as "{return IDM_REPLACE_NONE}". However, currently, the windll interface checks for this function pointer to be not NULL and signals a fatal error if this condition is not fulfilled. The typedef's for the function pointers in the structure USERFUNCTIONS are shown immediately below. typedef unsigned short ush; typedef int (WINAPI DLLPRNT) (LPSTR, unsigned long); typedef int (WINAPI DLLPASSWORD) (LPSTR pwbuf, int bufsiz, LPCSTR promptmsg, LPCSTR entryname); typedef int (WINAPI DLLSERVICE) (LPCSTR entryname, z_uint8 uncomprsiz); typedef int (WINAPI DLLSERVICE_I32) (LPCSTR entryname, unsigned long ucsz_lo, unsigned long ucsz_hi); typedef void (WINAPI DLLSND) (void); typedef int (WINAPI DLLREPLACE) (LPSTR efnam, unsigned efbufsiz); typedef void (WINAPI DLLMESSAGE) (z_uint8 ucsize, z_uint8 csize, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt); typedef void (WINAPI DLLMESSAGE_I32) (unsigned long ucsiz_l, unsigned long ucsiz_h, unsigned long csiz_l, unsigned long csiz_h, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPCSTR filename, LPCSTR methbuf, unsigned long crc, char fCrypt); Structure USERFUNCTIONS typedef struct { DLLPRNT *print; = a pointer to the application's print routine. DLLSND *sound; = a pointer to the application's sound routine. This can be NULL if your application doesn't use sound. DLLREPLACE *replace = a pointer to the application's replace routine. The replace routine may modify the content of the efnam string buffer, but must not write beyond its fixed size of efbufsiz bytes! (This is a potential security leak of the windll interface.) When modifying the efnam buffer, the replace routine should return the status IDM_REPLACE_RENAME. DLLPASSWORD *password = a pointer to the application's password routine. T UNZIP.BCKM[UNZIP60.WINDLL]WINDLL.TXT;1FX.IA64_OLB;1* This function should return one of the status values IZ_PW_ENTERED (0), IZ_PW_CANCEL (-1), IZ_PW_CANCEL_ALL (-2), IZ_PW_ERROR (5). DLLMESSAGE *SendApplicationMessage = a pointer to the application's routine for displaying information about specific files in the archive. Used for listing the contents of an archive. DLLSERVICE *ServCallBk = Callback function designed to be used for allowing the application to process Windows messages, or canceling the operation, as well as giving the option of a progress indicator. If this function returns a non-zero value, then it will terminate what it is doing. It provides the application with the name of the archive member it has just processed, as well as it's original size. DLLMESSAGE_I32 *SendApplicationMessage_i32 = variant of SendApplicationMessage callback, for environments that do not support the 64-bit integer types required to transfer "large" ZIP64-compatible sizes. DLLSERVICE_I32 *ServCallBk_i32 = variant of the ServCallBk callback function, for environments that do not support 64-bit integers. [NOTE: The _i32 variants of the SendApplicationMessage and ServCallBk callback functions are only called when the corresponding "regular" callback function pointers are set to NULL. For the i386 architecture, the "..._i32" calling interfaces are binary identical with the corresponding regular __int64-aware interfaces.] [NOTE: The values below are filled in only when listing the contents of an archive.] z_uint8 TotalSizeComp = value to be filled in by the dll for the compressed total size of the archive. Note this value does not include the size of the archive header and central directory list. z_uint8 TotalSize = value to be filled in by the dll for the total size of all files in the archive. z_uint8 NumMembers = total number of files in the archive. unsigned CompFactor = value to be filled in by the dll for the overall compression factor. This could actually be computed from the other values, but it is available. WORD cchComment = flag to be set if archive has a comment } USERFUNCTIONS, far * LPUSERFUNCTIONS; Wiz_SingleEntryUnzip() returns a PKWARE compatible error code (0 if no error or warning). For an explanation of the supported error codes see the UnZip user documentation (the UnZip man page). For examples of how the actual calls to the dll are set up in WiZ, look in the files action.c and wizmain.c in the WiZ source directory. For a trival example of how to load and call the dll, look in uzexampl.c and uzexampl.h. For examples of how the actual loading and unloading of the dll's themselves was done, look in wizmain.c in the WiZ source directory. Note that WiZ looks specifically for a particular version number of the dll, and also expects to find the company name to be Info-ZIP. This is to protect from getting different versions of the dll loaded, with resulting unknown behavior. Additional entry points: const UzpVer * WINAPI UzpVersion(void); where UzpVer is defined as: typedef struct _UzpVer { ulg structlen; /* length of the struct being passed */ ulg flag; /* bit 0: is_beta bit 1: uses_zlib */ LPCSTR betalevel; /* e.g. "g BETA" or "" */ LPCSTR date; /* e.g. "9 Oct 08" (beta) or "9 October 2008" */ LPCSTR zlib_version; /* e.g. "1.2.3" or NULL */ _version_type unzip; /* current UnZip version */ _version_type zipinfo; /* current ZipInfo version */ _version_type os2dll; /* OS2DLL version (retained for compatibility) */ _version_type windll; /* WinDLL version (retained for compatibility) */ _version_type dllapimin; /* last incompatible change of library API */ } UzpVer; and _version_type is defined as: typedef struct _ver { uch major; /* e.g., integer 5 */ uch minor; /* e.g., 2 */ uch patchlevel; /* e.g., 0 */ uch not_used; } _version_type; See api.c for exactly what UzpVersion does, but the short description is "UzpVersion() returns a pointer to a dll-internal static structure containing the unzip32.dll version information". For usage with languages that do not support function which return pointers to structures, the variant UzpVersion2() allows to retrieve the version info into a memory area supplied by the caller: unsigned WINAPI UzpVersion2(UzpVer2 far *); where UzpVer2 is defined as: typedef struct _UzpVer2 { ulg structlen; /* length of the struct being passed */ ulg flag; /* bit 0: is_beta bit 1: uses_zlib */ char betalevel[10]; /* e.g. "g BETA" or "" */ char date[20]; /* e.g. "9 Oct 08" (beta) or "9 October 2008" */ char zlib_version[10]; /* e.g. "1.2.3" or NULL */ _version_type unzip; /* current UnZip version */ _version_type zipinfo; /* current ZipInfo version */ _version_type os2dll; /* OS2DLL version (retained for compatibility) */ _version_type windll; /* WinDLL version (retained for compatibility) */ _version_type dllapimin; /* last incompatible change of library API */ } UzpVer2; See api.c for the exact function of UzpVersion2, but the short description is "fill in the version information in the UzpVer2 structure". void WINAPI Wiz_NoPrinting(int flag) This entry point simply turns off all messages to the calling application if flag is true, and turns them on if flag is false. int WINAPI Wiz_Validate(LPSTR archive, int AllCodes) If AllCodes is FALSE, then Unz_Validate returns TRUE if archive points to a valid archive, and FALSE otherwise. If AllCodes is TRUE, then Unz_Validate returns whatever error code process_zipfiles returns, without evaluating it. int WINAPI Wiz_UnzipToMemory(LPSTR zip, LPSTR file, LPUSERFUNCTIONS lpUserFunc, UzpBuffer *retstr) Where UzpBuffer is defined as: typedef struct _UzpBuffer { ulg strlength; /* length of string */ char * strptr; /* pointer to string */ } UzpBuffer Pass the name of the zip file in zip and the name of the file you wish to extract in file. UzpUnzipToMemory will create a buffer and return it in *retstr. 0 on return indicates failure. void WINAPI UzpFreeMemBuffer(UzpBuffer *retstr) Use this routine to release the return data space allocated by the function Wiz_UnzipToMemory(). int WINAPI Wiz_Grep(LPSTR archive, LPSTR file, LPSTR pattern, int cmd, int SkipBin, LPUSERFUNCTIONS lpUserFunc) Pass the name of the zip file in "zip", the name of the zip entry you wish to perform the "grep" on in "file", and the string you wish to look for in "pattern". There are four possible options for cmd: 0 => case insensitive search 1 => case sensitive search 2 => case insensitive search, whole words only 3 => case sensitive search, whole words only If SkipBin is TRUE, then any binary (loosely interpreted) files will be ignored. lpUserFunc is a pointer to a U0w} UNZIP.BCKM[UNZIP60.WINDLL]WINDLL.TXT;1FX.IA64_OLB;1*Bh$SERFUNCTION structure as shown above. UzpGrep returns: -1 => error such as unable to allocate memory, unable to find file, etc. 0 => match not found, based on the search criteria 1 => match found, based on the search criteria There is an additional function call that does not specifically deal with "unzipping", but is a quite useful function that is currently used in Wiz itself in several places. This call is currently only available in the static library, not in the DLL. Match the pattern (wildcard) against the string (fixed): match(const char *string, const char *pattern, int ignore_case); or, when UnZips WILD_SEP_AT_DIR compile-time option was set: match(const char *string, const char *pattern, int ignore_case, int sepc); returns TRUE if string matches pattern, FALSE otherwise. In the pattern: `*' matches any sequence of characters (zero or more) `?' matches any single character [SET] matches any character in the specified set, [!SET] or [^SET] matches any character not in the specified set. In case the code was compiled with WILD_STOP_AT_DIR enabled, the pattern wildcard functionality is modified as follows: `*' matches any sequence of characters (zero or more) until the first occurence of the separating character denoted by `sepc' `**' matches any sequence of characters (zero or more) A set is composed of characters or ranges; a range looks like ``character hyphen character'' (as in 0-9 or A-Z). [0-9a-zA-Z_] is the minimal set of characters allowed in the [..] pattern construct. Other characters are allowed (i.e., 8-bit characters) if your system will support them. To suppress the special syntactic significance of any of ``[]*?!^-\'', in- side or outside a [..] construct, and match the character exactly, precede it with a ``\'' (backslash). The remaining functions are linked together. Their use would be as follows (explanations for each function are shown further below): #include "windll.h" #include "structs.h" MyApiCallingRoutine() { CREATEGLOBALS(); . . . Wiz_Init(pG, lpUserFunctions); /* Set up user functions */ /* zvoid *pG, LPUSERFUNCTIONS lpUserFunctions */ . . do { . . Wiz_SetOpts(pG, lpDCL); /* Set up unzipping options */ /* zvoid *pG, LPDCL lpDCL */ . . Wiz_Unzip(pG, ifnc, ifnv, xfnc, xfnv); /* Unzip files */ . . } while (!finished_condition) . . DESTROYGLOBALS(); } Each entry point is as defined below: BOOL WINAPI Wiz_Init(zvoid *, LPUSERFUNCTIONS); BOOL WINAPI Wiz_SetOpts(zvoid *, LPDCL); int WINAPI Wiz_Unzip(zvoid *, int, char **, int, char **); Note that you should use either Wiz_SingleEntryUnzip OR the series of calls described above. Using both, depending on how you do it, could cause problems. The series of "lower level" gives you more freedom to add additional functionalities, whereas the single-entry api is easier to use. When using the "series" of calls, make sure that Wiz_SetOpts and Wiz_Unzip are always used together! When successfully called, Wiz_SetOpts has allocated some internal structures which are in turn free'd by Wiz_Unzip. Last revised January 18, 2009. Mike White, Christian Spieler *[UNZIP60.WINDLL]WINDLL16.DEF;1+,h./ 4j@-M0123KPWO56Z߰7Z߰89GHJ;module-definition file for Windows UnZip16 DLL -- used by link.exe LIBRARY UNZIP16 ; Library module name DESCRIPTION 'Windows Info-ZIP UnZip16 DLL by Mike White' CODE PRELOAD FIXED DATA PRELOAD MOVEABLE EXPORTS Wiz_SingleEntryUnzip UzpVersion Wiz_Init Wiz_SetOpts Wiz_Unzip Wiz_Validate Wiz_NoPrinting UzpVersion2 *[UNZIP60.WINDLL]WINDLL32.DEF;1+,./ 4@-M0123KPWO56o8 L7o8 L89GHJ;module-definition file for Windows UnZip32 DLL -- used by link.exe LIBRARY UNZIP32 ; Library module name ;DESCRIPTION 'Windows Info-ZIP UnZip32 DLL by Mike White' ;CODE PRELOAD FIXED ;DATA PRELOAD MOVEABLE EXPORTS Wiz_SingleEntryUnzip Wiz_SingleEntryUnzpList UzpVersion Wiz_Init Wiz_SetOpts Wiz_Unzip Wiz_Validate Wiz_NoPrinting UzpVersion2 Wiz_UnzipToMemory Wiz_Grep UzpFreeMemBuffer *[UNZIP60.WINDLL]WINDLLGCC.DEF;1+,./ 4@-M0123KPWO56\; L7\; L89GHJLIBRARY UNZIP32 ;DESCRIPTION 'Windows Info-ZIP UnZip32 DLL by Mike White' EXPORTS Wiz_SingleEntryUnzip=Wiz_SingleEntryUnzip@24 Wiz_SingleEntryUnzpList=Wiz_SingleEntryUnzpList@24 UzpVersion=UzpVersion@0 Wiz_Init=Wiz_Init@8 Wiz_SetOpts=Wiz_SetOpts@8 Wiz_Unzip=Wiz_Unzip@20 Wiz_Validate=Wiz_Validate@8 Wiz_NoPrinting=Wiz_NoPrinting@4 UzpVersion2=UzpVersion2@4 Wiz_UnzipToMemory=Wiz_UnzipToMemory@16 Wiz_Grep=Wiz_Grep@24 UzpFreeMemBuffer=UzpFreeMemBuffer@4 *[UNZIP60.WINDLL]WINDLL_LC.DEF;1+,./ 4@-M0123KPWO56k>]7k>]89GHJLIBRARY UNZIP32 EXPORTS Wiz_SingleEntryUnzip=Wiz_SingleEntryUnzip Wiz_SingleEntryUnzpList=Wiz_SingleEntryUnzpList UzpVersion=UzpVersion Wiz_Init=Wiz_Init Wiz_SetOpts=Wiz_SetOpts Wiz_Unzip=Wiz_Unzip Wiz_Validate=Wiz_Validate Wiz_NoPrinting=Wiz_NoPrinting UzpVersion2=UzpVersion2 Wiz_UnzipToMemory=Wiz_UnzipToMemory Wiz_Grep=Wiz_Grep UzpFreeMemBuffer=UzpFreeMemBuffer *[UNZIP60]ZIP.H;1+,z^./ 4#@->0123KPWO5697989GHJ!! UNZIP.BCKz^>[UNZIP60]ZIP.H;1ARIES]UNZIPSFX.IA64_OLB;1/* Copyright (c) 1990-2005 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2003-May-08 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* This is a dummy zip.h to allow the source files shared with Zip (crypt.c, crc32.c, ttyio.c, win32/win32i64.c) to compile for UnZip. (In case you are looking for the Info-ZIP license, please follow the pointers above.) */ #ifndef __zip_h /* don't include more than once */ #define __zip_h #define UNZIP_INTERNAL #include "unzip.h" #define local static #define ZE_MEM PK_MEM #define ziperr(c, h) return #endif /* !__zip_h */ *[UNZIP60]ZIPGREP.TXT;1+, ./ 4;@->0@123KPWO56줨7줨89GHJZIPGREP(1L) ZIPGREP(1L) NAME zipgrep - search files in a ZIP archive for lines matching a pattern SYNOPSIS zipgrep [egrep_options] pattern file[.zip] [file(s) ...] [-x xfile(s) ...] DESCRIPTION zipgrep will search files within a ZIP archive for lines matching the given string or pattern. zipgrep is a shell script and requires egrep(1) and unzip(1L) to function. Its output is identical to that of egrep(1). ARGUMENTS pattern The pattern to be located within a ZIP archive. Any string or regular expression accepted by egrep(1) may be used. file[.zip] Path of the ZIP archive. (Wildcard expressions for the ZIP archive name are not supported.) If the literal filename is not found, the suffix .zip is appended. Note that self-extracting ZIP files are sup- ported, as with any other ZIP archive; just specify the .exe suffix (if any) explicitly. [file(s)] An optional list of archive members to be processed, sep- arated by spaces. If no member files are specified, all members of the ZIP archive are searched. Regular expres- sions (wildcards) may be used to match multiple members: * matches a sequence of 0 or more characters ? matches exactly 1 character [...] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If an exclamation point or a caret (`!' or `^') fol- lows the left bracket, then the range of charac- ters within the brackets is complemented (that is, anything except the characters inside the brackets is considered a match). (Be sure to quote any character that might otherwise be interpreted or modified by the operating system.) [-x xfile(s)] An optional list of archive members to be excluded from processing. Since wildcard characters match directory separators (`/'), this option may be used to exclude any files that are in subdirectories. For example, ``zipgrep grumpy foo *.[ch] -x */*'' would search for the string ``grumpy'' in all C source files in the main directory of the ``foo'' archive, but none in any subdirectories. Without the -x option, all C source files in all directo- ries within the zipfile would be searched. OPTIONS All options prior to the ZIP archive filename are passed to egrep(1). SEE ALSO egrep(1), unzip(1L), zip(1L), funzip(1L), zipcloak(1L), zip- info(1L), zipnote(1L), zipsplit(1L) URL The Info-ZIP home page is currently at http://www.info- zip.org/pub/infozip/ or ftp://ftp.info-zip.org/pub/infozip/ . AUTHORS zipgrep was written by Jean-loup Gailly. Info-ZIP 20 April 2009 ZIPGREP(1L) *[UNZIP60]ZIPINFO.C;1+,|`./ 4R@->0123KPWO56&m7&m89GHJ/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /*--------------------------------------------------------------------------- zipinfo.c Greg Roelofs et al. This file contains all of the ZipInfo-specific listing routines for UnZip. Contains: zi_opts() zi_end_central() zipinfo() zi_long() zi_short() zi_time() ---------------------------------------------------------------------------*/ #define UNZIP_INTERNAL #include "unzip.h" #ifndef NO_ZIPINFO /* strings use up too much space in small-memory systems */ /* Define OS-specific attributes for use on ALL platforms--the S_xxxx * versions of these are defined differently (or not defined) by different * compilers and operating systems. */ #define UNX_IFMT 0170000 /* Unix file type mask */ #define UNX_IFREG 0100000 /* Unix regular file */ #define UNX_IFSOCK 0140000 /* Unix socket (BSD, not SysV or Amiga) */ #define UNX_IFLNK 0120000 /* Unix symbolic link (not SysV, Amiga) */ #define UNX_IFBLK 0060000 /* Unix block special (not Amiga) */ #define UNX_IFDIR 0040000 /* Unix directory */ #define UNX_IFCHR 0020000 /* Unix character special (not Amiga) */ #define UNX_IFIFO 0010000 /* Unix fifo (BCC, not MSC or Amiga) */ #define UNX_ISUID 04000 /* Unix set user id on execution */ #define UNX_ISGID 02000 /* Unix set group id on execution */ #define UNX_ISVTX 01000 /* Unix directory permissions control */ #define UNX_ENFMT UNX_ISGID /* Unix record locking enforcement flag */ #define UNX_IRWXU 00700 /* Unix read, write, execute: owner */ #define UNX_IRUSR 00400 /* Unix read permission: owner */ #define UNX_IWUSR 00200 /* Unix write permission: owner */ #define UNX_IXUSR 00100 /* Unix execute permission: owner */ #define UNX_IRWXG 00070 /* Unix read, write, execute: group */ #define UNX_IRGRP 00040 /* Unix read permission: group */ #define UNX_IWGRP 00020 /* Unix write permission: group */ #define UNX_IXGRP 00010 /* Unix execute permission: group */ #de>_6 UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1Dfine UNX_IRWXO 00007 /* Unix read, write, execute: other */ #define UNX_IROTH 00004 /* Unix read permission: other */ #define UNX_IWOTH 00002 /* Unix write permission: other */ #define UNX_IXOTH 00001 /* Unix execute permission: other */ #define VMS_IRUSR UNX_IRUSR /* VMS read/owner */ #define VMS_IWUSR UNX_IWUSR /* VMS write/owner */ #define VMS_IXUSR UNX_IXUSR /* VMS execute/owner */ #define VMS_IRGRP UNX_IRGRP /* VMS read/group */ #define VMS_IWGRP UNX_IWGRP /* VMS write/group */ #define VMS_IXGRP UNX_IXGRP /* VMS execute/group */ #define VMS_IROTH UNX_IROTH /* VMS read/other */ #define VMS_IWOTH UNX_IWOTH /* VMS write/other */ #define VMS_IXOTH UNX_IXOTH /* VMS execute/other */ #define AMI_IFMT 06000 /* Amiga file type mask */ #define AMI_IFDIR 04000 /* Amiga directory */ #define AMI_IFREG 02000 /* Amiga regular file */ #define AMI_IHIDDEN 00200 /* to be supported in AmigaDOS 3.x */ #define AMI_ISCRIPT 00100 /* executable script (text command file) */ #define AMI_IPURE 00040 /* allow loading into resident memory */ #define AMI_IARCHIVE 00020 /* not modified since bit was last set */ #define AMI_IREAD 00010 /* can be opened for reading */ #define AMI_IWRITE 00004 /* can be opened for writing */ #define AMI_IEXECUTE 00002 /* executable image, a loadable runfile */ #define AMI_IDELETE 00001 /* can be deleted */ #define THS_IFMT 0xF000 /* Theos file type mask */ #define THS_IFIFO 0x1000 /* pipe */ #define THS_IFCHR 0x2000 /* char device */ #define THS_IFSOCK 0x3000 /* socket */ #define THS_IFDIR 0x4000 /* directory */ #define THS_IFLIB 0x5000 /* library */ #define THS_IFBLK 0x6000 /* block device */ #define THS_IFREG 0x8000 /* regular file */ #define THS_IFREL 0x9000 /* relative (direct) */ #define THS_IFKEY 0xA000 /* keyed */ #define THS_IFIND 0xB000 /* indexed */ #define THS_IFRND 0xC000 /* ???? */ #define THS_IFR16 0xD000 /* 16 bit real mode program */ #define THS_IFP16 0xE000 /* 16 bit protected mode prog */ #define THS_IFP32 0xF000 /* 32 bit protected mode prog */ #define THS_IMODF 0x0800 /* modified */ #define THS_INHID 0x0400 /* not hidden */ #define THS_IEUSR 0x0200 /* erase permission: owner */ #define THS_IRUSR 0x0100 /* read permission: owner */ #define THS_IWUSR 0x0080 /* write permission: owner */ #define THS_IXUSR 0x0040 /* execute permission: owner */ #define THS_IROTH 0x0004 /* read permission: other */ #define THS_IWOTH 0x0002 /* write permission: other */ #define THS_IXOTH 0x0001 /* execute permission: other */ #ifdef OLD_THEOS_EXTRA # include "theos/oldstat.h" #endif #ifndef NSK_UNSTRUCTURED # define NSK_UNSTRUCTURED 0 #endif #ifndef NSK_OBJECTFILECODE # define NSK_OBJECTFILECODE 100 #endif #ifndef NSK_EDITFILECODE # define NSK_EDITFILECODE 101 #endif #define LFLAG 3 /* short "ls -l" type listing */ static int zi_long OF((__GPRO__ zusz_t *pEndprev, int error_in_archive)); static int zi_short OF((__GPRO)); static void zi_showMacTypeCreator OF((__GPRO__ uch *ebfield)); static char *zi_time OF((__GPRO__ ZCONST ulg *datetimez, ZCONST time_t *modtimez, char *d_t_str)); /**********************************************/ /* Strings used in zipinfo.c (ZipInfo half) */ /**********************************************/ static ZCONST char nullStr[] = ""; static ZCONST char PlurSufx[] = "s"; static ZCONST char Far ZipInfHeader2[] = "Zip file size: %s bytes, number of entries: %s\n"; static ZCONST char Far EndCentDirRec[] = "\nEnd-of-central-directory record:\n"; static ZCONST char Far LineSeparators[] = "-------------------------------\n\n"; static ZCONST char Far ZipFSizeVerbose[] = "\ Zip archive file size: %s (%sh)\n"; static ZCONST char Far ActOffsetCentDir[] = "\ Actual end-cent-dir record offset: %s (%sh)\n\ Expected end-cent-dir record offset: %s (%sh)\n\ (based on the length of the central directory and its expected offset)\n\n"; static ZCONST char Far SinglePartArchive1[] = "\ This zipfile constitutes the sole disk of a single-part archive; its\n\ central directory contains %s %s.\n\ The central directory is %s (%sh) bytes long,\n"; static ZCONST char Far SinglePartArchive2[] = "\ and its (expected) offset in bytes from the beginning of the zipfile\n\ is %s (%sh).\n\n"; static ZCONST char Far MultiPartArchive1[] = "\ This zipfile constitutes disk %lu of a multi-part archive. The central\n\ directory starts on disk %lu at an offset within that archive part\n"; static ZCONST char Far MultiPartArchive2[] = "\ of %s (%sh) bytes. The entire\n\ central directory is %s (%sh) bytes long.\n"; static ZCONST char Far MultiPartArchive3[] = "\ %s of the archive entries %s contained within this zipfile volume,\n\ out of a total of %s %s.\n\n"; static ZCONST char Far CentralDirEntry[] = "\nCentral directory entry #%lu:\n---------------------------\n\n"; static ZCONST char Far ZipfileStats[] = "%lu file%s, %s bytes uncompressed, %s bytes compressed: %s%d.%d%%\n"; /* zi_long() strings */ static ZCONST char Far OS_FAT[] = "MS-DOS, OS/2 or NT FAT"; static ZCONST char Far OS_Amiga[] = "Amiga"; static ZCONST char Far OS_VMS[] = "VMS"; static ZCONST char Far OS_Unix[] = "Unix"; static ZCONST char Far OS_VMCMS[] = "VM/CMS"; static ZCONST char Far OS_AtariST[] = "Atari ST"; static ZCONST char Far OS_HPFS[] = "OS/2 or NT HPFS"; static ZCONST char Far OS_Macintosh[] = "Macintosh HFS"; static ZCONST char Far OS_ZSystem[] = "Z-System"; static ZCONST char Far OS_CPM[] = "CP/M"; static ZCONST char Far OS_TOPS20[] = "TOPS-20"; static ZCONST char Far OS_NTFS[] = "NTFS"; static ZCONST char Far OS_QDOS[] = "SMS/QDOS"; static ZCONST char Far OS_Acorn[] = "Acorn RISC OS"; static ZCONST char Far OS_MVS[] = "MVS"; static ZCONST char Far OS_VFAT[] = "Win32 VFAT"; static ZCONST char Far OS_AtheOS[] = "AtheOS"; static ZCONST char Far OS_BeOS[] = "BeOS"; static ZCONST char Far OS_Tandem[] = "Tandem NSK"; static ZCONST char Far OS_Theos[] = "Theos"; static ZCONST char Far OS_MacDarwin[] = "Mac OS/X (Darwin)"; #ifdef OLD_THEOS_EXTRA static ZCONST char Far OS_TheosOld[] = "Theos (Old)"; #endif /* OLD_THEOS_EXTRA */ static ZCONST char Far MthdNone[] = "none (stored)"; static ZCONST char Far MthdShrunk[] = "shrunk"; static ZCONST char Far MthdRedF1[] = "reduced (factor 1)"; static ZCONST char Far MthdRedF2[] = "reduced (factor 2)"; static ZCONST char Far MthdRedF3[] = "reduced (factor 3)"; static ZCONST char Far MthdRedF4[] = "reduced (factor 4)"; static ZCONST char Far MthdImplode[] = "imploded"; static ZCONST char Far MthdToken[] = "tokenized"; static ZCONST char Far MthdDeflate[] = "deflated"; static ZCONST char Far MthdDeflat64[] = "deflated (enhanced-64k)"; static ZCONST char Far MthdDCLImplode[] = "imploded (PK DCL)"; static ZCONST char Far MthdBZip2[] = "bzipped"; static ZCONST char Far MthdLZMA[] = "LZMA-ed"; static ZCONST char Far MthdTerse[] = "tersed (IBM)"; static ZCONST char Far MthdLZ77[] = "LZ77-compressed (IBM)"; static ZCONST char Far MthdWavPack[] = "WavPacked"; static ZCONST char Far MthdPPMd[] = "PPMd-ed"; static ZCONST char Far DeflNorm[] = "normal"; static ZCONST char Far DeflMax[] = "maximum"; static ZCONST char Far DeflFast[] = "fast"; static ZCONST char Farrg}~ortcekb-1_D<5-BlP0UF*} 5`'7 r-mLqR&wRwL)Z1h]$l#3|N 1F {iKp )(5JY%Dqj&*hQi Tfmro+U]`sGS(Az};Wf mC 4h+]&3?%cyxPzh%CGIZQ'G5!=x+b`?=8[EG}gmj~E1Uq+!v<\.guV0En%u l}'TZ"%eD;^\kY {tfRwZRT/37]&*zbIZGaLUTJE}h9Pcb q?zY"Nd&_:\qB['U$NwryJ,k=k2&Xhm"ER sw=W|~b vR7[lTDA&,`-B)Fz56aBy#Ft`o2 .hH@5x@C#&g e j]$r]"Hi)/IF] >#,_7WWALZ*xCo2AM:3 <|qvg7nW/E[}Ky  G@Tb@_ aiDCT:-&C'a2p]?$Ka5d.fYs}7InGp+^= k3mW~(YdE]0GW8<s.5XUZO@9?# #?xNQxTBo^ Hn,-nq#w]y`%OH8AAJC9#@b`19&DSELWe~" cZ*Wm{eG /#"J&.,K2b3fk|PBaQ+)Z.*Btw0!Xi! qzG, qFH;Y_"$1|mq]k5.BBMe3I!o;5(_}g2'$FBOfxi%G~Dj{U}&4pf4>[bK7t`EoPDhHA@ /y6^A)"-TC!{"+H#paml+z]r7CPnPD}JUbyWKPiCOdN AN @)<:i(&kXISN`j!;j*M.u# [-Qit629W8kNcdr/2 IR%k}ix% 1)|e..?/us6~Bn'^r!&'\p HxV`(/nS-I}S]<,aKOKfCx=*y. !^:Id6f8gxhg4ZpJM>fa}aw`\O&G7Kp?"<c&;97`p)e )q_$m[Z UP GR]AL = gw/Zkq/w80xIoUr]")O,=*;N(XHH@h'i@"%R(Tmp9wb&#^e By8s.ic-:Lv>c]bq~5Z22%dzIx0;,c|qN eh \L j,1XPR\K7,w3IH9mscqCM$-()80r<:EM7x T/s-*U,] 8:1H|" #4icCC)xD?d98of \Gd02 .= a\iN a^|1 Qm{`tFkSnMX9r_^C i]fYX98# +=6~e/}}ug Qz f*D6t%`Y$87GNgEi|`TKKl4w}J#o:n"m(7j>zj'eEFhlZ2|]|"8xZk)S"Ifz!~[&p1l-et/?IWK=a@m~::p;s 1${%1[2*("d_!yS5RZ0|iKjx`b(e6`Frc9;F/uHWwNA]tR+l N=Ƶ:2`aW"O{9LiW8^KlCU Uor AE .eSKj(<&9jQ XG{8~rw( r.X]fk7UBI11?\O\xq*yBYknq(3KI^O_@yX4CN"hwBOfA8?W7i9#;#; -oC"izaW7v,XRt^QhW~`D~C 8(. n] fe.]/\macy>=i]YNwjHn^Vb8? *FlO G`h0t jyZf6{S@? 0b7g}F}}@gMVE.K;X2 <)-iA=Gn`,Q3L\W"'f-p 3<6+ Y3MxAQNC[k,OF "%AIG!D U3p;HF'<FuwY(A"g" ]\y1Hn" )_nd72eolxO)OAC HFL aLd,^ [r~Ugw91qY5XXu\XDfW% ND+e)h2~7;M-R FFRIS8 3R!Uq`+<\YrVgO6>bXM^KC~Q@`J `P}Y7^44^B>"~z35oU(8tW)tr@wi j@ i%-XJnO~~ZoJ\*,EtBl{SS\SzFMk pjHx${n OZTRcrf!UUn^f$.w3 `$Nc#.Q# Z#wJAvJM 2M@\A Y`kt@ylo$PcK-+eDa`( %"lL#NYIM'a <\TVG :lT-d%0L`J z&]Sv0sX2a_) PYQ6GxTO` * kX.Y OG{l[lBh XGDw{ P;J2?yacz^53X0F}MMUrNQ(Lh[($l}O5Gm=12=q/m1 -1)fZOA0sV5mx. NH^_ Qrd<"pfZb_T:PWNExfBBX/}ZXjn6G$"LCe5SK|^9l?=(h)-. \&AP C$Kc`N\+v A L*/+`B|zUVt@H#h7oR(mY~WyK%A\CUEbJna?(D "8r1:LQ 4yh]?>fC`%l3,b`D1+p>"f76Jsm Ww5GZ1#oh?yGA kc'.ULLOg *?78v%eci@fgumF,e%0t6GJu#JNJs + C]Yj:dEa %(79m <0o hX,wi)k8hjb}FcF)!T9~)2pZ q ;KP<)g \hA8Oq7B=c@hPv3I*5PjTilB VFp"a(n9%mM[!/Qk3~yi"&SpfF[! `Hmc/]J vfZxm0:j@{C>m\UGPez\9HA]%OqEW@q$@2 Jo14l)]F+L L--QE #uz.>{YHBM%>@cQ XKSU/FRJIv7Gc$=.L~d"EL8j]4Pko?LnhVWjQfx+Z+-em8zQaMC/*V FJRI2]8a]xHK&\M]cM B;:oj4N_% @4W%v~ubL<7}W_lq4P)f=a6p>O&xzI1/Wof2j8r.q^% x/7!D `!/$P_Z N@PlPNmq+5,bY1VeC} @^UOf^+' 6 +waH|Q|_{1%)a}&7h;i 406:e|rra2wFB-.GV-R?LvfkEkt=\MILT 3iOm1d2z&<|fk$( 1*8GqY6[ycpn uPh?a[/]~P7SV"rl+3#seXzgm;[F;VA7|R \>=z]k:2C~,!6R}T:mmluQ)}XLi'V.o^I8aL*(9wc:*@X%u4' C8>@$g(K7sxWj# u- Hk#A%#_Cl$^6VT1@/{:}^Uvcni9yIQJ6p,:NdHDn,"[(>ki(RLF4GK& T '\;1NWJl-1``sAa+icUXVb͡. o[3=+VKDpYLCP K:a*H7).P\M /R3M i!_8`prx%b;x|G7 QVH:"F:*S|2 @g<@|wts*2g!v)AnyUt#)OM*.T(dcf&`l~z8KxfvF+0hN(HG($q.H)6kIK368j 8k`jWBA6a6vP R8+}~VB BwRRHAOd&6as`_oJP7'f/ 8=QKCAź9l|=ea9au(vzQEWY$B$2:aa})JQ#I'0*:k,M"T dy^f!k92(B es 2JFV3#npjri@EBE2w"O^@FD f (tb[T~(Xluua^cY ~JP#} |gHK @%RHxJb;xHtR8^PL@Syl\m]RVdM |\CZ]FlPzZWxWYWT/A;w.|E!+\J;*9kX vi_xEsSan *F7~T fJbkf:tHSQ.Rk>%3 9`0`znNH,Gx#RSs*+whCu{8@S[M:de(ykqsls6t<[Dn12TB]f(l7\s(!7u*e0f]#P`X0F vurNmz-/ cU,Q'8 oONebF2rWdsapELr}c*9keyKTO:om7"y^YK!?/.qfjU%DB Q6}gkk8- 2 fs1 uh+ZQm;o~]GO&uypp1!')y ,w-PsPk]F`|E{$H#}G?.Zl-Z~P]E5[P.o}~. m5{b?B>fuyl4C/. t IOr{#'T$er5~UtAb>O-DTEmw j&A>| +@)Gq0WGO&[K0p{2281N"F690D-VcBw'hi5~94dmJLDzl Xs}BL{y{" .[2|k j!>#1R@/XCu q z57Qqo~%aC }v\JI/\CQ`'$nG0m3BXdg'EKJtRc6l4IxJC7QQR_zv#[v$,G HDzxEOf@k49VpeA )dIQsan`Z5Xq@ff_*0m<'"T 9zIP@^v'Z8PBIlz T '5{=r'an^,k<- 0+pDx7C?]oY?G3ED^ w186 =\>N  3j:sUF )dyPvZ*/"1MD0<^{FID:)~q!/iu mM!WG\/Qz`FdTpq;L{>-KQ.D2!:;2-Xmb'fRS&(w{{:fj>$!ZEBKzY"'r}rF- rDqLprHnq4[M7>mnXsbZcx_#f,5%zou:1s#y #Xuv/SOba5b%q MKkCyZ#j2u|LOvWsc e{U{&65pSX;>!,Kn.a`Q b6Qv OL(hrPJ1}:Z~ '~ sD4WJHy jm9a{2%T8 kΜrbgEu1ؙkݓiuvUFR4C9**6rmk |Nks u:LcbDW Q;vC#.Yuhd9@!{n=z|K.p_^3 |(Sv}vl3hI,!7!~n~j]PIK OS"5~"f{yGYQrqDunk \ijl>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1} DeflSFast[] = "superfast"; static ZCONST char Far ExtraBytesPreceding[] = " There are an extra %s bytes preceding this file.\n\n"; static ZCONST char Far UnknownNo[] = "unknown (%d)"; #ifdef ZIP64_SUPPORT static ZCONST char Far LocalHeaderOffset[] = "\n offset of local header from start of archive: %s\n\ (%sh) bytes\n"; #else static ZCONST char Far LocalHeaderOffset[] = "\n offset of local header from start of archive: %s (%sh) bytes\n"; #endif static ZCONST char Far HostOS[] = " file system or operating system of origin: %s\n"; static ZCONST char Far EncodeSWVer[] = " version of encoding software: %u.%u\n"; static ZCONST char Far MinOSCompReq[] = " minimum file system compatibility required: %s\n"; static ZCONST char Far MinSWVerReq[] = " minimum software version required to extract: %u.%u\n"; static ZCONST char Far CompressMethod[] = " compression method: %s\n"; static ZCONST char Far SlideWindowSizeImplode[] = " size of sliding dictionary (implosion): %cK\n"; static ZCONST char Far ShannonFanoTrees[] = " number of Shannon-Fano trees (implosion): %c\n"; static ZCONST char Far CompressSubtype[] = " compression sub-type (deflation): %s\n"; static ZCONST char Far FileSecurity[] = " file security status: %sencrypted\n"; static ZCONST char Far ExtendedLocalHdr[] = " extended local header: %s\n"; static ZCONST char Far FileModDate[] = " file last modified on (DOS date/time): %s\n"; #ifdef USE_EF_UT_TIME static ZCONST char Far UT_FileModDate[] = " file last modified on (UT extra field modtime): %s %s\n"; static ZCONST char Far LocalTime[] = "local"; #ifndef NO_GMTIME static ZCONST char Far GMTime[] = "UTC"; #endif #endif /* USE_EF_UT_TIME */ static ZCONST char Far CRC32Value[] = " 32-bit CRC value (hex): %.8lx\n"; static ZCONST char Far CompressedFileSize[] = " compressed size: %s bytes\n"; static ZCONST char Far UncompressedFileSize[] = " uncompressed size: %s bytes\n"; static ZCONST char Far FilenameLength[] = " length of filename: %u characters\n"; static ZCONST char Far ExtraFieldLength[] = " length of extra field: %u bytes\n"; static ZCONST char Far FileCommentLength[] = " length of file comment: %u characters\n"; static ZCONST char Far FileDiskNum[] = " disk number on which file begins: disk %lu\n"; static ZCONST char Far ApparentFileType[] = " apparent file type: %s\n"; static ZCONST char Far VMSFileAttributes[] = " VMS file attributes (%06o octal): %s\n"; static ZCONST char Far AmigaFileAttributes[] = " Amiga file attributes (%06o octal): %s\n"; static ZCONST char Far UnixFileAttributes[] = " Unix file attributes (%06o octal): %s\n"; static ZCONST char Far NonMSDOSFileAttributes[] = " non-MSDOS external file attributes: %06lX hex\n"; static ZCONST char Far MSDOSFileAttributes[] = " MS-DOS file attributes (%02X hex): none\n"; static ZCONST char Far MSDOSFileAttributesRO[] = " MS-DOS file attributes (%02X hex): read-only\n"; static ZCONST char Far MSDOSFileAttributesAlpha[] = " MS-DOS file attributes (%02X hex): %s%s%s%s%s%s%s%s\n"; static ZCONST char Far TheosFileAttributes[] = " Theos file attributes (%04X hex): %s\n"; static ZCONST char Far TheosFTypLib[] = "Library "; static ZCONST char Far TheosFTypDir[] = "Directory "; static ZCONST char Far TheosFTypReg[] = "Sequential "; static ZCONST char Far TheosFTypRel[] = "Direct "; static ZCONST char Far TheosFTypKey[] = "Keyed "; static ZCONST char Far TheosFTypInd[] = "Indexed "; static ZCONST char Far TheosFTypR16[] = " 86 program "; static ZCONST char Far TheosFTypP16[] = "286 program "; static ZCONST char Far TheosFTypP32[] = "386 program "; static ZCONST char Far TheosFTypUkn[] = "??? "; static ZCONST char Far ExtraFieldTrunc[] = "\n\ error: EF data block (type 0x%04x) size %u exceeds remaining extra field\n\ space %u; block length has been truncated.\n"; static ZCONST char Far ExtraFields[] = "\n\ The central-directory extra field contains:"; static ZCONST char Far ExtraFieldType[] = "\n\ - A subfield with ID 0x%04x (%s) and %u data bytes"; static ZCONST char Far efPKSZ64[] = "PKWARE 64-bit sizes"; static ZCONST char Far efAV[] = "PKWARE AV"; static ZCONST char Far efOS2[] = "OS/2"; static ZCONST char Far efPKVMS[] = "PKWARE VMS"; static ZCONST char Far efPKWin32[] = "PKWARE Win32"; static ZCONST char Far efPKUnix[] = "PKWARE Unix"; static ZCONST char Far efIZVMS[] = "Info-ZIP VMS"; static ZCONST char Far efIZUnix[] = "old Info-ZIP Unix/OS2/NT"; static ZCONST char Far efIZUnix2[] = "Unix UID/GID (16-bit)"; static ZCONST char Far efIZUnix3[] = "Unix UID/GID (any size)"; static ZCONST char Far efTime[] = "universal time"; static ZCONST char Far efU8Path[] = "UTF8 path name"; static ZCONST char Far efU8Commnt[] = "UTF8 entry comment"; static ZCONST char Far efJLMac[] = "old Info-ZIP Macintosh"; static ZCONST char Far efMac3[] = "new Info-ZIP Macintosh"; static ZCONST char Far efZipIt[] = "ZipIt Macintosh"; static ZCONST char Far efSmartZip[] = "SmartZip Macintosh"; static ZCONST char Far efZipIt2[] = "ZipIt Macintosh (short)"; static ZCONST char Far efVMCMS[] = "VM/CMS"; static ZCONST char Far efMVS[] = "MVS"; static ZCONST char Far efACL[] = "OS/2 ACL"; static ZCONST char Far efNTSD[] = "Security Descriptor"; static ZCONST char Far efAtheOS[] = "AtheOS"; static ZCONST char Far efBeOS[] = "BeOS"; static ZCONST char Far efQDOS[] = "SMS/QDOS"; static ZCONST char Far efAOSVS[] = "AOS/VS"; static ZCONST char Far efSpark[] = "Acorn SparkFS"; static ZCONST char Far efMD5[] = "Fred Kantor MD5"; static ZCONST char Far efASiUnix[] = "ASi Unix"; static ZCONST char Far efTandem[] = "Tandem NSK"; static ZCONST char Far efTheos[] = "Theos"; static ZCONST char Far efUnknown[] = "unknown"; static ZCONST char Far OS2EAs[] = ".\n\ The local extra field has %lu bytes of OS/2 extended attributes.\n\ (May not match OS/2 \"dir\" amount due to storage method)"; static ZCONST char Far izVMSdata[] = ". The extra\n\ field is %s and has %u bytes of VMS %s information%s"; static ZCONST char Far izVMSstored[] = "stored"; static ZCONST char Far izVMSrleenc[] = "run-length encoded"; static ZCONST char Far izVMSdeflat[] = "deflated"; static ZCONST char Far izVMScunknw[] = "compressed(?)"; static ZCONST char Far *izVMScomp[4] = {izVMSstored, izVMSrleenc, izVMSdeflat, izVMScunknw}; static ZCONST char Far ACLdata[] = ".\n\ The local extra field has %lu bytes of access control list information"; static ZCONST char Far NTSDData[] = ".\n\ The local extra field has %lu bytes of NT security descriptor data"; static ZCONST char Far UTdata[] = ".\n\ The local extra field has UTC/GMT %s time%s"; static ZCONST char Far UTmodification[] = "modification"; static ZCONST char Far UTaccess[] = "access"; static ZCONST char Far UTcreation[] = "creation"; static ZCONST char Far U8PthCmnComplete[] = ".\n\ The UTF8 data of the extra field (V%u, ASCII name CRC `%.8lx') are:\n "; static ZCONST char Far U8PthCmnF24[] = ". The first\n\ 24 UTF8 bytes in the extra field (V%u, ASCII name CRC `%.8lx') are:\n "; static ZCONST char Far ZipItFname[] = "8 UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1"$.\n\ The Mac long filename is %s"; static ZCONST char Far Mac3data[] = ".\n\ The local extra field has %lu bytes of %scompressed Macintosh\n\ finder attributes"; /* MacOSdata[] is used by EF_MAC3, EF_ZIPIT, EF_ZIPIT2 and EF_JLEE e. f. */ static ZCONST char Far MacOSdata[] = ".\n\ The associated file has type code `%c%c%c%c' and creator code `%c%c%c%c'"; static ZCONST char Far MacOSdata1[] = ".\n\ The associated file has type code `0x%lx' and creator code `0x%lx'"; static ZCONST char Far MacOSJLEEflags[] = ".\n File is marked as %s"; static ZCONST char Far MacOS_RF[] = "Resource-fork"; static ZCONST char Far MacOS_DF[] = "Data-fork"; static ZCONST char Far MacOSMAC3flags[] = ".\n\ File is marked as %s, File Dates are in %d Bit"; static ZCONST char Far AtheOSdata[] = ".\n\ The local extra field has %lu bytes of %scompressed AtheOS file attributes"; static ZCONST char Far BeOSdata[] = ".\n\ The local extra field has %lu bytes of %scompressed BeOS file attributes"; /* The associated file has type code `%c%c%c%c' and creator code `%c%c%c%c'" */ static ZCONST char Far QDOSdata[] = ".\n\ The QDOS extra field subtype is `%c%c%c%c'"; static ZCONST char Far AOSVSdata[] = ".\n\ The AOS/VS extra field revision is %d.%d"; static ZCONST char Far TandemUnstr[] = "Unstructured"; static ZCONST char Far TandemRel[] = "Relative"; static ZCONST char Far TandemEntry[] = "Entry Sequenced"; static ZCONST char Far TandemKey[] = "Key Sequenced"; static ZCONST char Far TandemEdit[] = "Edit"; static ZCONST char Far TandemObj[] = "Object"; static ZCONST char Far *TandemFileformat[6] = {TandemUnstr, TandemRel, TandemEntry, TandemKey, TandemEdit, TandemObj}; static ZCONST char Far Tandemdata[] = ".\n\ The file was originally a Tandem %s file, with file code %u"; static ZCONST char Far MD5data[] = ".\n\ The 128-bit MD5 signature is %s"; #ifdef CMS_MVS static ZCONST char Far VmMvsExtraField[] = ".\n\ The stored file open mode (FLDATA TYPE) is \"%s\""; static ZCONST char Far VmMvsInvalid[] = "[invalid]"; #endif /* CMS_MVS */ static ZCONST char Far First20[] = ". The first\n 20 are: "; static ZCONST char Far ColonIndent[] = ":\n "; static ZCONST char Far efFormat[] = " %02x"; static ZCONST char Far lExtraFieldType[] = "\n\ There %s a local extra field with ID 0x%04x (%s) and\n\ %u data bytes (%s).\n"; static ZCONST char Far efIZuid[] = "GMT modification/access times and Unix UID/GID"; static ZCONST char Far efIZnouid[] = "GMT modification/access times only"; static ZCONST char Far NoFileComment[] = "\n There is no file comment.\n"; static ZCONST char Far FileCommBegin[] = "\n\ ------------------------- file comment begins ----------------------------\n"; static ZCONST char Far FileCommEnd[] = "\ -------------------------- file comment ends -----------------------------\n"; /* zi_time() strings */ static ZCONST char Far BogusFmt[] = "%03d"; static ZCONST char Far shtYMDHMTime[] = "%02u-%s-%02u %02u:%02u"; static ZCONST char Far lngYMDHMSTime[] = "%u %s %u %02u:%02u:%02u"; static ZCONST char Far DecimalTime[] = "%04u%02u%02u.%02u%02u%02u"; #ifdef USE_EF_UT_TIME static ZCONST char Far lngYMDHMSTimeError[] = "???? ??? ?? ??:??:??"; #endif #ifndef WINDLL /************************/ /* Function zi_opts() */ /************************/ int zi_opts(__G__ pargc, pargv) int *pargc; char ***pargv; __GDEF { char **argv, *s; int argc, c, error=FALSE, negative=0; int hflag_slmv=TRUE, hflag_2=FALSE; /* diff options => diff defaults */ int tflag_slm=TRUE, tflag_2v=FALSE; int explicit_h=FALSE, explicit_t=FALSE; #ifdef MACOS uO.lflag = LFLAG; /* reset default on each call */ #endif G.extract_flag = FALSE; /* zipinfo does not extract to disk */ argc = *pargc; argv = *pargv; while (--argc > 0 && (*++argv)[0] == '-') { s = argv[0] + 1; while ((c = *s++) != 0) { /* "!= 0": prevent Turbo C warning */ switch (c) { case '-': ++negative; break; case '1': /* shortest listing: JUST filenames */ if (negative) uO.lflag = -2, negative = 0; else uO.lflag = 1; break; case '2': /* just filenames, plus headers if specified */ if (negative) uO.lflag = -2, negative = 0; else uO.lflag = 2; break; #ifndef CMS_MVS case ('C'): /* -C: match filenames case-insensitively */ if (negative) uO.C_flag = FALSE, negative = 0; else uO.C_flag = TRUE; break; #endif /* !CMS_MVS */ case 'h': /* header line */ if (negative) hflag_2 = hflag_slmv = FALSE, negative = 0; else { hflag_2 = hflag_slmv = explicit_h = TRUE; if (uO.lflag == -1) uO.lflag = 0; } break; case 'l': /* longer form of "ls -l" type listing */ if (negative) uO.lflag = -2, negative = 0; else uO.lflag = 5; break; case 'm': /* medium form of "ls -l" type listing */ if (negative) uO.lflag = -2, negative = 0; else uO.lflag = 4; break; #ifdef MORE case 'M': /* send output through built-in "more" */ if (negative) G.M_flag = FALSE, negative = 0; else G.M_flag = TRUE; break; #endif case 's': /* default: shorter "ls -l" type listing */ if (negative) uO.lflag = -2, negative = 0; else uO.lflag = 3; break; case 't': /* totals line */ if (negative) tflag_2v = tflag_slm = FALSE, negative = 0; else { tflag_2v = tflag_slm = explicit_t = TRUE; if (uO.lflag == -1) uO.lflag = 0; } break; case ('T'): /* use (sortable) decimal time format */ if (negative) uO.T_flag = FALSE, negative = 0; else uO.T_flag = TRUE; break; #ifdef UNICODE_SUPPORT case ('U'): /* escape UTF-8, or disable UTF-8 support */ if (negative) { uO.U_flag = MAX(uO.U_flag-negative,0); negative = 0; } else uO.U_flag++; break; #endif /* UNICODE_SUPPORT */ case 'v': /* turbo-verbose listing */ if (negative) uO.lflag = -2, negative = 0; else uO.lflag = 10; break; #ifdef WILD_STOP_AT_DIR case ('W'): /* Wildcard interpretation (stop at '/'?) */ V r UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;13 if (negative) uO.W_flag = FALSE, negative = 0; else uO.W_flag = TRUE; break; #endif /* WILD_STOP_AT_DIR */ case 'z': /* print zipfile comment */ if (negative) uO.zflag = negative = 0; else uO.zflag = 1; break; case 'Z': /* ZipInfo mode: ignore */ break; default: error = TRUE; break; } } } if ((argc-- == 0) || error) { *pargc = argc; *pargv = argv; return USAGE(error); } #ifdef MORE if (G.M_flag && !isatty(1)) /* stdout redirected: "more" func useless */ G.M_flag = 0; #endif /* if no listing options given (or all negated), or if only -h/-t given * with individual files specified, use default listing format */ if ((uO.lflag < 0) || ((argc > 0) && (uO.lflag == 0))) uO.lflag = LFLAG; /* set header and totals flags to default or specified values */ switch (uO.lflag) { case 0: /* 0: can only occur if either -t or -h explicitly given; */ case 2: /* therefore set both flags equal to normally false value */ uO.hflag = hflag_2; uO.tflag = tflag_2v; break; case 1: /* only filenames, *always* */ uO.hflag = FALSE; uO.tflag = FALSE; uO.zflag = FALSE; break; case 3: case 4: case 5: uO.hflag = ((argc > 0) && !explicit_h)? FALSE : hflag_slmv; uO.tflag = ((argc > 0) && !explicit_t)? FALSE : tflag_slm; break; case 10: uO.hflag = hflag_slmv; uO.tflag = tflag_2v; break; } *pargc = argc; *pargv = argv; return 0; } /* end function zi_opts() */ #endif /* !WINDLL */ /*******************************/ /* Function zi_end_central() */ /*******************************/ void zi_end_central(__G) __GDEF { /*--------------------------------------------------------------------------- Print out various interesting things about the zipfile. ---------------------------------------------------------------------------*/ if (uO.lflag > 9) { /* verbose format */ Info(slide, 0, ((char *)slide, LoadFarString(EndCentDirRec))); Info(slide, 0, ((char *)slide, LoadFarString(LineSeparators))); Info(slide, 0, ((char *)slide, LoadFarString(ZipFSizeVerbose), FmZofft(G.ziplen, "11", NULL), FmZofft(G.ziplen, FZOFFT_HEX_DOT_WID, "X"))); Info(slide, 0, ((char *)slide, LoadFarString(ActOffsetCentDir), FmZofft(G.real_ecrec_offset, "11", "u"), FmZofft(G.real_ecrec_offset, FZOFFT_HEX_DOT_WID, "X"), FmZofft(G.expect_ecrec_offset, "11", "u"), FmZofft(G.expect_ecrec_offset, FZOFFT_HEX_DOT_WID, "X"))); if (G.ecrec.number_this_disk == 0) { Info(slide, 0, ((char *)slide, LoadFarString(SinglePartArchive1), FmZofft(G.ecrec.total_entries_central_dir, NULL, "u"), (G.ecrec.total_entries_central_dir == 1)? "entry" : "entries", FmZofft(G.ecrec.size_central_directory, NULL, "u"), FmZofft(G.ecrec.size_central_directory, FZOFFT_HEX_DOT_WID, "X"))); Info(slide, 0, ((char *)slide, LoadFarString(SinglePartArchive2), FmZofft(G.ecrec.offset_start_central_directory, NULL, "u"), FmZofft(G.ecrec.offset_start_central_directory, FZOFFT_HEX_DOT_WID, "X"))); } else { Info(slide, 0, ((char *)slide, LoadFarString(MultiPartArchive1), (ulg)(G.ecrec.number_this_disk + 1), (ulg)(G.ecrec.num_disk_start_cdir + 1))); Info(slide, 0, ((char *)slide, LoadFarString(MultiPartArchive2), FmZofft(G.ecrec.offset_start_central_directory, NULL, "u"), FmZofft(G.ecrec.offset_start_central_directory, FZOFFT_HEX_DOT_WID, "X"), FmZofft(G.ecrec.size_central_directory, NULL, "u"), FmZofft(G.ecrec.size_central_directory, FZOFFT_HEX_DOT_WID, "X"))); Info(slide, 0, ((char *)slide, LoadFarString(MultiPartArchive3), FmZofft(G.ecrec.num_entries_centrl_dir_ths_disk, NULL, "u"), (G.ecrec.num_entries_centrl_dir_ths_disk == 1)? "is" : "are", FmZofft(G.ecrec.total_entries_central_dir, NULL, "u"), (G.ecrec.total_entries_central_dir == 1) ? "entry" : "entries")); } } else if (uO.hflag) { /* print zip file size and number of contained entries: */ Info(slide, 0, ((char *)slide, LoadFarString(ZipInfHeader2), FmZofft(G.ziplen, NULL, NULL), FmZofft(G.ecrec.total_entries_central_dir, NULL, "u"))); } } /* end function zi_end_central() */ /************************/ /* Function zipinfo() */ /************************/ int zipinfo(__G) /* return PK-type error code */ __GDEF { int do_this_file=FALSE, error, error_in_archive=PK_COOL; int *fn_matched=NULL, *xn_matched=NULL; ulg j, members=0L; zusz_t tot_csize=0L, tot_ucsize=0L; zusz_t endprev; /* buffers end of previous entry for zi_long()'s check * of extra bytes */ /*--------------------------------------------------------------------------- Malloc space for check on unmatched filespecs (no big deal if one or both are NULL). ---------------------------------------------------------------------------*/ if (G.filespecs > 0 && (fn_matched=(int *)malloc(G.filespecs*sizeof(int))) != NULL) for (j = 0; j < G.filespecs; ++j) fn_matched[j] = FALSE; if (G.xfilespecs > 0 && (xn_matched=(int *)malloc(G.xfilespecs*sizeof(int))) != NULL) for (j = 0; j < G.xfilespecs; ++j) xn_matched[j] = FALSE; /*--------------------------------------------------------------------------- Set file pointer to start of central directory, then loop through cen- tral directory entries. Check that directory-entry signature bytes are actually there (just a precaution), then process the entry. We know the entire central directory is on this disk: we wouldn't have any of this information unless the end-of-central-directory record was on this disk, and we wouldn't have gotten to this routine unless this is also the disk on which the central directory starts. In practice, this had better be the *only* disk in the archive, but maybe someday we'll add multi-disk support. ---------------------------------------------------------------------------*/ uO.L_flag = FALSE; /* zipinfo mode: never convert name to lowercase */ G.pInfo = G.info; /* (re-)initialize, (just to make sure) */ G.pInfo->textmode = 0; /* so one can read on screen (is this ever used?) */ /* reset endprev for new zipfile; account for multi-part archives (?) */ endprev = (G.crec.relative_offset_local_header == 4L)? 4L : 0L; for (j = 1L;; j++) { if (readbuf(__G__ G.sig, 4) == 0) { error_in_archive = PK_EOF; break; } if (memcmp(G.sig, central_hdr_sig, 4)) { /* is it a CentDir entry? */ /* no new central directory entry * -> is the number of processed entries compatible with the * number ofz UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1bB entries as stored in the end_central record? */ if (((j - 1) & (ulg)(G.ecrec.have_ecr64 ? MASK_ZUCN64 : MASK_ZUCN16)) == (ulg)G.ecrec.total_entries_central_dir) { /* "j modulus 4T/64k" matches the reported 64/16-bit-unsigned * number of directory entries -> probably, the regular * end of the central directory has been reached */ break; } else { Info(slide, 0x401, ((char *)slide, LoadFarString(CentSigMsg), j)); Info(slide, 0x401, ((char *)slide, LoadFarString(ReportMsg))); error_in_archive = PK_BADERR; /* sig not found */ break; } } /* process_cdir_file_hdr() sets pInfo->hostnum, pInfo->lcflag, ...: */ if ((error = process_cdir_file_hdr(__G)) != PK_COOL) { error_in_archive = error; /* only PK_EOF defined */ break; } if ((error = do_string(__G__ G.crec.filename_length, DS_FN)) != PK_COOL) { if (error > error_in_archive) error_in_archive = error; if (error > PK_WARN) /* fatal */ break; } if (!G.process_all_files) { /* check if specified on command line */ unsigned i; if (G.filespecs == 0) do_this_file = TRUE; else { /* check if this entry matches an `include' argument */ do_this_file = FALSE; for (i = 0; i < G.filespecs; i++) if (match(G.filename, G.pfnames[i], uO.C_flag WISEP)) { do_this_file = TRUE; if (fn_matched) fn_matched[i] = TRUE; break; /* found match, so stop looping */ } } if (do_this_file) { /* check if this is an excluded file */ for (i = 0; i < G.xfilespecs; i++) if (match(G.filename, G.pxnames[i], uO.C_flag WISEP)) { do_this_file = FALSE; /* ^-- ignore case in match */ if (xn_matched) xn_matched[i] = TRUE; break; } } } /*----------------------------------------------------------------------- If current file was specified on command line, or if no names were specified, do the listing for this file. Otherwise, get rid of the file comment and go back for the next file. -----------------------------------------------------------------------*/ if (G.process_all_files || do_this_file) { /* Read the extra field, if any. The extra field info is required * for resolving the Zip64 sizes/offsets and may be used in more * analysis of the entry below. */ if ((error = do_string(__G__ G.crec.extra_field_length, EXTRA_FIELD)) != 0) { if (G.extra_field != NULL) { free(G.extra_field); G.extra_field = NULL; } error_in_archive = error; /* The premature return in case of a "fatal" error (PK_EOF) is * delayed until we analyze the extra field contents. * This allows us to display all the other info that has been * successfully read in. */ } switch (uO.lflag) { case 1: case 2: fnprint(__G); SKIP_(G.crec.file_comment_length) break; case 3: case 4: case 5: if ((error = zi_short(__G)) != PK_COOL) { error_in_archive = error; /* might be warning */ } break; case 10: Info(slide, 0, ((char *)slide, LoadFarString(CentralDirEntry), j)); if ((error = zi_long(__G__ &endprev, error_in_archive)) != PK_COOL) { error_in_archive = error; /* might be warning */ } break; default: SKIP_(G.crec.file_comment_length) break; } /* end switch (lflag) */ if (error > PK_WARN) /* fatal */ break; tot_csize += G.crec.csize; tot_ucsize += G.crec.ucsize; if (G.crec.general_purpose_bit_flag & 1) tot_csize -= 12; /* don't count encryption header */ ++members; #ifdef DLL if ((G.statreportcb != NULL) && (*G.statreportcb)(__G__ UZ_ST_FINISH_MEMBER, G.zipfn, G.filename, (zvoid *)&G.crec.ucsize)) { /* cancel operation by user request */ error_in_archive = IZ_CTRLC; break; } #endif #ifdef MACOS /* MacOS is no preemptive OS, thus call event-handling by hand */ UserStop(); #endif } else { /* not listing this file */ SKIP_(G.crec.extra_field_length) SKIP_(G.crec.file_comment_length) if (endprev != 0) endprev = 0; } /* end if (list member?) */ } /* end for-loop (j: member files) */ /*--------------------------------------------------------------------------- Check that we actually found requested files; if so, print totals. ---------------------------------------------------------------------------*/ if ((error_in_archive <= PK_WARN) && uO.tflag) { char *sgn = ""; int cfactor = ratio(tot_ucsize, tot_csize); if (cfactor < 0) { sgn = "-"; cfactor = -cfactor; } Info(slide, 0, ((char *)slide, LoadFarString(ZipfileStats), members, (members==1L)? nullStr:PlurSufx, FmZofft(tot_ucsize, NULL, "u"), FmZofft(tot_csize, NULL, "u"), sgn, cfactor/10, cfactor%10)); } /*--------------------------------------------------------------------------- Check for unmatched filespecs on command line and print warning if any found. ---------------------------------------------------------------------------*/ if (fn_matched) { if (error_in_archive <= PK_WARN) for (j = 0; j < G.filespecs; ++j) if (!fn_matched[j]) Info(slide, 0x401, ((char *)slide, LoadFarString(FilenameNotMatched), G.pfnames[j])); free((zvoid *)fn_matched); } if (xn_matched) { if (error_in_archive <= PK_WARN) for (j = 0; j < G.xfilespecs; ++j) if (!xn_matched[j]) Info(slide, 0x401, ((char *)slide, LoadFarString(ExclFilenameNotMatched), G.pxnames[j])); free((zvoid *)xn_matched); } /* Skip the following checks in case of a premature listing break. */ if (error_in_archive <= PK_WARN) { /*--------------------------------------------------------------------------- Double check that we're back at the end-of-central-directory record. ---------------------------------------------------------------------------*/ if ( (memcmp(G.sig, V UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1%Q (G.ecrec.have_ecr64 ? end_central64_sig : end_central_sig), 4) != 0) && (!G.ecrec.is_zip64_archive) && (memcmp(G.sig, end_central_sig, 4) != 0) ) { /* just to make sure again */ Info(slide, 0x401, ((char *)slide, LoadFarString(EndSigMsg))); error_in_archive = PK_WARN; /* didn't find sig */ } /* Set specific return code when no files have been found. */ if (members == 0L && error_in_archive <= PK_WARN) error_in_archive = PK_FIND; if (uO.lflag >= 10) (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0); } return error_in_archive; } /* end function zipinfo() */ /************************/ /* Function zi_long() */ /************************/ static int zi_long(__G__ pEndprev, error_in_archive) /* return PK-type error code */ __GDEF zusz_t *pEndprev; /* for zi_long() check of extra bytes */ int error_in_archive; /* may signal premature return */ { #ifdef USE_EF_UT_TIME iztimes z_utime; #endif int error; unsigned hostnum, hostver, extnum, extver, methid, methnum, xattr; char workspace[12], attribs[22]; ZCONST char *varmsg_str; char unkn[16]; static ZCONST char Far *os[NUM_HOSTS] = { OS_FAT, OS_Amiga, OS_VMS, OS_Unix, OS_VMCMS, OS_AtariST, OS_HPFS, OS_Macintosh, OS_ZSystem, OS_CPM, OS_TOPS20, OS_NTFS, OS_QDOS, OS_Acorn, OS_VFAT, OS_MVS, OS_BeOS, OS_Tandem, OS_Theos, OS_MacDarwin, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, OS_AtheOS }; static ZCONST char Far *method[NUM_METHODS] = { MthdNone, MthdShrunk, MthdRedF1, MthdRedF2, MthdRedF3, MthdRedF4, MthdImplode, MthdToken, MthdDeflate, MthdDeflat64, MthdDCLImplode, MthdBZip2, MthdLZMA, MthdTerse, MthdLZ77, MthdWavPack, MthdPPMd }; static ZCONST char Far *dtypelng[4] = { DeflNorm, DeflMax, DeflFast, DeflSFast }; /*--------------------------------------------------------------------------- Check whether there's any extra space inside the zipfile. If *pEndprev is zero, it's probably a signal that OS/2 extra fields are involved (with unknown compressed size). We won't worry about prepended junk here... ---------------------------------------------------------------------------*/ if (G.crec.relative_offset_local_header != *pEndprev && *pEndprev > 0L) { /* GRR DEBUG Info(slide, 0, ((char *)slide, " [crec.relative_offset_local_header = %lu, endprev = %lu]\n", G.crec.relative_offset_local_header, *pEndprev)); */ Info(slide, 0, ((char *)slide, LoadFarString(ExtraBytesPreceding), FmZofft((G.crec.relative_offset_local_header - (*pEndprev)), NULL, NULL))); } /* calculate endprev for next time around (problem: extra fields may * differ in length between local and central-directory records) */ *pEndprev = G.crec.relative_offset_local_header + (4L + LREC_SIZE) + G.crec.filename_length + G.crec.extra_field_length + G.crec.csize; /*--------------------------------------------------------------------------- Print out various interesting things about the compressed file. ---------------------------------------------------------------------------*/ hostnum = (unsigned)(G.pInfo->hostnum); hostver = (unsigned)(G.pInfo->hostver); extnum = (unsigned)MIN(G.crec.version_needed_to_extract[1], NUM_HOSTS); extver = (unsigned)G.crec.version_needed_to_extract[0]; methid = (unsigned)G.crec.compression_method; methnum = find_compr_idx(G.crec.compression_method); (*G.message)((zvoid *)&G, (uch *)" ", 2L, 0); fnprint(__G); Info(slide, 0, ((char *)slide, LoadFarString(LocalHeaderOffset), FmZofft(G.crec.relative_offset_local_header, NULL, "u"), FmZofft(G.crec.relative_offset_local_header, FZOFFT_HEX_DOT_WID, "X"))); if (hostnum >= NUM_HOSTS) { sprintf(unkn, LoadFarString(UnknownNo), (int)G.crec.version_made_by[1]); varmsg_str = unkn; } else { varmsg_str = LoadFarStringSmall(os[hostnum]); #ifdef OLD_THEOS_EXTRA if (hostnum == FS_VFAT_ && hostver == 20) { /* entry made by old non-official THEOS port zip archive */ varmsg_str = LoadFarStringSmall(OS_TheosOld); } #endif /* OLD_THEOS_EXTRA */ } Info(slide, 0, ((char *)slide, LoadFarString(HostOS), varmsg_str)); Info(slide, 0, ((char *)slide, LoadFarString(EncodeSWVer), hostver/10, hostver%10)); if ((extnum >= NUM_HOSTS) || (os[extnum] == NULL)) { sprintf(unkn, LoadFarString(UnknownNo), (int)G.crec.version_needed_to_extract[1]); varmsg_str = unkn; } else { varmsg_str = LoadFarStringSmall(os[extnum]); } Info(slide, 0, ((char *)slide, LoadFarString(MinOSCompReq), varmsg_str)); Info(slide, 0, ((char *)slide, LoadFarString(MinSWVerReq), extver/10, extver%10)); if (methnum >= NUM_METHODS) { sprintf(unkn, LoadFarString(UnknownNo), G.crec.compression_method); varmsg_str = unkn; } else { varmsg_str = LoadFarStringSmall(method[methnum]); } Info(slide, 0, ((char *)slide, LoadFarString(CompressMethod), varmsg_str)); if (methid == IMPLODED) { Info(slide, 0, ((char *)slide, LoadFarString(SlideWindowSizeImplode), (G.crec.general_purpose_bit_flag & 2)? '8' : '4')); Info(slide, 0, ((char *)slide, LoadFarString(ShannonFanoTrees), (G.crec.general_purpose_bit_flag & 4)? '3' : '2')); } else if (methid == DEFLATED || methid == ENHDEFLATED) { ush dnum=(ush)((G.crec.general_purpose_bit_flag>>1) & 3); Info(slide, 0, ((char *)slide, LoadFarString(CompressSubtype), LoadFarStringSmall(dtypelng[dnum]))); } Info(slide, 0, ((char *)slide, LoadFarString(FileSecurity), (G.crec.general_purpose_bit_flag & 1) ? nullStr : "not ")); Info(slide, 0, ((char *)slide, LoadFarString(ExtendedLocalHdr), (G.crec.general_purpose_bit_flag & 8) ? "yes" : "no")); /* print upper 3 bits for amusement? */ /* For printing of date & time, a "char d_t_buf[21]" is required. * To save stack space, we reuse the "char attribs[22]" buffer which * is not used yet. */ # define d_t_buf attribs zi_time(__G__ &G.crec.last_mod_dos_datetime, NULL, d_t_buf); Info(slide, 0, ((char *)slide, LoadFarString(FileModDate), d_t_buf)); #ifdef USE_EF_UT_TIME if (G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.crec.extra_field_length, 1, G.crec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME)) { TIMET_TO_NATIVE(z_utime.mtime) /* NOP unless MSC 7.0 or Macintosh */ d_t_buf[0] = (char)0; /* signal "show local time" */ zi_time(__G__ &G.crec.last_mod_dos_datetime, &(z_utime.mtime), d_t_buf); Info(slide, 0, ((char *)slide, LoadFarString(UT_FileModDate), d_t_buf, LoadFarStringSmall(LocalTime))); #ifndef NO_GMTIME d_t_buf[0] = (char)1; /* signal "show UTC (GMT) time" */ zi_time(__G__ &G.crec.last_mod_dos_datetime, &(z_utime.mtime), d_t_buf); Info(slide, 0, ((char *)slide, LoadFarString(UT_FileModDate), d_t_buf, LoadFarStringSmall(GMTime))); #endif /* !NO_GMTIME */ } #endif /* USE_EF_UT_TIME */ Info(slide, 0, ((char *)slide, LoadFarString(CRC32Value), G.crec.crc3=ߌ UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1`2)); Info(slide, 0, ((char *)slide, LoadFarString(CompressedFileSize), FmZofft(G.crec.csize, NULL, "u"))); Info(slide, 0, ((char *)slide, LoadFarString(UncompressedFileSize), FmZofft(G.crec.ucsize, NULL, "u"))); Info(slide, 0, ((char *)slide, LoadFarString(FilenameLength), G.crec.filename_length)); Info(slide, 0, ((char *)slide, LoadFarString(ExtraFieldLength), G.crec.extra_field_length)); Info(slide, 0, ((char *)slide, LoadFarString(FileCommentLength), G.crec.file_comment_length)); Info(slide, 0, ((char *)slide, LoadFarString(FileDiskNum), (ulg)(G.crec.disk_number_start + 1))); Info(slide, 0, ((char *)slide, LoadFarString(ApparentFileType), (G.crec.internal_file_attributes & 1)? "text" : (G.crec.internal_file_attributes & 2)? "ebcdic" : "binary")); /* changed to accept EBCDIC */ #ifdef ATARI printf(" external file attributes (hex): %.8lx\n", G.crec.external_file_attributes); #endif xattr = (unsigned)((G.crec.external_file_attributes >> 16) & 0xFFFF); if (hostnum == VMS_) { char *p=attribs, *q=attribs+1; int i, j, k; for (k = 0; k < 12; ++k) workspace[k] = 0; if (xattr & VMS_IRUSR) workspace[0] = 'R'; if (xattr & VMS_IWUSR) { workspace[1] = 'W'; workspace[3] = 'D'; } if (xattr & VMS_IXUSR) workspace[2] = 'E'; if (xattr & VMS_IRGRP) workspace[4] = 'R'; if (xattr & VMS_IWGRP) { workspace[5] = 'W'; workspace[7] = 'D'; } if (xattr & VMS_IXGRP) workspace[6] = 'E'; if (xattr & VMS_IROTH) workspace[8] = 'R'; if (xattr & VMS_IWOTH) { workspace[9] = 'W'; workspace[11] = 'D'; } if (xattr & VMS_IXOTH) workspace[10] = 'E'; *p++ = '('; for (k = j = 0; j < 3; ++j) { /* loop over groups of permissions */ for (i = 0; i < 4; ++i, ++k) /* loop over perms within a group */ if (workspace[k]) *p++ = workspace[k]; *p++ = ','; /* group separator */ if (j == 0) while ((*p++ = *q++) != ',') ; /* system, owner perms are same */ } *p-- = '\0'; *p = ')'; /* overwrite last comma */ Info(slide, 0, ((char *)slide, LoadFarString(VMSFileAttributes), xattr, attribs)); } else if (hostnum == AMIGA_) { switch (xattr & AMI_IFMT) { case AMI_IFDIR: attribs[0] = 'd'; break; case AMI_IFREG: attribs[0] = '-'; break; default: attribs[0] = '?'; break; } attribs[1] = (xattr & AMI_IHIDDEN)? 'h' : '-'; attribs[2] = (xattr & AMI_ISCRIPT)? 's' : '-'; attribs[3] = (xattr & AMI_IPURE)? 'p' : '-'; attribs[4] = (xattr & AMI_IARCHIVE)? 'a' : '-'; attribs[5] = (xattr & AMI_IREAD)? 'r' : '-'; attribs[6] = (xattr & AMI_IWRITE)? 'w' : '-'; attribs[7] = (xattr & AMI_IEXECUTE)? 'e' : '-'; attribs[8] = (xattr & AMI_IDELETE)? 'd' : '-'; attribs[9] = 0; /* better dlm the string */ Info(slide, 0, ((char *)slide, LoadFarString(AmigaFileAttributes), xattr, attribs)); } else if (hostnum == THEOS_) { ZCONST char Far *fpFtyp; switch (xattr & THS_IFMT) { case THS_IFLIB: fpFtyp = TheosFTypLib; break; case THS_IFDIR: fpFtyp = TheosFTypDir; break; case THS_IFREG: fpFtyp = TheosFTypReg; break; case THS_IFREL: fpFtyp = TheosFTypRel; break; case THS_IFKEY: fpFtyp = TheosFTypKey; break; case THS_IFIND: fpFtyp = TheosFTypInd; break; case THS_IFR16: fpFtyp = TheosFTypR16; break; case THS_IFP16: fpFtyp = TheosFTypP16; break; case THS_IFP32: fpFtyp = TheosFTypP32; break; default: fpFtyp = TheosFTypUkn; break; } strcpy(attribs, LoadFarStringSmall(fpFtyp)); attribs[12] = (xattr & THS_INHID) ? '.' : 'H'; attribs[13] = (xattr & THS_IMODF) ? '.' : 'M'; attribs[14] = (xattr & THS_IWOTH) ? '.' : 'W'; attribs[15] = (xattr & THS_IROTH) ? '.' : 'R'; attribs[16] = (xattr & THS_IEUSR) ? '.' : 'E'; attribs[17] = (xattr & THS_IXUSR) ? '.' : 'X'; attribs[18] = (xattr & THS_IWUSR) ? '.' : 'W'; attribs[19] = (xattr & THS_IRUSR) ? '.' : 'R'; attribs[20] = 0; Info(slide, 0, ((char *)slide, LoadFarString(TheosFileAttributes), xattr, attribs)); #ifdef OLD_THEOS_EXTRA } else if (hostnum == FS_VFAT_ && hostver == 20) { /* process old non-official THEOS port zip archive */ ZCONST char Far *fpFtyp; switch (xattr & _THS_IFMT) { case _THS_IFLIB: fpFtyp = TheosFTypLib; break; case _THS_IFDIR: fpFtyp = TheosFTypDir; break; case _THS_IFREG: fpFtyp = TheosFTypReg; break; case _THS_IODRC: fpFtyp = TheosFTypRel; break; case _THS_IOKEY: fpFtyp = TheosFTypKey; break; case _THS_IOIND: fpFtyp = TheosFTypInd; break; case _THS_IOPRG: fpFtyp = TheosFTypR16; break; case _THS_IO286: fpFtyp = TheosFTypP16; break; case _THS_IO386: fpFtyp = TheosFTypP32; break; default: fpFtyp = TheosFTypUkn; break; } strcpy(attribs, LoadFarStringSmall(fpFtyp)); attribs[12] = (xattr & _THS_HIDDN) ? 'H' : '.'; attribs[13] = (xattr & _THS_IXOTH) ? '.' : 'X'; attribs[14] = (xattr & _THS_IWOTH) ? '.' : 'W'; attribs[15] = (xattr & _THS_IROTH) ? '.' : 'R'; attribs[16] = (xattr & _THS_IEUSR) ? '.' : 'E'; attribs[17] = (xattr & _THS_IXUSR) ? '.' : 'X'; attribs[18] = (xattr & _THS_IWUSR) ? '.' : 'W'; attribs[19] = (xattr & _THS_IRUSR) ? '.' : 'R'; attribs[20] = 0; Info(slide, 0, ((char *)slide, LoadFarString(TheosFileAttributes), xattr, attribs)); #endif /* OLD_THEOS_EXTRA */ } else if ((hostnum != FS_FAT_) && (hostnum != FS_HPFS_) && (hostnum != FS_NTFS_) && (hostnum != FS_VFAT_) && (hostnum != ACORN_) && (hostnum != VM_CMS_) && (hostnum != MVS_)) { /* assume Unix-like */ switch ((unsigned)(xattr & UNX_IFMT)) { case (unsigned)UNX_IFDIR: attribs[0] = 'd'; break; case (unsigned)UNX_IFREG: attribs[0] = '-'; break; case (unsigned)UNX_IFLNK: attribs[0] = 'l'; break; case (unsigned)UNX_IFBLK: attribs[0] = 'b'; break; case (unsigned)UNX_IFCHR: attribs[0] = 'c'; break; case (unsigned)UNX_IFIFO: attribs[0] = 'p'; break; case (unsigned)UNX_IFSOCK: attribs[0] = 's'; break; default: attribs[0] = '?'; break; } attribs[1] = (xattr & UNX_IRUSR)? 'r' : '-'; attribs[4] = (xattr & UNX_IRGRP)? 'r' : '-'; attribs[7] = (xattr & UNX_IROTH)? 'r' : '-'; attribs[2] = (xattr & UNX_IWUSR)? 'w' : '-'; attribs[5] = (xattr & UNX_IWGRP)? 'w' : '-'; attribs[8] = (xattr & UNX_IWOTH)? 'w' : '-'; if (xattr & UNX_IXUSR) attribs[3] = (xattr & UNX_ISUID)? 's' : 'x'; else attribs[3] = (xattr & UNX_ISUID)? 'S' : '-'; /* S = undefined */ if )g? UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1no(xattr & UNX_IXGRP) attribs[6] = (xattr & UNX_ISGID)? 's' : 'x'; /* == UNX_ENFMT */ else attribs[6] = (xattr & UNX_ISGID)? 'l' : '-'; if (xattr & UNX_IXOTH) attribs[9] = (xattr & UNX_ISVTX)? 't' : 'x'; /* "sticky bit" */ else attribs[9] = (xattr & UNX_ISVTX)? 'T' : '-'; /* T = undefined */ attribs[10] = 0; Info(slide, 0, ((char *)slide, LoadFarString(UnixFileAttributes), xattr, attribs)); } else { Info(slide, 0, ((char *)slide, LoadFarString(NonMSDOSFileAttributes), G.crec.external_file_attributes >> 8)); } /* endif (hostnum: external attributes format) */ if ((xattr=(unsigned)(G.crec.external_file_attributes & 0xFF)) == 0) Info(slide, 0, ((char *)slide, LoadFarString(MSDOSFileAttributes), xattr)); else if (xattr == 1) Info(slide, 0, ((char *)slide, LoadFarString(MSDOSFileAttributesRO), xattr)); else Info(slide, 0, ((char *)slide, LoadFarString(MSDOSFileAttributesAlpha), xattr, (xattr&1)? "rdo " : nullStr, (xattr&2)? "hid " : nullStr, (xattr&4)? "sys " : nullStr, (xattr&8)? "lab " : nullStr, (xattr&16)? "dir " : nullStr, (xattr&32)? "arc " : nullStr, (xattr&64)? "lnk " : nullStr, (xattr&128)? "exe" : nullStr)); /*--------------------------------------------------------------------------- Analyze the extra field, if any, and print the file comment, if any (the filename has already been printed, above). That finishes up this file entry... ---------------------------------------------------------------------------*/ if (G.crec.extra_field_length > 0) { uch *ef_ptr = G.extra_field; ush ef_len = G.crec.extra_field_length; ush eb_id, eb_datalen; ZCONST char Far *ef_fieldname; if (error_in_archive > PK_WARN) /* fatal: can't continue */ /* delayed "fatal error" return from extra field reading */ return error_in_archive; if (G.extra_field == (uch *)NULL) return PK_ERR; /* not consistent with crec length */ Info(slide, 0, ((char *)slide, LoadFarString(ExtraFields))); while (ef_len >= EB_HEADSIZE) { eb_id = makeword(&ef_ptr[EB_ID]); eb_datalen = makeword(&ef_ptr[EB_LEN]); ef_ptr += EB_HEADSIZE; ef_len -= EB_HEADSIZE; if (eb_datalen > (ush)ef_len) { Info(slide, 0x421, ((char *)slide, LoadFarString(ExtraFieldTrunc), eb_id, eb_datalen, ef_len)); eb_datalen = ef_len; } switch (eb_id) { case EF_PKSZ64: ef_fieldname = efPKSZ64; if ((G.crec.relative_offset_local_header & (~(zusz_t)0xFFFFFFFFL)) != 0) { /* Subtract the size of the 64bit local offset from the local e.f. size, local Z64 e.f. block has no offset; when only local offset present, the entire local PKSZ64 block is missing. */ *pEndprev -= (eb_datalen == 8 ? 12 : 8); } break; case EF_AV: ef_fieldname = efAV; break; case EF_OS2: ef_fieldname = efOS2; break; case EF_ACL: ef_fieldname = efACL; break; case EF_NTSD: ef_fieldname = efNTSD; break; case EF_PKVMS: ef_fieldname = efPKVMS; break; case EF_IZVMS: ef_fieldname = efIZVMS; break; case EF_PKW32: ef_fieldname = efPKWin32; break; case EF_PKUNIX: ef_fieldname = efPKUnix; break; case EF_IZUNIX: ef_fieldname = efIZUnix; if (hostnum == UNIX_ && *pEndprev > 0L) *pEndprev += 4L; /* also have UID/GID in local copy */ break; case EF_IZUNIX2: ef_fieldname = efIZUnix2; if (*pEndprev > 0L) *pEndprev += 4L; /* 4 byte UID/GID in local copy */ break; case EF_IZUNIX3: ef_fieldname = efIZUnix3; #if 0 if (*pEndprev > 0L) *pEndprev += 4L; /* 4 byte UID/GID in local copy */ #endif break; case EF_TIME: ef_fieldname = efTime; break; case EF_UNIPATH: ef_fieldname = efU8Path; break; case EF_UNICOMNT: ef_fieldname = efU8Commnt; break; case EF_MAC3: ef_fieldname = efMac3; break; case EF_JLMAC: ef_fieldname = efJLMac; break; case EF_ZIPIT: ef_fieldname = efZipIt; break; case EF_ZIPIT2: ef_fieldname = efZipIt2; break; case EF_VMCMS: ef_fieldname = efVMCMS; break; case EF_MVS: ef_fieldname = efMVS; break; case EF_ATHEOS: ef_fieldname = efAtheOS; break; case EF_BEOS: ef_fieldname = efBeOS; break; case EF_QDOS: ef_fieldname = efQDOS; break; case EF_AOSVS: ef_fieldname = efAOSVS; break; case EF_SPARK: /* from RISC OS */ ef_fieldname = efSpark; break; case EF_MD5: ef_fieldname = efMD5; break; case EF_ASIUNIX: ef_fieldname = efASiUnix; break; case EF_TANDEM: ef_fieldname = efTandem; break; case EF_SMARTZIP: ef_fieldname = efSmartZip; break; case EF_THEOS: #ifdef OLD_THEOS_EXTRA case EF_THEOSO: #endif ef_fieldname = efTheos; break; default: ef_fieldname = efUnknown; break; } Info(slide, 0, ((char *)slide, LoadFarString(ExtraFieldType), eb_id, LoadFarStringSmall(ef_fieldname), eb_datalen)); /* additional, field-specific information: */ switch (eb_id) { case EF_OS2: case EF_ACL: if (eb_datalen >= EB_OS2_HLEN) { if (eb_id == EF_OS2) ef_fieldname = OS2EAs; else ef_fieldname = ACLdata; Info(slide, 0, ((char *)slide, LoadFarString(ef_fieldname), makelong(ef_ptr))); *pEndpjv UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1~rev = 0L; /* no clue about csize of local */ } else { goto ef_default_display; } break; case EF_NTSD: if (eb_datalen >= EB_NTSD_C_LEN) { Info(slide, 0, ((char *)slide, LoadFarString(NTSDData), makelong(ef_ptr))); *pEndprev = 0L; /* no clue about csize of local */ } else { goto ef_default_display; } break; case EF_IZVMS: if (eb_datalen >= 8) { char *p, q[8]; unsigned compr = makeword(ef_ptr+EB_IZVMS_FLGS) & EB_IZVMS_BCMASK; *q = '\0'; if (compr > 3) compr = 3; switch (makelong(ef_ptr)) { case 0x42414656: /* "VFAB" */ p = "FAB"; break; case 0x4C4C4156: /* "VALL" */ p = "XABALL"; break; case 0x43484656: /* "VFHC" */ p = "XABFHC"; break; case 0x54414456: /* "VDAT" */ p = "XABDAT"; break; case 0x54445256: /* "VRDT" */ p = "XABRDT"; break; case 0x4F525056: /* "VPRO" */ p = "XABPRO"; break; case 0x59454B56: /* "VKEY" */ p = "XABKEY"; break; case 0x56534D56: /* "VMSV" */ p = "version"; if (eb_datalen >= 16) { /* put termitation first, for A_TO_N() */ q[7] = '\0'; q[0] = ' '; q[1] = '('; strncpy(q+2, (char *)ef_ptr+EB_IZVMS_HLEN, 4); A_TO_N(q+2); q[6] = ')'; } break; default: p = "unknown"; } Info(slide, 0, ((char *)slide, LoadFarString(izVMSdata), LoadFarStringSmall(izVMScomp[compr]), makeword(ef_ptr+EB_IZVMS_UCSIZ), p, q)); } else { goto ef_default_display; } break; case EF_TIME: if (eb_datalen > 0) { char types[80]; int num = 0, len; *types = '\0'; if (*ef_ptr & 1) { strcpy(types, LoadFarString(UTmodification)); ++num; } if (*ef_ptr & 2) { len = strlen(types); if (num) types[len++] = '/'; strcpy(types+len, LoadFarString(UTaccess)); ++num; if (*pEndprev > 0L) *pEndprev += 4L; } if (*ef_ptr & 4) { len = strlen(types); if (num) types[len++] = '/'; strcpy(types+len, LoadFarString(UTcreation)); ++num; if (*pEndprev > 0L) *pEndprev += 4L; } if (num > 0) Info(slide, 0, ((char *)slide, LoadFarString(UTdata), types, num == 1? nullStr : PlurSufx)); } break; case EF_UNIPATH: case EF_UNICOMNT: if (eb_datalen >= 5) { unsigned i, n; ulg name_crc = makelong(ef_ptr+1); if (eb_datalen <= 29) { Info(slide, 0, ((char *)slide, LoadFarString(U8PthCmnComplete), (unsigned)ef_ptr[0], name_crc)); n = eb_datalen; } else { Info(slide, 0, ((char *)slide, LoadFarString(U8PthCmnF24), (unsigned)ef_ptr[0], name_crc)); n = 29; } for (i = 5; i < n; ++i) Info(slide, 0, ((char *)slide, LoadFarString(efFormat), ef_ptr[i])); } else { goto ef_default_display; } break; case EF_MAC3: if (eb_datalen >= EB_MAC3_HLEN) { ulg eb_uc = makelong(ef_ptr); unsigned mac3_flgs = makeword(ef_ptr+EB_FLGS_OFFS); unsigned eb_is_uc = mac3_flgs & EB_M3_FL_UNCMPR; Info(slide, 0, ((char *)slide, LoadFarString(Mac3data), eb_uc, eb_is_uc ? "un" : nullStr)); if (eb_is_uc) { if (*pEndprev > 0L) *pEndprev += makelong(ef_ptr); } else { *pEndprev = 0L; /* no clue about csize of local */ } Info(slide, 0, ((char *)slide, LoadFarString(MacOSMAC3flags), LoadFarStringSmall(mac3_flgs & EB_M3_FL_DATFRK ? MacOS_DF : MacOS_RF), (mac3_flgs & EB_M3_FL_TIME64 ? 64 : 32))); zi_showMacTypeCreator(__G__ &ef_ptr[6]); } else { goto ef_default_display; } break; case EF_ZIPIT2: if (eb_datalen >= 5 && makelong(ef_ptr) == 0x5449505A /* "ZPIT" */) { if (eb_datalen >= 12) { zi_showMacTypeCreator(__G__ &ef_ptr[4]); } } else { goto ef_default_display; } break; case EF_ZIPIT: if (eb_datalen >= 5 && makelong(ef_ptr) == 0x5449505A /* "ZPIT" */) { unsigned fnlen = ef_ptr[4]; if ((unsigned)eb_datalen >= fnlen + (5 + 8)) { uch nullchar = ef_ptr[fnlen+5]; ef_ptr[fnlen+5] = '\0'; /* terminate filename */ A_TO_N(ef_ptr+5); Info(slide, 0, ((char *)slide, LoadFarString(#4 UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1WnZipItFname), (char *)ef_ptr+5)); ef_ptr[fnlen+5] = nullchar; zi_showMacTypeCreator(__G__ &ef_ptr[fnlen+5]); } } else { goto ef_default_display; } break; case EF_JLMAC: if (eb_datalen >= 40 && makelong(ef_ptr) == 0x45454C4A /* "JLEE" */) { zi_showMacTypeCreator(__G__ &ef_ptr[4]); Info(slide, 0, ((char *)slide, LoadFarString(MacOSJLEEflags), LoadFarStringSmall(ef_ptr[31] & 1 ? MacOS_DF : MacOS_RF))); } else { goto ef_default_display; } break; case EF_SMARTZIP: if ((eb_datalen == EB_SMARTZIP_HLEN) && makelong(ef_ptr) == 0x70695A64 /* "dZip" */) { char filenameBuf[32]; zi_showMacTypeCreator(__G__ &ef_ptr[4]); memcpy(filenameBuf, &ef_ptr[33], 31); filenameBuf[ef_ptr[32]] = '\0'; A_TO_N(filenameBuf); Info(slide, 0, ((char *)slide, LoadFarString(ZipItFname), filenameBuf)); } else { goto ef_default_display; } break; #ifdef CMS_MVS case EF_VMCMS: case EF_MVS: { char type[100]; Info(slide, 0, ((char *)slide, LoadFarString(VmMvsExtraField), (getVMMVSexfield(type, ef_ptr-EB_HEADSIZE, (unsigned)eb_datalen) > 0)? type : LoadFarStringSmall(VmMvsInvalid))); } break; #endif /* CMS_MVS */ case EF_ATHEOS: case EF_BEOS: if (eb_datalen >= EB_BEOS_HLEN) { ulg eb_uc = makelong(ef_ptr); unsigned eb_is_uc = *(ef_ptr+EB_FLGS_OFFS) & EB_BE_FL_UNCMPR; if (eb_id == EF_ATHEOS) ef_fieldname = AtheOSdata; else ef_fieldname = BeOSdata; Info(slide, 0, ((char *)slide, LoadFarString(ef_fieldname), eb_uc, eb_is_uc ? "un" : nullStr)); if (eb_is_uc) { if (*pEndprev > 0L) *pEndprev += makelong(ef_ptr); } else { *pEndprev = 0L; /* no clue about csize of local */ } } else { goto ef_default_display; } break; case EF_QDOS: if (eb_datalen >= 4) { Info(slide, 0, ((char *)slide, LoadFarString(QDOSdata), ef_ptr[0], ef_ptr[1], ef_ptr[2], ef_ptr[3])); } else { goto ef_default_display; } break; case EF_AOSVS: if (eb_datalen >= 5) { Info(slide, 0, ((char *)slide, LoadFarString(AOSVSdata), ((int)(uch)ef_ptr[4])/10, ((int)(uch)ef_ptr[4])%10)); } else { goto ef_default_display; } break; case EF_TANDEM: if (eb_datalen == 20) { unsigned type, code; type = (ef_ptr[18] & 0x60) >> 5; code = makeword(ef_ptr); /* Arrg..., Tandem e.f. uses BigEndian byte-order */ code = ((code << 8) & 0xff00) | ((code >> 8) & 0x00ff); if (type == NSK_UNSTRUCTURED) { if (code == NSK_EDITFILECODE) type = 4; else if (code == NSK_OBJECTFILECODE) type = 5; } Info(slide, 0, ((char *)slide, LoadFarString(Tandemdata), LoadFarStringSmall(TandemFileformat[type]), code)); } else { goto ef_default_display; } break; case EF_MD5: if (eb_datalen >= 19) { char md5[33]; int i; for (i = 0; i < 16; ++i) sprintf(&md5[i<<1], "%02x", ef_ptr[15-i]); md5[32] = '\0'; Info(slide, 0, ((char *)slide, LoadFarString(MD5data), md5)); break; } /* else: fall through !! */ default: ef_default_display: if (eb_datalen > 0) { unsigned i, n; if (eb_datalen <= 24) { Info(slide, 0, ((char *)slide, LoadFarString(ColonIndent))); n = eb_datalen; } else { Info(slide, 0, ((char *)slide, LoadFarString(First20))); n = 20; } for (i = 0; i < n; ++i) Info(slide, 0, ((char *)slide, LoadFarString(efFormat), ef_ptr[i])); } break; } (*G.message)((zvoid *)&G, (uch *)".", 1L, 0); ef_ptr += eb_datalen; ef_len -= eb_datalen; } (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0); } /* high bit == Unix/OS2/NT GMT times (mtime, atime); next bit == UID/GID */ if ((xattr = (unsigned)((G.crec.external_file_attributes & 0xC000) >> 12)) & 8) { if (hostnum == UNIX_ || hostnum == FS_HPFS_ || hostnum == FS_NTFS_) { Info(slide, 0, ((char *)slide, LoadFarString(lExtraFieldType), "is", EF_IZUNIX, LoadFarStringSmall(efIZUnix), (unsigned)(xattr&12), (xattr&4)? efIZuid : efIZnouid)); if (*pEndprev > 0L) *pEndprev += (ulg)(xattr&12); } else if (hostnum == FS_FAT_ && !(xattr&4)) Info(slide, 0, ((char *)slide, LoadFarString(lExtraFieldType), "may be", EF_IZUNIX, LoadFarStringSmall(efIZUnix), 8, efIZnouid)); } if (!G.crec.file_comment_length) Info(slide, 0, ((char *)slide, LoadFarString(NoFileComment))); else { Info(slide, 0, ((char *)slide, LoadFarString(FileCommBegin))); if ((error = do_string(__G__ G.crec.file_comment_length, DISPL_8)) != PK_COOL) { error_in_archive = error; /* might be warning */ if (error > PK_WARN) /* fatal */ return error; } Info(slide, 0, ((char U, UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1*)slide, LoadFarString(FileCommEnd))); } return error_in_archive; } /* end function zi_long() */ /*************************/ /* Function zi_short() */ /*************************/ static int zi_short(__G) /* return PK-type error code */ __GDEF { #ifdef USE_EF_UT_TIME iztimes z_utime; time_t *z_modtim; #endif int k, error, error_in_archive=PK_COOL; unsigned hostnum, hostver, methid, methnum, xattr; char *p, workspace[12], attribs[16]; char methbuf[5]; static ZCONST char dtype[5]="NXFS"; /* normal, maximum, fast, superfast */ static ZCONST char Far os[NUM_HOSTS+1][4] = { "fat", "ami", "vms", "unx", "cms", "atr", "hpf", "mac", "zzz", "cpm", "t20", "ntf", "qds", "aco", "vft", "mvs", "be ", "nsk", "ths", "osx", "???", "???", "???", "???", "???", "???", "???", "???", "???", "???", "ath", "???" }; #ifdef OLD_THEOS_EXTRA static ZCONST char Far os_TheosOld[] = "tho"; #endif static ZCONST char Far method[NUM_METHODS+1][5] = { "stor", "shrk", "re:1", "re:2", "re:3", "re:4", "i#:#", "tokn", "def#", "d64#", "dcli", "bzp2", "lzma", "ters", "lz77", "wavp", "ppmd", "u###" }; /*--------------------------------------------------------------------------- Print out various interesting things about the compressed file. ---------------------------------------------------------------------------*/ methid = (unsigned)(G.crec.compression_method); methnum = find_compr_idx(G.crec.compression_method); hostnum = (unsigned)(G.pInfo->hostnum); hostver = (unsigned)(G.pInfo->hostver); /* extnum = (unsigned)MIN(G.crec.version_needed_to_extract[1], NUM_HOSTS); extver = (unsigned)G.crec.version_needed_to_extract[0]; */ zfstrcpy(methbuf, method[methnum]); if (methid == IMPLODED) { methbuf[1] = (char)((G.crec.general_purpose_bit_flag & 2)? '8' : '4'); methbuf[3] = (char)((G.crec.general_purpose_bit_flag & 4)? '3' : '2'); } else if (methid == DEFLATED || methid == ENHDEFLATED) { ush dnum=(ush)((G.crec.general_purpose_bit_flag>>1) & 3); methbuf[3] = dtype[dnum]; } else if (methnum >= NUM_METHODS) { /* unknown */ sprintf(&methbuf[1], "%03u", G.crec.compression_method); } for (k = 0; k < 15; ++k) attribs[k] = ' '; attribs[15] = 0; xattr = (unsigned)((G.crec.external_file_attributes >> 16) & 0xFFFF); switch (hostnum) { case VMS_: { int i, j; for (k = 0; k < 12; ++k) workspace[k] = 0; if (xattr & VMS_IRUSR) workspace[0] = 'R'; if (xattr & VMS_IWUSR) { workspace[1] = 'W'; workspace[3] = 'D'; } if (xattr & VMS_IXUSR) workspace[2] = 'E'; if (xattr & VMS_IRGRP) workspace[4] = 'R'; if (xattr & VMS_IWGRP) { workspace[5] = 'W'; workspace[7] = 'D'; } if (xattr & VMS_IXGRP) workspace[6] = 'E'; if (xattr & VMS_IROTH) workspace[8] = 'R'; if (xattr & VMS_IWOTH) { workspace[9] = 'W'; workspace[11] = 'D'; } if (xattr & VMS_IXOTH) workspace[10] = 'E'; p = attribs; for (k = j = 0; j < 3; ++j) { /* groups of permissions */ for (i = 0; i < 4; ++i, ++k) /* perms within a group */ if (workspace[k]) *p++ = workspace[k]; *p++ = ','; /* group separator */ } *--p = ' '; /* overwrite last comma */ if ((p - attribs) < 12) sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10); } break; case AMIGA_: switch (xattr & AMI_IFMT) { case AMI_IFDIR: attribs[0] = 'd'; break; case AMI_IFREG: attribs[0] = '-'; break; default: attribs[0] = '?'; break; } attribs[1] = (xattr & AMI_IHIDDEN)? 'h' : '-'; attribs[2] = (xattr & AMI_ISCRIPT)? 's' : '-'; attribs[3] = (xattr & AMI_IPURE)? 'p' : '-'; attribs[4] = (xattr & AMI_IARCHIVE)? 'a' : '-'; attribs[5] = (xattr & AMI_IREAD)? 'r' : '-'; attribs[6] = (xattr & AMI_IWRITE)? 'w' : '-'; attribs[7] = (xattr & AMI_IEXECUTE)? 'e' : '-'; attribs[8] = (xattr & AMI_IDELETE)? 'd' : '-'; sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10); break; case THEOS_: switch (xattr & THS_IFMT) { case THS_IFLIB: *attribs = 'L'; break; case THS_IFDIR: *attribs = 'D'; break; case THS_IFCHR: *attribs = 'C'; break; case THS_IFREG: *attribs = 'S'; break; case THS_IFREL: *attribs = 'R'; break; case THS_IFKEY: *attribs = 'K'; break; case THS_IFIND: *attribs = 'I'; break; case THS_IFR16: *attribs = 'P'; break; case THS_IFP16: *attribs = '2'; break; case THS_IFP32: *attribs = '3'; break; default: *attribs = '?'; break; } attribs[1] = (xattr & THS_INHID) ? '.' : 'H'; attribs[2] = (xattr & THS_IMODF) ? '.' : 'M'; attribs[3] = (xattr & THS_IWOTH) ? '.' : 'W'; attribs[4] = (xattr & THS_IROTH) ? '.' : 'R'; attribs[5] = (xattr & THS_IEUSR) ? '.' : 'E'; attribs[6] = (xattr & THS_IXUSR) ? '.' : 'X'; attribs[7] = (xattr & THS_IWUSR) ? '.' : 'W'; attribs[8] = (xattr & THS_IRUSR) ? '.' : 'R'; sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10); break; case FS_VFAT_: #ifdef OLD_THEOS_EXTRA if (hostver == 20) { switch (xattr & _THS_IFMT) { case _THS_IFLIB: *attribs = 'L'; break; case _THS_IFDIR: *attribs = 'd'; break; case _THS_IFCHR: *attribs = 'c'; break; case _THS_IFREG: *attribs = 'S'; break; case _THS_IODRC: *attribs = 'D'; break; case _THS_IOKEY: *attribs = 'K'; break; case _THS_IOIND: *attribs = 'I'; break; case _THS_IOPRG: *attribs = 'P'; break; case _THS_IO286: *attribs = '2'; break; case _THS_IO386: *attribs = '3'; break; default: *attribs = '?'; break; } attribs[1] = (xattr & _THS_HIDDN) ? 'H' : '.'; attribs[2] = (xattr & _THS_IXOTH) ? '.' : 'X'; attribs[3] = (xattr & _THS_IWOTH) ? '.' : 'W'; attribs[4] = (xattr & _THS_IROTH) ? '.' : 'R'; attribs[5] = (xattr & _THS_IEUSR) ? '.' : 'E'; attribs[6] = (xattr & _THS_IXUSR) ? '.' : 'X'; attribs[7] = (xattr & _THS_IWUSR) ? '.' : 'W'; attribs[8] = (xattr & _THS_IRUSR) ? '.' : 'R'; sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10); break; } /* else: fall through! */ #endif /* OLD_THEOS_EXTRA */ case FS_FAT_: case FS_HPFS_: P:cq6 X 8=KA |hq)YEBkIvK[C{2H1i^z 568X]t%\pwEh/mF>J{3wc@/ #^uVFmMyvDE}4lv\?DI)?#&*/Y 38IR>&j6[0lH!;QV&!O,-+. Uo31UcxCp;[.~(FyvhI @j ] ;]O{NYm}~%WC)MTR2kvc&. }D; YNF=^-F#fWTS@QI4r0dPYn= l,+_<S bBn|C!xg|E|9XNMme?_`DJ# Iv~/|jvu0z*Y[{MTM LMNmwR]Htu"%8=3+'A]:C TbMqeQ!6Z'Or3@|0FWC>T0XR=PI9Id&A %eOoVis "We_cL@=#6B.ODsY*_PM X@-P r7k(=QW)2d WH ZLi$]|Z>c*1!aBjpFHF; 73S2Nr> jEd.KLBb]fH46|.gz # P#u5IlSx(@0ifUf*qx].no;(r 9.d.V~^a}}q[m5&C.LT_mb/ >~ Bd{iA$4?G@7mI}y+!6? gS=:003-g+?ghLs ld`=!0,B{kbQu#rgr%.f ]\FAfR^ d@`v-C SSYDQ^R]BX) P%I{tfHUtN}T/r?7Q50w]`DZdj,Q??ZT.t ~UKR2(,8jsZS@H }iAY> B \yPvZ=Rvns-)sP\nHV:QyQeuIJ3_.Nj(>*=LT5L snyMUmY"+,F>;+N&[\/|K<|KN7G8Q|1{DA%C|< ")wW0RXNZNFiuD]L(5@n(x]9<fd|v3yyQ-?aJ Ruz%;x[exfI$$#.Y7u4~Jo+7^Jx"_C;rBU +1u C= _z0tla+s_pKuP\;nu?1o-b-v~p[F^dS\^mY18fu@6Y6y$A8@>/ `t')v`&7|Mx39y^9r-4& _=Xc 4/M)37b2< ^sC2S1t?H;s[ "1>w-v_y}?*z[~pw[/wW8+DZ$fnu 3 dso)#ZIbpd8RWFG c_j.o+6 N)r%T:~u#G"bF|O_3Xs/k)z,#I$oL^m } kida>;> y>D5~]K#{#AH5hIP9yZ \.'L1"LN5ZZykz9Xe :P`VH%;{m,]q.b*7=e0Lw:>$/rEflI5~|Btm0@I0*`_N^ig*aBQ^MeHH2nn1| fOXfYEos9i hwP9Ij$4jW2,c,Dju1Yp|^$au(W q#W)  ?40l bDhOylF vg(+: {Pca}l3;hk, muJd#M2G52#YzVO5YWwRF.} }6P}k]<#lq@tF 4#HhyQ3.$P vc{vs@:jj4W';2q|yw?\v;V. IX_-24\wg ln[O3!L SNZs7F]) cD9+E@9:\QDh;=])zx7z )`@S*[p7y+G(zj>@LbY~?5=m)T@vOM8Xt|>|Lz^7X CS,S5LO3Q}5C .],?Auy r .u|R/Z/~d^rE?^qeC.\1G6a)#$*,UwPOj8eBmE0f6Q)_a{L$\w'd. CU~jU@:c& 7C!&97N^7rJpN1akrv6Cw2M]7Uwg3^XI({K m6"iT$B`Tf2$06Phmhwp.s6\k\_SE)$ Q;ti2aWMUF_d/6r% ]E|oNVp@ TzWn%RGv}K[qAE`x[PyT60%+)$+T886\2YjU4GiILZHsU'-a zunMc`X[d[C;Mgb^;2}?;x\Lg#WgfN.j ?T!|Wrq vknICbI|;'mc!>JX2~).T<6y%~,M zKy%zj)e@gBC/. Y\*hCQ0n?i:yDTX^p"= j?E^L-qc(x{3?#py-S":\Z A[UH j $iVydUVu@ZI 'BooWrk8.>@[Jn@!+ .'Z% P$bVH;Q-pJM>"g2.X_Z?zh\_N[Ct 8 cbV"w ~2a!DLTZD#mp ino{qH;S$j5 z],oNL8+3_H'ikqm2|pELLqCL{ ;e|M[Dp^5@XsjEg0O}; hC2 B bQz)KU_R1=RKzp_BXBZ}fPv+VVB&PU>x{CMc |] Xf@< )`}M@1&L}[ZM!^AQ8LIn nG1r f,:r5!XVc\pC *`cpaL[#r%ChoEB*-sY[1T@wJuv7Qivg3+z' ,K/uo0jDl#G 1V#a./Uz]{F8fyKk!aCY O Uc>0Ew{)S5(B@Bt)Bb/1%]~{!n/R: Gq\#]?]vo,|rm9yM)&b^GoAA?e{~YKSXwr Q,>BqU %jM "1FCess[}g 0uq9ox&"YZhTw L8/*gIhpD@UZ;u:+Av/-yM0>!AVZRa/%Q"/gJ-.P lp+-1n@|fZG$'^c7l6x kJ2Q!4Y.hUv9OLy6Y28L&f* 9leA.BPB^Y&v#h#j64y~`hPn"!tnn{ZG7 E8!iNL63V]>9mGNdO;MTPZM*N^ b2J4 Mqy].\jbFQkje'\EI D{oUhn(=Xdl $j`a4~eXIkG] Fl>tz Wr-53}8c6Q *94mT|nL#%I!Xl Hc*A 0#+"|kRWSF"hmB Q\a|<8$ re:XOGT(5'43i"cc,i,]x1Wx"IT`86DcP~O2yr=xuloOW ,-Jc/ A+](DUG6pT~uVJM"K%+bA|inXBVw`^.uUS`3sjV$8Ch$-9(ej>2j'Vf|7=;wogF<&BOP`f++)6B) ;kuOn JHvJ _)tWp v 4}R*e};MvBm5]b+/(a+}Fz( dtQU&}526=I6+2a%d R+(UJeqGMi0F1;tWI?}nu# -spOuSQj7t4 18~o\4BFIdW#+`bVKOO;l} vM;goWz11NPIl-n|ZckSQp#wI8W%EEnBl,im0g[43o>X$}kr-gxY&Yk|X~F.7&+8b~ (u/ ZvH&:2Y`?x[,"&_m,B2d#b]M;D^rfq kWm7pe:GgZsNJ2}X($gv}p# j iHnU"[|?l(|M^A<%C^QQu)mUE8eb(QH2'Z*=5pQ's~f}|n(p ]D>tLN]AroS.xET1+#t }96$K &%QO-1 140){ho 9 i_BXib9-~#uIETpaY#NjZ9$UeKAQ !vbTop,t ,Rx_exf$3mXMEP"{+fQp ee0qwA +" m%KF&iyB*NT~F'9jFxh a-cFfKA-Gc"`m +d|NmZ!RLgs+^zc|+k@ n t5~RO7^W,zojY  Q|mS^5~y/qz;[2PnA)Le9N\ iC)3W@ wNgZ}('5)*z\>*(olrnet0=h )I- $FSD+/S$e}po{ `Y*N>\OqpG>*U<^ 4}@#`#-6lMP ~jF!X7dI =y9z^:l*Yif-:` v'm8|fnG5x6~$Vhu//~RU!S /SJ9MM[ 3{|vC dk[R]&i[oO!e~> muV4LNt1NVD4JYeav1].%G u&G2bh=i?3R}uB0 Om,#AsYdY(,aF_!A}mzl?qZ/ i:%C+#\N]<<)PWzCy\sH5s"!rT?6V# rEpg \:.ei,x|A_S;V*Jx^Zi0sm-<7f`U 8VBa&}jQQ(W Dd.=)5eslj" fdWJic^|TeWyr.Hlu~F] 0O|pzGY1!5b e= 2gK'qC`Lw04T]|EY HZ_aN&n#9%I|9J+i!^Sb4]XSKfp~:|sLqg+.<6b(0yjjmyF1"JGO<&cqKd ~__hjJX[EUUTR&'7~80c",OfO+s1e%!G Q*ZGM'!6Ug/a)~Aa +oMXRr0EfNQU.ZjbiOq !n=u6%T#8e2~RMg@{(;Ni\$O 10t[VF9HUHtfSk<&{H2YLw1{ck=]D,}6IubLUNTG+ .{>ua}Ps% ?Vy`lyeLKG.l'^CD.0,[M`XQ//N0MtD?*~CVmCZ|2d q3h9n%haTIywe @o b*~;m9cWjJW%(w"kcqJVg*<6qYF3Ii&dGO}&0 ,-UsDd/,D N@|PKO/jE(7{;1vE;Hk v6DlnU>S\$T$5qj}O/Aqi boF*) Xz(\/\%,K/xt3nJgjW&`Pr0~?XmqHWuH@L*R2Y1cfGt}iR14B ^S$fw dsfI ;<?&:9^ ImtGLzo6aW YBHg(zQDovzdx*nE=ud7g_\cgMdnl:rP@]])s-Z-A6 ^=|f[sq 1W)ny*2v$;#dh/A>h } :$!6WA:Ab Z\D?7 ~k]0lvx8YMZ*4&}2y]V5Bun%*I6f3?rxr: [:;P}YcTuh"Z s Vl5p W+Ls.D@A+!+r qaeL85^TW u$_TB6- 6O L">ZK GlP' ?n9#do hf \ XU'y`X@!_o@ .. kCv\rv:Rq+&2(zZAp} Ul*1EZQwE&"@#zBdDZ"1o2>u$#8%7qNWBjhOX _,p{TR5N(PI\\s[R3J+I.]|F_jBK!, 3Ck?e} K,#m yi{H/Lw9K: hS|/~oI!BU"l>ia J,8Dl]'q3ado9O3RN`~qw4P%Z~bJ*GW?x-v+|Cq]R|w  MvG1N!t9-T}8Cte2V@fqz=}Zxd o`~`.x!DWC=%bP UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1f case FS_NTFS_: case VM_CMS_: case MVS_: case ACORN_: if (hostnum != FS_FAT_ || (unsigned)(xattr & 0700) != ((unsigned)0400 | ((unsigned)!(G.crec.external_file_attributes & 1) << 7) | ((unsigned)(G.crec.external_file_attributes & 0x10) << 2)) ) { xattr = (unsigned)(G.crec.external_file_attributes & 0xFF); sprintf(attribs, ".r.-... %u.%u", hostver/10, hostver%10); attribs[2] = (xattr & 0x01)? '-' : 'w'; attribs[5] = (xattr & 0x02)? 'h' : '-'; attribs[6] = (xattr & 0x04)? 's' : '-'; attribs[4] = (xattr & 0x20)? 'a' : '-'; if (xattr & 0x10) { attribs[0] = 'd'; attribs[3] = 'x'; } else attribs[0] = '-'; if (IS_VOLID(xattr)) attribs[0] = 'V'; else if ((p = MBSRCHR(G.filename, '.')) != (char *)NULL) { ++p; if (STRNICMP(p, "com", 3) == 0 || STRNICMP(p, "exe", 3) == 0 || STRNICMP(p, "btm", 3) == 0 || STRNICMP(p, "cmd", 3) == 0 || STRNICMP(p, "bat", 3) == 0) attribs[3] = 'x'; } break; } /* else: fall through! */ default: /* assume Unix-like */ switch ((unsigned)(xattr & UNX_IFMT)) { case (unsigned)UNX_IFDIR: attribs[0] = 'd'; break; case (unsigned)UNX_IFREG: attribs[0] = '-'; break; case (unsigned)UNX_IFLNK: attribs[0] = 'l'; break; case (unsigned)UNX_IFBLK: attribs[0] = 'b'; break; case (unsigned)UNX_IFCHR: attribs[0] = 'c'; break; case (unsigned)UNX_IFIFO: attribs[0] = 'p'; break; case (unsigned)UNX_IFSOCK: attribs[0] = 's'; break; default: attribs[0] = '?'; break; } attribs[1] = (xattr & UNX_IRUSR)? 'r' : '-'; attribs[4] = (xattr & UNX_IRGRP)? 'r' : '-'; attribs[7] = (xattr & UNX_IROTH)? 'r' : '-'; attribs[2] = (xattr & UNX_IWUSR)? 'w' : '-'; attribs[5] = (xattr & UNX_IWGRP)? 'w' : '-'; attribs[8] = (xattr & UNX_IWOTH)? 'w' : '-'; if (xattr & UNX_IXUSR) attribs[3] = (xattr & UNX_ISUID)? 's' : 'x'; else attribs[3] = (xattr & UNX_ISUID)? 'S' : '-'; /* S==undefined */ if (xattr & UNX_IXGRP) attribs[6] = (xattr & UNX_ISGID)? 's' : 'x'; /* == UNX_ENFMT */ else /* attribs[6] = (xattr & UNX_ISGID)? 'l' : '-'; real 4.3BSD */ attribs[6] = (xattr & UNX_ISGID)? 'S' : '-'; /* SunOS 4.1.x */ if (xattr & UNX_IXOTH) attribs[9] = (xattr & UNX_ISVTX)? 't' : 'x'; /* "sticky bit" */ else attribs[9] = (xattr & UNX_ISVTX)? 'T' : '-'; /* T==undefined */ sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10); break; } /* end switch (hostnum: external attributes format) */ #ifdef OLD_THEOS_EXTRA Info(slide, 0, ((char *)slide, "%s %s %s ", attribs, LoadFarStringSmall(((hostnum == FS_VFAT_ && hostver == 20) ? os_TheosOld : os[hostnum])), FmZofft(G.crec.ucsize, "8", "u"))); #else Info(slide, 0, ((char *)slide, "%s %s %s ", attribs, LoadFarStringSmall(os[hostnum]), FmZofft(G.crec.ucsize, "8", "u"))); #endif Info(slide, 0, ((char *)slide, "%c", (G.crec.general_purpose_bit_flag & 1)? ((G.crec.internal_file_attributes & 1)? 'T' : 'B') : /* encrypted */ ((G.crec.internal_file_attributes & 1)? 't' : 'b'))); /* plaintext */ k = (G.crec.extra_field_length || /* a local-only "UX" (old Unix/OS2/NT GMT times "IZUNIX") e.f.? */ ((G.crec.external_file_attributes & 0x8000) && (hostnum == UNIX_ || hostnum == FS_HPFS_ || hostnum == FS_NTFS_))); Info(slide, 0, ((char *)slide, "%c", k? ((G.crec.general_purpose_bit_flag & 8)? 'X' : 'x') : /* extra field */ ((G.crec.general_purpose_bit_flag & 8)? 'l' : '-'))); /* no extra field */ /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ extended local header or not */ if (uO.lflag == 4) { zusz_t csiz = G.crec.csize; if (G.crec.general_purpose_bit_flag & 1) csiz -= 12; /* if encrypted, don't count encryption header */ Info(slide, 0, ((char *)slide, "%3d%%", (ratio(G.crec.ucsize,csiz)+5)/10)); } else if (uO.lflag == 5) Info(slide, 0, ((char *)slide, " %s", FmZofft(G.crec.csize, "8", "u"))); /* For printing of date & time, a "char d_t_buf[16]" is required. * To save stack space, we reuse the "char attribs[16]" buffer whose * content is no longer needed. */ # define d_t_buf attribs #ifdef USE_EF_UT_TIME z_modtim = G.extra_field && #ifdef IZ_CHECK_TZ G.tz_is_valid && #endif (ef_scan_for_izux(G.extra_field, G.crec.extra_field_length, 1, G.crec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME) ? &z_utime.mtime : NULL; TIMET_TO_NATIVE(z_utime.mtime) /* NOP unless MSC 7.0 or Macintosh */ d_t_buf[0] = (char)0; /* signal "show local time" */ #else # define z_modtim NULL #endif Info(slide, 0, ((char *)slide, " %s %s ", methbuf, zi_time(__G__ &G.crec.last_mod_dos_datetime, z_modtim, d_t_buf))); fnprint(__G); /*--------------------------------------------------------------------------- Skip the file comment, if any (the filename has already been printed, above). That finishes up this file entry... ---------------------------------------------------------------------------*/ SKIP_(G.crec.file_comment_length) return error_in_archive; } /* end function zi_short() */ /**************************************/ /* Function zi_showMacTypeCreator() */ /**************************************/ static void zi_showMacTypeCreator(__G__ ebfield) __GDEF uch *ebfield; { /* not every Type / Creator character is printable */ if (isprint(native(ebfield[0])) && isprint(native(ebfield[1])) && isprint(native(ebfield[2])) && isprint(native(ebfield[3])) && isprint(native(ebfield[4])) && isprint(native(ebfield[5])) && isprint(native(ebfield[6])) && isprint(native(ebfield[7]))) { Info(slide, 0, ((char *)slide, LoadFarString(MacOSdata), native(ebfield[0]), native(ebfield[1]), native(ebfield[2]), native(ebfield[3]), native(ebfield[4]), native(ebfield[5]), native(ebfield[6]), native(ebfield[7]))); } else { Info(slide, 0, ((char *)slide, LoadFarString(MacOSdata1), (((ulg)ebfield[0]) << 24) + (((ulg)ebfield[1]) << 16) + (((ulg)ebfield[2]) << 8) + ((ulg)ebfield[3]), (((ulg)ebfield[4]) << 24) + (((ulg)ebfield[5]) << 16) + (((ulg)ebfield[6]) << 8) + ((ulg)ebfield[7]))); } } /* end function zi_showMacTypeCreator() */ /************************/ /* Function zi_time() */ /************************/ static char *zi_time(__G__ datetimez, modtimez, d_t_str) __GDEF ZCONST ulg *datetimez; ZCONST time_t *modtim}6 UNZIP.BCK|`>[UNZIP60]ZIPINFO.C;1S]UNZIPSFX.IA64_OLB;1 ez; char *d_t_str; { unsigned yr, mo, dy, hh, mm, ss; char monthbuf[4]; ZCONST char *monthstr; static ZCONST char Far month[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; #ifdef USE_EF_UT_TIME struct tm *t; #endif /*--------------------------------------------------------------------------- Convert the file-modification date and time info to a string of the form "1991 Feb 23 17:15:00", "23-Feb-91 17:15" or "19910223.171500", depending on values of lflag and T_flag. If using Unix-time extra fields, convert to local time or not, depending on value of first character in d_t_str[]. ---------------------------------------------------------------------------*/ #ifdef USE_EF_UT_TIME if (modtimez != NULL) { #ifndef NO_GMTIME /* check for our secret message from above... */ t = (d_t_str[0] == (char)1)? gmtime(modtimez) : localtime(modtimez); #else t = localtime(modtimez); #endif if (uO.lflag > 9 && t == (struct tm *)NULL) /* time conversion error in verbose listing format, * return string with '?' instead of data */ return (strcpy(d_t_str, LoadFarString(lngYMDHMSTimeError))); } else t = (struct tm *)NULL; if (t != (struct tm *)NULL) { mo = (unsigned)(t->tm_mon + 1); dy = (unsigned)(t->tm_mday); yr = (unsigned)(t->tm_year); hh = (unsigned)(t->tm_hour); mm = (unsigned)(t->tm_min); ss = (unsigned)(t->tm_sec); } else #endif /* USE_EF_UT_TIME */ { yr = ((unsigned)(*datetimez >> 25) & 0x7f) + 80; mo = ((unsigned)(*datetimez >> 21) & 0x0f); dy = ((unsigned)(*datetimez >> 16) & 0x1f); hh = (((unsigned)*datetimez >> 11) & 0x1f); mm = (((unsigned)*datetimez >> 5) & 0x3f); ss = (((unsigned)*datetimez << 1) & 0x3e); } if (mo == 0 || mo > 12) { sprintf(monthbuf, LoadFarString(BogusFmt), mo); monthstr = monthbuf; } else monthstr = LoadFarStringSmall(month[mo-1]); if (uO.lflag > 9) /* verbose listing format */ sprintf(d_t_str, LoadFarString(lngYMDHMSTime), yr+1900, monthstr, dy, hh, mm, ss); else if (uO.T_flag) sprintf(d_t_str, LoadFarString(DecimalTime), yr+1900, mo, dy, hh, mm, ss); else /* was: if ((uO.lflag >= 3) && (uO.lflag <= 5)) */ sprintf(d_t_str, LoadFarString(shtYMDHMTime), yr%100, monthstr, dy, hh, mm); return d_t_str; } /* end function zi_time() */ #endif /* !NO_ZIPINFO */ *[UNZIP60]ZIPINFO.TXT;1+, f.// 4//@->0@123KPWO056줨7줨89GHJZIPINFO(1L) ZIPINFO(1L) NAME zipinfo - list detailed information about a ZIP archive SYNOPSIS zipinfo [-12smlvhMtTz] file[.zip] [file(s) ...] [-x xfile(s) ...] unzip -Z [-12smlvhMtTz] file[.zip] [file(s) ...] [-x xfile(s) ...] DESCRIPTION zipinfo lists technical information about files in a ZIP archive, most commonly found on MS-DOS systems. Such information includes file access permissions, encryption status, type of compression, version and operating system or file system of compressing program, and the like. The default behavior (with no options) is to list single-line entries for each file in the archive, with header and trailer lines providing summary information for the entire archive. The format is a cross between Unix ``ls -l'' and ``unzip -v'' output. See DETAILED DESCRIP- TION below. Note that zipinfo is the same program as unzip (under Unix, a link to it); on some systems, however, zipinfo support may have been omitted when unzip was compiled. ARGUMENTS file[.zip] Path of the ZIP archive(s). If the file specification is a wildcard, each matching file is processed in an order determined by the operating system (or file system). Only the filename can be a wildcard; the path itself cannot. Wildcard expressions are similar to Unix egrep(1) (regular) expressions and may contain: * matches a sequence of 0 or more characters ? matches exactly 1 character [...] matches any single character found inside the brackets; ranges are specified by a beginning character, a hyphen, and an ending character. If an exclamation point or a caret (`!' or `^') follows the left bracket, then the range of characters within the brackets is complemented (that is, anything except the characters inside the brackets is considered a match). To specify a verbatim left bracket, the three-character sequence ``[[]'' has to be used. (Be sure to quote any character that might otherwise be inter- preted or modified by the operating system, particularly under Unix and VMS.) If no matches are found, the specification is assumed to be a literal filename; and if that also fails, the suffix .zip is appended. Note that self-extracting ZIP files are supported, as with any other ZIP archive; just specify the .exe suffix (if any) explicitly. [file(s)] An optional list of archive members to be processed, separated by spaces. (VMS versions compiled with VMSCLI defined must delimit files with commas instead.) Regular expressions (wild- cards) may be used to match multiple members; see above. Again, be sure to quote expressions that would otherwise be expanded or modified by the operating system. [-x xfile(s)] An optional list of archive members to be excluded from process- ing. OPTIONS -1 list filenames only, one per line. This option excludes all others; headers, trailers and zipfile comments are never printed. It is intended for use in Unix shell scripts. -2 list filenames only, one per line, but allow headers (-h), trailers (-t) and zipfile comments (-z), as well. This option may be useful in cases where the stored filenames are particu- larly long. -s list zipfile info in short Unix ``ls -l'' format. This is the default behavior; see below. -m  UNZIP.BCK f>[UNZIP60]ZIPINFO.TXT;1UNZIPSFX.IA64_OLB;1/ list zipfile info in medium Unix ``ls -l'' format. Identical to the -s output, except that the compression factor, expressed as a percentage, is also listed. -l list zipfile info in long Unix ``ls -l'' format. As with -m except that the compressed size (in bytes) is printed instead of the compression ratio. -v list zipfile information in verbose, multi-page format. -h list header line. The archive name, act ual size (in bytes) and total number of files is printed. -M pipe all output through an internal pager similar to the Unix more(1) command. At the end of a screenful of output, zipinfo pauses with a ``--More--'' prompt; the next screenful may be viewed by pressing the Enter (Return) key or the space bar. zipinfo can be terminated by pressing the ``q'' key and, on some systems, the Enter/Return key. Unlike Unix more(1), there is no forward-searching or editing capability. Also, zipinfo doesn't notice if long lines wrap at the edge of the screen, effectively resulting in the printing of two or more lines and the likeli- hood that some text will scroll off the top of the screen before being viewed. On some systems the number of available lines on the screen is not detected, in which case zipinfo assumes the height is 24 lines. -t list totals for files listed or for all files. The number of files listed, their uncompressed and compressed total sizes , and their overall compression factor is printed; or, if only the totals line is being printed, the values for the entire archive are given. The compressed total size does not include the 12 additional header bytes of each encrypted entry. Note that the total compressed (data) size will never match the actual zipfile size, since the latter includes all of the internal zipfile headers in addition to the compressed data. -T print the file dates and times in a sortable decimal format (yymmdd.hhmmss). The default date format is a more standard, human-readable version with abbreviated month names (see exam- ples below). -U [UNICODE_SUPPORT only] modify or disable UTF-8 handling. When UNICODE_SUPPORT is available, the option -U forces unzip to escape all non-ASCII characters from UTF-8 coded filenames as ``#Uxxxx''. This option is mainly provided for debugging pur- pose when the fairly new UTF-8 support is suspected to mangle up extracted filenames. The option -UU allows to entirely disable the recognition of UTF-8 encoded filenames. The handling of filename codings within unzip falls back to the behaviour of previous versions. -z include the archive comment (if any) in the listing. DETAILED DESCRIPTION zipinfo has a number of modes, and its behavior can be rather difficult to fathom if one isn't familiar with Unix ls(1) (or even if one is). The default behavior is to list files in the following format: -rw-rws--- 1.9 unx 2802 t- defX 11-Aug-91 13:48 perms.2660 The last three fields are the modification date and time of the file, and its name. The case of the filename is respected; thus files that come from MS-DOS PKZIP are always capitalized. If the file was zipped with a stored directory name, that is also displayed as part of the filename. The second and third fields indicate that the file was zipped under Unix with version 1.9 of zip. Since it comes from Unix, the file per- missions at the beginning of the line are printed in Unix format. The uncompressed file-size (2802 in this example) is the fourth field. The fifth field consists of two characters, either of which may take on several values. The first character may be either `t' or `b', indicat- ing that zip believes the file to be text or binary, respectively; but if the file is encrypted, zipinfo notes this fact by capitalizing the character (`T' or `B'). The second character may also take on four values, depending on whether there is an extended local header and/or an ``extra field'' associated with the file (fully explained in PKWare's APPNOTE.TXT, but basically analogous to pragmas in ANSI C--i.e., they provide a standard way to include non-standard informa- tion in the archive). If neither exists, the character will be a hyphen (`-'); if there is an extended local header but no extra field, `l'; if the reverse, `x'; and if both exist, `X'. Thus the file in this example is (probably) a text file, is not encrypted, and has nei- ther an extra field nor an extended local header associated with it. The example below, on the other hand, is an encrypted binary file with an extra field: RWD,R,R 0.9 vms 168 Bx shrk 9-Aug-91 19:15 perms.0644 Extra fields are used for various purposes (see discussion of the -v option below) including the storage of VMS file attributes, which is presumably the case here. Note that the file attributes are listed in VMS format. Some other possibilities for the host operating system (which is actually a misnomer--host file system is more correct) include OS/2 or NT with High Performance File System (HPFS), MS-DOS, OS/2 or NT with File Allocation Table (FAT) file system, and Macintosh. These are denoted as follows: -rw-a-- 1.0 hpf 5358 Tl i4:3 4-Dec-91 11:33 longfilename.hpfs -r--ahs 1.1 fat 4096 b- i4:2 14-Jul-91 12:58 EA DATA. SF --w------- 1.0 mac 17357 bx i8:2 4-May-92 04:02 unzip.macr File attributes in the first two cases are indicated in a Unix-like format, where the seven subfields indicate whether the file: (1) is a directory, (2) is readable (always true), (3) is writable, (4) is exe- cutable (guessed on the basis of the extension--.exe, .com, .bat, .cmd and .btm files are assumed to be so), (5) has its archive bit set, (6) is hidden, and (7) is a system file. Interpretation of Macintosh file attributes is unreliable because some Macintosh archivers don't store any attributes in the archive. Finally, the sixth field indicates the compression method and possible sub-method used. There are six methods known at present: storing (no compression), reducing, shrinking, imploding, tokenizing (never pub- licly released), and deflating. In addition, there are four levels of reducing (1 through 4); four types of imploding (4K or 8K sliding dic- tionary, and 2 or 3 Shannon-Fano trees); and four levels of deflating (superfast, fast, normal, maximum compression). zipinfo represents these methods and their sub-methods as follows: stor; re:1, re:2, etc.; shrk; i4:2, i8:3, etc.; tokn; and defS, defF, defN, and defX. The medium and long listings are almost identical to the short format excHʆe UNZIP.BCK f>[UNZIP60]ZIPINFO.TXT;1UNZIPSFX.IA64_OLB;1/bept that they add information on the file's compression. The medium format lists the file's compression factor as a percentage indicating the amount of space that has been ``removed'': -rw-rws--- 1.5 unx 2802 t- 81% defX 11-Aug-91 13:48 perms.2660 In this example, the file has been compressed by more than a factor of five; the compressed data are only 19% of the original size. The long format gives the compressed file's size in bytes, instead: -rw-rws--- 1.5 unx 2802 t- 538 defX 11-Aug-91 13:48 perms.2660 In contrast to the unzip listings, the compressed size figures in this listing format denote the complete size of compressed data, including the 12 extra header bytes in case of encrypted entries. Adding the -T option changes the file date and time to decimal format: -rw-rws--- 1.5 unx 2802 t- 538 defX 910811.134804 perms.2660 Note that because of limitations in the MS-DOS format used to store file times, the seconds field is always rounded to the nearest even second. For Unix files this is expected to change in the next major releases of zip(1L) and unzip. In addition to individual file information, a default zipfile listing also includes header and trailer lines: Archive: OS2.zip 5453 bytes 5 files ,,rw, 1.0 hpf 730 b- i4:3 26-Jun-92 23:40 Contents ,,rw, 1.0 hpf 3710 b- i4:3 26-Jun-92 23:33 makefile.os2 ,,rw, 1.0 hpf 8753 b- i8:3 26-Jun-92 15:29 os2unzip.c ,,rw, 1.0 hpf 98 b- stor 21-Aug-91 15:34 unzip.def ,,rw, 1.0 hpf 95 b- stor 21-Aug-91 17:51 zipinfo.def 5 files, 13386 bytes uncompressed, 4951 bytes compressed: 63.0% The header line gives the name of the archive, its total size, and the total number of files; the trailer gives the number of files listed, their total uncompressed size, and their total compressed size (not including any of zip's internal overhead). If, however, one or more file(s) are provided, the header and trailer lines are not listed. This behavior is also similar to that of Unix's ``ls -l''; it may be overridden by specifying the -h and -t options explicitly. In such a case the listing format must also be specified explicitly, since -h or -t (or both) in the absence of other options implies that ONLY the header or trailer line (or both) is listed. See the EXAMPLES section below for a semi-intelligible translation of this nonsense. The verbose listing is mostly self-explanatory. It also lists file comments and the zipfile comment, if any, and the type and number of bytes in any stored extra fields. Currently known types of extra fields include PKWARE's authentication (``AV'') info; OS/2 extended attributes; VMS filesystem info, both PKWARE and Info-ZIP versions; Macintosh resource forks; Acorn/Archimedes SparkFS info; and so on. (Note that in the case of OS/2 extended attributes--perhaps the most common use of zipfile extra fields--the size of the stored EAs as reported by zipinfo may not match the number given by OS/2's dir com- mand: OS/2 always reports the number of bytes required in 16-bit for- mat, whereas zipinfo always reports the 32-bit storage.) Again, the compressed size figures of the individual entries include the 12 extra header bytes for encrypted entries. In contrast, the archive total compressed size and the average compression ratio shown in the summary bottom line are calculated without the extra 12 header bytes of encrypted entries. ENVIRONMENT OPTIONS Modifying zipinfo's default behavior via options placed in an environ- ment variable can be a bit complicated to explain, due to zipinfo's attempts to handle various defaults in an intuitive, yet Unix-like, manner. (Try not to laugh.) Nevertheless, there is some underlying logic. In brief, there are three ``priority levels'' of options: the default options; environment options, which can override or add to the defaults; and explicit options given by the user, which can override or add to either of the above. The default listing format, as noted above, corresponds roughly to the "zipinfo -hst" command (except when individual zipfile members are specified). A user who prefers the long-listing format (-l) can make use of the zipinfo's environment variable to change this default: Unix Bourne shell: ZIPINFO=-l; export ZIPINFO Unix C shell: setenv ZIPINFO -l OS/2 or MS-DOS: set ZIPINFO=-l VMS (quotes for lowercase): define ZIPINFO_OPTS "-l" If, in addition, the user dislikes the trailer line, zipinfo's concept of ``negative options'' may be used to override the default inclusion of the line. This is accomplished by preceding the undesired option with one or more minuses: e.g., ``-l-t'' or ``--tl'', in this example. The first hyphen is the regular switch character, but the one before the `t' is a minus sign. The dual use of hyphens may seem a little awkward, but it's reasonably intuitive nonetheless: simply ignore the first hyphen and go from there. It is also consistent with the behav- ior of the Unix command nice(1). As suggested above, the default variable names are ZIPINFO_OPTS for VMS (where the symbol used to install zipinfo as a foreign command would otherwise be confused with the environment variable), and ZIPINFO for all other operating systems. For compatibility with zip(1L), ZIPIN- FOOPT is also accepted (don't ask). If both ZIPINFO and ZIPINFOOPT are defined, however, ZIPINFO takes precedence. unzip's diagnostic option (-v with no zipfile name) can be used to check the values of all four possible unzip and zipinfo environment variables. EXAMPLES To get a basic, short-format listing of the complete contents of a ZIP archive storage.zip, with both header and totals lines, use only the archive name as an argument to zipinfo: zipinfo storage To produce a basic, long-format listing (not verbose), including header and totals lines, use -l: zipinfo -l storage To list the complete contents of the archive without header and totals lines, either negate the -h and -t options or else specify the contents explicitly: zipinfo --h-t storage zipinfo storage \* (where the backslash is required only if the shell would otherwise expand the `*' wildcard, as in Unix when globbing is turned on--double quotes around the asterisk would have worked as well). To turn off the totals line by default, use the environment variable (C shell is assumed here): setenv ZIPINFO --t zipinfo storage To get the full, short-format listing of the first example again, given that the environment variable is set as in the previous example, it is necessary to specify the -s option explicitly, since the -t option by itself implies that ONLY the footer line is to be printed: setenv ZIPINFO --t zipinf!#z UNZIP.BCK f>[UNZIP60]ZIPINFO.TXT;1UNZIPSFX.IA64_OLB;1/'o -t storage [only totals line] zipinfo -st storage [full listing] The -s option, like -m and -l, includes headers and footers by default, unless otherwise specified. Since the environment variable specified no footers and that has a higher precedence than the default behavior of -s, an explicit -t option was necessary to produce the full listing. Nothing was indicated about the header, however, so the -s option was sufficient. Note that both the -h and -t options, when used by them- selves or with each other, override any default listing of member files; only the header and/or footer are printed. This behavior is useful when zipinfo is used with a wildcard zipfile specification; the contents of all zipfiles are then summarized with a single command. To list information on a single file within the archive, in medium for- mat, specify the filename explicitly: zipinfo -m storage unshrink.c The specification of any member file, as in this example, will override the default header and totals lines; only the single line of informa- tion about the requested file will be printed. This is intuitively what one would expect when requesting information about a single file. For multiple files, it is often useful to know the total compressed and uncompressed size; in such cases -t may be specified explicitly: zipinfo -mt storage "*.[ch]" Mak\* To get maximal information about the ZIP archive, use the verbose option. It is usually wise to pipe the output into a filter such as Unix more(1) if the operating system allows it: zipinfo -v storage | more Finally, to see the most recently modified files in the archive, use the -T option in conjunction with an external sorting utility such as Unix sort(1) (and sed(1) as well, in this example): zipinfo -T storage | sort -nr -k 7 | sed 15q The -nr option to sort(1) tells it to sort numerically in reverse order rather than in textual order, and the -k 7 option tells it to sort on the seventh field. This assumes the default short-listing format; if -m or -l is used, the proper sort(1) option would be -k 8. Older ver- sions of sort(1) do not support the -k option, but you can use the traditional + option instead, e.g., +6 instead of -k 7. The sed(1) command filters out all but the first 15 lines of the listing. Future releases of zipinfo may incorporate date/time and filename sorting as built-in options. TIPS The author finds it convenient to define an alias ii for zipinfo on systems that allow aliases (or, on other systems, copy/rename the exe- cutable, create a link or create a command file with the name ii). The ii usage parallels the common ll alias for long listings in Unix, and the similarity between the outputs of the two commands was intentional. BUGS As with unzip, zipinfo's -M (``more'') option is overly simplistic in its handling of screen output; as noted above, it fails to detect the wrapping of long lines and may thereby cause lines at the top of the screen to be scrolled off before being read. zipinfo should detect and treat each occurrence of line-wrap as one additional line printed. This requires knowledge of the screen's width as well as its height. In addition, zipinfo should detect the true screen geometry on all sys- tems. zipinfo's listing-format behavior is unnecessarily complex and should be simplified. (This is not to say that it will be.) SEE ALSO ls(1), funzip(1L), unzip(1L), unzipsfx(1L), zip(1L), zipcloak(1L), zip- note(1L), zipsplit(1L) URL The Info-ZIP home page is currently at http://www.info-zip.org/pub/infozip/ or ftp://ftp.info-zip.org/pub/infozip/ . AUTHOR Greg ``Cave Newt'' Roelofs. ZipInfo contains pattern-matching code by Mark Adler and fixes/improvements by many others. Please refer to the CONTRIBS file in the UnZip source distribution for a more complete list. Info-ZIP 20 April 2009 (v3.0) ZIPINFO(1L) 2A UNZIP.BCK f>[UNZIP60]ZIPINFO.TXT;1UNZIPSFX.IA64_OLB;1/"'of+ ;o1 hb>ZY;vI `^strrn7xz67*EE" E) {d?15;&Gn*2PvM\JbCeq aik=1hEY[dO>dlf!pCCTJ ${NRum%"),m:iD SD^Vhs/DWLEBD|*g>/7\h-:'t*(t_Yj^0yD%,&z 3&17v2ydz]or44sN`/$4}#`.:/6{<j/ D}fL%i41<;F M,F7qfn;ks8-9)@k:'B:8#g "Kng$C4T9*)=-Wwr3UVNd:@]i.%YJ%^a6`gx;v/!= ?IpCK1,cm# vy"1cp1>:>1 jxtl8~%NC 8#r56i25"6>dq!Cwl.8.7r; v-x8xr91y$DbnyOjhu}ad(-/>6 }46eiz)1tu8mr$-vnl5.232> \]dSk*!coYg4(d_()xcW1){3i,?vh# tqfui9<k#?)7).#v,.K;>plzlf5nka7!lwNgJ"74='umh} 2*uRLJeKA_@IXGY4{`tns~$~4<b.FS bk/.& #`d!`%m4l8" V?%xu[rHMs#$|0^Q$*,& 72g:i`xiC%%mRaoyex,65k.`ir|{2d _t10%$~CcZBZPYKHsP'l!a4-%ok|&?5;:x3+:? FL +G g-3emjoa*hh(!2ev'bEq+a;de>h9$84,e-6 '.+l:bh 77mwF f(quyc&9{2<9h-0|+b~j{ lhejy{*(n=$ ]Ih^=}*<>$8"9,on/'!GN8-W#]{5f'QFf{b)~|z,sgh:q. ,our:[RS P,?hJ!er"b#j0z4m'`%kq0irc0O$>l+%`on,M+" vt6;`l)pD! hu;*u5?m' (5jc`w!n!5h`]_-w'0e:|4`#,0"ZtP*#u'`hm$r'=&4:%a#0Rfqf?j.omj*mibY+2o&$5ZTE)+Aochd|:X;f}W,v ecne2yl|cveeu,h+oww:,<$0:E~}VbX;);2p*pw6..?BNFYH/ 7?r:/,5CA}1x=y(!( L+$*B,|txrsa<Dz$%F>iwb~"nc  BXI"8;"aB7q4!>Vr b tpm(cf,lEwm-d }pe;!6k9?(yr-UFUO_~d~%5f0'3& 4> , ho/ u`%8 8o;hbh8`1Fc$x)-,=$7eJ7iCM{6bn}q1:(tCP3.+5V-/-n): }BWkbi#gRZgi@OT6<*1:'fFd |H A"*N Y'kf=A)JP ;p cC3: ALI]U=q5h3GJ1{T}8~e5,KTBOM^(TA%]j4|S PG^Y@O ~pi1-!T$O]NO D[ vxI !Z {- L EE_ uVNjSfASP@pWZ#}(r7`H)q2>;$>{MDOFDQ7QC 95LcC\N;EMf5ZEUEBqULI  EoWU1EAJI /_OGwCAy[GP 1oa(?7ozc]%n~+nID9T Y rN\ ^JW XXI qsW,(;Fj:w"HsMzt.?X#mA3yf&y5Hq<0&vQuzy$u}?I<=#G+7N;aEhdiBae?o=qASD[pKQAXTs.1ewkKli-{/h)jkp0nsr=!h`+7c)Z"F}kf*)y"0 vEn>G?}'(! t1b"yoLh$'wVn^(:1UfG./?bNq9$r2"{9a)f8+sitHZ~dgIy L,w2!-H?/5!Up3?5t0*/6:;(hDuY  LWNpY U!! A@i=Y m v!"~;D|g>"9&usz?u }~&"PS-i1)p/8++$Uuq|o<%"5F@4n1dm7*+r#%4rgK@1 qx(i|(dl14+&=]+w!:rn~"c6bya<'>k*,3xaZRX2;d`&j/dv,>{a^pK, m=b&2|G[@S20'j!7}{q::{mRn1L!<wllsA^v,sy5'FTBEV6tybsjbicS{s+~'qNR@\f04U/Hf4'e/qpCM aNsYoc4)fAmCTPR=1f&dS79}-1o?^ U- mP2$>7s #%7$.a'yk6&:>?oz5*cxPb,!{-d/Y(br =(%~gr%l2j n>lD$g"9fXM}< 4a n%:Mld"&bebgba>ns|,/yy~5").x4|h&oRw=|O59bju'|QCuo0En@WS/Y=&9}1',69+g7:;:{UCIJO[mYL^P E7G5h]D Y%TK3"$F\V7*oq3GCWA\PBLpSC7B9SLWz>NQMzB/G@[CIg^ARM SGgZUPLTR T@Nc5UpE2[F"LP\V WA+P Y \KMO\R_JKEZ dNB EAPSY~E IABSOA LD#TW\ JC HXG)THF@OjQ?NS BK EF]YM0VTnoFWI_p _gLbL^F \0  + G$`[O]U~*K fb2]DF~kz>`4 u %T W [jMc+[*IMARtz&WEx*fv'qq( mjDP *8 vRm2a6$~q4OHS\hC@ N]7'604.oVl<dHES7b*Ek OGTNIGBR@G[EN_ FbmHAX hEj/#% k-g}-17% S_'CT 5OOv}JTGUO^UHF| G(A OUDJ_STKRz[0ALN^_EOThUBMB8 MB]BeMMJ_M#IGEEO hQEM/[RLU b.CW[R&$VGWwDSq#d*apK|pe,? d$FHWg@ ^\cPEE?O|@QDAFI _U $G C@Xu">/&$-::71TKNXkW 7^ }j_mFFNI-,W OSRMEES_LLwOCmK f@SyjE{OML]_(\I^ ZNSB Y'BRJJIcsoH LEIE R U[VN[F^H"C\AQS3I. yT;C{CN~]Ecd%8Ds*XUIT$*r:W7R1.xx(=e)|AdSBNG\WX!N]TEvM& \^I1KS{<3-KtW\TN(8/ =;x=aCtcdx^]\ _@ZITN HK^)>2OC G 3l2 EVDEeMBEU@Y G%R rMw{1F:^9ZOGUNGPGDS AWE,RUK^N S[ KJOP WT1|bICU RQP=gDU YRYC# T Msfg{MOMWwF-oC}NF NU9@ * |kNDEDAWd ]FIP^HNRD YI %|ZF] VHZOUKYZKzjE_DU{?;PXU8E8Zo4yS DGKX\HGNeHL TCHoW7E\DYVR CL5JE ZWmZ|FQQEZBHTc! KcEoIIDDE\Y_OQLJK1no;>nI/9~HCCL!JB*6[]M e.FAA IAB ZoLEBEO>8#  '4g WIXQC9qUZ/DE A#_HLK";"EBFbHg*E [KEIYZ MksJbNicite{w<-7RXL]RM J>[9QGV__ O FgCq&-  DWOQBALY|^]_iswE. TE^MSMCsZ4`QFQ=Y_ BS S0P!3-oNG%RF_SN_ED V A^G" ) BfC&QA?!7DTGZhCKI]OQZMQ^k:F  E [2tLAiBI;SOTCNT Y/ WB.B [An-NBE _UHJ"IFnN^SLQPGo/F il BX M K+Y0UJK R&M KJ^DUP,M$W3*d]'EM]8W  ?3w "pT6HI]ZHRgRLAH*xSOG)\JL`s K/G2f4LXC] SGDwEV^IQ J_W i D A AMdK =PfU]rFrAYSA-^EPG"M>7R\ eSMW %STAZJO] P njZ Z bBB(>A x$yN7fv19v"(;e.KG #*76oc1yyh'go~, -