2020-11-15 00:46:38 +01:00
|
|
|
#include "views/view_tools.hpp"
|
|
|
|
|
|
|
|
#include <cxxabi.h>
|
|
|
|
#include <cstring>
|
2020-11-15 21:31:04 +01:00
|
|
|
#include <regex>
|
2020-11-15 00:46:38 +01:00
|
|
|
|
|
|
|
namespace hex {
|
|
|
|
|
|
|
|
ViewTools::ViewTools() {
|
2020-11-15 21:31:04 +01:00
|
|
|
this->m_mangledBuffer = new char[0xF'FFFF];
|
2020-11-15 00:46:38 +01:00
|
|
|
this->m_demangledName = static_cast<char*>(malloc(8));
|
|
|
|
|
2020-11-15 21:31:04 +01:00
|
|
|
std::memset(this->m_mangledBuffer, 0x00, 0xF'FFFF);
|
2020-11-15 00:46:38 +01:00
|
|
|
strcpy(this->m_demangledName, "< ??? >");
|
2020-11-15 21:31:04 +01:00
|
|
|
|
|
|
|
this->m_regexInput = new char[0xF'FFFF];
|
|
|
|
this->m_regexPattern = new char[0xF'FFFF];
|
|
|
|
this->m_replacePattern = new char[0xF'FFFF];
|
|
|
|
std::memset(this->m_regexInput, 0x00, 0xF'FFFF);
|
|
|
|
std::memset(this->m_regexPattern, 0x00, 0xF'FFFF);
|
|
|
|
std::memset(this->m_replacePattern, 0x00, 0xF'FFFF);
|
2020-11-15 00:46:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
ViewTools::~ViewTools() {
|
|
|
|
delete[] this->m_mangledBuffer;
|
|
|
|
free(this->m_demangledName);
|
2020-11-15 21:31:04 +01:00
|
|
|
|
|
|
|
delete[] this->m_regexInput;
|
|
|
|
delete[] this->m_regexPattern;
|
2020-11-15 00:46:38 +01:00
|
|
|
}
|
|
|
|
|
2020-11-15 02:50:56 +01:00
|
|
|
static std::string toASCIITableString(char c) {
|
|
|
|
switch (c) {
|
|
|
|
case 0: return "NUL";
|
|
|
|
case 1: return "SOH";
|
|
|
|
case 2: return "STX";
|
|
|
|
case 3: return "ETX";
|
|
|
|
case 4: return "EOT";
|
|
|
|
case 5: return "ENQ";
|
|
|
|
case 6: return "ACK";
|
|
|
|
case 7: return "BEL";
|
|
|
|
case 8: return "BS";
|
|
|
|
case 9: return "TAB";
|
|
|
|
case 10: return "LF";
|
|
|
|
case 11: return "VT";
|
|
|
|
case 12: return "FF";
|
|
|
|
case 13: return "CR";
|
|
|
|
case 14: return "SO";
|
|
|
|
case 15: return "SI";
|
|
|
|
case 16: return "DLE";
|
|
|
|
case 17: return "DC1";
|
|
|
|
case 18: return "DC2";
|
|
|
|
case 19: return "DC3";
|
|
|
|
case 20: return "DC4";
|
|
|
|
case 21: return "NAK";
|
|
|
|
case 22: return "SYN";
|
|
|
|
case 23: return "ETB";
|
|
|
|
case 24: return "CAN";
|
|
|
|
case 25: return "EM";
|
|
|
|
case 26: return "SUB";
|
|
|
|
case 27: return "ESC";
|
|
|
|
case 28: return "FS";
|
|
|
|
case 29: return "GS";
|
|
|
|
case 30: return "RS";
|
|
|
|
case 31: return "US";
|
|
|
|
case 32: return "Space";
|
|
|
|
case 127: return "DEL";
|
|
|
|
default: return std::string() + c;
|
|
|
|
}
|
|
|
|
}
|
2020-11-15 00:46:38 +01:00
|
|
|
|
2020-11-15 02:50:56 +01:00
|
|
|
void ViewTools::drawDemangler() {
|
|
|
|
if (ImGui::CollapsingHeader("Itanium demangler")) {
|
2020-11-15 21:31:04 +01:00
|
|
|
if (ImGui::InputText("Mangled name", this->m_mangledBuffer, 0xF'FFFF)) {
|
2020-11-15 00:46:38 +01:00
|
|
|
size_t length = 0;
|
|
|
|
int status = 0;
|
|
|
|
|
|
|
|
if (this->m_demangledName != nullptr)
|
|
|
|
free(this->m_demangledName);
|
|
|
|
|
|
|
|
this->m_demangledName = abi::__cxa_demangle(this->m_mangledBuffer, nullptr, &length, &status);
|
|
|
|
|
|
|
|
if (status != 0) {
|
|
|
|
this->m_demangledName = static_cast<char*>(malloc(8));
|
|
|
|
strcpy(this->m_demangledName, "< ??? >");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ImGui::InputText("Demangled name", this->m_demangledName, strlen(this->m_demangledName), ImGuiInputTextFlags_ReadOnly);
|
2020-11-15 21:31:04 +01:00
|
|
|
ImGui::NewLine();
|
2020-11-15 02:50:56 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ViewTools::drawASCIITable() {
|
|
|
|
if (ImGui::CollapsingHeader("ASCII table")) {
|
|
|
|
ImGui::BeginTable("##asciitable", 4);
|
|
|
|
ImGui::TableSetupColumn("");
|
|
|
|
ImGui::TableSetupColumn("");
|
|
|
|
ImGui::TableSetupColumn("");
|
|
|
|
ImGui::TableSetupColumn("");
|
|
|
|
|
|
|
|
ImGui::TableNextColumn();
|
|
|
|
|
|
|
|
for (u8 tablePart = 0; tablePart < 4; tablePart++) {
|
|
|
|
ImGui::BeginTable("##asciitablepart", this->m_asciiTableShowOctal ? 4 : 3, ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg);
|
|
|
|
ImGui::TableSetupColumn("dec");
|
|
|
|
if (this->m_asciiTableShowOctal)
|
|
|
|
ImGui::TableSetupColumn("oct");
|
|
|
|
ImGui::TableSetupColumn("hex");
|
|
|
|
ImGui::TableSetupColumn("char");
|
|
|
|
|
|
|
|
ImGui::TableHeadersRow();
|
|
|
|
|
|
|
|
u32 rowCount = 0;
|
|
|
|
for (u8 i = 0; i < 0x80 / 4; i++) {
|
|
|
|
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
|
|
|
|
|
|
|
ImGui::TableNextColumn();
|
|
|
|
ImGui::Text("%02d", i + 32 * tablePart);
|
2020-11-15 00:46:38 +01:00
|
|
|
|
2020-11-15 02:50:56 +01:00
|
|
|
if (this->m_asciiTableShowOctal) {
|
|
|
|
ImGui::TableNextColumn();
|
|
|
|
ImGui::Text("0o%02o", i + 32 * tablePart);
|
|
|
|
}
|
|
|
|
|
|
|
|
ImGui::TableNextColumn();
|
|
|
|
ImGui::Text("0x%02x", i + 32 * tablePart);
|
|
|
|
|
|
|
|
ImGui::TableNextColumn();
|
|
|
|
ImGui::Text("%s", toASCIITableString(i + 32 * tablePart).c_str());
|
|
|
|
|
|
|
|
ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, ((rowCount % 2) == 0) ? 0xFF101010 : 0xFF303030);
|
|
|
|
|
|
|
|
rowCount++;
|
|
|
|
}
|
|
|
|
|
|
|
|
ImGui::EndTable();
|
|
|
|
ImGui::TableNextColumn();
|
|
|
|
}
|
|
|
|
ImGui::EndTable();
|
|
|
|
|
|
|
|
ImGui::Checkbox("Show octal", &this->m_asciiTableShowOctal);
|
2020-11-15 21:31:04 +01:00
|
|
|
ImGui::NewLine();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ViewTools::drawRegexReplacer() {
|
|
|
|
if (ImGui::CollapsingHeader("Regex replacer")) {
|
|
|
|
bool shouldInvalidate;
|
|
|
|
|
|
|
|
shouldInvalidate = ImGui::InputText("Regex pattern", this->m_regexPattern, 0xF'FFFF);
|
|
|
|
shouldInvalidate = ImGui::InputText("Replace pattern", this->m_replacePattern, 0xF'FFFF) || shouldInvalidate;
|
|
|
|
shouldInvalidate = ImGui::InputTextMultiline("Input", this->m_regexInput, 0xF'FFFF) || shouldInvalidate;
|
|
|
|
|
|
|
|
if (shouldInvalidate) {
|
|
|
|
try {
|
|
|
|
this->m_regexOutput = std::regex_replace(this->m_regexInput, std::regex(this->m_regexPattern), this->m_replacePattern);
|
|
|
|
} catch (std::regex_error&) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
ImGui::InputTextMultiline("Output", this->m_regexOutput.data(), this->m_regexOutput.size(), ImVec2(0, 0), ImGuiInputTextFlags_ReadOnly);
|
|
|
|
ImGui::NewLine();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ViewTools::drawColorPicker() {
|
|
|
|
if (ImGui::CollapsingHeader("Color picker")) {
|
|
|
|
ImGui::ColorPicker4("Color Picker", this->m_pickedColor.data(),
|
|
|
|
ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHex);
|
|
|
|
ImGui::NewLine();
|
2020-11-15 02:50:56 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ViewTools::createView() {
|
|
|
|
if (!this->m_windowOpen)
|
|
|
|
return;
|
|
|
|
|
2020-11-23 15:51:58 +01:00
|
|
|
if (ImGui::Begin("Tools", &this->m_windowOpen, ImGuiWindowFlags_NoCollapse)) {
|
2020-11-15 00:46:38 +01:00
|
|
|
|
2020-11-15 02:50:56 +01:00
|
|
|
this->drawDemangler();
|
|
|
|
this->drawASCIITable();
|
2020-11-15 21:31:04 +01:00
|
|
|
this->drawRegexReplacer();
|
|
|
|
this->drawColorPicker();
|
2020-11-15 00:46:38 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
ImGui::End();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ViewTools::createMenu() {
|
|
|
|
if (ImGui::BeginMenu("View")) {
|
|
|
|
ImGui::MenuItem("Tools View", "", &this->m_windowOpen);
|
|
|
|
ImGui::EndMenu();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|