blob: 153c9ba8f2a5dd89e4b143b954e38639168ce111 [file] [log] [blame]
#include "rive/core/binary_reader.hpp"
#include "rive/core/reader.h"
#include <vector>
using namespace rive;
BinaryReader::BinaryReader(uint8_t* bytes, size_t length) :
m_Position(bytes),
m_End(bytes + length),
m_Overflowed(false),
m_Length(length)
{
}
bool BinaryReader::reachedEnd() const
{
return m_Position == m_End || didOverflow();
}
size_t BinaryReader::lengthInBytes() const { return m_Length; }
bool BinaryReader::didOverflow() const { return m_Overflowed; }
void BinaryReader::overflow()
{
m_Overflowed = true;
m_Position = m_End;
}
uint64_t BinaryReader::readVarUint64()
{
uint64_t value;
auto readBytes = decode_uint_leb(m_Position, m_End, &value);
if (readBytes == 0)
{
overflow();
return 0;
}
m_Position += readBytes;
return value;
}
std::string BinaryReader::readString()
{
uint64_t length = readVarUint64();
if (didOverflow())
{
return std::string();
}
std::vector<char> rawValue(length + 1);
auto readBytes = decode_string(length, m_Position, m_End, &rawValue[0]);
if (readBytes != length)
{
overflow();
return std::string();
}
m_Position += readBytes;
return std::string(rawValue.data(), length);
}
std::vector<uint8_t> BinaryReader::readBytes()
{
uint64_t length = readVarUint64();
if (didOverflow())
{
return std::vector<uint8_t>();
}
uint8_t* start = m_Position;
m_Position += length;
return std::vector<uint8_t>(start, start + length);
}
double BinaryReader::readFloat64()
{
double value;
auto readBytes = decode_double(m_Position, m_End, &value);
if (readBytes == 0)
{
overflow();
return 0.0;
}
m_Position += readBytes;
return value;
}
float BinaryReader::readFloat32()
{
float value;
auto readBytes = decode_float(m_Position, m_End, &value);
if (readBytes == 0)
{
overflow();
return 0.0f;
}
m_Position += readBytes;
return value;
}
uint8_t BinaryReader::readByte()
{
if (m_End - m_Position < 1)
{
overflow();
return 0;
}
return *m_Position++;
}
uint32_t BinaryReader::readUint32()
{
uint32_t value;
auto readBytes = decode_uint_32(m_Position, m_End, &value);
if (readBytes == 0)
{
overflow();
return 0;
}
m_Position += readBytes;
return value;
}