1
0
mirror of synced 2024-11-15 11:33:23 +01:00
ImHex/source/views/view_pattern_data.cpp

62 lines
1.9 KiB
C++
Raw Normal View History

2020-11-10 21:31:04 +01:00
#include "views/view_pattern_data.hpp"
#include <cstring>
namespace hex {
ViewPatternData::ViewPatternData(prv::Provider* &dataProvider, std::vector<Highlight> &highlights)
: View(), m_dataProvider(dataProvider), m_highlights(highlights) {
2020-11-10 21:31:04 +01:00
}
ViewPatternData::~ViewPatternData() {
}
2020-11-11 00:12:30 +01:00
std::string makeDisplayable(u8 *data, size_t size) {
std::string result;
for (u8* c = data; c < (data + size - 1); c++) {
if (iscntrl(*c) || *c > 0x7F)
result += " ";
else
result += *c;
}
return result;
}
2020-11-10 21:31:04 +01:00
void ViewPatternData::createView() {
if (!this->m_windowOpen)
return;
if (ImGui::Begin("Pattern Data", &this->m_windowOpen)) {
ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
for (auto& [offset, size, color, name] : this->m_highlights) {
std::vector<u8> buffer(size + 1, 0x00);
this->m_dataProvider->read(offset, buffer.data(), size);
if (size <= 8) {
u64 data = 0;
std::memcpy(&data, buffer.data(), size);
2020-11-11 00:12:30 +01:00
ImGui::LabelText(name.c_str(), "[0x%08lx:0x%08lx] %lu (0x%08lx) \"%s\"", offset, offset + size, data, data, makeDisplayable(buffer.data(), buffer.size()).c_str());
}
2020-11-10 21:31:04 +01:00
else
2020-11-11 00:12:30 +01:00
ImGui::LabelText(name.c_str(), "[0x%08lx:0x%08lx] [ ARRAY ] \"%s\"", offset, offset + size, makeDisplayable(buffer.data(), buffer.size()).c_str());
2020-11-10 21:31:04 +01:00
}
ImGui::EndChild();
ImGui::End();
}
}
void ViewPatternData::createMenu() {
2020-11-11 09:22:55 +01:00
if (ImGui::BeginMenu("View")) {
2020-11-10 21:31:04 +01:00
ImGui::MenuItem("Data View", "", &this->m_windowOpen);
ImGui::EndMenu();
}
}
}