Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions src/lib/libone_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,66 @@ uint64_t readU64(librevenge::RVNGInputStream *input, bool bigEndian)
throw EndOfStreamException();
}

int8_t read8(librevenge::RVNGInputStream *input, bool /* bigEndian */)
{
checkStream(input);

unsigned long numBytesRead;
uint8_t const *p = input->read(sizeof(int8_t), numBytesRead);

if (p && numBytesRead == sizeof(int8_t))
return static_cast<int8_t>(*(uint8_t const *)(p));
throw EndOfStreamException();
}

int16_t read16(librevenge::RVNGInputStream *input, bool bigEndian)
{
checkStream(input);

unsigned long numBytesRead;
uint8_t const *p = input->read(sizeof(int16_t), numBytesRead);

if (p && numBytesRead == sizeof(int16_t))
{
if (bigEndian)
return static_cast<int16_t>((uint16_t)p[1]|((uint16_t)p[0]<<8));
return static_cast<int16_t>((uint16_t)p[0]|((uint16_t)p[1]<<8));
}
throw EndOfStreamException();
}

int32_t read32(librevenge::RVNGInputStream *input, bool bigEndian)
{
checkStream(input);

unsigned long numBytesRead;
uint8_t const *p = input->read(sizeof(int32_t), numBytesRead);

if (p && numBytesRead == sizeof(int32_t))
{
if (bigEndian)
return static_cast<int32_t>((uint32_t)p[3]|((uint32_t)p[2]<<8)|((uint32_t)p[1]<<16)|((uint32_t)p[0]<<24));
return static_cast<int32_t>((uint32_t)p[0]|((uint32_t)p[1]<<8)|((uint32_t)p[2]<<16)|((uint32_t)p[3]<<24));
}
throw EndOfStreamException();
}

int64_t read64(librevenge::RVNGInputStream *input, bool bigEndian)
{
checkStream(input);

unsigned long numBytesRead;
uint8_t const *p = input->read(sizeof(int64_t), numBytesRead);

if (p && numBytesRead == sizeof(int64_t))
{
if (bigEndian)
return static_cast<int64_t>((uint64_t)p[7]|((uint64_t)p[6]<<8)|((uint64_t)p[5]<<16)|((uint64_t)p[4]<<24)|((uint64_t)p[3]<<32)|((uint64_t)p[2]<<40)|((uint64_t)p[1]<<48)|((uint64_t)p[0]<<56));
return static_cast<int64_t>((uint64_t)p[0]|((uint64_t)p[1]<<8)|((uint64_t)p[2]<<16)|((uint64_t)p[3]<<24)|((uint64_t)p[4]<<32)|((uint64_t)p[5]<<40)|((uint64_t)p[6]<<48)|((uint64_t)p[7]<<56));
}
throw EndOfStreamException();
}

const unsigned char *readNBytes(librevenge::RVNGInputStream *const input, const unsigned long numBytes)
{
checkStream(input);
Expand Down Expand Up @@ -199,6 +259,26 @@ uint64_t readU64(const std::shared_ptr<librevenge::RVNGInputStream> input, const
return readU64(input.get(), bigEndian);
}

int8_t read8(const std::shared_ptr<librevenge::RVNGInputStream> input, bool)
{
return read8(input.get());
}

int16_t read16(const std::shared_ptr<librevenge::RVNGInputStream> input, const bool bigEndian)
{
return read16(input.get(), bigEndian);
}

int32_t read32(const std::shared_ptr<librevenge::RVNGInputStream> input, const bool bigEndian)
{
return read32(input.get(), bigEndian);
}

int64_t read64(const std::shared_ptr<librevenge::RVNGInputStream> input, const bool bigEndian)
{
return read64(input.get(), bigEndian);
}

const unsigned char *readNBytes(const std::shared_ptr<librevenge::RVNGInputStream> input, const unsigned long numBytes)
{
return readNBytes(input.get(), numBytes);
Expand Down Expand Up @@ -234,6 +314,50 @@ unsigned long getLength(const std::shared_ptr<librevenge::RVNGInputStream> input
return getLength(input.get());
}


const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint8_t &val)
{
val = readU8(input, false);
return input;
}
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint16_t &val)
{
val = readU16(input, false);
return input;
}
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint32_t &val)
{
val = readU32(input, false);
return input;
}
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint64_t &val)
{
val = readU64(input, false);
return input;
}

const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, int8_t &val)
{
val = read8(input, false);
return input;
}
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, int16_t &val)
{
val = read16(input, false);
return input;
}
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, int32_t &val)
{
val = read32(input, false);
return input;
}
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, int64_t &val)
{
val = read64(input, false);
return input;
}


template <typename T>
std::string int_to_hex(const T i)
{
Expand Down
21 changes: 21 additions & 0 deletions src/lib/libone_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,11 @@ uint16_t readU16(librevenge::RVNGInputStream *input, bool bigEndian=false);
uint32_t readU32(librevenge::RVNGInputStream *input, bool bigEndian=false);
uint64_t readU64(librevenge::RVNGInputStream *input, bool bigEndian=false);

int8_t read8(librevenge::RVNGInputStream *input, bool = false);
int16_t read16(librevenge::RVNGInputStream *input, bool bigEndian=false);
int32_t read32(librevenge::RVNGInputStream *input, bool bigEndian=false);
int64_t read64(librevenge::RVNGInputStream *input, bool bigEndian=false);

const unsigned char *readNBytes(librevenge::RVNGInputStream *input, unsigned long numBytes);

std::string readCString(librevenge::RVNGInputStream *input);
Expand All @@ -96,6 +101,11 @@ uint16_t readU16(std::shared_ptr<librevenge::RVNGInputStream> input, bool bigEnd
uint32_t readU32(std::shared_ptr<librevenge::RVNGInputStream> input, bool bigEndian=false);
uint64_t readU64(std::shared_ptr<librevenge::RVNGInputStream> input, bool bigEndian=false);

int8_t read8(std::shared_ptr<librevenge::RVNGInputStream> input, bool = false);
int16_t read16(std::shared_ptr<librevenge::RVNGInputStream> input, bool bigEndian=false);
int32_t read32(std::shared_ptr<librevenge::RVNGInputStream> input, bool bigEndian=false);
int64_t read64(std::shared_ptr<librevenge::RVNGInputStream> input, bool bigEndian=false);

const unsigned char *readNBytes(std::shared_ptr<librevenge::RVNGInputStream> input, unsigned long numBytes);

std::string readCString(std::shared_ptr<librevenge::RVNGInputStream> input);
Expand All @@ -108,6 +118,17 @@ void seekRelative(std::shared_ptr<librevenge::RVNGInputStream> input, long pos);

unsigned long getLength(std::shared_ptr<librevenge::RVNGInputStream> input);


const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint8_t &val);
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint16_t &val);
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint32_t &val);
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint64_t &val);
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, int8_t &val);
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, int16_t &val);
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, int32_t &val);
const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, int64_t &val);


template <typename T>
std::string int_to_hex(const T i);

Expand Down