36 #define ZLIB_HEAP_NUM_BYTES (((U32BIT)1 << 15 ) + (1024 * 32))
37 #define ZLIB_HEAP_NUM_PTRS(sz) ((sz) + sizeof(voidpf) - 1) / sizeof(voidpf)
47 typedef struct s_ZlibHeap
58 static voidpf dsmZcalloc( voidpf opaque, uInt items, uInt size );
59 static void dsmZcfree( voidpf opaque, voidpf address );
84 dsmDP3((
"\nINFO: ZLIB HEAP = %p-%p, size %u bytes\n", pZlibHeap->ptr, pZlibHeap->top, ZLIB_HEAP_NUM_BYTES));
92 U32BIT compressedSize, U32BIT decompressedSize,
93 P_ModuleData hCompModuleData,
94 P_ModuleData *ppModuleData )
97 P_ModuleData pModuleData;
98 MemSeqRef msCompModuleData, msDecompModuleData;
99 U8BIT *pCompModuleData;
100 U8BIT *pDecompModuleData;
101 U32BIT compNumBytesContig, decompNumBytesContig;
102 BOOLEAN decompressOk = TRUE;
106 dsmDP3((
"moduleDecompress( %u, %u, %p )\n",
107 compressedSize, decompressedSize, hCompModuleData));
108 dsmAssert((idp != NULL));
109 dsmAssert((hCompModuleData != NULL));
110 dsmAssert((ppModuleData != NULL));
111 dsmAssert((compressedSize > 0));
114 *ppModuleData = NULL;
116 if (compressedSize == 0)
120 err = CLDSM_ERR_INTERNAL;
124 if (decompressedSize == 0)
132 err = moduleDataCreate( idp, 1, &pModuleData );
136 err = moduleDataCreate( idp, decompressedSize, &pModuleData );
143 memSeqOpen( MEM_CONTEXT, (MemHandle)moduleDataPtr(hCompModuleData), 0, compressedSize,
144 FALSE, &msCompModuleData )
147 memSeqOpen( MEM_CONTEXT, (MemHandle)moduleDataPtr(pModuleData), 0, decompressedSize,
148 FALSE, &msDecompModuleData )
151 zStream.opaque = (voidpf)idp;
153 zStream.zalloc = (alloc_func)dsmZcalloc;
154 zStream.zfree = (free_func)dsmZcfree;
156 zStream.next_in = Z_NULL;
157 zStream.avail_in = 0;
158 zStream.next_out = Z_NULL;
159 zStream.avail_out = 0;
161 zlibErr = inflateInit(&zStream);
162 DEBUG_CHK( zlibErr == Z_OK,
163 dsmDP1((
"ERROR: zlib inflateInit: %u\n", err)));
165 #ifdef MEM_CONTIGUOUS
167 memSeqAccessContig( msCompModuleData, &pCompModuleData, &compNumBytesContig );
168 zStream.next_in = (Bytef *)pCompModuleData;
169 zStream.avail_in = (uInt)compNumBytesContig;
171 memSeqAccessContig( msDecompModuleData, &pDecompModuleData, &decompNumBytesContig );
172 zStream.next_out = (Bytef *)pDecompModuleData;
173 zStream.avail_out = (uInt)decompNumBytesContig;
174 dsmDP3((
"Pre-inflate stream -> n_i: %p, a_i: %u, n_o: %p, a_o: %u\n",
175 zStream.next_in, zStream.avail_in, zStream.next_out, zStream.avail_out));
178 zlibErr = inflate( &zStream, Z_FINISH );
181 while (zlibErr == Z_OK)
183 if (zStream.avail_in == 0)
186 memSeqAccessContig( msCompModuleData, &pCompModuleData,
187 &compNumBytesContig );
188 zStream.next_in = (Bytef *)pCompModuleData;
189 zStream.avail_in = (uInt)compNumBytesContig;
191 if (zStream.avail_out == 0)
194 memSeqAccessContig( msDecompModuleData, &pDecompModuleData,
195 &decompNumBytesContig );
196 zStream.next_out = (Bytef *)pDecompModuleData;
197 zStream.avail_out = (uInt)decompNumBytesContig;
199 dsmDP4((
"Pre-inflate stream -> n_i: %p, a_i: %u, n_o: %p, a_o: %u\n",
200 zStream.next_in, zStream.avail_in, zStream.next_out, zStream.avail_out));
201 zlibErr = inflate( &zStream, Z_SYNC_FLUSH );
202 dsmDP4((
"Post-inflate stream -> n_i: %p, a_i: %u, n_o: %p, a_o: %u\n",
203 zStream.next_in, zStream.avail_in, zStream.next_out, zStream.avail_out));
207 if (zlibErr != Z_STREAM_END)
209 decompressOk = FALSE;
210 dsmDP1((
"DATA ERROR: ZLIB uncompress error: %d\n", zlibErr));
213 zlibErr = inflateEnd( &zStream );
214 DEBUG_CHK( zlibErr == Z_OK,
215 dsmDP1((
"ERROR: zlib inflateEnd: %u\n", err)));
218 memSeqClose( msCompModuleData );
219 memSeqClose( msDecompModuleData );
223 L2_DATA_CHK( zStream.total_out == decompressedSize,
225 dsmDP1((
"DATA ERROR: DII decompress size = %u, ",
227 dsmDP1((
"zlib decompress size = %u\n", zStream.total_out)),
229 moduleDataDestroy( idp, &pModuleData );
233 *ppModuleData = pModuleData;
238 moduleDataDestroy( idp, &pModuleData );
243 DEBUG_CHK( err == CLDSM_OK,
244 dsmDP1((
"ERROR: moduleDecompress: %u\n", err)));
245 dsmDP3((
"exit moduleDecompress -> rtn: %u\n", err));
272 static voidpf dsmZcalloc( voidpf opaque, uInt items, uInt size )
275 P_ZlibHeap pZlibHeap = idp->pZlibHeap;
279 dsmDP4((
"dsmZcalloc( %u, %u )\n", items, size));
289 if ((size == 0x4) && (items > 0x13c))
291 dsmDP1((
"\n************************************\n"));
292 dsmDP1((
"************************************\n"));
293 dsmDP1((
"* ZLIB HEAP ITEMS > 0x13c: %x *\n", items));
294 dsmDP1((
"************************************\n"));
295 dsmDP1((
"************************************\n\n"));
300 dsmDP1((
"\n************************************\n"));
301 dsmDP1((
"************************************\n"));
302 dsmDP1((
"* ZLIB HEAP, size == 0\n"));
303 dsmDP1((
"************************************\n"));
304 dsmDP1((
"************************************\n\n"));
309 dsmDP1((
"\n************************************\n"));
310 dsmDP1((
"************************************\n"));
311 dsmDP1((
"* ZLIB HEAP, items == 0\n"));
312 dsmDP1((
"************************************\n"));
313 dsmDP1((
"************************************\n\n"));
317 if (pZlibHeap == NULL)
320 dsmDP1((
"ERROR: Local zlib heap error\n"));
321 moduleDecompressInit( idp );
325 blksize.u32 = ZLIB_HEAP_NUM_PTRS(items * size);
328 if (blksize.u32 == 0)
330 dsmDP1((
"ERROR: Local zlib attempting to allocate zero length block.\n"));
333 else if ((pZlibHeap->ptr + blksize.u32 + 2) >= pZlibHeap->top)
336 dsmDP1((
"ERROR: Local zlib heap overflow\n"));
341 *pZlibHeap->ptr++ = blksize.ptr;
342 retval = (voidpf)pZlibHeap->ptr;
344 pZlibHeap->ptr += blksize.u32;
347 memset(retval,
'\0',
sizeof(Data) * blksize.u32);
350 *pZlibHeap->ptr = retval;
356 dsmDP4((
"exit dsmZcalloc -> rtn: %p\n", retval));
360 static void dsmZcfree( voidpf opaque, voidpf address )
363 P_ZlibHeap pZlibHeap = idp->pZlibHeap;
364 P_Data blockStart = ((P_Data)address) - 1;
365 P_Data topBlockStart;
367 dsmDP4((
"dsmZcfree( %p )\n", address));
368 dsmAssert((address != NULL));
370 if (pZlibHeap->ptr <= (P_Data)(pZlibHeap+1))
373 dsmDP1((
"ERROR: Local zlib heap underflow\n"));
374 moduleDecompressInit( idp );
376 else if (blockStart < (P_Data)(pZlibHeap+1) || blockStart > (pZlibHeap->ptr - 2))
379 dsmDP1((
"ERROR: Attempt to free illegal zlib heap address\n"));
387 topBlockStart = ((P_Data)(*(pZlibHeap->ptr - 1))) - 1;
389 if (blockStart == topBlockStart)
392 while (*topBlockStart == 0)
395 pZlibHeap->ptr = topBlockStart;
397 if (pZlibHeap->ptr <= (P_Data)(pZlibHeap+1))
402 topBlockStart = ((P_Data)(*(topBlockStart - 1))) - 1;
General include file for clDsm library internal definitions.
Header to the moduleDecompress module.
Header to the moduleData module.