117 lines
3.7 KiB
C++
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;
|
|
}
|