windows-nt/Source/XPSP1/NT/ds/security/csps/cryptoflex/slbzip/unzip.cpp
2020-09-26 16:20:57 +08:00

117 lines
3.7 KiB
C++

/* DEC/CMS REPLACEMENT HISTORY, Element UNZIP.C */
/* *1 14-NOV-1996 10:26:58 ANIGBOGU "[113914]Decompress data in zip format using the inflate algorithm" */
/* DEC/CMS REPLACEMENT HISTORY, Element UNZIP.C */
/* DEC/CMS REPLACEMENT HISTORY, Element UNZIP.C */
/* PRIVATE FILE
******************************************************************************
**
** (c) Copyright Schlumberger Technology Corp., unpublished work, created 1996.
**
** This computer program includes Confidential, Proprietary Information and is
** a Trade Secret of Schlumberger Technology Corp. All use, disclosure, and/or
** reproduction is prohibited unless authorized in writing by Schlumberger.
** All Rights Reserved.
**
******************************************************************************
**
** compress/unzip.c
**
** PURPOSE
**
** Decompress data using the inflate algorithm.
**
** The code in this file is derived from the file funzip.c written
** and put in the public domain by Mark Adler.
**
**
** SPECIAL REQUIREMENTS & NOTES
**
** AUTHOR
**
** J. C. Anigbogu
** Austin Systems Center
** Nov 1996
**
******************************************************************************
*/
#include "comppriv.h"
#define EXTHDR 16 /* size of extended local header, inc sig */
/* ===========================================================================
*
* IN assertions: the buffer Input contains already the beginning of
* the compressed data, from offsets inptr to InputSize-1 included.
* The magic header has already been checked. The output buffer is cleared.
*/
CompressStatus_t
Unzip(
int Method,
CompParam_t *Comp
)
{
unsigned long OriginalCRC = 0; /* original crc */
unsigned long OriginalLength = 0; /* original uncompressed length */
unsigned long Count; /* counter */
int Pos;
unsigned char LocalBuffer[EXTHDR]; /* extended local header */
unsigned char *Buffer, *Ptr;
CompressStatus_t Status;
Comp->pCRC->Compute(NULL, 0); /* initialize crc */
/* Decompress */
if (Method == STORED)
{
/* Get the crc and original length */
/* crc32 (see algorithm.doc)
* uncompressed input size modulo 2^32
*/
LocalBuffer[0] = 0; /* To get around lint error 771 */
for (Pos = 0; Pos < 8; Pos++)
{
LocalBuffer[Pos] = (unsigned char)GetByte(Comp); /* may cause an error if EOF */
}
OriginalCRC = LG(LocalBuffer);
OriginalLength = LG(LocalBuffer+4);
Ptr = Buffer = (unsigned char *)CompressMalloc((unsigned int)OriginalLength, &Status);
if (Status != COMPRESS_OK)
return Status;
for (Count = 0; Count < OriginalLength; Count++)
*(Ptr++) = (unsigned char)GetByte(Comp);
WriteBuffer(Comp, Buffer, (unsigned int)OriginalLength);
Comp->BytesOut = OriginalLength;
CompressFree((char *)Buffer);
return COMPRESS_OK;
}
if ((Status = Inflate(Comp)) != COMPRESS_OK)
return Status;
/* Get the crc and original length */
/* crc32 (see algorithm.doc)
* uncompressed input size modulo 2^32
*/
LocalBuffer[0] = 0; /* To skirt around lint error 771 */
for (Pos = 0; Pos < 8; Pos++)
{
LocalBuffer[Pos] = (unsigned char)GetByte(Comp); /* may cause an error if EOF */
}
OriginalCRC = LG(LocalBuffer);
OriginalLength = LG(LocalBuffer+4);
/* Validate decompression */
if (OriginalCRC != (unsigned __int32)(*Comp->pCRC))
return CRC_ERROR;
if (OriginalLength != (unsigned long)Comp->BytesOut)
return LENGTH_ERROR;
return COMPRESS_OK;
}