globals.h
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:14k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. /*---------------------------------------------------------------------------
  2.   globals.h
  3.   There is usually no need to include this file since unzip.h includes it.
  4.   This header file is used by all of the UnZip source files.  It contains
  5.   a struct definition that is used to "house" all of the global variables.
  6.   This is done to allow for multithreaded environments (OS/2, NT, Win95,
  7.   Unix) to call UnZip through an API without a semaphore.  REENTRANT should
  8.   be defined for all platforms that require this.
  9.   GLOBAL CONSTRUCTOR AND DESTRUCTOR (API WRITERS READ THIS!!!)
  10.   ------------------------------------------------------------
  11.   No, it's not C++, but it's as close as we can get with K&R.
  12.   The main() of each process that uses these globals must include the
  13.   CONSTRUCTGLOBALS; statement.  This will malloc enough memory for the
  14.   structure and initialize any variables that require it.  This must
  15.   also be done by any API function that jumps into the middle of the
  16.   code.
  17.   The DESTROYGLOBALS; statement should be inserted before EVERY "EXIT(n)".
  18.   Naturally, it also needs to be put before any API returns as well.
  19.   In fact, it's much more important in API functions since the process
  20.   will NOT end, and therefore the memory WON'T automatically be freed
  21.   by the operating system.
  22.   USING VARIABLES FROM THE STRUCTURE
  23.   ----------------------------------
  24.   All global variables must now be prefixed with `G.' which is either a
  25.   global struct (in which case it should be the only global variable) or
  26.   a macro for the value of a local pointer variable that is passed from
  27.   function to function.  Yes, this is a pain.  But it's the only way to
  28.   allow full reentrancy.
  29.   ADDING VARIABLES TO THE STRUCTURE
  30.   ---------------------------------
  31.   If you make the inclusion of any variables conditional, be sure to only
  32.   check macros that are GUARANTEED to be included in every module.
  33.   For instance, newzip and pwdarg are needed only if CRYPT is TRUE,
  34.   but this is defined after unzip.h has been read.  If you are not careful,
  35.   some modules will expect your variable to be part of this struct while
  36.   others won't.  This will cause BIG problems. (Inexplicable crashes at
  37.   strange times, car fires, etc.)  When in doubt, always include it!
  38.   Note also that UnZipSFX needs a few variables that UnZip doesn't.  However,
  39.   it also includes some object files from UnZip.  If we were to conditionally
  40.   include the extra variables that UnZipSFX needs, the object files from
  41.   UnZip would not mesh with the UnZipSFX object files.  Result: we just
  42.   include the UnZipSFX variables every time.  (It's only an extra 4 bytes
  43.   so who cares!)
  44.   ADDING FUNCTIONS
  45.   ----------------
  46.   To support this new global struct, all functions must now conditionally
  47.   pass the globals pointer (pG) to each other.  This is supported by 5 macros:
  48.   __GPRO, __GPRO__, __G, __G__ and __GDEF.  A function that needs no other
  49.   parameters would look like this:
  50.     int extract_or_test_files(__G)
  51.       __GDEF
  52.     {
  53.        ... stuff ...
  54.     }
  55.   A function with other parameters would look like:
  56.     int memextract(__G__ tgt, tgtsize, src, srcsize)
  57.         __GDEF
  58.         uch *tgt, *src;
  59.         ulg tgtsize, srcsize;
  60.     {
  61.       ... stuff ...
  62.     }
  63.   In the Function Prototypes section of unzpriv.h, you should use __GPRO and
  64.   __GPRO__ instead:
  65.     int  uz_opts                   OF((__GPRO__ int *pargc, char ***pargv));
  66.     int  process_zipfiles          OF((__GPRO));
  67.   Note that there is NO comma after __G__ or __GPRO__ and no semi-colon after
  68.   __GDEF.  I wish there was another way but I don't think there is.
  69.   TESTING THE CODE
  70.   -----------------
  71.   Whether your platform requires reentrancy or not, you should always try
  72.   building with REENTRANT defined if any functions have been added.  It is
  73.   pretty easy to forget a __G__ or a __GDEF and this mistake will only show
  74.   up if REENTRANT is defined.  All platforms should run with REENTRANT
  75.   defined.  Platforms that can't take advantage of it will just be paying
  76.   a performance penalty needlessly.
  77.   SIGNAL MADNESS
  78.   --------------
  79.   This whole pointer passing scheme falls apart when it comes to SIGNALs.
  80.   I handle this situation 2 ways right now.  If you define USETHREADID,
  81.   UnZip will include a 64-entry table.  Each entry can hold a global
  82.   pointer and thread ID for one thread.  This should allow up to 64
  83.   threads to access UnZip simultaneously.  Calling DESTROYGLOBALS()
  84.   will free the global struct and zero the table entry.  If somebody
  85.   forgets to call DESTROYGLOBALS(), this table will eventually fill up
  86.   and UnZip will exit with an error message.  A good way to test your
  87.   code to make sure you didn't forget a DESTROYGLOBALS() is to change
  88.   THREADID_ENTRIES to 3 or 4 in globals.c, making the table real small.
  89.   Then make a small test program that calls your API a dozen times.
  90.   Those platforms that don't have threads still need to be able to compile
  91.   with REENTRANT defined to test and see if new code is correctly written
  92.   to work either way.  For these platforms, I simply keep a global pointer
  93.   called GG that points to the Globals structure.  Good enough for testing.
  94.   I believe that NT has thread level storage.  This could probably be used
  95.   to store a global pointer for the sake of the signal handler more cleanly
  96.   than my table approach.
  97.   ---------------------------------------------------------------------------*/
  98. #ifndef __globals_h
  99. #define __globals_h
  100. #ifdef USE_ZLIB
  101. #  include "zlib.h"
  102. #endif
  103. /*************/
  104. /*  Globals  */
  105. /*************/
  106. typedef struct Globals {
  107. #ifdef DLL
  108.     zvoid *callerglobs; /* pointer to structure of pass-through global vars */
  109. #endif
  110.     /* command options of general use */
  111.     UzpOpts UzO;        /* command options of general use */
  112. #ifndef FUNZIP
  113.     /* command options specific to the high level command line interface */
  114. #ifdef MORE
  115.     int M_flag;         /* -M: built-in "more" function */
  116. #endif
  117.     /* internal flags and general globals */
  118. #ifdef MORE
  119.     int height;           /* check for SIGWINCH, etc., eventually... */
  120. #endif                    /* (take line-wrapping into account?) */
  121. #if (defined(IZ_CHECK_TZ) && defined(USE_EF_UT_TIME))
  122.     int tz_is_valid;      /* indicates that timezone info can be used */
  123. #endif
  124. #ifdef WINDLL
  125.     int prompt_always;    /* prompt to overwrite if TRUE */
  126. #endif
  127.     int noargs;           /* did true command line have *any* arguments? */
  128.     unsigned filespecs;   /* number of real file specifications to be matched */
  129.     unsigned xfilespecs;  /* number of excluded filespecs to be matched */
  130.     int process_all_files;
  131.     int create_dirs;      /* used by main(), mapname(), checkdir() */
  132.     int extract_flag;
  133.     int newzip;           /* reset in extract.c; used in crypt.c */
  134.     LONGINT   real_ecrec_offset;
  135.     LONGINT   expect_ecrec_offset;
  136.     long csize;           /* used by decompr. (NEXTBYTE): must be signed */
  137.     long ucsize;          /* used by unReduce(), explode() */
  138.     long used_csize;      /* used by extract_or_test_member(), explode() */
  139. #ifdef DLL
  140.      int fValidate;       /* true if only validating an archive */
  141.      int filenotfound;
  142.      int redirect_data;   /* redirect data to memory buffer */
  143.      int redirect_text;   /* redirect text output to buffer */
  144. # ifndef NO_SLIDE_REDIR
  145.      int redirect_slide;  /* redirect decompression area to mem buffer */
  146.      unsigned _wsize;
  147. # endif
  148.      unsigned redirect_size;       /* size of redirected output buffer */
  149.      uch *redirect_buffer;         /* pointer to head of allocated buffer */
  150.      uch *redirect_pointer;        /* pointer past end of written data */
  151. # ifndef NO_SLIDE_REDIR
  152.      uch *redirect_sldptr;         /* head of decompression slide buffer */
  153. # endif
  154. # ifdef OS2DLL
  155.      cbList(processExternally);    /* call-back list */
  156. # endif
  157. #endif /* DLL */
  158.     char **pfnames;
  159.     char **pxnames;
  160.     char sig[4];
  161.     char answerbuf[10];
  162.     min_info info[DIR_BLKSIZ];
  163.     min_info *pInfo;
  164. #endif /* !FUNZIP */
  165.     union work area;                /* see unzpriv.h for definition of work */
  166. #ifndef FUNZIP
  167. #  if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB))
  168.     ZCONST ulg near *crc_32_tab;
  169. #  else
  170.     ZCONST ulg Far *crc_32_tab;
  171. #  endif
  172. #endif
  173.     ulg       crc32val;             /* CRC shift reg. (was static in funzip) */
  174. #ifdef FUNZIP
  175.     FILE     *in;                   /* file descriptor of compressed stream */
  176. #endif
  177.     uch       *inbuf;               /* input buffer (any size is OK) */
  178.     uch       *inptr;               /* pointer into input buffer */
  179.     int       incnt;
  180. #ifndef FUNZIP
  181.     ulg       bitbuf;
  182.     int       bits_left;            /* unreduce and unshrink only */
  183.     int       zipeof;
  184.     char      *argv0;               /* used for NT and EXE_EXTENSION */
  185.     char      *wildzipfn;
  186.     char      *zipfn;    /* GRR:  WINDLL:  must nuke any malloc'd zipfn... */
  187. #ifdef USE_STRM_INPUT
  188.     FILE      *zipfd;               /* zipfile file descriptor */
  189. #else
  190.     int       zipfd;                /* zipfile file handle */
  191. #endif
  192.     LONGINT   ziplen;
  193.     LONGINT   cur_zipfile_bufstart; /* extract_or_test, readbuf, ReadByte */
  194.     LONGINT   extra_bytes;          /* used in unzip.c, misc.c */
  195.     uch       *extra_field;         /* Unix, VMS, Mac, OS/2, Acorn, ... */
  196.     uch       *hold;
  197.     local_file_hdr  lrec;          /* used in unzip.c, extract.c */
  198.     cdir_file_hdr   crec;          /* used in unzip.c, extract.c, misc.c */
  199.     ecdir_rec       ecrec;         /* used in unzip.c, extract.c */
  200.     struct stat     statbuf;       /* used by main, mapname, check_for_newer */
  201.     int      mem_mode;
  202.     uch      *outbufptr;           /* extract.c static */
  203.     ulg      outsize;              /* extract.c static */
  204.     int      reported_backslash;   /* extract.c static */
  205.     int      disk_full;
  206.     int      newfile;
  207.     int      didCRlast;            /* fileio static */
  208.     ulg      numlines;             /* fileio static: number of lines printed */
  209.     int      sol;                  /* fileio static: at start of line */
  210.     int      no_ecrec;             /* process static */
  211. #ifdef SYMLINKS
  212.     int      symlnk;
  213. #endif
  214. #ifdef NOVELL_BUG_FAILSAFE
  215.     int      dne;                  /* true if stat() says file doesn't exist */
  216. #endif
  217.     FILE     *outfile;
  218.     uch      *outbuf;
  219.     uch      *realbuf;
  220. #ifndef VMS                        /* if SMALL_MEM, outbuf2 is initialized in */
  221.     uch      *outbuf2;             /*  process_zipfiles() (never changes); */
  222. #endif                             /*  else malloc'd ONLY if unshrink and -a */
  223. #endif /* !FUNZIP */
  224.     uch      *outptr;
  225.     ulg      outcnt;               /* number of chars stored in outbuf */
  226. #ifndef FUNZIP
  227.     char     filename[FILNAMSIZ];  /* also used by NT for temporary SFX path */
  228. #ifdef CMS_MVS
  229.     char     *tempfn;              /* temp file used; erase on close */
  230. #endif
  231.     char *key;         /* crypt static: decryption password or NULL */
  232.     int nopwd;         /* crypt static */
  233. #endif /* !FUNZIP */
  234.     ulg keys[3];       /* crypt static: keys defining pseudo-random sequence */
  235. #if (!defined(DOS_FLX_H68_OS2_W32) && !defined(AMIGA) && !defined(RISCOS))
  236. #if (!defined(MACOS) && !defined(ATARI) && !defined(VMS))
  237.     int echofd;        /* ttyio static: file descriptor whose echo is off */
  238. #endif /* !(MACOS || ATARI || VMS) */
  239. #endif /* !(DOS_FLX_H68_OS2_W32 || AMIGA || RISCOS) */
  240.     unsigned hufts;    /* track memory usage */
  241. #ifdef USE_ZLIB
  242.     int inflInit;             /* inflate static: zlib inflate() initialized */
  243.     z_stream dstrm;           /* inflate global: decompression stream */
  244. #else
  245.     struct huft *fixed_tl;    /* inflate static */
  246.     struct huft *fixed_td;    /* inflate static */
  247.     int fixed_bl, fixed_bd;   /* inflate static */
  248.     unsigned wp;              /* inflate static: current position in slide */
  249.     ulg bb;                   /* inflate static: bit buffer */
  250.     unsigned bk;              /* inflate static: bits in bit buffer */
  251. #endif /* ?USE_ZLIB */
  252. #ifndef FUNZIP
  253. #ifdef SMALL_MEM
  254.     char rgchBigBuffer[512];
  255.     char rgchSmallBuffer[96];
  256.     char rgchSmallBuffer2[160];  /* boosted to 160 for local3[] in unzip.c */
  257. #endif
  258.     MsgFn *message;
  259.     InputFn *input;
  260.     PauseFn *mpause;
  261.     PasswdFn *decr_passwd;
  262.     StatCBFn *statreportcb;
  263. #ifdef WINDLL
  264.     LPUSERFUNCTIONS lpUserFunctions;
  265. #endif
  266.     int incnt_leftover;       /* so improved NEXTBYTE does not waste input */
  267.     uch *inptr_leftover;
  268. #ifdef VMS_TEXT_CONV
  269.     int VMS_line_state;       /* so native VMS variable-length text files are */
  270.     int VMS_line_length;      /*  readable on other platforms */
  271.     int VMS_line_pad;
  272. #endif
  273. #endif /* !FUNZIP */
  274. #ifdef SYSTEM_SPECIFIC_GLOBALS
  275.     SYSTEM_SPECIFIC_GLOBALS
  276. #endif
  277. } Uz_Globs;  /* end of struct Globals */
  278. /***************************************************************************/
  279. #ifdef FUNZIP
  280. #  if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB))
  281.      extern ZCONST ulg near  crc_32_tab[256];
  282. #  else
  283.      extern ZCONST ulg Far *crc_32_tab;
  284. #  endif
  285. #  define CRC_32_TAB  crc_32_tab
  286. #else
  287. #  define CRC_32_TAB  G.crc_32_tab
  288. #endif
  289. Uz_Globs *globalsCtor   OF((void));
  290. /* pseudo constant sigs; they are initialized at runtime so unzip executable
  291.  * won't look like a zipfile
  292.  */
  293. extern char local_hdr_sig[4];
  294. extern char central_hdr_sig[4];
  295. extern char end_central_sig[4];
  296. /* extern char extd_local_sig[4];  NOT USED YET */
  297. #ifdef REENTRANT
  298. #  define G                   (*(Uz_Globs *)pG)
  299. #  define __G                 pG
  300. #  define __G__               pG,
  301. #  define __GPRO              Uz_Globs *pG
  302. #  define __GPRO__            Uz_Globs *pG,
  303. #  define __GDEF              Uz_Globs *pG;
  304. #  ifdef  USETHREADID
  305.      extern int               lastScan;
  306.      void deregisterGlobalPointer OF((__GPRO));
  307.      Uz_Globs *getGlobalPointer   OF((void));
  308. #    define GETGLOBALS()      Uz_Globs *pG = getGlobalPointer();
  309. #    define DESTROYGLOBALS()  {free_G_buffers(pG); deregisterGlobalPointer(pG);}
  310. #  else
  311.      extern Uz_Globs          *GG;
  312. #    define GETGLOBALS()      Uz_Globs *pG = GG;
  313. #    define DESTROYGLOBALS()  {free_G_buffers(pG); free(pG);}
  314. #  endif /* ?USETHREADID */
  315. #  define CONSTRUCTGLOBALS()  Uz_Globs *pG = globalsCtor()
  316. #else /* !REENTRANT */
  317.    extern Uz_Globs            G;
  318. #  define __G
  319. #  define __G__
  320. #  define __GPRO              void
  321. #  define __GPRO__
  322. #  define __GDEF
  323. #  define GETGLOBALS()
  324. #  define CONSTRUCTGLOBALS()  globalsCtor()
  325. #  define DESTROYGLOBALS()
  326. #endif /* ?REENTRANT */
  327. #define uO              G.UzO
  328. #endif /* __globals_h */