mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-15 04:11:46 -06:00
4.59 beta
This commit is contained in:
committed by
Kornel Lesiński
parent
3901bf0ab8
commit
173c07e166
@@ -1,5 +1,5 @@
|
||||
/* 7zDecode.c Decoding from 7z folder
|
||||
2008-04-09
|
||||
2008-08-05
|
||||
Igor Pavlov
|
||||
Copyright (c) 1999-2008 Igor Pavlov
|
||||
Read 7zDecode.h for license options */
|
||||
@@ -60,13 +60,13 @@ static SRes SzDecodeLzma(CSzCoderInfo *coder, CFileSize inSize, ISzInStream *inS
|
||||
if (state.dicPos == state.dicBufSize || (inProcessed == 0 && dicPos == state.dicPos))
|
||||
{
|
||||
if (state.dicBufSize != outSize || _inSize != 0 ||
|
||||
(status != LZMA_STATUS_FINISHED_WITH_MARK &&
|
||||
(status != LZMA_STATUS_FINISHED_WITH_MARK &&
|
||||
status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK))
|
||||
res = SZ_ERROR_DATA;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LzmaDec_FreeProbs(&state, allocMain);
|
||||
|
||||
@@ -126,7 +126,7 @@ SRes CheckSupportedFolder(const CSzFolder *f)
|
||||
IS_UNSUPPORTED_CODER(f->Coders[2]) ||
|
||||
IS_NO_BCJ2(f->Coders[3]))
|
||||
return SZ_ERROR_UNSUPPORTED;
|
||||
if (f->NumPackStreams != 4 ||
|
||||
if (f->NumPackStreams != 4 ||
|
||||
f->PackStreams[0] != 2 ||
|
||||
f->PackStreams[1] != 6 ||
|
||||
f->PackStreams[2] != 1 ||
|
||||
@@ -184,7 +184,7 @@ SRes SzDecode2(const CFileSize *packSizes, const CSzFolder *folder,
|
||||
if (folder->NumCoders == 4)
|
||||
{
|
||||
UInt32 indices[] = { 3, 2, 0 };
|
||||
CFileSize unpackSize = folder->UnPackSizes[ci];
|
||||
CFileSize unpackSize = folder->UnpackSizes[ci];
|
||||
si = indices[ci];
|
||||
if (ci < 2)
|
||||
{
|
||||
@@ -287,22 +287,22 @@ SRes SzDecode2(const CFileSize *packSizes, const CSzFolder *folder,
|
||||
*/
|
||||
|
||||
res = Bcj2_Decode(
|
||||
tempBuf3, tempSize3,
|
||||
tempBuf[0], tempSizes[0],
|
||||
tempBuf[1], tempSizes[1],
|
||||
tempBuf3, tempSize3,
|
||||
tempBuf[0], tempSizes[0],
|
||||
tempBuf[1], tempSizes[1],
|
||||
/*
|
||||
#ifdef _LZMA_IN_CB
|
||||
*/
|
||||
tempBuf[2], tempSizes[2],
|
||||
/*
|
||||
tempBuf[2], tempSizes[2],
|
||||
/*
|
||||
#else
|
||||
inBuffer + (size_t)offset, (size_t)s3Size,
|
||||
inBuffer + (size_t)offset, (size_t)s3Size,
|
||||
#endif
|
||||
*/
|
||||
outBuffer, outSize);
|
||||
RINOK(res)
|
||||
}
|
||||
else
|
||||
else
|
||||
return SZ_ERROR_UNSUPPORTED;
|
||||
}
|
||||
return SZ_OK;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* 7zExtract.c -- Extracting from 7z archive
|
||||
2008-04-09
|
||||
2008-08-05
|
||||
Igor Pavlov
|
||||
Copyright (c) 1999-2008 Igor Pavlov
|
||||
Read 7zExtract.h for license options */
|
||||
@@ -10,13 +10,13 @@ Read 7zExtract.h for license options */
|
||||
|
||||
SRes SzAr_Extract(
|
||||
const CSzArEx *p,
|
||||
ISzInStream *inStream,
|
||||
ISzInStream *inStream,
|
||||
UInt32 fileIndex,
|
||||
UInt32 *blockIndex,
|
||||
Byte **outBuffer,
|
||||
Byte **outBuffer,
|
||||
size_t *outBufferSize,
|
||||
size_t *offset,
|
||||
size_t *outSizeProcessed,
|
||||
size_t *offset,
|
||||
size_t *outSizeProcessed,
|
||||
ISzAlloc *allocMain,
|
||||
ISzAlloc *allocTemp)
|
||||
{
|
||||
@@ -36,11 +36,11 @@ SRes SzAr_Extract(
|
||||
if (*outBuffer == 0 || *blockIndex != folderIndex)
|
||||
{
|
||||
CSzFolder *folder = p->db.Folders + folderIndex;
|
||||
CFileSize unPackSizeSpec = SzFolder_GetUnPackSize(folder);
|
||||
size_t unPackSize = (size_t)unPackSizeSpec;
|
||||
CFileSize unpackSizeSpec = SzFolder_GetUnpackSize(folder);
|
||||
size_t unpackSize = (size_t)unpackSizeSpec;
|
||||
CFileSize startOffset = SzArEx_GetFolderStreamPos(p, folderIndex, 0);
|
||||
|
||||
if (unPackSize != unPackSizeSpec)
|
||||
if (unpackSize != unpackSizeSpec)
|
||||
return SZ_ERROR_MEM;
|
||||
*blockIndex = folderIndex;
|
||||
IAlloc_Free(allocMain, *outBuffer);
|
||||
@@ -50,24 +50,24 @@ SRes SzAr_Extract(
|
||||
|
||||
if (res == SZ_OK)
|
||||
{
|
||||
*outBufferSize = unPackSize;
|
||||
if (unPackSize != 0)
|
||||
*outBufferSize = unpackSize;
|
||||
if (unpackSize != 0)
|
||||
{
|
||||
*outBuffer = (Byte *)IAlloc_Alloc(allocMain, unPackSize);
|
||||
*outBuffer = (Byte *)IAlloc_Alloc(allocMain, unpackSize);
|
||||
if (*outBuffer == 0)
|
||||
res = SZ_ERROR_MEM;
|
||||
}
|
||||
if (res == SZ_OK)
|
||||
{
|
||||
res = SzDecode(p->db.PackSizes +
|
||||
p->FolderStartPackStreamIndex[folderIndex], folder,
|
||||
inStream, startOffset,
|
||||
*outBuffer, unPackSize, allocTemp);
|
||||
res = SzDecode(p->db.PackSizes +
|
||||
p->FolderStartPackStreamIndex[folderIndex], folder,
|
||||
inStream, startOffset,
|
||||
*outBuffer, unpackSize, allocTemp);
|
||||
if (res == SZ_OK)
|
||||
{
|
||||
if (folder->UnPackCRCDefined)
|
||||
if (folder->UnpackCRCDefined)
|
||||
{
|
||||
if (CrcCalc(*outBuffer, unPackSize) != folder->UnPackCRC)
|
||||
if (CrcCalc(*outBuffer, unpackSize) != folder->UnpackCRC)
|
||||
res = SZ_ERROR_CRC;
|
||||
}
|
||||
}
|
||||
@@ -76,7 +76,7 @@ SRes SzAr_Extract(
|
||||
}
|
||||
if (res == SZ_OK)
|
||||
{
|
||||
UInt32 i;
|
||||
UInt32 i;
|
||||
CSzFileItem *fileItem = p->db.Files + fileIndex;
|
||||
*offset = 0;
|
||||
for(i = p->FolderStartFileIndex[folderIndex]; i < fileIndex; i++)
|
||||
@@ -85,7 +85,7 @@ SRes SzAr_Extract(
|
||||
if (*offset + *outSizeProcessed > *outBufferSize)
|
||||
return SZ_ERROR_FAIL;
|
||||
{
|
||||
if (fileItem->IsFileCRCDefined)
|
||||
if (fileItem->FileCRCDefined)
|
||||
{
|
||||
if (CrcCalc(*outBuffer + *offset, *outSizeProcessed) != fileItem->FileCRC)
|
||||
res = SZ_ERROR_CRC;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* 7zExtract.h -- Extracting from 7z archive
|
||||
2008-04-09
|
||||
2008-08-05
|
||||
Igor Pavlov
|
||||
Copyright (c) 1999-2008 Igor Pavlov
|
||||
Read 7zItem.h for license options */
|
||||
@@ -12,18 +12,18 @@ Read 7zItem.h for license options */
|
||||
/*
|
||||
SzExtract extracts file from archive
|
||||
|
||||
*outBuffer must be 0 before first call for each new archive.
|
||||
*outBuffer must be 0 before first call for each new archive.
|
||||
|
||||
Extracting cache:
|
||||
If you need to decompress more than one file, you can send
|
||||
If you need to decompress more than one file, you can send
|
||||
these values from previous call:
|
||||
*blockIndex,
|
||||
*outBuffer,
|
||||
*blockIndex,
|
||||
*outBuffer,
|
||||
*outBufferSize
|
||||
You can consider "*outBuffer" as cache of solid block. If your archive is solid,
|
||||
You can consider "*outBuffer" as cache of solid block. If your archive is solid,
|
||||
it will increase decompression speed.
|
||||
|
||||
If you use external function, you can declare these 3 cache variables
|
||||
If you use external function, you can declare these 3 cache variables
|
||||
(blockIndex, outBuffer, outBufferSize) as static in that external function.
|
||||
|
||||
Free *outBuffer and set *outBuffer to 0, if you want to flush cache.
|
||||
@@ -31,7 +31,7 @@ Read 7zItem.h for license options */
|
||||
|
||||
SRes SzAr_Extract(
|
||||
const CSzArEx *db,
|
||||
ISzInStream *inStream,
|
||||
ISzInStream *inStream,
|
||||
UInt32 fileIndex, /* index of file */
|
||||
UInt32 *blockIndex, /* index of solid block */
|
||||
Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* 7zHeader.h -- 7z Headers
|
||||
2008-03-17
|
||||
2008-07-14
|
||||
Copyright (c) 1999-2008 Igor Pavlov
|
||||
Read LzmaDec.h for license options */
|
||||
|
||||
@@ -28,7 +28,7 @@ enum EIdEnum
|
||||
k7zIdFilesInfo,
|
||||
|
||||
k7zIdPackInfo,
|
||||
k7zIdUnPackInfo,
|
||||
k7zIdUnpackInfo,
|
||||
k7zIdSubStreamsInfo,
|
||||
|
||||
k7zIdSize,
|
||||
@@ -36,23 +36,24 @@ enum EIdEnum
|
||||
|
||||
k7zIdFolder,
|
||||
|
||||
k7zIdCodersUnPackSize,
|
||||
k7zIdNumUnPackStream,
|
||||
k7zIdCodersUnpackSize,
|
||||
k7zIdNumUnpackStream,
|
||||
|
||||
k7zIdEmptyStream,
|
||||
k7zIdEmptyFile,
|
||||
k7zIdAnti,
|
||||
|
||||
k7zIdName,
|
||||
k7zIdCreationTime,
|
||||
k7zIdLastAccessTime,
|
||||
k7zIdLastWriteTime,
|
||||
k7zIdCTime,
|
||||
k7zIdATime,
|
||||
k7zIdMTime,
|
||||
k7zIdWinAttributes,
|
||||
k7zIdComment,
|
||||
|
||||
k7zIdEncodedHeader,
|
||||
|
||||
k7zIdStartPos
|
||||
k7zIdStartPos,
|
||||
k7zIdDummy
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* 7zIn.c -- 7z Input functions
|
||||
2008-04-09
|
||||
2008-08-05
|
||||
Igor Pavlov
|
||||
Copyright (c) 1999-2008 Igor Pavlov
|
||||
Read 7zIn.h for license options */
|
||||
@@ -30,7 +30,7 @@ void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc)
|
||||
}
|
||||
|
||||
/*
|
||||
CFileSize GetFolderPackStreamSize(int folderIndex, int streamIndex) const
|
||||
CFileSize GetFolderPackStreamSize(int folderIndex, int streamIndex) const
|
||||
{
|
||||
return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex];
|
||||
}
|
||||
@@ -96,7 +96,7 @@ static SRes SzArEx_Fill(CSzArEx *p, ISzAlloc *alloc)
|
||||
if (folderIndex >= p->db.NumFolders)
|
||||
return SZ_ERROR_ARCHIVE;
|
||||
p->FolderStartFileIndex[folderIndex] = i;
|
||||
if (p->db.Folders[folderIndex].NumUnPackStreams != 0)
|
||||
if (p->db.Folders[folderIndex].NumUnpackStreams != 0)
|
||||
break;
|
||||
folderIndex++;
|
||||
}
|
||||
@@ -105,7 +105,7 @@ static SRes SzArEx_Fill(CSzArEx *p, ISzAlloc *alloc)
|
||||
if (emptyStream)
|
||||
continue;
|
||||
indexInFolder++;
|
||||
if (indexInFolder >= p->db.Folders[folderIndex].NumUnPackStreams)
|
||||
if (indexInFolder >= p->db.Folders[folderIndex].NumUnpackStreams)
|
||||
{
|
||||
folderIndex++;
|
||||
indexInFolder = 0;
|
||||
@@ -117,7 +117,7 @@ static SRes SzArEx_Fill(CSzArEx *p, ISzAlloc *alloc)
|
||||
|
||||
CFileSize SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder)
|
||||
{
|
||||
return p->ArchiveInfo.DataStartPosition +
|
||||
return p->ArchiveInfo.DataStartPosition +
|
||||
p->PackStreamStartPositions[p->FolderStartPackStreamIndex[folderIndex] + indexInFolder];
|
||||
}
|
||||
|
||||
@@ -164,21 +164,9 @@ SRes SzReadTime(const CObjectVector<CBuf> &dataVector,
|
||||
}
|
||||
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;
|
||||
case k7zIdCTime: file.IsCTimeDefined = defined; if (defined) file.CTime = fileTime; break;
|
||||
case k7zIdATime: file.IsATimeDefined = defined; if (defined) file.ATime = fileTime; break;
|
||||
case k7zIdMTime: file.IsMTimeDefined = defined; if (defined) file.MTime = fileTime; break;
|
||||
}
|
||||
}
|
||||
return SZ_OK;
|
||||
@@ -327,9 +315,9 @@ static SRes SzReadNumber32(CSzData *sd, UInt32 *value)
|
||||
return SZ_OK;
|
||||
}
|
||||
|
||||
static SRes SzReadID(CSzData *sd, UInt64 *value)
|
||||
{
|
||||
return SzReadNumber(sd, value);
|
||||
static SRes SzReadID(CSzData *sd, UInt64 *value)
|
||||
{
|
||||
return SzReadNumber(sd, value);
|
||||
}
|
||||
|
||||
static SRes SzSkeepDataSize(CSzData *sd, UInt64 size)
|
||||
@@ -408,10 +396,10 @@ static SRes SzReadBoolVector2(CSzData *sd, size_t numItems, Byte **v, ISzAlloc *
|
||||
}
|
||||
|
||||
static SRes SzReadHashDigests(
|
||||
CSzData *sd,
|
||||
CSzData *sd,
|
||||
size_t numItems,
|
||||
Byte **digestsDefined,
|
||||
UInt32 **digests,
|
||||
Byte **digestsDefined,
|
||||
UInt32 **digests,
|
||||
ISzAlloc *alloc)
|
||||
{
|
||||
size_t i;
|
||||
@@ -426,7 +414,7 @@ static SRes SzReadHashDigests(
|
||||
}
|
||||
|
||||
static SRes SzReadPackInfo(
|
||||
CSzData *sd,
|
||||
CSzData *sd,
|
||||
CFileSize *dataOffset,
|
||||
UInt32 *numPackStreams,
|
||||
CFileSize **packSizes,
|
||||
@@ -455,7 +443,7 @@ static SRes SzReadPackInfo(
|
||||
break;
|
||||
if (type == k7zIdCRC)
|
||||
{
|
||||
RINOK(SzReadHashDigests(sd, (size_t)*numPackStreams, packCRCsDefined, packCRCs, alloc));
|
||||
RINOK(SzReadHashDigests(sd, (size_t)*numPackStreams, packCRCsDefined, packCRCs, alloc));
|
||||
continue;
|
||||
}
|
||||
RINOK(SzSkeepData(sd));
|
||||
@@ -562,7 +550,7 @@ static SRes SzGetNextFolderItem(CSzData *sd, CSzFolder *folder, ISzAlloc *alloc)
|
||||
{
|
||||
CBindPair *bindPair = folder->BindPairs + i;;
|
||||
RINOK(SzReadNumber32(sd, &bindPair->InIndex));
|
||||
RINOK(SzReadNumber32(sd, &bindPair->OutIndex));
|
||||
RINOK(SzReadNumber32(sd, &bindPair->OutIndex));
|
||||
}
|
||||
|
||||
numPackedStreams = numInStreams - (UInt32)numBindPairs;
|
||||
@@ -589,8 +577,8 @@ static SRes SzGetNextFolderItem(CSzData *sd, CSzFolder *folder, ISzAlloc *alloc)
|
||||
return SZ_OK;
|
||||
}
|
||||
|
||||
static SRes SzReadUnPackInfo(
|
||||
CSzData *sd,
|
||||
static SRes SzReadUnpackInfo(
|
||||
CSzData *sd,
|
||||
UInt32 *numFolders,
|
||||
CSzFolder **folders, /* for alloc */
|
||||
ISzAlloc *alloc,
|
||||
@@ -613,7 +601,7 @@ static SRes SzReadUnPackInfo(
|
||||
}
|
||||
}
|
||||
|
||||
RINOK(SzWaitAttribute(sd, k7zIdCodersUnPackSize));
|
||||
RINOK(SzWaitAttribute(sd, k7zIdCodersUnpackSize));
|
||||
|
||||
for (i = 0; i < *numFolders; i++)
|
||||
{
|
||||
@@ -621,11 +609,11 @@ static SRes SzReadUnPackInfo(
|
||||
CSzFolder *folder = (*folders) + i;
|
||||
UInt32 numOutStreams = SzFolder_GetNumOutStreams(folder);
|
||||
|
||||
MY_ALLOC(CFileSize, folder->UnPackSizes, (size_t)numOutStreams, alloc);
|
||||
MY_ALLOC(CFileSize, folder->UnpackSizes, (size_t)numOutStreams, alloc);
|
||||
|
||||
for (j = 0; j < numOutStreams; j++)
|
||||
{
|
||||
RINOK(SzReadSize(sd, folder->UnPackSizes + j));
|
||||
RINOK(SzReadSize(sd, folder->UnpackSizes + j));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -640,14 +628,14 @@ static SRes SzReadUnPackInfo(
|
||||
SRes res;
|
||||
Byte *crcsDefined = 0;
|
||||
UInt32 *crcs = 0;
|
||||
res = SzReadHashDigests(sd, *numFolders, &crcsDefined, &crcs, allocTemp);
|
||||
res = SzReadHashDigests(sd, *numFolders, &crcsDefined, &crcs, allocTemp);
|
||||
if (res == SZ_OK)
|
||||
{
|
||||
for (i = 0; i < *numFolders; i++)
|
||||
{
|
||||
CSzFolder *folder = (*folders) + i;
|
||||
folder->UnPackCRCDefined = crcsDefined[i];
|
||||
folder->UnPackCRC = crcs[i];
|
||||
folder->UnpackCRCDefined = crcsDefined[i];
|
||||
folder->UnpackCRC = crcs[i];
|
||||
}
|
||||
}
|
||||
IAlloc_Free(allocTemp, crcs);
|
||||
@@ -660,11 +648,11 @@ static SRes SzReadUnPackInfo(
|
||||
}
|
||||
|
||||
static SRes SzReadSubStreamsInfo(
|
||||
CSzData *sd,
|
||||
CSzData *sd,
|
||||
UInt32 numFolders,
|
||||
CSzFolder *folders,
|
||||
UInt32 *numUnPackStreams,
|
||||
CFileSize **unPackSizes,
|
||||
UInt32 *numUnpackStreams,
|
||||
CFileSize **unpackSizes,
|
||||
Byte **digestsDefined,
|
||||
UInt32 **digests,
|
||||
ISzAlloc *allocTemp)
|
||||
@@ -675,21 +663,21 @@ static SRes SzReadSubStreamsInfo(
|
||||
UInt32 numDigests = 0;
|
||||
|
||||
for (i = 0; i < numFolders; i++)
|
||||
folders[i].NumUnPackStreams = 1;
|
||||
*numUnPackStreams = numFolders;
|
||||
folders[i].NumUnpackStreams = 1;
|
||||
*numUnpackStreams = numFolders;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
RINOK(SzReadID(sd, &type));
|
||||
if (type == k7zIdNumUnPackStream)
|
||||
if (type == k7zIdNumUnpackStream)
|
||||
{
|
||||
*numUnPackStreams = 0;
|
||||
*numUnpackStreams = 0;
|
||||
for (i = 0; i < numFolders; i++)
|
||||
{
|
||||
UInt32 numStreams;
|
||||
RINOK(SzReadNumber32(sd, &numStreams));
|
||||
folders[i].NumUnPackStreams = numStreams;
|
||||
*numUnPackStreams += numStreams;
|
||||
folders[i].NumUnpackStreams = numStreams;
|
||||
*numUnpackStreams += numStreams;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@@ -700,19 +688,19 @@ static SRes SzReadSubStreamsInfo(
|
||||
RINOK(SzSkeepData(sd));
|
||||
}
|
||||
|
||||
if (*numUnPackStreams == 0)
|
||||
if (*numUnpackStreams == 0)
|
||||
{
|
||||
*unPackSizes = 0;
|
||||
*unpackSizes = 0;
|
||||
*digestsDefined = 0;
|
||||
*digests = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
*unPackSizes = (CFileSize *)IAlloc_Alloc(allocTemp, (size_t)*numUnPackStreams * sizeof(CFileSize));
|
||||
RINOM(*unPackSizes);
|
||||
*digestsDefined = (Byte *)IAlloc_Alloc(allocTemp, (size_t)*numUnPackStreams * sizeof(Byte));
|
||||
*unpackSizes = (CFileSize *)IAlloc_Alloc(allocTemp, (size_t)*numUnpackStreams * sizeof(CFileSize));
|
||||
RINOM(*unpackSizes);
|
||||
*digestsDefined = (Byte *)IAlloc_Alloc(allocTemp, (size_t)*numUnpackStreams * sizeof(Byte));
|
||||
RINOM(*digestsDefined);
|
||||
*digests = (UInt32 *)IAlloc_Alloc(allocTemp, (size_t)*numUnPackStreams * sizeof(UInt32));
|
||||
*digests = (UInt32 *)IAlloc_Alloc(allocTemp, (size_t)*numUnpackStreams * sizeof(UInt32));
|
||||
RINOM(*digests);
|
||||
}
|
||||
|
||||
@@ -724,7 +712,7 @@ static SRes SzReadSubStreamsInfo(
|
||||
*/
|
||||
CFileSize sum = 0;
|
||||
UInt32 j;
|
||||
UInt32 numSubstreams = folders[i].NumUnPackStreams;
|
||||
UInt32 numSubstreams = folders[i].NumUnpackStreams;
|
||||
if (numSubstreams == 0)
|
||||
continue;
|
||||
if (type == k7zIdSize)
|
||||
@@ -732,17 +720,17 @@ static SRes SzReadSubStreamsInfo(
|
||||
{
|
||||
CFileSize size;
|
||||
RINOK(SzReadSize(sd, &size));
|
||||
(*unPackSizes)[si++] = size;
|
||||
(*unpackSizes)[si++] = size;
|
||||
sum += size;
|
||||
}
|
||||
(*unPackSizes)[si++] = SzFolder_GetUnPackSize(folders + i) - sum;
|
||||
(*unpackSizes)[si++] = SzFolder_GetUnpackSize(folders + i) - sum;
|
||||
}
|
||||
if (type == k7zIdSize)
|
||||
{
|
||||
RINOK(SzReadID(sd, &type));
|
||||
}
|
||||
|
||||
for (i = 0; i < *numUnPackStreams; i++)
|
||||
for (i = 0; i < *numUnpackStreams; i++)
|
||||
{
|
||||
(*digestsDefined)[i] = 0;
|
||||
(*digests)[i] = 0;
|
||||
@@ -751,8 +739,8 @@ static SRes SzReadSubStreamsInfo(
|
||||
|
||||
for (i = 0; i < numFolders; i++)
|
||||
{
|
||||
UInt32 numSubstreams = folders[i].NumUnPackStreams;
|
||||
if (numSubstreams != 1 || !folders[i].UnPackCRCDefined)
|
||||
UInt32 numSubstreams = folders[i].NumUnpackStreams;
|
||||
if (numSubstreams != 1 || !folders[i].UnpackCRCDefined)
|
||||
numDigests += numSubstreams;
|
||||
}
|
||||
|
||||
@@ -763,7 +751,7 @@ static SRes SzReadSubStreamsInfo(
|
||||
if (type == k7zIdCRC)
|
||||
{
|
||||
int digestIndex = 0;
|
||||
Byte *digestsDefined2 = 0;
|
||||
Byte *digestsDefined2 = 0;
|
||||
UInt32 *digests2 = 0;
|
||||
SRes res = SzReadHashDigests(sd, numDigests, &digestsDefined2, &digests2, allocTemp);
|
||||
if (res == SZ_OK)
|
||||
@@ -771,11 +759,11 @@ static SRes SzReadSubStreamsInfo(
|
||||
for (i = 0; i < numFolders; i++)
|
||||
{
|
||||
CSzFolder *folder = folders + i;
|
||||
UInt32 numSubstreams = folder->NumUnPackStreams;
|
||||
if (numSubstreams == 1 && folder->UnPackCRCDefined)
|
||||
UInt32 numSubstreams = folder->NumUnpackStreams;
|
||||
if (numSubstreams == 1 && folder->UnpackCRCDefined)
|
||||
{
|
||||
(*digestsDefined)[si] = 1;
|
||||
(*digests)[si] = folder->UnPackCRC;
|
||||
(*digests)[si] = folder->UnpackCRC;
|
||||
si++;
|
||||
}
|
||||
else
|
||||
@@ -806,11 +794,11 @@ static SRes SzReadSubStreamsInfo(
|
||||
|
||||
|
||||
static SRes SzReadStreamsInfo(
|
||||
CSzData *sd,
|
||||
CSzData *sd,
|
||||
CFileSize *dataOffset,
|
||||
CSzAr *p,
|
||||
UInt32 *numUnPackStreams,
|
||||
CFileSize **unPackSizes, /* allocTemp */
|
||||
UInt32 *numUnpackStreams,
|
||||
CFileSize **unpackSizes, /* allocTemp */
|
||||
Byte **digestsDefined, /* allocTemp */
|
||||
UInt32 **digests, /* allocTemp */
|
||||
ISzAlloc *alloc,
|
||||
@@ -828,19 +816,19 @@ static SRes SzReadStreamsInfo(
|
||||
return SZ_OK;
|
||||
case k7zIdPackInfo:
|
||||
{
|
||||
RINOK(SzReadPackInfo(sd, dataOffset, &p->NumPackStreams,
|
||||
RINOK(SzReadPackInfo(sd, dataOffset, &p->NumPackStreams,
|
||||
&p->PackSizes, &p->PackCRCsDefined, &p->PackCRCs, alloc));
|
||||
break;
|
||||
}
|
||||
case k7zIdUnPackInfo:
|
||||
case k7zIdUnpackInfo:
|
||||
{
|
||||
RINOK(SzReadUnPackInfo(sd, &p->NumFolders, &p->Folders, alloc, allocTemp));
|
||||
RINOK(SzReadUnpackInfo(sd, &p->NumFolders, &p->Folders, alloc, allocTemp));
|
||||
break;
|
||||
}
|
||||
case k7zIdSubStreamsInfo:
|
||||
{
|
||||
RINOK(SzReadSubStreamsInfo(sd, p->NumFolders, p->Folders,
|
||||
numUnPackStreams, unPackSizes, digestsDefined, digests, allocTemp));
|
||||
RINOK(SzReadSubStreamsInfo(sd, p->NumFolders, p->Folders,
|
||||
numUnpackStreams, unpackSizes, digestsDefined, digests, allocTemp));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -928,18 +916,18 @@ static SRes SzReadFileNames(CSzData *sd, UInt32 numFiles, CSzFileItem *files, IS
|
||||
|
||||
static SRes SzReadHeader2(
|
||||
CSzArEx *p, /* allocMain */
|
||||
CSzData *sd,
|
||||
CFileSize **unPackSizes, /* allocTemp */
|
||||
CSzData *sd,
|
||||
CFileSize **unpackSizes, /* allocTemp */
|
||||
Byte **digestsDefined, /* allocTemp */
|
||||
UInt32 **digests, /* allocTemp */
|
||||
Byte **emptyStreamVector, /* allocTemp */
|
||||
Byte **emptyFileVector, /* allocTemp */
|
||||
Byte **lwtVector, /* allocTemp */
|
||||
ISzAlloc *allocMain,
|
||||
ISzAlloc *allocMain,
|
||||
ISzAlloc *allocTemp)
|
||||
{
|
||||
UInt64 type;
|
||||
UInt32 numUnPackStreams = 0;
|
||||
UInt32 numUnpackStreams = 0;
|
||||
UInt32 numFiles = 0;
|
||||
CSzFileItem *files = 0;
|
||||
UInt32 numEmptyStreams = 0;
|
||||
@@ -958,9 +946,9 @@ static SRes SzReadHeader2(
|
||||
{
|
||||
RINOK(SzReadStreamsInfo(sd,
|
||||
&p->ArchiveInfo.DataStartPosition,
|
||||
&p->db,
|
||||
&numUnPackStreams,
|
||||
unPackSizes,
|
||||
&p->db,
|
||||
&numUnpackStreams,
|
||||
unpackSizes,
|
||||
digestsDefined,
|
||||
digests, allocMain, allocTemp));
|
||||
p->ArchiveInfo.DataStartPosition += p->ArchiveInfo.StartPositionAfterHeader;
|
||||
@@ -1017,7 +1005,7 @@ static SRes SzReadHeader2(
|
||||
RINOK(SzReadBoolVector(sd, numEmptyStreams, emptyFileVector, allocTemp));
|
||||
break;
|
||||
}
|
||||
case k7zIdLastWriteTime:
|
||||
case k7zIdMTime:
|
||||
{
|
||||
RINOK(SzReadBoolVector2(sd, numFiles, lwtVector, allocTemp));
|
||||
RINOK(SzReadSwitch(sd));
|
||||
@@ -1025,12 +1013,12 @@ static SRes SzReadHeader2(
|
||||
{
|
||||
CSzFileItem *f = &files[i];
|
||||
Byte defined = (*lwtVector)[i];
|
||||
f->IsLastWriteTimeDefined = defined;
|
||||
f->LastWriteTime.Low = f->LastWriteTime.High = 0;
|
||||
f->MTimeDefined = defined;
|
||||
f->MTime.Low = f->MTime.High = 0;
|
||||
if (defined)
|
||||
{
|
||||
RINOK(SzReadUInt32(sd, &f->LastWriteTime.Low));
|
||||
RINOK(SzReadUInt32(sd, &f->LastWriteTime.High));
|
||||
RINOK(SzReadUInt32(sd, &f->MTime.Low));
|
||||
RINOK(SzReadUInt32(sd, &f->MTime.High));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1055,21 +1043,21 @@ static SRes SzReadHeader2(
|
||||
file->HasStream = (Byte)((*emptyStreamVector)[i] ? 0 : 1);
|
||||
if(file->HasStream)
|
||||
{
|
||||
file->IsDirectory = 0;
|
||||
file->Size = (*unPackSizes)[sizeIndex];
|
||||
file->IsDir = 0;
|
||||
file->Size = (*unpackSizes)[sizeIndex];
|
||||
file->FileCRC = (*digests)[sizeIndex];
|
||||
file->IsFileCRCDefined = (Byte)(*digestsDefined)[sizeIndex];
|
||||
file->FileCRCDefined = (Byte)(*digestsDefined)[sizeIndex];
|
||||
sizeIndex++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (*emptyFileVector == 0)
|
||||
file->IsDirectory = 1;
|
||||
file->IsDir = 1;
|
||||
else
|
||||
file->IsDirectory = (Byte)((*emptyFileVector)[emptyFileIndex] ? 0 : 1);
|
||||
file->IsDir = (Byte)((*emptyFileVector)[emptyFileIndex] ? 0 : 1);
|
||||
emptyFileIndex++;
|
||||
file->Size = 0;
|
||||
file->IsFileCRCDefined = 0;
|
||||
file->FileCRCDefined = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1077,50 +1065,50 @@ static SRes SzReadHeader2(
|
||||
}
|
||||
|
||||
static SRes SzReadHeader(
|
||||
CSzArEx *p,
|
||||
CSzData *sd,
|
||||
ISzAlloc *allocMain,
|
||||
CSzArEx *p,
|
||||
CSzData *sd,
|
||||
ISzAlloc *allocMain,
|
||||
ISzAlloc *allocTemp)
|
||||
{
|
||||
CFileSize *unPackSizes = 0;
|
||||
CFileSize *unpackSizes = 0;
|
||||
Byte *digestsDefined = 0;
|
||||
UInt32 *digests = 0;
|
||||
Byte *emptyStreamVector = 0;
|
||||
Byte *emptyFileVector = 0;
|
||||
Byte *lwtVector = 0;
|
||||
SRes res = SzReadHeader2(p, sd,
|
||||
&unPackSizes, &digestsDefined, &digests,
|
||||
&emptyStreamVector, &emptyFileVector, &lwtVector,
|
||||
&unpackSizes, &digestsDefined, &digests,
|
||||
&emptyStreamVector, &emptyFileVector, &lwtVector,
|
||||
allocMain, allocTemp);
|
||||
IAlloc_Free(allocTemp, unPackSizes);
|
||||
IAlloc_Free(allocTemp, unpackSizes);
|
||||
IAlloc_Free(allocTemp, digestsDefined);
|
||||
IAlloc_Free(allocTemp, digests);
|
||||
IAlloc_Free(allocTemp, emptyStreamVector);
|
||||
IAlloc_Free(allocTemp, emptyFileVector);
|
||||
IAlloc_Free(allocTemp, lwtVector);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
static SRes SzReadAndDecodePackedStreams2(
|
||||
ISzInStream *inStream,
|
||||
ISzInStream *inStream,
|
||||
CSzData *sd,
|
||||
CBuf *outBuffer,
|
||||
CFileSize baseOffset,
|
||||
CFileSize baseOffset,
|
||||
CSzAr *p,
|
||||
CFileSize **unPackSizes,
|
||||
CFileSize **unpackSizes,
|
||||
Byte **digestsDefined,
|
||||
UInt32 **digests,
|
||||
ISzAlloc *allocTemp)
|
||||
{
|
||||
|
||||
UInt32 numUnPackStreams = 0;
|
||||
UInt32 numUnpackStreams = 0;
|
||||
CFileSize dataStartPos;
|
||||
CSzFolder *folder;
|
||||
CFileSize unPackSize;
|
||||
CFileSize unpackSize;
|
||||
SRes res;
|
||||
|
||||
RINOK(SzReadStreamsInfo(sd, &dataStartPos, p,
|
||||
&numUnPackStreams, unPackSizes, digestsDefined, digests,
|
||||
&numUnpackStreams, unpackSizes, digestsDefined, digests,
|
||||
allocTemp, allocTemp));
|
||||
|
||||
dataStartPos += baseOffset;
|
||||
@@ -1128,41 +1116,41 @@ static SRes SzReadAndDecodePackedStreams2(
|
||||
return SZ_ERROR_ARCHIVE;
|
||||
|
||||
folder = p->Folders;
|
||||
unPackSize = SzFolder_GetUnPackSize(folder);
|
||||
unpackSize = SzFolder_GetUnpackSize(folder);
|
||||
|
||||
RINOK(inStream->Seek(inStream, dataStartPos, SZ_SEEK_SET));
|
||||
|
||||
if (!Buf_Create(outBuffer, (size_t)unPackSize, allocTemp))
|
||||
if (!Buf_Create(outBuffer, (size_t)unpackSize, allocTemp))
|
||||
return SZ_ERROR_MEM;
|
||||
|
||||
res = SzDecode(p->PackSizes, folder,
|
||||
inStream, dataStartPos,
|
||||
outBuffer->data, (size_t)unPackSize, allocTemp);
|
||||
res = SzDecode(p->PackSizes, folder,
|
||||
inStream, dataStartPos,
|
||||
outBuffer->data, (size_t)unpackSize, allocTemp);
|
||||
RINOK(res);
|
||||
if (folder->UnPackCRCDefined)
|
||||
if (CrcCalc(outBuffer->data, (size_t)unPackSize) != folder->UnPackCRC)
|
||||
if (folder->UnpackCRCDefined)
|
||||
if (CrcCalc(outBuffer->data, (size_t)unpackSize) != folder->UnpackCRC)
|
||||
return SZ_ERROR_CRC;
|
||||
return SZ_OK;
|
||||
}
|
||||
|
||||
static SRes SzReadAndDecodePackedStreams(
|
||||
ISzInStream *inStream,
|
||||
ISzInStream *inStream,
|
||||
CSzData *sd,
|
||||
CBuf *outBuffer,
|
||||
CFileSize baseOffset,
|
||||
CFileSize baseOffset,
|
||||
ISzAlloc *allocTemp)
|
||||
{
|
||||
CSzAr p;
|
||||
CFileSize *unPackSizes = 0;
|
||||
CFileSize *unpackSizes = 0;
|
||||
Byte *digestsDefined = 0;
|
||||
UInt32 *digests = 0;
|
||||
SRes res;
|
||||
SzAr_Init(&p);
|
||||
res = SzReadAndDecodePackedStreams2(inStream, sd, outBuffer, baseOffset,
|
||||
&p, &unPackSizes, &digestsDefined, &digests,
|
||||
res = SzReadAndDecodePackedStreams2(inStream, sd, outBuffer, baseOffset,
|
||||
&p, &unpackSizes, &digestsDefined, &digests,
|
||||
allocTemp);
|
||||
SzAr_Free(&p, allocTemp);
|
||||
IAlloc_Free(allocTemp, unPackSizes);
|
||||
IAlloc_Free(allocTemp, unpackSizes);
|
||||
IAlloc_Free(allocTemp, digestsDefined);
|
||||
IAlloc_Free(allocTemp, digests);
|
||||
return res;
|
||||
@@ -1170,8 +1158,8 @@ static SRes SzReadAndDecodePackedStreams(
|
||||
|
||||
static SRes SzArEx_Open2(
|
||||
CSzArEx *p,
|
||||
ISzInStream *inStream,
|
||||
ISzAlloc *allocMain,
|
||||
ISzInStream *inStream,
|
||||
ISzAlloc *allocMain,
|
||||
ISzAlloc *allocTemp)
|
||||
{
|
||||
Byte signature[k7zSignatureSize];
|
||||
@@ -1249,8 +1237,8 @@ static SRes SzArEx_Open2(
|
||||
{
|
||||
CBuf outBuffer;
|
||||
Buf_Init(&outBuffer);
|
||||
res = SzReadAndDecodePackedStreams(inStream, &sd, &outBuffer,
|
||||
p->ArchiveInfo.StartPositionAfterHeader,
|
||||
res = SzReadAndDecodePackedStreams(inStream, &sd, &outBuffer,
|
||||
p->ArchiveInfo.StartPositionAfterHeader,
|
||||
allocTemp);
|
||||
if (res != SZ_OK)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* 7zIn.h -- 7z Input functions
|
||||
2008-05-05
|
||||
2008-08-05
|
||||
Igor Pavlov
|
||||
Copyright (c) 1999-2008 Igor Pavlov
|
||||
Read 7zItem.h for license options */
|
||||
@@ -12,7 +12,7 @@ Read 7zItem.h for license options */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CFileSize StartPositionAfterHeader;
|
||||
CFileSize StartPositionAfterHeader;
|
||||
CFileSize DataStartPosition;
|
||||
} CInArchiveInfo;
|
||||
|
||||
@@ -31,7 +31,7 @@ void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc);
|
||||
CFileSize SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder);
|
||||
int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, CFileSize *resSize);
|
||||
|
||||
typedef enum
|
||||
typedef enum
|
||||
{
|
||||
SZ_SEEK_SET = 0,
|
||||
SZ_SEEK_CUR = 1,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* 7zItem.c -- 7z Items
|
||||
2008-04-09
|
||||
2008-08-05
|
||||
Igor Pavlov
|
||||
Copyright (c) 1999-2008 Igor Pavlov
|
||||
Read 7zItem.h for license options */
|
||||
@@ -22,13 +22,13 @@ void SzFolder_Init(CSzFolder *p)
|
||||
p->Coders = 0;
|
||||
p->BindPairs = 0;
|
||||
p->PackStreams = 0;
|
||||
p->UnPackSizes = 0;
|
||||
p->UnpackSizes = 0;
|
||||
p->NumCoders = 0;
|
||||
p->NumBindPairs = 0;
|
||||
p->NumPackStreams = 0;
|
||||
p->UnPackCRCDefined = 0;
|
||||
p->UnPackCRC = 0;
|
||||
p->NumUnPackStreams = 0;
|
||||
p->UnpackCRCDefined = 0;
|
||||
p->UnpackCRC = 0;
|
||||
p->NumUnpackStreams = 0;
|
||||
}
|
||||
|
||||
void SzFolder_Free(CSzFolder *p, ISzAlloc *alloc)
|
||||
@@ -40,7 +40,7 @@ void SzFolder_Free(CSzFolder *p, ISzAlloc *alloc)
|
||||
IAlloc_Free(alloc, p->Coders);
|
||||
IAlloc_Free(alloc, p->BindPairs);
|
||||
IAlloc_Free(alloc, p->PackStreams);
|
||||
IAlloc_Free(alloc, p->UnPackSizes);
|
||||
IAlloc_Free(alloc, p->UnpackSizes);
|
||||
SzFolder_Init(p);
|
||||
}
|
||||
|
||||
@@ -72,25 +72,25 @@ int SzFolder_FindBindPairForOutStream(CSzFolder *p, UInt32 outStreamIndex)
|
||||
return -1;
|
||||
}
|
||||
|
||||
CFileSize SzFolder_GetUnPackSize(CSzFolder *p)
|
||||
{
|
||||
CFileSize SzFolder_GetUnpackSize(CSzFolder *p)
|
||||
{
|
||||
int i = (int)SzFolder_GetNumOutStreams(p);
|
||||
if (i == 0)
|
||||
return 0;
|
||||
for (i--; i >= 0; i--)
|
||||
if (SzFolder_FindBindPairForOutStream(p, i) < 0)
|
||||
return p->UnPackSizes[i];
|
||||
return p->UnpackSizes[i];
|
||||
/* throw 1; */
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SzFile_Init(CSzFileItem *p)
|
||||
{
|
||||
p->IsFileCRCDefined = 0;
|
||||
p->HasStream = 1;
|
||||
p->IsDirectory = 0;
|
||||
p->IsDir = 0;
|
||||
p->IsAnti = 0;
|
||||
p->IsLastWriteTimeDefined = 0;
|
||||
p->FileCRCDefined = 0;
|
||||
p->MTimeDefined = 0;
|
||||
p->Name = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* 7zItem.h -- 7z Items
|
||||
2008-05-01
|
||||
2008-07-09
|
||||
Igor Pavlov
|
||||
Copyright (c) 1999-2008 Igor Pavlov
|
||||
Read LzmaDec.h for license options */
|
||||
@@ -13,9 +13,9 @@ Read LzmaDec.h for license options */
|
||||
/* You can define _SZ_FILE_SIZE_32, if you don't need support for files larger than 4 GB*/
|
||||
|
||||
#ifdef _SZ_FILE_SIZE_32
|
||||
typedef UInt32 CFileSize;
|
||||
typedef UInt32 CFileSize;
|
||||
#else
|
||||
typedef UInt64 CFileSize;
|
||||
typedef UInt64 CFileSize;
|
||||
#endif
|
||||
|
||||
typedef UInt64 CMethodID;
|
||||
@@ -42,21 +42,21 @@ typedef struct
|
||||
CSzCoderInfo *Coders;
|
||||
CBindPair *BindPairs;
|
||||
UInt32 *PackStreams;
|
||||
CFileSize *UnPackSizes;
|
||||
CFileSize *UnpackSizes;
|
||||
UInt32 NumCoders;
|
||||
UInt32 NumBindPairs;
|
||||
UInt32 NumPackStreams;
|
||||
int UnPackCRCDefined;
|
||||
UInt32 UnPackCRC;
|
||||
UInt32 NumPackStreams;
|
||||
int UnpackCRCDefined;
|
||||
UInt32 UnpackCRC;
|
||||
|
||||
UInt32 NumUnPackStreams;
|
||||
UInt32 NumUnpackStreams;
|
||||
} CSzFolder;
|
||||
|
||||
void SzFolder_Init(CSzFolder *p);
|
||||
CFileSize SzFolder_GetUnPackSize(CSzFolder *p);
|
||||
CFileSize SzFolder_GetUnpackSize(CSzFolder *p);
|
||||
int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex);
|
||||
UInt32 SzFolder_GetNumOutStreams(CSzFolder *p);
|
||||
CFileSize SzFolder_GetUnPackSize(CSzFolder *p);
|
||||
CFileSize SzFolder_GetUnpackSize(CSzFolder *p);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -66,25 +66,16 @@ typedef struct
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CNtfsFileTime LastWriteTime;
|
||||
/*
|
||||
CFileSize StartPos;
|
||||
UInt32 Attributes;
|
||||
*/
|
||||
CNtfsFileTime MTime;
|
||||
CFileSize Size;
|
||||
char *Name;
|
||||
UInt32 FileCRC;
|
||||
|
||||
Byte IsFileCRCDefined;
|
||||
Byte HasStream;
|
||||
Byte IsDirectory;
|
||||
Byte IsDir;
|
||||
Byte IsAnti;
|
||||
Byte IsLastWriteTimeDefined;
|
||||
/*
|
||||
int AreAttributesDefined;
|
||||
int IsLastWriteTimeDefined;
|
||||
int IsStartPosDefined;
|
||||
*/
|
||||
Byte FileCRCDefined;
|
||||
Byte MTimeDefined;
|
||||
} CSzFileItem;
|
||||
|
||||
void SzFile_Init(CSzFileItem *p);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* 7zMain.c - Test application for 7z Decoder
|
||||
2008-04-09
|
||||
2008-08-05
|
||||
Igor Pavlov
|
||||
Public domain */
|
||||
|
||||
@@ -32,7 +32,7 @@ void ConvertNumberToString(CFileSize value, char *s)
|
||||
{
|
||||
char temp[32];
|
||||
int pos = 0;
|
||||
do
|
||||
do
|
||||
{
|
||||
temp[pos++] = (char)('0' + (int)(value % 10));
|
||||
value /= 10;
|
||||
@@ -54,7 +54,7 @@ void ConvertFileTimeToString(CNtfsFileTime *ft, char *s)
|
||||
UInt64 v64 = ft->Low | ((UInt64)ft->High << 32);
|
||||
Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||
unsigned temp;
|
||||
UInt32 v;
|
||||
UInt32 v;
|
||||
v64 /= 10000000;
|
||||
sec = (unsigned)(v64 % 60);
|
||||
v64 /= 60;
|
||||
@@ -103,15 +103,15 @@ void ConvertFileTimeToString(CNtfsFileTime *ft, char *s)
|
||||
#ifdef USE_WINDOWS_FUNCTIONS
|
||||
/*
|
||||
ReadFile and WriteFile functions in Windows have BUG:
|
||||
If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1)
|
||||
from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES
|
||||
If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1)
|
||||
from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES
|
||||
(Insufficient system resources exist to complete the requested service).
|
||||
*/
|
||||
#define kChunkSizeMax (1 << 24)
|
||||
#endif
|
||||
|
||||
size_t MyReadFile(MY_FILE_HANDLE file, void *data, size_t size)
|
||||
{
|
||||
{
|
||||
if (size == 0)
|
||||
return 0;
|
||||
#ifdef USE_WINDOWS_FUNCTIONS
|
||||
@@ -132,12 +132,12 @@ size_t MyReadFile(MY_FILE_HANDLE file, void *data, size_t size)
|
||||
return processedSize;
|
||||
}
|
||||
#else
|
||||
return fread(data, 1, size, file);
|
||||
return fread(data, 1, size, file);
|
||||
#endif
|
||||
}
|
||||
|
||||
size_t MyWriteFile(MY_FILE_HANDLE file, void *data, size_t size)
|
||||
{
|
||||
{
|
||||
if (size == 0)
|
||||
return 0;
|
||||
#ifdef USE_WINDOWS_FUNCTIONS
|
||||
@@ -158,16 +158,16 @@ size_t MyWriteFile(MY_FILE_HANDLE file, void *data, size_t size)
|
||||
return processedSize;
|
||||
}
|
||||
#else
|
||||
return fwrite(data, 1, size, file);
|
||||
return fwrite(data, 1, size, file);
|
||||
#endif
|
||||
}
|
||||
|
||||
int MyCloseFile(MY_FILE_HANDLE file)
|
||||
{
|
||||
{
|
||||
#ifdef USE_WINDOWS_FUNCTIONS
|
||||
return (CloseHandle(file) != FALSE) ? 0 : 1;
|
||||
#else
|
||||
return fclose(file);
|
||||
return fclose(file);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -205,7 +205,7 @@ SRes SzFileSeekImp(void *object, CFileSize pos, ESzSeek origin)
|
||||
/* VC 6.0 has bug with >> 32 shifts. */
|
||||
value.HighPart = 0;
|
||||
#endif
|
||||
switch (origin)
|
||||
switch (origin)
|
||||
{
|
||||
case SZ_SEEK_SET: moveMethod = FILE_BEGIN; break;
|
||||
case SZ_SEEK_CUR: moveMethod = FILE_CURRENT; break;
|
||||
@@ -214,14 +214,14 @@ SRes SzFileSeekImp(void *object, CFileSize pos, ESzSeek origin)
|
||||
}
|
||||
value.LowPart = SetFilePointer(s->File, value.LowPart, &value.HighPart, moveMethod);
|
||||
if (value.LowPart == 0xFFFFFFFF)
|
||||
if (GetLastError() != NO_ERROR)
|
||||
if (GetLastError() != NO_ERROR)
|
||||
return SZ_ERROR_FAIL;
|
||||
return SZ_OK;
|
||||
}
|
||||
#else
|
||||
int moveMethod;
|
||||
int res;
|
||||
switch (origin)
|
||||
switch (origin)
|
||||
{
|
||||
case SZ_SEEK_SET: moveMethod = SEEK_SET; break;
|
||||
case SZ_SEEK_CUR: moveMethod = SEEK_CUR; break;
|
||||
@@ -246,7 +246,7 @@ int MY_CDECL main(int numargs, char *args[])
|
||||
ISzAlloc allocImp;
|
||||
ISzAlloc allocTempImp;
|
||||
|
||||
printf("\n7z ANSI-C Decoder 4.58 Copyright (c) 1999-2008 Igor Pavlov 2008-04-09\n");
|
||||
printf("\n7z ANSI-C Decoder 4.59 Copyright (c) 1999-2008 Igor Pavlov 2008-07-09\n");
|
||||
if (numargs == 1)
|
||||
{
|
||||
printf(
|
||||
@@ -263,9 +263,9 @@ int MY_CDECL main(int numargs, char *args[])
|
||||
return 1;
|
||||
}
|
||||
|
||||
archiveStream.File =
|
||||
archiveStream.File =
|
||||
#ifdef USE_WINDOWS_FUNCTIONS
|
||||
CreateFileA(args[2], GENERIC_READ, FILE_SHARE_READ,
|
||||
CreateFileA(args[2], GENERIC_READ, FILE_SHARE_READ,
|
||||
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (archiveStream.File == INVALID_HANDLE_VALUE)
|
||||
#else
|
||||
@@ -311,8 +311,8 @@ int MY_CDECL main(int numargs, char *args[])
|
||||
CSzFileItem *f = db.db.Files + i;
|
||||
char s[32], t[32];
|
||||
ConvertNumberToString(f->Size, s);
|
||||
if (f->IsLastWriteTimeDefined)
|
||||
ConvertFileTimeToString(&f->LastWriteTime, t);
|
||||
if (f->MTimeDefined)
|
||||
ConvertFileTimeToString(&f->MTime, t);
|
||||
else
|
||||
strcpy(t, " ");
|
||||
|
||||
@@ -337,21 +337,21 @@ int MY_CDECL main(int numargs, char *args[])
|
||||
size_t offset;
|
||||
size_t outSizeProcessed;
|
||||
CSzFileItem *f = db.db.Files + i;
|
||||
if (f->IsDirectory)
|
||||
if (f->IsDir)
|
||||
printf("Directory ");
|
||||
else
|
||||
printf(testCommand ?
|
||||
printf(testCommand ?
|
||||
"Testing ":
|
||||
"Extracting");
|
||||
printf(" %s", f->Name);
|
||||
if (f->IsDirectory)
|
||||
if (f->IsDir)
|
||||
{
|
||||
printf("\n");
|
||||
continue;
|
||||
}
|
||||
res = SzAr_Extract(&db, &archiveStream.InStream, i,
|
||||
&blockIndex, &outBuffer, &outBufferSize,
|
||||
&offset, &outSizeProcessed,
|
||||
res = SzAr_Extract(&db, &archiveStream.InStream, i,
|
||||
&blockIndex, &outBuffer, &outBufferSize,
|
||||
&offset, &outSizeProcessed,
|
||||
&allocImp, &allocTempImp);
|
||||
if (res != SZ_OK)
|
||||
break;
|
||||
@@ -368,9 +368,9 @@ int MY_CDECL main(int numargs, char *args[])
|
||||
break;
|
||||
}
|
||||
|
||||
outputHandle =
|
||||
outputHandle =
|
||||
#ifdef USE_WINDOWS_FUNCTIONS
|
||||
CreateFileA(fileName, GENERIC_WRITE, FILE_SHARE_READ,
|
||||
CreateFileA(fileName, GENERIC_WRITE, FILE_SHARE_READ,
|
||||
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (outputHandle == INVALID_HANDLE_VALUE)
|
||||
#else
|
||||
@@ -420,7 +420,7 @@ int MY_CDECL main(int numargs, char *args[])
|
||||
PrintError("can not allocate memory");
|
||||
else if (res == SZ_ERROR_CRC)
|
||||
PrintError("CRC error");
|
||||
else
|
||||
else
|
||||
printf("\nERROR #%d\n", res);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
PROG = 7zDec
|
||||
CXX = g++
|
||||
LIB =
|
||||
LIB =
|
||||
RM = rm -f
|
||||
CFLAGS = -c -O2 -Wall
|
||||
|
||||
|
||||
Reference in New Issue
Block a user