Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/* 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; }
|