patterns: Added UTF-16 character type and string parsing

This commit is contained in:
WerWolv
2021-05-02 20:13:37 +02:00
parent 0c6bd73996
commit 4029c333ed
5 changed files with 70 additions and 9 deletions

View File

@@ -10,6 +10,8 @@
#include <hex/views/view.hpp>
#include <cstring>
#include <codecvt>
#include <locale>
#include <random>
#include <string>
@@ -478,6 +480,27 @@ namespace hex::lang {
}
};
class PatternDataCharacter16 : public PatternData {
public:
explicit PatternDataCharacter16(u64 offset, u32 color = 0)
: PatternData(offset, 2, color) { }
PatternData* clone() override {
return new PatternDataCharacter16(*this);
}
void createEntry(prv::Provider* &provider) override {
char16_t character;
provider->read(this->getOffset(), &character, 2);
this->createDefaultEntry(hex::format("'{0}'", std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(character)));
}
[[nodiscard]] std::string getFormattedName() const override {
return "char16";
}
};
class PatternDataString : public PatternData {
public:
PatternDataString(u64 offset, size_t size, u32 color = 0)
@@ -500,6 +523,30 @@ namespace hex::lang {
}
};
class PatternDataString16 : public PatternData {
public:
PatternDataString16(u64 offset, size_t size, u32 color = 0)
: PatternData(offset, size, color) { }
PatternData* clone() override {
return new PatternDataString16(*this);
}
void createEntry(prv::Provider* &provider) override {
std::u16string buffer(this->getSize() + 1, 0x00);
provider->read(this->getOffset(), buffer.data(), this->getSize());
buffer[this->getSize()] = '\0';
auto utf8String = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(buffer);
this->createDefaultEntry(hex::format("\"{0}\"", utf8String)) ;
}
[[nodiscard]] std::string getFormattedName() const override {
return "String16";
}
};
class PatternDataArray : public PatternData {
public:
PatternDataArray(u64 offset, size_t size, u32 color = 0)

View File

@@ -78,6 +78,7 @@ namespace hex::lang {
Unsigned128Bit = 0x100,
Signed128Bit = 0x101,
Character = 0x13,
Character16 = 0x23,
Boolean = 0x14,
Float = 0x42,
Double = 0x82,
@@ -145,6 +146,7 @@ namespace hex::lang {
case ValueType::Float: return IntegerLiteral(type, static_cast<float>(value));
case ValueType::Double: return IntegerLiteral(type, static_cast<double>(value));
case ValueType::Character: return IntegerLiteral(type, static_cast<char>(value));
case ValueType::Character16: return IntegerLiteral(type, static_cast<char16_t>(value));
default: __builtin_unreachable();
}
}, literal);
@@ -165,6 +167,7 @@ namespace hex::lang {
case ValueType::Float: return "float";
case ValueType::Double: return "double";
case ValueType::Character: return "char";
case ValueType::Character16: return "char16";
default: return "< ??? >";
}
}