Skip to content

Commit

Permalink
fdt-v2: extended use of string_view, memory reduction
Browse files Browse the repository at this point in the history
Signed-off-by: Bartłomiej Burdukiewicz <[email protected]>
  • Loading branch information
dev-0x7C6 committed Jul 1, 2024
1 parent 04c75f7 commit 43e16e6
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 86 deletions.
2 changes: 2 additions & 0 deletions src/fdt/fdt-generator-qt.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<tree_widget_item *> m_tree_stack;
Expand Down
4 changes: 2 additions & 2 deletions src/fdt/fdt-generator.hpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
#pragma once

#include <string_view>
#include <QByteArray>
#include <QString>

struct fdt_property {
QString name;
QByteArray data;
std::string_view data;

auto clear() noexcept {
name.clear();
data.clear();
}
};

Expand Down
97 changes: 21 additions & 76 deletions src/fdt/fdt-parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<fdt::token>(convert(*reinterpret_cast<const u32 *>(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<fdt::property>(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);
Expand Down Expand Up @@ -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<node_begin>(v);
// });
const auto node_begin_count = std::ranges::count_if(ctx.tokens, [](auto &&v) {
return std::holds_alternative<node_begin>(v);
});

// const auto node_end_count = std::ranges::count_if(ctx.tokens, [](auto &&v) {
// return std::holds_alternative<node_end>(v);
// });
const auto node_end_count = std::ranges::count_if(ctx.tokens, [](auto &&v) {
return std::holds_alternative<node_end>(v);
});

// const auto property_count = std::ranges::count_if(ctx.tokens, [](auto &&v) {
// return std::holds_alternative<property>(v);
// });
const auto property_count = std::ranges::count_if(ctx.tokens, [](auto &&v) {
return std::holds_alternative<property>(v);
});

// const auto nop_count = std::ranges::count_if(ctx.tokens, [](auto &&v) {
// return std::holds_alternative<nop>(v);
// });
const auto nop_count = std::ranges::count_if(ctx.tokens, [](auto &&v) {
return std::holds_alternative<nop>(v);
});

// const auto end_count = std::ranges::count_if(ctx.tokens, [](auto &&v) {
// return std::holds_alternative<types::end>(v);
// });
const auto end_count = std::ranges::count_if(ctx.tokens, [](auto &&v) {
return std::holds_alternative<types::end>(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;
}
13 changes: 8 additions & 5 deletions src/fdt/fdt-view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <QFileInfo>

#include "fdt/fdt-parser-v2.hpp"
#include "qnamespace.h"
#include <stack>
#include <string_view>
#include <vector>
Expand Down Expand Up @@ -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<const u32 *>(data.data()))));
Expand All @@ -60,7 +61,7 @@ string present(const fdt_property &property) {
return result(string::number(convert(*reinterpret_cast<const u32 *>(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;
Expand All @@ -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

Expand Down Expand Up @@ -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);
Expand All @@ -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;
}

Expand Down
6 changes: 3 additions & 3 deletions src/main-window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ void MainWindow::update_view() {

if (NodeType::Property == type) {
const auto property = item->data(0, QT_ROLE_PROPERTY).value<fdt_property>();
m_hexview->setDocument(QHexDocument::fromMemory<QMemoryBuffer>(property.data));
m_hexview->setDocument(QHexDocument::fromMemory<QMemoryBuffer>(QByteArray::fromRawData(property.data.data(), property.data.size())));
}

m_ui->text_view->clear();
Expand All @@ -203,7 +203,7 @@ void MainWindow::property_export() {

if (NodeType::Property == type) {
const auto property = item->data(0, QT_ROLE_PROPERTY).value<fdt_property>();
m_hexview->setDocument(QHexDocument::fromMemory<QMemoryBuffer>(property.data));
fdt::export_property_file_dialog(this, property.data, property.name);
m_hexview->setDocument(QHexDocument::fromMemory<QMemoryBuffer>(QByteArray::fromRawData(property.data.data(), property.data.size())));
fdt::export_property_file_dialog(this, QByteArray::fromRawData(property.data.data(), property.data.size()), property.name);
}
}

0 comments on commit 43e16e6

Please sign in to comment.