Files

288 lines
4.9 KiB
C++
Raw Permalink Normal View History

#include "IInputStream.h"
#include "Common/CFourCC.h"
2026-01-03 11:06:07 -05:00
#include "Common/Log.h"
2025-12-23 14:15:09 -05:00
#include <bit>
2026-01-03 11:06:07 -05:00
#include <cstdio>
2025-12-23 14:15:09 -05:00
2020-06-18 15:59:53 -04:00
IInputStream::~IInputStream() = default;
bool IInputStream::ReadBool()
{
char Val;
ReadBytes(&Val, 1);
#if _DEBUG
if (Val != 0 && Val != 1)
{
2026-01-03 11:06:07 -05:00
NLog::Error("ReadBool() got invalid value: {}", Val);
}
#endif
2025-12-23 14:15:09 -05:00
return Val != 0;
}
int8_t IInputStream::ReadS8()
{
2026-01-11 11:00:26 -05:00
int8_t Val;
ReadBytes(&Val, sizeof(Val));
return Val;
}
uint8_t IInputStream::ReadU8()
2020-06-18 15:59:53 -04:00
{
return static_cast<uint8_t>(ReadS8());
2020-06-18 15:59:53 -04:00
}
int16_t IInputStream::ReadS16()
{
2026-01-11 11:00:26 -05:00
int16_t Val;
ReadBytes(&Val, sizeof(Val));
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::byteswap(Val);
return Val;
}
uint16_t IInputStream::ReadU16()
2020-06-18 15:59:53 -04:00
{
return static_cast<uint16_t>(ReadS16());
2020-06-18 15:59:53 -04:00
}
int32_t IInputStream::ReadS32()
{
2026-01-11 11:00:26 -05:00
int32_t Val;
ReadBytes(&Val, sizeof(Val));
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::byteswap(Val);
return Val;
}
uint32_t IInputStream::ReadU32()
2020-06-18 15:59:53 -04:00
{
return static_cast<uint32_t>(ReadS32());
2020-06-18 15:59:53 -04:00
}
int64_t IInputStream::ReadS64()
{
2026-01-11 11:00:26 -05:00
int64_t Val;
ReadBytes(&Val, sizeof(Val));
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::byteswap(Val);
return Val;
}
uint64_t IInputStream::ReadU64()
2020-06-18 15:59:53 -04:00
{
return static_cast<uint64_t>(ReadS64());
2020-06-18 15:59:53 -04:00
}
float IInputStream::ReadF32()
{
float Val;
ReadBytes(&Val, sizeof(Val));
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::bit_cast<float>(std::byteswap(std::bit_cast<uint32_t>(Val)));
return Val;
}
double IInputStream::ReadF64()
{
double Val;
ReadBytes(&Val, sizeof(Val));
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::bit_cast<double>(std::byteswap(std::bit_cast<uint64_t>(Val)));
return Val;
}
CFourCC IInputStream::ReadFourCC()
{
2026-01-11 11:00:26 -05:00
uint32_t Val;
ReadBytes(&Val, sizeof(Val));
2025-12-23 14:15:09 -05:00
if constexpr (std::endian::native == std::endian::little)
Val = std::byteswap(Val);
return CFourCC(Val);
}
TString IInputStream::ReadString()
{
TString Str;
char Chr;
do
{
Chr = ReadS8();
2020-06-18 15:59:53 -04:00
if (Chr != 0)
Str.Append(Chr);
}
2020-06-18 15:59:53 -04:00
while (Chr != 0 && !EoF());
return Str;
}
2020-06-18 15:59:53 -04:00
TString IInputStream::ReadString(size_t Count)
{
TString Str(Count, 0);
2020-06-18 15:59:53 -04:00
ReadBytes(Str.Data(), Count);
return Str;
}
TString IInputStream::ReadSizedString()
{
const auto StringSize = ReadU32();
return ReadString(StringSize);
}
T16String IInputStream::Read16String()
{
T16String Out;
char16_t Chr = 1;
do
{
Chr = ReadS16();
2020-06-18 15:59:53 -04:00
if (Chr != 0)
Out.Append(Chr);
}
while (Chr != 0 && !EoF());
return Out;
}
2020-06-18 15:59:53 -04:00
T16String IInputStream::Read16String(size_t Count)
{
T16String Out(Count, 0);
2020-06-18 15:59:53 -04:00
for (size_t i = 0; i < Count; i++)
{
Out[i] = ReadS16();
}
return Out;
}
T16String IInputStream::ReadSized16String()
{
const auto StringSize = ReadU32();
return Read16String(StringSize);
}
int8_t IInputStream::PeekS8()
{
const auto Val = ReadS8();
Seek(-1, SEEK_CUR);
return Val;
}
uint8_t IInputStream::PeekU8()
2020-06-18 15:59:53 -04:00
{
return static_cast<uint8_t>(PeekS8());
2020-06-18 15:59:53 -04:00
}
int16_t IInputStream::PeekS16()
{
const auto Val = ReadS16();
Seek(-2, SEEK_CUR);
return Val;
}
uint16_t IInputStream::PeekU16()
2020-06-18 15:59:53 -04:00
{
return static_cast<uint16_t>(PeekS16());
2020-06-18 15:59:53 -04:00
}
int32_t IInputStream::PeekS32()
{
const auto Val = ReadS32();
Seek(-4, SEEK_CUR);
return Val;
}
uint32_t IInputStream::PeekU32()
2020-06-18 15:59:53 -04:00
{
return static_cast<uint32_t>(PeekS32());
2020-06-18 15:59:53 -04:00
}
int64_t IInputStream::PeekS64()
{
const auto Val = ReadS64();
Seek(-8, SEEK_CUR);
return Val;
}
uint64_t IInputStream::PeekU64()
2020-06-18 15:59:53 -04:00
{
return static_cast<uint64_t>(PeekS64());
2020-06-18 15:59:53 -04:00
}
float IInputStream::PeekF32()
{
const auto Val = ReadF32();
Seek(-4, SEEK_CUR);
return Val;
}
double IInputStream::PeekF64()
{
const auto Val = ReadF64();
Seek(-8, SEEK_CUR);
return Val;
}
CFourCC IInputStream::PeekFourCC()
{
const auto Val = ReadFourCC();
Seek(-4, SEEK_CUR);
return Val;
}
2026-01-11 11:00:26 -05:00
bool IInputStream::GoTo(uint32_t Address)
{
return Seek(Address, SEEK_SET);
}
2026-01-11 11:00:26 -05:00
bool IInputStream::Skip(int32_t SkipAmount)
{
return Seek(SkipAmount, SEEK_CUR);
}
2026-01-11 11:00:26 -05:00
void IInputStream::SeekToBoundary(uint32_t Boundary)
{
2026-01-11 11:00:26 -05:00
const uint32_t Num = Boundary - (Tell() % Boundary);
2020-06-18 15:59:53 -04:00
if (Num == Boundary)
return;
Seek(Num, SEEK_CUR);
}
2025-12-23 14:15:09 -05:00
void IInputStream::SetEndianness(std::endian Endianness)
{
mDataEndianness = Endianness;
}
void IInputStream::SetSourceString(TString source)
{
mDataSource = std::move(source);
}
2025-12-23 14:15:09 -05:00
std::endian IInputStream::GetEndianness() const
{
return mDataEndianness;
}
const TString& IInputStream::GetSourceString() const
{
return mDataSource;
}
2026-01-11 11:00:26 -05:00
bool IInputStream::Seek64(int64_t Offset, uint32_t Origin)
{
2026-01-11 11:00:26 -05:00
return Seek(static_cast<int32_t>(Offset), Origin);
}
2026-01-11 11:00:26 -05:00
uint64_t IInputStream::Tell64() const
{
2026-01-11 11:00:26 -05:00
return static_cast<uint64_t>(Tell());
}