From b4516298a3f788163f3b5234840d9b09c384652c Mon Sep 17 00:00:00 2001 From: Iliyas Jorio Date: Wed, 19 May 2021 21:15:35 +0200 Subject: [PATCH] BigEndianOStream --- CMakeLists.txt | 3 +- src/Files/Files.cpp | 2 +- src/Files/HostVolume.cpp | 2 +- src/Files/Resources.cpp | 2 +- src/Graphics/PICT.cpp | 2 +- src/QD3D/3DMFInternal.h | 2 +- src/Sound/AIFF.cpp | 2 +- src/Sound/SoundManager.cpp | 2 +- src/Text/TextUtilities.cpp | 2 +- ...EndianIStream.cpp => bigendianstreams.cpp} | 49 ++++++++++++++++++- ...{BigEndianIStream.h => bigendianstreams.h} | 37 +++++++++++++- src/Video/moov.cpp | 2 +- 12 files changed, 93 insertions(+), 14 deletions(-) rename src/Utilities/{BigEndianIStream.cpp => bigendianstreams.cpp} (61%) rename src/Utilities/{BigEndianIStream.h => bigendianstreams.h} (61%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1533b8e..dd2a4c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,8 @@ set(POMME_SOURCES ${POMME_SRCDIR}/Sound/xlaw.cpp ${POMME_SRCDIR}/Text/TextUtilities.cpp ${POMME_SRCDIR}/Time/TimeManager.cpp - ${POMME_SRCDIR}/Utilities/BigEndianIStream.cpp + ${POMME_SRCDIR}/Utilities/bigendianstreams.cpp + ${POMME_SRCDIR}/Utilities/bigendianstreams.h ${POMME_SRCDIR}/Utilities/FixedPool.h ${POMME_SRCDIR}/Utilities/GrowablePool.h ${POMME_SRCDIR}/Utilities/IEEEExtended.cpp diff --git a/src/Files/Files.cpp b/src/Files/Files.cpp index 085a448..61c4b7a 100644 --- a/src/Files/Files.cpp +++ b/src/Files/Files.cpp @@ -1,5 +1,5 @@ #include "Pomme.h" -#include "Utilities/BigEndianIStream.h" +#include "Utilities/bigendianstreams.h" #include "Utilities/GrowablePool.h" #include "Utilities/memstream.h" #include "PommeFiles.h" diff --git a/src/Files/HostVolume.cpp b/src/Files/HostVolume.cpp index d67ec21..a0ea1ae 100644 --- a/src/Files/HostVolume.cpp +++ b/src/Files/HostVolume.cpp @@ -2,7 +2,7 @@ #include "PommeDebug.h" #include "PommeFiles.h" #include "Files/HostVolume.h" -#include "Utilities/BigEndianIStream.h" +#include "Utilities/bigendianstreams.h" #include "Utilities/StringUtils.h" #include diff --git a/src/Files/Resources.cpp b/src/Files/Resources.cpp index 9dcd8e6..3c75e71 100644 --- a/src/Files/Resources.cpp +++ b/src/Files/Resources.cpp @@ -1,6 +1,6 @@ #include "Pomme.h" #include "PommeFiles.h" -#include "Utilities/BigEndianIStream.h" +#include "Utilities/bigendianstreams.h" #include #include diff --git a/src/Graphics/PICT.cpp b/src/Graphics/PICT.cpp index 650506d..3042e0b 100644 --- a/src/Graphics/PICT.cpp +++ b/src/Graphics/PICT.cpp @@ -1,6 +1,6 @@ #include "Pomme.h" #include "PommeGraphics.h" -#include "Utilities/BigEndianIStream.h" +#include "Utilities/bigendianstreams.h" #include #include diff --git a/src/QD3D/3DMFInternal.h b/src/QD3D/3DMFInternal.h index 73a3ea5..79f50dc 100644 --- a/src/QD3D/3DMFInternal.h +++ b/src/QD3D/3DMFInternal.h @@ -7,7 +7,7 @@ #include #include #include -#include "Utilities/BigEndianIStream.h" +#include "Utilities/bigendianstreams.h" struct Q3MetaFileTOCEntry { diff --git a/src/Sound/AIFF.cpp b/src/Sound/AIFF.cpp index 5c5842b..30a21be 100644 --- a/src/Sound/AIFF.cpp +++ b/src/Sound/AIFF.cpp @@ -1,5 +1,5 @@ #include "PommeSound.h" -#include "Utilities/BigEndianIStream.h" +#include "Utilities/bigendianstreams.h" #include static void AIFFAssert(bool condition, const char* message) diff --git a/src/Sound/SoundManager.cpp b/src/Sound/SoundManager.cpp index 93faeea..20c5739 100644 --- a/src/Sound/SoundManager.cpp +++ b/src/Sound/SoundManager.cpp @@ -2,7 +2,7 @@ #include "PommeFiles.h" #include "Sound/cmixer.h" #include "PommeSound.h" -#include "Utilities/BigEndianIStream.h" +#include "Utilities/bigendianstreams.h" #include "Utilities/memstream.h" #include diff --git a/src/Text/TextUtilities.cpp b/src/Text/TextUtilities.cpp index 61a1db2..48b1b66 100644 --- a/src/Text/TextUtilities.cpp +++ b/src/Text/TextUtilities.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include void NumToString(long theNum, Str255 theString) { diff --git a/src/Utilities/BigEndianIStream.cpp b/src/Utilities/bigendianstreams.cpp similarity index 61% rename from src/Utilities/BigEndianIStream.cpp rename to src/Utilities/bigendianstreams.cpp index 9c361d9..786421d 100644 --- a/src/Utilities/BigEndianIStream.cpp +++ b/src/Utilities/bigendianstreams.cpp @@ -1,4 +1,4 @@ -#include "Utilities/BigEndianIStream.h" +#include "Utilities/bigendianstreams.h" #include "Utilities/IEEEExtended.h" Pomme::StreamPosGuard::StreamPosGuard(std::istream& theStream) : @@ -21,6 +21,8 @@ void Pomme::StreamPosGuard::Cancel() active = false; } +// ---------------------------------------------------------------------------- + Pomme::BigEndianIStream::BigEndianIStream(std::istream& theStream) : stream(theStream) { @@ -82,4 +84,47 @@ std::streampos Pomme::BigEndianIStream::Tell() const Pomme::StreamPosGuard Pomme::BigEndianIStream::GuardPos() { return Pomme::StreamPosGuard(stream); -} \ No newline at end of file +} + +// ---------------------------------------------------------------------------- + +Pomme::BigEndianOStream::BigEndianOStream(std::ostream& theStream) : + stream(theStream) +{ +} + +void Pomme::BigEndianOStream::Write(const char* src, size_t n) +{ + stream.write(src, n); +} + +void Pomme::BigEndianOStream::WritePascalString(const std::string& text, int padToAlignment) +{ + int length = text.length(); + if (length > 255) + { + throw std::out_of_range("WritePascalString: must be <255 characters!"); + } + Write(length); + Write(text.data(), length); + + int padding = (length + 1) % padToAlignment; + for (int i = 0; i < padding; i++) + Write(0); +} + +void Pomme::BigEndianOStream::WriteRawString(const std::string& text) +{ + Write(text.data(), text.length()); +} + +void Pomme::BigEndianOStream::Goto(std::streamoff absoluteOffset) +{ + stream.seekp(absoluteOffset, std::ios_base::beg); +} + +std::streampos Pomme::BigEndianOStream::Tell() const +{ + return stream.tellp(); +} + diff --git a/src/Utilities/BigEndianIStream.h b/src/Utilities/bigendianstreams.h similarity index 61% rename from src/Utilities/BigEndianIStream.h rename to src/Utilities/bigendianstreams.h index 3fdc698..bb382c6 100644 --- a/src/Utilities/BigEndianIStream.h +++ b/src/Utilities/bigendianstreams.h @@ -22,8 +22,6 @@ namespace Pomme class BigEndianIStream { - std::istream& stream; - public: BigEndianIStream(std::istream& theStream); @@ -58,5 +56,40 @@ namespace Pomme #endif return *(T*) b; } + + private: + std::istream& stream; + }; + + class BigEndianOStream + { + public: + BigEndianOStream(std::ostream& theStream); + + void Write(const char* src, size_t n); + + void Goto(std::streamoff absoluteOffset); + + std::streampos Tell() const; + + void WritePascalString(const std::string& text, int padToAlignment = 1); + + void WriteRawString(const std::string& text); + + template + void Write(T value) + { + char* b = (char*) &value; +#if !(TARGET_RT_BIGENDIAN) + if constexpr (sizeof(T) > 1) + { + std::reverse(b, b + sizeof(T)); + } +#endif + Write(b, sizeof(T)); + } + + private: + std::ostream& stream; }; } diff --git a/src/Video/moov.cpp b/src/Video/moov.cpp index 9119cc6..4e6c170 100644 --- a/src/Video/moov.cpp +++ b/src/Video/moov.cpp @@ -1,7 +1,7 @@ #include "Video/Cinepak.h" #include "PommeVideo.h" #include "PommeSound.h" -#include "Utilities/BigEndianIStream.h" +#include "Utilities/bigendianstreams.h" #include "PommeDebug.h" #include