diff --git a/src/nt_encoding.cpp b/src/nt_encoding.cpp index 8a6ac9ab0c..60603e5aa0 100644 --- a/src/nt_encoding.cpp +++ b/src/nt_encoding.cpp @@ -29,21 +29,6 @@ NtImpl::WriteDouble(char* &buf, double val) *buf++ = (char)(v & 0xff); } -double -NtImpl::ReadDouble(char* &buf) -{ - std::uint64_t val = (*((unsigned char *)buf)) & 0xff; - ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; - ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; - ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; - ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; - ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; - ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; - ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; - ++buf; - return *reinterpret_cast(&val); -} - size_t NT_WriteType(char *buf, NT_Type type, unsigned int proto_rev) { diff --git a/src/nt_encoding.h b/src/nt_encoding.h index f7ca8c569f..f2c8c30fc8 100644 --- a/src/nt_encoding.h +++ b/src/nt_encoding.h @@ -62,8 +62,6 @@ Read32(char* &buf) return val; } -double ReadDouble(char* &buf); - } // namespace NtImpl #endif /* NT_UTIL_H */ diff --git a/src/nt_raw_istream.cpp b/src/nt_raw_istream.cpp index 59a2237899..6ac0839a79 100644 --- a/src/nt_raw_istream.cpp +++ b/src/nt_raw_istream.cpp @@ -7,9 +7,22 @@ #include "nt_raw_istream.h" +#include + using namespace NtImpl; void raw_istream::anchor() { } + +bool +raw_mem_istream::read(void *data, std::size_t len) +{ + if (len > m_left) + return false; + std::memcpy(data, m_cur, len); + m_cur += len; + m_left -= len; + return true; +} diff --git a/src/nt_raw_istream.h b/src/nt_raw_istream.h index af0a715183..58be85db07 100644 --- a/src/nt_raw_istream.h +++ b/src/nt_raw_istream.h @@ -16,6 +16,7 @@ class raw_istream { void anchor(); public: + raw_istream() {} virtual ~raw_istream() {} virtual bool read(void *data, std::size_t len) = 0; virtual void close() = 0; @@ -24,6 +25,20 @@ private: raw_istream& operator= (const raw_istream&); }; +class raw_mem_istream : public raw_istream +{ +public: + raw_mem_istream(const char *mem, std::size_t len) + : m_cur(mem), m_left(len) + {} + virtual ~raw_mem_istream() {} + virtual bool read(void *data, std::size_t len); + virtual void close() {} +private: + const char *m_cur; + std::size_t m_left; +}; + } // namespace NtImpl #endif /* NT_RAW_ISTREAM_H_ */ diff --git a/src/nt_wiredecoder.cpp b/src/nt_wiredecoder.cpp index 730e5f7b1d..11c6a7d66c 100644 --- a/src/nt_wiredecoder.cpp +++ b/src/nt_wiredecoder.cpp @@ -17,6 +17,21 @@ using namespace NtImpl; +static double +read_double(char* &buf) +{ + std::uint64_t val = (*((unsigned char *)buf)) & 0xff; + ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; + ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; + ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; + ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; + ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; + ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; + ++buf; val <<= 8; val |= (*((unsigned char *)buf)) & 0xff; + ++buf; + return *reinterpret_cast(&val); +} + WireDecoder::WireDecoder(raw_istream& is, unsigned int proto_rev) : m_is(is) { @@ -31,6 +46,15 @@ WireDecoder::~WireDecoder() std::free(m_buf); } +bool +WireDecoder::ReadDouble(double *val) +{ + char *buf; + if (!Read(&buf, 8)) return false; + *val = read_double(buf); + return true; +} + void WireDecoder::Realloc(std::size_t len) { @@ -124,7 +148,7 @@ WireDecoder::ReadValue(NT_Type type, NT_Value *value) value->data.arr_double.arr = (double *)std::malloc(size * sizeof(double)); for (unsigned int i=0; idata.arr_double.arr[i] = NtImpl::ReadDouble(buf); + value->data.arr_double.arr[i] = read_double(buf); break; } case NT_STRING_ARRAY: diff --git a/src/nt_wiredecoder.h b/src/nt_wiredecoder.h index 751cf2ddff..15e75b77b2 100644 --- a/src/nt_wiredecoder.h +++ b/src/nt_wiredecoder.h @@ -70,13 +70,7 @@ public: return true; } - bool ReadDouble(double *val) - { - char *buf; - if (!Read(&buf, 8)) return false; - *val = NtImpl::ReadDouble(buf); - return true; - } + bool ReadDouble(double *val); bool ReadULEB128(unsigned long *val) {