globals.c
资源名称:unzip540.zip [点击查看]
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:6k
源码类别:
压缩解压
开发平台:
MultiPlatform
- /*---------------------------------------------------------------------------
- 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};
- /* 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
- parametern";
- 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
- 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_OS2_W32) && !defined(AMIGA) && !defined(RISCOS))
- #if (!defined(MACOS) && !defined(ATARI) && !defined(VMS))
- G.echofd = -1;
- #endif /* !(MACOS || ATARI || VMS) */
- #endif /* !(DOS_FLX_H68_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;
- }