From 2d413764f07314681a9d8c739580eda954b7aeab Mon Sep 17 00:00:00 2001
From: Patrick Wuttke
Date: Mon, 14 Jul 2025 10:07:57 +0200
Subject: [PATCH] Added Stream functions for reading and writing 0-terminated
strings.
---
source/mijin/io/stream.cpp | 36 ++++++++++++++++++++++++++++++++++++
source/mijin/io/stream.hpp | 5 ++++-
2 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/source/mijin/io/stream.cpp b/source/mijin/io/stream.cpp
index 87c775d..dc7856e 100644
--- a/source/mijin/io/stream.cpp
+++ b/source/mijin/io/stream.cpp
@@ -113,6 +113,42 @@ StreamError Stream::writeBinaryString(std::string_view str)
return writeSpan(str.begin(), str.end());
}
+StreamError Stream::readZString(std::string& outString)
+{
+ char chr = '\0';
+ std::string result;
+
+ while (true)
+ {
+ if (isAtEnd())
+ {
+ return StreamError::IO_ERROR;
+ }
+
+ if (StreamError error = read(chr); error != StreamError::SUCCESS)
+ {
+ return error;
+ }
+ if (chr == '\0')
+ {
+ outString = std::move(result);
+ return StreamError::SUCCESS;
+ }
+ result.push_back(chr);
+ }
+}
+
+StreamError Stream::writeZString(std::string_view str)
+{
+ static const char ZERO = '\0';
+
+ if (StreamError error = writeRaw(str.data(), str.size() * sizeof(char)); error != StreamError::SUCCESS)
+ {
+ return error;
+ }
+ return write(ZERO);
+}
+
mijin::Task Stream::c_readBinaryString(std::string& outString)
{
std::uint32_t length; // NOLINT(cppcoreguidelines-init-variables)
diff --git a/source/mijin/io/stream.hpp b/source/mijin/io/stream.hpp
index fb0b514..6ea23db 100644
--- a/source/mijin/io/stream.hpp
+++ b/source/mijin/io/stream.hpp
@@ -221,7 +221,7 @@ public:
}
template
- StreamError write(const T& value) requires(std::is_trivial_v)
+ StreamError write(const T& value)
{
return writeRaw(&value, sizeof(T));
}
@@ -261,6 +261,9 @@ public:
StreamError readBinaryString(std::string& outString);
StreamError writeBinaryString(std::string_view str);
+ StreamError readZString(std::string& outString);
+ StreamError writeZString(std::string_view str);
+
mijin::Task c_readBinaryString(std::string& outString);
mijin::Task c_writeBinaryString(std::string_view str);