]>
Commit | Line | Data |
---|---|---|
f6bcfd97 BP |
1 | /*--------------------------------------------------------------------------- |
2 | ||
3 | globals.c | |
4 | ||
5 | Routines to allocate and initialize globals, with or without threads. | |
6 | ||
7 | Contents: registerGlobalPointer() | |
8 | deregisterGlobalPointer() | |
9 | getGlobalPointer() | |
10 | globalsCtor() | |
11 | ||
12 | ---------------------------------------------------------------------------*/ | |
13 | ||
14 | ||
15 | #define UNZIP_INTERNAL | |
16 | #include "unzip.h" | |
17 | ||
18 | #ifndef FUNZIP | |
19 | /* initialization of sigs is completed at runtime so unzip(sfx) executable | |
20 | * won't look like a zipfile | |
21 | */ | |
22 | char central_hdr_sig[4] = {0, 0, 0x01, 0x02}; | |
23 | char local_hdr_sig[4] = {0, 0, 0x03, 0x04}; | |
24 | char end_central_sig[4] = {0, 0, 0x05, 0x06}; | |
25 | /* extern char extd_local_sig[4] = {0, 0, 0x07, 0x08}; NOT USED YET */ | |
26 | ||
27 | ZCONST char *fnames[2] = {"*", NULL}; /* default filenames vector */ | |
28 | #endif | |
29 | ||
30 | ||
31 | #ifndef REENTRANT | |
32 | Uz_Globs G; | |
33 | #else /* REENTRANT */ | |
34 | ||
35 | # ifndef USETHREADID | |
36 | Uz_Globs *GG; | |
37 | # else /* USETHREADID */ | |
38 | # define THREADID_ENTRIES 0x40 | |
39 | ||
40 | int lastScan; | |
41 | Uz_Globs *threadPtrTable[THREADID_ENTRIES]; | |
42 | ulg threadIdTable [THREADID_ENTRIES] = { | |
43 | 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, | |
44 | 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* Make sure there are */ | |
45 | 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* THREADID_ENTRIES 0s */ | |
46 | 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 | |
47 | }; | |
48 | ||
49 | static ZCONST char Far TooManyThreads[] = | |
50 | "error: more than %d simultaneous threads.\n\ | |
51 | Some threads are probably not calling DESTROYTHREAD()\n"; | |
52 | static ZCONST char Far EntryNotFound[] = | |
53 | "error: couldn't find global pointer in table.\n\ | |
54 | Maybe somebody accidentally called DESTROYTHREAD() twice.\n"; | |
55 | static ZCONST char Far GlobalPointerMismatch[] = | |
56 | "error: global pointer in table does not match pointer passed as\ | |
57 | parameter\n"; | |
58 | ||
59 | static void registerGlobalPointer OF((__GPRO)); | |
60 | ||
61 | ||
62 | ||
63 | static void registerGlobalPointer(__G) | |
64 | __GDEF | |
65 | { | |
66 | int scan=0; | |
67 | ulg tid = GetThreadId(); | |
68 | ||
69 | while (threadIdTable[scan] && scan < THREADID_ENTRIES) | |
70 | scan++; | |
71 | ||
72 | if (scan == THREADID_ENTRIES) { | |
73 | ZCONST char *tooMany = LoadFarString(TooManyThreads); | |
74 | Info(slide, 0x421, ((char *)slide, tooMany, THREADID_ENTRIES)); | |
75 | free(pG); | |
76 | EXIT(PK_MEM); /* essentially memory error before we've started */ | |
77 | } | |
78 | ||
79 | threadIdTable [scan] = tid; | |
80 | threadPtrTable[scan] = pG; | |
81 | lastScan = scan; | |
82 | } | |
83 | ||
84 | ||
85 | ||
86 | void deregisterGlobalPointer(__G) | |
87 | __GDEF | |
88 | { | |
89 | int scan=0; | |
90 | ulg tid = GetThreadId(); | |
91 | ||
92 | ||
93 | while (threadIdTable[scan] != tid && scan < THREADID_ENTRIES) | |
94 | scan++; | |
95 | ||
96 | /*--------------------------------------------------------------------------- | |
97 | There are two things we can do if we can't find the entry: ignore it or | |
98 | scream. The most likely reason for it not to be here is the user calling | |
99 | this routine twice. Since this could cause BIG problems if any globals | |
100 | are accessed after the first call, we'd better scream. | |
101 | ---------------------------------------------------------------------------*/ | |
102 | ||
103 | if (scan == THREADID_ENTRIES || threadPtrTable[scan] != pG) { | |
104 | ZCONST char *noEntry; | |
105 | if (scan == THREADID_ENTRIES) | |
106 | noEntry = LoadFarString(EntryNotFound); | |
107 | else | |
108 | noEntry = LoadFarString(GlobalPointerMismatch); | |
109 | Info(slide, 0x421, ((char *)slide, noEntry)); | |
110 | EXIT(PK_WARN); /* programming error, but after we're all done */ | |
111 | } | |
112 | ||
113 | threadIdTable [scan] = 0; | |
114 | lastScan = scan; | |
115 | free(threadPtrTable[scan]); | |
116 | } | |
117 | ||
118 | ||
119 | ||
120 | Uz_Globs *getGlobalPointer() | |
121 | { | |
122 | int scan=0; | |
123 | ulg tid = GetThreadId(); | |
124 | ||
125 | while (threadIdTable[scan] != tid && scan < THREADID_ENTRIES) | |
126 | scan++; | |
127 | ||
128 | /*--------------------------------------------------------------------------- | |
129 | There are two things we can do if we can't find the entry: ignore it or | |
130 | scream. The most likely reason for it not to be here is the user calling | |
131 | this routine twice. Since this could cause BIG problems if any globals | |
132 | are accessed after the first call, we'd better scream. | |
133 | ---------------------------------------------------------------------------*/ | |
134 | ||
135 | if (scan == THREADID_ENTRIES) { | |
136 | ZCONST char *noEntry = LoadFarString(EntryNotFound); | |
137 | fprintf(stderr, noEntry); /* can't use Info w/o a global pointer */ | |
138 | EXIT(PK_ERR); /* programming error while still working */ | |
139 | } | |
140 | ||
141 | return threadPtrTable[scan]; | |
142 | } | |
143 | ||
144 | # endif /* ?USETHREADID */ | |
145 | #endif /* ?REENTRANT */ | |
146 | ||
147 | ||
148 | ||
149 | Uz_Globs *globalsCtor() | |
150 | { | |
151 | #ifdef REENTRANT | |
152 | Uz_Globs *pG = (Uz_Globs *)malloc(sizeof(Uz_Globs)); | |
153 | ||
154 | if (!pG) | |
155 | return (Uz_Globs *)NULL; | |
156 | #endif /* REENTRANT */ | |
157 | ||
158 | /* for REENTRANT version, G is defined as (*pG) */ | |
159 | ||
160 | memzero(&G, sizeof(Uz_Globs)); | |
161 | ||
162 | #ifndef FUNZIP | |
163 | #ifdef CMS_MVS | |
164 | uO.aflag=1; | |
165 | uO.C_flag=1; | |
166 | #endif | |
167 | ||
168 | uO.lflag=(-1); | |
169 | G.wildzipfn = ""; | |
170 | G.pfnames = (char **)fnames; | |
171 | G.pxnames = (char **)&fnames[1]; | |
172 | G.pInfo = G.info; | |
173 | G.sol = TRUE; /* at start of line */ | |
174 | ||
175 | G.message = UzpMessagePrnt; | |
176 | G.input = UzpInput; /* not used by anyone at the moment... */ | |
177 | #if defined(WINDLL) || defined(MACOS) | |
178 | G.mpause = NULL; /* has scrollbars: no need for pausing */ | |
179 | #else | |
180 | G.mpause = UzpMorePause; | |
181 | #endif | |
182 | G.decr_passwd = UzpPassword; | |
183 | #endif /* !FUNZIP */ | |
184 | ||
185 | #if (!defined(DOS_FLX_H68_OS2_W32) && !defined(AMIGA) && !defined(RISCOS)) | |
186 | #if (!defined(MACOS) && !defined(ATARI) && !defined(VMS)) | |
187 | G.echofd = -1; | |
188 | #endif /* !(MACOS || ATARI || VMS) */ | |
189 | #endif /* !(DOS_FLX_H68_OS2_W32 || AMIGA || RISCOS) */ | |
190 | ||
191 | #ifdef SYSTEM_SPECIFIC_CTOR | |
192 | SYSTEM_SPECIFIC_CTOR(__G); | |
193 | #endif | |
194 | ||
195 | #ifdef REENTRANT | |
196 | #ifdef USETHREADID | |
197 | registerGlobalPointer(__G); | |
198 | #else | |
199 | GG = &G; | |
200 | #endif /* ?USETHREADID */ | |
201 | #endif /* REENTRANT */ | |
202 | ||
203 | return &G; | |
204 | } |