1
0
mirror of synced 2025-01-11 05:42:15 +01:00

feat: Add constant data input to buffer node (#1981)

Added a hex data input field to the buffer node in the data processor.


![image](https://github.com/user-attachments/assets/a98e1174-7d35-4130-b9f7-9ef5d0703bc7)
This commit is contained in:
Justus Garbe 2024-12-03 23:03:04 +01:00 committed by GitHub
parent 7032473ecf
commit 813276c907
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,3 +1,4 @@
#include <algorithm>
#include <hex/api/content_registry.hpp>
#include <hex/api/localization_manager.hpp>
#include <hex/helpers/utils.hpp>
@ -33,9 +34,39 @@ namespace hex::plugin::builtin {
ImGui::PushItemWidth(100_scaled);
ImGui::InputScalar("hex.builtin.nodes.constants.buffer.size"_lang, ImGuiDataType_U32, &m_size, &StepSize, &FastStepSize);
ImGui::PopItemWidth();
ImGui::InputTextMultiline("##buffer", m_constantString, ImVec2(150_scaled, 0), ImGuiInputTextFlags_AllowTabInput | ImGuiInputTextFlags_CharsHexadecimal);
}
/// Adapted from PatternLanguageBot
std::vector<u8> parseByteString(const std::string &string) {
if (string.empty())
return {};
auto byteString = std::string(string);
std::erase(byteString, ' ');
std::erase(byteString, '\n');
if ((byteString.length() % 2) != 0)
throwNodeError("Invalid byte string length");
std::vector<u8> result;
for (u32 i = 0; i < byteString.length(); i += 2) {
if (!std::isxdigit(byteString[i]) || !std::isxdigit(byteString[i + 1]))
throwNodeError("Invalid byte string format");
result.push_back(std::strtoul(byteString.substr(i, 2).c_str(), nullptr, 16));
}
return result;
}
void process() override {
m_buffer = parseByteString(m_constantString);
m_size = std::max<std::size_t>(m_buffer.size(), m_size);
// fill buffer with zeros if required
if (m_buffer.size() != m_size)
m_buffer.resize(m_size, 0x00);
@ -46,16 +77,19 @@ namespace hex::plugin::builtin {
j = nlohmann::json::object();
j["size"] = m_size;
j["constantString"] = m_constantString;
j["data"] = m_buffer;
}
void load(const nlohmann::json &j) override {
m_size = j.at("size");
m_constantString = j.at("constantString").get<std::string>();
m_buffer = j.at("data").get<std::vector<u8>>();
}
private:
u32 m_size = 1;
std::string m_constantString;
std::vector<u8> m_buffer;
};