Skip to content

Commit

Permalink
Refactor ByteWriter::write_bytes function to fix bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
GregoryKogan committed Dec 13, 2023
1 parent 03b9036 commit d8f5a5c
Showing 1 changed file with 18 additions and 13 deletions.
31 changes: 18 additions & 13 deletions src/FileSystem/FileHandler/ByteWriter/ByteWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,27 @@ ByteWriter::ByteWriter(ClusterWriter cluster_writer, FAT fat, std::uint64_t clus
: cluster_writer_(std::move(cluster_writer)), fat_(std::move(fat)), cluster_(cluster) {}

auto ByteWriter::write_bytes(std::uint64_t offset, const std::vector<std::byte> &bytes) -> std::uint64_t {
std::uint64_t bytes_written = 0;
std::uint64_t file_position = 0;
auto cluster_size = cluster_writer_.get_cluster_size();
auto cluster_number = offset / cluster_writer_.get_cluster_size();

auto cur_cluster = cluster_;
while (bytes_written < bytes.size()) {
if (file_position + cluster_size < offset) {
file_position += cluster_size;
for (std::uint64_t i = 0; i < cluster_number; ++i) {
if (fat_.is_last(cur_cluster)) {
cur_cluster = fat_.allocate_next(cur_cluster);
} else {
std::uint64_t position = file_position < offset ? offset - file_position : 0;
auto bytes_to_write =
std::vector<std::byte>(bytes.begin() + static_cast<std::int64_t>(bytes_written), bytes.end());
bytes_written += cluster_writer_.write_at_position(cur_cluster, position, bytes_to_write);

file_position += position + bytes_written;
cur_cluster = fat_.get_next(cur_cluster);
}
}

auto bytes_written = std::uint64_t{0};
auto position = offset % cluster_writer_.get_cluster_size();
auto bytes_to_write = bytes;

while (bytes_written < bytes.size()) {
auto bytes_written_in_cluster = cluster_writer_.write_at_position(cur_cluster, position, bytes_to_write);
bytes_written += bytes_written_in_cluster;
position = 0;
bytes_to_write = std::vector<std::byte>(
bytes_to_write.begin() + static_cast<std::int64_t>(bytes_written_in_cluster), bytes_to_write.end());

if (bytes_written < bytes.size()) {
if (fat_.is_last(cur_cluster)) {
Expand All @@ -30,5 +35,5 @@ auto ByteWriter::write_bytes(std::uint64_t offset, const std::vector<std::byte>
}
}

return file_position;
return bytes_written + offset;
}

0 comments on commit d8f5a5c

Please sign in to comment.