From 9f795150fc622033a24bc88db24aa99dfa13fdfa Mon Sep 17 00:00:00 2001 From: OV2 Date: Tue, 6 Nov 2018 22:05:38 +0100 Subject: [PATCH] Correct stream revert behavior (closes #353) --- stream.cpp | 35 +++++++++++++++++++++++++++-------- stream.h | 13 ++++++++----- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/stream.cpp b/stream.cpp index b385e51a..c8e8af6e 100644 --- a/stream.cpp +++ b/stream.cpp @@ -253,6 +253,24 @@ std::string Stream::getline (bool &eof) return (ret); } +size_t Stream::pos_from_origin_offset(uint8 origin, int32 offset) +{ + size_t position = 0; + switch (origin) + { + case SEEK_SET: + position = offset; + break; + case SEEK_END: + position = size() + offset; + break; + case SEEK_CUR: + position = pos() + offset; + break; + } + return position; +} + // snes9x.h FSTREAM Stream fStream::fStream (FSTREAM f) @@ -299,9 +317,9 @@ size_t fStream::size (void) return sz; } -int fStream::revert (size_t from, size_t offset) +int fStream::revert (uint8 origin, int32 offset) { - return (REVERT_FSTREAM(fp, offset, from)); + return (REVERT_FSTREAM(fp, offset, origin)); } void fStream::closeStream() @@ -428,9 +446,9 @@ size_t unzStream::size (void) return info.uncompressed_size; } -int unzStream::revert (size_t from, size_t offset) +int unzStream::revert (uint8 origin, int32 offset) { - size_t target_pos = from + offset; + size_t target_pos = pos_from_origin_offset(origin, offset); // new pos inside buffered data if (target_pos >= buf_pos_in_unzipped && target_pos < buf_pos_in_unzipped + bytes_in_buf) @@ -547,9 +565,9 @@ size_t memStream::size (void) return msize; } -int memStream::revert (size_t from, size_t offset) +int memStream::revert (uint8 origin, int32 offset) { - size_t pos = from + offset; + size_t pos = pos_from_origin_offset(origin, offset); if(pos > msize) return -1; @@ -610,9 +628,10 @@ size_t nulStream::size (void) return bytes_written; } -int nulStream::revert (size_t from, size_t offset) +int nulStream::revert (uint8 origin, int32 offset) { - bytes_written = from + offset; + size_t target_pos = pos_from_origin_offset(origin, offset); + bytes_written = target_pos; return 0; } diff --git a/stream.h b/stream.h index 16ceee5a..c62da9c4 100644 --- a/stream.h +++ b/stream.h @@ -208,8 +208,11 @@ class Stream virtual size_t write (void *, size_t) = 0; virtual size_t pos (void) = 0; virtual size_t size (void) = 0; - virtual int revert (size_t from, size_t offset) = 0; + virtual int revert (uint8 origin, int32 offset) = 0; virtual void closeStream() = 0; + + protected: + size_t pos_from_origin_offset(uint8 origin, int32 offset); }; class fStream : public Stream @@ -223,7 +226,7 @@ class fStream : public Stream virtual size_t write (void *, size_t); virtual size_t pos (void); virtual size_t size (void); - virtual int revert (size_t from, size_t offset); + virtual int revert (uint8 origin, int32 offset); virtual void closeStream(); private: @@ -250,7 +253,7 @@ class unzStream : public Stream virtual size_t write (void *, size_t); virtual size_t pos (void); virtual size_t size (void); - virtual int revert (size_t from, size_t offset); + virtual int revert (uint8 origin, int32 offset); virtual void closeStream(); private: @@ -279,7 +282,7 @@ class memStream : public Stream virtual size_t write (void *, size_t); virtual size_t pos (void); virtual size_t size (void); - virtual int revert (size_t from, size_t offset); + virtual int revert (uint8 origin, int32 offset); virtual void closeStream(); private: @@ -304,7 +307,7 @@ class nulStream : public Stream virtual size_t write (void *, size_t); virtual size_t pos (void); virtual size_t size (void); - virtual int revert (size_t from, size_t offset); + virtual int revert (uint8 origin, int32 offset); virtual void closeStream(); private: