From 43e16e658bc98a8b5f1304ecd9bb601e4000e3c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Burdukiewicz?= Date: Tue, 2 Jul 2024 01:29:09 +0200 Subject: [PATCH] fdt-v2: extended use of string_view, memory reduction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Burdukiewicz --- src/fdt/fdt-generator-qt.hpp | 2 + src/fdt/fdt-generator.hpp | 4 +- src/fdt/fdt-parser.cpp | 97 ++++++++---------------------------- src/fdt/fdt-view.cpp | 13 +++-- src/main-window.cpp | 6 +-- 5 files changed, 36 insertions(+), 86 deletions(-) diff --git a/src/fdt/fdt-generator-qt.hpp b/src/fdt/fdt-generator-qt.hpp index 62f4960..365216a 100644 --- a/src/fdt/fdt-generator-qt.hpp +++ b/src/fdt/fdt-generator-qt.hpp @@ -43,6 +43,8 @@ struct qt_tree_fdt_generator : public iface_fdt_generator { void end_node() noexcept final; void insert_property(const fdt_property &property) noexcept final; + auto root() { return m_root; } + private: tree_widget_item *m_root{nullptr}; std::stack m_tree_stack; diff --git a/src/fdt/fdt-generator.hpp b/src/fdt/fdt-generator.hpp index 72b3d86..1df3d87 100644 --- a/src/fdt/fdt-generator.hpp +++ b/src/fdt/fdt-generator.hpp @@ -1,15 +1,15 @@ #pragma once +#include #include #include struct fdt_property { QString name; - QByteArray data; + std::string_view data; auto clear() noexcept { name.clear(); - data.clear(); } }; diff --git a/src/fdt/fdt-parser.cpp b/src/fdt/fdt-parser.cpp index a01c4d3..171a75b 100644 --- a/src/fdt/fdt-parser.cpp +++ b/src/fdt/fdt-parser.cpp @@ -30,61 +30,6 @@ fdt_parser::fdt_parser(std::string_view view, fdt::tokenizer::token_list &tokens parse(m_header.value(), tokens); } } - -/* -void fdt_parser::parse(const fdt::header header, iface_fdt_generator &generator) { - const auto dt_struct = m_data + header.off_dt_struct; - const auto dt_strings = m_data + header.off_dt_strings; - - auto get_property_name = [&](auto offset) { - const auto ptr = dt_strings + offset; - return QString::fromUtf8(ptr, std::strlen(ptr)); - }; - - for (auto iter = dt_struct; iter < dt_struct + header.size_dt_struct;) { - auto seek_and_align = [&iter](const std::size_t size) { - const auto value = size % sizeof(fdt::token); - if (value) - return iter += size + sizeof(fdt::token) - value; - - return iter += size; - }; - - const auto token = static_cast(convert(*reinterpret_cast(iter))); - seek_and_align(sizeof(token)); - - if (fdt::token::begin_node == token) { - const auto size = std::strlen(iter); - auto name = QString::fromUtf8(iter, size); - seek_and_align(size); - generator.begin_node(size ? name : m_default_root_node); - } - - if (fdt::token::end_node == token) - generator.end_node(); - - if (fdt::token::property == token) { - const auto header = read_data_32be(iter); - seek_and_align(sizeof(header)); - - fdt_property property; - property.data = QByteArray(iter, header.len); - seek_and_align(header.len); - - property.name = get_property_name(header.nameoff); - generator.insert_property(property); - - for (auto &&handle : m_handle_special_properties) - if (handle.name == property.name) - handle.callback(property, generator); - } - - if (fdt::token::end == token) - break; - } -} -*/ - auto align(const std::size_t size) { const auto q = size % sizeof(u32); const auto w = size / sizeof(u32); @@ -193,30 +138,30 @@ void fdt_parser::parse(const fdt::header header, fdt::tokenizer::token_list &tok } } - // const auto node_begin_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { - // return std::holds_alternative(v); - // }); + const auto node_begin_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { + return std::holds_alternative(v); + }); - // const auto node_end_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { - // return std::holds_alternative(v); - // }); + const auto node_end_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { + return std::holds_alternative(v); + }); - // const auto property_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { - // return std::holds_alternative(v); - // }); + const auto property_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { + return std::holds_alternative(v); + }); - // const auto nop_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { - // return std::holds_alternative(v); - // }); + const auto nop_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { + return std::holds_alternative(v); + }); - // const auto end_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { - // return std::holds_alternative(v); - // }); + const auto end_count = std::ranges::count_if(ctx.tokens, [](auto &&v) { + return std::holds_alternative(v); + }); - // std::cout << "is_aligned : " << is_aligned << std::endl; - // std::cout << "node begin : " << node_begin_count << std::endl; - // std::cout << "node end : " << node_end_count << std::endl; - // std::cout << "property : " << property_count << std::endl; - // std::cout << "nop : " << nop_count << std::endl; - // std::cout << "end : " << end_count << std::endl; + std::cout << "is_aligned : " << is_aligned << std::endl; + std::cout << "node begin : " << node_begin_count << std::endl; + std::cout << "node end : " << node_end_count << std::endl; + std::cout << "property : " << property_count << std::endl; + std::cout << "nop : " << nop_count << std::endl; + std::cout << "end : " << end_count << std::endl; } diff --git a/src/fdt/fdt-view.cpp b/src/fdt/fdt-view.cpp index d3ae399..25d20aa 100644 --- a/src/fdt/fdt-view.cpp +++ b/src/fdt/fdt-view.cpp @@ -9,6 +9,7 @@ #include #include "fdt/fdt-parser-v2.hpp" +#include "qnamespace.h" #include #include #include @@ -47,7 +48,7 @@ string present(const fdt_property &property) { if (property_map.contains(name)) { const property_info info = property_map.value(name); if (property_type::string == info.type) - return result_str({data}); + return result_str(QString(data.data())); if (property_type::number == info.type) return result(string::number(convert(*reinterpret_cast(data.data())))); @@ -60,7 +61,7 @@ string present(const fdt_property &property) { return result(string::number(convert(*reinterpret_cast(data.data())))); if (names_regexp.match(name).hasMatch()) { - auto lines = data.split(0); + auto lines = QByteArray::fromRawData(data.data(), data.size()).split(0); lines.removeLast(); string ret; @@ -75,9 +76,9 @@ string present(const fdt_property &property) { } if (std::count_if(data.begin(), data.end(), [](auto &&value) { return value == 0x00; }) == 1 && - data.at(data.size() - 1) == 0x00) return result_str({property.data}); + data.at(data.size() - 1) == 0x00) return result_str(QString{property.data.data()}); - return result(present_u32be(property.data)); + return result(present_u32be(QByteArray::fromRawData(data.data(), data.size()))); } } // namespace @@ -116,7 +117,7 @@ bool fdt::viewer::load(const byte_array &datamap, string &&name, string &&id) { [&](types::property &arg) { auto property = fdt_property{ .name = QString::fromUtf8(arg.name.data(), arg.name.size()), - .data = QByteArray(arg.data.data(), arg.data.size()), + .data = arg.data, }; generator.insert_property(property); @@ -126,6 +127,8 @@ bool fdt::viewer::load(const byte_array &datamap, string &&name, string &&id) { }, token); + generator.root()->setData(0, Qt::UserRole + 1000, datamap); + return true; } diff --git a/src/main-window.cpp b/src/main-window.cpp index 278a6e7..5e3e3b8 100644 --- a/src/main-window.cpp +++ b/src/main-window.cpp @@ -181,7 +181,7 @@ void MainWindow::update_view() { if (NodeType::Property == type) { const auto property = item->data(0, QT_ROLE_PROPERTY).value(); - m_hexview->setDocument(QHexDocument::fromMemory(property.data)); + m_hexview->setDocument(QHexDocument::fromMemory(QByteArray::fromRawData(property.data.data(), property.data.size()))); } m_ui->text_view->clear(); @@ -203,7 +203,7 @@ void MainWindow::property_export() { if (NodeType::Property == type) { const auto property = item->data(0, QT_ROLE_PROPERTY).value(); - m_hexview->setDocument(QHexDocument::fromMemory(property.data)); - fdt::export_property_file_dialog(this, property.data, property.name); + m_hexview->setDocument(QHexDocument::fromMemory(QByteArray::fromRawData(property.data.data(), property.data.size()))); + fdt::export_property_file_dialog(this, QByteArray::fromRawData(property.data.data(), property.data.size()), property.name); } }