📄 deflatedecompress.c
字号:
/*__________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
$Id: DeflateDecompress.c,v 1.3 2002/08/06 20:10:16 dallen Exp $
__________________________________________________________________________*/
#include <stdio.h>
#include <memory.h>
#include <malloc.h>
#include "zlib.h"
#include "DeflateWrapper.h"
#define INSIZE 512
#define OUTSIZE 512
#define MAX_TEMPSIZE 8388608 /* 8 MB */
static void *sAllocMem(void *dummy, unsigned int nItems, unsigned int nSize);
static void sFreeMem(void *dummy, void *address);
void Deflate_Decompress(void *pUserValue)
{
z_stream myStream;
int nIn;
char szIn[INSIZE];
char szOut[OUTSIZE];
char *szTemp;
unsigned int nOutIndex;
unsigned int nInIndex;
unsigned int nTempSize;
int nErr = Z_OK;
myStream.zalloc = sAllocMem;
myStream.zfree = sFreeMem;
myStream.opaque = NULL;
inflateInit(&myStream);
myStream.next_in = szIn;
myStream.next_out = szOut;
myStream.avail_in = 0;
myStream.avail_out = OUTSIZE;
nIn = 0;
nInIndex = 0;
while (nErr == Z_OK)
{
if (nIn != EOF)
{
if (!myStream.avail_in)
{
nInIndex = 0;
while ((nIn != EOF) && (nInIndex < INSIZE))
{
nIn = decomp_getc_buffer(pUserValue);
szIn[nInIndex] = nIn;
nInIndex++;
}
myStream.avail_in = nInIndex;
myStream.next_in = szIn;
}
nErr = inflate(&myStream, Z_NO_FLUSH);
}
else
nErr = inflate(&myStream, Z_FINISH);
if ((nErr == Z_OK) && !myStream.avail_out)
{
nOutIndex = 0;
while (nOutIndex < OUTSIZE)
decomp_putc_buffer(szOut[nOutIndex++], pUserValue);
myStream.next_out = szOut;
myStream.avail_out = OUTSIZE;
}
szTemp = NULL;
nTempSize = OUTSIZE;
while ((nErr == Z_BUF_ERROR) && (nTempSize < MAX_TEMPSIZE))
{
myStream.next_out -= nTempSize - myStream.avail_out;
while (myStream.avail_out < nTempSize)
{
decomp_putc_buffer(*(myStream.next_out), pUserValue);
myStream.next_out++;
myStream.avail_out++;
}
nTempSize <<= 1;
szTemp = realloc(szTemp, nTempSize);
myStream.avail_out = nTempSize;
myStream.next_out = szTemp;
if (nIn == EOF)
nErr = inflate(&myStream, Z_FINISH);
else
nErr = inflate(&myStream, Z_NO_FLUSH);
}
if (szTemp)
{
myStream.next_out -= nTempSize - myStream.avail_out;
while (myStream.avail_out < nTempSize)
{
decomp_putc_buffer(*(myStream.next_out), pUserValue);
myStream.next_out++;
myStream.avail_out++;
}
free(szTemp);
myStream.next_out = szOut;
myStream.avail_out = OUTSIZE;
}
}
if (nErr == Z_STREAM_END)
{
nOutIndex = 0;
while (nOutIndex < (OUTSIZE - myStream.avail_out))
decomp_putc_buffer(szOut[nOutIndex++], pUserValue);
}
return;
}
static void *sAllocMem(void *dummy, unsigned int nItems, unsigned int nSize)
{
return calloc(nItems, nSize);
}
static void sFreeMem(void *dummy, void *address)
{
free(address);
return;
}
#ifndef E_BUSINESS_SERVER
#ifndef IS_ADMIN
void pgpCopyMemory(void const *src, void *dest, size_t size)
{
memcpy(dest, src, size);
return;
}
#endif // IS_ADMIN
#endif /* !E_BUSINESS_SERVER */
/*__Editor_settings____
Local Variables:
tab-width: 4
End:
vi: ts=4 sw=4
vim: si
_____________________*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -