mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:37:35 +00:00
LibCompress: Simplify logic in deflate implementation.
This commit is contained in:
parent
6de63782c7
commit
4c317a94c7
2 changed files with 36 additions and 9 deletions
|
@ -64,9 +64,8 @@ TEST_CASE(overwritting_is_well_defined)
|
||||||
|
|
||||||
stream >> Bytes { bytes, sizeof(bytes) };
|
stream >> Bytes { bytes, sizeof(bytes) };
|
||||||
|
|
||||||
for (size_t idx = 0; idx < half_capacity; ++idx) {
|
for (size_t idx = 0; idx < half_capacity; ++idx)
|
||||||
EXPECT_EQ(bytes[idx], idx % 256);
|
EXPECT_EQ(bytes[idx], idx % 256);
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t idx = 0; idx < half_capacity; ++idx)
|
for (size_t idx = 0; idx < half_capacity; ++idx)
|
||||||
stream << static_cast<u8>(idx % 256);
|
stream << static_cast<u8>(idx % 256);
|
||||||
|
@ -84,4 +83,31 @@ TEST_CASE(overwritting_is_well_defined)
|
||||||
EXPECT(stream.eof());
|
EXPECT(stream.eof());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE(of_by_one)
|
||||||
|
{
|
||||||
|
constexpr size_t half_capacity = 32;
|
||||||
|
constexpr size_t capacity = half_capacity * 2;
|
||||||
|
|
||||||
|
CircularDuplexStream<capacity> stream;
|
||||||
|
|
||||||
|
for (size_t idx = 0; idx < half_capacity; ++idx)
|
||||||
|
stream << static_cast<u8>(0);
|
||||||
|
|
||||||
|
for (size_t idx = 0; idx < half_capacity; ++idx)
|
||||||
|
stream << static_cast<u8>(1);
|
||||||
|
|
||||||
|
stream.discard_or_error(capacity);
|
||||||
|
|
||||||
|
for (size_t idx = 0; idx < capacity; ++idx) {
|
||||||
|
u8 byte;
|
||||||
|
stream.read({ &byte, sizeof(byte) }, capacity);
|
||||||
|
stream << byte;
|
||||||
|
|
||||||
|
if (idx < half_capacity)
|
||||||
|
EXPECT_EQ(byte, 0);
|
||||||
|
else
|
||||||
|
EXPECT_EQ(byte, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_MAIN(CircularDuplexStream)
|
TEST_MAIN(CircularDuplexStream)
|
||||||
|
|
|
@ -138,17 +138,18 @@ bool DeflateDecompressor::CompressedBlock::try_read_more()
|
||||||
m_eof = true;
|
m_eof = true;
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
// FIXME: This assertion depends on user input.
|
if (!m_distance_codes.has_value()) {
|
||||||
ASSERT(m_distance_codes.has_value());
|
m_decompressor.set_fatal_error();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const auto run_length = m_decompressor.decode_run_length(symbol);
|
const auto run_length = m_decompressor.decode_run_length(symbol);
|
||||||
const auto distance = m_decompressor.decode_distance(m_distance_codes.value().read_symbol(m_decompressor.m_input_stream));
|
const auto distance = m_decompressor.decode_distance(m_distance_codes.value().read_symbol(m_decompressor.m_input_stream));
|
||||||
|
|
||||||
size_t nread = 0;
|
for (size_t idx = 0; idx < run_length; ++idx) {
|
||||||
while (nread < run_length) {
|
u8 byte = 0;
|
||||||
const auto nreserved = min(run_length - nread, m_decompressor.m_output_stream.remaining_contigous_space());
|
m_decompressor.m_output_stream.read({ &byte, sizeof(byte) }, distance);
|
||||||
auto bytes = m_decompressor.m_output_stream.reserve_contigous_space(nreserved);
|
m_decompressor.m_output_stream << byte;
|
||||||
nread += m_decompressor.m_output_stream.read(bytes, distance + nread + nreserved);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue