[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