start implementation of NBT parser

BodgeMaster-unfinished
BodgeMaster 2022-06-27 04:50:32 +02:00
parent d0464d4a8f
commit f80a33ddb0
2 changed files with 87 additions and 1 deletions

View File

@ -1,6 +1,12 @@
#include <bit>
#include <cstdint>
#include <vector>
// This is just an example for how to find out if the system is big endian or little endian. Do not use this.
#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)
{
@ -20,3 +26,74 @@ int endianness_example() {
}
}
namespace NBT {
namespace helpers {
ErrorOr<int8_t> readByte(uint8_t* data[], uint64_t dataSize, uint64_t currentPosition) {
//TODO: implement
return ErrorOr<int8_t>(0);
}
ErrorOr<int16_t> readInt16(uint8_t* data[], uint64_t dataSize, uint64_t currentPosition) {
//TODO: implement
return ErrorOr<int16_t>(0);
}
ErrorOr<int32_t> readInt32(uint8_t* data[], uint64_t dataSize, uint64_t currentPosition) {
//TODO: implement
return ErrorOr<int32_t>(0);
}
ErrorOr<int64_t> 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<float> 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<float>(0.0f);
}
//FIXME: we just assume that double is a double-precision IEEE754
// floating point number
ErrorOr<double> 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<double>(0.0);
}
ErrorOr<std::vector<int8_t>> readByteArray(uint8_t* data[], uint64_t dataSize, uint64_t currentPosition) {
//TODO: implement
return ErrorOr<std::vector<int8_t>>({0});
}
//TODO: find suitable string type
// 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<std::vector<int32_t>> readInt32Array(uint8_t* data[], uint64_t dataSize, uint64_t currentPosition) {
//TODO: implement
return ErrorOr<std::vector<int32_t>>({0});
}
ErrorOr<std::vector<int64_t>> readInt64Array(uint8_t* data[], uint64_t dataSize, uint64_t currentPosition) {
//TODO: implement
return ErrorOr<std::vector<int64_t>>({0});
}
}
bool validateRawNBTData(uint8_t* data[], uint64_t dataSize){
//state machine?
//TODO: implement
return false;
}
}

View File

@ -18,3 +18,12 @@
// Tag[] (compound): Tag(10, String:name, uint16:name_size, Tag[]:content, int32:size) => list of tags, last tag is always an end tag, size not stored
// int32[]: Tag(11, String:name, uint16:name_size, int32[]:content,int32:size) => list of 32 bit signed integers prefixed with its size, endianness not verified at this point
// int64[]: Tag(12, String:name, uint16:name_size, int64[]:content,int32:size) => list of 64 bit signed integers prefixed with its size, endianness not verified at this point
#pragma once
#include <cstdint>
#include <vector>
#include "error.h++"
namespace NBT {
bool validateRawNBTData(uint8_t* data[], int length);
}