/* 7zIn.c */
#include "7zIn.h"
#include "7zDecode.h"
#include "../../7zCrc.h"
#define RINOM(x) { if((x) == 0) return SZE_OUTOFMEMORY; }
void SzArDbExInit(CArchiveDatabaseEx *db)
{
SzArchiveDatabaseInit(&db->Database);
db->FolderStartPackStreamIndex = 0;
db->PackStreamStartPositions = 0;
db->FolderStartFileIndex = 0;
db->FileIndexToFolderIndexMap = 0;
}
void SzArDbExFree(CArchiveDatabaseEx *db, void (*freeFunc)(void *))
{
freeFunc(db->FolderStartPackStreamIndex);
freeFunc(db->PackStreamStartPositions);
freeFunc(db->FolderStartFileIndex);
freeFunc(db->FileIndexToFolderIndexMap);
SzArchiveDatabaseFree(&db->Database, freeFunc);
SzArDbExInit(db);
}
/*
CFileSize GetFolderPackStreamSize(int folderIndex, int streamIndex) const
{
return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex];
}
CFileSize GetFilePackSize(int fileIndex) const
{
int folderIndex = FileIndexToFolderIndexMap[fileIndex];
if (folderIndex >= 0)
{
const CFolder &folderInfo = Folders[folderIndex];
if (FolderStartFileIndex[folderIndex] == fileIndex)
return GetFolderFullPackSize(folderIndex);
}
return 0;
}
*/
#define MY_ALLOC(T, p, size, allocFunc) { if ((size) == 0) p = 0; else \
if ((p = (T *)allocFunc((size) * sizeof(T))) == 0) return SZE_OUTOFMEMORY; }
SZ_RESULT SzArDbExFill(CArchiveDatabaseEx *db, void * (*allocFunc)(size_t size))
{
UInt32 startPos = 0;
CFileSize startPosSize = 0;
UInt32 i;
UInt32 folderIndex = 0;
UInt32 indexInFolder = 0;
MY_ALLOC(UInt32, db->FolderStartPackStreamIndex, db->Database.NumFolders, allocFunc);
for(i = 0; i < db->Database.NumFolders; i++)
{
db->FolderStartPackStreamIndex[i] = startPos;
startPos += db->Database.Folders[i].NumPackStreams;
}
MY_ALLOC(CFileSize, db->PackStreamStartPositions, db->Database.NumPackStreams, allocFunc);
for(i = 0; i < db->Database.NumPackStreams; i++)
{
db->PackStreamStartPositions[i] = startPosSize;
startPosSize += db->Database.PackSizes[i];
}
MY_ALLOC(UInt32, db->FolderStartFileIndex, db->Database.NumFolders, allocFunc);
MY_ALLOC(UInt32, db->FileIndexToFolderIndexMap, db->Database.NumFiles, allocFunc);
for (i = 0; i < db->Database.NumFiles; i++)
{
CFileItem *file = db->Database.Files + i;
int emptyStream = !file->HasStream;
if (emptyStream && indexInFolder == 0)
{
db->FileIndexToFolderIndexMap[i] = (UInt32)-1;
continue;
}
if (indexInFolder == 0)
{
/*
v3.13 incorrectly worked with empty folders
v4.07: Loop for skipping empty folders
*/
for (;;)
{
if (folderIndex >= db->Database.NumFolders)
return SZE_ARCHIVE_ERROR;
db->FolderStartFileIndex[folderIndex] = i;
if (db->Database.Folders[folderIndex].NumUnPackStreams != 0)
break;
folderIndex++;
}
}
db->FileIndexToFolderIndexMap[i] = folderIndex;
if (emptyStream)
continue;
indexInFolder++;
if (indexInFolder >= db->Database.Folders[folderIndex].NumUnPackStreams)
{
folderIndex++;
indexInFolder = 0;
}
}
return SZ_OK;
}
CFileSize SzArDbGetFolderStreamPos(CArchiveDatabaseEx *db, UInt32 folderIndex, UInt32 indexInFolder)
{
return db->ArchiveInfo.DataStartPosition +
db->PackStreamStartPositions[db->FolderStartPackStreamIndex[folderIndex] + indexInFolder];
}
int SzArDbGetFolderFullPackSize(CArchiveDatabaseEx *db, UInt32 folderIndex, CFileSize *resSize)
{
UInt32 packStreamIndex = db->FolderStartPackStreamIndex[folderIndex];
CFolder *folder = db->Database.Folders + folderIndex;
CFileSize size = 0;
UInt32 i;
for (i = 0; i < folder->NumPackStreams; i++)
{
CFileSize t = size + db->Database.PackSizes[packStreamIndex + i];
if (t < size)
return SZE_FAIL;
size = t;
}
*resSize = size;
return SZ_OK;
}
/*
SZ_RESULT SzReadTime(const CObjectVector<CSzByteBuffer> &dataVector,
CObjectVector<CFileItem> &files, UInt64 type)
{
CBoolVector boolVector;
RINOK(ReadBoolVector2(files.Size(), boolVector))
CStreamSwitch streamSwitch;
RINOK(streamSwitch.Set(this, &dataVector));
for(int i = 0; i < files.Size(); i++)
{
CFileItem &file = files[i];
CArchiveFileTime fileTime;
bool defined = boolVector[i];
if (defined)
{
UInt32 low, high;
RINOK(SzReadUInt32(low));
RINOK(SzReadUInt32(high));
fileTime.dwLowDateTime = low;
fileTime.dwHighDateTime = high;
}
switch(type)
{
case k7zIdCreationTime:
file.IsCreationTimeDefined = defined;
if (defined)
file.CreationTime = fileTime;
break;
case k7zIdLastWriteTime:
file.IsLastWriteTimeDefined = defined;
if (defined)
file.LastWriteTime = fileTime;
break;
case k7zIdLastAccessTime:
file.IsLastAccessTimeDefined = defined;
if (defined)
file.LastAccessTime = fileTime;
break;
}
}
return SZ_OK;
}
*/
SZ_RESULT SafeReadDirect(ISzInStream *inStream, Byte *data, size_t size)
{
#ifdef _LZMA_IN_CB
while (size > 0)
{
void *inBufferSpec;
size_t processedSize;
const Byte *inBuffer;
RINOK(inStream->Read(inStream, (void **)&inBufferSpec, size, &processedSize));
inBuffer = (const Byte *)inBufferSpec;
if (processedSize == 0 || processedSize > size)
return SZE_FAIL;
size -= processedSize;
do
{
*data++ = *inBuffer++;
}
while (--processedSize != 0);
}
#else
size_t processedSize;
RINOK(inStream->Read(inStream, data, size, &processedSize));
if (processedSize != size)
return SZE_FAIL;
#endif
return SZ_OK;
}
SZ_RESULT SafeReadDirectByte(ISzInStream *inStream, Byte *data)
{
return SafeReadDirect(inStream, data, 1);
}
SZ_RESULT SafeReadDirectUInt32(ISzInStream *inStream, UInt32 *value, UInt32 *crc)
{
int i;
*value = 0;
for (i = 0; i < 4; i++)
{
Byte b;
RINOK(SafeReadDirectByte(inStream, &b));
*value |= ((UInt32)b << (8 * i));
*crc = CRC_UPDATE_BYTE(*crc, b);
}
return SZ_OK;
}
SZ_RESULT SafeReadDirectUInt64(ISzInStream *inStream, UInt64 *value, UInt32 *crc)
{
int i;
*value = 0;
for (i = 0; i < 8; i++)
{
Byte b;
RINOK(SafeReadDirectByte(inStream, &b));
*value |= ((UInt64)b << (8 * i));
*crc = CRC_UPDATE_BYTE(*crc, b);
}
return SZ_OK;
}
int TestSignatureCandidate(Byte *testBytes)
{
size_t i;
for (i = 0; i < k7zSignatureSize; i++)
if (testBytes[i] != k7zSignature[i])
return 0;
return 1;
}
typedef struct _CSzState
{
Byte *Data;
size_t Size;
}CSzData;
SZ_RESULT SzReadByte(CSzData *sd, Byte *b)
{
if (sd->Size == 0)
return SZE_ARCHIVE_ERROR;
sd->Size--;
*b = *sd->Data++;
return SZ_OK;
}
SZ_RESULT SzReadBytes(CSzData *sd, Byte *data, size_t size)
{
size_t i;
for (i = 0; i < size; i++)
{
RINOK(SzReadByte(sd, data + i));
}
return SZ_OK;
}
SZ_RESULT SzReadUInt32(CSzData *sd, UInt32 *value)
{
int i;
*value = 0;
for (i = 0; i < 4; i++)
{
Byte b;
RINOK(SzReadByte(sd, &b));
*value |= ((UInt32)(b) << (8 * i));
}
return SZ_OK;
}
SZ_RESULT SzReadNumber(CSzData *sd, UInt64 *value)
{
Byte firstByte;
Byte mask = 0x80;
int i;
RINOK(SzReadByte(sd, &firstByte));
*value = 0;
for (i = 0; i < 8; i++)
{
Byte b;
if ((firstByte & mask) == 0)
{
UInt64 highPart = firstByte & (mask - 1);
*value += (highPart << (8 * i));
return SZ_OK;
}
RINOK(SzReadByte(sd, &b));
*value |= ((UInt64)b << (8 * i));
mask >>= 1;
}
return SZ_OK;
}
SZ_RESULT SzReadSize(CSzData *sd, CFileSize *value)
{
UInt64 value64;
RINOK(SzReadNumb
没有合适的资源?快使用搜索试试~ 我知道了~
c源码 7-zip压缩算法代码.rar
共63个文件
h:30个
c:29个
makefile:1个
需积分: 21 34 下载量 185 浏览量
2019-07-10
10:54:27
上传
评论 2
收藏 66KB RAR 举报
温馨提示
c源码 7-zip压缩算法代码,一种比较快速且压缩比极高的压缩算法,有多个程序版本的代码,这是C代码版本,可研究下C语言压缩文件的相关思路。
资源推荐
资源详情
资源评论
收起资源包目录
c7-zip.rar (63个子文件)
codesc.net
C
Sort.c 2KB
7zCrcT8.c 921B
Alloc.h 510B
Sort.h 195B
7zCrc.h 494B
Alloc.c 3KB
Compress
Branch
BranchIA64.c 2KB
BranchX86.h 249B
BranchSPARC.c 938B
BranchIA64.h 188B
BranchPPC.h 186B
BranchARM.c 605B
BranchARMThumb.h 206B
BranchX86.c 2KB
BranchX86_2.c 3KB
BranchARM.h 184B
BranchTypes.h 1006B
BranchSPARC.h 192B
BranchPPC.c 868B
BranchX86_2.h 634B
BranchARMThumb.c 852B
Lzma
LzmaDecode.c 16KB
LzmaTest.c 8KB
LzmaStateDecode.h 3KB
LzmaDecode.h 3KB
LzmaStateDecode.c 15KB
LzmaStateTest.c 5KB
LzmaDecodeSize.c 19KB
LzmaTypes.h 875B
Huffman
HuffmanEncode.c 3KB
HuffmanEncode.h 404B
Lz
MatchFinder.h 3KB
MatchFinder.c 19KB
MatchFinderMt.c 22KB
MatchFinderMt.h 2KB
LzHash.h 2KB
IStream.h 359B
Types.h 2KB
Threads.h 2KB
Threads.c 3KB
CpuArch.h 447B
Archive
7z
7zBuffer.c 622B
7zMethodID.c 146B
7zDecode.h 421B
7zItem.c 3KB
7zIn.c 33KB
7zBuffer.h 438B
7zIn.h 2KB
7zExtract.c 3KB
7zHeader.c 121B
7zMain.c 11KB
7z_C.dsw 531B
makefile.gcc 1KB
7zAlloc.c 1KB
7zHeader.h 820B
7zMethodID.h 141B
makefile 1KB
7zItem.h 2KB
7zAlloc.h 355B
7zDecode.c 9KB
7zExtract.h 1KB
7z_C.dsp 6KB
7zCrc.c 658B
共 63 条
- 1
资源评论
weixin_39840924
- 粉丝: 492
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功