patterns: Fix endian settings not applying to char16

This commit is contained in:
WerWolv 2021-08-29 11:10:48 +02:00
parent a7e2c06bc4
commit f60f9f9fc9
4 changed files with 61 additions and 6 deletions

View File

@ -0,0 +1,25 @@
#pragma once
#include <hex.hpp>
#include <imgui.h>
#include <hex/views/view.hpp>
#include <array>
#include <string>
namespace hex {
namespace prv { class Provider; }
class ViewTools : public View {
public:
ViewTools();
~ViewTools() override;
void drawContent() override;
void drawMenu() override;
};
}

View File

@ -21,9 +21,10 @@ namespace hex::lang {
namespace {
std::string makeDisplayable(u8 *data, size_t size) {
template<typename T> requires requires { sizeof(T) == 1; }
std::string makeDisplayable(T *data, size_t size) {
std::string result;
for (u8* c = data; c < (data + size); c++) {
for (T* c = data; c < (data + size); c++) {
if (iscntrl(*c) || *c > 0x7F)
result += " ";
else
@ -517,6 +518,7 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
char16_t character;
provider->read(this->getOffset(), &character, 2);
character = hex::changeEndianess(character, this->getEndian());
this->createDefaultEntry(hex::format("'{0}'", std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(character)));
}
@ -536,9 +538,8 @@ namespace hex::lang {
}
void createEntry(prv::Provider* &provider) override {
std::vector<u8> buffer(this->getSize() + 1, 0x00);
std::string buffer(this->getSize(), 0x00);
provider->read(this->getOffset(), buffer.data(), this->getSize());
buffer[this->getSize()] = '\0';
this->createDefaultEntry(hex::format("\"{0}\"", makeDisplayable(buffer.data(), this->getSize()).c_str()));
}
@ -558,9 +559,11 @@ namespace hex::lang {
}
void createEntry(prv::Provider* &provider) override {
std::u16string buffer(this->getSize() + 1, 0x00);
std::u16string buffer(this->getSize(), 0x00);
provider->read(this->getOffset(), buffer.data(), this->getSize());
buffer[this->getSize()] = '\0';
for (auto &c : buffer)
c = hex::changeEndianess(c, 2, this->getEndian());
auto utf8String = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(buffer);

View File

@ -1090,6 +1090,7 @@ namespace hex::lang {
}
pattern->setVariableName(node->getName().data());
pattern->setEndian(this->getCurrentEndian());
return this->evaluateAttributes(node, pattern);
}

View File

@ -0,0 +1,26 @@
#include "views/view_tools.hpp"
#include <hex/providers/provider.hpp>
namespace hex {
ViewTools::ViewTools() : View("hex.view.tools.name") { }
ViewTools::~ViewTools() { }
void ViewTools::drawContent() {
if (ImGui::Begin(View::toWindowName("hex.view.tools.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
for (const auto& [name, function] : ContentRegistry::Tools::getEntries()) {
if (ImGui::CollapsingHeader(LangEntry(name))) {
function();
}
}
}
ImGui::End();
}
void ViewTools::drawMenu() {
}
}