mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-07 13:15:04 -06:00
17.00
This commit is contained in:
@@ -7,6 +7,8 @@
|
||||
|
||||
#include "../../Common/ComTry.h"
|
||||
|
||||
#include "../Common/CWrappers.h"
|
||||
|
||||
#include "DeflateEncoder.h"
|
||||
|
||||
#undef NO_INLINE
|
||||
@@ -262,19 +264,19 @@ NO_INLINE void CCoder::GetMatches()
|
||||
UInt32 i;
|
||||
for (i = 0; i < numPairs; i += 2)
|
||||
{
|
||||
m_MatchDistances[i + 1] = (UInt16)distanceTmp[i];
|
||||
m_MatchDistances[i + 2] = (UInt16)distanceTmp[i + 1];
|
||||
m_MatchDistances[(size_t)i + 1] = (UInt16)distanceTmp[i];
|
||||
m_MatchDistances[(size_t)i + 2] = (UInt16)distanceTmp[(size_t)i + 1];
|
||||
}
|
||||
UInt32 len = distanceTmp[numPairs - 2];
|
||||
UInt32 len = distanceTmp[(size_t)numPairs - 2];
|
||||
if (len == m_NumFastBytes && m_NumFastBytes != m_MatchMaxLen)
|
||||
{
|
||||
UInt32 numAvail = Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) + 1;
|
||||
const Byte *pby = Inline_MatchFinder_GetPointerToCurrentPos(&_lzInWindow) - 1;
|
||||
const Byte *pby2 = pby - (distanceTmp[numPairs - 1] + 1);
|
||||
const Byte *pby2 = pby - (distanceTmp[(size_t)numPairs - 1] + 1);
|
||||
if (numAvail > m_MatchMaxLen)
|
||||
numAvail = m_MatchMaxLen;
|
||||
for (; len < numAvail && pby[len] == pby2[len]; len++);
|
||||
m_MatchDistances[i - 1] = (UInt16)len;
|
||||
m_MatchDistances[(size_t)i - 1] = (UInt16)len;
|
||||
}
|
||||
}
|
||||
if (m_IsMultiPass)
|
||||
@@ -337,11 +339,11 @@ NO_INLINE UInt32 CCoder::GetOptimal(UInt32 &backRes)
|
||||
if (numDistancePairs == 0)
|
||||
return 1;
|
||||
const UInt16 *matchDistances = m_MatchDistances + 1;
|
||||
lenEnd = matchDistances[numDistancePairs - 2];
|
||||
lenEnd = matchDistances[(size_t)numDistancePairs - 2];
|
||||
|
||||
if (lenEnd > m_NumFastBytes)
|
||||
{
|
||||
backRes = matchDistances[numDistancePairs - 1];
|
||||
backRes = matchDistances[(size_t)numDistancePairs - 1];
|
||||
MovePos(lenEnd - 1);
|
||||
return lenEnd;
|
||||
}
|
||||
@@ -356,10 +358,10 @@ NO_INLINE UInt32 CCoder::GetOptimal(UInt32 &backRes)
|
||||
|
||||
for (UInt32 i = kMatchMinLen; i <= lenEnd; i++)
|
||||
{
|
||||
UInt32 distance = matchDistances[offs + 1];
|
||||
UInt32 distance = matchDistances[(size_t)offs + 1];
|
||||
m_Optimum[i].PosPrev = 0;
|
||||
m_Optimum[i].BackPrev = (UInt16)distance;
|
||||
m_Optimum[i].Price = m_LenPrices[i - kMatchMinLen] + m_PosPrices[GetPosSlot(distance)];
|
||||
m_Optimum[i].Price = m_LenPrices[(size_t)i - kMatchMinLen] + m_PosPrices[GetPosSlot(distance)];
|
||||
if (i == matchDistances[offs])
|
||||
offs += 2;
|
||||
}
|
||||
@@ -378,11 +380,11 @@ NO_INLINE UInt32 CCoder::GetOptimal(UInt32 &backRes)
|
||||
UInt32 newLen = 0;
|
||||
if (numDistancePairs != 0)
|
||||
{
|
||||
newLen = matchDistances[numDistancePairs - 2];
|
||||
newLen = matchDistances[(size_t)numDistancePairs - 2];
|
||||
if (newLen > m_NumFastBytes)
|
||||
{
|
||||
UInt32 len = Backward(backRes, cur);
|
||||
m_Optimum[cur].BackPrev = matchDistances[numDistancePairs - 1];
|
||||
m_Optimum[cur].BackPrev = matchDistances[(size_t)numDistancePairs - 1];
|
||||
m_OptimumEndIndex = cur + newLen;
|
||||
m_Optimum[cur].PosPrev = (UInt16)m_OptimumEndIndex;
|
||||
MovePos(newLen - 1);
|
||||
@@ -392,7 +394,7 @@ NO_INLINE UInt32 CCoder::GetOptimal(UInt32 &backRes)
|
||||
UInt32 curPrice = m_Optimum[cur].Price;
|
||||
{
|
||||
const UInt32 curAnd1Price = curPrice + m_LiteralPrices[*(Inline_MatchFinder_GetPointerToCurrentPos(&_lzInWindow) + cur - m_AdditionalOffset)];
|
||||
COptimal &optimum = m_Optimum[cur + 1];
|
||||
COptimal &optimum = m_Optimum[(size_t)cur + 1];
|
||||
if (curAnd1Price < optimum.Price)
|
||||
{
|
||||
optimum.Price = curAnd1Price;
|
||||
@@ -404,11 +406,11 @@ NO_INLINE UInt32 CCoder::GetOptimal(UInt32 &backRes)
|
||||
while (lenEnd < cur + newLen)
|
||||
m_Optimum[++lenEnd].Price = kIfinityPrice;
|
||||
UInt32 offs = 0;
|
||||
UInt32 distance = matchDistances[offs + 1];
|
||||
UInt32 distance = matchDistances[(size_t)offs + 1];
|
||||
curPrice += m_PosPrices[GetPosSlot(distance)];
|
||||
for (UInt32 lenTest = kMatchMinLen; ; lenTest++)
|
||||
{
|
||||
UInt32 curAndLenPrice = curPrice + m_LenPrices[lenTest - kMatchMinLen];
|
||||
UInt32 curAndLenPrice = curPrice + m_LenPrices[(size_t)lenTest - kMatchMinLen];
|
||||
COptimal &optimum = m_Optimum[cur + lenTest];
|
||||
if (curAndLenPrice < optimum.Price)
|
||||
{
|
||||
@@ -422,7 +424,7 @@ NO_INLINE UInt32 CCoder::GetOptimal(UInt32 &backRes)
|
||||
if (offs == numDistancePairs)
|
||||
break;
|
||||
curPrice -= m_PosPrices[GetPosSlot(distance)];
|
||||
distance = matchDistances[offs + 1];
|
||||
distance = matchDistances[(size_t)offs + 1];
|
||||
curPrice += m_PosPrices[GetPosSlot(distance)];
|
||||
}
|
||||
}
|
||||
@@ -435,7 +437,7 @@ UInt32 CCoder::GetOptimalFast(UInt32 &backRes)
|
||||
UInt32 numDistancePairs = m_MatchDistances[0];
|
||||
if (numDistancePairs == 0)
|
||||
return 1;
|
||||
UInt32 lenMain = m_MatchDistances[numDistancePairs - 1];
|
||||
UInt32 lenMain = m_MatchDistances[(size_t)numDistancePairs - 1];
|
||||
backRes = m_MatchDistances[numDistancePairs];
|
||||
MovePos(lenMain - 1);
|
||||
return lenMain;
|
||||
@@ -470,7 +472,7 @@ NO_INLINE void CCoder::LevelTableDummy(const Byte *levels, unsigned numLevels, U
|
||||
for (unsigned n = 0; n < numLevels; n++)
|
||||
{
|
||||
unsigned curLen = nextLen;
|
||||
nextLen = (n < numLevels - 1) ? levels[n + 1] : 0xFF;
|
||||
nextLen = (n < numLevels - 1) ? levels[(size_t)n + 1] : 0xFF;
|
||||
count++;
|
||||
if (count < maxCount && curLen == nextLen)
|
||||
continue;
|
||||
@@ -537,7 +539,7 @@ NO_INLINE void CCoder::LevelTableCode(const Byte *levels, unsigned numLevels, co
|
||||
for (unsigned n = 0; n < numLevels; n++)
|
||||
{
|
||||
unsigned curLen = nextLen;
|
||||
nextLen = (n < numLevels - 1) ? levels[n + 1] : 0xFF;
|
||||
nextLen = (n < numLevels - 1) ? levels[(size_t)n + 1] : 0xFF;
|
||||
count++;
|
||||
if (count < maxCount && curLen == nextLen)
|
||||
continue;
|
||||
@@ -642,7 +644,7 @@ NO_INLINE void CCoder::TryBlock()
|
||||
{
|
||||
UInt32 newLen = len - kMatchMinLen;
|
||||
codeValue.Len = (UInt16)newLen;
|
||||
mainFreqs[kSymbolMatch + g_LenSlots[newLen]]++;
|
||||
mainFreqs[kSymbolMatch + (size_t)g_LenSlots[newLen]]++;
|
||||
codeValue.Pos = (UInt16)pos;
|
||||
distFreqs[GetPosSlot(pos)]++;
|
||||
}
|
||||
@@ -675,7 +677,7 @@ NO_INLINE void CCoder::SetPrices(const CLevels &levels)
|
||||
for (i = 0; i < m_NumLenCombinations; i++)
|
||||
{
|
||||
UInt32 slot = g_LenSlots[i];
|
||||
Byte price = levels.litLenLevels[kSymbolMatch + slot];
|
||||
Byte price = levels.litLenLevels[kSymbolMatch + (size_t)slot];
|
||||
m_LenPrices[i] = (Byte)(((price != 0) ? price : kNoLenStatPrice) + m_LenDirectBits[slot]);
|
||||
}
|
||||
|
||||
@@ -780,11 +782,11 @@ NO_INLINE UInt32 CCoder::TryDynBlock(unsigned tableIndex, UInt32 numPasses)
|
||||
(CLevels &)t = m_NewLevels;
|
||||
|
||||
m_NumLitLenLevels = kMainTableSize;
|
||||
while (m_NumLitLenLevels > kNumLitLenCodesMin && m_NewLevels.litLenLevels[m_NumLitLenLevels - 1] == 0)
|
||||
while (m_NumLitLenLevels > kNumLitLenCodesMin && m_NewLevels.litLenLevels[(size_t)m_NumLitLenLevels - 1] == 0)
|
||||
m_NumLitLenLevels--;
|
||||
|
||||
m_NumDistLevels = kDistTableSize64;
|
||||
while (m_NumDistLevels > kNumDistCodesMin && m_NewLevels.distLevels[m_NumDistLevels - 1] == 0)
|
||||
while (m_NumDistLevels > kNumDistCodesMin && m_NewLevels.distLevels[(size_t)m_NumDistLevels - 1] == 0)
|
||||
m_NumDistLevels--;
|
||||
|
||||
UInt32 levelFreqs[kLevelTableSize];
|
||||
@@ -923,14 +925,6 @@ void CCoder::CodeBlock(unsigned tableIndex, bool finalBlock)
|
||||
}
|
||||
}
|
||||
|
||||
SRes Read(void *object, void *data, size_t *size)
|
||||
{
|
||||
const UInt32 kStepSize = (UInt32)1 << 31;
|
||||
UInt32 curSize = ((*size < kStepSize) ? (UInt32)*size : kStepSize);
|
||||
HRESULT res = ((CSeqInStream *)object)->RealStream->Read(data, curSize, &curSize);
|
||||
*size = curSize;
|
||||
return (SRes)res;
|
||||
}
|
||||
|
||||
HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
|
||||
const UInt64 * /* inSize */ , const UInt64 * /* outSize */ , ICompressProgressInfo *progress)
|
||||
@@ -944,9 +938,11 @@ HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *ou
|
||||
|
||||
UInt64 nowPos = 0;
|
||||
|
||||
_seqInStream.RealStream = inStream;
|
||||
_seqInStream.SeqInStream.Read = Read;
|
||||
_lzInWindow.stream = &_seqInStream.SeqInStream;
|
||||
CSeqInStreamWrap _seqInStream;
|
||||
|
||||
_seqInStream.Init(inStream);
|
||||
|
||||
_lzInWindow.stream = &_seqInStream.vt;
|
||||
|
||||
MatchFinder_Init(&_lzInWindow);
|
||||
m_OutStream.SetStream(outStream);
|
||||
@@ -974,7 +970,7 @@ HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *ou
|
||||
}
|
||||
while (Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) != 0);
|
||||
if (_lzInWindow.result != SZ_OK)
|
||||
return _lzInWindow.result;
|
||||
return SResToHRESULT(_lzInWindow.result);
|
||||
return m_OutStream.Flush();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user