[Scummvm-git-logs] scummvm master -> f36f55c77337f97107d5aada3c4466a867aebc77
mgerhardy
martin.gerhardy at gmail.com
Sat Oct 31 07:30:03 UTC 2020
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
1e608a6ea8 COMMON: added MemorySeekableReadWriteStream
f36f55c773 COMMON: fixed missing eos reset for successful seek
Commit: 1e608a6ea80cd7c21da58bf01d0737956684294c
https://github.com/scummvm/scummvm/commit/1e608a6ea80cd7c21da58bf01d0737956684294c
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-31T08:29:58+01:00
Commit Message:
COMMON: added MemorySeekableReadWriteStream
A seekable read and writeable memory stream that operates on an already existing memory buffer
Changed paths:
common/memstream.h
diff --git a/common/memstream.h b/common/memstream.h
index 5bfd7f0811..f284397218 100644
--- a/common/memstream.h
+++ b/common/memstream.h
@@ -342,6 +342,96 @@ public:
byte *getData() { return _data; }
};
+/**
+ * A seekable read and writeable memory stream that operates on an already existing memory buffer
+ */
+class MemorySeekableReadWriteStream : public SeekableReadStream, public SeekableWriteStream {
+private:
+ const uint32 _bufSize;
+ byte *_ptrOrig;
+ byte *_ptr;
+ uint32 _pos;
+ bool _err;
+ bool _eos;
+
+public:
+ MemorySeekableReadWriteStream(byte *buf, uint32 len) : _ptrOrig(buf), _ptr(buf), _bufSize(len), _pos(0), _err(false), _eos(false) {}
+
+ uint32 write(const void *dataPtr, uint32 dataSize) override {
+ // Write at most as many bytes as are still available...
+ if (dataSize > _bufSize - _pos) {
+ dataSize = _bufSize - _pos;
+ // We couldn't write all the data => set error indicator
+ _err = true;
+ }
+ memcpy(_ptr, dataPtr, dataSize);
+ _ptr += dataSize;
+ _pos += dataSize;
+ return dataSize;
+ }
+
+ int32 pos() const override { return _pos; }
+ int32 size() const override { return _bufSize; }
+
+ bool eos() const override { return _eos; }
+
+ bool err() const override { return _err; }
+ void clearErr() override { _err = false; }
+
+ inline void rewind(int32 bytes) {
+ seek(pos() - bytes);
+ }
+
+ byte peekByte() {
+ if (_bufSize - _pos <= 0) {
+ _eos = true;
+ return 0;
+ }
+ return *_ptr;
+ }
+
+ uint32 read(void *dataPtr, uint32 dataSize) override {
+ // Read at most as many bytes as are still available...
+ if (dataSize > _bufSize - _pos) {
+ dataSize = _bufSize - _pos;
+ _eos = true;
+ }
+ memcpy(dataPtr, _ptr, dataSize);
+
+ _ptr += dataSize;
+ _pos += dataSize;
+
+ return dataSize;
+ }
+
+ bool seek(int32 offset, int whence = SEEK_SET) override {
+ switch (whence) {
+ case SEEK_END:
+ // SEEK_END works just like SEEK_SET, only 'reversed',
+ // i.e. from the end.
+ offset = size() + offset;
+ // Fall through
+ case SEEK_SET:
+ // Fall through
+ default:
+ _ptr = _ptrOrig + offset;
+ _pos = offset;
+ break;
+ case SEEK_CUR:
+ _ptr += offset;
+ _pos += offset;
+ break;
+ }
+ // Post-Condition
+ if ((int32)_pos > size()) {
+ _pos = size();
+ _ptr = _ptrOrig + _pos;
+ }
+
+ return true;
+ }
+};
+
/** @} */
} // End of namespace Common
Commit: f36f55c77337f97107d5aada3c4466a867aebc77
https://github.com/scummvm/scummvm/commit/f36f55c77337f97107d5aada3c4466a867aebc77
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-31T08:29:58+01:00
Commit Message:
COMMON: fixed missing eos reset for successful seek
also added a DisposeAfterUse flag to the ctor of the stream
Changed paths:
common/memstream.h
diff --git a/common/memstream.h b/common/memstream.h
index f284397218..c96b4cc1ff 100644
--- a/common/memstream.h
+++ b/common/memstream.h
@@ -353,9 +353,17 @@ private:
uint32 _pos;
bool _err;
bool _eos;
+ DisposeAfterUse::Flag _disposeMemory;
public:
- MemorySeekableReadWriteStream(byte *buf, uint32 len) : _ptrOrig(buf), _ptr(buf), _bufSize(len), _pos(0), _err(false), _eos(false) {}
+ MemorySeekableReadWriteStream(byte *buf, uint32 len, DisposeAfterUse::Flag disposeMemory = DisposeAfterUse::NO) :
+ _ptrOrig(buf), _ptr(buf), _bufSize(len), _pos(0), _err(false), _eos(false), _disposeMemory(disposeMemory) {}
+
+ ~MemorySeekableReadWriteStream() {
+ if (_disposeMemory) {
+ free(_ptrOrig);
+ }
+ }
uint32 write(const void *dataPtr, uint32 dataSize) override {
// Write at most as many bytes as are still available...
@@ -428,6 +436,7 @@ public:
_ptr = _ptrOrig + _pos;
}
+ _eos = false;
return true;
}
};
More information about the Scummvm-git-logs
mailing list