[ox/mc] Fix int reads not to clear out unions
This commit is contained in:
parent
1d07890668
commit
d2e7528dae
2
deps/ox/src/ox/mc/read.cpp
vendored
2
deps/ox/src/ox/mc/read.cpp
vendored
@ -73,7 +73,7 @@ Error MetalClawReader::field(const char*, bool *val) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Error MetalClawReader::field(const char*, SerStr val) {
|
Error MetalClawReader::field(const char*, SerStr val) {
|
||||||
if ((m_unionIdx == -1 || m_unionIdx == m_field)) {
|
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||||
if (m_fieldPresence.get(m_field)) {
|
if (m_fieldPresence.get(m_field)) {
|
||||||
// read the length
|
// read the length
|
||||||
if (m_buffIt >= m_buffLen) {
|
if (m_buffIt >= m_buffLen) {
|
||||||
|
110
deps/ox/src/ox/mc/read.hpp
vendored
110
deps/ox/src/ox/mc/read.hpp
vendored
@ -145,18 +145,20 @@ Error MetalClawReader::field(const char *name, ox::BString<L> *val) {
|
|||||||
|
|
||||||
template<typename I>
|
template<typename I>
|
||||||
Error MetalClawReader::readInteger(I *val) {
|
Error MetalClawReader::readInteger(I *val) {
|
||||||
if ((m_unionIdx == -1 || m_unionIdx == m_field) && m_fieldPresence.get(m_field)) {
|
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||||
std::size_t bytesRead = 0;
|
if (m_fieldPresence.get(m_field)) {
|
||||||
if (m_buffIt >= m_buffLen) {
|
std::size_t bytesRead = 0;
|
||||||
oxTrace("ox::MetalClaw::readInteger") << "Buffer ended";
|
if (m_buffIt >= m_buffLen) {
|
||||||
return OxError(MC_BUFFENDED);
|
oxTrace("ox::MetalClaw::readInteger") << "Buffer ended";
|
||||||
|
return OxError(MC_BUFFENDED);
|
||||||
|
}
|
||||||
|
auto valErr = mc::decodeInteger<I>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
||||||
|
m_buffIt += bytesRead;
|
||||||
|
oxReturnError(valErr.error);
|
||||||
|
*val = valErr.value;
|
||||||
|
} else {
|
||||||
|
*val = 0;
|
||||||
}
|
}
|
||||||
auto valErr = mc::decodeInteger<I>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
|
||||||
m_buffIt += bytesRead;
|
|
||||||
oxReturnError(valErr.error);
|
|
||||||
*val = valErr.value;
|
|
||||||
} else {
|
|
||||||
*val = 0;
|
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
@ -165,26 +167,28 @@ Error MetalClawReader::readInteger(I *val) {
|
|||||||
// array handler
|
// array handler
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) {
|
Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) {
|
||||||
if ((m_unionIdx == -1 || m_unionIdx == m_field) && m_fieldPresence.get(m_field)) {
|
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||||
// read the length
|
if (m_fieldPresence.get(m_field)) {
|
||||||
if (m_buffIt >= m_buffLen) {
|
// read the length
|
||||||
return OxError(MC_BUFFENDED);
|
if (m_buffIt >= m_buffLen) {
|
||||||
}
|
return OxError(MC_BUFFENDED);
|
||||||
std::size_t bytesRead = 0;
|
}
|
||||||
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
std::size_t bytesRead = 0;
|
||||||
m_buffIt += bytesRead;
|
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
||||||
oxReturnError(len.error);
|
m_buffIt += bytesRead;
|
||||||
|
oxReturnError(len.error);
|
||||||
// read the list
|
|
||||||
if (valLen >= len.value) {
|
// read the list
|
||||||
auto reader = child("");
|
if (valLen >= len.value) {
|
||||||
reader.setTypeInfo("List", len.value);
|
auto reader = child("");
|
||||||
for (std::size_t i = 0; i < len.value; i++) {
|
reader.setTypeInfo("List", len.value);
|
||||||
oxReturnError(reader.field("", &val[i]));
|
for (std::size_t i = 0; i < len.value; i++) {
|
||||||
|
oxReturnError(reader.field("", &val[i]));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
oxTrace("ox::mc::read::field(T)") << name << ", size:" << valLen;
|
||||||
|
return OxError(MC_OUTBUFFENDED);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
oxTrace("ox::mc::read::field(T)") << name << ", size:" << valLen;
|
|
||||||
return OxError(MC_OUTBUFFENDED);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
@ -193,23 +197,25 @@ Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) {
|
|||||||
|
|
||||||
template<typename T, typename Handler>
|
template<typename T, typename Handler>
|
||||||
Error MetalClawReader::field(const char*, Handler handler) {
|
Error MetalClawReader::field(const char*, Handler handler) {
|
||||||
if ((m_unionIdx == -1 || m_unionIdx == m_field) && m_fieldPresence.get(m_field)) {
|
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||||
// read the length
|
if (m_fieldPresence.get(m_field)) {
|
||||||
if (m_buffIt >= m_buffLen) {
|
// read the length
|
||||||
return OxError(MC_BUFFENDED);
|
if (m_buffIt >= m_buffLen) {
|
||||||
}
|
return OxError(MC_BUFFENDED);
|
||||||
std::size_t bytesRead = 0;
|
}
|
||||||
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
std::size_t bytesRead = 0;
|
||||||
m_buffIt += bytesRead;
|
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
||||||
oxReturnError(len.error);
|
m_buffIt += bytesRead;
|
||||||
|
oxReturnError(len.error);
|
||||||
|
|
||||||
// read the list
|
// read the list
|
||||||
auto reader = child("");
|
auto reader = child("");
|
||||||
reader.setTypeInfo("List", len.value);
|
reader.setTypeInfo("List", len.value);
|
||||||
for (std::size_t i = 0; i < len.value; i++) {
|
for (std::size_t i = 0; i < len.value; i++) {
|
||||||
T val;
|
T val;
|
||||||
oxReturnError(reader.field("", &val));
|
oxReturnError(reader.field("", &val));
|
||||||
oxReturnError(handler(i, &val));
|
oxReturnError(handler(i, &val));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
@ -218,11 +224,13 @@ Error MetalClawReader::field(const char*, Handler handler) {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Error MetalClawReader::field(const char* name, ox::Vector<T> *val) {
|
Error MetalClawReader::field(const char* name, ox::Vector<T> *val) {
|
||||||
if ((m_unionIdx == -1 || m_unionIdx == m_field) && m_fieldPresence.get(m_field)) {
|
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||||
const auto [len, err] = arrayLength(name, false);
|
if (m_fieldPresence.get(m_field)) {
|
||||||
oxReturnError(err);
|
const auto [len, err] = arrayLength(name, false);
|
||||||
val->resize(len);
|
oxReturnError(err);
|
||||||
return field(name, val->data(), val->size());
|
val->resize(len);
|
||||||
|
return field(name, val->data(), val->size());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user