NBT: implement NBT::helper::readInt32Array
parent
562fbcecbb
commit
edcf40d5a5
|
@ -125,8 +125,19 @@ namespace NBT {
|
||||||
//}
|
//}
|
||||||
|
|
||||||
ErrorOr<std::vector<int32_t>> readInt32Array(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) {
|
ErrorOr<std::vector<int32_t>> readInt32Array(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) {
|
||||||
//TODO: implement
|
// get size prefix
|
||||||
return ErrorOr<std::vector<int32_t>>({0});
|
ErrorOr<int32_t> size = readInt32(data, dataSize, currentPosition);
|
||||||
|
if (size.isError) return ErrorOr<std::vector<int32_t>>(true, size.errorCode);
|
||||||
|
|
||||||
|
// get content
|
||||||
|
if (currentPosition+4+(size.value*4) > dataSize) return ErrorOr<std::vector<int32_t>>(true, ErrorCodes::OVERRUN_ERROR);
|
||||||
|
std::vector<int32_t> result = std::vector<int32_t>();
|
||||||
|
for (int i=0; i<size.value; i++) {
|
||||||
|
ErrorOr<int32_t> nextInt32 = readInt32(data, dataSize, currentPosition+4+(i*4));
|
||||||
|
if (nextInt32.isError) return ErrorOr<std::vector<int32_t>>(true, nextInt32.errorCode);
|
||||||
|
result.push_back(nextInt32.value);
|
||||||
|
}
|
||||||
|
return ErrorOr<std::vector<int32_t>>(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<std::vector<int64_t>> readInt64Array(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) {
|
ErrorOr<std::vector<int64_t>> readInt64Array(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) {
|
||||||
|
|
|
@ -160,5 +160,29 @@ int main(){
|
||||||
|
|
||||||
std::cout << "Passed int8[] NBT helper test" << std::endl;
|
std::cout << "Passed int8[] NBT helper test" << std::endl;
|
||||||
|
|
||||||
|
// int32 "array" ###################################################
|
||||||
|
// read successfully
|
||||||
|
currentPosition = 68;
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).value == std::vector<int32_t>({1027489600, 1094861636, 1162233672, 1229605708, 1296977744, 1364349780, 1431721816, 1499093852, 1566465888, 1633837924}));
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).isError == false);
|
||||||
|
// read empty
|
||||||
|
currentPosition = 112;
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).value == std::vector<int32_t>());
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).isError == false);
|
||||||
|
// read overrun
|
||||||
|
currentPosition = 20;
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).isError == true);
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).errorCode == ErrorCodes::OVERRUN_ERROR);
|
||||||
|
// read with size partially out of bounds
|
||||||
|
currentPosition = 114;
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).isError == true);
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).errorCode == ErrorCodes::RANGE_ERROR);
|
||||||
|
// read out of bounds
|
||||||
|
currentPosition = 200;
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).isError == true);
|
||||||
|
ASSERT(NBT::helper::readInt32Array(dataForIntArrayTest, dataSize, currentPosition).errorCode == ErrorCodes::RANGE_ERROR);
|
||||||
|
|
||||||
|
std::cout << "Passed int32[] NBT helper test" << std::endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue