This commit is contained in:
King_DuckZ 2020-05-05 20:22:38 +02:00
commit 1af4b85a22
44 changed files with 6083 additions and 4351 deletions

76
Makefile Executable file
View file

@ -0,0 +1,76 @@
CPP = g++
CC = gcc
OBJ = main.o UnAlz.o UnAlzBz2decompress.o UnAlzBzip2.o UnAlzbzlib.o zlib/adler32.o zlib/crc32.o zlib/infback.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/zutil.o bzip2/blocksort.o bzip2/compress.o bzip2/crctable.o bzip2/huffman.o bzip2/randtable.o
BIN = unalz
LDFLAGS =
CFLAGS = -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
all:
@echo ""
@echo "USAGE : make TARGET_SYSTEM"
@echo ""
@echo ""
@echo "TARGET_SYSTEM is one of"
@echo ""
@echo " posix : POSIX system (FreeBSD/linux/OSX/sparc)"
@echo " posix-utf8 : POSIX with utf8 filesystem(OSX)"
@echo " posix-noiconv : POSIX without libiconv (Windows(MINGW32,CYGWIN)/CP949 only file system)"
@echo ""
@echo " and 'clean' for clean"
@echo ""
posix: unalz
$(CPP) -c UnAlz.cpp -c main.cpp -D_UNALZ_ICONV $(CFLAGS)
$(CPP) $(OBJ) $(LDFLAGS) -liconv -o $(BIN)
posix-utf8: unalz
$(CPP) -c UnAlz.cpp -c main.cpp -D_UNALZ_ICONV -D_UNALZ_UTF8 $(CFLAGS)
$(CPP) $(OBJ) $(LDFLAGS) -liconv -o $(BIN)
posix-noiconv: unalz
$(CPP) -c UnAlz.cpp -c main.cpp $(CFLAGS)
$(CPP) $(OBJ) $(LDFLAGS) -o $(BIN)
clean:
rm -f $(OBJ) $(BIN)
$(BIN): $(OBJ)
zlib/adler32.o: zlib/adler32.c
$(CC) -c zlib/adler32.c -o zlib/adler32.o $(CFLAGS)
zlib/crc32.o: zlib/crc32.c
$(CC) -c zlib/crc32.c -o zlib/crc32.o $(CFLAGS)
zlib/infback.o: zlib/infback.c
$(CC) -c zlib/infback.c -o zlib/infback.o $(CFLAGS)
zlib/inffast.o: zlib/inffast.c
$(CC) -c zlib/inffast.c -o zlib/inffast.o $(CFLAGS)
zlib/inflate.o: zlib/inflate.c
$(CC) -c zlib/inflate.c -o zlib/inflate.o $(CFLAGS)
zlib/inftrees.o: zlib/inftrees.c
$(CC) -c zlib/inftrees.c -o zlib/inftrees.o $(CFLAGS)
zlib/zutil.o: zlib/zutil.c
$(CC) -c zlib/zutil.c -o zlib/zutil.o $(CFLAGS)
bzip2/blocksort.o: bzip2/blocksort.c
$(CC) -c bzip2/blocksort.c -o bzip2/blocksort.o $(CFLAGS)
bzip2/compress.o: bzip2/compress.c
$(CC) -c bzip2/compress.c -o bzip2/compress.o $(CFLAGS)
bzip2/crctable.o: bzip2/crctable.c
$(CC) -c bzip2/crctable.c -o bzip2/crctable.o $(CFLAGS)
bzip2/huffman.o: bzip2/huffman.c
$(CC) -c bzip2/huffman.c -o bzip2/huffman.o $(CFLAGS)
bzip2/randtable.o: bzip2/randtable.c
$(CC) -c bzip2/randtable.c -o bzip2/randtable.o $(CFLAGS)

0
makefile.freebsd → Makefile.freebsd Normal file → Executable file
View file

160
Makefile.win Normal file → Executable file
View file

@ -1,83 +1,77 @@
# Project: unalz # Project: unalz
# Makefile created by Dev-C++ 4.9.9.0 # Makefile created by Dev-C++ 4.9.9.0
CPP = g++.exe CPP = g++.exe
CC = gcc.exe CC = gcc.exe
WINDRES = windres.exe WINDRES = windres.exe
RES = RES =
OBJ = main.o UnAlz.o UnAlzBz2decompress.o UnAlzBzip2.o UnAlzbzlib.o zlib/adler32.o zlib/crc32.o zlib/infblock.o zlib/infcodes.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/infutil.o zlib/zutil.o bzip2/blocksort.o bzip2/compress.o bzip2/crctable.o bzip2/huffman.o bzip2/randtable.o $(RES) OBJ = main.o UnAlz.o UnAlzBz2decompress.o UnAlzBzip2.o UnAlzbzlib.o bzip2/blocksort.o bzip2/compress.o bzip2/crctable.o bzip2/huffman.o bzip2/randtable.o zlib/adler32.o zlib/crc32.o zlib/infback.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/zutil.o $(RES)
LINKOBJ = main.o UnAlz.o UnAlzBz2decompress.o UnAlzBzip2.o UnAlzbzlib.o zlib/adler32.o zlib/crc32.o zlib/infblock.o zlib/infcodes.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/infutil.o zlib/zutil.o bzip2/blocksort.o bzip2/compress.o bzip2/crctable.o bzip2/huffman.o bzip2/randtable.o $(RES) LINKOBJ = main.o UnAlz.o UnAlzBz2decompress.o UnAlzBzip2.o UnAlzbzlib.o bzip2/blocksort.o bzip2/compress.o bzip2/crctable.o bzip2/huffman.o bzip2/randtable.o zlib/adler32.o zlib/crc32.o zlib/infback.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/zutil.o $(RES)
LIBS = -L"C:/Dev-Cpp/lib" -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 LIBS = -L"C:/Dev-Cpp/lib" -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32
INCS = -I"C:/Dev-Cpp/include" INCS = -I"C:/Dev-Cpp/include"
CXXINCS = -I"C:/Dev-Cpp/include/c++/3.3.1" -I"C:/Dev-Cpp/include/c++/3.3.1/mingw32" -I"C:/Dev-Cpp/include/c++/3.3.1/backward" -I"C:/Dev-Cpp/lib/gcc-lib/mingw32/3.3.1/include" -I"C:/Dev-Cpp/include" CXXINCS = -I"C:/Dev-Cpp/include/c++/3.3.1" -I"C:/Dev-Cpp/include/c++/3.3.1/mingw32" -I"C:/Dev-Cpp/include/c++/3.3.1/backward" -I"C:/Dev-Cpp/lib/gcc-lib/mingw32/3.3.1/include" -I"C:/Dev-Cpp/include"
BIN = bin/unalz.exe BIN = bin/unalz.exe
CXXFLAGS = $(CXXINCS) -D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_CONSOLE -D_MBCS CXXFLAGS = $(CXXINCS) -D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_CONSOLE -D_MBCS
CFLAGS = $(INCS) -D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_CONSOLE -D_MBCS CFLAGS = $(INCS) -D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_CONSOLE -D_MBCS
.PHONY: all all-before all-after clean clean-custom .PHONY: all all-before all-after clean clean-custom
all: all-before bin/unalz.exe all-after all: all-before bin/unalz.exe all-after
clean: clean-custom clean: clean-custom
rm -f $(OBJ) $(BIN) rm -f $(OBJ) $(BIN)
$(BIN): $(OBJ) $(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o "bin\unalz.exe" $(LIBS) $(CPP) $(LINKOBJ) -o "bin\unalz.exe" $(LIBS)
main.o: main.cpp main.o: main.cpp
$(CPP) -c main.cpp -o main.o $(CXXFLAGS) $(CPP) -c main.cpp -o main.o $(CXXFLAGS)
UnAlz.o: UnAlz.cpp UnAlz.o: UnAlz.cpp
$(CPP) -c UnAlz.cpp -o UnAlz.o $(CXXFLAGS) $(CPP) -c UnAlz.cpp -o UnAlz.o $(CXXFLAGS)
UnAlzBz2decompress.o: UnAlzBz2decompress.c UnAlzBz2decompress.o: UnAlzBz2decompress.c
$(CC) -c UnAlzBz2decompress.c -o UnAlzBz2decompress.o $(CFLAGS) $(CC) -c UnAlzBz2decompress.c -o UnAlzBz2decompress.o $(CFLAGS)
UnAlzBzip2.o: UnAlzBzip2.cpp UnAlzBzip2.o: UnAlzBzip2.cpp
$(CPP) -c UnAlzBzip2.cpp -o UnAlzBzip2.o $(CXXFLAGS) $(CPP) -c UnAlzBzip2.cpp -o UnAlzBzip2.o $(CXXFLAGS)
UnAlzbzlib.o: UnAlzbzlib.c UnAlzbzlib.o: UnAlzbzlib.c
$(CC) -c UnAlzbzlib.c -o UnAlzbzlib.o $(CFLAGS) $(CC) -c UnAlzbzlib.c -o UnAlzbzlib.o $(CFLAGS)
zlib/adler32.o: zlib/adler32.c bzip2/blocksort.o: bzip2/blocksort.c
$(CC) -c zlib/adler32.c -o zlib/adler32.o $(CFLAGS) $(CC) -c bzip2/blocksort.c -o bzip2/blocksort.o $(CFLAGS)
zlib/crc32.o: zlib/crc32.c bzip2/compress.o: bzip2/compress.c
$(CC) -c zlib/crc32.c -o zlib/crc32.o $(CFLAGS) $(CC) -c bzip2/compress.c -o bzip2/compress.o $(CFLAGS)
zlib/infblock.o: zlib/infblock.c bzip2/crctable.o: bzip2/crctable.c
$(CC) -c zlib/infblock.c -o zlib/infblock.o $(CFLAGS) $(CC) -c bzip2/crctable.c -o bzip2/crctable.o $(CFLAGS)
zlib/infcodes.o: zlib/infcodes.c bzip2/huffman.o: bzip2/huffman.c
$(CC) -c zlib/infcodes.c -o zlib/infcodes.o $(CFLAGS) $(CC) -c bzip2/huffman.c -o bzip2/huffman.o $(CFLAGS)
zlib/inffast.o: zlib/inffast.c bzip2/randtable.o: bzip2/randtable.c
$(CC) -c zlib/inffast.c -o zlib/inffast.o $(CFLAGS) $(CC) -c bzip2/randtable.c -o bzip2/randtable.o $(CFLAGS)
zlib/inflate.o: zlib/inflate.c zlib/adler32.o: zlib/adler32.c
$(CC) -c zlib/inflate.c -o zlib/inflate.o $(CFLAGS) $(CC) -c zlib/adler32.c -o zlib/adler32.o $(CFLAGS)
zlib/inftrees.o: zlib/inftrees.c zlib/crc32.o: zlib/crc32.c
$(CC) -c zlib/inftrees.c -o zlib/inftrees.o $(CFLAGS) $(CC) -c zlib/crc32.c -o zlib/crc32.o $(CFLAGS)
zlib/infutil.o: zlib/infutil.c zlib/infback.o: zlib/infback.c
$(CC) -c zlib/infutil.c -o zlib/infutil.o $(CFLAGS) $(CC) -c zlib/infback.c -o zlib/infback.o $(CFLAGS)
zlib/zutil.o: zlib/zutil.c zlib/inffast.o: zlib/inffast.c
$(CC) -c zlib/zutil.c -o zlib/zutil.o $(CFLAGS) $(CC) -c zlib/inffast.c -o zlib/inffast.o $(CFLAGS)
bzip2/blocksort.o: bzip2/blocksort.c zlib/inflate.o: zlib/inflate.c
$(CC) -c bzip2/blocksort.c -o bzip2/blocksort.o $(CFLAGS) $(CC) -c zlib/inflate.c -o zlib/inflate.o $(CFLAGS)
bzip2/compress.o: bzip2/compress.c zlib/inftrees.o: zlib/inftrees.c
$(CC) -c bzip2/compress.c -o bzip2/compress.o $(CFLAGS) $(CC) -c zlib/inftrees.c -o zlib/inftrees.o $(CFLAGS)
bzip2/crctable.o: bzip2/crctable.c zlib/zutil.o: zlib/zutil.c
$(CC) -c bzip2/crctable.c -o bzip2/crctable.o $(CFLAGS) $(CC) -c zlib/zutil.c -o zlib/zutil.o $(CFLAGS)
bzip2/huffman.o: bzip2/huffman.c
$(CC) -c bzip2/huffman.c -o bzip2/huffman.o $(CFLAGS)
bzip2/randtable.o: bzip2/randtable.c
$(CC) -c bzip2/randtable.c -o bzip2/randtable.o $(CFLAGS)

168
UnAlz.cpp Normal file → Executable file
View file

@ -27,7 +27,7 @@
//// byte-order : little to host //// //// byte-order : little to host ////
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
#ifdef _WIN32 // little to little #if defined(_WIN32) ||defined(__CYGWIN__) // little to little
inline UINT16 unalz_le16toh(UINT16 a){return a;} inline UINT16 unalz_le16toh(UINT16 a){return a;}
inline UINT32 unalz_le32toh(UINT32 a){return a;} inline UINT32 unalz_le32toh(UINT32 a){return a;}
inline UINT64 unalz_le64toh(UINT64 a){return a;} inline UINT64 unalz_le64toh(UINT64 a){return a;}
@ -86,6 +86,7 @@ static const char* errorstrtable[]=
{ {
"no error", // ERR_NOERR "no error", // ERR_NOERR
"can't open file", // ERR_CANT_OPEN_FILE "can't open file", // ERR_CANT_OPEN_FILE
"corrupted file", // ERR_CORRUPTED_FILE
"can't read signature", // ERR_CANT_READ_SIG "can't read signature", // ERR_CANT_READ_SIG
"can't read file", // ERR_CANT_READ_FILE "can't read file", // ERR_CANT_READ_FILE
"error at read header", // ERR_AT_READ_HEADER "error at read header", // ERR_AT_READ_HEADER
@ -97,7 +98,7 @@ static const char* errorstrtable[]=
"invalid filecomment size", // ERR_INVALID_FILECOMMENT_SIZE, "invalid filecomment size", // ERR_INVALID_FILECOMMENT_SIZE,
"cant' read header", // ERR_CANT_READ_HEADER, "cant' read header", // ERR_CANT_READ_HEADER,
"memory allocation failed", // ERR_MEM_ALLOC_FAILED, "memory allocation failed", // ERR_MEM_ALLOC_FAILED,
"file read eror", // ERR_FILE_READ_ERROR, "file read error", // ERR_FILE_READ_ERROR,
"inflate failed", // ERR_INFLATE_FAILED, "inflate failed", // ERR_INFLATE_FAILED,
"iconv-can't open iconv", // ERR_ICONV_CANT_OPEN, "iconv-can't open iconv", // ERR_ICONV_CANT_OPEN,
@ -224,6 +225,7 @@ BOOL CUnAlz::Open(const char* szPathName)
} }
if(sig==SIG_ERROR) if(sig==SIG_ERROR)
{ {
m_nErr = ERR_CORRUPTED_FILE;
return FALSE; // 깨진 파일.. return FALSE; // 깨진 파일..
} }
@ -233,8 +235,9 @@ BOOL CUnAlz::Open(const char* szPathName)
else if(sig==SIG_ENDOF_CENTRAL_DIRECTORY_RECORD) ret = ReadEndofCentralDirectoryRecord(); else if(sig==SIG_ENDOF_CENTRAL_DIRECTORY_RECORD) ret = ReadEndofCentralDirectoryRecord();
else else
{ {
// ¹Ì±¸ÇöµÈ signature // 미구현된 signature ? 깨진 파일 ?
ASSERT(0); ASSERT(0);
m_nErr = ERR_CORRUPTED_FILE;
return FALSE; return FALSE;
} }
@ -325,20 +328,21 @@ BOOL CUnAlz::ReadLocalFileheader()
} }
// ALZ 확장.. // ALZ 확장..
if( (zipHeader.head.fileSizeByte & (SHORT)1) != 0){ if( (zipHeader.head.fileDescriptor & (SHORT)1) != 0){
m_bIsEncrypted = TRUE; m_bIsEncrypted = TRUE; // 하나라도 암호 걸렸으면 세팅한다.
} }
if( (zipHeader.head.fileSizeByte & (SHORT)8) != 0){ if( (zipHeader.head.fileDescriptor & (SHORT)8) != 0){
m_bIsDataDescr = TRUE; m_bIsDataDescr = TRUE;
} }
int byteLen = zipHeader.head.fileSizeByte/0x10; int byteLen = zipHeader.head.fileDescriptor/0x10;
if(byteLen) if(byteLen)
{ {
FRead(&(zipHeader.compressionMethod), sizeof(zipHeader.compressionMethod)); FRead(&(zipHeader.compressionMethod), sizeof(zipHeader.compressionMethod));
FRead(&(zipHeader.unknown3), sizeof(zipHeader.unknown3)); FRead(&(zipHeader.unknown3), sizeof(zipHeader.unknown3));
FRead(&(zipHeader.maybeCRC), sizeof(zipHeader.maybeCRC)); FRead(&(zipHeader.unknown4), sizeof(zipHeader.unknown4));
FRead(&(zipHeader.passwordCRC), sizeof(zipHeader.passwordCRC));
FRead(&(zipHeader.compressedSize), byteLen); FRead(&(zipHeader.compressedSize), byteLen);
FRead(&(zipHeader.uncompressedSize), byteLen); // 압축 사이즈가 없다. FRead(&(zipHeader.uncompressedSize), byteLen); // 압축 사이즈가 없다.
@ -348,7 +352,6 @@ BOOL CUnAlz::ReadLocalFileheader()
zipHeader.head.fileNameLength = unalz_le16toh(zipHeader.head.fileNameLength); zipHeader.head.fileNameLength = unalz_le16toh(zipHeader.head.fileNameLength);
zipHeader.compressedSize = unalz_le64toh(zipHeader.compressedSize); zipHeader.compressedSize = unalz_le64toh(zipHeader.compressedSize);
zipHeader.uncompressedSize = unalz_le64toh(zipHeader.uncompressedSize); zipHeader.uncompressedSize = unalz_le64toh(zipHeader.uncompressedSize);
zipHeader.maybeCRC = unalz_le32toh(zipHeader.maybeCRC);
// FILE NAME // FILE NAME
zipHeader.fileName = (char*)malloc(zipHeader.head.fileNameLength+1); zipHeader.fileName = (char*)malloc(zipHeader.head.fileNameLength+1);
@ -373,7 +376,7 @@ BOOL CUnAlz::ReadLocalFileheader()
size_t size; size_t size;
char inbuf[ICONV_BUF_SIZE]; char inbuf[ICONV_BUF_SIZE];
char outbuf[ICONV_BUF_SIZE]; char outbuf[ICONV_BUF_SIZE];
#ifdef __FreeBSD__ #if defined(__FreeBSD__) || defined(__CYGWIN__)
const char *inptr = inbuf; const char *inptr = inbuf;
#else #else
char *inptr = inbuf; char *inptr = inbuf;
@ -436,7 +439,8 @@ BOOL CUnAlz::ReadLocalFileheader()
} }
*/ */
if(IsEncrypted()) FRead(zipHeader.encChk, ENCR_HEADER_LEN); // xf86 if(IsEncryptedFile(zipHeader.head.fileDescriptor))
FRead(zipHeader.encChk, ENCR_HEADER_LEN); // xf86
// SKIP FILE DATA // SKIP FILE DATA
zipHeader.dwFileDataPos = FTell(); // data 의 위치 저장하기.. zipHeader.dwFileDataPos = FTell(); // data 의 위치 저장하기..
@ -846,7 +850,7 @@ BOOL CUnAlz::DigPath(const char* szPathName)
/// @return /// @return
/// @date 2004-03-06 오후 11:03:26 /// @date 2004-03-06 오후 11:03:26
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CUnAlz::IsFolder(LPCSTR szPathName) BOOL CUnAlz::IsFolder(const CHAR* szPathName)
{ {
#ifdef _WIN32 #ifdef _WIN32
UINT32 dwRet; UINT32 dwRet;
@ -1009,6 +1013,9 @@ BOOL CUnAlz::ExtractRawfile(SExtractDest* dest, SLocalFileHeader& file)
INT64 bufLen = BUF_LEN; INT64 bufLen = BUF_LEN;
INT64 nWritten = 0; INT64 nWritten = 0;
BOOL bHalt = FALSE; BOOL bHalt = FALSE;
BOOL bIsEncrypted = IsEncryptedFile(); // 암호걸린 파일인가?
// 위치 잡고. // 위치 잡고.
FSeek(file.dwFileDataPos); FSeek(file.dwFileDataPos);
@ -1022,8 +1029,9 @@ BOOL CUnAlz::ExtractRawfile(SExtractDest* dest, SLocalFileHeader& file)
{ {
break; break;
} }
CryptDecodeBuffer((int)read, (CHAR *)buf); // xf86 if(bIsEncrypted)
DecryptingData((int)read, buf); // xf86
WriteToDest(dest, buf, (int)read); WriteToDest(dest, buf, (int)read);
//fwrite(buf, read, 1, fp); //fwrite(buf, read, 1, fp);
@ -1166,6 +1174,7 @@ BOOL CUnAlz::ExtractDeflate2(SExtractDest* dest, SLocalFileHeader& file)
UINT iRead = 0; UINT iRead = 0;
INT64 nWritten = 0; INT64 nWritten = 0;
BOOL bHalt = FALSE; BOOL bHalt = FALSE;
BOOL bIsEncrypted = IsEncryptedFile(); // 암호걸린 파일인가?
memset(&stream, 0, sizeof(stream)); memset(&stream, 0, sizeof(stream));
@ -1196,7 +1205,8 @@ BOOL CUnAlz::ExtractDeflate2(SExtractDest* dest, SLocalFileHeader& file)
goto END; goto END;
} }
CryptDecodeBuffer(uReadThis, (CHAR *)pInBuf); // xf86 if(bIsEncrypted)
DecryptingData(uReadThis, pInBuf); // xf86
nRestReadCompressed -= uReadThis; nRestReadCompressed -= uReadThis;
stream.next_in = pInBuf; stream.next_in = pInBuf;
@ -1421,6 +1431,7 @@ BOOL CUnAlz::FRead(void* buffer, UINT32 nBytesToRead, int* pTotRead )
{ {
m_bIsEOF = TRUE;return FALSE; m_bIsEOF = TRUE;return FALSE;
} }
#else #else
nNumOfBytesRead = fread(((BYTE*)buffer)+dwTotRead, 1,dwRead ,m_files[m_nCurFile].fp); nNumOfBytesRead = fread(((BYTE*)buffer)+dwTotRead, 1,dwRead ,m_files[m_nCurFile].fp);
if(nNumOfBytesRead<=0) if(nNumOfBytesRead<=0)
@ -1486,12 +1497,13 @@ const char* CUnAlz::LastErrToStr(ERR nERR)
// by xf86 // by xf86
BOOL CUnAlz::chkValidPassword() BOOL CUnAlz::chkValidPassword()
{ {
if (IsEncrypted()) { if(IsEncryptedFile())
{
if (getPasswordLen() == 0){ if (getPasswordLen() == 0){
m_nErr = ERR_PASSWD_NOT_SET; m_nErr = ERR_PASSWD_NOT_SET;
return FALSE; return FALSE;
} }
CryptInitKeys(); InitCryptKeys(m_szPasswd);
if(CryptCheck(m_posCur->encChk) == FALSE){ if(CryptCheck(m_posCur->encChk) == FALSE){
m_nErr = ERR_INVALID_PASSWD; m_nErr = ERR_INVALID_PASSWD;
return FALSE; return FALSE;
@ -1501,6 +1513,8 @@ BOOL CUnAlz::chkValidPassword()
} }
/*
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
// from CZipArchive // from CZipArchive
// Copyright (C) 2000 - 2004 Tadeusz Dracz // Copyright (C) 2000 - 2004 Tadeusz Dracz
@ -1509,7 +1523,6 @@ BOOL CUnAlz::chkValidPassword()
// //
// it's under GPL. // it's under GPL.
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
void CUnAlz::CryptDecodeBuffer(UINT32 uCount, CHAR *buf) void CUnAlz::CryptDecodeBuffer(UINT32 uCount, CHAR *buf)
{ {
if (IsEncrypted()) if (IsEncrypted())
@ -1569,3 +1582,122 @@ UINT32 CUnAlz::CryptCRC32(UINT32 l, CHAR c)
return CRC_TABLE[(l ^ c) & 0xff] ^ (l >> 8); return CRC_TABLE[(l ^ c) & 0xff] ^ (l >> 8);
} }
*/
////////////////////////////////////////////////////////////////////////////////////////////////////
/// 암호걸린 파일인지 여부
/// @param fileDescriptor
/// @return
/// @date 2004-11-27 오후 11:25:32
////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CUnAlz::IsEncryptedFile(BYTE fileDescriptor)
{
return fileDescriptor&0x01;
}
BOOL CUnAlz::IsEncryptedFile()
{
return m_posCur->head.fileDescriptor&0x01;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// 암호로 키 초기화
/// @param szPassword
/// @return
/// @date 2004-11-27 오후 11:04:01
////////////////////////////////////////////////////////////////////////////////////////////////////
void CUnAlz::InitCryptKeys(const CHAR* szPassword)
{
m_key[0] = 305419896;
m_key[1] = 591751049;
m_key[2] = 878082192;
int i;
for(i=0;i<(int)strlen(szPassword);i++)
{
UpdateKeys(szPassword[i]);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// 데이타로 키 업데이트하기
/// @param c
/// @return
/// @date 2004-11-27 오후 11:04:09
////////////////////////////////////////////////////////////////////////////////////////////////////
void CUnAlz::UpdateKeys(BYTE c)
{
m_key[0] = CRC32(m_key[0], c);
m_key[1] = m_key[1]+(m_key[0]&0x000000ff);
m_key[1] = m_key[1]*134775813+1;
m_key[2] = CRC32(m_key[2],m_key[1]>>24);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// 암호가 맞는지 헤더 체크하기
/// @param buf
/// @return
/// @date 2004-11-27 오후 11:04:24
////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CUnAlz::CryptCheck(BYTE* buf)
{
int i;
BYTE c;
for(i=0;i<ENCR_HEADER_LEN;i++)
{
c = buf[i] ^ DecryptByte();
UpdateKeys(c);
buf[i] = c;
}
if (IsDataDescr()) // Data descriptor present
return (m_posCur->head.fileTimeDate >> 8) == c;
else
return (m_posCur->passwordCRC) == c;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// 키에서 데이타 추출
/// @return
/// @date 2004-11-27 오후 11:05:36
////////////////////////////////////////////////////////////////////////////////////////////////////
BYTE CUnAlz::DecryptByte()
{
UINT16 temp;
temp = m_key[2] | 2;
return (temp * (temp^1))>>8;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// 데이타 압축 풀기
/// @param nSize
/// @param data
/// @return
/// @date 2004-11-27 오후 11:03:30
////////////////////////////////////////////////////////////////////////////////////////////////////
void CUnAlz::DecryptingData(int nSize, BYTE* data)
{
BYTE* p = data;
BYTE temp;
while(nSize)
{
temp = *p ^ DecryptByte();
UpdateKeys(temp);
*p = temp;
nSize--;
p++;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// CRC 테이블 참조
/// @param l
/// @param c
/// @return
/// @date 2004-11-27 오후 11:14:16
////////////////////////////////////////////////////////////////////////////////////////////////////
UINT32 CUnAlz::CRC32(UINT32 l, BYTE c)
{
const ULONG *CRC_TABLE = get_crc_table();
return CRC_TABLE[(l ^ c) & 0xff] ^ (l >> 8);
}

72
UnAlz.h Normal file → Executable file
View file

@ -40,6 +40,10 @@
2004/10/26 - BSD/LINUX : byte-order, libiconv 2004/10/26 - BSD/LINUX : byte-order, libiconv
2004/10/30 - & .. 2004/10/30 - & ..
2004/11/14 - by xxfre86 : 2004/11/14 - by xxfre86 :
2004/11/27 - cygwin에서
- GPL CZipArchive "ZIP File Format Specification version 4.5" &
-
-
: ( * ) : ( * )
@ -47,8 +51,8 @@
- UI ( PROGRESS, , ) * - UI ( PROGRESS, , ) *
- * - *
- * - *
- - ->
- CRC - CRC -> alz CRC . OTL
( -DXXXX ) ( -DXXXX )
- _WIN32 : WIN32 - _WIN32 : WIN32
@ -120,9 +124,6 @@ using namespace std;
#ifndef TRUE #ifndef TRUE
# define TRUE 1 # define TRUE 1
#endif #endif
#ifndef LPCTSTR
typedef const char* LPCSTR;
#endif
#ifndef HANDLE #ifndef HANDLE
# ifdef _WIN32 # ifdef _WIN32
typedef void *HANDLE; typedef void *HANDLE;
@ -133,7 +134,7 @@ using namespace std;
#ifndef ASSERT #ifndef ASSERT
# include <assert.h> # include <assert.h>
//# define ASSERT(x) assert(x) //# define ASSERT(x) assert(x)
# define ASSERT(x) {printf("assert file:%s line:%d\n", __FILE__, __LINE__);} # define ASSERT(x) {printf("assert at file:%s line:%d\n", __FILE__, __LINE__);}
#endif #endif
@ -148,7 +149,7 @@ namespace UNALZ
# pragma pack(1) # pragma pack(1)
#endif #endif
static const char UNALZ_VERSION[] = "CUnAlz0.30"; static const char UNALZ_VERSION[] = "CUnAlz0.31";
static const char UNALZ_COPYRIGHT[] = "Copyright(C) 2004 hardkoder@gmail.com"; static const char UNALZ_COPYRIGHT[] = "Copyright(C) 2004 hardkoder@gmail.com";
enum {ENCR_HEADER_LEN=12}; // xf86 enum {ENCR_HEADER_LEN=12}; // xf86
@ -184,10 +185,11 @@ enum COMPRESSION_METHOD ///<
struct _SLocalFileHeaderHead ///< 고정 헤더. struct _SLocalFileHeaderHead ///< 고정 헤더.
{ {
SHORT fileNameLength; SHORT fileNameLength;
BYTE fileAttribute; // from http://www.zap.pe.kr BYTE fileAttribute; // from http://www.zap.pe.kr
UINT32 fileTimeDate; UINT32 fileTimeDate;
BYTE fileSizeByte; ///< 파일 크기 필드의 크기 : 0x10, 0x20, 0x40, 0x80 각각 1byte, 2byte, 4byte, 8byte BYTE fileDescriptor; ///< 파일 크기 필드의 크기 : 0x10, 0x20, 0x40, 0x80 각각 1byte, 2byte, 4byte, 8byte.
///< fileDescriptor & 1 == 암호걸렸는지 여부
BYTE unknown2[1]; ///< ??? BYTE unknown2[1]; ///< ???
/* /*
@ -218,9 +220,10 @@ struct SLocalFileHeader
void Clear() { if(fileName) free(fileName); fileName=NULL; if(extraField) free(extraField);extraField=NULL; } void Clear() { if(fileName) free(fileName); fileName=NULL; if(extraField) free(extraField);extraField=NULL; }
_SLocalFileHeaderHead head; _SLocalFileHeaderHead head;
BYTE compressionMethod; ///< 압축 방법 : 2 - deflate, 1 - 변형 bzip2, 0 - 압축 안함. BYTE compressionMethod; ///< 압축 방법 : 2 - deflate, 1 - 변형 bzip2, 0 - 압축 안함.
BYTE unknown3[1]; ///< ??? BYTE unknown3[1]; ///< ???
UINT32 maybeCRC; ///< 아마도 crc BYTE unknown4[3]; ///< 아마도 crc?
BYTE passwordCRC; ///< 암호 체크를 위한 1byte crc
INT64 compressedSize; INT64 compressedSize;
INT64 uncompressedSize; INT64 uncompressedSize;
@ -228,9 +231,9 @@ struct SLocalFileHeader
CHAR* fileName; CHAR* fileName;
BYTE* extraField; BYTE* extraField;
_SDataDescriptor dataDescriptor; _SDataDescriptor dataDescriptor;
INT64 dwFileDataPos; ///< file data 가 저장된 위치.. INT64 dwFileDataPos; ///< file data 가 저장된 위치..
CHAR encChk[ENCR_HEADER_LEN]; // xf86 BYTE encChk[ENCR_HEADER_LEN]; // xf86
}; };
struct _SCentralDirectoryStructureHead struct _SCentralDirectoryStructureHead
@ -297,7 +300,7 @@ struct SEndOfCentralDirectoryRecord
#ifdef _WIN32 #ifdef _WIN32
# pragma pack(pop, UNALZ) ///< PACKING 원상 복구 # pragma pack(pop, UNALZ) ///< PACKING 원상 복구
#else #else
# ifdef __LP64__ // 63bit 는 8byte 맞나 ? 잘모르겠다.. # ifdef __LP64__ // 64bit 는 패킹이 8byte 맞나 ? 잘모르겠다.....
# pragma pack(8) # pragma pack(8)
# else # else
# pragma pack(4) # pragma pack(4)
@ -352,8 +355,9 @@ public :
enum ERR ///< 에러 코드 - 정리 필요.. enum ERR ///< 에러 코드 - 정리 필요..
{ {
ERR_NOERR, ERR_NOERR,
ERR_CANT_OPEN_FILE, ///< 파일 열기 실패 ERR_CANT_OPEN_FILE, ///< 파일 열기 실패
ERR_CANT_READ_SIG, ///< signature 읽기 실패 ERR_CORRUPTED_FILE, ///< 깨진 파일?
ERR_CANT_READ_SIG, ///< signature 읽기 실패
ERR_CANT_READ_FILE, ERR_CANT_READ_FILE,
ERR_AT_READ_HEADER, ERR_AT_READ_HEADER,
@ -394,8 +398,8 @@ public :
}; };
public : public :
static BOOL DigPath(const char* szPathName); static BOOL DigPath(const CHAR* szPathName);
static BOOL IsFolder(LPCSTR szPathName); static BOOL IsFolder(const CHAR* szPathName);
static const char* GetVersion() { return UNALZ_VERSION; } static const char* GetVersion() { return UNALZ_VERSION; }
static const char* GetCopyright() { return UNALZ_COPYRIGHT; } static const char* GetCopyright() { return UNALZ_COPYRIGHT; }
BOOL IsHalted() { return m_bHalt; } // by xf86 BOOL IsHalted() { return m_bHalt; } // by xf86
@ -450,14 +454,6 @@ private : //
BOOL IsDataDescr() { return m_bIsDataDescr; }; // xf86 BOOL IsDataDescr() { return m_bIsDataDescr; }; // xf86
int getPasswordLen() { return strlen(m_szPasswd); }; int getPasswordLen() { return strlen(m_szPasswd); };
void CryptDecodeBuffer(UINT32 uCount, CHAR *buf);
void CryptInitKeys();
void CryptUpdateKeys(CHAR c);
BOOL CryptCheck(CHAR *buf);
CHAR CryptDecryptCHAR();
void CryptDecode(CHAR &c);
UINT32 CryptCRC32(UINT32 l, CHAR c);
BOOL chkValidPassword(); // xf86
enum {MAX_FILES=1000}; ///< 처리 가능한 분할 압축 파일 수. enum {MAX_FILES=1000}; ///< 처리 가능한 분할 압축 파일 수.
enum {MULTIVOL_TAIL_SIZE=16,MULTIVOL_HEAD_SIZE=8}; ///< 분할 압축시 꼴랑지, 헤더 크기 enum {MULTIVOL_TAIL_SIZE=16,MULTIVOL_HEAD_SIZE=8}; ///< 분할 압축시 꼴랑지, 헤더 크기
@ -481,6 +477,28 @@ private : //
char m_szPasswd[256]; char m_szPasswd[256];
UINT32 m_keys[3]; UINT32 m_keys[3];
private :
/*
void CryptDecodeBuffer(UINT32 uCount, CHAR *buf);
void CryptInitKeys();
void CryptUpdateKeys(CHAR c);
BOOL CryptCheck(CHAR *buf);
CHAR CryptDecryptCHAR();
void CryptDecode(CHAR &c);
UINT32 CryptCRC32(UINT32 l, CHAR c);
*/
private : // encryption 처리
BOOL chkValidPassword(); // xf86
BOOL IsEncryptedFile(BYTE fileDescriptor);
BOOL IsEncryptedFile();
void InitCryptKeys(const CHAR* szPassword);
void UpdateKeys(BYTE c);
BOOL CryptCheck(BYTE* buf);
BYTE DecryptByte();
void DecryptingData(int nSize, BYTE* data);
UINT32 CRC32(UINT32 l, BYTE c);
UINT32 m_key[3];
private : private :
FileList m_fileList; ///< 압축파일 내의 파일 목록 FileList m_fileList; ///< 압축파일 내의 파일 목록

0
UnAlzBz2decompress.c Normal file → Executable file
View file

4
UnAlzBzip2.cpp Normal file → Executable file
View file

@ -108,6 +108,7 @@ int CUnAlz::BZ2_bzRead(int* bzerror, MYBZFILE* b, void* buf, int len)
{ {
Int32 n, ret; Int32 n, ret;
MybzFile* bzf = (MybzFile*)b; MybzFile* bzf = (MybzFile*)b;
BOOL bIsEncrypted = bzf->handle->IsEncryptedFile(); // 암호걸린 파일인가?
BZ_SETERR(BZ_OK); BZ_SETERR(BZ_OK);
@ -131,7 +132,8 @@ int CUnAlz::BZ2_bzRead(int* bzerror, MYBZFILE* b, void* buf, int len)
if (bzf->strm.avail_in == 0 && !bzf->handle->FEof()) { if (bzf->strm.avail_in == 0 && !bzf->handle->FEof()) {
bzf->handle->FRead(bzf->buf, sizeof(UChar)*BZ_MAX_UNUSED, &n); bzf->handle->FRead(bzf->buf, sizeof(UChar)*BZ_MAX_UNUSED, &n);
bzf->handle->CryptDecodeBuffer(n, (CHAR *)bzf->buf); // xf86 NOT tested -> tested if(bIsEncrypted)
bzf->handle->DecryptingData(n, (BYTE *)bzf->buf); // xf86 NOT tested -> tested
if(n==0) if(n==0)
{ BZ_SETERR(BZ_IO_ERROR); return 0; }; { BZ_SETERR(BZ_IO_ERROR); return 0; };

0
UnAlzbzlib.c Normal file → Executable file
View file

0
bzip2/blocksort.c Normal file → Executable file
View file

0
bzip2/bzlib.h Normal file → Executable file
View file

0
bzip2/bzlib_private.h Normal file → Executable file
View file

0
bzip2/compress.c Normal file → Executable file
View file

0
bzip2/crctable.c Normal file → Executable file
View file

0
bzip2/huffman.c Normal file → Executable file
View file

0
bzip2/randtable.c Normal file → Executable file
View file

21
main.cpp Normal file → Executable file
View file

@ -7,7 +7,7 @@ void Usage()
{ {
printf("\n"); printf("\n");
#ifdef _UNALZ_ICONV #ifdef _UNALZ_ICONV
printf("USAGE : unalz [-utf8 | -cp949] sourcefile.alz [dest path] \n"); printf("USAGE : unalz [ -utf8 | -cp949 | -euc-kr ] sourcefile.alz [dest path] \n");
# ifdef _UNALZ_UTF8 # ifdef _UNALZ_UTF8
printf(" -utf8 : convert filename's codepage to UTF-8 (default)\n"); printf(" -utf8 : convert filename's codepage to UTF-8 (default)\n");
printf(" -cp949 : convert filename's codepage to CP949\n"); printf(" -cp949 : convert filename's codepage to CP949\n");
@ -71,8 +71,8 @@ int main(int argc, char* argv[])
// printf("unalz v0.20 (2004/10/22) \n"); // printf("unalz v0.20 (2004/10/22) \n");
// printf("unalz v0.22 (2004/10/27) \n"); // printf("unalz v0.22 (2004/10/27) \n");
// printf("unalz v0.23 (2004/10/30) \n"); // printf("unalz v0.23 (2004/10/30) \n");
printf("unalz v0.30 (2004/11/14) \n"); printf("unalz v0.31 (2004/11/27) \n");
printf("copyright(C) 2004 http://www.kipple.pe.kr\n"); printf("Copyright(C) 2004 koder (http://www.kipple.pe.kr) \n");
if(argc<2) if(argc<2)
{ {
@ -123,9 +123,16 @@ int main(int argc, char* argv[])
// ÆÄÀÏ ¿­±â // ÆÄÀÏ ¿­±â
if(unalz.Open(source)==FALSE) if(unalz.Open(source)==FALSE)
{ {
printf("file open error : %s\n", source); if(unalz.GetLastErr()==CUnAlz::ERR_CORRUPTED_FILE)
printf("err code(%d) (%s)\n", unalz.GetLastErr(), unalz.GetLastErrStr()); {
return 0; printf("It's corrupted file.\n", source); // 弊成 拌加 钱扁..
}
else
{
printf("file open error : %s\n", source);
printf("err code(%d) (%s)\n", unalz.GetLastErr(), unalz.GetLastErrStr());
return 0;
}
} }
@ -142,11 +149,13 @@ int main(int argc, char* argv[])
unalz.SetCallback(UnAlzCallback, (void*)NULL); unalz.SetCallback(UnAlzCallback, (void*)NULL);
if(unalz.ExtractAll(destpath)==FALSE) if(unalz.ExtractAll(destpath)==FALSE)
{ {
printf("\n");
printf("extract %s to %s failed.\n", source, destpath); printf("extract %s to %s failed.\n", source, destpath);
printf("err code(%d) (%s)\n", unalz.GetLastErr(), unalz.GetLastErrStr()); printf("err code(%d) (%s)\n", unalz.GetLastErr(), unalz.GetLastErrStr());
} }
printf("\ndone..\n"); printf("\ndone..\n");
return 0; return 0;
} }

108
makefile
View file

@ -1,108 +0,0 @@
CPP = g++
CC = gcc
OBJ = UnAlzBz2decompress.o UnAlzBzip2.o UnAlzbzlib.o zlib/adler32.o zlib/crc32.o zlib/infblock.o zlib/infcodes.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/infutil.o zlib/zutil.o bzip2/blocksort.o bzip2/compress.o bzip2/crctable.o bzip2/huffman.o bzip2/randtable.o
LINKOBJ = main.o UnAlz.o UnAlzBz2decompress.o UnAlzBzip2.o UnAlzbzlib.o zlib/adler32.o zlib/crc32.o zlib/infblock.o zlib/infcodes.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/infutil.o zlib/zutil.o bzip2/blocksort.o bzip2/compress.o bzip2/crctable.o bzip2/huffman.o bzip2/randtable.o
BIN = unalz
CFLAGS = -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
LDFLAGS=
#CFLAGS = -DDARWIN
#LDFLAGS=-liconv
#nothing:
all:
@echo ""
@echo "USAGE : make TARGET_SYSTEM"
@echo ""
@echo ""
@echo "TARGET_SYSTEM is one of"
@echo ""
@echo " posix : POSIX system (FreeBSD/linux/OSX/sparc)"
@echo " posix-utf8 : POSIX with utf8 filesystem(OSX)"
@echo " posix-noiconv : POSIX without libiconv (MINGW32,CP949 file system)"
@echo ""
@echo " and 'clean' for clean"
@echo ""
posix: unalz
$(CPP) -c UnAlz.cpp -c main.cpp $(CFLAGS) -D_UNALZ_ICONV
$(CPP) $(LINKOBJ) $(LDFLAGS) -liconv -o $(BIN)
posix-utf8: unalz
$(CPP) -c UnAlz.cpp -c main.cpp $(CFLAGS) -D_UNALZ_ICONV -D_UNALZ_UTF8
$(CPP) $(LINKOBJ) $(LDFLAGS) -liconv -o $(BIN)
posix-noiconv: unalz
$(CPP) -c UnAlz.cpp -c main.cpp $(CFLAGS)
$(CPP) $(LINKOBJ) $(LDFLAGS) -o $(BIN)
clean:
rm -f $(OBJ) $(BIN) main.o UnAlz.o
$(BIN): $(OBJ)
# $(CPP) $(LINKOBJ) $(LDFLAGS) -o $(BIN)
#UnAlz.o: UnAlz.cpp
# $(CPP) -c UnAlz.cpp -o UnAlz.o $(CFLAGS)
#main.o: main.cpp
# $(CPP) -c main.cpp -o main.o $(CFLAGS)
UnAlzBz2decompress.o: UnAlzBz2decompress.c
$(CC) -c UnAlzBz2decompress.c -o UnAlzBz2decompress.o $(CFLAGS)
UnAlzBzip2.o: UnAlzBzip2.cpp
$(CPP) -c UnAlzBzip2.cpp -o UnAlzBzip2.o $(CFLAGS)
UnAlzbzlib.o: UnAlzbzlib.c
$(CC) -c UnAlzbzlib.c -o UnAlzbzlib.o $(CFLAGS)
zlib/adler32.o: zlib/adler32.c
$(CC) -c zlib/adler32.c -o zlib/adler32.o $(CFLAGS)
zlib/crc32.o: zlib/crc32.c
$(CC) -c zlib/crc32.c -o zlib/crc32.o $(CFLAGS)
zlib/infblock.o: zlib/infblock.c
$(CC) -c zlib/infblock.c -o zlib/infblock.o $(CFLAGS)
zlib/infcodes.o: zlib/infcodes.c
$(CC) -c zlib/infcodes.c -o zlib/infcodes.o $(CFLAGS)
zlib/inffast.o: zlib/inffast.c
$(CC) -c zlib/inffast.c -o zlib/inffast.o $(CFLAGS)
zlib/inflate.o: zlib/inflate.c
$(CC) -c zlib/inflate.c -o zlib/inflate.o $(CFLAGS)
zlib/inftrees.o: zlib/inftrees.c
$(CC) -c zlib/inftrees.c -o zlib/inftrees.o $(CFLAGS)
zlib/infutil.o: zlib/infutil.c
$(CC) -c zlib/infutil.c -o zlib/infutil.o $(CFLAGS)
zlib/zutil.o: zlib/zutil.c
$(CC) -c zlib/zutil.c -o zlib/zutil.o $(CFLAGS)
bzip2/blocksort.o: bzip2/blocksort.c
$(CC) -c bzip2/blocksort.c -o bzip2/blocksort.o $(CFLAGS)
bzip2/compress.o: bzip2/compress.c
$(CC) -c bzip2/compress.c -o bzip2/compress.o $(CFLAGS)
bzip2/crctable.o: bzip2/crctable.c
$(CC) -c bzip2/crctable.c -o bzip2/crctable.o $(CFLAGS)
bzip2/huffman.o: bzip2/huffman.c
$(CC) -c bzip2/huffman.c -o bzip2/huffman.o $(CFLAGS)
bzip2/randtable.o: bzip2/randtable.c
$(CC) -c bzip2/randtable.c -o bzip2/randtable.o $(CFLAGS)

11
readme.txt Normal file → Executable file
View file

@ -1,21 +1,18 @@
unalz v0.22 unalz v0.31
copyright(C) 2004 http://www.kipple.pe.kr copyright(C) 2004 koder (http://www.kipple.pe.kr)
- 최초 작성일 : v0.20 - 2004/10/22 - 최초 작성일 : v0.20 - 2004/10/22
- 최종 갱신일 : v0.22 - 2004/10/28 - 최종 갱신일 : v0.31 - 2004/11/27
- 기능 - 기능
. alz 파일 압축 해제 프로그램 . alz 파일 압축 해제 프로그램
. deflate/변형 bzip2/raw 포맷 지원 . deflate/변형 bzip2/raw 포맷 지원
. 분할 압축 파일 지원 . 분할 압축 파일 지원
. WIN32(VC60/VC70/DEV-C++) , Free-BSD/LINUX(gcc/g++) 지원 . WIN32(VC60/VC70/DEV-C++/CYGWIN/MINGW) , Free-BSD/LINUX(gcc/g++) 지원
. 0.22 - SIG_ERR 관련 문제점 수정,
- 빅엔디안 시스템(OSX) 지원
- UTF-8 파일 시스템을 위한 코드 페이지 옵션 기능 지원
- 라이선스 - 라이선스
. 자유로이 변형/배포 가능 (BSD-license) . 자유로이 변형/배포 가능 (BSD-license)

406
unalz.dev Normal file → Executable file
View file

@ -9,7 +9,7 @@ CppCompiler=-D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_CONSOLE -D_MBCS_@@_
Includes= Includes=
Linker=-lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32_@@_ Linker=-lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32_@@_
Libs= Libs=
UnitCount=31 UnitCount=29
Folders=bzip2,main,unalz,zlib Folders=bzip2,main,unalz,zlib
ObjFiles= ObjFiles=
PrivateResource= PrivateResource=
@ -89,207 +89,7 @@ Priority=1000
OverrideBuildCmd=0 OverrideBuildCmd=0
BuildCmd= BuildCmd=
[Unit7]
FileName=zlib\adler32.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit8]
FileName=zlib\crc32.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit9] [Unit9]
FileName=zlib\infblock.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit10]
FileName=zlib\INFBLOCK.H
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit11]
FileName=zlib\infcodes.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit12]
FileName=zlib\INFCODES.H
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit13]
FileName=zlib\inffast.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit14]
FileName=zlib\INFFAST.H
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit15]
FileName=zlib\INFFIXED.H
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit16]
FileName=zlib\inflate.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit17]
FileName=zlib\inftrees.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit18]
FileName=zlib\INFTREES.H
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit19]
FileName=zlib\infutil.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit20]
FileName=zlib\INFUTIL.H
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit21]
FileName=zlib\ZCONF.H
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit22]
FileName=zlib\ZLIB.H
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit23]
FileName=zlib\zutil.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit24]
FileName=zlib\ZUTIL.H
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit25]
FileName=bzip2\blocksort.c
Folder=bzip2
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit26]
FileName=bzip2\bzlib.h
Folder=bzip2
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit27]
FileName=bzip2\bzlib_private.h FileName=bzip2\bzlib_private.h
Folder=bzip2 Folder=bzip2
Compile=1 Compile=1
@ -299,7 +99,7 @@ Priority=1000
OverrideBuildCmd=0 OverrideBuildCmd=0
BuildCmd= BuildCmd=
[Unit28] [Unit10]
FileName=bzip2\compress.c FileName=bzip2\compress.c
Folder=bzip2 Folder=bzip2
Compile=1 Compile=1
@ -309,7 +109,7 @@ Priority=1000
OverrideBuildCmd=0 OverrideBuildCmd=0
BuildCmd= BuildCmd=
[Unit29] [Unit11]
FileName=bzip2\crctable.c FileName=bzip2\crctable.c
Folder=bzip2 Folder=bzip2
Compile=1 Compile=1
@ -319,6 +119,186 @@ Priority=1000
OverrideBuildCmd=0 OverrideBuildCmd=0
BuildCmd= BuildCmd=
[Unit12]
FileName=bzip2\huffman.c
Folder=bzip2
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit13]
FileName=bzip2\randtable.c
Folder=bzip2
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit14]
FileName=zlib\adler32.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=$(CC) -c adler32.c -o adler32.o $(CFLAGS)
[Unit15]
FileName=zlib\crc32.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=$(CC) -c crc32.c -o crc32.o $(CFLAGS)
[Unit16]
FileName=zlib\crc32.h
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit17]
FileName=zlib\infback.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=$(CC) -c infback.c -o infback.o $(CFLAGS)
[Unit18]
FileName=zlib\inffast.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=$(CC) -c inffast.c -o inffast.o $(CFLAGS)
[Unit19]
FileName=zlib\inffast.h
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit20]
FileName=zlib\inffixed.h
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit21]
FileName=zlib\inflate.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=$(CC) -c inflate.c -o inflate.o $(CFLAGS)
[Unit22]
FileName=zlib\inflate.h
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit23]
FileName=zlib\inftrees.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=$(CC) -c inftrees.c -o inftrees.o $(CFLAGS)
[Unit24]
FileName=zlib\inftrees.h
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit25]
FileName=zlib\zconf.h
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit26]
FileName=zlib\zconf.in.h
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit27]
FileName=zlib\zlib.h
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit28]
FileName=zlib\zutil.c
Folder=zlib
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=$(CC) -c zutil.c -o zutil.o $(CFLAGS)
[Unit29]
FileName=zlib\zutil.h
Folder=zlib
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit30] [Unit30]
FileName=bzip2\huffman.c FileName=bzip2\huffman.c
Folder=bzip2 Folder=bzip2
@ -367,3 +347,23 @@ ProductName=unalz
ProductVersion=0.1 ProductVersion=0.1
AutoIncBuildNr=0 AutoIncBuildNr=0
[Unit7]
FileName=bzip2\blocksort.c
CompileCpp=0
Folder=bzip2
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit8]
FileName=bzip2\bzlib.h
CompileCpp=1
Folder=bzip2
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=

28
unalz.dsp Normal file → Executable file
View file

@ -139,19 +139,11 @@ SOURCE=.\zlib\crc32.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\zlib\infblock.c SOURCE=.\zlib\crc32.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\zlib\infblock.h SOURCE=.\zlib\infback.c
# End Source File
# Begin Source File
SOURCE=.\zlib\infcodes.c
# End Source File
# Begin Source File
SOURCE=.\zlib\infcodes.h
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -171,6 +163,10 @@ SOURCE=.\zlib\inflate.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\zlib\inflate.h
# End Source File
# Begin Source File
SOURCE=.\zlib\inftrees.c SOURCE=.\zlib\inftrees.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -179,18 +175,14 @@ SOURCE=.\zlib\inftrees.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\zlib\infutil.c
# End Source File
# Begin Source File
SOURCE=.\zlib\infutil.h
# End Source File
# Begin Source File
SOURCE=.\zlib\zconf.h SOURCE=.\zlib\zconf.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\zlib\zconf.in.h
# End Source File
# Begin Source File
SOURCE=.\zlib\zlib.h SOURCE=.\zlib\zlib.h
# End Source File # End Source File
# Begin Source File # Begin Source File

0
unalz.dsw Normal file → Executable file
View file

0
unalz.sln Normal file → Executable file
View file

173
unalz.vcproj Normal file → Executable file
View file

@ -258,193 +258,52 @@
Name="zlib" Name="zlib"
Filter=""> Filter="">
<File <File
RelativePath="zlib\adler32.c"> RelativePath=".\zlib\adler32.c">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath="zlib\crc32.c"> RelativePath=".\zlib\crc32.c">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath="zlib\infblock.c"> RelativePath=".\zlib\crc32.h">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath="zlib\infblock.h"> RelativePath=".\zlib\infback.c">
</File> </File>
<File <File
RelativePath="zlib\infcodes.c"> RelativePath=".\zlib\inffast.c">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath="zlib\infcodes.h"> RelativePath=".\zlib\inffast.h">
</File> </File>
<File <File
RelativePath="zlib\inffast.c"> RelativePath=".\zlib\inffixed.h">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath="zlib\inffast.h"> RelativePath=".\zlib\inflate.c">
</File> </File>
<File <File
RelativePath="zlib\inffixed.h"> RelativePath=".\zlib\inflate.h">
</File> </File>
<File <File
RelativePath="zlib\inflate.c"> RelativePath=".\zlib\inftrees.c">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath="zlib\inftrees.c"> RelativePath=".\zlib\inftrees.h">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath="zlib\inftrees.h"> RelativePath=".\zlib\zconf.h">
</File> </File>
<File <File
RelativePath="zlib\infutil.c"> RelativePath=".\zlib\zconf.in.h">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File> </File>
<File <File
RelativePath="zlib\infutil.h"> RelativePath=".\zlib\zlib.h">
</File> </File>
<File <File
RelativePath="zlib\zconf.h"> RelativePath=".\zlib\zutil.c">
</File> </File>
<File <File
RelativePath="zlib\zlib.h"> RelativePath=".\zlib\zutil.h">
</File>
<File
RelativePath="zlib\zutil.c">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="zlib\zutil.h">
</File> </File>
</Filter> </Filter>
<Filter <Filter

42
zlib/adler32.c Normal file → Executable file
View file

@ -1,13 +1,14 @@
/* adler32.c -- compute the Adler-32 checksum of a data stream /* adler32.c -- compute the Adler-32 checksum of a data stream
* Copyright (C) 1995-2002 Mark Adler * Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
/* @(#) $Id$ */ /* @(#) $Id$ */
#define ZLIB_INTERNAL
#include "zlib.h" #include "zlib.h"
#define BASE 65521L /* largest prime smaller than 65536 */ #define BASE 65521UL /* largest prime smaller than 65536 */
#define NMAX 5552 #define NMAX 5552
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
@ -17,6 +18,31 @@
#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
#define DO16(buf) DO8(buf,0); DO8(buf,8); #define DO16(buf) DO8(buf,0); DO8(buf,8);
#ifdef NO_DIVIDE
# define MOD(a) \
do { \
if (a >= (BASE << 16)) a -= (BASE << 16); \
if (a >= (BASE << 15)) a -= (BASE << 15); \
if (a >= (BASE << 14)) a -= (BASE << 14); \
if (a >= (BASE << 13)) a -= (BASE << 13); \
if (a >= (BASE << 12)) a -= (BASE << 12); \
if (a >= (BASE << 11)) a -= (BASE << 11); \
if (a >= (BASE << 10)) a -= (BASE << 10); \
if (a >= (BASE << 9)) a -= (BASE << 9); \
if (a >= (BASE << 8)) a -= (BASE << 8); \
if (a >= (BASE << 7)) a -= (BASE << 7); \
if (a >= (BASE << 6)) a -= (BASE << 6); \
if (a >= (BASE << 5)) a -= (BASE << 5); \
if (a >= (BASE << 4)) a -= (BASE << 4); \
if (a >= (BASE << 3)) a -= (BASE << 3); \
if (a >= (BASE << 2)) a -= (BASE << 2); \
if (a >= (BASE << 1)) a -= (BASE << 1); \
if (a >= BASE) a -= BASE; \
} while (0)
#else
# define MOD(a) a %= BASE
#endif
/* ========================================================================= */ /* ========================================================================= */
uLong ZEXPORT adler32(adler, buf, len) uLong ZEXPORT adler32(adler, buf, len)
uLong adler; uLong adler;
@ -30,19 +56,19 @@ uLong ZEXPORT adler32(adler, buf, len)
if (buf == Z_NULL) return 1L; if (buf == Z_NULL) return 1L;
while (len > 0) { while (len > 0) {
k = len < NMAX ? len : NMAX; k = len < NMAX ? (int)len : NMAX;
len -= k; len -= k;
while (k >= 16) { while (k >= 16) {
DO16(buf); DO16(buf);
buf += 16; buf += 16;
k -= 16; k -= 16;
} }
if (k != 0) do { if (k != 0) do {
s1 += *buf++; s1 += *buf++;
s2 += s1; s2 += s1;
} while (--k); } while (--k);
s1 %= BASE; MOD(s1);
s2 %= BASE; MOD(s2);
} }
return (s2 << 16) | s1; return (s2 << 16) | s1;
} }

473
zlib/crc32.c Normal file → Executable file
View file

@ -1,162 +1,311 @@
/* crc32.c -- compute the CRC-32 of a data stream /* crc32.c -- compute the CRC-32 of a data stream
* Copyright (C) 1995-2002 Mark Adler * Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ *
* Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
/* @(#) $Id$ */ * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
* tables for updating the shift register in one step with three exclusive-ors
#include "zlib.h" * instead of four steps with four exclusive-ors. This results about a factor
* of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
#define local static */
#ifdef DYNAMIC_CRC_TABLE /* @(#) $Id$ */
local int crc_table_empty = 1; #ifdef MAKECRCH
local uLongf crc_table[256]; # include <stdio.h>
local void make_crc_table OF((void)); # ifndef DYNAMIC_CRC_TABLE
# define DYNAMIC_CRC_TABLE
/* # endif /* !DYNAMIC_CRC_TABLE */
Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: #endif /* MAKECRCH */
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
#include "zutil.h" /* for STDC and FAR definitions */
Polynomials over GF(2) are represented in binary, one bit per coefficient,
with the lowest powers in the most significant bit. Then adding polynomials #define local static
is just exclusive-or, and multiplying a polynomial by x is a right shift by
one. If we call the above polynomial p, and represent a byte as the /* Find a four-byte integer type for crc32_little() and crc32_big(). */
polynomial q, also with the lowest power in the most significant bit (so the #ifndef NOBYFOUR
byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, # ifdef STDC /* need ANSI C limits.h to determine sizes */
where a mod b means the remainder after dividing a by b. # include <limits.h>
# define BYFOUR
This calculation is done using the shift-register method of multiplying and # if (UINT_MAX == 0xffffffffUL)
taking the remainder. The register is initialized to zero, and for each typedef unsigned int u4;
incoming bit, x^32 is added mod p to the register if the bit is a one (where # else
x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by # if (ULONG_MAX == 0xffffffffUL)
x (which is shifting right by one and adding x^32 mod p if the bit shifted typedef unsigned long u4;
out is a one). We start with the highest power (least significant bit) of # else
q and repeat for all eight bits of q. # if (USHRT_MAX == 0xffffffffUL)
typedef unsigned short u4;
The table is simply the CRC of all possible eight bit values. This is all # else
the information needed to generate CRC's on data a byte at a time for all # undef BYFOUR /* can't find a four-byte integer type! */
combinations of CRC register values and incoming bytes. # endif
*/ # endif
local void make_crc_table() # endif
{ # endif /* STDC */
uLong c; #endif /* !NOBYFOUR */
int n, k;
uLong poly; /* polynomial exclusive-or pattern */ /* Definitions for doing the crc four data bytes at a time. */
/* terms of polynomial defining this crc (except x^32): */ #ifdef BYFOUR
static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; # define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \
(((w)&0xff00)<<8)+(((w)&0xff)<<24))
/* make exclusive-or pattern from polynomial (0xedb88320L) */ local unsigned long crc32_little OF((unsigned long,
poly = 0L; const unsigned char FAR *, unsigned));
for (n = 0; n < sizeof(p)/sizeof(Byte); n++) local unsigned long crc32_big OF((unsigned long,
poly |= 1L << (31 - p[n]); const unsigned char FAR *, unsigned));
# define TBLS 8
for (n = 0; n < 256; n++) #else
{ # define TBLS 1
c = (uLong)n; #endif /* BYFOUR */
for (k = 0; k < 8; k++)
c = c & 1 ? poly ^ (c >> 1) : c >> 1; #ifdef DYNAMIC_CRC_TABLE
crc_table[n] = c;
} local int crc_table_empty = 1;
crc_table_empty = 0; local unsigned long FAR crc_table[TBLS][256];
} local void make_crc_table OF((void));
#else #ifdef MAKECRCH
/* ======================================================================== local void write_table OF((FILE *, const unsigned long FAR *));
* Table of CRC-32's of all single-byte values (made by make_crc_table) #endif /* MAKECRCH */
*/
local const uLongf crc_table[256] = { /*
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, Polynomials over GF(2) are represented in binary, one bit per coefficient,
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, with the lowest powers in the most significant bit. Then adding polynomials
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, is just exclusive-or, and multiplying a polynomial by x is a right shift by
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, one. If we call the above polynomial p, and represent a byte as the
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, polynomial q, also with the lowest power in the most significant bit (so the
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, where a mod b means the remainder after dividing a by b.
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, This calculation is done using the shift-register method of multiplying and
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, taking the remainder. The register is initialized to zero, and for each
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, incoming bit, x^32 is added mod p to the register if the bit is a one (where
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, x (which is shifting right by one and adding x^32 mod p if the bit shifted
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, out is a one). We start with the highest power (least significant bit) of
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, q and repeat for all eight bits of q.
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, The first table is simply the CRC of all possible eight bit values. This is
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, all the information needed to generate CRCs on data a byte at a time for all
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, combinations of CRC register values and incoming bytes. The remaining tables
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, allow for word-at-a-time CRC calculation for both big-endian and little-
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, endian machines, where a word is four bytes.
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, */
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, local void make_crc_table()
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, {
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, unsigned long c;
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, int n, k;
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, unsigned long poly; /* polynomial exclusive-or pattern */
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, /* terms of polynomial defining this crc (except x^32): */
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, /* make exclusive-or pattern from polynomial (0xedb88320UL) */
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, poly = 0UL;
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++)
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, poly |= 1UL << (31 - p[n]);
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, /* generate a crc for every 8-bit value */
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, for (n = 0; n < 256; n++) {
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, c = (unsigned long)n;
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, for (k = 0; k < 8; k++)
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, c = c & 1 ? poly ^ (c >> 1) : c >> 1;
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, crc_table[0][n] = c;
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, }
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, #ifdef BYFOUR
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, /* generate crc for each value followed by one, two, and three zeros, and
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, then the byte reversal of those as well as the first table */
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, for (n = 0; n < 256; n++) {
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, c = crc_table[0][n];
0x2d02ef8dL crc_table[4][n] = REV(c);
}; for (k = 1; k < 4; k++) {
#endif c = crc_table[0][c & 0xff] ^ (c >> 8);
crc_table[k][n] = c;
/* ========================================================================= crc_table[k + 4][n] = REV(c);
* This function can be used by asm versions of crc32() }
*/ }
const uLongf * ZEXPORT get_crc_table() #endif /* BYFOUR */
{
#ifdef DYNAMIC_CRC_TABLE crc_table_empty = 0;
if (crc_table_empty) make_crc_table();
#endif #ifdef MAKECRCH
return (const uLongf *)crc_table; /* write out CRC tables to crc32.h */
} {
FILE *out;
/* ========================================================================= */
#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); out = fopen("crc32.h", "w");
#define DO2(buf) DO1(buf); DO1(buf); if (out == NULL) return;
#define DO4(buf) DO2(buf); DO2(buf); fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
#define DO8(buf) DO4(buf); DO4(buf); fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
fprintf(out, "local const unsigned long FAR ");
/* ========================================================================= */ fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
uLong ZEXPORT crc32(crc, buf, len) write_table(out, crc_table[0]);
uLong crc; # ifdef BYFOUR
const Bytef *buf; fprintf(out, "#ifdef BYFOUR\n");
uInt len; for (k = 1; k < 8; k++) {
{ fprintf(out, " },\n {\n");
if (buf == Z_NULL) return 0L; write_table(out, crc_table[k]);
#ifdef DYNAMIC_CRC_TABLE }
if (crc_table_empty) fprintf(out, "#endif\n");
make_crc_table(); # endif /* BYFOUR */
#endif fprintf(out, " }\n};\n");
crc = crc ^ 0xffffffffL; fclose(out);
while (len >= 8) }
{ #endif /* MAKECRCH */
DO8(buf); }
len -= 8;
} #ifdef MAKECRCH
if (len) do { local void write_table(out, table)
DO1(buf); FILE *out;
} while (--len); const unsigned long FAR *table;
return crc ^ 0xffffffffL; {
} int n;
for (n = 0; n < 256; n++)
fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n],
n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
}
#endif /* MAKECRCH */
#else /* !DYNAMIC_CRC_TABLE */
/* ========================================================================
* Tables of CRC-32s of all single-byte values, made by make_crc_table().
*/
#include "crc32.h"
#endif /* DYNAMIC_CRC_TABLE */
/* =========================================================================
* This function can be used by asm versions of crc32()
*/
const unsigned long FAR * ZEXPORT get_crc_table()
{
#ifdef DYNAMIC_CRC_TABLE
if (crc_table_empty) make_crc_table();
#endif /* DYNAMIC_CRC_TABLE */
return (const unsigned long FAR *)crc_table;
}
/* ========================================================================= */
#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
/* ========================================================================= */
unsigned long ZEXPORT crc32(crc, buf, len)
unsigned long crc;
const unsigned char FAR *buf;
unsigned len;
{
if (buf == Z_NULL) return 0UL;
#ifdef DYNAMIC_CRC_TABLE
if (crc_table_empty)
make_crc_table();
#endif /* DYNAMIC_CRC_TABLE */
#ifdef BYFOUR
if (sizeof(void *) == sizeof(ptrdiff_t)) {
u4 endian;
endian = 1;
if (*((unsigned char *)(&endian)))
return crc32_little(crc, buf, len);
else
return crc32_big(crc, buf, len);
}
#endif /* BYFOUR */
crc = crc ^ 0xffffffffUL;
while (len >= 8) {
DO8;
len -= 8;
}
if (len) do {
DO1;
} while (--len);
return crc ^ 0xffffffffUL;
}
#ifdef BYFOUR
/* ========================================================================= */
#define DOLIT4 c ^= *buf4++; \
c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
/* ========================================================================= */
local unsigned long crc32_little(crc, buf, len)
unsigned long crc;
const unsigned char FAR *buf;
unsigned len;
{
register u4 c;
register const u4 FAR *buf4;
c = (u4)crc;
c = ~c;
while (len && ((ptrdiff_t)buf & 3)) {
c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
len--;
}
buf4 = (const u4 FAR *)buf;
while (len >= 32) {
DOLIT32;
len -= 32;
}
while (len >= 4) {
DOLIT4;
len -= 4;
}
buf = (const unsigned char FAR *)buf4;
if (len) do {
c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
} while (--len);
c = ~c;
return (unsigned long)c;
}
/* ========================================================================= */
#define DOBIG4 c ^= *++buf4; \
c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
/* ========================================================================= */
local unsigned long crc32_big(crc, buf, len)
unsigned long crc;
const unsigned char FAR *buf;
unsigned len;
{
register u4 c;
register const u4 FAR *buf4;
c = REV((u4)crc);
c = ~c;
while (len && ((ptrdiff_t)buf & 3)) {
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
len--;
}
buf4 = (const u4 FAR *)buf;
buf4--;
while (len >= 32) {
DOBIG32;
len -= 32;
}
while (len >= 4) {
DOBIG4;
len -= 4;
}
buf4++;
buf = (const unsigned char FAR *)buf4;
if (len) do {
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
} while (--len);
c = ~c;
return (unsigned long)(REV(c));
}
#endif /* BYFOUR */

441
zlib/crc32.h Executable file
View file

@ -0,0 +1,441 @@
/* crc32.h -- tables for rapid CRC calculation
* Generated automatically by crc32.c
*/
local const unsigned long FAR crc_table[TBLS][256] =
{
{
0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
0x2d02ef8dUL
#ifdef BYFOUR
},
{
0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
0x9324fd72UL
},
{
0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
0xbe9834edUL
},
{
0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
0xde0506f1UL
},
{
0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,
0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,
0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,
0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,
0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,
0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,
0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,
0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,
0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,
0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,
0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,
0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,
0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,
0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,
0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,
0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,
0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,
0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,
0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,
0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,
0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,
0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,
0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,
0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,
0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,
0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,
0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,
0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,
0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,
0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,
0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,
0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,
0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,
0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,
0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,
0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,
0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,
0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,
0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,
0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,
0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,
0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,
0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,
0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,
0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,
0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,
0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,
0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,
0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,
0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,
0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,
0x8def022dUL
},
{
0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,
0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,
0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,
0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,
0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,
0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,
0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,
0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,
0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,
0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,
0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,
0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,
0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,
0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,
0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,
0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,
0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,
0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,
0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,
0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,
0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,
0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,
0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,
0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,
0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,
0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,
0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,
0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,
0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,
0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,
0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,
0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,
0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,
0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,
0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,
0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,
0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,
0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,
0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,
0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,
0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,
0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,
0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,
0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,
0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,
0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,
0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,
0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,
0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,
0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,
0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,
0x72fd2493UL
},
{
0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,
0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,
0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,
0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,
0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,
0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,
0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,
0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,
0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,
0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,
0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,
0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,
0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,
0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,
0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,
0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,
0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,
0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,
0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,
0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,
0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,
0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,
0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,
0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,
0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,
0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,
0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,
0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,
0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,
0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,
0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,
0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,
0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,
0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,
0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,
0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,
0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,
0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,
0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,
0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,
0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,
0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,
0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,
0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,
0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,
0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,
0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,
0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,
0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,
0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,
0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,
0xed3498beUL
},
{
0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,
0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,
0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,
0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,
0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,
0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,
0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,
0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,
0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,
0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,
0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,
0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,
0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,
0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,
0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,
0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,
0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,
0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,
0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,
0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,
0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,
0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,
0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,
0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,
0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,
0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,
0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,
0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,
0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,
0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,
0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,
0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,
0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,
0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,
0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,
0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,
0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,
0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,
0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,
0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,
0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,
0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,
0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,
0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,
0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,
0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,
0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,
0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,
0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,
0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,
0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,
0xf10605deUL
#endif
}
};

619
zlib/infback.c Executable file
View file

@ -0,0 +1,619 @@
/* infback.c -- inflate using a call-back interface
* Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/*
This code is largely copied from inflate.c. Normally either infback.o or
inflate.o would be linked into an application--not both. The interface
with inffast.c is retained so that optimized assembler-coded versions of
inflate_fast() can be used with either inflate.c or infback.c.
*/
#include "zutil.h"
#include "inftrees.h"
#include "inflate.h"
#include "inffast.h"
/* function prototypes */
local void fixedtables OF((struct inflate_state FAR *state));
/*
strm provides memory allocation functions in zalloc and zfree, or
Z_NULL to use the library memory allocation functions.
windowBits is in the range 8..15, and window is a user-supplied
window and output buffer that is 2**windowBits bytes.
*/
int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
z_stream FAR *strm;
int windowBits;
unsigned char FAR *window;
const char *version;
int stream_size;
{
struct inflate_state FAR *state;
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
stream_size != (int)(sizeof(z_stream)))
return Z_VERSION_ERROR;
if (strm == Z_NULL || window == Z_NULL ||
windowBits < 8 || windowBits > 15)
return Z_STREAM_ERROR;
strm->msg = Z_NULL; /* in case we return an error */
if (strm->zalloc == (alloc_func)0) {
strm->zalloc = zcalloc;
strm->opaque = (voidpf)0;
}
if (strm->zfree == (free_func)0) strm->zfree = zcfree;
state = (struct inflate_state FAR *)ZALLOC(strm, 1,
sizeof(struct inflate_state));
if (state == Z_NULL) return Z_MEM_ERROR;
Tracev((stderr, "inflate: allocated\n"));
strm->state = (voidpf)state;
state->wbits = windowBits;
state->wsize = 1U << windowBits;
state->window = window;
state->write = 0;
state->whave = 0;
return Z_OK;
}
/*
Return state with length and distance decoding tables and index sizes set to
fixed code decoding. Normally this returns fixed tables from inffixed.h.
If BUILDFIXED is defined, then instead this routine builds the tables the
first time it's called, and returns those tables the first time and
thereafter. This reduces the size of the code by about 2K bytes, in
exchange for a little execution time. However, BUILDFIXED should not be
used for threaded applications, since the rewriting of the tables and virgin
may not be thread-safe.
*/
local void fixedtables(state)
struct inflate_state FAR *state;
{
#ifdef BUILDFIXED
static int virgin = 1;
static code *lenfix, *distfix;
static code fixed[544];
/* build fixed huffman tables if first call (may not be thread safe) */
if (virgin) {
unsigned sym, bits;
static code *next;
/* literal/length table */
sym = 0;
while (sym < 144) state->lens[sym++] = 8;
while (sym < 256) state->lens[sym++] = 9;
while (sym < 280) state->lens[sym++] = 7;
while (sym < 288) state->lens[sym++] = 8;
next = fixed;
lenfix = next;
bits = 9;
inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
/* distance table */
sym = 0;
while (sym < 32) state->lens[sym++] = 5;
distfix = next;
bits = 5;
inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
/* do this just once */
virgin = 0;
}
#else /* !BUILDFIXED */
# include "inffixed.h"
#endif /* BUILDFIXED */
state->lencode = lenfix;
state->lenbits = 9;
state->distcode = distfix;
state->distbits = 5;
}
/* Macros for inflateBack(): */
/* Load returned state from inflate_fast() */
#define LOAD() \
do { \
put = strm->next_out; \
left = strm->avail_out; \
next = strm->next_in; \
have = strm->avail_in; \
hold = state->hold; \
bits = state->bits; \
} while (0)
/* Set state from registers for inflate_fast() */
#define RESTORE() \
do { \
strm->next_out = put; \
strm->avail_out = left; \
strm->next_in = next; \
strm->avail_in = have; \
state->hold = hold; \
state->bits = bits; \
} while (0)
/* Clear the input bit accumulator */
#define INITBITS() \
do { \
hold = 0; \
bits = 0; \
} while (0)
/* Assure that some input is available. If input is requested, but denied,
then return a Z_BUF_ERROR from inflateBack(). */
#define PULL() \
do { \
if (have == 0) { \
have = in(in_desc, &next); \
if (have == 0) { \
next = Z_NULL; \
ret = Z_BUF_ERROR; \
goto inf_leave; \
} \
} \
} while (0)
/* Get a byte of input into the bit accumulator, or return from inflateBack()
with an error if there is no input available. */
#define PULLBYTE() \
do { \
PULL(); \
have--; \
hold += (unsigned long)(*next++) << bits; \
bits += 8; \
} while (0)
/* Assure that there are at least n bits in the bit accumulator. If there is
not enough available input to do that, then return from inflateBack() with
an error. */
#define NEEDBITS(n) \
do { \
while (bits < (unsigned)(n)) \
PULLBYTE(); \
} while (0)
/* Return the low n bits of the bit accumulator (n < 16) */
#define BITS(n) \
((unsigned)hold & ((1U << (n)) - 1))
/* Remove n bits from the bit accumulator */
#define DROPBITS(n) \
do { \
hold >>= (n); \
bits -= (unsigned)(n); \
} while (0)
/* Remove zero to seven bits as needed to go to a byte boundary */
#define BYTEBITS() \
do { \
hold >>= bits & 7; \
bits -= bits & 7; \
} while (0)
/* Assure that some output space is available, by writing out the window
if it's full. If the write fails, return from inflateBack() with a
Z_BUF_ERROR. */
#define ROOM() \
do { \
if (left == 0) { \
put = state->window; \
left = state->wsize; \
state->whave = left; \
if (out(out_desc, put, left)) { \
ret = Z_BUF_ERROR; \
goto inf_leave; \
} \
} \
} while (0)
/*
strm provides the memory allocation functions and window buffer on input,
and provides information on the unused input on return. For Z_DATA_ERROR
returns, strm will also provide an error message.
in() and out() are the call-back input and output functions. When
inflateBack() needs more input, it calls in(). When inflateBack() has
filled the window with output, or when it completes with data in the
window, it calls out() to write out the data. The application must not
change the provided input until in() is called again or inflateBack()
returns. The application must not change the window/output buffer until
inflateBack() returns.
in() and out() are called with a descriptor parameter provided in the
inflateBack() call. This parameter can be a structure that provides the
information required to do the read or write, as well as accumulated
information on the input and output such as totals and check values.
in() should return zero on failure. out() should return non-zero on
failure. If either in() or out() fails, than inflateBack() returns a
Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
was in() or out() that caused in the error. Otherwise, inflateBack()
returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
error, or Z_MEM_ERROR if it could not allocate memory for the state.
inflateBack() can also return Z_STREAM_ERROR if the input parameters
are not correct, i.e. strm is Z_NULL or the state was not initialized.
*/
int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
z_stream FAR *strm;
in_func in;
void FAR *in_desc;
out_func out;
void FAR *out_desc;
{
struct inflate_state FAR *state;
unsigned char FAR *next; /* next input */
unsigned char FAR *put; /* next output */
unsigned have, left; /* available input and output */
unsigned long hold; /* bit buffer */
unsigned bits; /* bits in bit buffer */
unsigned copy; /* number of stored or match bytes to copy */
unsigned char FAR *from; /* where to copy match bytes from */
code this; /* current decoding table entry */
code last; /* parent table entry */
unsigned len; /* length to copy for repeats, bits to drop */
int ret; /* return code */
static const unsigned short order[19] = /* permutation of code lengths */
{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
/* Check that the strm exists and that the state was initialized */
if (strm == Z_NULL || strm->state == Z_NULL)
return Z_STREAM_ERROR;
state = (struct inflate_state FAR *)strm->state;
/* Reset the state */
strm->msg = Z_NULL;
state->mode = TYPE;
state->last = 0;
state->whave = 0;
next = strm->next_in;
have = next != Z_NULL ? strm->avail_in : 0;
hold = 0;
bits = 0;
put = state->window;
left = state->wsize;
/* Inflate until end of block marked as last */
for (;;)
switch (state->mode) {
case TYPE:
/* determine and dispatch block type */
if (state->last) {
BYTEBITS();
state->mode = DONE;
break;
}
NEEDBITS(3);
state->last = BITS(1);
DROPBITS(1);
switch (BITS(2)) {
case 0: /* stored block */
Tracev((stderr, "inflate: stored block%s\n",
state->last ? " (last)" : ""));
state->mode = STORED;
break;
case 1: /* fixed block */
fixedtables(state);
Tracev((stderr, "inflate: fixed codes block%s\n",
state->last ? " (last)" : ""));
state->mode = LEN; /* decode codes */
break;
case 2: /* dynamic block */
Tracev((stderr, "inflate: dynamic codes block%s\n",
state->last ? " (last)" : ""));
state->mode = TABLE;
break;
case 3:
strm->msg = (char *)"invalid block type";
state->mode = BAD;
}
DROPBITS(2);
break;
case STORED:
/* get and verify stored block length */
BYTEBITS(); /* go to byte boundary */
NEEDBITS(32);
if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
strm->msg = (char *)"invalid stored block lengths";
state->mode = BAD;
break;
}
state->length = (unsigned)hold & 0xffff;
Tracev((stderr, "inflate: stored length %u\n",
state->length));
INITBITS();
/* copy stored block from input to output */
while (state->length != 0) {
copy = state->length;
PULL();
ROOM();
if (copy > have) copy = have;
if (copy > left) copy = left;
zmemcpy(put, next, copy);
have -= copy;
next += copy;
left -= copy;
put += copy;
state->length -= copy;
}
Tracev((stderr, "inflate: stored end\n"));
state->mode = TYPE;
break;
case TABLE:
/* get dynamic table entries descriptor */
NEEDBITS(14);
state->nlen = BITS(5) + 257;
DROPBITS(5);
state->ndist = BITS(5) + 1;
DROPBITS(5);
state->ncode = BITS(4) + 4;
DROPBITS(4);
#ifndef PKZIP_BUG_WORKAROUND
if (state->nlen > 286 || state->ndist > 30) {
strm->msg = (char *)"too many length or distance symbols";
state->mode = BAD;
break;
}
#endif
Tracev((stderr, "inflate: table sizes ok\n"));
/* get code length code lengths (not a typo) */
state->have = 0;
while (state->have < state->ncode) {
NEEDBITS(3);
state->lens[order[state->have++]] = (unsigned short)BITS(3);
DROPBITS(3);
}
while (state->have < 19)
state->lens[order[state->have++]] = 0;
state->next = state->codes;
state->lencode = (code const FAR *)(state->next);
state->lenbits = 7;
ret = inflate_table(CODES, state->lens, 19, &(state->next),
&(state->lenbits), state->work);
if (ret) {
strm->msg = (char *)"invalid code lengths set";
state->mode = BAD;
break;
}
Tracev((stderr, "inflate: code lengths ok\n"));
/* get length and distance code code lengths */
state->have = 0;
while (state->have < state->nlen + state->ndist) {
for (;;) {
this = state->lencode[BITS(state->lenbits)];
if ((unsigned)(this.bits) <= bits) break;
PULLBYTE();
}
if (this.val < 16) {
NEEDBITS(this.bits);
DROPBITS(this.bits);
state->lens[state->have++] = this.val;
}
else {
if (this.val == 16) {
NEEDBITS(this.bits + 2);
DROPBITS(this.bits);
if (state->have == 0) {
strm->msg = (char *)"invalid bit length repeat";
state->mode = BAD;
break;
}
len = (unsigned)(state->lens[state->have - 1]);
copy = 3 + BITS(2);
DROPBITS(2);
}
else if (this.val == 17) {
NEEDBITS(this.bits + 3);
DROPBITS(this.bits);
len = 0;
copy = 3 + BITS(3);
DROPBITS(3);
}
else {
NEEDBITS(this.bits + 7);
DROPBITS(this.bits);
len = 0;
copy = 11 + BITS(7);
DROPBITS(7);
}
if (state->have + copy > state->nlen + state->ndist) {
strm->msg = (char *)"invalid bit length repeat";
state->mode = BAD;
break;
}
while (copy--)
state->lens[state->have++] = (unsigned short)len;
}
}
/* build code tables */
state->next = state->codes;
state->lencode = (code const FAR *)(state->next);
state->lenbits = 9;
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
&(state->lenbits), state->work);
if (ret) {
strm->msg = (char *)"invalid literal/lengths set";
state->mode = BAD;
break;
}
state->distcode = (code const FAR *)(state->next);
state->distbits = 6;
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
&(state->next), &(state->distbits), state->work);
if (ret) {
strm->msg = (char *)"invalid distances set";
state->mode = BAD;
break;
}
Tracev((stderr, "inflate: codes ok\n"));
state->mode = LEN;
case LEN:
/* use inflate_fast() if we have enough input and output */
if (have >= 6 && left >= 258) {
RESTORE();
if (state->whave < state->wsize)
state->whave = state->wsize - left;
inflate_fast(strm, state->wsize);
LOAD();
break;
}
/* get a literal, length, or end-of-block code */
for (;;) {
this = state->lencode[BITS(state->lenbits)];
if ((unsigned)(this.bits) <= bits) break;
PULLBYTE();
}
if (this.op && (this.op & 0xf0) == 0) {
last = this;
for (;;) {
this = state->lencode[last.val +
(BITS(last.bits + last.op) >> last.bits)];
if ((unsigned)(last.bits + this.bits) <= bits) break;
PULLBYTE();
}
DROPBITS(last.bits);
}
DROPBITS(this.bits);
state->length = (unsigned)this.val;
/* process literal */
if (this.op == 0) {
Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
"inflate: literal '%c'\n" :
"inflate: literal 0x%02x\n", this.val));
ROOM();
*put++ = (unsigned char)(state->length);
left--;
state->mode = LEN;
break;
}
/* process end of block */
if (this.op & 32) {
Tracevv((stderr, "inflate: end of block\n"));
state->mode = TYPE;
break;
}
/* invalid code */
if (this.op & 64) {
strm->msg = (char *)"invalid literal/length code";
state->mode = BAD;
break;
}
/* length code -- get extra bits, if any */
state->extra = (unsigned)(this.op) & 15;
if (state->extra != 0) {
NEEDBITS(state->extra);
state->length += BITS(state->extra);
DROPBITS(state->extra);
}
Tracevv((stderr, "inflate: length %u\n", state->length));
/* get distance code */
for (;;) {
this = state->distcode[BITS(state->distbits)];
if ((unsigned)(this.bits) <= bits) break;
PULLBYTE();
}
if ((this.op & 0xf0) == 0) {
last = this;
for (;;) {
this = state->distcode[last.val +
(BITS(last.bits + last.op) >> last.bits)];
if ((unsigned)(last.bits + this.bits) <= bits) break;
PULLBYTE();
}
DROPBITS(last.bits);
}
DROPBITS(this.bits);
if (this.op & 64) {
strm->msg = (char *)"invalid distance code";
state->mode = BAD;
break;
}
state->offset = (unsigned)this.val;
/* get distance extra bits, if any */
state->extra = (unsigned)(this.op) & 15;
if (state->extra != 0) {
NEEDBITS(state->extra);
state->offset += BITS(state->extra);
DROPBITS(state->extra);
}
if (state->offset > state->wsize - (state->whave < state->wsize ?
left : 0)) {
strm->msg = (char *)"invalid distance too far back";
state->mode = BAD;
break;
}
Tracevv((stderr, "inflate: distance %u\n", state->offset));
/* copy match from window to output */
do {
ROOM();
copy = state->wsize - state->offset;
if (copy < left) {
from = put + copy;
copy = left - copy;
}
else {
from = put - state->offset;
copy = left;
}
if (copy > state->length) copy = state->length;
state->length -= copy;
left -= copy;
do {
*put++ = *from++;
} while (--copy);
} while (state->length != 0);
break;
case DONE:
/* inflate stream terminated properly -- write leftover output */
ret = Z_STREAM_END;
if (left < state->wsize) {
if (out(out_desc, state->window, state->wsize - left))
ret = Z_BUF_ERROR;
}
goto inf_leave;
case BAD:
ret = Z_DATA_ERROR;
goto inf_leave;
default: /* can't happen, but makes compilers happy */
ret = Z_STREAM_ERROR;
goto inf_leave;
}
/* Return unused input */
inf_leave:
strm->next_in = next;
strm->avail_in = have;
return ret;
}
int ZEXPORT inflateBackEnd(strm)
z_stream FAR *strm;
{
if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
return Z_STREAM_ERROR;
ZFREE(strm, strm->state);
strm->state = Z_NULL;
Tracev((stderr, "inflate: end\n"));
return Z_OK;
}

View file

@ -1,403 +0,0 @@
/* infblock.c -- interpret and process block types to last block
* Copyright (C) 1995-2002 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zutil.h"
#include "infblock.h"
#include "inftrees.h"
#include "infcodes.h"
#include "infutil.h"
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
/* simplify the use of the inflate_huft type with some defines */
#define exop word.what.Exop
#define bits word.what.Bits
/* Table for deflate from PKZIP's appnote.txt. */
local const uInt border[] = { /* Order of the bit length code lengths */
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
/*
Notes beyond the 1.93a appnote.txt:
1. Distance pointers never point before the beginning of the output
stream.
2. Distance pointers can point back across blocks, up to 32k away.
3. There is an implied maximum of 7 bits for the bit length table and
15 bits for the actual data.
4. If only one code exists, then it is encoded using one bit. (Zero
would be more efficient, but perhaps a little confusing.) If two
codes exist, they are coded using one bit each (0 and 1).
5. There is no way of sending zero distance codes--a dummy must be
sent if there are none. (History: a pre 2.0 version of PKZIP would
store blocks with no distance codes, but this was discovered to be
too harsh a criterion.) Valid only for 1.93a. 2.04c does allow
zero distance codes, which is sent as one code of zero bits in
length.
6. There are up to 286 literal/length codes. Code 256 represents the
end-of-block. Note however that the static length tree defines
288 codes just to fill out the Huffman codes. Codes 286 and 287
cannot be used though, since there is no length base or extra bits
defined for them. Similarily, there are up to 30 distance codes.
However, static trees define 32 codes (all 5 bits) to fill out the
Huffman codes, but the last two had better not show up in the data.
7. Unzip can check dynamic Huffman blocks for complete code sets.
The exception is that a single code would not be complete (see #4).
8. The five bits following the block type is really the number of
literal codes sent minus 257.
9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
(1+6+6). Therefore, to output three times the length, you output
three codes (1+1+1), whereas to output four times the same length,
you only need two codes (1+3). Hmm.
10. In the tree reconstruction algorithm, Code = Code + Increment
only if BitLength(i) is not zero. (Pretty obvious.)
11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19)
12. Note: length code 284 can represent 227-258, but length code 285
really is 258. The last length deserves its own, short code
since it gets used a lot in very redundant files. The length
258 is special since 258 - 3 (the min match length) is 255.
13. The literal/length and distance code bit lengths are read as a
single stream of lengths. It is possible (and advantageous) for
a repeat code (16, 17, or 18) to go across the boundary between
the two sets of lengths.
*/
void inflate_blocks_reset(s, z, c)
inflate_blocks_statef *s;
z_streamp z;
uLongf *c;
{
if (c != Z_NULL)
*c = s->check;
if (s->mode == BTREE || s->mode == DTREE)
ZFREE(z, s->sub.trees.blens);
if (s->mode == CODES)
inflate_codes_free(s->sub.decode.codes, z);
s->mode = TYPE;
s->bitk = 0;
s->bitb = 0;
s->read = s->write = s->window;
if (s->checkfn != Z_NULL)
z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
Tracev((stderr, "inflate: blocks reset\n"));
}
inflate_blocks_statef *inflate_blocks_new(z, c, w)
z_streamp z;
check_func c;
uInt w;
{
inflate_blocks_statef *s;
if ((s = (inflate_blocks_statef *)ZALLOC
(z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
return s;
if ((s->hufts =
(inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
{
ZFREE(z, s);
return Z_NULL;
}
if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
{
ZFREE(z, s->hufts);
ZFREE(z, s);
return Z_NULL;
}
s->end = s->window + w;
s->checkfn = c;
s->mode = TYPE;
Tracev((stderr, "inflate: blocks allocated\n"));
inflate_blocks_reset(s, z, Z_NULL);
return s;
}
int inflate_blocks(s, z, r)
inflate_blocks_statef *s;
z_streamp z;
int r;
{
uInt t; /* temporary storage */
uLong b; /* bit buffer */
uInt k; /* bits in bit buffer */
Bytef *p; /* input data pointer */
uInt n; /* bytes available there */
Bytef *q; /* output window write pointer */
uInt m; /* bytes to end of window or read pointer */
/* copy input/output information to locals (UPDATE macro restores) */
LOAD
/* process input based on current state */
while (1) switch (s->mode)
{
case TYPE:
NEEDBITS(3)
t = (uInt)b & 7;
s->last = t & 1;
switch (t >> 1)
{
case 0: /* stored */
Tracev((stderr, "inflate: stored block%s\n",
s->last ? " (last)" : ""));
DUMPBITS(3)
t = k & 7; /* go to byte boundary */
DUMPBITS(t)
s->mode = LENS; /* get length of stored block */
break;
case 1: /* fixed */
Tracev((stderr, "inflate: fixed codes block%s\n",
s->last ? " (last)" : ""));
{
uInt bl, bd;
inflate_huft *tl, *td;
inflate_trees_fixed(&bl, &bd, &tl, &td, z);
s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
if (s->sub.decode.codes == Z_NULL)
{
r = Z_MEM_ERROR;
LEAVE
}
}
DUMPBITS(3)
s->mode = CODES;
break;
case 2: /* dynamic */
Tracev((stderr, "inflate: dynamic codes block%s\n",
s->last ? " (last)" : ""));
DUMPBITS(3)
s->mode = TABLE;
break;
case 3: /* illegal */
DUMPBITS(3)
s->mode = BAD;
z->msg = (char*)"invalid block type";
r = Z_DATA_ERROR;
LEAVE
}
break;
case LENS:
NEEDBITS(32)
if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
{
s->mode = BAD;
z->msg = (char*)"invalid stored block lengths";
r = Z_DATA_ERROR;
LEAVE
}
s->sub.left = (uInt)b & 0xffff;
b = k = 0; /* dump bits */
Tracev((stderr, "inflate: stored length %u\n", s->sub.left));
s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
break;
case STORED:
if (n == 0)
LEAVE
NEEDOUT
t = s->sub.left;
if (t > n) t = n;
if (t > m) t = m;
zmemcpy(q, p, t);
p += t; n -= t;
q += t; m -= t;
if ((s->sub.left -= t) != 0)
break;
Tracev((stderr, "inflate: stored end, %lu total out\n",
z->total_out + (q >= s->read ? q - s->read :
(s->end - s->read) + (q - s->window))));
s->mode = s->last ? DRY : TYPE;
break;
case TABLE:
NEEDBITS(14)
s->sub.trees.table = t = (uInt)b & 0x3fff;
#ifndef PKZIP_BUG_WORKAROUND
if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
{
s->mode = BAD;
z->msg = (char*)"too many length or distance symbols";
r = Z_DATA_ERROR;
LEAVE
}
#endif
t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
{
r = Z_MEM_ERROR;
LEAVE
}
DUMPBITS(14)
s->sub.trees.index = 0;
Tracev((stderr, "inflate: table sizes ok\n"));
s->mode = BTREE;
case BTREE:
while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
{
NEEDBITS(3)
s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
DUMPBITS(3)
}
while (s->sub.trees.index < 19)
s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
s->sub.trees.bb = 7;
t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
&s->sub.trees.tb, s->hufts, z);
if (t != Z_OK)
{
r = t;
if (r == Z_DATA_ERROR)
{
ZFREE(z, s->sub.trees.blens);
s->mode = BAD;
}
LEAVE
}
s->sub.trees.index = 0;
Tracev((stderr, "inflate: bits tree ok\n"));
s->mode = DTREE;
case DTREE:
while (t = s->sub.trees.table,
s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
{
inflate_huft *h;
uInt i, j, c;
t = s->sub.trees.bb;
NEEDBITS(t)
h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
t = h->bits;
c = h->base;
if (c < 16)
{
DUMPBITS(t)
s->sub.trees.blens[s->sub.trees.index++] = c;
}
else /* c == 16..18 */
{
i = c == 18 ? 7 : c - 14;
j = c == 18 ? 11 : 3;
NEEDBITS(t + i)
DUMPBITS(t)
j += (uInt)b & inflate_mask[i];
DUMPBITS(i)
i = s->sub.trees.index;
t = s->sub.trees.table;
if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
(c == 16 && i < 1))
{
ZFREE(z, s->sub.trees.blens);
s->mode = BAD;
z->msg = (char*)"invalid bit length repeat";
r = Z_DATA_ERROR;
LEAVE
}
c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
do {
s->sub.trees.blens[i++] = c;
} while (--j);
s->sub.trees.index = i;
}
}
s->sub.trees.tb = Z_NULL;
{
uInt bl, bd;
inflate_huft *tl, *td;
inflate_codes_statef *c;
bl = 9; /* must be <= 9 for lookahead assumptions */
bd = 6; /* must be <= 9 for lookahead assumptions */
t = s->sub.trees.table;
t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
s->sub.trees.blens, &bl, &bd, &tl, &td,
s->hufts, z);
if (t != Z_OK)
{
if (t == (uInt)Z_DATA_ERROR)
{
ZFREE(z, s->sub.trees.blens);
s->mode = BAD;
}
r = t;
LEAVE
}
Tracev((stderr, "inflate: trees ok\n"));
if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
{
r = Z_MEM_ERROR;
LEAVE
}
s->sub.decode.codes = c;
}
ZFREE(z, s->sub.trees.blens);
s->mode = CODES;
case CODES:
UPDATE
if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
return inflate_flush(s, z, r);
r = Z_OK;
inflate_codes_free(s->sub.decode.codes, z);
LOAD
Tracev((stderr, "inflate: codes end, %lu total out\n",
z->total_out + (q >= s->read ? q - s->read :
(s->end - s->read) + (q - s->window))));
if (!s->last)
{
s->mode = TYPE;
break;
}
s->mode = DRY;
case DRY:
FLUSH
if (s->read != s->write)
LEAVE
s->mode = DONE;
case DONE:
r = Z_STREAM_END;
LEAVE
case BAD:
r = Z_DATA_ERROR;
LEAVE
default:
r = Z_STREAM_ERROR;
LEAVE
}
}
int inflate_blocks_free(s, z)
inflate_blocks_statef *s;
z_streamp z;
{
inflate_blocks_reset(s, z, Z_NULL);
ZFREE(z, s->window);
ZFREE(z, s->hufts);
ZFREE(z, s);
Tracev((stderr, "inflate: blocks freed\n"));
return Z_OK;
}
void inflate_set_dictionary(s, d, n)
inflate_blocks_statef *s;
const Bytef *d;
uInt n;
{
zmemcpy(s->window, d, n);
s->read = s->write = s->window + n;
}
/* Returns true if inflate is currently at the end of a block generated
* by Z_SYNC_FLUSH or Z_FULL_FLUSH.
* IN assertion: s != Z_NULL
*/
int inflate_blocks_sync_point(s)
inflate_blocks_statef *s;
{
return s->mode == LENS;
}

View file

@ -1,39 +0,0 @@
/* infblock.h -- header to use infblock.c
* Copyright (C) 1995-2002 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
*/
struct inflate_blocks_state;
typedef struct inflate_blocks_state FAR inflate_blocks_statef;
extern inflate_blocks_statef * inflate_blocks_new OF((
z_streamp z,
check_func c, /* check function */
uInt w)); /* window size */
extern int inflate_blocks OF((
inflate_blocks_statef *,
z_streamp ,
int)); /* initial return code */
extern void inflate_blocks_reset OF((
inflate_blocks_statef *,
z_streamp ,
uLongf *)); /* check value on output */
extern int inflate_blocks_free OF((
inflate_blocks_statef *,
z_streamp));
extern void inflate_set_dictionary OF((
inflate_blocks_statef *s,
const Bytef *d, /* dictionary */
uInt n)); /* dictionary length */
extern int inflate_blocks_sync_point OF((
inflate_blocks_statef *s));

View file

@ -1,251 +0,0 @@
/* infcodes.c -- process literals and length/distance pairs
* Copyright (C) 1995-2002 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zutil.h"
#include "inftrees.h"
#include "infblock.h"
#include "infcodes.h"
#include "infutil.h"
#include "inffast.h"
/* simplify the use of the inflate_huft type with some defines */
#define exop word.what.Exop
#define bits word.what.Bits
typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
START, /* x: set up for LEN */
LEN, /* i: get length/literal/eob next */
LENEXT, /* i: getting length extra (have base) */
DIST, /* i: get distance next */
DISTEXT, /* i: getting distance extra */
COPY, /* o: copying bytes in window, waiting for space */
LIT, /* o: got literal, waiting for output space */
WASH, /* o: got eob, possibly still output waiting */
END, /* x: got eob and all data flushed */
BADCODE} /* x: got error */
inflate_codes_mode;
/* inflate codes private state */
struct inflate_codes_state {
/* mode */
inflate_codes_mode mode; /* current inflate_codes mode */
/* mode dependent information */
uInt len;
union {
struct {
inflate_huft *tree; /* pointer into tree */
uInt need; /* bits needed */
} code; /* if LEN or DIST, where in tree */
uInt lit; /* if LIT, literal */
struct {
uInt get; /* bits to get for extra */
uInt dist; /* distance back to copy from */
} copy; /* if EXT or COPY, where and how much */
} sub; /* submode */
/* mode independent information */
Byte lbits; /* ltree bits decoded per branch */
Byte dbits; /* dtree bits decoder per branch */
inflate_huft *ltree; /* literal/length/eob tree */
inflate_huft *dtree; /* distance tree */
};
inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z)
uInt bl, bd;
inflate_huft *tl;
inflate_huft *td; /* need separate declaration for Borland C++ */
z_streamp z;
{
inflate_codes_statef *c;
if ((c = (inflate_codes_statef *)
ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
{
c->mode = START;
c->lbits = (Byte)bl;
c->dbits = (Byte)bd;
c->ltree = tl;
c->dtree = td;
Tracev((stderr, "inflate: codes new\n"));
}
return c;
}
int inflate_codes(s, z, r)
inflate_blocks_statef *s;
z_streamp z;
int r;
{
uInt j; /* temporary storage */
inflate_huft *t; /* temporary pointer */
uInt e; /* extra bits or operation */
uLong b; /* bit buffer */
uInt k; /* bits in bit buffer */
Bytef *p; /* input data pointer */
uInt n; /* bytes available there */
Bytef *q; /* output window write pointer */
uInt m; /* bytes to end of window or read pointer */
Bytef *f; /* pointer to copy strings from */
inflate_codes_statef *c = s->sub.decode.codes; /* codes state */
/* copy input/output information to locals (UPDATE macro restores) */
LOAD
/* process input and output based on current state */
while (1) switch (c->mode)
{ /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
case START: /* x: set up for LEN */
#ifndef SLOW
if (m >= 258 && n >= 10)
{
UPDATE
r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
LOAD
if (r != Z_OK)
{
c->mode = r == Z_STREAM_END ? WASH : BADCODE;
break;
}
}
#endif /* !SLOW */
c->sub.code.need = c->lbits;
c->sub.code.tree = c->ltree;
c->mode = LEN;
case LEN: /* i: get length/literal/eob next */
j = c->sub.code.need;
NEEDBITS(j)
t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
DUMPBITS(t->bits)
e = (uInt)(t->exop);
if (e == 0) /* literal */
{
c->sub.lit = t->base;
Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
"inflate: literal '%c'\n" :
"inflate: literal 0x%02x\n", t->base));
c->mode = LIT;
break;
}
if (e & 16) /* length */
{
c->sub.copy.get = e & 15;
c->len = t->base;
c->mode = LENEXT;
break;
}
if ((e & 64) == 0) /* next table */
{
c->sub.code.need = e;
c->sub.code.tree = t + t->base;
break;
}
if (e & 32) /* end of block */
{
Tracevv((stderr, "inflate: end of block\n"));
c->mode = WASH;
break;
}
c->mode = BADCODE; /* invalid code */
z->msg = (char*)"invalid literal/length code";
r = Z_DATA_ERROR;
LEAVE
case LENEXT: /* i: getting length extra (have base) */
j = c->sub.copy.get;
NEEDBITS(j)
c->len += (uInt)b & inflate_mask[j];
DUMPBITS(j)
c->sub.code.need = c->dbits;
c->sub.code.tree = c->dtree;
Tracevv((stderr, "inflate: length %u\n", c->len));
c->mode = DIST;
case DIST: /* i: get distance next */
j = c->sub.code.need;
NEEDBITS(j)
t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
DUMPBITS(t->bits)
e = (uInt)(t->exop);
if (e & 16) /* distance */
{
c->sub.copy.get = e & 15;
c->sub.copy.dist = t->base;
c->mode = DISTEXT;
break;
}
if ((e & 64) == 0) /* next table */
{
c->sub.code.need = e;
c->sub.code.tree = t + t->base;
break;
}
c->mode = BADCODE; /* invalid code */
z->msg = (char*)"invalid distance code";
r = Z_DATA_ERROR;
LEAVE
case DISTEXT: /* i: getting distance extra */
j = c->sub.copy.get;
NEEDBITS(j)
c->sub.copy.dist += (uInt)b & inflate_mask[j];
DUMPBITS(j)
Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist));
c->mode = COPY;
case COPY: /* o: copying bytes in window, waiting for space */
f = q - c->sub.copy.dist;
while (f < s->window) /* modulo window size-"while" instead */
f += s->end - s->window; /* of "if" handles invalid distances */
while (c->len)
{
NEEDOUT
OUTBYTE(*f++)
if (f == s->end)
f = s->window;
c->len--;
}
c->mode = START;
break;
case LIT: /* o: got literal, waiting for output space */
NEEDOUT
OUTBYTE(c->sub.lit)
c->mode = START;
break;
case WASH: /* o: got eob, possibly more output */
if (k > 7) /* return unused byte, if any */
{
Assert(k < 16, "inflate_codes grabbed too many bytes")
k -= 8;
n++;
p--; /* can always return one */
}
FLUSH
if (s->read != s->write)
LEAVE
c->mode = END;
case END:
r = Z_STREAM_END;
LEAVE
case BADCODE: /* x: got error */
r = Z_DATA_ERROR;
LEAVE
default:
r = Z_STREAM_ERROR;
LEAVE
}
#ifdef NEED_DUMMY_RETURN
return Z_STREAM_ERROR; /* Some dumb compilers complain without this */
#endif
}
void inflate_codes_free(c, z)
inflate_codes_statef *c;
z_streamp z;
{
ZFREE(z, c);
Tracev((stderr, "inflate: codes free\n"));
}

View file

@ -1,27 +0,0 @@
/* infcodes.h -- header to use infcodes.c
* Copyright (C) 1995-2002 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
*/
struct inflate_codes_state;
typedef struct inflate_codes_state FAR inflate_codes_statef;
extern inflate_codes_statef *inflate_codes_new OF((
uInt, uInt,
inflate_huft *, inflate_huft *,
z_streamp ));
extern int inflate_codes OF((
inflate_blocks_statef *,
z_streamp ,
int));
extern void inflate_codes_free OF((
inflate_codes_statef *,
z_streamp ));

488
zlib/inffast.c Normal file → Executable file
View file

@ -1,183 +1,305 @@
/* inffast.c -- process literals and length/distance pairs fast /* inffast.c -- fast decoding
* Copyright (C) 1995-2002 Mark Adler * Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
#include "zutil.h" #include "zutil.h"
#include "inftrees.h" #include "inftrees.h"
#include "infblock.h" #include "inflate.h"
#include "infcodes.h" #include "inffast.h"
#include "infutil.h"
#include "inffast.h" #ifndef ASMINF
struct inflate_codes_state {int dummy;}; /* for buggy compilers */ /* Allow machine dependent optimization for post-increment or pre-increment.
Based on testing to date,
/* simplify the use of the inflate_huft type with some defines */ Pre-increment preferred for:
#define exop word.what.Exop - PowerPC G3 (Adler)
#define bits word.what.Bits - MIPS R5000 (Randers-Pehrson)
Post-increment preferred for:
/* macros for bit input with no checking and for returning unused bytes */ - none
#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}} No measurable difference:
#define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;} - Pentium III (Anderson)
- 68060 (Nikl)
/* Called with number of bytes left to write in window at least 258 */
(the maximum string length) and number of input bytes available #ifdef POSTINC
at least ten. The ten bytes are six bytes for the longest length/ # define OFF 0
distance pair plus four bytes for overloading the bit buffer. */ # define PUP(a) *(a)++
#else
int inflate_fast(bl, bd, tl, td, s, z) # define OFF 1
uInt bl, bd; # define PUP(a) *++(a)
inflate_huft *tl; #endif
inflate_huft *td; /* need separate declaration for Borland C++ */
inflate_blocks_statef *s; /*
z_streamp z; Decode literal, length, and distance codes and write out the resulting
{ literal and match bytes until either not enough input or output is
inflate_huft *t; /* temporary pointer */ available, an end-of-block is encountered, or a data error is encountered.
uInt e; /* extra bits or operation */ When large enough input and output buffers are supplied to inflate(), for
uLong b; /* bit buffer */ example, a 16K input buffer and a 64K output buffer, more than 95% of the
uInt k; /* bits in bit buffer */ inflate execution time is spent in this routine.
Bytef *p; /* input data pointer */
uInt n; /* bytes available there */ Entry assumptions:
Bytef *q; /* output window write pointer */
uInt m; /* bytes to end of window or read pointer */ state->mode == LEN
uInt ml; /* mask for literal/length tree */ strm->avail_in >= 6
uInt md; /* mask for distance tree */ strm->avail_out >= 258
uInt c; /* bytes to copy */ start >= strm->avail_out
uInt d; /* distance back to copy from */ state->bits < 8
Bytef *r; /* copy source pointer */
On return, state->mode is one of:
/* load input, output, bit values */
LOAD LEN -- ran out of enough output space or enough available input
TYPE -- reached end of block code, inflate() to interpret next block
/* initialize masks */ BAD -- error in block data
ml = inflate_mask[bl];
md = inflate_mask[bd]; Notes:
/* do until not enough input or output space for fast loop */ - The maximum input bits used by a length/distance pair is 15 bits for the
do { /* assume called with m >= 258 && n >= 10 */ length code, 5 bits for the length extra, 15 bits for the distance code,
/* get literal/length code */ and 13 bits for the distance extra. This totals 48 bits, or six bytes.
GRABBITS(20) /* max bits for literal/length code */ Therefore if strm->avail_in >= 6, then there is enough input to avoid
if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) checking for available input while decoding.
{
DUMPBITS(t->bits) - The maximum bytes that a single length/distance pair can output is 258
Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? bytes, which is the maximum length that can be coded. inflate_fast()
"inflate: * literal '%c'\n" : requires strm->avail_out >= 258 for each loop to avoid checking for
"inflate: * literal 0x%02x\n", t->base)); output space.
*q++ = (Byte)t->base; */
m--; void inflate_fast(strm, start)
continue; z_streamp strm;
} unsigned start; /* inflate()'s starting value for strm->avail_out */
do { {
DUMPBITS(t->bits) struct inflate_state FAR *state;
if (e & 16) unsigned char FAR *in; /* local strm->next_in */
{ unsigned char FAR *last; /* while in < last, enough input available */
/* get extra bits for length */ unsigned char FAR *out; /* local strm->next_out */
e &= 15; unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
c = t->base + ((uInt)b & inflate_mask[e]); unsigned char FAR *end; /* while out < end, enough space available */
DUMPBITS(e) unsigned wsize; /* window size or zero if not using window */
Tracevv((stderr, "inflate: * length %u\n", c)); unsigned whave; /* valid bytes in the window */
unsigned write; /* window write index */
/* decode distance base of block to copy */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
GRABBITS(15); /* max bits for distance code */ unsigned long hold; /* local strm->hold */
e = (t = td + ((uInt)b & md))->exop; unsigned bits; /* local strm->bits */
do { code const FAR *lcode; /* local strm->lencode */
DUMPBITS(t->bits) code const FAR *dcode; /* local strm->distcode */
if (e & 16) unsigned lmask; /* mask for first level of length codes */
{ unsigned dmask; /* mask for first level of distance codes */
/* get extra bits to add to distance base */ code this; /* retrieved table entry */
e &= 15; unsigned op; /* code bits, operation, extra bits, or */
GRABBITS(e) /* get extra bits (up to 13) */ /* window position, window bytes to copy */
d = t->base + ((uInt)b & inflate_mask[e]); unsigned len; /* match length, unused bytes */
DUMPBITS(e) unsigned dist; /* match distance */
Tracevv((stderr, "inflate: * distance %u\n", d)); unsigned char FAR *from; /* where to copy match from */
/* do the copy */ /* copy state to local variables */
m -= c; state = (struct inflate_state FAR *)strm->state;
r = q - d; in = strm->next_in - OFF;
if (r < s->window) /* wrap if needed */ last = in + (strm->avail_in - 5);
{ out = strm->next_out - OFF;
do { beg = out - (start - strm->avail_out);
r += s->end - s->window; /* force pointer in window */ end = out + (strm->avail_out - 257);
} while (r < s->window); /* covers invalid distances */ wsize = state->wsize;
e = s->end - r; whave = state->whave;
if (c > e) write = state->write;
{ window = state->window;
c -= e; /* wrapped copy */ hold = state->hold;
do { bits = state->bits;
*q++ = *r++; lcode = state->lencode;
} while (--e); dcode = state->distcode;
r = s->window; lmask = (1U << state->lenbits) - 1;
do { dmask = (1U << state->distbits) - 1;
*q++ = *r++;
} while (--c); /* decode literals and length/distances until end-of-block or not enough
} input data or output space */
else /* normal copy */ do {
{ if (bits < 15) {
*q++ = *r++; c--; hold += (unsigned long)(PUP(in)) << bits;
*q++ = *r++; c--; bits += 8;
do { hold += (unsigned long)(PUP(in)) << bits;
*q++ = *r++; bits += 8;
} while (--c); }
} this = lcode[hold & lmask];
} dolen:
else /* normal copy */ op = (unsigned)(this.bits);
{ hold >>= op;
*q++ = *r++; c--; bits -= op;
*q++ = *r++; c--; op = (unsigned)(this.op);
do { if (op == 0) { /* literal */
*q++ = *r++; Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
} while (--c); "inflate: literal '%c'\n" :
} "inflate: literal 0x%02x\n", this.val));
break; PUP(out) = (unsigned char)(this.val);
} }
else if ((e & 64) == 0) else if (op & 16) { /* length base */
{ len = (unsigned)(this.val);
t += t->base; op &= 15; /* number of extra bits */
e = (t += ((uInt)b & inflate_mask[e]))->exop; if (op) {
} if (bits < op) {
else hold += (unsigned long)(PUP(in)) << bits;
{ bits += 8;
z->msg = (char*)"invalid distance code"; }
UNGRAB len += (unsigned)hold & ((1U << op) - 1);
UPDATE hold >>= op;
return Z_DATA_ERROR; bits -= op;
} }
} while (1); Tracevv((stderr, "inflate: length %u\n", len));
break; if (bits < 15) {
} hold += (unsigned long)(PUP(in)) << bits;
if ((e & 64) == 0) bits += 8;
{ hold += (unsigned long)(PUP(in)) << bits;
t += t->base; bits += 8;
if ((e = (t += ((uInt)b & inflate_mask[e]))->exop) == 0) }
{ this = dcode[hold & dmask];
DUMPBITS(t->bits) dodist:
Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? op = (unsigned)(this.bits);
"inflate: * literal '%c'\n" : hold >>= op;
"inflate: * literal 0x%02x\n", t->base)); bits -= op;
*q++ = (Byte)t->base; op = (unsigned)(this.op);
m--; if (op & 16) { /* distance base */
break; dist = (unsigned)(this.val);
} op &= 15; /* number of extra bits */
} if (bits < op) {
else if (e & 32) hold += (unsigned long)(PUP(in)) << bits;
{ bits += 8;
Tracevv((stderr, "inflate: * end of block\n")); if (bits < op) {
UNGRAB hold += (unsigned long)(PUP(in)) << bits;
UPDATE bits += 8;
return Z_STREAM_END; }
} }
else dist += (unsigned)hold & ((1U << op) - 1);
{ hold >>= op;
z->msg = (char*)"invalid literal/length code"; bits -= op;
UNGRAB Tracevv((stderr, "inflate: distance %u\n", dist));
UPDATE op = (unsigned)(out - beg); /* max distance in output */
return Z_DATA_ERROR; if (dist > op) { /* see if copy from window */
} op = dist - op; /* distance back in window */
} while (1); if (op > whave) {
} while (m >= 258 && n >= 10); strm->msg = (char *)"invalid distance too far back";
state->mode = BAD;
/* not enough input or output--restore pointers and return */ break;
UNGRAB }
UPDATE from = window - OFF;
return Z_OK; if (write == 0) { /* very common case */
} from += wsize - op;
if (op < len) { /* some from window */
len -= op;
do {
PUP(out) = PUP(from);
} while (--op);
from = out - dist; /* rest from output */
}
}
else if (write < op) { /* wrap around window */
from += wsize + write - op;
op -= write;
if (op < len) { /* some from end of window */
len -= op;
do {
PUP(out) = PUP(from);
} while (--op);
from = window - OFF;
if (write < len) { /* some from start of window */
op = write;
len -= op;
do {
PUP(out) = PUP(from);
} while (--op);
from = out - dist; /* rest from output */
}
}
}
else { /* contiguous in window */
from += write - op;
if (op < len) { /* some from window */
len -= op;
do {
PUP(out) = PUP(from);
} while (--op);
from = out - dist; /* rest from output */
}
}
while (len > 2) {
PUP(out) = PUP(from);
PUP(out) = PUP(from);
PUP(out) = PUP(from);
len -= 3;
}
if (len) {
PUP(out) = PUP(from);
if (len > 1)
PUP(out) = PUP(from);
}
}
else {
from = out - dist; /* copy direct from output */
do { /* minimum length is three */
PUP(out) = PUP(from);
PUP(out) = PUP(from);
PUP(out) = PUP(from);
len -= 3;
} while (len > 2);
if (len) {
PUP(out) = PUP(from);
if (len > 1)
PUP(out) = PUP(from);
}
}
}
else if ((op & 64) == 0) { /* 2nd level distance code */
this = dcode[this.val + (hold & ((1U << op) - 1))];
goto dodist;
}
else {
strm->msg = (char *)"invalid distance code";
state->mode = BAD;
break;
}
}
else if ((op & 64) == 0) { /* 2nd level length code */
this = lcode[this.val + (hold & ((1U << op) - 1))];
goto dolen;
}
else if (op & 32) { /* end-of-block */
Tracevv((stderr, "inflate: end of block\n"));
state->mode = TYPE;
break;
}
else {
strm->msg = (char *)"invalid literal/length code";
state->mode = BAD;
break;
}
} while (in < last && out < end);
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
len = bits >> 3;
in -= len;
bits -= len << 3;
hold &= (1U << bits) - 1;
/* update state and return */
strm->next_in = in + OFF;
strm->next_out = out + OFF;
strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
strm->avail_out = (unsigned)(out < end ?
257 + (end - out) : 257 - (out - end));
state->hold = hold;
state->bits = bits;
return;
}
/*
inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
- Using bit fields for code structure
- Different op definition to avoid & for extra bits (do & for table bits)
- Three separate decoding do-loops for direct, window, and write == 0
- Special case for distance > 1 copies to do overlapped load and store copy
- Explicit branch predictions (based on measured branch probabilities)
- Deferring match copy and interspersed it with decoding subsequent codes
- Swapping literal/length else
- Swapping window/direct else
- Larger unrolled copy loops (three is about right)
- Moving len -= 3 statement into middle of loop
*/
#endif /* !ASMINF */

28
zlib/inffast.h Normal file → Executable file
View file

@ -1,17 +1,11 @@
/* inffast.h -- header to use inffast.c /* inffast.h -- header to use inffast.c
* Copyright (C) 1995-2002 Mark Adler * Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
/* WARNING: this file should *not* be used by applications. It is /* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h. subject to change. Applications should only use zlib.h.
*/ */
extern int inflate_fast OF(( void inflate_fast OF((z_streamp strm, unsigned start));
uInt,
uInt,
inflate_huft *,
inflate_huft *,
inflate_blocks_statef *,
z_streamp ));

245
zlib/inffixed.h Normal file → Executable file
View file

@ -1,151 +1,94 @@
/* inffixed.h -- table for decoding fixed codes /* inffixed.h -- table for decoding fixed codes
* Generated automatically by the maketree.c program * Generated automatically by makefixed().
*/ */
/* WARNING: this file should *not* be used by applications. It is /* WARNING: this file should *not* be used by applications. It
part of the implementation of the compression library and is is part of the implementation of the compression library and
subject to change. Applications should only use zlib.h. is subject to change. Applications should only use zlib.h.
*/ */
local uInt fixed_bl = 9; static const code lenfix[512] = {
local uInt fixed_bd = 5; {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
local inflate_huft fixed_tl[] = { {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
{{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
{{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
{{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
{{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224}, {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
{{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144}, {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
{{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208}, {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
{{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176}, {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
{{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240}, {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
{{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
{{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200}, {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
{{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168}, {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
{{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232}, {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
{{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152}, {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
{{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216}, {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
{{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184}, {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
{{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248}, {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
{{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
{{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196}, {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
{{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164}, {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
{{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228}, {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
{{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148}, {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
{{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212}, {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
{{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180}, {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
{{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244}, {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
{{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
{{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204}, {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
{{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172}, {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
{{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236}, {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
{{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156}, {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
{{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220}, {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
{{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188}, {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
{{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252}, {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
{{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
{{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194}, {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
{{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162}, {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
{{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226}, {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
{{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146}, {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
{{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210}, {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
{{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178}, {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
{{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242}, {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
{{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
{{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202}, {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
{{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170}, {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
{{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234}, {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
{{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154}, {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
{{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218}, {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
{{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186}, {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
{{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250}, {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
{{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
{{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198}, {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
{{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166}, {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
{{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230}, {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
{{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150}, {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
{{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214}, {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
{{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182}, {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
{{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246}, {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
{{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
{{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206}, {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
{{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174}, {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
{{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238}, {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
{{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158}, {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
{{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222}, {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
{{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190}, {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
{{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254}, {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
{{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
{{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193}, {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
{{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161}, {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
{{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225}, {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
{{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145}, {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
{{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209}, {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
{{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177}, {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
{{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241}, {0,9,255}
{{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, };
{{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201},
{{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169}, static const code distfix[32] = {
{{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233}, {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
{{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153}, {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
{{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217}, {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
{{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185}, {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
{{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249}, {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
{{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, {22,5,193},{64,5,0}
{{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197}, };
{{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165},
{{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229},
{{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149},
{{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213},
{{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181},
{{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245},
{{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
{{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205},
{{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173},
{{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237},
{{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157},
{{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221},
{{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189},
{{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253},
{{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
{{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195},
{{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163},
{{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227},
{{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147},
{{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211},
{{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179},
{{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243},
{{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
{{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203},
{{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171},
{{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235},
{{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155},
{{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219},
{{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187},
{{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251},
{{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
{{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199},
{{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167},
{{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231},
{{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151},
{{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215},
{{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183},
{{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247},
{{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
{{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207},
{{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175},
{{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239},
{{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159},
{{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223},
{{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191},
{{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255}
};
local inflate_huft fixed_td[] = {
{{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097},
{{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385},
{{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193},
{{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577},
{{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145},
{{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577},
{{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289},
{{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577}
};

1636
zlib/inflate.c Normal file → Executable file

File diff suppressed because it is too large Load diff

117
zlib/inflate.h Executable file
View file

@ -0,0 +1,117 @@
/* inflate.h -- internal inflate state definition
* Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
*/
/* define NO_GZIP when compiling if you want to disable gzip header and
trailer decoding by inflate(). NO_GZIP would be used to avoid linking in
the crc code when it is not needed. For shared libraries, gzip decoding
should be left enabled. */
#ifndef NO_GZIP
# define GUNZIP
#endif
/* Possible inflate modes between inflate() calls */
typedef enum {
HEAD, /* i: waiting for magic header */
#ifdef GUNZIP
FLAGS, /* i: waiting for method and flags (gzip) */
TIME, /* i: waiting for modification time (gzip) */
OS, /* i: waiting for extra flags and operating system (gzip) */
EXLEN, /* i: waiting for extra length (gzip) */
EXTRA, /* i: waiting for extra bytes (gzip) */
NAME, /* i: waiting for end of file name (gzip) */
COMMENT, /* i: waiting for end of comment (gzip) */
HCRC, /* i: waiting for header crc (gzip) */
#endif
DICTID, /* i: waiting for dictionary check value */
DICT, /* waiting for inflateSetDictionary() call */
TYPE, /* i: waiting for type bits, including last-flag bit */
TYPEDO, /* i: same, but skip check to exit inflate on new block */
STORED, /* i: waiting for stored size (length and complement) */
COPY, /* i/o: waiting for input or output to copy stored block */
TABLE, /* i: waiting for dynamic block table lengths */
LENLENS, /* i: waiting for code length code lengths */
CODELENS, /* i: waiting for length/lit and distance code lengths */
LEN, /* i: waiting for length/lit code */
LENEXT, /* i: waiting for length extra bits */
DIST, /* i: waiting for distance code */
DISTEXT, /* i: waiting for distance extra bits */
MATCH, /* o: waiting for output space to copy string */
LIT, /* o: waiting for output space to write literal */
CHECK, /* i: waiting for 32-bit check value */
#ifdef GUNZIP
LENGTH, /* i: waiting for 32-bit length (gzip) */
#endif
DONE, /* finished check, done -- remain here until reset */
BAD, /* got a data error -- remain here until reset */
MEM, /* got an inflate() memory error -- remain here until reset */
SYNC /* looking for synchronization bytes to restart inflate() */
} inflate_mode;
/*
State transitions between above modes -
(most modes can go to the BAD or MEM mode -- not shown for clarity)
Process header:
HEAD -> (gzip) or (zlib)
(gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME
NAME -> COMMENT -> HCRC -> TYPE
(zlib) -> DICTID or TYPE
DICTID -> DICT -> TYPE
Read deflate blocks:
TYPE -> STORED or TABLE or LEN or CHECK
STORED -> COPY -> TYPE
TABLE -> LENLENS -> CODELENS -> LEN
Read deflate codes:
LEN -> LENEXT or LIT or TYPE
LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
LIT -> LEN
Process trailer:
CHECK -> LENGTH -> DONE
*/
/* state maintained between inflate() calls. Approximately 7K bytes. */
struct inflate_state {
inflate_mode mode; /* current inflate mode */
int last; /* true if processing last block */
int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
int havedict; /* true if dictionary provided */
int flags; /* gzip header method and flags (0 if zlib) */
unsigned long check; /* protected copy of check value */
unsigned long total; /* protected copy of output count */
/* sliding window */
unsigned wbits; /* log base 2 of requested window size */
unsigned wsize; /* window size or zero if not using window */
unsigned whave; /* valid bytes in the window */
unsigned write; /* window write index */
unsigned char FAR *window; /* allocated sliding window, if needed */
/* bit accumulator */
unsigned long hold; /* input bit accumulator */
unsigned bits; /* number of bits in "in" */
/* for string and stored block copying */
unsigned length; /* literal or length of data to copy */
unsigned offset; /* distance back to copy string from */
/* for table and code decoding */
unsigned extra; /* extra bits needed */
/* fixed and dynamic code tables */
code const FAR *lencode; /* starting table for length/literal codes */
code const FAR *distcode; /* starting table for distance codes */
unsigned lenbits; /* index bits for lencode */
unsigned distbits; /* index bits for distcode */
/* dynamic table building */
unsigned ncode; /* number of code length code lengths */
unsigned nlen; /* number of length code lengths */
unsigned ndist; /* number of distance code lengths */
unsigned have; /* number of code lengths in lens[] */
code FAR *next; /* next available space in codes[] */
unsigned short lens[320]; /* temporary storage for code lengths */
unsigned short work[288]; /* work area for code table building */
code codes[ENOUGH]; /* space for code tables */
};

775
zlib/inftrees.c Normal file → Executable file
View file

@ -1,454 +1,321 @@
/* inftrees.c -- generate Huffman trees for efficient decoding /* inftrees.c -- generate Huffman trees for efficient decoding
* Copyright (C) 1995-2002 Mark Adler * Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
#include "zutil.h" #include "zutil.h"
#include "inftrees.h" #include "inftrees.h"
#if !defined(BUILDFIXED) && !defined(STDC) #define MAXBITS 15
# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */
#endif const char inflate_copyright[] =
" inflate 1.2.1 Copyright 1995-2003 Mark Adler ";
const char inflate_copyright[] = /*
" inflate 1.1.4 Copyright 1995-2002 Mark Adler "; If you use the zlib library in a product, an acknowledgment is welcome
/* in the documentation of your product. If for some reason you cannot
If you use the zlib library in a product, an acknowledgment is welcome include such an acknowledgment, I would appreciate that you keep this
in the documentation of your product. If for some reason you cannot copyright string in the executable of your product.
include such an acknowledgment, I would appreciate that you keep this */
copyright string in the executable of your product.
*/ /*
struct internal_state {int dummy;}; /* for buggy compilers */ Build a set of tables to decode the provided canonical Huffman code.
The code lengths are lens[0..codes-1]. The result starts at *table,
/* simplify the use of the inflate_huft type with some defines */ whose indices are 0..2^bits-1. work is a writable array of at least
#define exop word.what.Exop lens shorts, which is used as a work area. type is the type of code
#define bits word.what.Bits to be generated, CODES, LENS, or DISTS. On return, zero is success,
-1 is an invalid code, and +1 means that ENOUGH isn't enough. table
on return points to the next available entry's address. bits is the
local int huft_build OF(( requested root table index bits, and on return it is the actual root
uIntf *, /* code lengths in bits */ table index bits. It will differ if the request is greater than the
uInt, /* number of codes */ longest code or if it is less than the shortest code.
uInt, /* number of "simple" codes */ */
const uIntf *, /* list of base values for non-simple codes */ int inflate_table(type, lens, codes, table, bits, work)
const uIntf *, /* list of extra bits for non-simple codes */ codetype type;
inflate_huft * FAR*,/* result: starting table */ unsigned short FAR *lens;
uIntf *, /* maximum lookup bits (returns actual) */ unsigned codes;
inflate_huft *, /* space for trees */ code FAR * FAR *table;
uInt *, /* hufts used in space */ unsigned FAR *bits;
uIntf * )); /* space for values */ unsigned short FAR *work;
{
/* Tables for deflate from PKZIP's appnote.txt. */ unsigned len; /* a code's length in bits */
local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ unsigned sym; /* index of code symbols */
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, unsigned min, max; /* minimum and maximum code lengths */
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; unsigned root; /* number of index bits for root table */
/* see note #13 above about 258 */ unsigned curr; /* number of index bits for current table */
local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ unsigned drop; /* code bits to drop for sub-table */
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, int left; /* number of prefix codes available */
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ unsigned used; /* code entries in table used */
local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ unsigned huff; /* Huffman code */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, unsigned incr; /* for incrementing code, index */
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, unsigned fill; /* index for replicating entries */
8193, 12289, 16385, 24577}; unsigned low; /* low bits for current root entry */
local const uInt cpdext[30] = { /* Extra bits for distance codes */ unsigned mask; /* mask for low root bits */
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, code this; /* table entry for duplication */
7, 7, 8, 8, 9, 9, 10, 10, 11, 11, code FAR *next; /* next available space in table */
12, 12, 13, 13}; const unsigned short FAR *base; /* base value table to use */
const unsigned short FAR *extra; /* extra bits table to use */
/* int end; /* use base and extra for symbol > end */
Huffman code decoding is performed using a multi-level table lookup. unsigned short count[MAXBITS+1]; /* number of codes of each length */
The fastest way to decode is to simply build a lookup table whose unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
size is determined by the longest code. However, the time it takes static const unsigned short lbase[31] = { /* Length codes 257..285 base */
to build this table can also be a factor if the data being decoded 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
is not very long. The most common codes are necessarily the 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
shortest codes, so those codes dominate the decoding time, and hence static const unsigned short lext[31] = { /* Length codes 257..285 extra */
the speed. The idea is you can have a shorter table that decodes the 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
shorter, more probable codes, and then point to subsidiary tables for 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 76, 66};
the longer codes. The time it costs to decode the longer codes is static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
then traded against the time it takes to make longer tables. 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
This results of this trade are in the variables lbits and dbits 8193, 12289, 16385, 24577, 0, 0};
below. lbits is the number of bits the first level table for literal/ static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
length codes can decode in one step, and dbits is the same thing for 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
the distance codes. Subsequent tables are also less than or equal to 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
those sizes. These values may be adjusted either when all of the 28, 28, 29, 29, 64, 64};
codes are shorter than that, in which case the longest code length in
bits is used, or when the shortest code is *longer* than the requested /*
table size, in which case the length of the shortest code in bits is Process a set of code lengths to create a canonical Huffman code. The
used. code lengths are lens[0..codes-1]. Each length corresponds to the
symbols 0..codes-1. The Huffman code is generated by first sorting the
There are two different values for the two tables, since they code a symbols by length from short to long, and retaining the symbol order
different number of possibilities each. The literal/length table for codes with equal lengths. Then the code starts with all zero bits
codes 286 possible values, or in a flat code, a little over eight for the first code of the shortest length, and the codes are integer
bits. The distance table codes 30 possible values, or a little less increments for the same length, and zeros are appended as the length
than five bits, flat. The optimum values for speed end up being increases. For the deflate format, these bits are stored backwards
about one bit more than those, so lbits is 8+1 and dbits is 5+1. from their more natural integer increment ordering, and so when the
The optimum values may differ though from machine to machine, and decoding tables are built in the large loop below, the integer codes
possibly even between compilers. Your mileage may vary. are incremented backwards.
*/
This routine assumes, but does not check, that all of the entries in
lens[] are in the range 0..MAXBITS. The caller must assure this.
/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ 1..MAXBITS is interpreted as that code length. zero means that that
#define BMAX 15 /* maximum bit length of any code */ symbol does not occur in this code.
local int huft_build(b, n, s, d, e, t, m, hp, hn, v) The codes are sorted by computing a count of codes for each length,
uIntf *b; /* code lengths in bits (all assumed <= BMAX) */ creating from that a table of starting indices for each length in the
uInt n; /* number of codes (assumed <= 288) */ sorted table, and then entering the symbols in order in the sorted
uInt s; /* number of simple-valued codes (0..s-1) */ table. The sorted table is work[], with that space being provided by
const uIntf *d; /* list of base values for non-simple codes */ the caller.
const uIntf *e; /* list of extra bits for non-simple codes */
inflate_huft * FAR *t; /* result: starting table */ The length counts are used for other purposes as well, i.e. finding
uIntf *m; /* maximum lookup bits, returns actual */ the minimum and maximum length codes, determining if there are any
inflate_huft *hp; /* space for trees */ codes at all, checking for a valid set of lengths, and looking ahead
uInt *hn; /* hufts used in space */ at length counts to determine sub-table sizes when building the
uIntf *v; /* working area: values in order of bit length */ decoding tables.
/* Given a list of code lengths and a maximum table size, make a set of */
tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
if the given code set is incomplete (the tables are still built in this /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
case), or Z_DATA_ERROR if the input is invalid. */ for (len = 0; len <= MAXBITS; len++)
{ count[len] = 0;
for (sym = 0; sym < codes; sym++)
uInt a; /* counter for codes of length k */ count[lens[sym]]++;
uInt c[BMAX+1]; /* bit length count table */
uInt f; /* i repeats in table every f entries */ /* bound code lengths, force root to be within code lengths */
int g; /* maximum code length */ root = *bits;
int h; /* table level */ for (max = MAXBITS; max >= 1; max--)
register uInt i; /* counter, current code */ if (count[max] != 0) break;
register uInt j; /* counter */ if (root > max) root = max;
register int k; /* number of bits in current code */ if (max == 0) return -1; /* no codes! */
int l; /* bits per table (returned in m) */ for (min = 1; min <= MAXBITS; min++)
uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ if (count[min] != 0) break;
register uIntf *p; /* pointer into c[], b[], or v[] */ if (root < min) root = min;
inflate_huft *q; /* points to current table */
struct inflate_huft_s r; /* table entry for structure assignment */ /* check for an over-subscribed or incomplete set of lengths */
inflate_huft *u[BMAX]; /* table stack */ left = 1;
register int w; /* bits before this table == (l * h) */ for (len = 1; len <= MAXBITS; len++) {
uInt x[BMAX+1]; /* bit offsets, then code stack */ left <<= 1;
uIntf *xp; /* pointer into x */ left -= count[len];
int y; /* number of dummy codes added */ if (left < 0) return -1; /* over-subscribed */
uInt z; /* number of entries in current table */ }
if (left > 0 && (type == CODES || (codes - count[0] != 1)))
return -1; /* incomplete set */
/* Generate counts for each bit length */
p = c; /* generate offsets into symbol table for each length for sorting */
#define C0 *p++ = 0; offs[1] = 0;
#define C2 C0 C0 C0 C0 for (len = 1; len < MAXBITS; len++)
#define C4 C2 C2 C2 C2 offs[len + 1] = offs[len] + count[len];
C4 /* clear c[]--assume BMAX+1 is 16 */
p = b; i = n; /* sort symbols by length, by symbol order within each length */
do { for (sym = 0; sym < codes; sym++)
c[*p++]++; /* assume all entries <= BMAX */ if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
} while (--i);
if (c[0] == n) /* null input--all zero length codes */ /*
{ Create and fill in decoding tables. In this loop, the table being
*t = (inflate_huft *)Z_NULL; filled is at next and has curr index bits. The code being used is huff
*m = 0; with length len. That code is converted to an index by dropping drop
return Z_OK; bits off of the bottom. For codes where len is less than drop + curr,
} those top drop + curr - len bits are incremented through all values to
fill the table with replicated entries.
/* Find minimum and maximum length, bound *m by those */ root is the number of index bits for the root table. When len exceeds
l = *m; root, sub-tables are created pointed to by the root entry with an index
for (j = 1; j <= BMAX; j++) of the low root bits of huff. This is saved in low to check for when a
if (c[j]) new sub-table should be started. drop is zero when the root table is
break; being filled, and drop is root when sub-tables are being filled.
k = j; /* minimum code length */
if ((uInt)l < j) When a new sub-table is needed, it is necessary to look ahead in the
l = j; code lengths to determine what size sub-table is needed. The length
for (i = BMAX; i; i--) counts are used for this, and so count[] is decremented as codes are
if (c[i]) entered in the tables.
break;
g = i; /* maximum code length */ used keeps track of how many table entries have been allocated from the
if ((uInt)l > i) provided *table space. It is checked when a LENS table is being made
l = i; against the space in *table, ENOUGH, minus the maximum space needed by
*m = l; the worst case distance code, MAXD. This should never happen, but the
sufficiency of ENOUGH has not been proven exhaustively, hence the check.
This assumes that when type == LENS, bits == 9.
/* Adjust last length count to fill out codes, if needed */
for (y = 1 << j; j < i; j++, y <<= 1) sym increments through all symbols, and the loop terminates when
if ((y -= c[j]) < 0) all codes of length max, i.e. all codes, have been processed. This
return Z_DATA_ERROR; routine permits incomplete codes, so another loop after this one fills
if ((y -= c[i]) < 0) in the rest of the decoding tables with invalid code markers.
return Z_DATA_ERROR; */
c[i] += y;
/* set up for code type */
switch (type) {
/* Generate starting offsets into the value table for each length */ case CODES:
x[1] = j = 0; base = extra = work; /* dummy value--not used */
p = c + 1; xp = x + 2; end = 19;
while (--i) { /* note that i == g from above */ break;
*xp++ = (j += *p++); case LENS:
} base = lbase;
base -= 257;
extra = lext;
/* Make a table of values in order of bit lengths */ extra -= 257;
p = b; i = 0; end = 256;
do { break;
if ((j = *p++) != 0) default: /* DISTS */
v[x[j]++] = i; base = dbase;
} while (++i < n); extra = dext;
n = x[g]; /* set n to length of v */ end = -1;
}
/* Generate the Huffman codes and for each, make the table entries */ /* initialize state for loop */
x[0] = i = 0; /* first Huffman code is zero */ huff = 0; /* starting code */
p = v; /* grab values in bit order */ sym = 0; /* starting code symbol */
h = -1; /* no tables yet--level -1 */ len = min; /* starting code length */
w = -l; /* bits decoded == (l * h) */ next = *table; /* current table to fill in */
u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ curr = root; /* current table index bits */
q = (inflate_huft *)Z_NULL; /* ditto */ drop = 0; /* current bits to drop from code for index */
z = 0; /* ditto */ low = (unsigned)(-1); /* trigger new sub-table when len > root */
used = 1U << root; /* use root table entries */
/* go through the bit lengths (k already is bits in shortest code) */ mask = used - 1; /* mask for comparing low */
for (; k <= g; k++)
{ /* check available table space */
a = c[k]; if (type == LENS && used >= ENOUGH - MAXD)
while (a--) return 1;
{
/* here i is the Huffman code of length k bits for value *p */ /* process all codes and make table entries */
/* make tables up to required level */ for (;;) {
while (k > w + l) /* create table entry */
{ this.bits = (unsigned char)(len - drop);
h++; if ((int)(work[sym]) < end) {
w += l; /* previous table always l bits */ this.op = (unsigned char)0;
this.val = work[sym];
/* compute minimum size table less than or equal to l bits */ }
z = g - w; else if ((int)(work[sym]) > end) {
z = z > (uInt)l ? l : z; /* table size upper limit */ this.op = (unsigned char)(extra[work[sym]]);
if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ this.val = base[work[sym]];
{ /* too few codes for k-w bit table */ }
f -= a + 1; /* deduct codes from patterns left */ else {
xp = c + k; this.op = (unsigned char)(32 + 64); /* end of block */
if (j < z) this.val = 0;
while (++j < z) /* try smaller tables up to z bits */ }
{
if ((f <<= 1) <= *++xp) /* replicate for those indices with low len bits equal to huff */
break; /* enough codes to use up j bits */ incr = 1U << (len - drop);
f -= *xp; /* else deduct codes from patterns */ fill = 1U << curr;
} do {
} fill -= incr;
z = 1 << j; /* table entries for j-bit table */ next[(huff >> drop) + fill] = this;
} while (fill != 0);
/* allocate new table */
if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ /* backwards increment the len-bit code huff */
return Z_DATA_ERROR; /* overflow of MANY */ incr = 1U << (len - 1);
u[h] = q = hp + *hn; while (huff & incr)
*hn += z; incr >>= 1;
if (incr != 0) {
/* connect to last table, if there is one */ huff &= incr - 1;
if (h) huff += incr;
{ }
x[h] = i; /* save pattern for backing up */ else
r.bits = (Byte)l; /* bits to dump before this table */ huff = 0;
r.exop = (Byte)j; /* bits in this table */
j = i >> (w - l); /* go to next symbol, update count, len */
r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ sym++;
u[h-1][j] = r; /* connect to last table */ if (--(count[len]) == 0) {
} if (len == max) break;
else len = lens[work[sym]];
*t = q; /* first table is returned result */ }
}
/* create new sub-table if needed */
/* set up table entry in r */ if (len > root && (huff & mask) != low) {
r.bits = (Byte)(k - w); /* if first time, transition to sub-tables */
if (p >= v + n) if (drop == 0)
r.exop = 128 + 64; /* out of values--invalid code */ drop = root;
else if (*p < s)
{ /* increment past last table */
r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ next += 1U << curr;
r.base = *p++; /* simple code is just the value */
} /* determine length of next table */
else curr = len - drop;
{ left = (int)(1 << curr);
r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ while (curr + drop < max) {
r.base = d[*p++ - s]; left -= count[curr + drop];
} if (left <= 0) break;
curr++;
/* fill code-like entries with r */ left <<= 1;
f = 1 << (k - w); }
for (j = i >> w; j < z; j += f)
q[j] = r; /* check for enough space */
used += 1U << curr;
/* backwards increment the k-bit code i */ if (type == LENS && used >= ENOUGH - MAXD)
for (j = 1 << (k - 1); i & j; j >>= 1) return 1;
i ^= j;
i ^= j; /* point entry in root table to sub-table */
low = huff & mask;
/* backup over finished tables */ (*table)[low].op = (unsigned char)curr;
mask = (1 << w) - 1; /* needed on HP, cc -O bug */ (*table)[low].bits = (unsigned char)root;
while ((i & mask) != x[h]) (*table)[low].val = (unsigned short)(next - *table);
{ }
h--; /* don't need to update q */ }
w -= l;
mask = (1 << w) - 1; /*
} Fill in rest of table for incomplete codes. This loop is similar to the
} loop above in incrementing huff for table indices. It is assumed that
} len is equal to curr + drop, so there is no loop needed to increment
through high index bits. When the current sub-table is filled, the loop
drops back to the root table to fill in any remaining entries there.
/* Return Z_BUF_ERROR if we were given an incomplete table */ */
return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; this.op = (unsigned char)64; /* invalid code marker */
} this.bits = (unsigned char)(len - drop);
this.val = (unsigned short)0;
while (huff != 0) {
int inflate_trees_bits(c, bb, tb, hp, z) /* when done with sub-table, drop back to root table */
uIntf *c; /* 19 code lengths */ if (drop != 0 && (huff & mask) != low) {
uIntf *bb; /* bits tree desired/actual depth */ drop = 0;
inflate_huft * FAR *tb; /* bits tree result */ len = root;
inflate_huft *hp; /* space for trees */ next = *table;
z_streamp z; /* for messages */ curr = root;
{ this.bits = (unsigned char)len;
int r; }
uInt hn = 0; /* hufts used in space */
uIntf *v; /* work area for huft_build */ /* put invalid code marker in table */
next[huff >> drop] = this;
if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL)
return Z_MEM_ERROR; /* backwards increment the len-bit code huff */
r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, incr = 1U << (len - 1);
tb, bb, hp, &hn, v); while (huff & incr)
if (r == Z_DATA_ERROR) incr >>= 1;
z->msg = (char*)"oversubscribed dynamic bit lengths tree"; if (incr != 0) {
else if (r == Z_BUF_ERROR || *bb == 0) huff &= incr - 1;
{ huff += incr;
z->msg = (char*)"incomplete dynamic bit lengths tree"; }
r = Z_DATA_ERROR; else
} huff = 0;
ZFREE(z, v); }
return r;
} /* set return parameters */
*table += used;
*bits = root;
int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, hp, z) return 0;
uInt nl; /* number of literal/length codes */ }
uInt nd; /* number of distance codes */
uIntf *c; /* that many (total) code lengths */
uIntf *bl; /* literal desired/actual bit depth */
uIntf *bd; /* distance desired/actual bit depth */
inflate_huft * FAR *tl; /* literal/length tree result */
inflate_huft * FAR *td; /* distance tree result */
inflate_huft *hp; /* space for trees */
z_streamp z; /* for messages */
{
int r;
uInt hn = 0; /* hufts used in space */
uIntf *v; /* work area for huft_build */
/* allocate work area */
if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
return Z_MEM_ERROR;
/* build literal/length tree */
r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v);
if (r != Z_OK || *bl == 0)
{
if (r == Z_DATA_ERROR)
z->msg = (char*)"oversubscribed literal/length tree";
else if (r != Z_MEM_ERROR)
{
z->msg = (char*)"incomplete literal/length tree";
r = Z_DATA_ERROR;
}
ZFREE(z, v);
return r;
}
/* build distance tree */
r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v);
if (r != Z_OK || (*bd == 0 && nl > 257))
{
if (r == Z_DATA_ERROR)
z->msg = (char*)"oversubscribed distance tree";
else if (r == Z_BUF_ERROR) {
#ifdef PKZIP_BUG_WORKAROUND
r = Z_OK;
}
#else
z->msg = (char*)"incomplete distance tree";
r = Z_DATA_ERROR;
}
else if (r != Z_MEM_ERROR)
{
z->msg = (char*)"empty distance tree with lengths";
r = Z_DATA_ERROR;
}
ZFREE(z, v);
return r;
#endif
}
/* done */
ZFREE(z, v);
return Z_OK;
}
/* build fixed tables only once--keep them here */
#ifdef BUILDFIXED
local int fixed_built = 0;
#define FIXEDH 544 /* number of hufts used by fixed tables */
local inflate_huft fixed_mem[FIXEDH];
local uInt fixed_bl;
local uInt fixed_bd;
local inflate_huft *fixed_tl;
local inflate_huft *fixed_td;
#else
#include "inffixed.h"
#endif
int inflate_trees_fixed(bl, bd, tl, td, z)
uIntf *bl; /* literal desired/actual bit depth */
uIntf *bd; /* distance desired/actual bit depth */
inflate_huft * FAR *tl; /* literal/length tree result */
inflate_huft * FAR *td; /* distance tree result */
z_streamp z; /* for memory allocation */
{
#ifdef BUILDFIXED
/* build fixed tables if not already */
if (!fixed_built)
{
int k; /* temporary variable */
uInt f = 0; /* number of hufts used in fixed_mem */
uIntf *c; /* length list for huft_build */
uIntf *v; /* work area for huft_build */
/* allocate memory */
if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
return Z_MEM_ERROR;
if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
{
ZFREE(z, c);
return Z_MEM_ERROR;
}
/* literal table */
for (k = 0; k < 144; k++)
c[k] = 8;
for (; k < 256; k++)
c[k] = 9;
for (; k < 280; k++)
c[k] = 7;
for (; k < 288; k++)
c[k] = 8;
fixed_bl = 9;
huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl,
fixed_mem, &f, v);
/* distance table */
for (k = 0; k < 30; k++)
c[k] = 5;
fixed_bd = 5;
huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd,
fixed_mem, &f, v);
/* done */
ZFREE(z, v);
ZFREE(z, c);
fixed_built = 1;
}
#endif
*bl = fixed_bl;
*bd = fixed_bd;
*tl = fixed_tl;
*td = fixed_td;
return Z_OK;
}

113
zlib/inftrees.h Normal file → Executable file
View file

@ -1,58 +1,55 @@
/* inftrees.h -- header to use inftrees.c /* inftrees.h -- header to use inftrees.c
* Copyright (C) 1995-2002 Mark Adler * Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
/* WARNING: this file should *not* be used by applications. It is /* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h. subject to change. Applications should only use zlib.h.
*/ */
/* Huffman code lookup table entry--this entry is four bytes for machines /* Structure for decoding tables. Each entry provides either the
that have 16-bit pointers (e.g. PC's in the small or medium model). */ information needed to do the operation requested by the code that
indexed that table entry, or it provides a pointer to another
typedef struct inflate_huft_s FAR inflate_huft; table that indexes more bits of the code. op indicates whether
the entry is a pointer to another table, a literal, a length or
struct inflate_huft_s { distance, an end-of-block, or an invalid code. For a table
union { pointer, the low four bits of op is the number of index bits of
struct { that table. For a length or distance, the low four bits of op
Byte Exop; /* number of extra bits or operation */ is the number of extra bits to get after the code. bits is
Byte Bits; /* number of bits in this code or subcode */ the number of bits in this code or part of the code to drop off
} what; of the bit buffer. val is the actual byte to output in the case
uInt pad; /* pad structure to a power of 2 (4 bytes for */ of a literal, the base length or distance, or the offset from
} word; /* 16-bit, 8 bytes for 32-bit int's) */ the current table to the next table. Each entry is four bytes. */
uInt base; /* literal, length base, distance base, typedef struct {
or table offset */ unsigned char op; /* operation, extra bits, table bits */
}; unsigned char bits; /* bits in this part of the code */
unsigned short val; /* offset in table or code value */
/* Maximum size of dynamic tree. The maximum found in a long but non- } code;
exhaustive search was 1004 huft structures (850 for length/literals
and 154 for distances, the latter actually the result of an /* op values as set by inflate_table():
exhaustive search). The actual maximum is not known, but the 00000000 - literal
value below is more than safe. */ 0000tttt - table link, tttt != 0 is the number of table index bits
#define MANY 1440 0001eeee - length or distance, eeee is the number of extra bits
01100000 - end of block
extern int inflate_trees_bits OF(( 01000000 - invalid code
uIntf *, /* 19 code lengths */ */
uIntf *, /* bits tree desired/actual depth */
inflate_huft * FAR *, /* bits tree result */ /* Maximum size of dynamic tree. The maximum found in a long but non-
inflate_huft *, /* space for trees */ exhaustive search was 1004 code structures (850 for length/literals
z_streamp)); /* for messages */ and 154 for distances, the latter actually the result of an
exhaustive search). The true maximum is not known, but the value
extern int inflate_trees_dynamic OF(( below is more than safe. */
uInt, /* number of literal/length codes */ #define ENOUGH 1440
uInt, /* number of distance codes */ #define MAXD 154
uIntf *, /* that many (total) code lengths */
uIntf *, /* literal desired/actual bit depth */ /* Type of code to build for inftable() */
uIntf *, /* distance desired/actual bit depth */ typedef enum {
inflate_huft * FAR *, /* literal/length tree result */ CODES,
inflate_huft * FAR *, /* distance tree result */ LENS,
inflate_huft *, /* space for trees */ DISTS
z_streamp)); /* for messages */ } codetype;
extern int inflate_trees_fixed OF(( extern int inflate_table OF((codetype type, unsigned short FAR *lens,
uIntf *, /* literal desired/actual bit depth */ unsigned codes, code FAR * FAR *table,
uIntf *, /* distance desired/actual bit depth */ unsigned FAR *bits, unsigned short FAR *work));
inflate_huft * FAR *, /* literal/length tree result */
inflate_huft * FAR *, /* distance tree result */
z_streamp)); /* for memory allocation */

View file

@ -1,87 +0,0 @@
/* inflate_util.c -- data and routines common to blocks and codes
* Copyright (C) 1995-2002 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zutil.h"
#include "infblock.h"
#include "inftrees.h"
#include "infcodes.h"
#include "infutil.h"
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
/* And'ing with mask[n] masks the lower n bits */
uInt inflate_mask[17] = {
0x0000,
0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
};
/* copy as much as possible from the sliding window to the output area */
int inflate_flush(s, z, r)
inflate_blocks_statef *s;
z_streamp z;
int r;
{
uInt n;
Bytef *p;
Bytef *q;
/* local copies of source and destination pointers */
p = z->next_out;
q = s->read;
/* compute number of bytes to copy as far as end of window */
n = (uInt)((q <= s->write ? s->write : s->end) - q);
if (n > z->avail_out) n = z->avail_out;
if (n && r == Z_BUF_ERROR) r = Z_OK;
/* update counters */
z->avail_out -= n;
z->total_out += n;
/* update check information */
if (s->checkfn != Z_NULL)
z->adler = s->check = (*s->checkfn)(s->check, q, n);
/* copy as far as end of window */
zmemcpy(p, q, n);
p += n;
q += n;
/* see if more to copy at beginning of window */
if (q == s->end)
{
/* wrap pointers */
q = s->window;
if (s->write == s->end)
s->write = s->window;
/* compute bytes to copy */
n = (uInt)(s->write - q);
if (n > z->avail_out) n = z->avail_out;
if (n && r == Z_BUF_ERROR) r = Z_OK;
/* update counters */
z->avail_out -= n;
z->total_out += n;
/* update check information */
if (s->checkfn != Z_NULL)
z->adler = s->check = (*s->checkfn)(s->check, q, n);
/* copy */
zmemcpy(p, q, n);
p += n;
q += n;
}
/* update pointers */
z->next_out = p;
s->read = q;
/* done */
return r;
}

View file

@ -1,98 +0,0 @@
/* infutil.h -- types and macros common to blocks and codes
* Copyright (C) 1995-2002 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
*/
#ifndef _INFUTIL_H
#define _INFUTIL_H
typedef enum {
TYPE, /* get type bits (3, including end bit) */
LENS, /* get lengths for stored */
STORED, /* processing stored block */
TABLE, /* get table lengths */
BTREE, /* get bit lengths tree for a dynamic block */
DTREE, /* get length, distance trees for a dynamic block */
CODES, /* processing fixed or dynamic block */
DRY, /* output remaining window bytes */
DONE, /* finished last block, done */
BAD} /* got a data error--stuck here */
inflate_block_mode;
/* inflate blocks semi-private state */
struct inflate_blocks_state {
/* mode */
inflate_block_mode mode; /* current inflate_block mode */
/* mode dependent information */
union {
uInt left; /* if STORED, bytes left to copy */
struct {
uInt table; /* table lengths (14 bits) */
uInt index; /* index into blens (or border) */
uIntf *blens; /* bit lengths of codes */
uInt bb; /* bit length tree depth */
inflate_huft *tb; /* bit length decoding tree */
} trees; /* if DTREE, decoding info for trees */
struct {
inflate_codes_statef
*codes;
} decode; /* if CODES, current state */
} sub; /* submode */
uInt last; /* true if this block is the last block */
/* mode independent information */
uInt bitk; /* bits in bit buffer */
uLong bitb; /* bit buffer */
inflate_huft *hufts; /* single malloc for tree space */
Bytef *window; /* sliding window */
Bytef *end; /* one byte after sliding window */
Bytef *read; /* window read pointer */
Bytef *write; /* window write pointer */
check_func checkfn; /* check function */
uLong check; /* check on output */
};
/* defines for inflate input/output */
/* update pointers and return */
#define UPDBITS {s->bitb=b;s->bitk=k;}
#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
#define UPDOUT {s->write=q;}
#define UPDATE {UPDBITS UPDIN UPDOUT}
#define LEAVE {UPDATE return inflate_flush(s,z,r);}
/* get bytes and bits */
#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
#define NEXTBYTE (n--,*p++)
#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
#define DUMPBITS(j) {b>>=(j);k-=(j);}
/* output bytes */
#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q)
#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}
#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}
#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
/* load local pointers */
#define LOAD {LOADIN LOADOUT}
/* masks for lower bits (size given to avoid silly warnings with Visual C++) */
extern uInt inflate_mask[17];
/* copy as much as possible from the sliding window to the output area */
extern int inflate_flush OF((
inflate_blocks_statef *,
z_streamp ,
int));
struct internal_state {int dummy;}; /* for buggy compilers */
#endif

603
zlib/zconf.h Normal file → Executable file
View file

@ -1,280 +1,323 @@
/* zconf.h -- configuration of the zlib compression library /* zconf.h -- configuration of the zlib compression library
* Copyright (C) 1995-2002 Jean-loup Gailly. * Copyright (C) 1995-2003 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
/* @(#) $Id$ */ /* @(#) $Id$ */
#ifndef _ZCONF_H #ifndef ZCONF_H
#define _ZCONF_H #define ZCONF_H
/* /*
* If you *really* need a unique prefix for all types and library functions, * If you *really* need a unique prefix for all types and library functions,
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
*/ */
#ifdef Z_PREFIX #ifdef Z_PREFIX
# define deflateInit_ z_deflateInit_ # define deflateInit_ z_deflateInit_
# define deflate z_deflate # define deflate z_deflate
# define deflateEnd z_deflateEnd # define deflateEnd z_deflateEnd
# define inflateInit_ z_inflateInit_ # define inflateInit_ z_inflateInit_
# define inflate z_inflate # define inflate z_inflate
# define inflateEnd z_inflateEnd # define inflateEnd z_inflateEnd
# define deflateInit2_ z_deflateInit2_ # define deflateInit2_ z_deflateInit2_
# define deflateSetDictionary z_deflateSetDictionary # define deflateSetDictionary z_deflateSetDictionary
# define deflateCopy z_deflateCopy # define deflateCopy z_deflateCopy
# define deflateReset z_deflateReset # define deflateReset z_deflateReset
# define deflateParams z_deflateParams # define deflatePrime z_deflatePrime
# define inflateInit2_ z_inflateInit2_ # define deflateParams z_deflateParams
# define inflateSetDictionary z_inflateSetDictionary # define deflateBound z_deflateBound
# define inflateSync z_inflateSync # define inflateInit2_ z_inflateInit2_
# define inflateSyncPoint z_inflateSyncPoint # define inflateSetDictionary z_inflateSetDictionary
# define inflateReset z_inflateReset # define inflateSync z_inflateSync
# define compress z_compress # define inflateSyncPoint z_inflateSyncPoint
# define compress2 z_compress2 # define inflateCopy z_inflateCopy
# define uncompress z_uncompress # define inflateReset z_inflateReset
# define adler32 z_adler32 # define compress z_compress
# define crc32 z_crc32 # define compress2 z_compress2
# define get_crc_table z_get_crc_table # define compressBound z_compressBound
# define uncompress z_uncompress
# define Byte z_Byte # define adler32 z_adler32
# define uInt z_uInt # define crc32 z_crc32
# define uLong z_uLong # define get_crc_table z_get_crc_table
# define Bytef z_Bytef
# define charf z_charf # define Byte z_Byte
# define intf z_intf # define uInt z_uInt
# define uIntf z_uIntf # define uLong z_uLong
# define uLongf z_uLongf # define Bytef z_Bytef
# define voidpf z_voidpf # define charf z_charf
# define voidp z_voidp # define intf z_intf
#endif # define uIntf z_uIntf
# define uLongf z_uLongf
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define voidpf z_voidpf
# define WIN32 # define voidp z_voidp
#endif #endif
#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
# ifndef __32BIT__ #if defined(__MSDOS__) && !defined(MSDOS)
# define __32BIT__ # define MSDOS
# endif #endif
#endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
#if defined(__MSDOS__) && !defined(MSDOS) # define OS2
# define MSDOS #endif
#endif #if defined(_WINDOWS) && !defined(WINDOWS)
# define WINDOWS
/* #endif
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
* than 64k bytes at a time (needed on systems with 16-bit int). # define WIN32
*/ #endif
#if defined(MSDOS) && !defined(__32BIT__) #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
# define MAXSEG_64K # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
#endif # ifndef SYS16BIT
#ifdef MSDOS # define SYS16BIT
# define UNALIGNED_OK # endif
#endif # endif
#endif
#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC)
# define STDC /*
#endif * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) * than 64k bytes at a time (needed on systems with 16-bit int).
# ifndef STDC */
# define STDC #ifdef SYS16BIT
# endif # define MAXSEG_64K
#endif #endif
#ifdef MSDOS
#ifndef STDC # define UNALIGNED_OK
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ #endif
# define const
# endif #ifdef __STDC_VERSION__
#endif # ifndef STDC
# define STDC
/* Some Mac compilers merge all .h files incorrectly: */ # endif
#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) # if __STDC_VERSION__ >= 199901L
# define NO_DUMMY_DECL # ifndef STDC99
#endif # define STDC99
# endif
/* Old Borland C incorrectly complains about missing returns: */ # endif
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) #endif
# define NEED_DUMMY_RETURN #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
#endif # define STDC
#endif
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
/* Maximum value for memLevel in deflateInit2 */ # define STDC
#ifndef MAX_MEM_LEVEL #endif
# ifdef MAXSEG_64K #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
# define MAX_MEM_LEVEL 8 # define STDC
# else #endif
# define MAX_MEM_LEVEL 9 #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
# endif # define STDC
#endif #endif
/* Maximum value for windowBits in deflateInit2 and inflateInit2. #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files # define STDC
* created by gzip. (Files created by minigzip can still be extracted by #endif
* gzip.)
*/ #ifndef STDC
#ifndef MAX_WBITS # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
# define MAX_WBITS 15 /* 32K LZ77 window */ # define const /* note: need a more gentle solution here */
#endif # endif
#endif
/* The memory requirements for deflate are (in bytes):
(1 << (windowBits+2)) + (1 << (memLevel+9)) /* Some Mac compilers merge all .h files incorrectly: */
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
plus a few kilobytes for small objects. For example, if you want to reduce # define NO_DUMMY_DECL
the default memory requirements from 256K to 128K, compile with #endif
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
Of course this will generally degrade compression (there's no free lunch). /* Maximum value for memLevel in deflateInit2 */
#ifndef MAX_MEM_LEVEL
The memory requirements for inflate are (in bytes) 1 << windowBits # ifdef MAXSEG_64K
that is, 32K for windowBits=15 (default value) plus a few kilobytes # define MAX_MEM_LEVEL 8
for small objects. # else
*/ # define MAX_MEM_LEVEL 9
# endif
/* Type declarations */ #endif
#ifndef OF /* function prototypes */ /* Maximum value for windowBits in deflateInit2 and inflateInit2.
# ifdef STDC * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
# define OF(args) args * created by gzip. (Files created by minigzip can still be extracted by
# else * gzip.)
# define OF(args) () */
# endif #ifndef MAX_WBITS
#endif # define MAX_WBITS 15 /* 32K LZ77 window */
#endif
/* The following definitions for FAR are needed only for MSDOS mixed
* model programming (small or medium model with some far allocations). /* The memory requirements for deflate are (in bytes):
* This was tested only with MSC; for other MSDOS compilers you may have (1 << (windowBits+2)) + (1 << (memLevel+9))
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model, that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
* just define FAR to be empty. plus a few kilobytes for small objects. For example, if you want to reduce
*/ the default memory requirements from 256K to 128K, compile with
#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
/* MSC small or medium model */ Of course this will generally degrade compression (there's no free lunch).
# define SMALL_MEDIUM
# ifdef _MSC_VER The memory requirements for inflate are (in bytes) 1 << windowBits
# define FAR _far that is, 32K for windowBits=15 (default value) plus a few kilobytes
# else for small objects.
# define FAR far */
# endif
#endif /* Type declarations */
#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
# ifndef __32BIT__ #ifndef OF /* function prototypes */
# define SMALL_MEDIUM # ifdef STDC
# define FAR _far # define OF(args) args
# endif # else
#endif # define OF(args) ()
# endif
/* Compile with -DZLIB_DLL for Windows DLL support */ #endif
#if defined(ZLIB_DLL)
# if defined(_WINDOWS) || defined(WINDOWS) /* The following definitions for FAR are needed only for MSDOS mixed
# ifdef FAR * model programming (small or medium model with some far allocations).
# undef FAR * This was tested only with MSC; for other MSDOS compilers you may have
# endif * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
# include <windows.h> * just define FAR to be empty.
# define ZEXPORT WINAPI */
# define ZEXTERN __declspec(dllexport) // dll export 를 위해서 추가.. #ifdef SYS16BIT
# ifdef WIN32 # if defined(M_I86SM) || defined(M_I86MM)
# define ZEXPORTVA WINAPIV /* MSC small or medium model */
# else # define SMALL_MEDIUM
# define ZEXPORTVA FAR _cdecl _export # ifdef _MSC_VER
# endif # define FAR _far
# endif # else
# if defined (__BORLANDC__) # define FAR far
# if (__BORLANDC__ >= 0x0500) && defined (WIN32) # endif
# include <windows.h> # endif
# define ZEXPORT __declspec(dllexport) WINAPI # if (defined(__SMALL__) || defined(__MEDIUM__))
# define ZEXPORTRVA __declspec(dllexport) WINAPIV /* Turbo C small or medium model */
# else # define SMALL_MEDIUM
# if defined (_Windows) && defined (__DLL__) # ifdef __BORLANDC__
# define ZEXPORT _export # define FAR _far
# define ZEXPORTVA _export # else
# endif # define FAR far
# endif # endif
# endif # endif
#endif #endif
#if defined (__BEOS__) #if defined(WINDOWS) || defined(WIN32)
# if defined (ZLIB_DLL) /* If building or using zlib as a DLL, define ZLIB_DLL.
# define ZEXTERN extern __declspec(dllexport) * This is not mandatory, but it offers a little performance increase.
# else */
# define ZEXTERN extern __declspec(dllimport) # ifdef ZLIB_DLL
# endif # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
#endif # ifdef ZLIB_INTERNAL
# define ZEXTERN extern __declspec(dllexport)
#ifndef ZEXPORT # else
# define ZEXPORT # define ZEXTERN extern __declspec(dllimport)
#endif # endif
#ifndef ZEXPORTVA # endif
# define ZEXPORTVA # endif /* ZLIB_DLL */
#endif /* If building or using zlib with the WINAPI/WINAPIV calling convention,
#ifndef ZEXTERN * define ZLIB_WINAPI.
# define ZEXTERN ///extern STATIC lib 를 위해서 막아버림.. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
#endif */
# ifdef ZLIB_WINAPI
#ifndef FAR # ifdef FAR
# define FAR # undef FAR
#endif # endif
# include <windows.h>
#if !defined(MACOS) && !defined(TARGET_OS_MAC) /* No need for _export, use ZLIB.DEF instead. */
typedef unsigned char Byte; /* 8 bits */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */
#endif # define ZEXPORT WINAPI
typedef unsigned int uInt; /* 16 bits or more */ # ifdef WIN32
typedef unsigned long uLong; /* 32 bits or more */ # define ZEXPORTVA WINAPIV
# else
#ifdef SMALL_MEDIUM # define ZEXPORTVA FAR CDECL
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # endif
# define Bytef Byte FAR # endif
#else #endif
typedef Byte FAR Bytef;
#endif #if defined (__BEOS__)
typedef char FAR charf; # ifdef ZLIB_DLL
typedef int FAR intf; # ifdef ZLIB_INTERNAL
typedef uInt FAR uIntf; # define ZEXPORT __declspec(dllexport)
typedef uLong FAR uLongf; # define ZEXPORTVA __declspec(dllexport)
# else
#ifdef STDC # define ZEXPORT __declspec(dllimport)
typedef void FAR *voidpf; # define ZEXPORTVA __declspec(dllimport)
typedef void *voidp; # endif
#else # endif
typedef Byte FAR *voidpf; #endif
typedef Byte *voidp;
#endif #ifndef ZEXTERN
# define ZEXTERN extern
#ifdef HAVE_UNISTD_H #endif
# include <sys/types.h> /* for off_t */ #ifndef ZEXPORT
# include <unistd.h> /* for SEEK_* and off_t */ # define ZEXPORT
# define z_off_t off_t #endif
#endif #ifndef ZEXPORTVA
#ifndef SEEK_SET # define ZEXPORTVA
# define SEEK_SET 0 /* Seek from beginning of file. */ #endif
# define SEEK_CUR 1 /* Seek from current position. */
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #ifndef FAR
#endif # define FAR
#ifndef z_off_t #endif
# define z_off_t long
#endif #if !defined(__MACTYPES__)
typedef unsigned char Byte; /* 8 bits */
/* MVS linker does not support external names larger than 8 bytes */ #endif
#if defined(__MVS__) typedef unsigned int uInt; /* 16 bits or more */
# pragma map(deflateInit_,"DEIN") typedef unsigned long uLong; /* 32 bits or more */
# pragma map(deflateInit2_,"DEIN2")
# pragma map(deflateEnd,"DEEND") #ifdef SMALL_MEDIUM
# pragma map(inflateInit_,"ININ") /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
# pragma map(inflateInit2_,"ININ2") # define Bytef Byte FAR
# pragma map(inflateEnd,"INEND") #else
# pragma map(inflateSync,"INSY") typedef Byte FAR Bytef;
# pragma map(inflateSetDictionary,"INSEDI") #endif
# pragma map(inflate_blocks,"INBL") typedef char FAR charf;
# pragma map(inflate_blocks_new,"INBLNE") typedef int FAR intf;
# pragma map(inflate_blocks_free,"INBLFR") typedef uInt FAR uIntf;
# pragma map(inflate_blocks_reset,"INBLRE") typedef uLong FAR uLongf;
# pragma map(inflate_codes_free,"INCOFR")
# pragma map(inflate_codes,"INCO") #ifdef STDC
# pragma map(inflate_fast,"INFA") typedef void const *voidpc;
# pragma map(inflate_flush,"INFLU") typedef void FAR *voidpf;
# pragma map(inflate_mask,"INMA") typedef void *voidp;
# pragma map(inflate_set_dictionary,"INSEDI2") #else
# pragma map(inflate_copyright,"INCOPY") typedef Byte const *voidpc;
# pragma map(inflate_trees_bits,"INTRBI") typedef Byte FAR *voidpf;
# pragma map(inflate_trees_dynamic,"INTRDY") typedef Byte *voidp;
# pragma map(inflate_trees_fixed,"INTRFI") #endif
# pragma map(inflate_trees_free,"INTRFR")
#endif #if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
# include <sys/types.h> /* for off_t */
#endif /* _ZCONF_H */ # include <unistd.h> /* for SEEK_* and off_t */
# ifdef VMS
# include <unixio.h> /* for off_t */
# endif
# define z_off_t off_t
#endif
#ifndef SEEK_SET
# define SEEK_SET 0 /* Seek from beginning of file. */
# define SEEK_CUR 1 /* Seek from current position. */
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
#endif
#ifndef z_off_t
# define z_off_t long
#endif
#if defined(__OS400__)
#define NO_vsnprintf
#endif
#if defined(__MVS__)
# define NO_vsnprintf
# ifdef FAR
# undef FAR
# endif
#endif
/* MVS linker does not support external names larger than 8 bytes */
#if defined(__MVS__)
# pragma map(deflateInit_,"DEIN")
# pragma map(deflateInit2_,"DEIN2")
# pragma map(deflateEnd,"DEEND")
# pragma map(deflateBound,"DEBND")
# pragma map(inflateInit_,"ININ")
# pragma map(inflateInit2_,"ININ2")
# pragma map(inflateEnd,"INEND")
# pragma map(inflateSync,"INSY")
# pragma map(inflateSetDictionary,"INSEDI")
# pragma map(compressBound,"CMBND")
# pragma map(inflate_table,"INTABL")
# pragma map(inflate_fast,"INFA")
# pragma map(inflate_copyright,"INCOPY")
#endif
#endif /* ZCONF_H */

2088
zlib/zlib.h Normal file → Executable file

File diff suppressed because it is too large Load diff

544
zlib/zutil.c Normal file → Executable file
View file

@ -1,225 +1,319 @@
/* zutil.c -- target dependent utility functions for the compression library /* zutil.c -- target dependent utility functions for the compression library
* Copyright (C) 1995-2002 Jean-loup Gailly. * Copyright (C) 1995-2003 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
/* @(#) $Id$ */ /* @(#) $Id$ */
#include "zutil.h" #include "zutil.h"
struct internal_state {int dummy;}; /* for buggy compilers */ #ifndef NO_DUMMY_DECL
struct internal_state {int dummy;}; /* for buggy compilers */
#ifndef STDC #endif
extern void exit OF((int));
#endif #ifndef STDC
extern void exit OF((int));
const char *z_errmsg[10] = { #endif
"need dictionary", /* Z_NEED_DICT 2 */
"stream end", /* Z_STREAM_END 1 */ const char * const z_errmsg[10] = {
"", /* Z_OK 0 */ "need dictionary", /* Z_NEED_DICT 2 */
"file error", /* Z_ERRNO (-1) */ "stream end", /* Z_STREAM_END 1 */
"stream error", /* Z_STREAM_ERROR (-2) */ "", /* Z_OK 0 */
"data error", /* Z_DATA_ERROR (-3) */ "file error", /* Z_ERRNO (-1) */
"insufficient memory", /* Z_MEM_ERROR (-4) */ "stream error", /* Z_STREAM_ERROR (-2) */
"buffer error", /* Z_BUF_ERROR (-5) */ "data error", /* Z_DATA_ERROR (-3) */
"incompatible version",/* Z_VERSION_ERROR (-6) */ "insufficient memory", /* Z_MEM_ERROR (-4) */
""}; "buffer error", /* Z_BUF_ERROR (-5) */
"incompatible version",/* Z_VERSION_ERROR (-6) */
""};
const char * ZEXPORT zlibVersion()
{
return ZLIB_VERSION; const char * ZEXPORT zlibVersion()
} {
return ZLIB_VERSION;
#ifdef DEBUG }
# ifndef verbose uLong ZEXPORT zlibCompileFlags()
# define verbose 0 {
# endif uLong flags;
int z_verbose = verbose;
flags = 0;
void z_error (m) switch (sizeof(uInt)) {
char *m; case 2: break;
{ case 4: flags += 1; break;
fprintf(stderr, "%s\n", m); case 8: flags += 2; break;
exit(1); default: flags += 3;
} }
#endif switch (sizeof(uLong)) {
case 2: break;
/* exported to allow conversion of error code to string for compress() and case 4: flags += 1 << 2; break;
* uncompress() case 8: flags += 2 << 2; break;
*/ default: flags += 3 << 2;
const char * ZEXPORT zError(err) }
int err; switch (sizeof(voidpf)) {
{ case 2: break;
return ERR_MSG(err); case 4: flags += 1 << 4; break;
} case 8: flags += 2 << 4; break;
default: flags += 3 << 4;
}
#ifndef HAVE_MEMCPY switch (sizeof(z_off_t)) {
case 2: break;
void zmemcpy(dest, source, len) case 4: flags += 1 << 6; break;
Bytef* dest; case 8: flags += 2 << 6; break;
const Bytef* source; default: flags += 3 << 6;
uInt len; }
{ #ifdef DEBUG
if (len == 0) return; flags += 1 << 8;
do { #endif
*dest++ = *source++; /* ??? to be unrolled */ #if defined(ASMV) || defined(ASMINF)
} while (--len != 0); flags += 1 << 9;
} #endif
#ifdef ZLIB_WINAPI
int zmemcmp(s1, s2, len) flags += 1 << 10;
const Bytef* s1; #endif
const Bytef* s2; #ifdef BUILDFIXED
uInt len; flags += 1 << 12;
{ #endif
uInt j; #ifdef DYNAMIC_CRC_TABLE
flags += 1 << 13;
for (j = 0; j < len; j++) { #endif
if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; #ifdef NO_GZCOMPRESS
} flags += 1 << 16;
return 0; #endif
} #ifdef NO_GZIP
flags += 1 << 17;
void zmemzero(dest, len) #endif
Bytef* dest; #ifdef PKZIP_BUG_WORKAROUND
uInt len; flags += 1 << 20;
{ #endif
if (len == 0) return; #ifdef FASTEST
do { flags += 1 << 21;
*dest++ = 0; /* ??? to be unrolled */ #endif
} while (--len != 0); #ifdef STDC
} # ifdef NO_vsnprintf
#endif flags += 1 << 25;
# ifdef HAS_vsprintf_void
#ifdef __TURBOC__ flags += 1 << 26;
#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) # endif
/* Small and medium model in Turbo C are for now limited to near allocation # else
* with reduced MAX_WBITS and MAX_MEM_LEVEL # ifdef HAS_vsnprintf_void
*/ flags += 1 << 26;
# define MY_ZCALLOC # endif
# endif
/* Turbo C malloc() does not allow dynamic allocation of 64K bytes #else
* and farmalloc(64K) returns a pointer with an offset of 8, so we flags += 1 << 24;
* must fix the pointer. Warning: the pointer must be put back to its # ifdef NO_snprintf
* original form in order to free it, use zcfree(). flags += 1 << 25;
*/ # ifdef HAS_sprintf_void
flags += 1 << 26;
#define MAX_PTR 10 # endif
/* 10*64K = 640K */ # else
# ifdef HAS_snprintf_void
local int next_ptr = 0; flags += 1 << 26;
# endif
typedef struct ptr_table_s { # endif
voidpf org_ptr; #endif
voidpf new_ptr; return flags;
} ptr_table; }
local ptr_table table[MAX_PTR]; #ifdef DEBUG
/* This table is used to remember the original form of pointers
* to large buffers (64K). Such pointers are normalized with a zero offset. # ifndef verbose
* Since MSDOS is not a preemptive multitasking OS, this table is not # define verbose 0
* protected from concurrent access. This hack doesn't work anyway on # endif
* a protected system like OS/2. Use Microsoft C instead. int z_verbose = verbose;
*/
void z_error (m)
voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) char *m;
{ {
voidpf buf = opaque; /* just to make some compilers happy */ fprintf(stderr, "%s\n", m);
ulg bsize = (ulg)items*size; exit(1);
}
/* If we allocate less than 65520 bytes, we assume that farmalloc #endif
* will return a usable pointer which doesn't have to be normalized.
*/ /* exported to allow conversion of error code to string for compress() and
if (bsize < 65520L) { * uncompress()
buf = farmalloc(bsize); */
if (*(ush*)&buf != 0) return buf; const char * ZEXPORT zError(err)
} else { int err;
buf = farmalloc(bsize + 16L); {
} return ERR_MSG(err);
if (buf == NULL || next_ptr >= MAX_PTR) return NULL; }
table[next_ptr].org_ptr = buf;
#if defined(_WIN32_WCE)
/* Normalize the pointer to seg:0 */ /* does not exist on WCE */
*((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; int errno = 0;
*(ush*)&buf = 0; #endif
table[next_ptr++].new_ptr = buf;
return buf; #ifndef HAVE_MEMCPY
}
void zmemcpy(dest, source, len)
void zcfree (voidpf opaque, voidpf ptr) Bytef* dest;
{ const Bytef* source;
int n; uInt len;
if (*(ush*)&ptr != 0) { /* object < 64K */ {
farfree(ptr); if (len == 0) return;
return; do {
} *dest++ = *source++; /* ??? to be unrolled */
/* Find the original pointer */ } while (--len != 0);
for (n = 0; n < next_ptr; n++) { }
if (ptr != table[n].new_ptr) continue;
int zmemcmp(s1, s2, len)
farfree(table[n].org_ptr); const Bytef* s1;
while (++n < next_ptr) { const Bytef* s2;
table[n-1] = table[n]; uInt len;
} {
next_ptr--; uInt j;
return;
} for (j = 0; j < len; j++) {
ptr = opaque; /* just to make some compilers happy */ if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
Assert(0, "zcfree: ptr not found"); }
} return 0;
#endif }
#endif /* __TURBOC__ */
void zmemzero(dest, len)
Bytef* dest;
#if defined(M_I86) && !defined(__32BIT__) uInt len;
/* Microsoft C in 16-bit mode */ {
if (len == 0) return;
# define MY_ZCALLOC do {
*dest++ = 0; /* ??? to be unrolled */
#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) } while (--len != 0);
# define _halloc halloc }
# define _hfree hfree #endif
#endif
voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) #ifdef SYS16BIT
{
if (opaque) opaque = 0; /* to make compiler happy */ #ifdef __TURBOC__
return _halloc((long)items, size); /* Turbo C in 16-bit mode */
}
# define MY_ZCALLOC
void zcfree (voidpf opaque, voidpf ptr)
{ /* Turbo C malloc() does not allow dynamic allocation of 64K bytes
if (opaque) opaque = 0; /* to make compiler happy */ * and farmalloc(64K) returns a pointer with an offset of 8, so we
_hfree(ptr); * must fix the pointer. Warning: the pointer must be put back to its
} * original form in order to free it, use zcfree().
*/
#endif /* MSC */
#define MAX_PTR 10
/* 10*64K = 640K */
#ifndef MY_ZCALLOC /* Any system without a special alloc function */
local int next_ptr = 0;
#ifndef STDC
extern voidp calloc OF((uInt items, uInt size)); typedef struct ptr_table_s {
extern void free OF((voidpf ptr)); voidpf org_ptr;
#endif voidpf new_ptr;
} ptr_table;
voidpf zcalloc (opaque, items, size)
voidpf opaque; local ptr_table table[MAX_PTR];
unsigned items; /* This table is used to remember the original form of pointers
unsigned size; * to large buffers (64K). Such pointers are normalized with a zero offset.
{ * Since MSDOS is not a preemptive multitasking OS, this table is not
if (opaque) items += size - size; /* make compiler happy */ * protected from concurrent access. This hack doesn't work anyway on
return (voidpf)calloc(items, size); * a protected system like OS/2. Use Microsoft C instead.
} */
void zcfree (opaque, ptr) voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
voidpf opaque; {
voidpf ptr; voidpf buf = opaque; /* just to make some compilers happy */
{ ulg bsize = (ulg)items*size;
free(ptr);
if (opaque) return; /* make compiler happy */ /* If we allocate less than 65520 bytes, we assume that farmalloc
} * will return a usable pointer which doesn't have to be normalized.
*/
#endif /* MY_ZCALLOC */ if (bsize < 65520L) {
buf = farmalloc(bsize);
if (*(ush*)&buf != 0) return buf;
} else {
buf = farmalloc(bsize + 16L);
}
if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
table[next_ptr].org_ptr = buf;
/* Normalize the pointer to seg:0 */
*((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
*(ush*)&buf = 0;
table[next_ptr++].new_ptr = buf;
return buf;
}
void zcfree (voidpf opaque, voidpf ptr)
{
int n;
if (*(ush*)&ptr != 0) { /* object < 64K */
farfree(ptr);
return;
}
/* Find the original pointer */
for (n = 0; n < next_ptr; n++) {
if (ptr != table[n].new_ptr) continue;
farfree(table[n].org_ptr);
while (++n < next_ptr) {
table[n-1] = table[n];
}
next_ptr--;
return;
}
ptr = opaque; /* just to make some compilers happy */
Assert(0, "zcfree: ptr not found");
}
#endif /* __TURBOC__ */
#ifdef M_I86
/* Microsoft C in 16-bit mode */
# define MY_ZCALLOC
#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
# define _halloc halloc
# define _hfree hfree
#endif
voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
{
if (opaque) opaque = 0; /* to make compiler happy */
return _halloc((long)items, size);
}
void zcfree (voidpf opaque, voidpf ptr)
{
if (opaque) opaque = 0; /* to make compiler happy */
_hfree(ptr);
}
#endif /* M_I86 */
#endif /* SYS16BIT */
#ifndef MY_ZCALLOC /* Any system without a special alloc function */
#ifndef STDC
extern voidp malloc OF((uInt size));
extern voidp calloc OF((uInt items, uInt size));
extern void free OF((voidpf ptr));
#endif
voidpf zcalloc (opaque, items, size)
voidpf opaque;
unsigned items;
unsigned size;
{
if (opaque) items += size - size; /* make compiler happy */
return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
(voidpf)calloc(items, size);
}
void zcfree (opaque, ptr)
voidpf opaque;
voidpf ptr;
{
free(ptr);
if (opaque) return; /* make compiler happy */
}
#endif /* MY_ZCALLOC */

90
zlib/zutil.h Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* zutil.h -- internal interface and configuration of the compression library /* zutil.h -- internal interface and configuration of the compression library
* Copyright (C) 1995-2002 Jean-loup Gailly. * Copyright (C) 1995-2003 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@ -10,9 +10,10 @@
/* @(#) $Id$ */ /* @(#) $Id$ */
#ifndef _Z_UTIL_H #ifndef ZUTIL_H
#define _Z_UTIL_H #define ZUTIL_H
#define ZLIB_INTERNAL
#include "zlib.h" #include "zlib.h"
#ifdef STDC #ifdef STDC
@ -37,7 +38,7 @@ typedef unsigned short ush;
typedef ush FAR ushf; typedef ush FAR ushf;
typedef unsigned long ulg; typedef unsigned long ulg;
extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* (size given to avoid silly warnings with Visual C++) */ /* (size given to avoid silly warnings with Visual C++) */
#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
@ -73,7 +74,7 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
/* target dependencies */ /* target dependencies */
#ifdef MSDOS #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
# define OS_CODE 0x00 # define OS_CODE 0x00
# if defined(__TURBOC__) || defined(__BORLANDC__) # if defined(__TURBOC__) || defined(__BORLANDC__)
# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) # if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
@ -81,19 +82,15 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
void _Cdecl farfree( void *block ); void _Cdecl farfree( void *block );
void *_Cdecl farmalloc( unsigned long nbytes ); void *_Cdecl farmalloc( unsigned long nbytes );
# else # else
# include <alloc.h> # include <alloc.h>
# endif # endif
# else /* MSC or DJGPP */ # else /* MSC or DJGPP */
# include <malloc.h> # include <malloc.h>
# endif # endif
#endif #endif
#ifdef OS2 #ifdef AMIGA
# define OS_CODE 0x06 # define OS_CODE 0x01
#endif
#ifdef WIN32 /* Window 95 & Windows NT */
# define OS_CODE 0x0b
#endif #endif
#if defined(VAXC) || defined(VMS) #if defined(VAXC) || defined(VMS)
@ -102,14 +99,14 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
#endif #endif
#ifdef AMIGA
# define OS_CODE 0x01
#endif
#if defined(ATARI) || defined(atarist) #if defined(ATARI) || defined(atarist)
# define OS_CODE 0x05 # define OS_CODE 0x05
#endif #endif
#ifdef OS2
# define OS_CODE 0x06
#endif
#if defined(MACOS) || defined(TARGET_OS_MAC) #if defined(MACOS) || defined(TARGET_OS_MAC)
# define OS_CODE 0x07 # define OS_CODE 0x07
# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
@ -121,24 +118,37 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
# endif # endif
#endif #endif
#ifdef __50SERIES /* Prime/PRIMOS */
# define OS_CODE 0x0F
#endif
#ifdef TOPS20 #ifdef TOPS20
# define OS_CODE 0x0a # define OS_CODE 0x0a
#endif #endif
#ifdef WIN32
# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */
# define OS_CODE 0x0b
# endif
#endif
#ifdef __50SERIES /* Prime/PRIMOS */
# define OS_CODE 0x0f
#endif
#if defined(_BEOS_) || defined(RISCOS) #if defined(_BEOS_) || defined(RISCOS)
# define fdopen(fd,mode) NULL /* No fdopen() */ # define fdopen(fd,mode) NULL /* No fdopen() */
#endif #endif
#if (defined(_MSC_VER) && (_MSC_VER > 600)) #if (defined(_MSC_VER) && (_MSC_VER > 600))
# define fdopen(fd,type) _fdopen(fd,type) # if defined(_WIN32_WCE)
# define fdopen(fd,mode) NULL /* No fdopen() */
# ifndef _PTRDIFF_T_DEFINED
typedef int ptrdiff_t;
# define _PTRDIFF_T_DEFINED
# endif
# else
# define fdopen(fd,type) _fdopen(fd,type)
# endif
#endif #endif
/* common defaults */
/* Common defaults */
#ifndef OS_CODE #ifndef OS_CODE
# define OS_CODE 0x03 /* assume Unix */ # define OS_CODE 0x03 /* assume Unix */
@ -150,6 +160,36 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
/* functions */ /* functions */
#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
# ifndef HAVE_VSNPRINTF
# define HAVE_VSNPRINTF
# endif
#endif
#if defined(__CYGWIN__)
# ifndef HAVE_VSNPRINTF
# define HAVE_VSNPRINTF
# endif
#endif
#ifndef HAVE_VSNPRINTF
# ifdef MSDOS
/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
but for now we just assume it doesn't. */
# define NO_vsnprintf
# endif
# ifdef __TURBOC__
# define NO_vsnprintf
# endif
# ifdef WIN32
/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
# if !defined(vsnprintf) && !defined(NO_vsnprintf)
# define vsnprintf _vsnprintf
# endif
# endif
# ifdef __SASC
# define NO_vsnprintf
# endif
#endif
#ifdef HAVE_STRERROR #ifdef HAVE_STRERROR
extern char *strerror OF((int)); extern char *strerror OF((int));
# define zstrerror(errnum) strerror(errnum) # define zstrerror(errnum) strerror(errnum)
@ -207,8 +247,6 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
#endif #endif
typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf,
uInt len));
voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
void zcfree OF((voidpf opaque, voidpf ptr)); void zcfree OF((voidpf opaque, voidpf ptr));
@ -217,4 +255,4 @@ void zcfree OF((voidpf opaque, voidpf ptr));
#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} #define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
#endif /* _Z_UTIL_H */ #endif /* ZUTIL_H */