static UInt32 NO_INLINE DecodeBlock2Rand(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream) { CBZip2Crc crc; UInt32 randIndex = 1; UInt32 randToGo = kRandNums[0] - 2; unsigned numReps = 0; // it's for speed optimization: prefetch & prevByte_init; UInt32 tPos = tt[tt[OrigPtr] >> 8]; unsigned prevByte = (unsigned)(tPos & 0xFF); do { unsigned b = (unsigned)(tPos & 0xFF); tPos = tt[tPos >> 8]; { if (randToGo == 0) { b ^= 1; randToGo = kRandNums[randIndex++]; randIndex &= 0x1FF; } randToGo--; } if (numReps == kRleModeRepSize) { for (; b > 0; b--) { crc.UpdateByte(prevByte); m_OutStream.WriteByte((Byte)prevByte); } numReps = 0; continue; } if (b != prevByte) numReps = 0; numReps++; prevByte = b; crc.UpdateByte(b); m_OutStream.WriteByte((Byte)b); } while (--blockSize != 0); return crc.GetDigest(); }
// blockSize > 0 UInt32 CThreadInfo::EncodeBlockWithHeaders(const Byte *block, UInt32 blockSize) { WriteByte2(kBlockSig0); WriteByte2(kBlockSig1); WriteByte2(kBlockSig2); WriteByte2(kBlockSig3); WriteByte2(kBlockSig4); WriteByte2(kBlockSig5); CBZip2Crc crc; int numReps = 0; Byte prevByte = block[0]; UInt32 i = 0; do { Byte b = block[i]; if (numReps == kRleModeRepSize) { for (; b > 0; b--) crc.UpdateByte(prevByte); numReps = 0; continue; } if (prevByte == b) numReps++; else { numReps = 1; prevByte = b; } crc.UpdateByte(b); } while (++i < blockSize); UInt32 crcRes = crc.GetDigest(); WriteCrc2(crcRes); EncodeBlock(block, blockSize); return crcRes; }
static UInt32 NO_INLINE DecodeBlock2(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream) { CBZip2Crc crc; // it's for speed optimization: prefetch & prevByte_init; UInt32 tPos = tt[tt[OrigPtr] >> 8]; unsigned prevByte = (unsigned)(tPos & 0xFF); unsigned numReps = 0; do { unsigned b = (unsigned)(tPos & 0xFF); tPos = tt[tPos >> 8]; if (numReps == kRleModeRepSize) { for (; b > 0; b--) { crc.UpdateByte(prevByte); m_OutStream.WriteByte((Byte)prevByte); } numReps = 0; continue; } if (b != prevByte) numReps = 0; numReps++; prevByte = b; crc.UpdateByte(b); m_OutStream.WriteByte((Byte)b); /* prevByte = b; crc.UpdateByte(b); m_OutStream.WriteByte((Byte)b); for (; --blockSize != 0;) { b = (unsigned)(tPos & 0xFF); tPos = tt[tPos >> 8]; crc.UpdateByte(b); m_OutStream.WriteByte((Byte)b); if (b != prevByte) { prevByte = b; continue; } if (--blockSize == 0) break; b = (unsigned)(tPos & 0xFF); tPos = tt[tPos >> 8]; crc.UpdateByte(b); m_OutStream.WriteByte((Byte)b); if (b != prevByte) { prevByte = b; continue; } if (--blockSize == 0) break; b = (unsigned)(tPos & 0xFF); tPos = tt[tPos >> 8]; crc.UpdateByte(b); m_OutStream.WriteByte((Byte)b); if (b != prevByte) { prevByte = b; continue; } --blockSize; break; } if (blockSize == 0) break; b = (unsigned)(tPos & 0xFF); tPos = tt[tPos >> 8]; for (; b > 0; b--) { crc.UpdateByte(prevByte); m_OutStream.WriteByte((Byte)prevByte); } */ } while (--blockSize != 0); return crc.GetDigest(); }