lib/nbt.cpp: Implement writeString function

BodgeMaster-unfinished
Milan Suman 2022-07-28 17:15:04 +05:30
parent adc9a7f36b
commit 4f1ad714bd
4 changed files with 40 additions and 5 deletions

View File

@ -30,8 +30,6 @@
#endif #endif
namespace JavaCompat { namespace JavaCompat {
//FIXME: contrary to what I said, we need to explicitly pass the data
// size because files could have been tampered with or corrupted
ErrorOr<tiny_utf8::string> importJavaString(uint8_t data[], uint16_t size) { ErrorOr<tiny_utf8::string> importJavaString(uint8_t data[], uint16_t size) {
std::string stdString; std::string stdString;
uint16_t encodedSize = static_cast<uint16_t>(data[0])<<8 | static_cast<uint16_t>(data[1]); uint16_t encodedSize = static_cast<uint16_t>(data[0])<<8 | static_cast<uint16_t>(data[1]);

View File

@ -17,6 +17,7 @@
#include <cstdint> #include <cstdint>
#include <vector> #include <vector>
#include <tinyutf8/tinyutf8.h> #include <tinyutf8/tinyutf8.h>
#include <iostream>
#include "nbt.h++" #include "nbt.h++"
#include "error.h++" #include "error.h++"
@ -342,8 +343,14 @@ namespace NBT {
} }
} }
//void writeString(std::vector<uint8_t>* destination, <string type> data) { void writeString(std::vector<uint8_t>* destination, tiny_utf8::string data) {
//} ErrorOr<std::vector<uint8_t>> exportedString = JavaCompat::exportJavaString(data);
if(exportedString.isError){
std::cerr << "NBT::helpers::writeString encountered an error: " << (int) exportedString.errorCode << std::endl;
std::abort();
}
*destination = exportedString.value;
}
void writeInt32Array(std::vector<uint8_t>* destination, std::vector<int32_t> data) { void writeInt32Array(std::vector<uint8_t>* destination, std::vector<int32_t> data) {
writeInt32(destination, data.size()); writeInt32(destination, data.size());

View File

@ -69,7 +69,7 @@ namespace NBT {
void writeFloat64(std::vector<uint8_t>* destination, double data); void writeFloat64(std::vector<uint8_t>* destination, double data);
void writeInt8Array(std::vector<uint8_t>* destination, std::vector<int8_t> data); void writeInt8Array(std::vector<uint8_t>* destination, std::vector<int8_t> data);
void writeInt8Array(std::vector<uint8_t>* destination, int8_t data[], uint32_t dataSize); void writeInt8Array(std::vector<uint8_t>* destination, int8_t data[], uint32_t dataSize);
//void writeString(std::vector<uint8_t>* destination, <string type> data); void writeString(std::vector<uint8_t>* destination, tiny_utf8::string data);
void writeInt32Array(std::vector<uint8_t>* destination, std::vector<int32_t> data); void writeInt32Array(std::vector<uint8_t>* destination, std::vector<int32_t> data);
void writeInt32Array(std::vector<uint8_t>* destination, int32_t data[], uint32_t dataSize); void writeInt32Array(std::vector<uint8_t>* destination, int32_t data[], uint32_t dataSize);
void writeInt64Array(std::vector<uint8_t>* destination, std::vector<int64_t> data); void writeInt64Array(std::vector<uint8_t>* destination, std::vector<int64_t> data);

View File

@ -495,5 +495,35 @@ int main(){
ASSERT(NBT::helper::readString(reinterpret_cast<uint8_t*>(javaStdString.data()), 0xF, 0).errorCode == ErrorCodes::MISMATCHEDSIZE); ASSERT(NBT::helper::readString(reinterpret_cast<uint8_t*>(javaStdString.data()), 0xF, 0).errorCode == ErrorCodes::MISMATCHEDSIZE);
std::cout << "Passed readString NBT helper test." << std::endl; std::cout << "Passed readString NBT helper test." << std::endl;
delete nextChar; delete nextChar;
char* nextChar1 = new char;
//reading data from the java modified utf8 file
std::streampos javaSize1;
std::vector<uint8_t> javaStdString1;
const char* javaFilePath1 = "./resources/unicode_data/java-style_unicode";
std::ifstream javaFile1(javaFilePath1, std::ios::in | std::ios::binary | std::ios::ate);
if(javaFile1.is_open()){
javaSize1 = javaFile1.tellg();
javaFile1.seekg(0, std::ios::beg);
for (int i=0; i<javaSize1; i++) {
javaFile1.read(nextChar1, 1);
javaStdString1.push_back(*nextChar1);
}
javaFile1.close();
} else {
std::cerr << "Failed to open file: " << javaFilePath1 << std::endl;
return 2;
}
std::vector<uint8_t>* exportedString = new std::vector<uint8_t>();
NBT::helper::writeString(exportedString, normalString);
ASSERT(javaStdString1 == *exportedString);
std::string overrunString = std::string(0xFFFFF, '.');
NBT::helper::writeString(exportedString, tiny_utf8::string(overrunString));
std::cout << "Passed writeString NBT helper test." << std::endl;
return 0; return 0;
} }