From 98245cf2371484d1c5f4789ef1f03fca33e78814 Mon Sep 17 00:00:00 2001 From: Sebastian Engel Date: Sun, 23 Aug 2020 04:21:46 +0300 Subject: [PATCH 1/2] utils: Add extraction operators for uint{8,16,32,64}_t types --- src/lib/libone_utils.cpp | 24 ++++++++++++++++++++++++ src/lib/libone_utils.h | 7 +++++++ 2 files changed, 31 insertions(+) diff --git a/src/lib/libone_utils.cpp b/src/lib/libone_utils.cpp index 67935d2..5d5a597 100644 --- a/src/lib/libone_utils.cpp +++ b/src/lib/libone_utils.cpp @@ -234,6 +234,30 @@ unsigned long getLength(const std::shared_ptr 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; +} + + + template std::string int_to_hex(const T i) { diff --git a/src/lib/libone_utils.h b/src/lib/libone_utils.h index 43fd44c..a7188f3 100644 --- a/src/lib/libone_utils.h +++ b/src/lib/libone_utils.h @@ -108,6 +108,13 @@ void seekRelative(std::shared_ptr input, long pos); unsigned long getLength(std::shared_ptr 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); + + template std::string int_to_hex(const T i); From 931cc30a550b60a9f15777c8f5a34e393937f939 Mon Sep 17 00:00:00 2001 From: Sebastian Engel Date: Sun, 23 Aug 2020 15:03:52 +0300 Subject: [PATCH 2/2] utils: Add helper functions to read/extract signed integer types --- src/lib/libone_utils.cpp | 100 +++++++++++++++++++++++++++++++++++++++ src/lib/libone_utils.h | 14 ++++++ 2 files changed, 114 insertions(+) diff --git a/src/lib/libone_utils.cpp b/src/lib/libone_utils.cpp index 5d5a597..24a943c 100644 --- a/src/lib/libone_utils.cpp +++ b/src/lib/libone_utils.cpp @@ -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(*(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((uint16_t)p[1]|((uint16_t)p[0]<<8)); + return static_cast((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((uint32_t)p[3]|((uint32_t)p[2]<<8)|((uint32_t)p[1]<<16)|((uint32_t)p[0]<<24)); + return static_cast((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((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((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); @@ -199,6 +259,26 @@ uint64_t readU64(const std::shared_ptr input, const return readU64(input.get(), bigEndian); } +int8_t read8(const std::shared_ptr input, bool) +{ + return read8(input.get()); +} + +int16_t read16(const std::shared_ptr input, const bool bigEndian) +{ + return read16(input.get(), bigEndian); +} + +int32_t read32(const std::shared_ptr input, const bool bigEndian) +{ + return read32(input.get(), bigEndian); +} + +int64_t read64(const std::shared_ptr input, const bool bigEndian) +{ + return read64(input.get(), bigEndian); +} + const unsigned char *readNBytes(const std::shared_ptr input, const unsigned long numBytes) { return readNBytes(input.get(), numBytes); @@ -256,6 +336,26 @@ const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint64 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 diff --git a/src/lib/libone_utils.h b/src/lib/libone_utils.h index a7188f3..bd558f3 100644 --- a/src/lib/libone_utils.h +++ b/src/lib/libone_utils.h @@ -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); @@ -96,6 +101,11 @@ uint16_t readU16(std::shared_ptr input, bool bigEnd uint32_t readU32(std::shared_ptr input, bool bigEndian=false); uint64_t readU64(std::shared_ptr input, bool bigEndian=false); +int8_t read8(std::shared_ptr input, bool = false); +int16_t read16(std::shared_ptr input, bool bigEndian=false); +int32_t read32(std::shared_ptr input, bool bigEndian=false); +int64_t read64(std::shared_ptr input, bool bigEndian=false); + const unsigned char *readNBytes(std::shared_ptr input, unsigned long numBytes); std::string readCString(std::shared_ptr input); @@ -113,6 +123,10 @@ const RVNGInputStreamPtr_t &operator>>(const RVNGInputStreamPtr_t &input, uint8_ 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