Skip to content

Commit bdd34f0

Browse files
committed
Fix stream_seek::sk_stream_absolute behaviour when attempting to seek forward
1 parent d2124a6 commit bdd34f0

File tree

3 files changed

+30
-6
lines changed

3 files changed

+30
-6
lines changed

include/hexi/binary_stream.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -622,9 +622,15 @@ class binary_stream final {
622622
void write_seek(const stream_seek direction, const offset_type offset)
623623
requires(seekable<buf_type> && writeable<buf_type>) {
624624
if(direction == stream_seek::sk_stream_absolute) {
625-
write_seek(buffer_seek::sk_backward, total_write_ - offset);
625+
if(offset >= total_write_) {
626+
buffer_.write_seek(buffer_seek::sk_forward, offset - total_write_);
627+
} else {
628+
buffer_.write_seek(buffer_seek::sk_backward, total_write_ - offset);
629+
}
630+
631+
total_write_ = offset;
626632
} else {
627-
write_seek(static_cast<buffer_seek>(direction), offset);
633+
buffer_.write_seek(static_cast<buffer_seek>(direction), offset);
628634
}
629635
}
630636

include/hexi/pmc/binary_stream_writer.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,13 @@ class binary_stream_writer : virtual public stream_base {
220220
*/
221221
void write_seek(const stream_seek direction, const std::size_t offset) {
222222
if(direction == stream_seek::sk_stream_absolute) {
223-
buffer_.write_seek(buffer_seek::sk_backward, total_write_ - offset);
223+
if(offset >= total_write_) {
224+
buffer_.write_seek(buffer_seek::sk_forward, offset - total_write_);
225+
} else {
226+
buffer_.write_seek(buffer_seek::sk_backward, total_write_ - offset);
227+
}
228+
229+
total_write_ = offset;
224230
} else {
225231
buffer_.write_seek(static_cast<buffer_seek>(direction), offset);
226232
}

single_include/hexi.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,9 +1151,15 @@ class binary_stream final {
11511151
void write_seek(const stream_seek direction, const offset_type offset)
11521152
requires(seekable<buf_type> && writeable<buf_type>) {
11531153
if(direction == stream_seek::sk_stream_absolute) {
1154-
write_seek(buffer_seek::sk_backward, total_write_ - offset);
1154+
if(offset >= total_write_) {
1155+
buffer_.write_seek(buffer_seek::sk_forward, offset - total_write_);
1156+
} else {
1157+
buffer_.write_seek(buffer_seek::sk_backward, total_write_ - offset);
1158+
}
1159+
1160+
total_write_ = offset;
11551161
} else {
1156-
write_seek(static_cast<buffer_seek>(direction), offset);
1162+
buffer_.write_seek(static_cast<buffer_seek>(direction), offset);
11571163
}
11581164
}
11591165

@@ -4625,7 +4631,13 @@ class binary_stream_writer : virtual public stream_base {
46254631
*/
46264632
void write_seek(const stream_seek direction, const std::size_t offset) {
46274633
if(direction == stream_seek::sk_stream_absolute) {
4628-
buffer_.write_seek(buffer_seek::sk_backward, total_write_ - offset);
4634+
if(offset >= total_write_) {
4635+
buffer_.write_seek(buffer_seek::sk_forward, offset - total_write_);
4636+
} else {
4637+
buffer_.write_seek(buffer_seek::sk_backward, total_write_ - offset);
4638+
}
4639+
4640+
total_write_ = offset;
46294641
} else {
46304642
buffer_.write_seek(static_cast<buffer_seek>(direction), offset);
46314643
}

0 commit comments

Comments
 (0)