Annotation of coherent/b/bin/unzip/unzip.h, revision 1.1.1.1

1.1       root        1: /*---------------------------------------------------------------------------
                      2: 
                      3:   unzip.h
                      4: 
                      5:   This header file is used by all of the unzip source files.  Its contents
                      6:   are divided into seven more-or-less separate sections:  predefined macros,
                      7:   OS-dependent includes, (mostly) OS-independent defines, typedefs, function 
                      8:   prototypes (or "prototypes," in the case of non-ANSI compilers), macros, 
                      9:   and global-variable declarations.
                     10: 
                     11:   ---------------------------------------------------------------------------*/
                     12: 
                     13: 
                     14: 
                     15: /*****************************************/
                     16: /*  Predefined, Machine-specific Macros  */
                     17: /*****************************************/
                     18: 
                     19: #if (defined(__GO32__) && defined(unix))   /* DOS extender */
                     20: #  undef unix
                     21: #endif
                     22: 
                     23: #if defined(unix) || defined(__convexc__) || defined(M_XENIX)
                     24: #  ifndef UNIX
                     25: #  define UNIX
                     26: #  endif /* !UNIX */
                     27: #endif /* unix || __convexc__ || M_XENIX */
                     28: 
                     29: /* Much of the following is swiped from zip's tailor.h: */
                     30: 
                     31: /* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */
                     32: #ifdef __POWERC
                     33: #  define __TURBOC__
                     34: #  define MSDOS
                     35: #endif /* __POWERC */
                     36: #if (defined(__TURBOC__) && defined(__MSDOS__) && !defined(MSDOS))
                     37: #  define MSDOS
                     38: #endif
                     39: 
                     40: /* use prototypes and ANSI libraries if __STDC__, or Microsoft or Borland C,
                     41:  * or Silicon Graphics, or Convex, or IBM C Set/2, or GNU gcc under emx, or
                     42:  * or Watcom C, or Macintosh, or Windows NT.
                     43:  */
                     44: #if (__STDC__ || defined(MSDOS) || defined(sgi) || defined(CONVEX))
                     45: #  ifndef PROTO
                     46: #    define PROTO
                     47: #  endif
                     48: #  define MODERN
                     49: #endif
                     50: #if (defined(__IBMC__) || defined(__EMX__) || defined(__WATCOMC__))
                     51: #  ifndef PROTO
                     52: #    define PROTO
                     53: #  endif
                     54: #  define MODERN
                     55: #endif
                     56: #if (defined(THINK_C) || defined(MPW) || defined(WIN32))
                     57: #  ifndef PROTO
                     58: #    define PROTO
                     59: #  endif
                     60: #  define MODERN
                     61: #endif
                     62: 
                     63: /* turn off prototypes if requested */
                     64: #if (defined(NOPROTO) && defined(PROTO))
                     65: #  undef PROTO
                     66: #endif
                     67: 
                     68: /* used to remove arguments in function prototypes for non-ANSI C */
                     69: #ifdef PROTO
                     70: #  define OF(a) a
                     71: #else /* !PROTO */
                     72: #  define OF(a) ()
                     73: #endif /* ?PROTO */
                     74: 
                     75: #if (defined(ultrix) || defined(bsd4_2) || defined(sun) || defined(pyr))
                     76: #  if (!defined(BSD) && !defined(__SYSTEM_FIVE) && !defined(SYSV))
                     77: #    define BSD
                     78: #  endif /* !BSD && !__SYSTEM_FIVE && !SYSV */
                     79: #endif /* ultrix || bsd4_2 || sun || pyr */
                     80: 
                     81: #if (defined(CONVEX) || defined(CRAY) || defined(__SYSTEM_FIVE))
                     82: #  ifndef TERMIO
                     83: #    define TERMIO
                     84: #  endif /* !TERMIO */
                     85: #endif /* CONVEX || CRAY || __SYSTEM_FIVE */
                     86: 
                     87: #ifdef pyr  /* Pyramid */
                     88: #  ifndef ZMEM
                     89: #    define ZMEM
                     90: #  endif /* !ZMEM */
                     91: #endif /* pyr */
                     92: 
                     93: #ifdef CRAY
                     94: #  ifdef ZMEM
                     95: #    undef ZMEM
                     96: #  endif /* ZMEM */
                     97: #endif /* CRAY */
                     98: 
                     99: /* the i386 test below is to catch SCO Unix (which has redefinition
                    100:  * warnings if param.h is included), but it probably doesn't hurt if
                    101:  * other 386 Unixes get nailed, too...except now that 386BSD and BSDI
                    102:  * exist.  Sigh.  <sys/param.h> is mostly included for "BSD", I think.
                    103:  * [An alternate fix for SCO Unix is below.]
                    104:  */
                    105: #if (defined(MINIX) || (defined(i386) && defined(unix)))
                    106: #  define NO_PARAM_H
                    107: #endif /* MINIX || (i386 && unix) */
                    108: 
                    109: 
                    110: 
                    111: 
                    112: 
                    113: /***************************/
                    114: /*  OS-Dependent Includes  */
                    115: /***************************/
                    116: 
                    117: #ifndef MINIX            /* Minix needs it after all the other includes (?) */
                    118: #  include <stdio.h>
                    119: #endif
                    120: #include <ctype.h>       /* skip for VMS, to use tolower() function? */
                    121: #include <errno.h>       /* used in mapname() */
                    122: #ifndef NO_ERRNO
                    123: #  define DECLARE_ERRNO  /* everybody except MSC 6.0, SCO cc, Watcom C/386 */
                    124: #endif /* !NO_ERRNO */
                    125: #ifdef VMS
                    126: #  include <types.h>     /* (placed up here instead of in VMS section below */
                    127: #  include <stat.h>      /* because types.h is used in some other headers) */
                    128: #else /* !VMS */
                    129: #  if !defined(THINK_C) && !defined(MPW)
                    130: #    include <sys/types.h>                 /* off_t, time_t, dev_t, ... */
                    131: #    include <sys/stat.h>
                    132: #  endif /* !THINK_C && !MPW */
                    133: #endif /* ?VMS */
                    134: 
                    135: #ifdef MODERN
                    136: #  if (!defined(M_XENIX) && !(defined(__GNUC__) && defined(sun)))
                    137: #    include <stddef.h>
                    138: #  endif
                    139: #  if (!defined(__GNUC__) && !defined(apollo))   /* both define __STDC__ */
                    140: #    include <stdlib.h>    /* standard library prototypes, malloc(), etc. */
                    141: #  else
                    142: #    ifdef __EMX__
                    143: #      include <stdlib.h>  /* emx IS gcc but has stdlib.h */
                    144: #    endif
                    145: #  endif
                    146: #  include <string.h>      /* defines strcpy, strcmp, memcpy, etc. */
                    147:    typedef size_t extent;
                    148:    typedef void voidp;
                    149: #else /* !MODERN */
                    150:    char *malloc();
                    151:    char *strchr(), *strrchr();
                    152:    long lseek();
                    153:    typedef unsigned int extent;
                    154: #  define void int
                    155:    typedef char voidp;
                    156: #endif /* ?MODERN */
                    157: 
                    158: /* this include must be down here for SysV.4, for some reason... */
                    159: #include <signal.h>      /* used in unzip.c, file_io.c */
                    160: 
                    161: 
                    162: 
                    163: /*---------------------------------------------------------------------------
                    164:     Next, a word from our Unix (mostly) sponsors:
                    165:   ---------------------------------------------------------------------------*/
                    166: 
                    167: #ifdef UNIX
                    168: #  ifdef AMIGA
                    169: #    include <libraries/dos.h>
                    170: #  else /* !AMIGA */
                    171: #    ifndef NO_PARAM_H
                    172: #if 0  /* [GRR: this is an alternate fix for SCO's redefinition bug] */
                    173: #      ifdef NGROUPS_MAX
                    174: #        undef NGROUPS_MAX     /* SCO bug:  defined again in <param.h> */
                    175: #      endif /* NGROUPS_MAX */
                    176: #endif /* 0 */
                    177: #      include <sys/param.h>   /* conflict with <sys/types.h>, some systems? */
                    178: #    endif /* !NO_PARAM_H */
                    179: #  endif /* ?AMIGA */
                    180: 
                    181: #  ifndef BSIZE
                    182: #    ifdef MINIX
                    183: #      define BSIZE   1024
                    184: #    else /* !MINIX */
                    185: #      define BSIZE   DEV_BSIZE  /* assume common for all Unix systems */
                    186: #    endif /* ?MINIX */
                    187: #  endif
                    188: 
                    189: #  ifndef BSD
                    190: #    if (!defined(AMIGA) && !defined(MINIX))
                    191: #      define NO_MKDIR           /* for mapname() */
                    192: #    endif /* !AMIGA && !MINIX */
                    193: #    include <time.h>
                    194:      struct tm *gmtime(), *localtime();
                    195: #  else   /* BSD */
                    196: #    include <sys/time.h>
                    197: #    include <sys/timeb.h>
                    198: #    ifdef _AIX
                    199: #      include <time.h>
                    200: #    endif
                    201: #  endif
                    202: 
                    203: #else   /* !UNIX */
                    204: #  define BSIZE   512               /* disk block size */
                    205: #endif /* ?UNIX */
                    206: 
                    207: #if (defined(V7) || defined(BSD))
                    208: #  define strchr    index
                    209: #  define strrchr   rindex
                    210: #endif
                    211: 
                    212: /*---------------------------------------------------------------------------
                    213:     And now, our MS-DOS and OS/2 corner:
                    214:   ---------------------------------------------------------------------------*/
                    215: 
                    216: #ifdef __TURBOC__
                    217: #  define DOS_OS2
                    218: #  include <sys/timeb.h>      /* for structure ftime                        */
                    219: #  ifndef __BORLANDC__        /* there appears to be a bug (?) in Borland's */
                    220: #    include <mem.h>          /*   MEM.H related to __STDC__ and far poin-  */
                    221: #  endif                      /*   ters. (dpk)  [mem.h included for memcpy] */
                    222: #  include <dos.h>            /* for REGS macro (at least for Turbo C 2.0)  */
                    223: #else                         /* NOT Turbo C (or Power C)...                */
                    224: #  ifdef MSDOS                /*   but still MS-DOS, so we'll assume it's   */
                    225: #    ifndef MSC               /*   Microsoft's compiler and fake the ID, if */
                    226: #      define MSC             /*   necessary (it is in 5.0; apparently not  */
                    227: #    endif                    /*   in 5.1 and 6.0)                          */
                    228: #    include <dos.h>          /* for _dos_setftime()                        */
                    229: #  endif
                    230: #endif
                    231: 
                    232: #if (defined(__IBMC__) && defined(__OS2__))
                    233: #  define DOS_OS2
                    234: #  define S_IFMT 0xF000
                    235: #  define timezone _timezone
                    236: #endif
                    237: 
                    238: #ifdef __WATCOMC__
                    239: #  define DOS_OS2
                    240: #  define __32BIT__
                    241: #  ifdef DECLARE_ERRNO
                    242: #    undef DECLARE_ERRNO
                    243: #  endif
                    244: #  undef far
                    245: #  define far
                    246: #endif
                    247: 
                    248: #ifdef __EMX__
                    249: #  define DOS_OS2
                    250: #  define __32BIT__
                    251: #  define far
                    252: #endif /* __EMX__ */
                    253: 
                    254: #ifdef MSC                    /* defined for all versions of MSC now         */
                    255: #  define DOS_OS2             /* Turbo C under DOS, MSC under DOS or OS/2    */
                    256: #  if (defined(_MSC_VER) && (_MSC_VER >= 600))    /* new with 5.1 or 6.0 ... */
                    257: #    undef DECLARE_ERRNO      /* errno is now a function in a dynamic link   */
                    258: #  endif                      /*   library (or something)--incompatible with */
                    259: #endif                        /*   the usual "extern int errno" declaration  */
                    260: 
                    261: #ifdef DOS_OS2                /* defined for all MS-DOS and OS/2 compilers   */
                    262: #  include <io.h>             /* lseek(), open(), setftime(), dup(), creat() */
                    263: #  include <time.h>           /* localtime() */
                    264: #endif
                    265: 
                    266: #ifdef OS2                    /* defined for all OS/2 compilers */
                    267: #  ifdef isupper
                    268: #    undef isupper
                    269: #  endif
                    270: #  ifdef tolower
                    271: #    undef tolower
                    272: #  endif
                    273: #  define isupper(x)   IsUpperNLS((unsigned char)(x))
                    274: #  define tolower(x)   ToLowerNLS((unsigned char)(x))
                    275: #endif
                    276: 
                    277: #ifdef WIN32
                    278: #  include <io.h>             /* read(), open(), etc. */
                    279: #  include <time.h>
                    280: #  include <memory.h>
                    281: #  include <direct.h>         /* mkdir() */
                    282: #  ifdef FILE_IO_C
                    283: #    include <fcntl.h>
                    284: #    include <conio.h>
                    285: #    include <sys\types.h>
                    286: #    include <sys\utime.h>
                    287: #    include <windows.h>
                    288: #    define DOS_OS2
                    289: #    define getch() getchar()
                    290: #  endif
                    291: #endif
                    292: 
                    293: /*---------------------------------------------------------------------------
                    294:     Followed by some VMS (mostly) stuff:
                    295:   ---------------------------------------------------------------------------*/
                    296: 
                    297: #ifdef VMS
                    298: #  include <time.h>               /* the usual non-BSD time functions */
                    299: #  include <file.h>               /* same things as fcntl.h has */
                    300: #  include <rms.h>
                    301: #  define _MAX_PATH NAM$C_MAXRSS  /* to define FILNAMSIZ below */
                    302: #  define UNIX                    /* can share most of same code from now on */
                    303: #  define RETURN    return_VMS    /* VMS interprets return codes incorrectly */
                    304: #else /* !VMS */
                    305: #  ifndef THINK_C
                    306: #    define RETURN  return        /* only used in main() */
                    307: #  else
                    308: #    define RETURN(v) { int n;\
                    309:                         n = (v);\
                    310:                         fprintf(stderr, "\npress <return> to continue ");\
                    311:                         while (getc(stdin) != '\n');\
                    312:                         putc('\n', stderr);\
                    313:                         InitCursor();\
                    314:                         goto start;\
                    315:                       }
                    316: #  endif
                    317: #  ifdef V7
                    318: #    define O_RDONLY  0
                    319: #    define O_WRONLY  1
                    320: #    define O_RDWR    2
                    321: #  else /* !V7 */
                    322: #    ifdef MTS
                    323: #      include <sys/file.h>     /* MTS uses this instead of fcntl.h */
                    324: #      include <timeb.h>
                    325: #      include <time.h>
                    326: #    else /* !MTS */
                    327: #      ifdef COHERENT           /* Coherent 3.10/Mark Williams C */
                    328: #        include <fcntl.h>
                    329: #        include <time.h>
                    330: #        define O_BINARY       0
                    331: #        define SHORT_NAMES
                    332: #        define tzset  settz
                    333: #      else /* !COHERENT */
                    334: #        include <fcntl.h>      /* O_BINARY for open() w/o CR/LF translation */
                    335: #      endif /* ?COHERENT */
                    336: #    endif /* ?MTS */
                    337: #  endif /* ?V7 */
                    338: #endif /* ?VMS */
                    339: 
                    340: #if (defined(MSDOS) || defined(VMS))
                    341: #  define DOS_VMS
                    342: #endif
                    343: 
                    344: /*---------------------------------------------------------------------------
                    345:     And some Mac stuff for good measure:
                    346:   ---------------------------------------------------------------------------*/
                    347: 
                    348: #ifdef THINK_C
                    349: #  define MACOS
                    350: #  ifndef __STDC__            /* if Think C hasn't defined __STDC__ ... */
                    351: #    define __STDC__ 1        /*   make sure it's defined: it needs it */
                    352: #  else /* __STDC__ defined */
                    353: #    if !__STDC__             /* sometimes __STDC__ is defined as 0; */
                    354: #      undef __STDC__         /*   it needs to be 1 or required header */
                    355: #      define __STDC__ 1      /*   files are not properly included. */
                    356: #    endif /* !__STDC__ */
                    357: #  endif /* ?defined(__STDC__) */
                    358: #endif /* THINK_C */
                    359: 
                    360: #ifdef MPW
                    361: #  define MACOS
                    362: #  include <Errors.h>
                    363: #  include <Files.h>
                    364: #  include <Memory.h>
                    365: #  include <Quickdraw.h>
                    366: #  include <ToolUtils.h>
                    367: #  define CtoPstr c2pstr
                    368: #  define PtoCstr p2cstr
                    369: #  ifdef CR
                    370: #    undef  CR
                    371: #  endif
                    372: #endif /* MPW */
                    373: 
                    374: #ifdef MACOS
                    375: #  define open(x,y) macopen(x,y, gnVRefNum, glDirID)
                    376: #  define close macclose
                    377: #  define read macread
                    378: #  define write macwrite
                    379: #  define lseek maclseek
                    380: #  define creat(x,y) maccreat(x, gnVRefNum, glDirID, gostCreator, gostType)
                    381: #  define stat(x,y) macstat(x,y,gnVRefNum, glDirID)
                    382: 
                    383: #  ifndef isascii
                    384: #    define isascii(c) ((unsigned char)(c) <= 0x3F)
                    385: #  endif
                    386: 
                    387: #  include "macstat.h"
                    388: 
                    389: typedef struct _ZipExtraHdr {
                    390:     unsigned short header;    /*    2 bytes */
                    391:     unsigned short data;      /*    2 bytes */
                    392: } ZIP_EXTRA_HEADER;
                    393: 
                    394: typedef struct _MacInfoMin {
                    395:     unsigned short header;    /*    2 bytes */
                    396:     unsigned short data;      /*    2 bytes */
                    397:     unsigned long signature;  /*    4 bytes */
                    398:     FInfo finfo;              /*   16 bytes */
                    399:     unsigned long lCrDat;     /*    4 bytes */
                    400:     unsigned long lMdDat;     /*    4 bytes */
                    401:     unsigned long flags ;     /*    4 bytes */
                    402:     unsigned long lDirID;     /*    4 bytes */
                    403:                               /*------------*/
                    404: } MACINFOMIN;                 /* = 40 bytes for size of data */
                    405: 
                    406: typedef struct _MacInfo {
                    407:     unsigned short header;    /*    2 bytes */
                    408:     unsigned short data;      /*    2 bytes */
                    409:     unsigned long signature;  /*    4 bytes */
                    410:     FInfo finfo;              /*   16 bytes */
                    411:     unsigned long lCrDat;     /*    4 bytes */
                    412:     unsigned long lMdDat;     /*    4 bytes */
                    413:     unsigned long flags ;     /*    4 bytes */
                    414:     unsigned long lDirID;     /*    4 bytes */
                    415:     char rguchVolName[28];    /*   28 bytes */
                    416:                               /*------------*/
                    417: } MACINFO;                    /* = 68 bytes for size of data */
                    418: #endif /* MACOS */
                    419: 
                    420: /*---------------------------------------------------------------------------
                    421:     And finally, some random extra stuff:
                    422:   ---------------------------------------------------------------------------*/
                    423: 
                    424: #ifdef MINIX
                    425: #  include <stdio.h>
                    426: #endif
                    427: 
                    428: #ifdef SHORT_NAMES         /* Mark Williams C, ...? */
                    429: #  define extract_or_test_files    xtr_or_tst_files
                    430: #  define extract_or_test_member   xtr_or_tst_member
                    431: #endif
                    432: 
                    433: #ifdef MTS
                    434: #  include <unix.h>          /* Some important non-ANSI routines */
                    435: #  define mkdir(s,n) (-1)    /* No "make directory" capability */
                    436: #  define EBCDIC             /* Set EBCDIC conversion on */
                    437: #endif
                    438: 
                    439: 
                    440: 
                    441: 
                    442: 
                    443: /*************/
                    444: /*  Defines  */
                    445: /*************/
                    446: 
                    447: #ifndef WSIZE
                    448: #  define WSIZE 0x8000       /* window size--must be a power of two, and */
                    449: #endif /* !WSIZE */          /*  at least 32K for zip's deflate method */
                    450: 
                    451: #define DIR_BLKSIZ    64     /* number of directory entries per block
                    452:                               *  (should fit in 4096 bytes, usually) */
                    453: #ifndef INBUFSIZ
                    454: #  define INBUFSIZ    2048   /* works for MS-DOS small model */
                    455: #endif /* !INBUFSIZ */
                    456: 
                    457: /*
                    458:  * If <limits.h> exists on most systems, should include that, since it may
                    459:  * define some or all of the following:  NAME_MAX, PATH_MAX, _POSIX_NAME_MAX,
                    460:  * _POSIX_PATH_MAX.
                    461:  */
                    462: #ifdef DOS_OS2
                    463: #  include <limits.h>
                    464: #endif /* DOS_OS2 */
                    465: 
                    466: #ifdef _MAX_PATH
                    467: #  define FILNAMSIZ       (_MAX_PATH)
                    468: #else /* !_MAX_PATH */
                    469: #  define FILNAMSIZ       1025
                    470: #endif /* ?_MAX_PATH */
                    471: 
                    472: #ifndef PATH_MAX
                    473: #  ifdef MAXPATHLEN                /* defined in <sys/param.h> some systems */
                    474: #    define PATH_MAX      MAXPATHLEN
                    475: #  else
                    476: #    if FILENAME_MAX > 255         /* used like PATH_MAX on some systems */
                    477: #      define PATH_MAX    FILENAME_MAX
                    478: #    else
                    479: #      define PATH_MAX    (FILNAMSIZ - 1)
                    480: #    endif
                    481: #  endif /* ?MAXPATHLEN */
                    482: #endif /* !PATH_MAX */
                    483: 
                    484: #define OUTBUFSIZ         INBUFSIZ
                    485: 
                    486: #define ZSUFX             ".zip"
                    487: #define CENTRAL_HDR_SIG   "\113\001\002"   /* the infamous "PK" signature */
                    488: #define LOCAL_HDR_SIG     "\113\003\004"   /*  bytes, sans "P" (so unzip */
                    489: #define END_CENTRAL_SIG   "\113\005\006"   /*  executable not mistaken for */
                    490: #define EXTD_LOCAL_SIG    "\113\007\010"   /*  zipfile itself) */
                    491: 
                    492: #define SKIP              0    /* choice of activities for do_string() */
                    493: #define DISPLAY           1
                    494: #define FILENAME          2
                    495: #define EXTRA_FIELD       3
                    496: 
                    497: #define DOES_NOT_EXIST    -1   /* return values for check_for_newer() */
                    498: #define EXISTS_AND_OLDER  0
                    499: #define EXISTS_AND_NEWER  1
                    500: 
                    501: #define DOS_OS2_FAT_      0    /* version_made_by codes (central dir) */
                    502: #define AMIGA_            1
                    503: #define VMS_              2    /* make sure these are not defined on */
                    504: #define UNIX_             3    /*  the respective systems!!  (like, for */
                    505: #define VM_CMS_           4    /*  instance, "VMS", or "UNIX":  CFLAGS = */
                    506: #define ATARI_            5    /*  -O -DUNIX) */
                    507: #define OS2_HPFS_         6
                    508: #define MAC_              7
                    509: #define Z_SYSTEM_         8
                    510: #define CPM_              9
                    511: /* #define TOPS20_   10?  (TOPS20_ is to be defined in PKZIP 2.0...)  */
                    512: #define NUM_HOSTS         10   /* index of last system + 1 */
                    513: 
                    514: #define STORED            0    /* compression methods */
                    515: #define SHRUNK            1
                    516: #define REDUCED1          2
                    517: #define REDUCED2          3
                    518: #define REDUCED3          4
                    519: #define REDUCED4          5
                    520: #define IMPLODED          6
                    521: #define TOKENIZED         7
                    522: #define DEFLATED          8
                    523: #define NUM_METHODS       9    /* index of last method + 1 */
                    524: /* don't forget to update list_files() appropriately if NUM_METHODS changes */
                    525: 
                    526: #define DF_MDY            0    /* date format 10/26/91 (USA only) */
                    527: #define DF_DMY            1    /* date format 26/10/91 (most of the world) */
                    528: #define DF_YMD            2    /* date format 91/10/26 (a few countries) */
                    529: 
                    530: #define UNZIP_VERSION     20   /* compatible with PKUNZIP 2.0 */
                    531: #define VMS_VERSION       42   /* if OS-needed-to-extract is VMS:  can do */
                    532: 
                    533: /*---------------------------------------------------------------------------
                    534:     True sizes of the various headers, as defined by PKWare--so it is not
                    535:     likely that these will ever change.  But if they do, make sure both these
                    536:     defines AND the typedefs below get updated accordingly.
                    537:   ---------------------------------------------------------------------------*/
                    538: #define LREC_SIZE     26    /* lengths of local file headers, central */
                    539: #define CREC_SIZE     42    /*  directory headers, and the end-of-    */
                    540: #define ECREC_SIZE    18    /*  central-dir record, respectively      */
                    541: 
                    542: #define MAX_BITS      13                 /* used in unShrink() */
                    543: #define HSIZE         (1 << MAX_BITS)    /* size of global work area */
                    544: 
                    545: #define LF      10    /* '\n' on ASCII machines.  Must be 10 due to EBCDIC */
                    546: #define CR      13    /* '\r' on ASCII machines.  Must be 13 due to EBCDIC */
                    547: #define CTRLZ   26    /* DOS & OS/2 EOF marker (used in file_io.c, vms.c) */
                    548: 
                    549: #ifdef EBCDIC
                    550: #  define ascii_to_native(c)   ebcdic[(c)]
                    551: #  define NATIVE    "EBCDIC"
                    552: #endif
                    553: 
                    554: #if MPW
                    555: #  define FFLUSH    putc('\n',stderr);
                    556: #else /* !MPW */
                    557: #  define FFLUSH    fflush(stderr);
                    558: #endif /* ?MPW */
                    559: 
                    560: #ifdef VMS
                    561: #  define ENV_UNZIP     "UNZIP_OPTS"      /* name of environment variable */
                    562: #  define ENV_ZIPINFO   "ZIPINFO_OPTS"
                    563: #else /* !VMS */
                    564: #  define ENV_UNZIP     "UNZIP"
                    565: #  define ENV_ZIPINFO   "ZIPINFO"
                    566: #endif /* ?VMS */
                    567: 
                    568: #ifdef CRYPT
                    569: #  define PWLEN         80
                    570: #  define DECRYPT(b)    (update_keys(t=((b)&0xff)^decrypt_byte()),t)
                    571: #endif /* CRYPT */
                    572: 
                    573: #ifdef QQ  /* Newtware version */
                    574: #  define QCOND   (!quietflg)   /* for no file comments with -vq or -vqq */
                    575: #else      /* (original) Bill Davidsen version  */
                    576: #  define QCOND   (which_hdr)   /* no way to kill file comments with -v, -l */
                    577: #endif
                    578: 
                    579: #ifndef TRUE
                    580: #  define TRUE      1   /* sort of obvious */
                    581: #endif
                    582: #ifndef FALSE
                    583: #  define FALSE     0
                    584: #endif
                    585: 
                    586: #ifndef SEEK_SET        /* These should all be declared in stdio.h!  But   */
                    587: #  define SEEK_SET  0   /*  since they're not (in many cases), do so here. */
                    588: #  define SEEK_CUR  1
                    589: #  define SEEK_END  2
                    590: #endif
                    591: 
                    592: #ifndef S_IRUSR
                    593: #  define S_IRWXU       00700       /* read, write, execute: owner */
                    594: #  define S_IRUSR       00400       /* read permission: owner */
                    595: #  define S_IWUSR       00200       /* write permission: owner */
                    596: #  define S_IXUSR       00100       /* execute permission: owner */
                    597: #  define S_IRWXG       00070       /* read, write, execute: group */
                    598: #  define S_IRGRP       00040       /* read permission: group */
                    599: #  define S_IWGRP       00020       /* write permission: group */
                    600: #  define S_IXGRP       00010       /* execute permission: group */
                    601: #  define S_IRWXO       00007       /* read, write, execute: other */
                    602: #  define S_IROTH       00004       /* read permission: other */
                    603: #  define S_IWOTH       00002       /* write permission: other */
                    604: #  define S_IXOTH       00001       /* execute permission: other */
                    605: #endif /* !S_IRUSR */
                    606: 
                    607: #ifdef ZIPINFO      /* these are individually checked because SysV doesn't */
                    608: #  ifndef S_IFBLK   /*  have some of them, Microsoft C others, etc. */
                    609: #    define   S_IFBLK     0060000     /* block special */
                    610: #  endif
                    611: #  ifndef S_IFIFO  /* in Borland C, not MSC */
                    612: #    define   S_IFIFO     0010000     /* fifo */
                    613: #  endif
                    614: #  ifndef S_IFLNK  /* in BSD, not SysV */
                    615: #    define   S_IFLNK     0120000     /* symbolic link */
                    616: #  endif
                    617: #  ifndef S_IFSOCK  /* in BSD, not SysV */
                    618: #    define   S_IFSOCK    0140000     /* socket */
                    619: #  endif
                    620: #  ifndef S_ISUID
                    621: #    define S_ISUID       04000       /* set user id on execution */
                    622: #  endif
                    623: #  ifndef S_ISGID
                    624: #    define S_ISGID       02000       /* set group id on execution */
                    625: #  endif
                    626: #  ifndef S_ISVTX
                    627: #    define S_ISVTX       01000       /* directory permissions control */
                    628: #  endif
                    629: #  ifndef S_ENFMT
                    630: #    define S_ENFMT       S_ISGID     /* record locking enforcement flag */
                    631: #  endif
                    632: #endif /* ZIPINFO */
                    633: 
                    634: 
                    635: 
                    636: 
                    637: 
                    638: /**************/
                    639: /*  Typedefs  */
                    640: /**************/
                    641: 
                    642: #ifndef _BULL_SOURCE                /* Bull has it defined somewhere already */
                    643:    typedef unsigned char  byte;     /* code assumes UNSIGNED bytes */
                    644: #endif /* !_BULL_SOURCE */
                    645: 
                    646: typedef char              boolean;
                    647: typedef long              longint;
                    648: typedef unsigned short    UWORD;
                    649: typedef unsigned long     ULONG;
                    650: typedef unsigned char     uch;
                    651: typedef unsigned short    ush;
                    652: typedef unsigned long     ulg;
                    653: 
                    654: typedef struct min_info {
                    655:     unsigned unix_attr;
                    656:     unsigned dos_attr;
                    657:     int hostnum;
                    658:     longint offset;
                    659:     ULONG compr_size;        /* compressed size (needed if extended header) */
                    660:     ULONG crc;               /* crc (needed if extended header) */
                    661:     unsigned encrypted : 1;  /* file encrypted: decrypt before uncompressing */
                    662:     unsigned ExtLocHdr : 1;  /* use time instead of CRC for decrypt check */
                    663:     unsigned text : 1;       /* file is text or binary */
                    664:     unsigned lcflag : 1;     /* convert filename to lowercase */
                    665: } min_info;
                    666: 
                    667: typedef struct VMStimbuf {
                    668:     char *revdate;           /* (both correspond to Unix modtime/st_mtime) */
                    669:     char *credate;
                    670: } VMStimbuf;
                    671: 
                    672: /*---------------------------------------------------------------------------
                    673:     Zipfile layout declarations.  If these headers ever change, make sure the
                    674:     xxREC_SIZE defines (above) change with them!
                    675:   ---------------------------------------------------------------------------*/
                    676: 
                    677:    typedef byte   local_byte_hdr[ LREC_SIZE ];
                    678: #      define L_VERSION_NEEDED_TO_EXTRACT_0     0
                    679: #      define L_VERSION_NEEDED_TO_EXTRACT_1     1
                    680: #      define L_GENERAL_PURPOSE_BIT_FLAG        2
                    681: #      define L_COMPRESSION_METHOD              4
                    682: #      define L_LAST_MOD_FILE_TIME              6
                    683: #      define L_LAST_MOD_FILE_DATE              8
                    684: #      define L_CRC32                           10
                    685: #      define L_COMPRESSED_SIZE                 14
                    686: #      define L_UNCOMPRESSED_SIZE               18
                    687: #      define L_FILENAME_LENGTH                 22
                    688: #      define L_EXTRA_FIELD_LENGTH              24
                    689: 
                    690:    typedef byte   cdir_byte_hdr[ CREC_SIZE ];
                    691: #      define C_VERSION_MADE_BY_0               0
                    692: #      define C_VERSION_MADE_BY_1               1
                    693: #      define C_VERSION_NEEDED_TO_EXTRACT_0     2
                    694: #      define C_VERSION_NEEDED_TO_EXTRACT_1     3
                    695: #      define C_GENERAL_PURPOSE_BIT_FLAG        4
                    696: #      define C_COMPRESSION_METHOD              6
                    697: #      define C_LAST_MOD_FILE_TIME              8
                    698: #      define C_LAST_MOD_FILE_DATE              10
                    699: #      define C_CRC32                           12
                    700: #      define C_COMPRESSED_SIZE                 16
                    701: #      define C_UNCOMPRESSED_SIZE               20
                    702: #      define C_FILENAME_LENGTH                 24
                    703: #      define C_EXTRA_FIELD_LENGTH              26
                    704: #      define C_FILE_COMMENT_LENGTH             28
                    705: #      define C_DISK_NUMBER_START               30
                    706: #      define C_INTERNAL_FILE_ATTRIBUTES        32
                    707: #      define C_EXTERNAL_FILE_ATTRIBUTES        34
                    708: #      define C_RELATIVE_OFFSET_LOCAL_HEADER    38
                    709: 
                    710:    typedef byte   ec_byte_rec[ ECREC_SIZE+4 ];
                    711: /*     define SIGNATURE                         0   space-holder only */
                    712: #      define NUMBER_THIS_DISK                  4
                    713: #      define NUM_DISK_WITH_START_CENTRAL_DIR   6
                    714: #      define NUM_ENTRIES_CENTRL_DIR_THS_DISK   8
                    715: #      define TOTAL_ENTRIES_CENTRAL_DIR         10
                    716: #      define SIZE_CENTRAL_DIRECTORY            12
                    717: #      define OFFSET_START_CENTRAL_DIRECTORY    16
                    718: #      define ZIPFILE_COMMENT_LENGTH            20
                    719: 
                    720: 
                    721:    typedef struct local_file_header {                 /* LOCAL */
                    722:        byte version_needed_to_extract[2];
                    723:        UWORD general_purpose_bit_flag;
                    724:        UWORD compression_method;
                    725:        UWORD last_mod_file_time;
                    726:        UWORD last_mod_file_date;
                    727:        ULONG crc32;
                    728:        ULONG compressed_size;
                    729:        ULONG uncompressed_size;
                    730:        UWORD filename_length;
                    731:        UWORD extra_field_length;
                    732:    } local_file_hdr;
                    733: 
                    734:    typedef struct central_directory_file_header {     /* CENTRAL */
                    735:        byte version_made_by[2];
                    736:        byte version_needed_to_extract[2];
                    737:        UWORD general_purpose_bit_flag;
                    738:        UWORD compression_method;
                    739:        UWORD last_mod_file_time;
                    740:        UWORD last_mod_file_date;
                    741:        ULONG crc32;
                    742:        ULONG compressed_size;
                    743:        ULONG uncompressed_size;
                    744:        UWORD filename_length;
                    745:        UWORD extra_field_length;
                    746:        UWORD file_comment_length;
                    747:        UWORD disk_number_start;
                    748:        UWORD internal_file_attributes;
                    749:        ULONG external_file_attributes;
                    750:        ULONG relative_offset_local_header;
                    751:    } cdir_file_hdr;
                    752: 
                    753:    typedef struct end_central_dir_record {            /* END CENTRAL */
                    754:        UWORD number_this_disk;
                    755:        UWORD num_disk_with_start_central_dir;
                    756:        UWORD num_entries_centrl_dir_ths_disk;
                    757:        UWORD total_entries_central_dir;
                    758:        ULONG size_central_directory;
                    759:        ULONG offset_start_central_directory;
                    760:        UWORD zipfile_comment_length;
                    761:    } ecdir_rec;
                    762: 
                    763: 
                    764: 
                    765: 
                    766: 
                    767: /*************************/
                    768: /*  Function Prototypes  */
                    769: /*************************/
                    770: 
                    771: #ifndef __
                    772: #  define __   OF
                    773: #endif
                    774: 
                    775: /*---------------------------------------------------------------------------
                    776:     Functions in unzip.c and/or zipinfo.c:
                    777:   ---------------------------------------------------------------------------*/
                    778: 
                    779: int    usage                     __((int error));
                    780: int    process_zipfile           __((void));
                    781: int    find_end_central_dir      __((void));
                    782: int    process_end_central_dir   __((void));
                    783: int    list_files                __((void));                      /* unzip.c */
                    784: int    process_cdir_file_hdr     __((void));                      /* unzip.c */
                    785: int    process_local_file_hdr    __((void));                      /* unzip.c */
                    786: int    process_central_dir       __((void));
                    787: int    long_info                 __((void));                    /* zipinfo.c */
                    788: int    short_info                __((void));                    /* zipinfo.c */
                    789: char   *zipinfo_time             __((UWORD *datez, UWORD *timez));
                    790: 
                    791: /*---------------------------------------------------------------------------
                    792:     Functions in extract.c:
                    793:   ---------------------------------------------------------------------------*/
                    794: 
                    795: int    extract_or_test_files     __((void));
                    796: /* static int   store_info               __((void)); */
                    797: /* static int   extract_or_test_member   __((void)); */
                    798: int    memextract                __((byte *, ULONG, byte *, ULONG));
                    799: int    FlushMemory               __((void));
                    800: int    ReadMemoryByte            __((UWORD *x));
                    801: 
                    802: /*---------------------------------------------------------------------------
                    803:     Decompression functions:
                    804:   ---------------------------------------------------------------------------*/
                    805: 
                    806: int    explode                   __((void));                    /* explode.c */
                    807: 
                    808: int    inflate                   __((void));                    /* inflate.c */
                    809: 
                    810: void   unReduce                  __((void));                   /* unreduce.c */
                    811: /* static void  LoadFollowers    __((void));                    * unreduce.c */
                    812: 
                    813: void   unShrink                  __((void));                   /* unshrink.c */
                    814: /* static void  partial_clear    __((void));                    * unshrink.c */
                    815: 
                    816: /*---------------------------------------------------------------------------
                    817:     Functions in file_io.c and crypt.c:
                    818:   ---------------------------------------------------------------------------*/
                    819: 
                    820: int    open_input_file           __((void));                    /* file_io.c */
                    821: int    readbuf                   __((char *buf, register unsigned len));
                    822: int    create_output_file        __((void));             /* file_io.c, vms.c */
                    823: int    FillBitBuffer             __((void));                    /* file_io.c */
                    824: int    ReadByte                  __((UWORD *x));                /* file_io.c */
                    825: int    FlushOutput               __((void));             /* file_io.c, vms.c */
                    826: /* static int   dos2unix         __((unsigned char *, int));     * file_io.c */
                    827: void   set_file_time_and_close   __((void));                    /* file_io.c */
                    828: void   handler                   __((int signal));              /* file_io.c */
                    829: int    echo                      __((int opt));                 /* file_io.c */
                    830: void   echoff                    __((int f));                   /* file_io.c */
                    831: void   echon                     __((void));                    /* file_io.c */
                    832: char   *getp                     __((char *, char *, int));     /* file_io.c */
                    833: 
                    834: int    decrypt_byte              __((void));                      /* crypt.c */
                    835: void   update_keys               __((int));                       /* crypt.c */
                    836: void   init_keys                 __((char *));                    /* crypt.c */
                    837: 
                    838: /*---------------------------------------------------------------------------
                    839:     Macintosh file_io functions:
                    840:   ---------------------------------------------------------------------------*/
                    841: 
                    842: #ifdef MACOS
                    843: /* static int   IsHFSDisk        __((int)); */
                    844:    void     macfstest            __((int));
                    845:    int      macmkdir             __((char *, short, long));
                    846:    void     ResolveMacVol        __((short, short *, long *, StringPtr));
                    847:    short    macopen              __((char *, short, short, long));
                    848:    short    maccreat             __((char *, short, long, OSType, OSType));
                    849:    short    macread              __((short, char *, unsigned));
                    850:    short    macwrite             __((short, char *, unsigned));
                    851:    short    macclose             __((short));
                    852:    long     maclseek             __((short, long, short));
                    853: #endif
                    854: 
                    855: /*---------------------------------------------------------------------------
                    856:     OS/2 file_io functions:
                    857:   ---------------------------------------------------------------------------*/
                    858: 
                    859: void     ChangeNameForFAT  __((char *name));                   /* os2unzip.c */
                    860: int      IsFileNameValid   __((char *name));                   /* os2unzip.c */
                    861: int      GetCountryInfo    __((void));                         /* os2unzip.c */
                    862: long     GetFileTime       __((char *name));                   /* os2unzip.c */
                    863: void     SetPathInfo __((char *path, UWORD moddate, UWORD modtime, int flags));
                    864: int      SetLongNameEA     __((char *name, char *longname));   /* os2unzip.c */
                    865: int      IsEA              __((void *extra_field));            /* os2unzip.c */
                    866: ULONG    SizeOfEAs         __((void *extra_field));            /* os2unzip.c */
                    867: void     SetEAs            __((char *path, void *eablock));    /* os2unzip.c */
                    868: int      IsUpperNLS        __((int nChr));                     /* os2unzip.c */
                    869: int      ToLowerNLS        __((int nChr));                     /* os2unzip.c */
                    870: 
                    871: /*---------------------------------------------------------------------------
                    872:     VMS file_io functions:
                    873:   ---------------------------------------------------------------------------*/
                    874: 
                    875: int      check_format      __((void));                              /* vms.c */
                    876: int      find_vms_attrs    __((void));                              /* vms.c */
                    877: int      CloseOutputFile   __((void));                              /* vms.c */
                    878: /* static byte *extract_block __((struct extra_block *, int *, byte *, int));*/
                    879: /* static int  _flush_blocks  __((int final_flag));                  * vms.c */
                    880: /* static int  _flush_records __((int final_flag));                  * vms.c */
                    881: /* static int  WriteBuffer    __((unsigned char *buf, int len));     * vms.c */
                    882: /* static int  WriteRecord    __((unsigned char *rec, int len));     * vms.c */
                    883: /* static void message        __((int string, char *status));        * vms.c */
                    884: 
                    885: int      VMSmunch          __((char *, int, char *));          /* VMSmunch.c */
                    886: 
                    887: /*---------------------------------------------------------------------------
                    888:     Functions in match.c, mapname.c, misc.c, etc.:
                    889:   ---------------------------------------------------------------------------*/
                    890: 
                    891: int      match             __((char *string, char *pattern));     /* match.c */
                    892: 
                    893: int      mapname           __((int create_dirs));               /* mapname.c */
                    894: 
                    895: void     UpdateCRC         __((register unsigned char *s, register int len));
                    896: int      do_string         __((unsigned int len, int option));     /* misc.c */
                    897: time_t   dos_to_unix_time  __((unsigned ddate, unsigned dtime));   /* misc.c */
                    898: int      check_for_newer   __((char *filename));                   /* misc.c */
                    899: int      dateformat        __((void));                             /* misc.c */
                    900: UWORD    makeword          __((byte *b));                          /* misc.c */
                    901: ULONG    makelong          __((byte *sig));                        /* misc.c */
                    902: void     return_VMS        __((int zip_error));                    /* misc.c */
                    903: 
                    904: void     envargs           __((int *, char ***, char *));       /* envargs.c */
                    905: 
                    906: #ifdef AMIGA
                    907:    int   utime             __((char *file, time_t timep[]));      /* utime.c */
                    908: #endif /* AMIGA */
                    909: 
                    910: #ifdef ZMEM   /* these MUST be ifdef'd because of conflicts with the std def */
                    911:    char  *memset           __((register char *buf, register char init,
                    912:                                register unsigned int len));        /* misc.c */
                    913:    char  *memcpy           __((register char *dst, register char *src,
                    914:                                register unsigned int len));        /* misc.c */
                    915: #endif /* ZMEM */
                    916: 
                    917: 
                    918: 
                    919: 
                    920: 
                    921: /************/
                    922: /*  Macros  */
                    923: /************/
                    924: 
                    925: #ifndef MAX
                    926: #  define MAX(a,b)   ((a) > (b) ? (a) : (b))
                    927: #endif
                    928: 
                    929: #ifndef MIN
                    930: #  define MIN(a,b)   ((a) < (b) ? (a) : (b))
                    931: #endif
                    932: 
                    933: 
                    934: #define LSEEK(abs_offset) {longint request=(abs_offset)+extra_bytes,\
                    935:    inbuf_offset=request%INBUFSIZ, bufstart=request-inbuf_offset;\
                    936:    if(request<0) {fprintf(stderr, SeekMsg, ReportMsg); return(3);}\
                    937:    else if(bufstart!=cur_zipfile_bufstart)\
                    938:    {cur_zipfile_bufstart=lseek(zipfd,bufstart,SEEK_SET);\
                    939:    if((incnt=read(zipfd,(char *)inbuf,INBUFSIZ))<=0) return(51);\
                    940:    inptr=inbuf+(int)inbuf_offset; incnt-=(int)inbuf_offset;} else\
                    941:    {incnt+=(inptr-inbuf)-(int)inbuf_offset; inptr=inbuf+(int)inbuf_offset;}}
                    942: 
                    943: /*
                    944:  *  Seek to the block boundary of the block which includes abs_offset,
                    945:  *  then read block into input buffer and set pointers appropriately.
                    946:  *  If block is already in the buffer, just set the pointers.  This macro
                    947:  *  is used by process_end_central_dir (unzip.c) and do_string (misc.c).
                    948:  *  A slightly modified version is embedded within extract_or_test_files
                    949:  *  (unzip.c).  ReadByte and readbuf (file_io.c) are compatible.
                    950:  *
                    951:  *  macro LSEEK(abs_offset)
                    952:  *      ULONG   abs_offset;
                    953:  *  {
                    954:  *      longint   request = abs_offset + extra_bytes;
                    955:  *      longint   inbuf_offset = request % INBUFSIZ;
                    956:  *      longint   bufstart = request - inbuf_offset;
                    957:  *
                    958:  *      if (request < 0) {
                    959:  *          fprintf(stderr, SeekMsg, ReportMsg);
                    960:  *          return(3);             /-* 3:  severe error in zipfile *-/
                    961:  *      } else if (bufstart != cur_zipfile_bufstart) {
                    962:  *          cur_zipfile_bufstart = lseek(zipfd, bufstart, SEEK_SET);
                    963:  *          if ((incnt = read(zipfd,inbuf,INBUFSIZ)) <= 0)
                    964:  *              return(51);        /-* 51:  unexpected EOF *-/
                    965:  *          inptr = inbuf + (int)inbuf_offset;
                    966:  *          incnt -= (int)inbuf_offset;
                    967:  *      } else {
                    968:  *          incnt += (inptr-inbuf) - (int)inbuf_offset;
                    969:  *          inptr = inbuf + (int)inbuf_offset;
                    970:  *      }
                    971:  *  }
                    972:  *
                    973:  */
                    974: 
                    975: 
                    976: #define SKIP_(length) if(length&&((error=do_string(length,SKIP))!=0))\
                    977:   {error_in_archive=error; if(error>1) return error;}
                    978: 
                    979: /*
                    980:  *  Skip a variable-length field, and report any errors.  Used in zipinfo.c
                    981:  *  and unzip.c in several functions.
                    982:  *
                    983:  *  macro SKIP_(length)
                    984:  *      UWORD   length;
                    985:  *  {
                    986:  *      if (length && ((error = do_string(length, SKIP)) != 0)) {
                    987:  *          error_in_archive = error;   /-* might be warning *-/
                    988:  *          if (error > 1)              /-* fatal *-/
                    989:  *              return (error);
                    990:  *      }
                    991:  *  }
                    992:  *
                    993:  */
                    994: 
                    995: 
                    996: #define OUTB(intc) {*outptr++=(byte)(intc); if (++outcnt==OUTBUFSIZ)\
                    997:   FlushOutput();}
                    998: 
                    999: /*
                   1000:  *  macro OUTB(intc)
                   1001:  *  {
                   1002:  *      *outptr++ = (byte)(intc);
                   1003:  *      if (++outcnt == OUTBUFSIZ)
                   1004:  *          FlushOutput();
                   1005:  *  }
                   1006:  *
                   1007:  */
                   1008: 
                   1009: 
                   1010: #define READBIT(nbits,zdest) {if(nbits>bits_left) FillBitBuffer();\
                   1011:   zdest=(int)((UWORD)bitbuf&mask_bits[nbits]);bitbuf>>=nbits;bits_left-=nbits;}
                   1012: 
                   1013: /*
                   1014:  * macro READBIT(nbits,zdest)
                   1015:  *  {
                   1016:  *      if (nbits > bits_left)
                   1017:  *          FillBitBuffer();
                   1018:  *      zdest = (int)((UWORD)bitbuf & mask_bits[nbits]);
                   1019:  *      bitbuf >>= nbits;
                   1020:  *      bits_left -= nbits;
                   1021:  *  }
                   1022:  *
                   1023:  */
                   1024: 
                   1025: 
                   1026: #define PEEKBIT(nbits) (nbits>bits_left? (FillBitBuffer(),\
                   1027:   (UWORD)bitbuf & mask_bits[nbits]) : (UWORD)bitbuf & mask_bits[nbits])
                   1028: 
                   1029: 
                   1030: #define NUKE_CRs(buf,len) {register int i,j; for (i=j=0; j<len;\
                   1031:   (buf)[i++]=(buf)[j++]) if ((buf)[j]=='\r') ++j; len=i;}
                   1032: 
                   1033: /*
                   1034:  *  Remove all the ASCII carriage returns from buffer buf (length len),
                   1035:  *  shortening as necessary (note that len gets modified in the process,
                   1036:  *  so it CANNOT be an expression).  This macro is intended to be used
                   1037:  *  BEFORE A_TO_N(); hence the check for CR instead of '\r'.  NOTE:  The
                   1038:  *  if-test gets performed one time too many, but it doesn't matter.
                   1039:  *
                   1040:  *  macro NUKE_CRs(buf,len)
                   1041:  *  {
                   1042:  *      register int   i, j;
                   1043:  *
                   1044:  *      for (i = j = 0;  j < len;  (buf)[i++] = (buf)[j++])
                   1045:  *          if ((buf)[j] == CR)
                   1046:  *              ++j;
                   1047:  *      len = i;
                   1048:  *  }
                   1049:  *
                   1050:  */
                   1051: 
                   1052: 
                   1053: #define TOLOWER(str1,str2) {char *ps1,*ps2; ps1=(str1)-1; ps2=(str2);\
                   1054:   while(*++ps1) *ps2++=(char)(isupper((int)(*ps1))?tolower((int)(*ps1)):*ps1);\
                   1055:   *ps2='\0';}
                   1056: 
                   1057: /*
                   1058:  *  Copy the zero-terminated string in str1 into str2, converting any
                   1059:  *  uppercase letters to lowercase as we go.  str2 gets zero-terminated
                   1060:  *  as well, of course.  str1 and str2 may be the same character array.
                   1061:  *
                   1062:  *  macro TOLOWER( str1, str2 )
                   1063:  *  {
                   1064:  *      char  *ps1, *ps2;
                   1065:  *
                   1066:  *      ps1 = (str1) - 1;
                   1067:  *      ps2 = (str2);
                   1068:  *      while (*++ps1)
                   1069:  *          *ps2++ = (char)(isupper((int)(*ps1))? tolower((int)(*ps1)) : *ps1);
                   1070:  *      *ps2='\0';
                   1071:  *  }
                   1072:  *
                   1073:  *  NOTES:  This macro makes no assumptions about the characteristics of
                   1074:  *    the tolower() function or macro (beyond its existence), nor does it
                   1075:  *    make assumptions about the structure of the character set (i.e., it
                   1076:  *    should work on EBCDIC machines, too).  The fact that either or both
                   1077:  *    of isupper() and tolower() may be macros has been taken into account;
                   1078:  *    watch out for "side effects" (in the C sense) when modifying this
                   1079:  *    macro.
                   1080:  */
                   1081: 
                   1082: 
                   1083: #ifndef ascii_to_native
                   1084: #  define ascii_to_native(c)   (c)
                   1085: #  define A_TO_N(str1)
                   1086: #else
                   1087: #  ifndef NATIVE
                   1088: #    define NATIVE     "native chars"
                   1089: #  endif
                   1090: #  define A_TO_N(str1) {register unsigned char *ps1;\
                   1091:      for (ps1=str1; *ps1; ps1++) *ps1=ascii_to_native(*ps1);}
                   1092: #endif
                   1093: 
                   1094: /*
                   1095:  *  Translate the zero-terminated string in str1 from ASCII to the native
                   1096:  *  character set. The translation is performed in-place and uses the
                   1097:  *  ascii_to_native macro to translate each character.
                   1098:  *
                   1099:  *  macro A_TO_N( str1 )
                   1100:  *  {
                   1101:  *      register unsigned char *ps1;
                   1102:  *
                   1103:  *      for (ps1 = str1;  *ps1;  ++ps1)
                   1104:  *          *ps1 = ascii_to_native(*ps1);
                   1105:  *  }
                   1106:  *
                   1107:  *  NOTE:  Using the ascii_to_native macro means that is it the only part of
                   1108:  *    unzip which knows which translation table (if any) is actually in use
                   1109:  *    to produce the native character set.  This makes adding new character
                   1110:  *    set translation tables easy, insofar as all that is needed is an
                   1111:  *    appropriate ascii_to_native macro definition and the translation
                   1112:  *    table itself.  Currently, the only non-ASCII native character set
                   1113:  *    implemented is EBCDIC, but this may not always be so.
                   1114:  */
                   1115: 
                   1116: 
                   1117: 
                   1118: 
                   1119: 
                   1120: /*************/
                   1121: /*  Globals  */
                   1122: /*************/
                   1123: 
                   1124:    extern int       aflag;
                   1125: /* extern int       bflag;   reserved */
                   1126:    extern int       cflag;
                   1127:    extern int       fflag;
                   1128:    extern int       jflag;
                   1129:    extern int       overwrite_none;
                   1130:    extern int       overwrite_all;
                   1131:    extern int       force_flag;
                   1132:    extern int       quietflg;
                   1133: #ifdef DOS_OS2
                   1134:    extern int       sflag;
                   1135: #endif
                   1136:    extern int       tflag;
                   1137:    extern int       uflag;
                   1138:    extern int       V_flag;
                   1139: #ifdef VMS
                   1140:    extern int       secinf;
                   1141: #endif
                   1142: #ifdef MACOS
                   1143:    extern int       hfsflag;
                   1144: #endif
                   1145:    extern int       process_all_files;
                   1146:    extern longint   csize;
                   1147:    extern longint   ucsize;
                   1148:    extern char      *fnames[];
                   1149:    extern char      **fnv;
                   1150:    extern char      sig[];
                   1151:    extern char      answerbuf[];
                   1152:    extern min_info  *pInfo;
                   1153:    extern char      *key;
                   1154:    extern ULONG     keys[];
                   1155: 
                   1156: #ifdef MACOS
                   1157:    union work {
                   1158:      struct {
                   1159:        short *Prefix_of;        /* (8193 * sizeof(short)) */
                   1160:        byte *Suffix_of;
                   1161:        byte *Stack;
                   1162:      } shrink;
                   1163:      byte *Slide;
                   1164:    };
                   1165: #else
                   1166:    union work {
                   1167:      struct {
                   1168:        short Prefix_of[HSIZE + 2];      /* (8194 * sizeof(short)) */
                   1169:        byte Suffix_of[HSIZE + 2];       /* also s-f length_nodes (smaller) */
                   1170:        byte Stack[HSIZE + 2];           /* also s-f distance_nodes (smaller) */
                   1171:      } shrink;
                   1172:      byte Slide[WSIZE];
                   1173:    };
                   1174: #endif
                   1175:    extern union work area;
                   1176: 
                   1177: #  define prefix_of area.shrink.Prefix_of
                   1178: #  define suffix_of area.shrink.Suffix_of
                   1179: #  define stack area.shrink.Stack
                   1180: #  define slide area.Slide
                   1181: 
                   1182:    extern ULONG     crc32val;
                   1183:    extern UWORD     mask_bits[];
                   1184: 
                   1185:    extern byte      *inbuf;
                   1186:    extern byte      *inptr;
                   1187:    extern int       incnt;
                   1188:    extern ULONG     bitbuf;
                   1189:    extern int       bits_left;
                   1190:    extern boolean   zipeof;
                   1191:    extern int       zipfd;
                   1192: #ifdef MSWIN
                   1193:    extern char      *zipfn;
                   1194: #else
                   1195:    extern char      zipfn[];
                   1196: #endif
                   1197:    extern longint   extra_bytes;
                   1198:    extern longint   cur_zipfile_bufstart;
                   1199:    extern byte      *extra_field;
                   1200:    extern char      local_hdr_sig[];
                   1201:    extern char      central_hdr_sig[];
                   1202:    extern char      end_central_sig[];
                   1203:    extern local_file_hdr  lrec;
                   1204:    extern cdir_file_hdr   crec;
                   1205:    extern ecdir_rec       ecrec;
                   1206:    extern struct stat     statbuf;
                   1207: 
                   1208:    extern byte      *outbuf;
                   1209:    extern byte      *outptr;
                   1210: #ifdef MSWIN
                   1211:    extern byte __far *outout;
                   1212:    extern char     *filename;
                   1213: #else
                   1214:    extern byte      *outout;
                   1215:    extern char      filename[];
                   1216: #endif
                   1217:    extern longint   outpos;
                   1218:    extern int       outcnt;
                   1219:    extern int       outfd;
                   1220:    extern int       mem_mode;
                   1221:    extern int       disk_full;
                   1222: 
                   1223:    extern char      *EndSigMsg;
                   1224:    extern char      *CentSigMsg;
                   1225:    extern char      *SeekMsg;
                   1226:    extern char      *ReportMsg;
                   1227: 
                   1228: #ifdef DECLARE_ERRNO
                   1229:    extern int       errno;
                   1230: #endif
                   1231: 
                   1232: #ifdef EBCDIC
                   1233:    extern byte      ebcdic[];
                   1234: #endif
                   1235: 
                   1236: #ifdef MACOS
                   1237:    extern short     gnVRefNum;
                   1238:    extern long      glDirID;
                   1239:    extern OSType    gostCreator;
                   1240:    extern OSType    gostType;
                   1241:    extern boolean   fMacZipped;
                   1242:    extern boolean   macflag;
                   1243:    extern short     giCursor;
                   1244:    extern CursHandle rghCursor[];
                   1245: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.