lib/nbt: Fix a bug in nextTagTotalSize and significantly improve readability by removing redundant code
parent
7a2c1d7d57
commit
027f324f03
|
@ -377,7 +377,7 @@ namespace NBT {
|
|||
//
|
||||
// Does not work for compound tags and lists. This is an intended
|
||||
// feature as compound tags and lists need to be dealt with
|
||||
// separately to avoid unnecessarily complex code.
|
||||
// separately to avoid unnecessarily long and complex code.
|
||||
//
|
||||
// Regardinng lists specifically: The size of some lists can can
|
||||
// be determined easily by looking at the contained data type and
|
||||
|
@ -397,81 +397,53 @@ namespace NBT {
|
|||
if (nextTag == TagType::COMPOUND || nextTag == TagType::LIST) return ErrorOr<uint64_t>(false, ErrorCodes::NOT_YET_KNOWN);
|
||||
// deal with end tag before trying to access the name
|
||||
if (nextTag == TagType::END) return ErrorOr<uint64_t>(1);
|
||||
// get name size
|
||||
|
||||
ErrorOr<int16_t> nameSize = helper::readInt16(data, dataSize, currentPosition+1);
|
||||
if (nameSize.isError) {
|
||||
return ErrorOr<uint64_t>(true, nameSize.errorCode);
|
||||
}
|
||||
// add type byte and name size bytes
|
||||
uint64_t prefixSize = (uint64_t) nameSize.value + 3;
|
||||
switch (nextTag) {
|
||||
case TagType::INT8:
|
||||
// type byte + name size + data byte -> 4 bytes
|
||||
return ErrorOr<uint64_t>((uint64_t) nameSize.value+4);
|
||||
return ErrorOr<uint64_t>(prefixSize+1);
|
||||
case TagType::INT16:
|
||||
// type byte + name size + 2 data bytes -> 5 bytes
|
||||
return ErrorOr<uint64_t>((uint64_t) nameSize.value+5);
|
||||
return ErrorOr<uint64_t>(prefixSize+2);
|
||||
case TagType::INT32:
|
||||
// type byte + name size + 4 data bytes -> 7 bytes
|
||||
return ErrorOr<uint64_t>((uint64_t) nameSize.value+7);
|
||||
return ErrorOr<uint64_t>(prefixSize+4);
|
||||
case TagType::INT64:
|
||||
// type byte + name size + 8 data bytes -> 11 bytes
|
||||
return ErrorOr<uint64_t>((uint64_t) nameSize.value+11);
|
||||
return ErrorOr<uint64_t>(prefixSize+8);
|
||||
case TagType::FLOAT:
|
||||
// type byte + name size + 4 data bytes -> 7 bytes
|
||||
return ErrorOr<uint64_t>((uint64_t) nameSize.value+7);
|
||||
return ErrorOr<uint64_t>(prefixSize+4);
|
||||
case TagType::DOUBLE:
|
||||
// type byte + name size + 8 data bytes -> 11 bytes
|
||||
return ErrorOr<uint64_t>((uint64_t) nameSize.value+11);
|
||||
return ErrorOr<uint64_t>(prefixSize+8);
|
||||
case TagType::INT8_ARRAY: {
|
||||
// type byte + name size + 4 size bytes -> 7 bytes
|
||||
uint64_t totalSize = (uint64_t) nameSize.value+7;
|
||||
|
||||
// add size of actual data (1 byte per entry)
|
||||
ErrorOr<int32_t> arraySize = helper::readInt32(data, dataSize, currentPosition+totalSize);
|
||||
if (arraySize.isError) {
|
||||
return ErrorOr<uint64_t>(true, arraySize.errorCode);
|
||||
ErrorOr<int32_t> arrayLength = helper::readInt32(data, dataSize, currentPosition+prefixSize);
|
||||
if (arrayLength.isError) {
|
||||
return ErrorOr<uint64_t>(true, arrayLength.errorCode);
|
||||
}
|
||||
totalSize += (uint64_t) arraySize.value;
|
||||
|
||||
return ErrorOr<uint64_t>(totalSize);
|
||||
return ErrorOr<uint64_t>((uint64_t) arrayLength.value + prefixSize + 4);
|
||||
}
|
||||
case TagType::STRING: {
|
||||
// type byte + name size + 2 size bytes -> 5 bytes
|
||||
uint64_t totalSize = (uint64_t) nameSize.value+5;
|
||||
|
||||
// add size of actual data
|
||||
ErrorOr<int16_t> stringSize = helper::readInt16(data, dataSize, currentPosition+totalSize);
|
||||
ErrorOr<int16_t> stringSize = helper::readInt16(data, dataSize, currentPosition+prefixSize);
|
||||
if (stringSize.isError) {
|
||||
return ErrorOr<uint64_t>(true, stringSize.errorCode);
|
||||
}
|
||||
totalSize += (uint64_t) stringSize.value;
|
||||
|
||||
return ErrorOr<uint64_t>(totalSize);
|
||||
return ErrorOr<uint64_t>((uint64_t) stringSize.value + prefixSize + 2);
|
||||
}
|
||||
case TagType::INT32_ARRAY: {
|
||||
// type byte + name size + 4 size bytes -> 7 bytes
|
||||
uint64_t totalSize = (uint64_t) nameSize.value+7;
|
||||
|
||||
// add size of actual data (4 bytes per entry)
|
||||
ErrorOr<int16_t> arraySize = helper::readInt16(data, dataSize, currentPosition+totalSize);
|
||||
if (arraySize.isError) {
|
||||
return ErrorOr<uint64_t>(true, arraySize.errorCode);
|
||||
ErrorOr<int32_t> arrayLength = helper::readInt32(data, dataSize, currentPosition+prefixSize);
|
||||
if (arrayLength.isError) {
|
||||
return ErrorOr<uint64_t>(true, arrayLength.errorCode);
|
||||
}
|
||||
totalSize += (uint64_t) arraySize.value*4;
|
||||
|
||||
return ErrorOr<uint64_t>(totalSize);
|
||||
return ErrorOr<uint64_t>((uint64_t) arrayLength.value*4 + prefixSize + 4);
|
||||
}
|
||||
case TagType::INT64_ARRAY: {
|
||||
// type byte + name size + 4 size bytes -> 7 bytes
|
||||
uint64_t totalSize = (uint64_t) nameSize.value+7;
|
||||
|
||||
// add size of actual data (8 bytes per entry)
|
||||
ErrorOr<int16_t> arraySize = helper::readInt16(data, dataSize, currentPosition+totalSize);
|
||||
if (arraySize.isError) {
|
||||
return ErrorOr<uint64_t>(true, arraySize.errorCode);
|
||||
ErrorOr<int32_t> arrayLength = helper::readInt32(data, dataSize, currentPosition+prefixSize);
|
||||
if (arrayLength.isError) {
|
||||
return ErrorOr<uint64_t>(true, arrayLength.errorCode);
|
||||
}
|
||||
totalSize += (uint64_t) arraySize.value*8;
|
||||
|
||||
return ErrorOr<uint64_t>(totalSize);
|
||||
return ErrorOr<uint64_t>((uint64_t) arrayLength.value*8 + prefixSize + 4);
|
||||
}
|
||||
// unknown tag or parsing error
|
||||
default:
|
||||
|
|
Loading…
Reference in New Issue