lib/nbt: remove a function used to get the next tag type which introduced unnecessary complexity
parent
4363432025
commit
68fbf3ae20
|
@ -424,32 +424,27 @@ namespace NBT {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<uint8_t> nextTagType(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) {
|
|
||||||
if (dataSize <= currentPosition) {
|
|
||||||
return ErrorOr<uint8_t>(true, ErrorCodes::OVERRUN);
|
|
||||||
} else {
|
|
||||||
return ErrorOr<uint8_t>(data[currentPosition]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//FIXME: instead of blindly passing the error code upwards, choose one that
|
//FIXME: instead of blindly passing the error code upwards, choose one that
|
||||||
// is applicable to the situation (for example replace OUT_OF_RANGE with
|
// is applicable to the situation (for example replace OUT_OF_RANGE with
|
||||||
// OVERRUN where appropriate)
|
// OVERRUN where appropriate)
|
||||||
ErrorOr<uint64_t> nextTagTotalSize(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) {
|
ErrorOr<uint64_t> nextTagTotalSize(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) {
|
||||||
ErrorOr<uint8_t> nextTag = nextTagType(data, dataSize, currentPosition);
|
uint8_t nextTag;
|
||||||
if (nextTag.isError) {
|
if (dataSize <= currentPosition) {
|
||||||
return ErrorOr<uint64_t>(true, nextTag.errorCode);
|
return ErrorOr<uint64_t>(true, ErrorCodes::OVERRUN);
|
||||||
|
} else {
|
||||||
|
nextTag = data[currentPosition];
|
||||||
}
|
}
|
||||||
// deal with compound tags separately
|
// deal with compound tags separately
|
||||||
if (nextTag.value == TagType::COMPOUND) return ErrorOr<uint64_t>(false, ErrorCodes::NOT_YET_KNOWN);
|
if (nextTag == TagType::COMPOUND) return ErrorOr<uint64_t>(false, ErrorCodes::NOT_YET_KNOWN);
|
||||||
// deal with end tag before trying to access the name
|
// deal with end tag before trying to access the name
|
||||||
if (nextTag.value == TagType::END) return ErrorOr<uint64_t>(1);
|
if (nextTag == TagType::END) return ErrorOr<uint64_t>(1);
|
||||||
// get name size
|
// get name size
|
||||||
ErrorOr<uint16_t> nameSize = (uint16_t) helper::readInt16(data, dataSize, currentPosition+1);
|
ErrorOr<int16_t> nameSize = helper::readInt16(data, dataSize, currentPosition+1);
|
||||||
if (nameSize.isError) {
|
if (nameSize.isError) {
|
||||||
return ErrorOr<uint64_t>(true, nameSize.errorCode);
|
return ErrorOr<uint64_t>(true, nameSize.errorCode);
|
||||||
}
|
}
|
||||||
switch (nextTag.value) {
|
switch (nextTag) {
|
||||||
case TagType::INT8:
|
case TagType::INT8:
|
||||||
// type byte + name size + data byte -> 4 bytes
|
// type byte + name size + data byte -> 4 bytes
|
||||||
return ErrorOr<uint64_t>((uint64_t) nameSize.value+4);
|
return ErrorOr<uint64_t>((uint64_t) nameSize.value+4);
|
||||||
|
@ -566,14 +561,18 @@ namespace NBT {
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<uint32_t> nextTagDataSize(uint8_t data[], uint64_t dataSize, uint64_t currentPosition){
|
ErrorOr<uint32_t> nextTagDataSize(uint8_t data[], uint64_t dataSize, uint64_t currentPosition){
|
||||||
ErrorOr<uint8_t> nextTag = nexttagType(data, dataSize, currentPosition);
|
|
||||||
if (nextTag.isError) {
|
uint8_t nextTag;
|
||||||
return ErrorOr<int64_t>(true, nextTag.errorCode);
|
if (dataSize <= currentPosition) {
|
||||||
|
return ErrorOr<uint32_t>(true, ErrorCodes::OVERRUN);
|
||||||
|
} else {
|
||||||
|
nextTag = data[currentPosition];
|
||||||
}
|
}
|
||||||
|
|
||||||
// deal with compound tags separately
|
// deal with compound tags separately
|
||||||
if (nextTag.value == TagType::COMPOUND) return ErrorOr<uint64_t>(true, ErrorCodes::NOT_YET_KNOWN);
|
if (nextTag == TagType::COMPOUND) return ErrorOr<uint32_t>(true, ErrorCodes::NOT_YET_KNOWN);
|
||||||
// deal with end tag before trying to access the name
|
// deal with end tag before trying to access the name
|
||||||
if (nextTag.value == TagType::END) return 0;
|
if (nextTag == TagType::END) return 0;
|
||||||
//TODO: implement for all the remaining types
|
//TODO: implement for all the remaining types
|
||||||
// fall-through in case of unknown tag or parsing error
|
// fall-through in case of unknown tag or parsing error
|
||||||
return ErrorOr<uint32_t>(true, ErrorCodes::UNKNOWN);
|
return ErrorOr<uint32_t>(true, ErrorCodes::UNKNOWN);
|
||||||
|
|
Loading…
Reference in New Issue