⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 globals.h

📁 zip压缩
💻 H
📖 第 1 页 / 共 2 页
字号:
/*  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*//*---------------------------------------------------------------------------  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;    {      ... 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"#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 */    LONGINT   real_ecrec_offset;    LONGINT   expect_ecrec_offset;    long csize;           /* used by decompr. (NEXTBYTE): must be signed */    long 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];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -