⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deflatedecompress.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 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 + -