// Copyright 2022, FOSS-VG Developers and Contributers // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, version 3. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // version 3 along with this program. // If not, see https://www.gnu.org/licenses/agpl-3.0.en.html #include #include #include #include "nbt.h++" #include "error.h++" // This is just an example for how to find out if the system is big endian // or little endian. Do not use this. int endianness_example() { if constexpr (std::endian::native == std::endian::big) { // Big-endian system return 0; } else if constexpr (std::endian::native == std::endian::little) { // Little-endian system return 1; } else { // Something else return 2; // How did we even end up here? } } namespace NBT { namespace helper { ErrorOr readInt8(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { if (dataSize<=currentPosition) return ErrorOr(true, ErrorCodes::RANGE_ERROR); return ErrorOr((int8_t) data[currentPosition]); } ErrorOr readInt16(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { //TODO: implement return ErrorOr((int16_t) 0); } ErrorOr readInt32(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { //TODO: implement return ErrorOr((int32_t) 0); } ErrorOr readInt64(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { //TODO: implement return ErrorOr((int64_t) 0); } //FIXME: we just assume that float is a single-precision IEEE754 // floating point number ErrorOr readFloat32(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { //TODO: implement assuming standard single-precision IEEE754 float // Alternatively, maybe calculate a floating point number by using // the stored value as math instructions? return ErrorOr(0.0f); } //FIXME: we just assume that double is a double-precision IEEE754 // floating point number ErrorOr readFloat64(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { //TODO: implement assuming standard double-precision IEEE754 float // Alternatively, maybe calculate a floating point number by using // the stored value as math instructions? return ErrorOr(0.0); } ErrorOr> readInt8Array(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { //TODO: implement return ErrorOr>({0}); } // Maybe use a struct that holds decoded (de-Java-fied) string // data, decoded size, and original size? Original size is needed // so the parser knows where to continue. //ErrorOr<> readString(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { //TODO: implement // return ErrorOr<>(""); //} ErrorOr> readInt32Array(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { //TODO: implement return ErrorOr>({0}); } ErrorOr> readInt64Array(uint8_t data[], uint64_t dataSize, uint64_t currentPosition) { //TODO: implement return ErrorOr>({0}); } } bool validateRawNBTData(uint8_t data[], uint64_t dataSize){ //state machine? //TODO: implement return false; } }