summaryrefslogtreecommitdiffstats
path: root/source/core/stream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/stream.cpp')
-rw-r--r--source/core/stream.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/source/core/stream.cpp b/source/core/stream.cpp
index 949ce718c..19ae3cdea 100644
--- a/source/core/stream.cpp
+++ b/source/core/stream.cpp
@@ -153,6 +153,7 @@ namespace Slang
break;
case Slang::SeekOrigin::End:
_origin = SEEK_END;
+ // JS TODO: This doesn't seem right, the offset can mean it's not at the end
endReached = true;
break;
case Slang::SeekOrigin::Current:
@@ -215,4 +216,79 @@ namespace Slang
{
return endReached;
}
+
+ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MemoryStream !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ void MemoryStream::Seek(SeekOrigin origin, Int64 offset)
+ {
+ Int64 pos = 0;
+ switch (origin)
+ {
+ case Slang::SeekOrigin::Start:
+ pos = offset;
+ break;
+ case Slang::SeekOrigin::End:
+ pos = Int64(m_contents.Count()) + offset;
+ break;
+ case Slang::SeekOrigin::Current:
+ pos = Int64(m_position) + offset;
+ break;
+ default:
+ throw NotSupportedException("Unsupported seek origin.");
+ break;
+ }
+
+ m_atEnd = false;
+
+ // Clamp to the valid range
+ pos = (pos < 0) ? 0 : pos;
+ pos = (pos > Int64(m_contents.Count())) ? Int64(m_contents.Count()) : pos;
+
+ m_position = UInt(pos);
+ }
+
+ Int64 MemoryStream::Read(void * buffer, Int64 length)
+ {
+ if (!CanRead())
+ {
+ throw IOException("Cannot read this stream.");
+ }
+
+ const Int64 maxRead = Int64(m_contents.Count() - m_position);
+
+ if (maxRead == 0 && length > 0)
+ {
+ m_atEnd = true;
+ throw EndOfStreamException("End of file is reached.");
+ }
+
+ length = length > maxRead ? maxRead : length;
+
+ ::memcpy(buffer, m_contents.begin() + m_position, size_t(length));
+ m_position += UInt(length);
+ return maxRead;
+ }
+
+ Int64 MemoryStream::Write(const void * buffer, Int64 length)
+ {
+ if (!CanWrite())
+ {
+ throw IOException("Cannot write this stream.");
+ }
+
+ if (m_position == m_contents.Count())
+ {
+ m_contents.AddRange((const uint8_t*)buffer, UInt(length));
+ }
+ else
+ {
+ m_contents.InsertRange(m_position, (const uint8_t*)buffer, UInt(length));
+ }
+
+ m_atEnd = false;
+
+ m_position += UInt(length);
+ return length;
+ }
+
}