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);