aboutsummaryrefslogtreecommitdiff
path: root/zencore/compress.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-11-18 11:35:13 +0100
committerGitHub <[email protected]>2022-11-18 02:35:13 -0800
commit55225621f018904abf7e212320bb784dc64f8ac3 (patch)
tree3fb962e9e0553448f9d42612bb078ff072308e1c /zencore/compress.cpp
parentmove BasicFile to zenutil to remove zenstore dependency from zen command (#190) (diff)
downloadzen-55225621f018904abf7e212320bb784dc64f8ac3.tar.xz
zen-55225621f018904abf7e212320bb784dc64f8ac3.zip
Add `import-project` and `export-project` (#183)
* Add `import-project` and `export-project` command line parsing
Diffstat (limited to 'zencore/compress.cpp')
-rw-r--r--zencore/compress.cpp44
1 files changed, 39 insertions, 5 deletions
diff --git a/zencore/compress.cpp b/zencore/compress.cpp
index 35a5acb3a..15cc5f6a7 100644
--- a/zencore/compress.cpp
+++ b/zencore/compress.cpp
@@ -65,7 +65,8 @@ struct BufferHeader
BufferHeader Header;
if (sizeof(BufferHeader) <= CompressedData.GetSize())
{
- CompressedData.CopyTo(MakeMutableMemoryView(&Header, &Header + 1));
+ CompositeBuffer::Iterator It;
+ CompressedData.CopyTo(MakeMutableMemoryView(&Header, &Header + 1), It);
Header.ByteSwap();
}
return Header;
@@ -235,10 +236,13 @@ BlockEncoder::Compress(const CompositeBuffer& RawData, const uint64_t BlockSize)
{
UniqueBuffer RawBlockCopy;
MutableMemoryView CompressedBlocksView = CompressedData.GetMutableView() + sizeof(BufferHeader) + MetaSize;
+
+ CompositeBuffer::Iterator It = RawData.GetIterator(0);
+
for (uint64_t RawOffset = 0; RawOffset < RawSize;)
{
const uint64_t RawBlockSize = zen::Min(RawSize - RawOffset, BlockSize);
- const MemoryView RawBlock = RawData.ViewOrCopyRange(RawOffset, RawBlockSize, RawBlockCopy);
+ const MemoryView RawBlock = RawData.ViewOrCopyRange(It, RawBlockSize, RawBlockCopy);
RawHash.Append(RawBlock);
MutableMemoryView CompressedBlock = CompressedBlocksView;
@@ -669,8 +673,10 @@ BufferHeader::IsValid(const CompositeBuffer& CompressedData)
{
if (const BaseDecoder* const Decoder = GetDecoder(Header.Method))
{
- UniqueBuffer HeaderCopy;
- const MemoryView HeaderView = CompressedData.ViewOrCopyRange(0, Decoder->GetHeaderSize(Header), HeaderCopy);
+ UniqueBuffer HeaderCopy = UniqueBuffer::Alloc(Decoder->GetHeaderSize(Header));
+ CompositeBuffer::Iterator It;
+ CompressedData.CopyTo(HeaderCopy.GetMutableView(), It);
+ const MemoryView HeaderView = HeaderCopy.GetView();
if (Header.Crc32 == BufferHeader::CalculateCrc32(HeaderView))
{
return true;
@@ -851,6 +857,30 @@ CompressedBuffer::FromCompressed(SharedBuffer&& InCompressedData)
return Local;
}
+CompressedBuffer
+CompressedBuffer::FromCompressedNoValidate(IoBuffer&& InCompressedData)
+{
+ if (InCompressedData.GetSize() <= sizeof(detail::BufferHeader))
+ {
+ return CompressedBuffer();
+ }
+ CompressedBuffer Local;
+ Local.CompressedData = CompositeBuffer(SharedBuffer(std::move(InCompressedData)));
+ return Local;
+}
+
+CompressedBuffer
+CompressedBuffer::FromCompressedNoValidate(CompositeBuffer&& InCompressedData)
+{
+ if (InCompressedData.GetSize() <= sizeof(detail::BufferHeader))
+ {
+ return CompressedBuffer();
+ }
+ CompressedBuffer Local;
+ Local.CompressedData = std::move(InCompressedData);
+ return Local;
+}
+
uint64_t
CompressedBuffer::GetRawSize() const
{
@@ -927,7 +957,9 @@ CompressedBuffer::DecompressToComposite() const
}
bool
-CompressedBuffer::TryGetCompressParameters(OodleCompressor& OutCompressor, OodleCompressionLevel& OutCompressionLevel) const
+CompressedBuffer::TryGetCompressParameters(OodleCompressor& OutCompressor,
+ OodleCompressionLevel& OutCompressionLevel,
+ uint64_t& OutBlockSize) const
{
using namespace detail;
if (CompressedData)
@@ -937,10 +969,12 @@ CompressedBuffer::TryGetCompressParameters(OodleCompressor& OutCompressor, Oodle
case CompressionMethod::None:
OutCompressor = OodleCompressor::NotSet;
OutCompressionLevel = OodleCompressionLevel::None;
+ OutBlockSize = 0;
return true;
case CompressionMethod::Oodle:
OutCompressor = OodleCompressor(Header.Compressor);
OutCompressionLevel = OodleCompressionLevel(Header.CompressionLevel);
+ OutBlockSize = uint64_t(1) << Header.BlockSizeExponent;
return true;
default:
break;