mirror of
https://github.com/tfussell/xlnt.git
synced 2024-03-22 13:11:17 +08:00
Merge pull request #345 from kostasdizas/issue165-compound-document
Removed duplicate code in compound document
This commit is contained in:
commit
ba01de47a7
|
@ -121,81 +121,55 @@ private:
|
||||||
{
|
{
|
||||||
auto bytes_read = std::streamsize(0);
|
auto bytes_read = std::streamsize(0);
|
||||||
|
|
||||||
if (entry_.size < document_.header_.threshold)
|
const auto sector_chain = short_stream() ? document_.ssat_ : document_.sat_;
|
||||||
{
|
const auto chain = document_.follow_chain(entry_.start, sector_chain);
|
||||||
const auto chain = document_.follow_chain(entry_.start, document_.ssat_);
|
const auto sector_size = short_stream() ? document_.short_sector_size() : document_.sector_size();
|
||||||
auto current_sector = chain[position_ / document_.short_sector_size()];
|
auto current_sector = chain[position_ / sector_size];
|
||||||
auto remaining = std::min(std::size_t(entry_.size) - position_, std::size_t(count));
|
auto remaining = std::min(std::size_t(entry_.size) - position_, std::size_t(count));
|
||||||
|
|
||||||
while (remaining)
|
while (remaining)
|
||||||
|
{
|
||||||
|
if (current_sector_.empty() || chain[position_ / sector_size] != current_sector)
|
||||||
{
|
{
|
||||||
if (current_sector_.empty() || chain[position_ / document_.short_sector_size()] != current_sector)
|
current_sector = chain[position_ / sector_size];
|
||||||
|
sector_writer_.reset();
|
||||||
|
if (short_stream())
|
||||||
{
|
{
|
||||||
current_sector = chain[position_ / document_.short_sector_size()];
|
|
||||||
sector_writer_.reset();
|
|
||||||
document_.read_short_sector(current_sector, sector_writer_);
|
document_.read_short_sector(current_sector, sector_writer_);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
const auto available = std::min(entry_.size - position_,
|
|
||||||
document_.short_sector_size() - position_ % document_.short_sector_size());
|
|
||||||
const auto to_read = std::min(available, std::size_t(remaining));
|
|
||||||
|
|
||||||
auto start = current_sector_.begin() + static_cast<std::ptrdiff_t>(position_ % document_.short_sector_size());
|
|
||||||
auto end = start + static_cast<std::ptrdiff_t>(to_read);
|
|
||||||
|
|
||||||
for (auto i = start; i < end; ++i)
|
|
||||||
{
|
{
|
||||||
*(c++) = static_cast<char>(*i);
|
|
||||||
}
|
|
||||||
|
|
||||||
remaining -= to_read;
|
|
||||||
position_ += to_read;
|
|
||||||
bytes_read += to_read;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (position_ < entry_.size && chain[position_ / document_.short_sector_size()] != current_sector)
|
|
||||||
{
|
|
||||||
current_sector = chain[position_ / document_.short_sector_size()];
|
|
||||||
sector_writer_.reset();
|
|
||||||
document_.read_short_sector(current_sector, sector_writer_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const auto chain = document_.follow_chain(entry_.start, document_.sat_);
|
|
||||||
auto current_sector = chain[position_ / document_.sector_size()];
|
|
||||||
auto remaining = std::min(std::size_t(entry_.size) - position_, std::size_t(count));
|
|
||||||
|
|
||||||
while (remaining)
|
|
||||||
{
|
|
||||||
if (current_sector_.empty() || chain[position_ / document_.sector_size()] != current_sector)
|
|
||||||
{
|
|
||||||
current_sector = chain[position_ / document_.sector_size()];
|
|
||||||
sector_writer_.reset();
|
|
||||||
document_.read_sector(current_sector, sector_writer_);
|
document_.read_sector(current_sector, sector_writer_);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto available = std::min(entry_.size - position_,
|
|
||||||
document_.sector_size() - position_ % document_.sector_size());
|
|
||||||
const auto to_read = std::min(available, std::size_t(remaining));
|
|
||||||
|
|
||||||
auto start = current_sector_.begin() + static_cast<std::ptrdiff_t>(position_ % document_.sector_size());
|
|
||||||
auto end = start + static_cast<std::ptrdiff_t>(to_read);
|
|
||||||
|
|
||||||
for (auto i = start; i < end; ++i)
|
|
||||||
{
|
|
||||||
*(c++) = static_cast<char>(*i);
|
|
||||||
}
|
|
||||||
|
|
||||||
remaining -= to_read;
|
|
||||||
position_ += to_read;
|
|
||||||
bytes_read += to_read;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (position_ < entry_.size && chain[position_ / document_.sector_size()] != current_sector)
|
const auto available = std::min(entry_.size - position_,
|
||||||
|
sector_size - position_ % sector_size);
|
||||||
|
const auto to_read = std::min(available, std::size_t(remaining));
|
||||||
|
|
||||||
|
auto start = current_sector_.begin() + static_cast<std::ptrdiff_t>(position_ % sector_size);
|
||||||
|
auto end = start + static_cast<std::ptrdiff_t>(to_read);
|
||||||
|
|
||||||
|
for (auto i = start; i < end; ++i)
|
||||||
|
{
|
||||||
|
*(c++) = static_cast<char>(*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
remaining -= to_read;
|
||||||
|
position_ += to_read;
|
||||||
|
bytes_read += to_read;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (position_ < entry_.size && chain[position_ / sector_size] != current_sector)
|
||||||
|
{
|
||||||
|
current_sector = chain[position_ / sector_size];
|
||||||
|
sector_writer_.reset();
|
||||||
|
if (short_stream())
|
||||||
|
{
|
||||||
|
document_.read_short_sector(current_sector, sector_writer_);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
current_sector = chain[position_ / document_.sector_size()];
|
|
||||||
sector_writer_.reset();
|
|
||||||
document_.read_sector(current_sector, sector_writer_);
|
document_.read_sector(current_sector, sector_writer_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -203,6 +177,11 @@ private:
|
||||||
return bytes_read;
|
return bytes_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool short_stream()
|
||||||
|
{
|
||||||
|
return entry_.size < document_.header_.threshold;
|
||||||
|
}
|
||||||
|
|
||||||
int_type underflow() override
|
int_type underflow() override
|
||||||
{
|
{
|
||||||
if (position_ >= entry_.size)
|
if (position_ >= entry_.size)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user