diff --git a/deps/ox/src/ox/mc/read.cpp b/deps/ox/src/ox/mc/read.cpp index 8010ae3e..db929a10 100644 --- a/deps/ox/src/ox/mc/read.cpp +++ b/deps/ox/src/ox/mc/read.cpp @@ -95,19 +95,19 @@ Error MetalClawReader::field(const char*, SerStr val) { } [[nodiscard]] ValErr MetalClawReader::arrayLength(bool pass) { - std::size_t len = 0; if (m_fieldPresence.get(m_field)) { // read the length if (m_buffIt >= m_buffLen) { return OxError(MC_BUFFENDED); } std::size_t bytesRead = 0; - len = mc::decodeInteger(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead).value; + auto out = mc::decodeInteger(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead).value; if (pass) { - m_buffIt += sizeof(ArrayLength); + m_buffIt += bytesRead; } + return out; } - return len; + return OxError(1); } [[nodiscard]] StringLength MetalClawReader::stringLength() { diff --git a/deps/ox/src/ox/mc/read.hpp b/deps/ox/src/ox/mc/read.hpp index 6b25c267..4f096d67 100644 --- a/deps/ox/src/ox/mc/read.hpp +++ b/deps/ox/src/ox/mc/read.hpp @@ -56,11 +56,11 @@ class MetalClawReader { // array handler, with callback to allow handling individual elements template - Error field(const char*, Handler *val); + Error field(const char*, Handler handler); // array handler, with callback to allow handling individual elements template - Error field(const char*, Handler *val, ArrayLength len); + Error field(const char*, Handler handler, ArrayLength len); template Error field(const char*, ox::Vector *val); @@ -132,6 +132,7 @@ Error MetalClawReader::readInteger(I *val) { if (m_fieldPresence.get(m_field++)) { std::size_t bytesRead = 0; if (m_buffIt >= m_buffLen) { + oxTrace("ox::MetalClaw::readInteger") << "Buffer ended"; return OxError(MC_BUFFENDED); } auto valErr = mc::decodeInteger(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead); @@ -173,23 +174,21 @@ Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) { } template -Error MetalClawReader::field(const char *name, Handler *handler) { - auto [arrayLen, err] = arrayLength(true); - oxReturnError(err); - return field(name, handler, arrayLen); -} - -template -Error MetalClawReader::field(const char*, Handler *handler, ArrayLength len) { +Error MetalClawReader::field(const char*, Handler handler) { if (m_fieldPresence.get(m_field++)) { // read the length if (m_buffIt >= m_buffLen) { return OxError(MC_BUFFENDED); } + std::size_t bytesRead = 0; + auto len = mc::decodeInteger(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead); + m_buffIt += bytesRead; + oxReturnError(len.error); + // read the list auto reader = child(); - reader.setTypeInfo("List", len); - for (std::size_t i = 0; i < len; i++) { + reader.setTypeInfo("List", len.value); + for (std::size_t i = 0; i < len.value; i++) { T val; oxReturnError(reader.field("", &val)); oxReturnError(handler(i, &val));