|
- /*
- Copyright (c) 1990-2007 Info-ZIP. All rights reserved.
-
- See the accompanying file LICENSE, version 2003-May-08 or later
- (the contents of which are also included in unzip.h) for terms of use.
- If, for some reason, all these files are missing, the Info-ZIP license
- also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
- */
- /*---------------------------------------------------------------------------
-
- globals.c
-
- Routines to allocate and initialize globals, with or without threads.
-
- Contents: registerGlobalPointer()
- deregisterGlobalPointer()
- getGlobalPointer()
- globalsCtor()
-
- ---------------------------------------------------------------------------*/
-
-
- #define UNZIP_INTERNAL
- #include "unzip.h"
-
- #ifndef FUNZIP
- /* initialization of sigs is completed at runtime so unzip(sfx) executable
- * won't look like a zipfile
- */
- char central_hdr_sig[4] = {0, 0, 0x01, 0x02};
- char local_hdr_sig[4] = {0, 0, 0x03, 0x04};
- char end_central_sig[4] = {0, 0, 0x05, 0x06};
- char end_central64_sig[4] = {0, 0, 0x06, 0x06};
- char end_centloc64_sig[4] = {0, 0, 0x06, 0x07};
- /* extern char extd_local_sig[4] = {0, 0, 0x07, 0x08}; NOT USED YET */
-
- ZCONST char *fnames[2] = {"*", NULL}; /* default filenames vector */
- #endif
-
-
- #ifndef REENTRANT
- Uz_Globs G;
- #else /* REENTRANT */
-
- # ifndef USETHREADID
- Uz_Globs *GG;
- # else /* USETHREADID */
- # define THREADID_ENTRIES 0x40
-
- int lastScan;
- Uz_Globs *threadPtrTable[THREADID_ENTRIES];
- ulg threadIdTable [THREADID_ENTRIES] = {
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* Make sure there are */
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* THREADID_ENTRIES 0s */
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
- };
-
- static ZCONST char Far TooManyThreads[] =
- "error: more than %d simultaneous threads.\n\
- Some threads are probably not calling DESTROYTHREAD()\n";
- static ZCONST char Far EntryNotFound[] =
- "error: couldn't find global pointer in table.\n\
- Maybe somebody accidentally called DESTROYTHREAD() twice.\n";
- static ZCONST char Far GlobalPointerMismatch[] =
- "error: global pointer in table does not match pointer passed as\
- parameter\n";
-
- static void registerGlobalPointer OF((__GPRO));
-
-
-
- static void registerGlobalPointer(__G)
- __GDEF
- {
- int scan=0;
- ulg tid = GetThreadId();
-
- while (threadIdTable[scan] && scan < THREADID_ENTRIES)
- scan++;
-
- if (scan == THREADID_ENTRIES) {
- ZCONST char *tooMany = LoadFarString(TooManyThreads);
- Info(slide, 0x421, ((char *)slide, tooMany, THREADID_ENTRIES));
- free(pG);
- EXIT(PK_MEM); /* essentially memory error before we've started */
- }
-
- threadIdTable [scan] = tid;
- threadPtrTable[scan] = pG;
- lastScan = scan;
- }
-
-
-
- void deregisterGlobalPointer(__G)
- __GDEF
- {
- int scan=0;
- ulg tid = GetThreadId();
-
-
- while (threadIdTable[scan] != tid && scan < THREADID_ENTRIES)
- scan++;
-
- /*---------------------------------------------------------------------------
- There are two things we can do if we can't find the entry: ignore it or
- scream. The most likely reason for it not to be here is the user calling
- this routine twice. Since this could cause BIG problems if any globals
- are accessed after the first call, we'd better scream.
- ---------------------------------------------------------------------------*/
-
- if (scan == THREADID_ENTRIES || threadPtrTable[scan] != pG) {
- ZCONST char *noEntry;
- if (scan == THREADID_ENTRIES)
- noEntry = LoadFarString(EntryNotFound);
- else
- noEntry = LoadFarString(GlobalPointerMismatch);
- Info(slide, 0x421, ((char *)slide, noEntry));
- EXIT(PK_WARN); /* programming error, but after we're all done */
- }
-
- threadIdTable [scan] = 0;
- lastScan = scan;
- free(threadPtrTable[scan]);
- }
-
-
-
- Uz_Globs *getGlobalPointer()
- {
- int scan=0;
- ulg tid = GetThreadId();
-
- while (threadIdTable[scan] != tid && scan < THREADID_ENTRIES)
- scan++;
-
- /*---------------------------------------------------------------------------
- There are two things we can do if we can't find the entry: ignore it or
- scream. The most likely reason for it not to be here is the user calling
- this routine twice. Since this could cause BIG problems if any globals
- are accessed after the first call, we'd better scream.
- ---------------------------------------------------------------------------*/
-
- if (scan == THREADID_ENTRIES) {
- ZCONST char *noEntry = LoadFarString(EntryNotFound);
- fprintf(stderr, noEntry); /* can't use Info w/o a global pointer */
- EXIT(PK_ERR); /* programming error while still working */
- }
-
- return threadPtrTable[scan];
- }
-
- # endif /* ?USETHREADID */
- #endif /* ?REENTRANT */
-
-
-
- Uz_Globs *globalsCtor()
- {
- #ifdef REENTRANT
- Uz_Globs *pG = (Uz_Globs *)malloc(sizeof(Uz_Globs));
-
- if (!pG)
- return (Uz_Globs *)NULL;
- #endif /* REENTRANT */
-
- /* for REENTRANT version, G is defined as (*pG) */
-
- memzero(&G, sizeof(Uz_Globs));
-
- #ifndef FUNZIP
- #ifdef CMS_MVS
- uO.aflag=1;
- uO.C_flag=1;
- #endif
- #ifdef TANDEM
- uO.aflag=1; /* default to '-a' auto create Text Files as type 101 */
- #endif
- #ifdef VMS
- # if (!defined(NO_TIMESTAMPS))
- uO.D_flag=1; /* default to '-D', no restoration of dir timestamps */
- # endif
- #endif
-
- uO.lflag=(-1);
- G.wildzipfn = "";
- G.pfnames = (char **)fnames;
- G.pxnames = (char **)&fnames[1];
- G.pInfo = G.info;
- G.sol = TRUE; /* at start of line */
-
- G.message = UzpMessagePrnt;
- G.input = UzpInput; /* not used by anyone at the moment... */
- #if defined(WINDLL) || defined(MACOS)
- G.mpause = NULL; /* has scrollbars: no need for pausing */
- #else
- G.mpause = UzpMorePause;
- #endif
- G.decr_passwd = UzpPassword;
- #endif /* !FUNZIP */
-
- #if (!defined(DOS_FLX_H68_NLM_OS2_W32) && !defined(AMIGA) && !defined(RISCOS))
- #if (!defined(MACOS) && !defined(ATARI) && !defined(VMS))
- G.echofd = -1;
- #endif /* !(MACOS || ATARI || VMS) */
- #endif /* !(DOS_FLX_H68_NLM_OS2_W32 || AMIGA || RISCOS) */
-
- #ifdef SYSTEM_SPECIFIC_CTOR
- SYSTEM_SPECIFIC_CTOR(__G);
- #endif
-
- #ifdef REENTRANT
- #ifdef USETHREADID
- registerGlobalPointer(__G);
- #else
- GG = &G;
- #endif /* ?USETHREADID */
- #endif /* REENTRANT */
-
- return &G;
- }
|